generated from liutk/owl-admin-base
200 lines
6.6 KiB
PHP
200 lines
6.6 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Services\Plan;
|
|
|
|
use App\Admin\Filters\TaskFilter;
|
|
use App\Admin\Services\BaseService;
|
|
use App\Enums\TaskStatus;
|
|
use App\Models\Ledger;
|
|
use App\Models\Plan;
|
|
use App\Models\PlanHygiene;
|
|
use App\Models\PlanPerformance;
|
|
use App\Models\Store;
|
|
use App\Models\Task;
|
|
use App\Models\TaskHygiene;
|
|
use App\Models\TaskPerformance;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Support\Carbon;
|
|
use Illuminate\Support\Facades\Validator;
|
|
|
|
/**
|
|
* @method Task getModel()
|
|
* @method Task|Builder query()
|
|
*/
|
|
class TaskService extends BaseService
|
|
{
|
|
protected string $modelName = Task::class;
|
|
|
|
protected string $modelFilterName = TaskFilter::class;
|
|
|
|
public function store($data): bool
|
|
{
|
|
if (! isset($data['plan_id'])) {
|
|
admin_abort('任务计划未找到');
|
|
}
|
|
|
|
$plan = Plan::findOrFail($data['plan_id']);
|
|
|
|
switch (get_class($planable = $plan->planable)) {
|
|
case PlanPerformance::class:
|
|
$payload = $data['task_performance'] ?? [];
|
|
|
|
Validator::validate(
|
|
data: $payload,
|
|
rules: [
|
|
'store_id' => ['bail', 'required'],
|
|
'expected_performance' => ['bail', 'required', 'numeric', 'min:0'],
|
|
],
|
|
attributes: [
|
|
'store_id' => __('plan.task_performance.store'),
|
|
'expected_performance' => __('plan.task_performance.expected_performance'),
|
|
],
|
|
);
|
|
|
|
/** @var \App\Models\Store */
|
|
$store = Store::findOrFail($payload['store_id']);
|
|
|
|
if (
|
|
TaskPerformance::where('store_id', $store->id)
|
|
->where('month', $planable->month)
|
|
->exists()
|
|
) {
|
|
admin_abort('门店已有业绩指标任务');
|
|
}
|
|
|
|
// 月份
|
|
$month = Carbon::createFromFormat('Y-m', $planable->month);
|
|
// 开始时间
|
|
$startAt = $month->copy()->startOfMonth();
|
|
// 结束时间
|
|
$endAt = $month->copy()->endOfMonth();
|
|
|
|
// 门店实际业绩
|
|
$actualPerformance = Ledger::where('store_id', $store->id)
|
|
->whereBetween('date', [$startAt->format('Y-m-d'), $endAt->format('Y-m-d')])
|
|
->sum('sales');
|
|
|
|
/** @var \App\Models\TaskPerformance */
|
|
$taskable = TaskPerformance::create([
|
|
'month' => $planable->month,
|
|
'store_id' => $store->id,
|
|
'store_master_id' => $store->master_id,
|
|
'expected_performance' => $payload['expected_performance'],
|
|
'actual_performance' => $actualPerformance,
|
|
]);
|
|
|
|
// 月份
|
|
$month = Carbon::createFromFormat('Y-m', $planable->month);
|
|
|
|
$taskable->task()->create([
|
|
'plan_id' => $plan->id,
|
|
'name' => '业绩指标',
|
|
'start_at' => $month->copy()->startOfMonth(),
|
|
'end_at' => $month->copy()->endOfMonth(),
|
|
'task_status' => $taskable->isCompleted() ? TaskStatus::Success : TaskStatus::Pending,
|
|
'completed_at' => $taskable->isCompleted() ? now() : null,
|
|
]);
|
|
break;
|
|
|
|
case PlanHygiene::class:
|
|
$payload = $data['task_hygiene'] ?? [];
|
|
|
|
Validator::validate(
|
|
data: $payload,
|
|
rules: [
|
|
'store_id' => ['bail', 'required'],
|
|
],
|
|
attributes: [
|
|
'store_id' => __('plan.task_hygiene.store'),
|
|
],
|
|
);
|
|
|
|
/** @var \App\Models\Store */
|
|
$store = Store::findOrFail($payload['store_id']);
|
|
|
|
if (
|
|
TaskHygiene::where('store_id', $store->id)
|
|
->where('month', $planable->month)
|
|
->exists()
|
|
) {
|
|
admin_abort('门店已有清洁卫生任务');
|
|
}
|
|
|
|
$taskable = TaskHygiene::create([
|
|
'month' => $planable->month,
|
|
'store_id' => $store->id,
|
|
'store_master_id' => $store->master_id,
|
|
]);
|
|
|
|
// 月份
|
|
$month = Carbon::createFromFormat('Y-m', $planable->month);
|
|
|
|
$taskable->task()->create([
|
|
'plan_id' => $plan->id,
|
|
'name' => '清洁卫生',
|
|
'start_at' => $month->copy()->startOfMonth(),
|
|
'end_at' => $month->copy()->endOfMonth(),
|
|
'task_status' => TaskStatus::Pending,
|
|
]);
|
|
break;
|
|
|
|
default:
|
|
admin_abort('任务计划不可新增任务');
|
|
break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function update($primaryKey, $data): bool
|
|
{
|
|
$task = Task::findOrFail($primaryKey);
|
|
|
|
if (in_array($task->task_status, [TaskStatus::Success, TaskStatus::Failed])) {
|
|
admin_abort("[{$task->task_status->text()}]任务不可修改");
|
|
}
|
|
|
|
switch (get_class($taskable = $task->taskable)) {
|
|
case TaskPerformance::class:
|
|
$payload = $data['task_performance'] ?? [];
|
|
|
|
Validator::validate(
|
|
data: $payload,
|
|
rules: [
|
|
'expected_performance' => ['bail', 'required', 'numeric', 'min:0'],
|
|
],
|
|
attributes: [
|
|
'expected_performance' => __('plan.task_performance.expected_performance'),
|
|
],
|
|
);
|
|
|
|
$taskable->update([
|
|
'expected_performance' => $payload['expected_performance'],
|
|
]);
|
|
|
|
if ($taskable->isCompleted()) {
|
|
$task->update([
|
|
'task_status' => TaskStatus::Success,
|
|
'completed_at' => now(),
|
|
]);
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
admin_abort('任务不可修改');
|
|
break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function preDelete(array $ids): void
|
|
{
|
|
/** @var \Illuminate\Database\Eloquent\Collection */
|
|
$tasks = Task::findMany($ids);
|
|
|
|
$tasks->each(fn (Task $task) => $task->taskable()->delete());
|
|
}
|
|
}
|