main
Jing Li 2024-04-15 18:49:15 +08:00
parent 735b94ae26
commit ac0e1c616f
10 changed files with 130 additions and 21 deletions

View File

@ -5,6 +5,7 @@ namespace App\Admin\Controllers\Plan;
use App\Admin\Controllers\AdminController; use App\Admin\Controllers\AdminController;
use App\Admin\Services\Plan\PlanService; use App\Admin\Services\Plan\PlanService;
use App\Enums\PlanStatus; use App\Enums\PlanStatus;
use App\Enums\TaskStatus;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Slowlyo\OwlAdmin\Admin; use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Renderers\Form;
@ -161,6 +162,28 @@ class PlanController extends AdminController
public function detail(): Form public function detail(): Form
{ {
return $this->baseDetail()->title('')->body([ return $this->baseDetail()->title('')->body([
amis()->Property()->items([
['label' => __('plan.plan.name'), 'content' => '${name}'],
['label' => __('plan.plan.type'), 'content' => amis()->Mapping()->name('planable_type')->map($this->planableTypeLabelMap)],
['label' => __('plan.plan.status'), 'content' => amis()->Mapping()->name('plan_status')->map(PlanStatus::labelMap())],
]),
amis()->Divider(),
// 总账录入
amis()->CRUDTable()
->api(admin_url('api/tasks?plan_id=${id}'))
->columns([
amis()->TableColumn('id', __('plan.task.id')),
amis()->TableColumn('name', __('plan.task.name')),
amis()->TableColumn('taskable.date', __('plan.task_ledger.date')),
amis()->TableColumn('taskable.store.title', __('plan.task_ledger.store')),
amis()->TableColumn('taskable.store.master.name', __('plan.task_ledger.store_master')),
amis()->TableColumn('task_status', __('plan.task.status'))->type('mapping')->map(TaskStatus::labelMap()),
amis()->TableColumn('completed_at', __('plan.task.completed_at')),
amis()->TableColumn('created_at', __('plan.task.created_at')),
])
->visibleOn('${planable_type == "plan_ledgers"}'),
]); ]);
} }
} }

View File

@ -0,0 +1,35 @@
<?php
namespace App\Admin\Controllers\Plan;
use App\Admin\Controllers\AdminController;
use App\Admin\Filters\TaskFilter;
use App\Admin\Services\Plan\TaskService;
use App\Models\Task;
use App\Models\TaskLedger;
use Illuminate\Database\Eloquent\Relations\MorphTo;
use Illuminate\Http\Request;
/**
* @property TaskService $service
*/
class TaskController extends AdminController
{
protected string $serviceName = TaskService::class;
public function shareList(Request $request)
{
$tasks = Task::filter($request->input(), TaskFilter::class)
->with([
'taskable' => function (MorphTo $morphTo) {
$morphTo->morphWith([
TaskLedger::class => ['store.master'],
]);
},
])
->latest('id')
->get();
return $this->response()->success($tasks);
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace App\Admin\Filters;
use EloquentFilter\ModelFilter;
class TaskFilter extends ModelFilter
{
public function plan($id)
{
$this->where('plan_id', $id);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Admin\Services\Plan;
use App\Admin\Filters\TaskFilter;
use App\Admin\Services\BaseService;
use App\Models\Task;
use Illuminate\Database\Eloquent\Builder;
/**
* @method Task getModel()
* @method Task|Builder query()
*/
class TaskService extends BaseService
{
protected string $modelName = Task::class;
protected string $modelFilterName = TaskFilter::class;
}

View File

@ -20,6 +20,7 @@ use App\Admin\Controllers\Hr\SignController;
use App\Admin\Controllers\Hr\SignLogController; use App\Admin\Controllers\Hr\SignLogController;
use App\Admin\Controllers\Hr\SignRepairController; use App\Admin\Controllers\Hr\SignRepairController;
use App\Admin\Controllers\Plan\PlanController; use App\Admin\Controllers\Plan\PlanController;
use App\Admin\Controllers\Plan\TaskController;
use App\Admin\Controllers\Store\DeviceController; use App\Admin\Controllers\Store\DeviceController;
use App\Admin\Controllers\Store\EmployeeController as StoreEmployeeController; use App\Admin\Controllers\Store\EmployeeController as StoreEmployeeController;
use App\Admin\Controllers\Store\StoreController; use App\Admin\Controllers\Store\StoreController;
@ -225,5 +226,7 @@ Route::group([
$router->post('workflow/success', [WorkflowController::class, 'success']); $router->post('workflow/success', [WorkflowController::class, 'success']);
$router->post('workflow/fail', [WorkflowController::class, 'fail']); $router->post('workflow/fail', [WorkflowController::class, 'fail']);
$router->get('workflow/logs', [WorkflowController::class, 'logs']); $router->get('workflow/logs', [WorkflowController::class, 'logs']);
$router->get('tasks', [TaskController::class, 'shareList']);
}); });
}); });

View File

@ -44,28 +44,33 @@ class TaskLedgerGenerateCommand extends Command
{ {
/** @var \App\Models\PlanLedger */ /** @var \App\Models\PlanLedger */
$planable = DB::transaction(function () use ($datetime) { $planable = DB::transaction(function () use ($datetime) {
$date = $datetime->format('Y-m-d'); /** @var \App\Models\PlanLedger */
$planable = PlanLedger::firstOrNew([
'date' => $datetime->format('Y-m-d'),
]);
if (! is_null($planable = PlanLedger::where('date', $date)->first())) { if ($planable->exists) {
return $planable; return $planable;
} }
/** @var \App\Models\PlanLedger */ $planable->save();
$planable = PlanLedger::create(['date' => $date]);
$plan = $planable->plan()->create([ $plan = $planable->plan()->create([
'name' => "{$date} 总账录入", 'name' => "{$planable->date} 总账录入",
'plan_status' => PlanStatus::Published, 'plan_status' => PlanStatus::Published,
]); ]);
return $planable->setRelation('plan', $plan); return $planable->setRelation('plan', $plan);
}); });
Store::lazyById()->each(function (Store $store) use ($planable) { $stores = Store::all();
/** @var \App\Models\Store */
foreach ($stores as $store) {
DB::transaction(function () use ($store, $planable) { DB::transaction(function () use ($store, $planable) {
$taskable = TaskLedger::firstOrNew([ $taskable = TaskLedger::firstOrNew([
'store_id' => $store->id, 'store_id' => $store->id,
'date' => $planable->date->format('Y-m-d'), 'date' => $planable->date,
]); ]);
if ($taskable->exists) { if ($taskable->exists) {
@ -75,18 +80,20 @@ class TaskLedgerGenerateCommand extends Command
$taskable->save(); $taskable->save();
$ledger = Ledger::where('store_id', $store->id) $ledger = Ledger::where('store_id', $store->id)
->where('date', $planable->date->format('Y-m-d')) ->where('date', $planable->date)
->first(); ->first();
$date = Carbon::parse($planable->date);
$taskable->task()->create([ $taskable->task()->create([
'plan_id' => $planable->plan->id, 'plan_id' => $planable->plan->id,
'name' => '总账录入', 'name' => '总账录入',
'start_at' => $planable->date->copy()->startOfDay(), 'start_at' => $date->copy()->startOfDay(),
'end_at' => $planable->date->copy()->endOfDay(), 'end_at' => $date->copy()->endOfDay(),
'task_status' => $ledger ? TaskStatus::Success : TaskStatus::Pending, 'task_status' => $ledger ? TaskStatus::Success : TaskStatus::Pending,
'completed_at' => $ledger?->created_at, 'completed_at' => $ledger?->created_at,
]); ]);
}); });
}); }
} }
} }

View File

@ -11,10 +11,6 @@ class PlanLedger extends Model
{ {
use HasFactory, HasDateTimeFormatter; use HasFactory, HasDateTimeFormatter;
protected $casts = [
'date' => 'date',
];
protected $fillable = [ protected $fillable = [
'date', 'date',
]; ];

View File

@ -3,13 +3,15 @@
namespace App\Models; namespace App\Models;
use App\Enums\TaskStatus; use App\Enums\TaskStatus;
use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\Relations\MorphTo;
class Task extends Model class Task extends Model
{ {
use HasFactory; use Filterable, HasFactory, HasDateTimeFormatter;
protected $attributes = [ protected $attributes = [
'task_status' => TaskStatus::Pending, 'task_status' => TaskStatus::Pending,

View File

@ -2,6 +2,7 @@
namespace App\Models; namespace App\Models;
use App\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -9,11 +10,7 @@ use Illuminate\Database\Eloquent\Relations\MorphOne;
class TaskLedger extends Model class TaskLedger extends Model
{ {
use HasFactory; use HasFactory, HasDateTimeFormatter;
protected $casts = [
'date' => 'date',
];
protected $fillable = [ protected $fillable = [
'store_id', 'store_id',

View File

@ -14,4 +14,18 @@ return [
'store_level' => '门店等级', 'store_level' => '门店等级',
'performance' => '业绩', 'performance' => '业绩',
], ],
'task' => [
'id' => 'ID',
'name' => '任务名称',
'status' => '状态',
'completed_at' => '完成时间',
'created_at' => '创建时间',
],
'task_ledger' => [
'date' => '日期',
'store' => '门店',
'store_master' => '店长',
],
]; ];