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\Services\Plan\PlanService;
use App\Enums\PlanStatus;
use App\Enums\TaskStatus;
use Illuminate\Support\Arr;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form;
@ -161,6 +162,28 @@ class PlanController extends AdminController
public function detail(): Form
{
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\SignRepairController;
use App\Admin\Controllers\Plan\PlanController;
use App\Admin\Controllers\Plan\TaskController;
use App\Admin\Controllers\Store\DeviceController;
use App\Admin\Controllers\Store\EmployeeController as StoreEmployeeController;
use App\Admin\Controllers\Store\StoreController;
@ -225,5 +226,7 @@ Route::group([
$router->post('workflow/success', [WorkflowController::class, 'success']);
$router->post('workflow/fail', [WorkflowController::class, 'fail']);
$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 */
$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;
}
/** @var \App\Models\PlanLedger */
$planable = PlanLedger::create(['date' => $date]);
$planable->save();
$plan = $planable->plan()->create([
'name' => "{$date} 总账录入",
'name' => "{$planable->date} 总账录入",
'plan_status' => PlanStatus::Published,
]);
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) {
$taskable = TaskLedger::firstOrNew([
'store_id' => $store->id,
'date' => $planable->date->format('Y-m-d'),
'date' => $planable->date,
]);
if ($taskable->exists) {
@ -75,18 +80,20 @@ class TaskLedgerGenerateCommand extends Command
$taskable->save();
$ledger = Ledger::where('store_id', $store->id)
->where('date', $planable->date->format('Y-m-d'))
->where('date', $planable->date)
->first();
$date = Carbon::parse($planable->date);
$taskable->task()->create([
'plan_id' => $planable->plan->id,
'name' => '总账录入',
'start_at' => $planable->date->copy()->startOfDay(),
'end_at' => $planable->date->copy()->endOfDay(),
'start_at' => $date->copy()->startOfDay(),
'end_at' => $date->copy()->endOfDay(),
'task_status' => $ledger ? TaskStatus::Success : TaskStatus::Pending,
'completed_at' => $ledger?->created_at,
]);
});
});
}
}
}

View File

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

View File

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

View File

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

View File

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