generated from liutk/owl-admin-base
Merge branch 'main' of https://gitea.hmily.club/pdkj/store-manage into main
commit
1939d281fa
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,22 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\Ledger;
|
||||
|
||||
use App\Http\Controllers\Api\Controller;
|
||||
use App\Models\Keyword;
|
||||
|
||||
class LotteryTypeController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
/** @var \Illuminate\Database\Eloquent\Collection */
|
||||
$lotteryTypes = Keyword::filter(['parent_key' => 'lottery_type'])->oldest('sort')->get();
|
||||
|
||||
return $lotteryTypes
|
||||
->filter(fn (Keyword $type) => (string) $type->value !== '')
|
||||
->map(fn ($item) => [
|
||||
'id' => $item->value,
|
||||
'name' => $item->name,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\Ledger;
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Exceptions\RuntimeException;
|
||||
use App\Http\Controllers\Api\Controller;
|
||||
|
|
@ -50,9 +50,7 @@ class LedgerController extends Controller
|
|||
/** @var \Illuminate\Database\Eloquent\Collection */
|
||||
$lotteryTypes = Keyword::filter(['parent_key' => '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,
|
||||
];
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ return [
|
|||
|
||||
'layout' => [
|
||||
// 浏览器标题, 功能名称使用 %title% 代替
|
||||
'title' => '%title% | OwlAdmin',
|
||||
'title' => '%title% | 门店助手-管理后台',
|
||||
'header' => [
|
||||
// 是否显示 [刷新] 按钮
|
||||
'refresh' => true,
|
||||
|
|
|
|||
|
|
@ -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' => '其他']
|
||||
],
|
||||
],
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
|
|
|
|||
Loading…
Reference in New Issue