main
Jing Li 2024-04-20 14:45:31 +08:00
parent 18d549c439
commit 69b644579f
2 changed files with 43 additions and 39 deletions

View File

@ -36,6 +36,7 @@ class TaskService extends BaseService
$plan = Plan::findOrFail($data['plan_id']); $plan = Plan::findOrFail($data['plan_id']);
switch (get_class($planable = $plan->planable)) { switch (get_class($planable = $plan->planable)) {
// 业绩指标
case PlanPerformance::class: case PlanPerformance::class:
$payload = $data['task_performance'] ?? []; $payload = $data['task_performance'] ?? [];
@ -54,23 +55,17 @@ class TaskService extends BaseService
/** @var \App\Models\Store */ /** @var \App\Models\Store */
$store = Store::findOrFail($payload['store_id']); $store = Store::findOrFail($payload['store_id']);
if ( if (TaskPerformance::where('store_id', $store->id)->where('month', $planable->month)->exists()) {
TaskPerformance::where('store_id', $store->id)
->where('month', $planable->month)
->exists()
) {
admin_abort('门店已有业绩指标任务'); admin_abort('门店已有业绩指标任务');
} }
// 月份
$month = Carbon::createFromFormat('Y-m', $planable->month);
// 开始时间 // 开始时间
$startAt = $month->copy()->startOfMonth(); $startAt = Carbon::createFromFormat('Y-m-d H:i:s', "{$planable->month}-01 00:00:00");
// 结束时间 // 结束时间
$endAt = $month->copy()->endOfMonth(); $endAt = $startAt->copy()->endOfMonth();
// 门店实际业绩 // 门店实际业绩
$totalSales = Ledger::where('store_id', $store->id) $actualPerformance = Ledger::where('store_id', $store->id)
->whereBetween('date', [$startAt->format('Y-m-d'), $endAt->format('Y-m-d')]) ->whereBetween('date', [$startAt->format('Y-m-d'), $endAt->format('Y-m-d')])
->sum('sales'); ->sum('sales');
@ -79,23 +74,28 @@ class TaskService extends BaseService
'month' => $planable->month, 'month' => $planable->month,
'store_id' => $store->id, 'store_id' => $store->id,
'store_master_id' => $store->master_id, 'store_master_id' => $store->master_id,
'actual_performance' => $actualPerformance,
'expected_performance' => $payload['expected_performance'], 'expected_performance' => $payload['expected_performance'],
'actual_performance' => $totalSales,
]); ]);
// 月份 $task = new Task([
$month = Carbon::createFromFormat('Y-m', $planable->month);
$taskable->task()->create([
'plan_id' => $plan->id, 'plan_id' => $plan->id,
'name' => '业绩指标', 'name' => '业绩指标',
'start_at' => $month->copy()->startOfMonth(), 'start_at' => $startAt,
'end_at' => $month->copy()->endOfMonth(), 'end_at' => $endAt,
'task_status' => $taskable->isCompleted() ? TaskStatus::Success : TaskStatus::Pending, 'task_status' => TaskStatus::Pending,
'completed_at' => $taskable->isCompleted() ? now() : null,
]); ]);
if ($taskable->isSuccess()) {
$task->task_status = TaskStatus::Success;
$task->completed_at = now();
}
$taskable->task()->save($task);
break; break;
// 清洁卫生
case PlanHygiene::class: case PlanHygiene::class:
$payload = $data['task_hygiene'] ?? []; $payload = $data['task_hygiene'] ?? [];
@ -112,11 +112,7 @@ class TaskService extends BaseService
/** @var \App\Models\Store */ /** @var \App\Models\Store */
$store = Store::findOrFail($payload['store_id']); $store = Store::findOrFail($payload['store_id']);
if ( if (TaskHygiene::where('store_id', $store->id)->where('month', $planable->month)->exists()) {
TaskHygiene::where('store_id', $store->id)
->where('month', $planable->month)
->exists()
) {
admin_abort('门店已有清洁卫生任务'); admin_abort('门店已有清洁卫生任务');
} }
@ -126,16 +122,26 @@ class TaskService extends BaseService
'store_master_id' => $store->master_id, 'store_master_id' => $store->master_id,
]); ]);
// 月份 // 开始时间
$month = Carbon::createFromFormat('Y-m', $planable->month); $startAt = Carbon::createFromFormat('Y-m-d H:i:s', "{$planable->month}-01 00:00:00");
// 结束时间
$endAt = $startAt->copy()->endOfMonth();
$taskable->task()->create([ $task = new Task([
'plan_id' => $plan->id, 'plan_id' => $plan->id,
'name' => '清洁卫生', 'name' => '清洁卫生',
'start_at' => $month->copy()->startOfMonth(), 'start_at' => $startAt,
'end_at' => $month->copy()->endOfMonth(), 'end_at' => $endAt,
'task_status' => TaskStatus::Pending, 'task_status' => TaskStatus::Pending,
]); ]);
if ($taskable->isSuccess()) {
$task->task_status = TaskStatus::Success;
$task->completed_at = now();
}
$taskable->task()->save($task);
break; break;
default: default:
@ -148,6 +154,7 @@ class TaskService extends BaseService
public function update($primaryKey, $data): bool public function update($primaryKey, $data): bool
{ {
/** @var \App\Models\Task */
$task = Task::findOrFail($primaryKey); $task = Task::findOrFail($primaryKey);
if (in_array($task->task_status, [TaskStatus::Success, TaskStatus::Failed])) { if (in_array($task->task_status, [TaskStatus::Success, TaskStatus::Failed])) {
@ -155,6 +162,7 @@ class TaskService extends BaseService
} }
switch (get_class($taskable = $task->taskable)) { switch (get_class($taskable = $task->taskable)) {
// 业绩指标
case TaskPerformance::class: case TaskPerformance::class:
$payload = $data['task_performance'] ?? []; $payload = $data['task_performance'] ?? [];
@ -172,7 +180,7 @@ class TaskService extends BaseService
'expected_performance' => $payload['expected_performance'], 'expected_performance' => $payload['expected_performance'],
]); ]);
if ($taskable->isCompleted() && ! $task->isSuccess()) { if (! $task->isSuccess() && $taskable->isSuccess()) {
$task->update([ $task->update([
'task_status' => TaskStatus::Success, 'task_status' => TaskStatus::Success,
'completed_at' => now(), 'completed_at' => now(),

View File

@ -41,9 +41,9 @@ class TaskPerformance extends Model
/** /**
* 此业绩指标是否已完成 * 此业绩指标是否已完成
*/ */
public function isCompleted(): bool public function isSuccess(): bool
{ {
return bccomp($this->actual_performance, $this->expected_performance, 2) >= 0; return $this->task_status === TaskPerformanceStatus::Success;
} }
/** /**
@ -53,20 +53,16 @@ class TaskPerformance extends Model
{ {
return Attribute::make( return Attribute::make(
get: function (mixed $value, array $attributes) { get: function (mixed $value, array $attributes) {
if ($this->isCompleted()) { if (bccomp($attributes['actual_performance'], $attributes['expected_performance'], 2) >= 0) {
return TaskPerformanceStatus::Success; return TaskPerformanceStatus::Success;
} }
// 任务开始时间
$startAt = Carbon::createFromFormat('Y-m-d H:i:s', "{$this->month}-01 00:00:00");
// 任务结束时间
$endAt = $startAt->copy()->endOfMonth();
// 当前时间 // 当前时间
$datetime = now(); $datetime = now();
if ($datetime->lt($startAt)) { if ($datetime->lt($this->task->start_at)) {
return TaskPerformanceStatus::None; return TaskPerformanceStatus::None;
} elseif ($datetime->gte($endAt)) { } elseif ($datetime->gte($this->task->end_at)) {
return TaskPerformanceStatus::Failed; return TaskPerformanceStatus::Failed;
} }
return TaskPerformanceStatus::Pending; return TaskPerformanceStatus::Pending;