销售统计

main
Jing Li 2024-03-29 11:20:52 +08:00
parent 8f7cd01505
commit aede82735a
8 changed files with 189 additions and 1 deletions

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}
}

View File

@ -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');
});
/*

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -28,7 +28,10 @@
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
"files": [
"./bootstrap/helpers.php"
]
},
"autoload-dev": {
"psr-4": {

View File

@ -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' => '销售统计',
],
],
],
],