argument('date'); $this->generateTasks( $date ? Carbon::parse($date) : today() ); } protected function generateTasks(Carbon $datetime): void { $stores = Store::with(['master'])->get(); if ($stores->isEmpty()) { return; } /** @var \App\Models\PlanLedger */ $planable = DB::transaction(function () use ($datetime) { /** @var \App\Models\PlanLedger */ $planable = PlanLedger::firstOrNew([ 'date' => $datetime->format('Y-m-d'), ]); if ($planable->exists) { return $planable; } $planable->save(); $plan = $planable->plan()->create([ 'name' => "【{$planable->date}】总账录入", 'plan_status' => PlanStatus::Published, ]); return $planable->setRelation('plan', $plan); }); /** @var \App\Models\Store */ foreach ($stores as $store) { DB::transaction(function () use ($store, $planable) { $taskable = TaskLedger::firstOrNew([ 'store_id' => $store->id, 'date' => $planable->date, ], [ 'store_master_id' => $store->master?->id, ]); if ($taskable->exists) { return; } $taskable->save(); $ledger = Ledger::where('store_id', $store->id) ->where('date', $planable->date) ->first(); $date = Carbon::parse($planable->date); $taskable->task()->create([ 'plan_id' => $planable->plan->id, 'name' => '总账录入', 'start_at' => $date->copy()->startOfDay(), 'end_at' => $date->copy()->endOfDay(), 'task_status' => $ledger ? TaskStatus::Success : TaskStatus::Pending, 'completed_at' => $ledger?->created_at, ]); }); } } }