diff --git a/app/Console/Commands/CheckOrderFee.php b/app/Console/Commands/CheckOrderFee.php index ccf6999..898642d 100644 --- a/app/Console/Commands/CheckOrderFee.php +++ b/app/Console/Commands/CheckOrderFee.php @@ -2,6 +2,7 @@ namespace App\Console\Commands; +use App\Models\Holiday; use App\Models\OrderItems; use Carbon\Carbon; use Illuminate\Console\Command; @@ -16,7 +17,8 @@ class CheckOrderFee extends Command protected $signature = 'order-items:check-fee {start_date : 开始日期,格式为 YYYY-MM-DD} {end_date : 结束日期,格式为 YYYY-MM-DD} - {--project_id= : 只检测指定项目的订单} + {project_id? : 可选,指定项目 ID} + {--project_id= : 只检测指定项目的订单,兼容旧用法} {--limit=50 : 表格展示的最大行数}'; /** @@ -47,7 +49,7 @@ class CheckOrderFee extends Command return 1; } - $projectId = $this->option('project_id'); + $projectId = $this->argument('project_id') ?: $this->option('project_id'); $limit = (int) $this->option('limit'); $limit = $limit > 0 ? $limit : 50; @@ -60,7 +62,7 @@ class CheckOrderFee extends Command $query = OrderItems::query() ->whereBetween('service_date', [$startDate->toDateString(), $endDate->toDateString()]) - ->with(['order', 'product']); + ->with(['order.project', 'product']); if ($projectId) { $query->whereHas('order', function ($q) use ($projectId) { @@ -68,14 +70,27 @@ class CheckOrderFee extends Command }); } + $holidayRatios = Holiday::query() + ->whereBetween('date', [$startDate->toDateString(), $endDate->toDateString()]) + ->when($projectId, function ($q) use ($projectId) { + $q->where('project_id', $projectId); + }) + ->get(['project_id', 'date', 'price_ratio']) + ->keyBy(function ($holiday) { + return $holiday->project_id . ':' . $holiday->date; + }); + $total = 0; $rowsForTable = []; - $query->chunkById(200, function ($items) use (&$total, &$rowsForTable, $limit) { + $query->chunkById(200, function ($items) use (&$total, &$rowsForTable, $limit, $holidayRatios) { foreach ($items as $item) { /** @var \App\Models\OrderItems $item */ $total++; $storedFee = (float) $item->fee; + $projectId = optional($item->order)->project_id; + $holidayKey = $projectId . ':' . $item->service_date; + $holidayRatio = optional($holidayRatios->get($holidayKey))->price_ratio; $calcItem = clone $item; if ($item->relationLoaded('order')) { @@ -92,7 +107,9 @@ class CheckOrderFee extends Command $rowsForTable[] = [ 'ID' => $item->id, '订单ID' => $item->order_id, + '项目名称' => optional(optional($item->order)->project)->name ?? '', '日期' => $item->service_date, + '节假日倍率' => $holidayRatio ?? '', '总价' => $item->total, '原fee' => $storedFee, '算法fee' => $calculatedFee, @@ -106,7 +123,7 @@ class CheckOrderFee extends Command $this->info('该时间段无子订单记录'); } else { $this->table( - ['ID', '订单ID', '日期', '总价', '原fee', '算法fee', '是否扣款'], + ['ID', '订单ID', '项目名称', '日期', '节假日倍率', '总价', '原fee', '算法fee', '是否扣款'], $rowsForTable ); } diff --git a/app/Http/Controllers/Admin/HolidayController.php b/app/Http/Controllers/Admin/HolidayController.php new file mode 100644 index 0000000..8fa4f04 --- /dev/null +++ b/app/Http/Controllers/Admin/HolidayController.php @@ -0,0 +1,101 @@ +model + ->with("project") + ->when($request->project_id, function ($query) use ($request) { + $query->where("project_id", $request->project_id); + }) + ->orderBy("date", "desc") + ->orderBy("id", "desc") + ->paginate(10); + + return view($this->bladePath . ".index", compact("data")); + } + + public function create(FormBuilder $formBuilder) + { + $projects = Project::orderBy("id", "desc")->get(); + $holiday = new Holiday(); + if (request()->project_id) { + $holiday->project_id = request()->project_id; + } + $isEdit = false; + return view($this->bladePath . ".create", compact("projects", "holiday", "isEdit")); + } + + public function store(Request $request) + { + $request->validate([ + "project_id" => "required|integer", + "price_ratio" => "required|numeric|min:0", + "dates" => "required|array|min:1", + "dates.*" => "required|date_format:Y-m-d", + "remark" => "nullable|string", + ], [ + "dates.required" => "请至少选择一个日期", + "dates.min" => "请至少选择一个日期", + ]); + + $dates = collect($request->dates)->filter()->unique()->values(); + foreach ($dates as $date) { + Holiday::updateOrCreate( + [ + "project_id" => $request->project_id, + "date" => $date, + ], + [ + "price_ratio" => $request->price_ratio, + "remark" => $request->remark, + ] + ); + } + + $url = url($this->urlPrefix . "?project_id=" . $request->project_id); + return $this->success("保存成功,共处理 {$dates->count()} 个日期", $url); + } + + public function edit($id = null, Request $request, FormBuilder $formBuilder) + { + $projects = Project::orderBy("id", "desc")->get(); + $holiday = $this->model->find($id ?: $request->id); + $isEdit = true; + return view($this->bladePath . ".create", compact("projects", "holiday", "isEdit")); + } + + public function update($id = null, Request $request) + { + $request->validate([ + "project_id" => "required|integer", + "price_ratio" => "required|numeric|min:0", + "date" => "required|date_format:Y-m-d", + "remark" => "nullable|string", + ]); + + $holiday = $this->model->find($id ?: $request->id); + $holiday->update([ + "project_id" => $request->project_id, + "date" => $request->date, + "price_ratio" => $request->price_ratio, + "remark" => $request->remark, + ]); + + $url = url($this->urlPrefix . "?project_id=" . $request->project_id); + return $this->success("修改成功", $url); + } +} diff --git a/app/Models/Holiday.php b/app/Models/Holiday.php index e130a7a..4f6d298 100755 --- a/app/Models/Holiday.php +++ b/app/Models/Holiday.php @@ -5,4 +5,9 @@ namespace App\Models; class Holiday extends SoftDeletesModel { protected $table = "holiday"; + + public function project() + { + return $this->belongsTo(Project::class); + } } diff --git a/resources/views/admin/holiday/create.blade.php b/resources/views/admin/holiday/create.blade.php new file mode 100644 index 0000000..fc3dca1 --- /dev/null +++ b/resources/views/admin/holiday/create.blade.php @@ -0,0 +1,172 @@ +@extends("admin.layouts.layout") + +@php + $pageTitle = ($isEdit ? "编辑" : "新增") . $modelName; +@endphp + +@section("content") +
| ID | +项目名称 | +日期 | +节假日倍率 | +备注 | +操作 | +
|---|---|---|---|---|---|
| {{ $row->id }} | +{{ optional($row->project)->name }} | +{{ $row->date }} | +{{ $row->price_ratio }} | +{{ $row->remark }} | ++ @lang("icons.action_edit") @lang("actions.edit") + @lang("icons.action_delete") @lang("actions.delete") + | +