generated from liutk/owl-admin-base
门店统计
parent
f084d81dba
commit
60e7ce8301
|
|
@ -7,6 +7,11 @@ use Illuminate\Support\Arr;
|
||||||
|
|
||||||
class StoreFilter extends ModelFilter
|
class StoreFilter extends ModelFilter
|
||||||
{
|
{
|
||||||
|
public function store($id)
|
||||||
|
{
|
||||||
|
$this->where('id', $id);
|
||||||
|
}
|
||||||
|
|
||||||
public function title($name)
|
public function title($name)
|
||||||
{
|
{
|
||||||
$this->whereLike('title', $name);
|
$this->whereLike('title', $name);
|
||||||
|
|
|
||||||
|
|
@ -3,22 +3,25 @@
|
||||||
namespace App\Http\Controllers\Api;
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
use App\Admin\Filters\LedgerFilter;
|
use App\Admin\Filters\LedgerFilter;
|
||||||
use App\Models\Employee;
|
use App\Admin\Filters\StoreFilter;
|
||||||
|
use App\Http\Resources\StoreResource;
|
||||||
use App\Models\Ledger;
|
use App\Models\Ledger;
|
||||||
|
use App\Models\Store;
|
||||||
use Illuminate\Database\Eloquent\Collection;
|
use Illuminate\Database\Eloquent\Collection;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
use Illuminate\Support\Carbon;
|
use Illuminate\Support\Carbon;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
class StatsController extends Controller
|
class StatisticsController extends Controller
|
||||||
{
|
{
|
||||||
public function dashboard(Request $request)
|
/**
|
||||||
|
* 首页统计
|
||||||
|
*/
|
||||||
|
public function dashboard(Request $request): array
|
||||||
{
|
{
|
||||||
/** @var \App\Models\Employee */
|
|
||||||
$user = $request->user();
|
|
||||||
|
|
||||||
$query = Ledger::filter(
|
$query = Ledger::filter(
|
||||||
$this->defaultInput($user, $request), LedgerFilter::class
|
$this->defaultFilterInput($request), LedgerFilter::class
|
||||||
);
|
);
|
||||||
|
|
||||||
// 昨天
|
// 昨天
|
||||||
|
|
@ -67,6 +70,40 @@ class StatsController extends Controller
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 门店统计
|
||||||
|
*/
|
||||||
|
public function stores(Request $request)
|
||||||
|
{
|
||||||
|
$request->validate(
|
||||||
|
rules: [
|
||||||
|
'start_at' => ['bail', 'required', 'date_format:Y-m-d'],
|
||||||
|
'end_at' => ['bail', 'required', 'date_format:Y-m-d'],
|
||||||
|
],
|
||||||
|
attributes: [
|
||||||
|
'start_at' => '开始日期',
|
||||||
|
'end_at' => '结束日期',
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
$storeLedgerStats = Ledger::select(['store_id', DB::raw('SUM(sales) as sales')])
|
||||||
|
->whereBetween('date', [$request->input('start_at'), $request->input('end_at')])
|
||||||
|
->groupBy('store_id');
|
||||||
|
|
||||||
|
$stores = Store::filter($this->defaultFilterInput($request), StoreFilter::class)
|
||||||
|
->leftJoinSub($storeLedgerStats, 'store_ledger_stats', fn ($join) => $join->on('stores.id', '=', 'store_ledger_stats.store_id'))
|
||||||
|
->orderBy('sales', 'desc')
|
||||||
|
->orderBy('id', 'asc')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return $stores->map(function (Store $store) {
|
||||||
|
return [
|
||||||
|
'store' => StoreResource::make($store),
|
||||||
|
'sales' => trim_zeros($store->sales ?: 0),
|
||||||
|
];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 准备趋势数据
|
* 准备趋势数据
|
||||||
*/
|
*/
|
||||||
|
|
@ -91,13 +128,14 @@ class StatsController extends Controller
|
||||||
return $data->all();
|
return $data->all();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function defaultInput(Employee $employee, Request $request): array
|
/**
|
||||||
|
* 处理区域和门店过滤条件
|
||||||
|
*/
|
||||||
|
protected function defaultFilterInput(Request $request): array
|
||||||
{
|
{
|
||||||
$input = [];
|
$input = [];
|
||||||
|
|
||||||
if (! $employee->isAdministrator()) {
|
if ($request->filled('store_id')) {
|
||||||
$input['store_id'] = $employee->store_id;
|
|
||||||
} elseif ($request->filled('store_id')) {
|
|
||||||
$input['store_id'] = $request->input('store_id');
|
$input['store_id'] = $request->input('store_id');
|
||||||
} else {
|
} else {
|
||||||
$region = [];
|
$region = [];
|
||||||
|
|
@ -106,8 +144,8 @@ class StatsController extends Controller
|
||||||
$region['provinceCode'] = $request->input('province_code');
|
$region['provinceCode'] = $request->input('province_code');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request->filled('cityCode')) {
|
if ($request->filled('city_code')) {
|
||||||
$region['city_code'] = $request->input('city_code');
|
$region['cityCode'] = $request->input('city_code');
|
||||||
}
|
}
|
||||||
|
|
||||||
$input['region'] = $region;
|
$input['region'] = $region;
|
||||||
|
|
@ -8,7 +8,7 @@ use App\Http\Controllers\Api\FileUploadController;
|
||||||
use App\Http\Controllers\Api\KeywordController;
|
use App\Http\Controllers\Api\KeywordController;
|
||||||
use App\Http\Controllers\Api\LedgerController;
|
use App\Http\Controllers\Api\LedgerController;
|
||||||
use App\Http\Controllers\Api\ReimbursementController;
|
use App\Http\Controllers\Api\ReimbursementController;
|
||||||
use App\Http\Controllers\Api\StatsController;
|
use App\Http\Controllers\Api\StatisticsController;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
Route::post('/auth/login', [AccessTokenController::class, 'store']);
|
Route::post('/auth/login', [AccessTokenController::class, 'store']);
|
||||||
|
|
@ -35,7 +35,10 @@ Route::group([
|
||||||
// 个人账户 - 佣金提成
|
// 个人账户 - 佣金提成
|
||||||
Route::get('/account/store-master-commissions', [StoreMasterCommissionController::class, 'index']);
|
Route::get('/account/store-master-commissions', [StoreMasterCommissionController::class, 'index']);
|
||||||
|
|
||||||
Route::get('/stats/dashboard', [StatsController::class, 'dashboard']);
|
// 统计数据 - 首页统计
|
||||||
|
Route::get('/statistics/dashboard', [StatisticsController::class, 'dashboard']);
|
||||||
|
// 统计数据 - 门店统计
|
||||||
|
Route::get('/statistics/stores', [StatisticsController::class, 'stores']);
|
||||||
|
|
||||||
// 数据上报
|
// 数据上报
|
||||||
Route::apiResource('/ledgers', LedgerController::class)->only(['store', 'show']);
|
Route::apiResource('/ledgers', LedgerController::class)->only(['store', 'show']);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue