门店统计

main
Jing Li 2024-03-29 12:39:22 +08:00
parent aede82735a
commit 18e8b386f2
4 changed files with 121 additions and 3 deletions

View File

@ -0,0 +1,86 @@
<?php
namespace App\Admin\Controllers\Finance;
use App\Admin\Controllers\AdminController;
use App\Admin\Filters\LedgerFilter;
use App\Admin\Filters\LedgerItemFilter;
use App\Admin\Filters\StoreFilter;
use App\Models\Ledger;
use App\Models\Store;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class StoreStatisticController extends AdminController
{
public function index()
{
if ($this->actionOfGetData()) {
return $this->response()->success([
'items' => $this->getStoreStatistics(request()),
]);
}
return $this->response()->success(
$this->baseList(
$this->baseCRUD()
->headerToolbar([
amis('filter-toggler')->align('right'),
])
->footerToolbar([])
->bulkActions([])
->filter($this->baseFilter()->body([
amis()->GroupControl()->mode('horizontal')->body([
amis()->DateRangeControl('date_range', '日期')
->valueFormat('YYYY-MM-DD')
->columnRatio(6),
amis()->InputCityControl('region', '区域')
->allowDistrict(false)
->extractValue(false),
]),
]))
->columns([
amis()->TableColumn('ranking', '排序'),
amis()->TableColumn('title', '门店'),
amis()->TableColumn('sales', '收入')->sortable(),
amis()->TableColumn('expenditure', '支出')->sortable(),
])
)
);
}
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)
->groupBy('store_id')
->get()
->keyBy('store_id');
// 排序规则
$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'),
];
})
->sortBy($sortBy)
->values()
->map(fn ($statistic, $key) => array_merge($statistic, ['ranking' => $key + 1]))
->all();
}
}

View File

@ -3,21 +3,41 @@
namespace App\Admin\Filters;
use EloquentFilter\ModelFilter;
use Illuminate\Support\Arr;
class LedgerFilter extends ModelFilter
{
public function store($id)
{
$this->query->where('store_id', $id);
$this->where('store_id', $id);
}
public function dateRange($dateRange)
{
$this->query->whereBetween('date', explode(',', $dateRange));
$this->whereBetween('date', explode(',', $dateRange));
}
public function status($status)
{
$this->query->whereIn('ledger_status', explode(',', $status));
$this->whereIn('ledger_status', explode(',', $status));
}
public function region($region)
{
if (! is_array($region)) {
return;
}
$provinceCode = Arr::get($region, 'provinceCode');
$cityCode = Arr::get($region, 'cityCode');
if (empty($provinceCode) && empty($cityCode)) {
return;
}
$this->related('store', function($query) use ($provinceCode, $cityCode) {
$query->when($provinceCode, fn ($query) => $query->where('region->provinceCode', $provinceCode))
->when($cityCode, fn ($query) => $query->where('region->cityCode', $cityCode));
});
}
}

View File

@ -3,6 +3,7 @@
use App\Admin\Controllers\BaseKeywordController;
use App\Admin\Controllers\Finance\LedgerController;
use App\Admin\Controllers\Finance\SalesStatisticController;
use App\Admin\Controllers\Finance\StoreStatisticController;
use App\Admin\Controllers\Hr\EmployeeController;
use App\Admin\Controllers\Hr\RestController;
use App\Admin\Controllers\Hr\SignController;
@ -88,6 +89,8 @@ Route::group([
$router->post('ledgers/{ledger}/approval', [LedgerController::class, 'approval'])->name('ledgers.approval');
// 销售统计
$router->get('sales-statistics', [SalesStatisticController::class, 'index'])->name('sales_statistics.index');
// 门店统计
$router->get('store-statistics', [StoreStatisticController::class, 'index'])->name('store_statistics.index');
});
/*

View File

@ -151,6 +151,15 @@ class AdminPermissionSeeder extends Seeder
'index' => '销售统计',
],
],
'store_statistics' => [
'name' => '门店统计',
'icon' => 'material-symbols:store-rounded',
'uri' => '/finance/store-statistics',
'resource' => false,
'children' => [
'index' => '门店统计',
],
],
],
],