user(); $query = Ledger::when($user->isAdministrator(), function ($query) use ($request) { if ($request->filled('store_id')) { return $query->where('store_id', $request->input('store_id')); } if (! $request->anyFilled(['province_code', 'city_code'])) { return; } $query->whereHas('store', function ($query) use ($request) { $request->whenFilled('province_code', fn ($code) => $query->where('region->provinceCode', $code)); $request->whenFilled('city_code', fn ($code) => $query->where('region->cityCode', $code)); }); }, fn ($query) => $query->where('store_id', $user->store_id)); // 今天 $today = Carbon::today(); //-------------------------------------------------------------------------- // 本月总账录入 //-------------------------------------------------------------------------- $currentMonthLedger = (clone $query) ->select([DB::raw('SUM(sales) as sales'), DB::raw('SUM(expenditure) as expenditure')]) ->whereBetween('date', [$today->copy()->startOfMonth()->format('Y-m-d'), $today->format('Y-m-d')]) ->first(); //-------------------------------------------------------------------------- // 昨日总账录入 //-------------------------------------------------------------------------- $yesterday = $today->copy()->subDay(); $yesterdayLedger = (clone $query)->where('date', $yesterday->format('Y-m-d'))->first(); //-------------------------------------------------------------------------- // 近 30 天趋势数据 //-------------------------------------------------------------------------- $start = $today->copy()->subDays(30); $end = $start->copy()->addDays(29); /** @var \Illuminate\Database\Eloquent\Collection */ $ledgers30days = (clone $query) ->whereBetween('date', [$start, $end]) ->get(['date', 'sales', 'expenditure']) ->keyBy('date'); return [ // 本月总账录入 'current_month_ledger' => [ // 截止日期 'deadline' => $today->format('Y-m-d'), 'sales' => trim_zeros($currentMonthLedger->sales ?? 0), 'expenditure' => trim_zeros($currentMonthLedger->expenditure ?? 0), ], // 昨日累计金额 'yesterday_ledger' => [ 'date' => $yesterday->format('Y-m-d'), 'sales' => trim_zeros($yesterdayLedger->sales ?? 0), 'expenditure' => trim_zeros($yesterdayLedger->expenditure ?? 0), ], // 近30天趋势数据 'trend_data_of_30days' => $this->prepareTrendData($start->copy(), $end->copy(), $ledgers30days), ]; } public function test(Request $request) { /** @var \App\Models\Employee */ $user = $request->user(); } /** * 准备趋势数据 */ protected function prepareTrendData(Carbon $start, Carbon $end, Collection $ledgers): array { $data = collect(); do { $ledger = $ledgers->get( $date = $start->format('Y-m-d') ); $data->push([ 'date' => $date, 'sales' => trim_zeros($ledger->sales ?? 0), 'expenditure' => trim_zeros($ledger->expenditure ?? 0), ]); $start->addDay(); } while ($start->lte($end)); return $data->all(); } }