diff --git a/app/Admin/Controllers/CockpitController.php b/app/Admin/Controllers/CockpitController.php index 83aa2c6..2f6afa9 100644 --- a/app/Admin/Controllers/CockpitController.php +++ b/app/Admin/Controllers/CockpitController.php @@ -4,10 +4,13 @@ namespace App\Admin\Controllers; use App\Http\Controllers\Controller; use App\Models\Employee; +use App\Models\Ledger; use App\Models\Store; use App\Models\TaskPerformance; use Illuminate\Http\Request; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB; +use Illuminate\Validation\Rule; class CockpitController extends Controller { @@ -32,7 +35,84 @@ class CockpitController extends Controller */ public function salesTrend(Request $request): array { - return []; + $request->validate( + rules: [ + 'last' => ['bail', 'required', Rule::in(['7days', '30days', '180days', '365days'])], + ], + ); + + $data = collect(); + + $last = $request->input('last'); + + if (in_array($last, ['7days', '30days'])) { + // 按天 + $days = match ($last) { + '7days' => 7, + '30days' => 30, + }; + + // 今天 + $today = Carbon::today(); + // 开始时间 + $startAt = $today->copy()->subDays($days); + // 结束时间 + $endAt = $today->copy()->subDay(); + + $ledgers = Ledger::select(['date', DB::raw('SUM(sales) as sales')]) + ->whereBetween('date', [$startAt->toDateString(), $endAt->toDateString()]) + ->groupBy('date') + ->get() + ->keyBy('date'); + + while ($startAt->lte($endAt)) { + $date = $startAt->toDateString(); + + $ledger = $ledgers->get($date); + + $data->push([ + 'date' => $date, + 'sales' => trim_zeros($ledger->sales ?? 0), + ]); + + $startAt->addDay(); + } + } + elseif (in_array($last, ['180days', '365days'])) { + // 按月 + $months = match ($last) { + '180days' => 6, // 6个月 + '365days' => 12, // 12个月 + }; + + // 今天 + $today = Carbon::today(); + // 开始时间 + $startAt = $today->copy()->startOfMonth()->subMonths($months); + // 结束时间 + $endAt = $today->copy()->startOfMonth()->subMonth()->endOfMonth(); + + $ledgers = Ledger::select([DB::raw("DATE_FORMAT(`date`, '%Y-%m') as month"), DB::raw('SUM(sales) as sales')]) + ->whereBetween('date', [$startAt->toDateString(), $endAt->toDateString()]) + ->groupBy('month') + ->get() + ->keyBy('month'); + + for ($i=0; $i < $months; $i++) { + $month = $startAt->format('Y-m'); + + $ledger = $ledgers->get($month); + + $data->push([ + 'date' => $month, + 'sales' => trim_zeros($ledger->sales ?? 0), + ]); + + $startAt->addMonth(); + } + } + + return $data->all(); } /**