diff --git a/app/Admin/Controllers/Finance/SalesStatisticController.php b/app/Admin/Controllers/Finance/SalesStatisticController.php index 8ed2869..771d210 100644 --- a/app/Admin/Controllers/Finance/SalesStatisticController.php +++ b/app/Admin/Controllers/Finance/SalesStatisticController.php @@ -71,13 +71,13 @@ class SalesStatisticController extends AdminController DB::raw('SUM(expenditure) as expenditure'), ]) ->filter($request->input(), LedgerItemFilter::class) - ->whereIn('ledger_item_type_id', $lotteryTypes->pluck('value')) + ->whereIn('ledger_item_type_id', $lotteryTypes->pluck('key')) ->groupBy('ledger_item_type_id') ->get() ->keyBy('ledger_item_type_id'); return $lotteryTypes->map(function ($lotteryType) use ($statistics) { - $statistic = $statistics->get($lotteryType->value); + $statistic = $statistics->get($lotteryType->key); return [ 'name' => $lotteryType->name, diff --git a/app/Admin/Controllers/Finance/StoreStatisticController.php b/app/Admin/Controllers/Finance/StoreStatisticController.php index de59710..d6ed2ad 100644 --- a/app/Admin/Controllers/Finance/StoreStatisticController.php +++ b/app/Admin/Controllers/Finance/StoreStatisticController.php @@ -3,7 +3,7 @@ namespace App\Admin\Controllers\Finance; use App\Admin\Controllers\AdminController; -use App\Admin\Filters\LedgerItemFilter; +use App\Admin\Filters\LedgerFilter; use App\Admin\Filters\StoreFilter; use App\Models\Ledger; use App\Models\Store; @@ -50,37 +50,26 @@ class StoreStatisticController extends AdminController protected function getStoreStatistics(Request $request): array { - $stores = Store::filter($request->only(['region']), StoreFilter::class) - ->get(['id', 'title']); - /** @var \Illuminate\Database\Eloquent\Collection */ - $statistics = Ledger::select([ - 'store_id', - DB::raw('SUM(sales) as sales'), - DB::raw('SUM(expenditure) as expenditure'), - ]) - ->filter($request->input(), LedgerItemFilter::class) + $stats = Ledger::with(['store']) + ->select(['store_id', DB::raw('SUM(sales) as sales'), DB::raw('SUM(expenditure) as expenditure')]) + ->filter($request->input(), LedgerFilter::class) ->groupBy('store_id') - ->get() - ->keyBy('store_id'); + ->get(); // 排序规则 $sortBy = [ [$request->input('orderBy') ?: 'sales', $request->input('orderDir') ?: 'desc'], ]; - return $stores->map(function ($store) use ($statistics) { - $statistic = $statistics->get($store->id); - - return [ - 'title' => $store->title, - 'sales' => trim_zeros($statistic->sales ?? '0'), - 'expenditure' => trim_zeros($statistic->expenditure ?? '0'), - ]; - }) + return $stats->map(fn ($item) => [ + 'title' => $item->store->title, + 'sales' => trim_zeros($item->sales ?? '0'), + 'expenditure' => trim_zeros($item->expenditure ?? '0'), + ]) ->sortBy($sortBy) ->values() - ->map(fn ($statistic, $key) => array_merge($statistic, ['ranking' => $key + 1])) + ->map(fn ($item, $key) => array_merge($item, ['ranking' => $key + 1])) ->all(); } } diff --git a/app/Admin/Filters/LedgerFilter.php b/app/Admin/Filters/LedgerFilter.php index f5e4265..4b51b74 100644 --- a/app/Admin/Filters/LedgerFilter.php +++ b/app/Admin/Filters/LedgerFilter.php @@ -23,11 +23,12 @@ class LedgerFilter extends ModelFilter return; } - $provinceCode = Arr::get($region, 'provinceCode'); + // 区划代码 - 省份 + $provinceCode = (string) Arr::get($region, 'provinceCode'); + // 区划代码 - 城市 + $cityCode = (string) Arr::get($region, 'cityCode'); - $cityCode = Arr::get($region, 'cityCode'); - - if (empty($provinceCode) && empty($cityCode)) { + if ($provinceCode === '' && $cityCode === '') { return; } diff --git a/app/Http/Controllers/Api/Ledger/LotteryTypeController.php b/app/Http/Controllers/Api/Ledger/LotteryTypeController.php deleted file mode 100644 index 822d1b0..0000000 --- a/app/Http/Controllers/Api/Ledger/LotteryTypeController.php +++ /dev/null @@ -1,22 +0,0 @@ - 'lottery_type'])->oldest('sort')->get(); - - return $lotteryTypes - ->filter(fn (Keyword $type) => (string) $type->value !== '') - ->map(fn ($item) => [ - 'id' => $item->value, - 'name' => $item->name, - ]); - } -} diff --git a/app/Http/Controllers/Api/Ledger/LedgerController.php b/app/Http/Controllers/Api/LedgerController.php similarity index 87% rename from app/Http/Controllers/Api/Ledger/LedgerController.php rename to app/Http/Controllers/Api/LedgerController.php index 04c064e..657191d 100644 --- a/app/Http/Controllers/Api/Ledger/LedgerController.php +++ b/app/Http/Controllers/Api/LedgerController.php @@ -1,6 +1,6 @@ 'lottery_type']) ->oldest('sort') - ->get() - // 过滤未绑定上报数据类型的彩种 - ->filter(fn (Keyword $type) => (string) $type->value !== ''); + ->get(); // 上报数据项的格式: // [ @@ -65,7 +63,7 @@ class LedgerController extends Controller /** @var \App\Models\Keyword */ foreach ($lotteryTypes as $lotteryType) { - $item = $items->get($lotteryType->value); + $item = $items->get($lotteryType->key); if (is_null($item)) { throw new RuntimeException("{$lotteryType->name}未填写上报数据"); @@ -155,24 +153,6 @@ class LedgerController extends Controller ->where('date', $date) ->first(); - $data = null; - - if ($ledger) { - $data = [ - 'date' => $ledger->date, - 'items' => $ledger->items->map(fn ($item) => [ - 'id' => $item->ledger_item_type_id, - 'sales' => $item->sales, - 'expenditure' => $item->expenditure, - ]), - 'new_customers' => $ledger->new_customers, - 'sales' => $ledger->sales, - 'expenditure' => $ledger->expenditure, - 'handover_amount' => $ledger->handover_amount, - 'photos' => $ledger->photos, - ]; - } - return [ 'data' => $ledger ? $this->prepareLedger($ledger) : null, ]; diff --git a/app/Http/Controllers/Api/StatsController.php b/app/Http/Controllers/Api/StatsController.php index 647fc11..2e8653c 100644 --- a/app/Http/Controllers/Api/StatsController.php +++ b/app/Http/Controllers/Api/StatsController.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers\Api; +use App\Admin\Filters\LedgerFilter; +use App\Models\Employee; use App\Models\Ledger; use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\Request; @@ -15,43 +17,31 @@ class StatsController extends Controller /** @var \App\Models\Employee */ $user = $request->user(); - $query = Ledger::when($user->isAdministrator(), function ($query) use ($request) { - if ($request->filled('store_id')) { - return $query->where('store_id', $request->input('store_id')); - } + $query = Ledger::filter( + $this->defaultInput($user, $request), LedgerFilter::class + ); - 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(); + // 昨天 + $yesterday = Carbon::yesterday(); //-------------------------------------------------------------------------- // 本月总账录入 //-------------------------------------------------------------------------- $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')]) + ->whereBetween('date', [$yesterday->copy()->startOfMonth()->format('Y-m-d'), $yesterday->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); + $start = $yesterday->copy()->subDays(29); + $end = $yesterday->copy(); /** @var \Illuminate\Database\Eloquent\Collection */ $ledgers30days = (clone $query) ->whereBetween('date', [$start, $end]) @@ -62,7 +52,7 @@ class StatsController extends Controller // 本月总账录入 'current_month_ledger' => [ // 截止日期 - 'deadline' => $today->format('Y-m-d'), + 'deadline' => $yesterday->format('Y-m-d'), 'sales' => trim_zeros($currentMonthLedger->sales ?? 0), 'expenditure' => trim_zeros($currentMonthLedger->expenditure ?? 0), ], @@ -77,12 +67,6 @@ class StatsController extends Controller ]; } - public function test(Request $request) - { - /** @var \App\Models\Employee */ - $user = $request->user(); - } - /** * 准备趋势数据 */ @@ -106,4 +90,29 @@ class StatsController extends Controller return $data->all(); } + + protected function defaultInput(Employee $employee, Request $request): array + { + $input = []; + + if (! $employee->isAdministrator()) { + $input['store_id'] = $employee->store_id; + } elseif ($request->filled('store_id')) { + $input['store_id'] = $request->input('store_id'); + } else { + $region = []; + + if ($request->filled('province_code')) { + $region['provinceCode'] = $request->input('province_code'); + } + + if ($request->filled('cityCode')) { + $region['city_code'] = $request->input('city_code'); + } + + $input['region'] = $region; + } + + return $input; + } } diff --git a/config/admin.php b/config/admin.php index af01553..64666f6 100644 --- a/config/admin.php +++ b/config/admin.php @@ -92,7 +92,7 @@ return [ 'layout' => [ // 浏览器标题, 功能名称使用 %title% 代替 - 'title' => '%title% | OwlAdmin', + 'title' => '%title% | 门店助手-管理后台', 'header' => [ // 是否显示 [刷新] 按钮 'refresh' => true, diff --git a/database/seeders/KeywordSeeder.php b/database/seeders/KeywordSeeder.php index e78364a..7b11133 100644 --- a/database/seeders/KeywordSeeder.php +++ b/database/seeders/KeywordSeeder.php @@ -75,19 +75,12 @@ class KeywordSeeder extends Seeder [ 'key' => 'lottery_type', 'name' => '彩种类型', - 'children' => [ - ['name' => '电彩', 'value' => 'ledger_item_type_1'], - ['name' => '竞彩', 'value' => 'ledger_item_type_2'], - ['name' => '即开', 'value' => 'ledger_item_type_3'], - ], + 'children' => ['电彩', '竞彩', '即开'], ], [ 'key' => 'ledger_item_type', 'name' => '上报数据类型', 'children' => [ - '电彩', - '竞彩', - '即开', ['key' => 'ledger_item_type_other', 'name' => '其他'] ], ], diff --git a/routes/api.php b/routes/api.php index c1f94a3..e0ef4a1 100644 --- a/routes/api.php +++ b/routes/api.php @@ -6,8 +6,7 @@ use App\Http\Controllers\Api\ComplaintController; use App\Http\Controllers\Api\FeedbackController; use App\Http\Controllers\Api\FileUploadController; use App\Http\Controllers\Api\KeywordController; -use App\Http\Controllers\Api\Ledger\LedgerController; -use App\Http\Controllers\Api\Ledger\LotteryTypeController; +use App\Http\Controllers\Api\LedgerController; use App\Http\Controllers\Api\ReimbursementController; use App\Http\Controllers\Api\StatsController; use Illuminate\Support\Facades\Route; @@ -39,9 +38,7 @@ Route::group([ Route::get('/stats/dashboard', [StatsController::class, 'dashboard']); // 数据上报 - Route::post('/ledger/ledgers', [LedgerController::class, 'store']); - Route::get('/ledger/ledgers/{date}', [LedgerController::class, 'show']); - Route::get('/ledger/lottery-types', [LotteryTypeController::class, 'index']); + Route::apiResource('/ledgers', LedgerController::class)->only(['store', 'show']); // 举报投诉 Route::post('complaints', [ComplaintController::class, 'store']);