generated from liutk/owl-admin-base
销售统计
parent
8f7cd01505
commit
aede82735a
|
|
@ -0,0 +1,89 @@
|
|||
<?php
|
||||
|
||||
namespace App\Admin\Controllers\Finance;
|
||||
|
||||
use App\Admin\Controllers\AdminController;
|
||||
use App\Admin\Filters\LedgerItemFilter;
|
||||
use App\Models\Keyword;
|
||||
use App\Models\LedgerItem;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
/**
|
||||
* @property mixed $name
|
||||
*/
|
||||
class SalesStatisticController extends AdminController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if ($this->actionOfGetData()) {
|
||||
return $this->response()->success([
|
||||
'items' => $this->getLotteryTypeStatistics(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', '区域')
|
||||
->inputClassName('w-40')
|
||||
->allowDistrict(false)
|
||||
->extractValue(false),
|
||||
amis()->SelectControl('store_id', __('finance.ledger.store'))
|
||||
->source(admin_url('api/stores?region=${region}'))
|
||||
->labelField('title')
|
||||
->valueField('id')
|
||||
->clearable(),
|
||||
]),
|
||||
]))
|
||||
->columns([
|
||||
amis()->TableColumn('name', '彩种'),
|
||||
amis()->TableColumn('sales', '销量'),
|
||||
amis()->TableColumn('expenditure', '兑奖'),
|
||||
])
|
||||
->affixRow([
|
||||
['type' => 'text', 'text' => '合计'],
|
||||
['type' => 'tpl', 'text' => '${items|pick:sales|sum}'],
|
||||
['type' => 'tpl', 'text' => '${items|pick:expenditure|sum}'],
|
||||
])
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
protected function getLotteryTypeStatistics(Request $request): array
|
||||
{
|
||||
/** @var \Illuminate\Database\Eloquent\Collection */
|
||||
$lotteryTypes = Keyword::where('parent_key', 'lottery_type')->get();
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Collection */
|
||||
$statistics = LedgerItem::select([
|
||||
'ledger_item_type_id',
|
||||
DB::raw('SUM(sales) as sales'),
|
||||
DB::raw('SUM(expenditure) as expenditure'),
|
||||
])
|
||||
->filter($request->input(), LedgerItemFilter::class)
|
||||
->whereIn('ledger_item_type_id', $lotteryTypes->pluck('value'))
|
||||
->groupBy('ledger_item_type_id')
|
||||
->get()
|
||||
->keyBy('ledger_item_type_id');
|
||||
|
||||
return $lotteryTypes->map(function ($lotteryType) use ($statistics) {
|
||||
$statistic = $statistics->get($lotteryType->value);
|
||||
return [
|
||||
'name' => $lotteryType->name,
|
||||
'sales' => trim_zeros($statistic->sales ?? '0.00'),
|
||||
'expenditure' => trim_zeros($statistic->expenditure ?? '0.00'),
|
||||
];
|
||||
})->all();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
namespace App\Admin\Filters;
|
||||
|
||||
use EloquentFilter\ModelFilter;
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
class LedgerItemFilter extends ModelFilter
|
||||
{
|
||||
public function dateRange($dateRange)
|
||||
{
|
||||
$this->whereBetween('date', explode(',', $dateRange));
|
||||
}
|
||||
|
||||
public function region($region)
|
||||
{
|
||||
if ($this->input('store_id') !== null || ! 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));
|
||||
});
|
||||
}
|
||||
|
||||
public function store($id)
|
||||
{
|
||||
$this->where('store_id', $id);
|
||||
}
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
namespace App\Admin\Filters;
|
||||
|
||||
use EloquentFilter\ModelFilter;
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
class StoreFilter extends ModelFilter
|
||||
{
|
||||
|
|
@ -30,4 +31,19 @@ class StoreFilter extends ModelFilter
|
|||
{
|
||||
$this->where('business_status', $key);
|
||||
}
|
||||
|
||||
public function region($region)
|
||||
{
|
||||
if (! is_array($region)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($provinceCode = Arr::get($region, 'provinceCode')) {
|
||||
$this->where('region->provinceCode', $provinceCode);
|
||||
}
|
||||
|
||||
if ($cityCode = Arr::get($region, 'cityCode')) {
|
||||
$this->where('region->cityCode', $cityCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
use App\Admin\Controllers\BaseKeywordController;
|
||||
use App\Admin\Controllers\Finance\LedgerController;
|
||||
use App\Admin\Controllers\Finance\SalesStatisticController;
|
||||
use App\Admin\Controllers\Hr\EmployeeController;
|
||||
use App\Admin\Controllers\Hr\RestController;
|
||||
use App\Admin\Controllers\Hr\SignController;
|
||||
|
|
@ -85,6 +86,8 @@ Route::group([
|
|||
// 上报数据
|
||||
$router->resource('ledgers', LedgerController::class);
|
||||
$router->post('ledgers/{ledger}/approval', [LedgerController::class, 'approval'])->name('ledgers.approval');
|
||||
// 销售统计
|
||||
$router->get('sales-statistics', [SalesStatisticController::class, 'index'])->name('sales_statistics.index');
|
||||
});
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ namespace App\Models;
|
|||
|
||||
use App\Traits\HasDateTimeFormatter;
|
||||
use EloquentFilter\Filterable;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
|
@ -36,4 +37,9 @@ class LedgerItem extends Model
|
|||
{
|
||||
return $this->belongsTo(Keyword::class, 'ledger_item_type_id', 'key');
|
||||
}
|
||||
|
||||
public function store(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Store::class);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
if (! function_exists('trim_zeros')) {
|
||||
/**
|
||||
* 移除数字字符串中的前导零和尾随零
|
||||
*/
|
||||
function trim_zeros(string $var): string
|
||||
{
|
||||
if (! is_numeric($var)) {
|
||||
return $var;
|
||||
}
|
||||
|
||||
$var = ltrim($var, '0');
|
||||
|
||||
$pos = strpos($var, '.');
|
||||
if ($pos !== false) {
|
||||
if ($pos === 0) {
|
||||
$var = "0".$var;
|
||||
}
|
||||
$var = rtrim(rtrim($var, '0'), '.');
|
||||
}
|
||||
|
||||
return $var === '' ? '0' : $var;
|
||||
}
|
||||
}
|
||||
|
|
@ -28,7 +28,10 @@
|
|||
"App\\": "app/",
|
||||
"Database\\Factories\\": "database/factories/",
|
||||
"Database\\Seeders\\": "database/seeders/"
|
||||
}
|
||||
},
|
||||
"files": [
|
||||
"./bootstrap/helpers.php"
|
||||
]
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
|
|
|
|||
|
|
@ -142,6 +142,15 @@ class AdminPermissionSeeder extends Seeder
|
|||
'resource' => ['list', 'update', 'view'],
|
||||
'children' => [],
|
||||
],
|
||||
'sales_statistics' => [
|
||||
'name' => '销售统计',
|
||||
'icon' => 'ri:bar-chart-2-line',
|
||||
'uri' => '/finance/sales-statistics',
|
||||
'resource' => false,
|
||||
'children' => [
|
||||
'index' => '销售统计',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue