generated from liutk/owl-admin-base
Merge branch 'main' of https://gitea.hmily.club/pdkj/store-manage into main
commit
a5a33ccf2a
|
|
@ -5,8 +5,8 @@ namespace App\Admin\Controllers\Finance;
|
|||
use App\Admin\Controllers\AdminController;
|
||||
use App\Admin\Filters\LedgerFilter;
|
||||
use App\Models\Ledger;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Slowlyo\OwlAdmin\Admin;
|
||||
|
||||
/**
|
||||
* @property mixed $name
|
||||
|
|
@ -17,16 +17,21 @@ class CommissionIncomeController extends AdminController
|
|||
{
|
||||
if ($this->actionOfGetData()) {
|
||||
return $this->response()->success([
|
||||
'items' => [$this->getCommissionIncomeStatistics(request())],
|
||||
'items' => [$this->getCommissionIncomeStatistics()],
|
||||
]);
|
||||
}
|
||||
|
||||
if ($this->actionOfExport()) {
|
||||
return $this->export();
|
||||
}
|
||||
|
||||
return $this->response()->success(
|
||||
$this->baseList(
|
||||
$this->baseCRUD()
|
||||
->headerToolbar([
|
||||
amis('filter-toggler')->align('right'),
|
||||
])
|
||||
->headerToolbar(
|
||||
collect($this->baseHeaderToolBar())
|
||||
->when(Admin::user()->can('admin.finance.commission_incomes.export'), fn ($collection) => $collection->push($this->exportAction(true)))
|
||||
)
|
||||
->footerToolbar([])
|
||||
->bulkActions([])
|
||||
->filter($this->baseFilter()->body([
|
||||
|
|
@ -57,7 +62,7 @@ class CommissionIncomeController extends AdminController
|
|||
);
|
||||
}
|
||||
|
||||
protected function getCommissionIncomeStatistics(Request $request): array
|
||||
protected function getCommissionIncomeStatistics(): array
|
||||
{
|
||||
$aggregate = Ledger::select([
|
||||
DB::raw('SUM(expenditure) as expenditure'),
|
||||
|
|
@ -66,7 +71,7 @@ class CommissionIncomeController extends AdminController
|
|||
DB::raw('SUM(expected_income) as expected_income'),
|
||||
DB::raw('SUM(actual_income) as actual_income'),
|
||||
])
|
||||
->filter($request->input(), LedgerFilter::class)
|
||||
->filter(request()->input(), LedgerFilter::class)
|
||||
->first();
|
||||
|
||||
$expectedCommission = $aggregate->expected_commission ?? '0';
|
||||
|
|
@ -83,4 +88,69 @@ class CommissionIncomeController extends AdminController
|
|||
'diff_income' => trim_zeros(bcsub($actualIncome, $expectedIncome, 2)),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出按钮
|
||||
*
|
||||
* @param bool $disableSelectedItem
|
||||
*
|
||||
* @return \Slowlyo\OwlAdmin\Renderers\Service
|
||||
*/
|
||||
protected function exportAction($disableSelectedItem = false)
|
||||
{
|
||||
// 下载路径
|
||||
$downloadPath = admin_url('_download_export', true);
|
||||
// 导出接口地址
|
||||
$exportPath = $this->getExportPath();
|
||||
// 按钮点击事件
|
||||
$event = fn($script) => ['click' => ['actions' => [['actionType' => 'custom', 'script' => $script]]]];
|
||||
// 导出处理动作
|
||||
$doAction = "doAction([{actionType:'setValue',componentId:'export-action',args:{value:{showExportLoading:true}}},{actionType:'ajax',args:{api:{url:url.toString(),method:'get'}}},{actionType:'setValue',componentId:'export-action',args:{value:{showExportLoading:false}}},{actionType:'custom',expression:'\${event.data.responseResult.responseStatus===0}',script:'window.open(\'{$downloadPath}?path=\'+event.data.responseResult.responseData.path)'}])";
|
||||
// 按钮
|
||||
$button = amis()->Button()
|
||||
->label(__('admin.export.title'))
|
||||
->icon('fa-solid fa-download')
|
||||
->onEvent(
|
||||
$event("let data=event.data;let params=Object.keys(data).filter(key=>key!=='page' && key!=='__super').reduce((obj,key)=>{obj[key]=data[key];return obj;},{});let url=new URL('{$exportPath}',window.location.origin);Object.keys(params).forEach(key=>url.searchParams.append(key,params[key]));{$doAction}")
|
||||
);
|
||||
|
||||
return amis()->Service()
|
||||
->id('export-action')
|
||||
->set('align', 'right')
|
||||
->set('data', ['showExportLoading' => false])
|
||||
->body(
|
||||
amis()->Spinner()->set('showOn', '${showExportLoading}')->overlay()->body($button)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出
|
||||
*
|
||||
* @return JsonResponse|JsonResource
|
||||
*/
|
||||
protected function export()
|
||||
{
|
||||
admin_abort_if(!class_exists('\Rap2hpoutre\FastExcel\FastExcel'), __('admin.export.please_install_laravel_excel'));
|
||||
|
||||
// 默认在 storage/app/ 下
|
||||
$path = sprintf('佣金收入-%s.xlsx', date('YmdHis'));
|
||||
|
||||
$data = [$this->getCommissionIncomeStatistics()];
|
||||
|
||||
try {
|
||||
fastexcel($data)->export(storage_path('app/' . $path), fn($row) => [
|
||||
'预期佣金' => $row['expected_commission'],
|
||||
'实际佣金' => $row['actual_commission'],
|
||||
'佣金差异' => $row['diff_commission'],
|
||||
'预期收益' => $row['expected_income'],
|
||||
'实际收益' => $row['actual_income'],
|
||||
'收益差异' => $row['diff_income'],
|
||||
]);
|
||||
} catch (\Throwable $e) {
|
||||
report($e);
|
||||
admin_abort(__('admin.action_failed'));
|
||||
}
|
||||
|
||||
return $this->response()->success(compact('path'));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ use App\Enums\CheckStatus;
|
|||
use App\Models\Ledger;
|
||||
use App\Traits\HasCheckActions;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Slowlyo\OwlAdmin\Admin;
|
||||
use Slowlyo\OwlAdmin\Renderers\DrawerAction;
|
||||
|
|
@ -56,9 +57,10 @@ class LedgerController extends AdminController
|
|||
public function list(): Page
|
||||
{
|
||||
$crud = $this->baseCRUD()
|
||||
->headerToolbar([
|
||||
...$this->baseHeaderToolBar(),
|
||||
])
|
||||
->headerToolbar(
|
||||
collect($this->baseHeaderToolBar())
|
||||
->when(Admin::user()->can('admin.finance.ledgers.export'), fn ($collection) => $collection->push($this->exportAction(true)))
|
||||
)
|
||||
->bulkActions([])
|
||||
->filter($this->baseFilter()->body([
|
||||
amis()->GroupControl()->mode('horizontal')->body([
|
||||
|
|
@ -220,4 +222,29 @@ class LedgerController extends AdminController
|
|||
])->size('lg')
|
||||
);
|
||||
}
|
||||
|
||||
protected function exportFileName()
|
||||
{
|
||||
return '上报数据';
|
||||
}
|
||||
|
||||
protected function exportMap($row)
|
||||
{
|
||||
return [
|
||||
__('finance.ledger.date') => $row['date'],
|
||||
__('finance.ledger.store') => Arr::get($row, 'store.title'),
|
||||
__('finance.ledger.sales') => $row['sales'],
|
||||
__('finance.ledger.expenditure') => $row['expenditure'],
|
||||
__('finance.ledger.new_customers') => $row['new_customers'],
|
||||
__('finance.ledger.handover_amount') => $row['handover_amount'],
|
||||
__('finance.ledger.ledger_amount') => $row['ledger_amount'],
|
||||
__('finance.ledger.ledger_difference') => $row['ledger_difference'],
|
||||
__('finance.ledger.expected_commission') => $row['expected_commission'],
|
||||
__('finance.ledger.actual_commission') => $row['actual_commission'],
|
||||
__('finance.ledger.expected_income') => $row['expected_income'],
|
||||
__('finance.ledger.actual_income') => $row['actual_income'],
|
||||
__('workflow_log.check_status') => CheckStatus::tryFrom(Arr::get($row, 'workflow.check_status'))?->text(),
|
||||
__('finance.ledger.created_at') => $row['created_at'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,9 +23,10 @@ class ReimbursementController extends AdminController
|
|||
public function list(): Page
|
||||
{
|
||||
$crud = $this->baseCRUD()
|
||||
->headerToolbar([
|
||||
...$this->baseHeaderToolBar(),
|
||||
])
|
||||
->headerToolbar(
|
||||
collect($this->baseHeaderToolBar())
|
||||
->when(Admin::user()->can('admin.finance.reimbursements.export'), fn ($collection) => $collection->push($this->exportAction(true)))
|
||||
)
|
||||
->bulkActions([])
|
||||
->filter($this->baseFilter()->body([
|
||||
amis()->GroupControl()->mode('horizontal')->body([
|
||||
|
|
@ -94,4 +95,21 @@ class ReimbursementController extends AdminController
|
|||
$this->baseWorkflowLogList($detailId)->id($serviceId),
|
||||
]);
|
||||
}
|
||||
|
||||
protected function exportFileName()
|
||||
{
|
||||
return '收支报销';
|
||||
}
|
||||
|
||||
protected function exportMap($row)
|
||||
{
|
||||
return [
|
||||
__('finance.reimbursement.employee') => Arr::get($row, 'employee.name'),
|
||||
__('finance.reimbursement.expense') => $row['expense'],
|
||||
__('finance.reimbursement.reason') => $row['reason'],
|
||||
__('finance.reimbursement.type') => Arr::get($row, 'type.name'),
|
||||
__('workflow_log.check_status') => CheckStatus::tryFrom(Arr::get($row, 'workflow.check_status'))?->text(),
|
||||
__('finance.reimbursement.created_at') => $row['created_at'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@ 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;
|
||||
use Slowlyo\OwlAdmin\Admin;
|
||||
|
||||
/**
|
||||
* @property mixed $name
|
||||
|
|
@ -18,16 +18,21 @@ class SalesStatisticController extends AdminController
|
|||
{
|
||||
if ($this->actionOfGetData()) {
|
||||
return $this->response()->success([
|
||||
'items' => $this->getLotteryTypeStatistics(request()),
|
||||
'items' => $this->getLotteryTypeStatistics(),
|
||||
]);
|
||||
}
|
||||
|
||||
if ($this->actionOfExport()) {
|
||||
return $this->export();
|
||||
}
|
||||
|
||||
return $this->response()->success(
|
||||
$this->baseList(
|
||||
$this->baseCRUD()
|
||||
->headerToolbar([
|
||||
amis('filter-toggler')->align('right'),
|
||||
])
|
||||
->headerToolbar(
|
||||
collect($this->baseHeaderToolBar())
|
||||
->when(Admin::user()->can('admin.finance.sales_statistics.export'), fn ($collection) => $collection->push($this->exportAction(true)))
|
||||
)
|
||||
->footerToolbar([])
|
||||
->bulkActions([])
|
||||
->filter($this->baseFilter()->body([
|
||||
|
|
@ -53,14 +58,14 @@ class SalesStatisticController extends AdminController
|
|||
])
|
||||
->affixRow([
|
||||
['type' => 'text', 'text' => '合计'],
|
||||
['type' => 'tpl', 'text' => '${items|filter:is_plus:isTrue|pick:sales|sum}'],
|
||||
['type' => 'tpl', 'text' => '${items|filter:is_plus:isTrue|pick:expenditure|sum}'],
|
||||
['type' => 'tpl', 'text' => '${items|pick:real_sales|sum}'],
|
||||
['type' => 'tpl', 'text' => '${items|pick:real_expenditure|sum}'],
|
||||
])
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
protected function getLotteryTypeStatistics(Request $request): array
|
||||
protected function getLotteryTypeStatistics(): array
|
||||
{
|
||||
/** @var \Illuminate\Database\Eloquent\Collection */
|
||||
$lotteryTypes = Keyword::where('parent_key', 'lottery_type')->get();
|
||||
|
|
@ -71,7 +76,7 @@ class SalesStatisticController extends AdminController
|
|||
DB::raw('SUM(sales) as sales'),
|
||||
DB::raw('SUM(expenditure) as expenditure'),
|
||||
])
|
||||
->filter($request->input(), LedgerItemFilter::class)
|
||||
->filter(request()->input(), LedgerItemFilter::class)
|
||||
->whereIn('ledger_item_type_id', $lotteryTypes->pluck('key'))
|
||||
->groupBy('ledger_item_type_id')
|
||||
->get()
|
||||
|
|
@ -84,8 +89,78 @@ class SalesStatisticController extends AdminController
|
|||
'name' => $lotteryType->name,
|
||||
'sales' => trim_zeros($statistic->sales ?? '0.00'),
|
||||
'expenditure' => trim_zeros($statistic->expenditure ?? '0.00'),
|
||||
'is_plus' => $lotteryType->value !== '-',
|
||||
'real_sales' => match($lotteryType->value) {
|
||||
'+' => $statistic->sales ?? '0.00',
|
||||
'-' => -($statistic->sales ?? '0.00'),
|
||||
default => 0,
|
||||
},
|
||||
'real_expenditure' => match($lotteryType->value) {
|
||||
'+' => $statistic->expenditure ?? '0.00',
|
||||
'-' => -($statistic->expenditure ?? '0.00'),
|
||||
default => 0,
|
||||
},
|
||||
];
|
||||
})->all();
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出按钮
|
||||
*
|
||||
* @param bool $disableSelectedItem
|
||||
*
|
||||
* @return \Slowlyo\OwlAdmin\Renderers\Service
|
||||
*/
|
||||
protected function exportAction($disableSelectedItem = false)
|
||||
{
|
||||
// 下载路径
|
||||
$downloadPath = admin_url('_download_export', true);
|
||||
// 导出接口地址
|
||||
$exportPath = $this->getExportPath();
|
||||
// 按钮点击事件
|
||||
$event = fn($script) => ['click' => ['actions' => [['actionType' => 'custom', 'script' => $script]]]];
|
||||
// 导出处理动作
|
||||
$doAction = "doAction([{actionType:'setValue',componentId:'export-action',args:{value:{showExportLoading:true}}},{actionType:'ajax',args:{api:{url:url.toString(),method:'get'}}},{actionType:'setValue',componentId:'export-action',args:{value:{showExportLoading:false}}},{actionType:'custom',expression:'\${event.data.responseResult.responseStatus===0}',script:'window.open(\'{$downloadPath}?path=\'+event.data.responseResult.responseData.path)'}])";
|
||||
// 按钮
|
||||
$button = amis()->Button()
|
||||
->label(__('admin.export.title'))
|
||||
->icon('fa-solid fa-download')
|
||||
->onEvent(
|
||||
$event("let data=event.data;let params=Object.keys(data).filter(key=>key!=='page' && key!=='__super').reduce((obj,key)=>{obj[key]=data[key];return obj;},{});let url=new URL('{$exportPath}',window.location.origin);Object.keys(params).forEach(key=>url.searchParams.append(key,params[key]));{$doAction}")
|
||||
);
|
||||
|
||||
return amis()->Service()
|
||||
->id('export-action')
|
||||
->set('align', 'right')
|
||||
->set('data', ['showExportLoading' => false])
|
||||
->body(
|
||||
amis()->Spinner()->set('showOn', '${showExportLoading}')->overlay()->body($button)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出
|
||||
*
|
||||
* @return JsonResponse|JsonResource
|
||||
*/
|
||||
protected function export()
|
||||
{
|
||||
admin_abort_if(!class_exists('\Rap2hpoutre\FastExcel\FastExcel'), __('admin.export.please_install_laravel_excel'));
|
||||
|
||||
// 默认在 storage/app/ 下
|
||||
$path = sprintf('销售统计-%s.xlsx', date('YmdHis'));
|
||||
|
||||
$data = $this->getLotteryTypeStatistics();
|
||||
|
||||
try {
|
||||
fastexcel($data)->export(storage_path('app/' . $path), fn($row) => [
|
||||
'彩种' => $row['name'],
|
||||
'销量' => $row['sales'],
|
||||
'兑奖' => $row['expenditure'],
|
||||
]);
|
||||
} catch (\Throwable $e) {
|
||||
admin_abort(__('admin.action_failed'));
|
||||
}
|
||||
|
||||
return $this->response()->success(compact('path'));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,11 +23,11 @@ class StoreMasterCommissionController extends AdminController
|
|||
public function list(): Page
|
||||
{
|
||||
$crud = $this->baseCRUD()
|
||||
->headerToolbar([
|
||||
$this->createTypeButton('drawer', 'lg')
|
||||
->visible(Admin::user()->can('admin.finance.store_master_commissions.create')),
|
||||
...$this->baseHeaderToolBar(),
|
||||
])
|
||||
->headerToolbar(
|
||||
collect($this->baseHeaderToolBar())
|
||||
->when(Admin::user()->can('admin.finance.store_master_commissions.create'), fn ($collection) => $collection->push($this->createTypeButton('drawer', 'lg')))
|
||||
->when(Admin::user()->can('admin.finance.store_master_commissions.export'), fn ($collection) => $collection->push($this->exportAction(true)))
|
||||
)
|
||||
->bulkActions([])
|
||||
->filter($this->baseFilter()->body([
|
||||
amis()->GroupControl()->mode('horizontal')->body([
|
||||
|
|
@ -66,7 +66,6 @@ class StoreMasterCommissionController extends AdminController
|
|||
->method('post')
|
||||
->data(['id' => '${workflow.id}'])
|
||||
),
|
||||
// $this->cancelAction(),
|
||||
$this->rowEditTypeButton('drawer', 'lg')
|
||||
->visible(Admin::user()->can('admin.finance.store_master_commissions.update'))
|
||||
->visibleOn('${OR(workflow.check_status == '.CheckStatus::None->value.', workflow.check_status == '.CheckStatus::Cancel->value.', workflow.check_status == '.CheckStatus::Fail->value.')}'),
|
||||
|
|
@ -157,4 +156,25 @@ class StoreMasterCommissionController extends AdminController
|
|||
$this->baseWorkflowLogList($detailId)->id($serviceId),
|
||||
]);
|
||||
}
|
||||
|
||||
protected function exportFileName()
|
||||
{
|
||||
return '店长提成';
|
||||
}
|
||||
|
||||
protected function exportMap($row)
|
||||
{
|
||||
return [
|
||||
__('finance.store_master_commission.id') => $row['id'],
|
||||
__('finance.store_master_commission.month') => $row['month'],
|
||||
__('finance.store_master_commission.store') => Arr::get($row, 'store.title'),
|
||||
__('finance.store_master_commission.store_master') => Arr::get($row, 'master.name'),
|
||||
__('finance.store_master_commission.commission') => $row['commission'],
|
||||
__('finance.store_master_commission.daily_expenses') => $row['daily_expenses'],
|
||||
__('finance.store_master_commission.employee_expenses') => $row['employee_expenses'],
|
||||
__('finance.store_master_commission.other_expenses') => $row['other_expenses'],
|
||||
__('workflow_log.check_status') => CheckStatus::tryFrom(Arr::get($row, 'workflow.check_status'))?->text(),
|
||||
__('finance.store_master_commission.created_at') => $row['created_at'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,40 +5,43 @@ namespace App\Admin\Controllers\Finance;
|
|||
use App\Admin\Controllers\AdminController;
|
||||
use App\Services\StatisticService;
|
||||
use Illuminate\Support\Arr;
|
||||
use Slowlyo\OwlAdmin\Admin;
|
||||
|
||||
class StoreStatisticController extends AdminController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if ($this->actionOfGetData()) {
|
||||
$input = Arr::except(request()->input(), ['orderBy', 'orderDir']);
|
||||
|
||||
$orderBy = request()->input('orderBy') ?: 'sales';
|
||||
$orderDir = request()->input('orderDir') ?: 'desc';
|
||||
|
||||
$input['sort'] = ($orderDir === 'desc' ? '-' : '').$orderBy;
|
||||
|
||||
return $this->response()->success([
|
||||
'items' => (new StatisticService())->storeRanking($input),
|
||||
'items' => $this->getStoreRanking(),
|
||||
]);
|
||||
}
|
||||
|
||||
if ($this->actionOfExport()) {
|
||||
return $this->export();
|
||||
}
|
||||
|
||||
return $this->response()->success(
|
||||
$this->baseList(
|
||||
$this->baseCRUD()
|
||||
->headerToolbar([
|
||||
amis('filter-toggler')->align('right'),
|
||||
])
|
||||
->headerToolbar(
|
||||
collect($this->baseHeaderToolBar())
|
||||
->when(Admin::user()->can('admin.finance.store_statistics.export'), fn ($collection) => $collection->push($this->exportAction(true)))
|
||||
)
|
||||
->footerToolbar([])
|
||||
->bulkActions([])
|
||||
->filter($this->baseFilter()->body([
|
||||
amis()->GroupControl()->mode('horizontal')->body([
|
||||
amis()->DateRangeControl('date_range', '日期')
|
||||
->valueFormat('YYYY-MM-DD')
|
||||
->columnRatio(6),
|
||||
->valueFormat('YYYY-MM-DD'),
|
||||
amis()->InputCityControl('region', '区域')
|
||||
->allowDistrict(false)
|
||||
->extractValue(false),
|
||||
amis()->SelectControl('store_id', __('finance.ledger.store'))
|
||||
->source(admin_url('api/stores?region=${region}'))
|
||||
->labelField('title')
|
||||
->valueField('id')
|
||||
->clearable(),
|
||||
]),
|
||||
]))
|
||||
->filterDefaultVisible()
|
||||
|
|
@ -51,4 +54,81 @@ class StoreStatisticController extends AdminController
|
|||
)
|
||||
);
|
||||
}
|
||||
|
||||
protected function getStoreRanking(): array
|
||||
{
|
||||
$input = Arr::except(request()->input(), ['orderBy', 'orderDir']);
|
||||
|
||||
$orderBy = request()->input('orderBy') ?: 'sales';
|
||||
$orderDir = request()->input('orderDir') ?: 'desc';
|
||||
|
||||
$input['sort'] = ($orderDir === 'desc' ? '-' : '').$orderBy;
|
||||
|
||||
return (new StatisticService())->storeRanking($input);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出按钮
|
||||
*
|
||||
* @param bool $disableSelectedItem
|
||||
*
|
||||
* @return \Slowlyo\OwlAdmin\Renderers\Service
|
||||
*/
|
||||
protected function exportAction($disableSelectedItem = false)
|
||||
{
|
||||
// 下载路径
|
||||
$downloadPath = admin_url('_download_export', true);
|
||||
// 导出接口地址
|
||||
$exportPath = $this->getExportPath();
|
||||
// 按钮点击事件
|
||||
$event = fn($script) => ['click' => ['actions' => [['actionType' => 'custom', 'script' => $script]]]];
|
||||
// 导出处理动作
|
||||
$doAction = "doAction([{actionType:'setValue',componentId:'export-action',args:{value:{showExportLoading:true}}},{actionType:'ajax',args:{api:{url:url.toString(),method:'get'}}},{actionType:'setValue',componentId:'export-action',args:{value:{showExportLoading:false}}},{actionType:'custom',expression:'\${event.data.responseResult.responseStatus===0}',script:'window.open(\'{$downloadPath}?path=\'+event.data.responseResult.responseData.path)'}])";
|
||||
// 按钮
|
||||
$button = amis()->Button()
|
||||
->label(__('admin.export.title'))
|
||||
->icon('fa-solid fa-download')
|
||||
->onEvent(
|
||||
$event("let data=event.data;let params=Object.keys(data).filter(key=>key!=='page' && key!=='__super').reduce((obj,key)=>{obj[key]=data[key];return obj;},{});let url=new URL('{$exportPath}',window.location.origin);Object.keys(params).forEach(key=>url.searchParams.append(key,params[key]));{$doAction}")
|
||||
);
|
||||
|
||||
return amis()->Service()
|
||||
->id('export-action')
|
||||
->set('align', 'right')
|
||||
->set('data', ['showExportLoading' => false])
|
||||
->body(
|
||||
amis()->Spinner()->set('showOn', '${showExportLoading}')->overlay()->body($button)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出
|
||||
*
|
||||
* @return JsonResponse|JsonResource
|
||||
*/
|
||||
protected function export()
|
||||
{
|
||||
admin_abort_if(!class_exists('\Rap2hpoutre\FastExcel\FastExcel'), __('admin.export.please_install_laravel_excel'));
|
||||
|
||||
// 默认在 storage/app/ 下
|
||||
$path = sprintf('门店统计-%s.xlsx', date('YmdHis'));
|
||||
|
||||
$data = $this->getStoreRanking();
|
||||
|
||||
try {
|
||||
fastexcel($data)->export(storage_path('app/' . $path), function($row) {
|
||||
return [
|
||||
'排序' => $row['ranking'],
|
||||
'门店' => Arr::get($row, 'store.title'),
|
||||
'收入' => $row['sales'],
|
||||
'支出' => $row['expenditure'],
|
||||
];
|
||||
});
|
||||
} catch (\Throwable $e) {
|
||||
report($e);
|
||||
admin_abort(__('admin.action_failed'));
|
||||
}
|
||||
|
||||
return $this->response()->success(compact('path'));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ class LedgerController extends Controller
|
|||
'name' => $lotteryType->name,
|
||||
'sales' => $ledgerItem?->sales,
|
||||
'expenditure' => $ledgerItem?->expenditure,
|
||||
'operator' => (string) $lotteryType->value === '-' ? '-' : '+',
|
||||
'operator' => (string) $lotteryType->value,
|
||||
];
|
||||
})->all();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -192,6 +192,7 @@ class StatisticService
|
|||
->groupBy('store_id');
|
||||
|
||||
$stores = Store::filter($input, StoreFilter::class)
|
||||
->selectRaw('stores.*,IFNULL(store_ledgers.sales, 0) as sales,IFNULL(store_ledgers.expenditure, 0) as expenditure')
|
||||
->leftJoinSub($storeLedgers, 'store_ledgers', fn ($join) => $join->on('stores.id', '=', 'store_ledgers.store_id'))
|
||||
->when($input['sort'] ?? '', function ($query, $sort) {
|
||||
foreach (explode(',', $sort) as $sort) {
|
||||
|
|
|
|||
|
|
@ -292,6 +292,7 @@ class AdminPermissionSeeder extends Seeder
|
|||
'uri' => '/finance/ledgers',
|
||||
'resource' => ['list', 'update', 'view'],
|
||||
'children' => [
|
||||
'export' => '导出',
|
||||
'update_ledger_amount' => '编辑总账金额',
|
||||
],
|
||||
],
|
||||
|
|
@ -302,6 +303,7 @@ class AdminPermissionSeeder extends Seeder
|
|||
'resource' => false,
|
||||
'children' => [
|
||||
'index' => '佣金收入',
|
||||
'export' => '导出',
|
||||
],
|
||||
],
|
||||
'reimbursements' => [
|
||||
|
|
@ -309,7 +311,9 @@ class AdminPermissionSeeder extends Seeder
|
|||
'icon' => 'ri:money-cny-circle-fill',
|
||||
'uri' => '/finance/reimbursements',
|
||||
'resource' => ['list', 'view'],
|
||||
'children' => [],
|
||||
'children' => [
|
||||
'export' => '导出',
|
||||
],
|
||||
],
|
||||
'sales_statistics' => [
|
||||
'name' => '销售统计',
|
||||
|
|
@ -318,6 +322,7 @@ class AdminPermissionSeeder extends Seeder
|
|||
'resource' => false,
|
||||
'children' => [
|
||||
'index' => '销售统计',
|
||||
'export' => '导出',
|
||||
],
|
||||
],
|
||||
'store_statistics' => [
|
||||
|
|
@ -327,6 +332,7 @@ class AdminPermissionSeeder extends Seeder
|
|||
'resource' => false,
|
||||
'children' => [
|
||||
'index' => '门店统计',
|
||||
'export' => '导出',
|
||||
],
|
||||
],
|
||||
'store_master_commissions' => [
|
||||
|
|
@ -334,7 +340,9 @@ class AdminPermissionSeeder extends Seeder
|
|||
'icon' => 'icon-park-outline:paper-money',
|
||||
'uri' => '/finance/store-master-commissions',
|
||||
'resource' => true,
|
||||
'children' => [],
|
||||
'children' => [
|
||||
'export' => '导出',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
|
|
|||
|
|
@ -63,19 +63,19 @@ class KeywordSeeder extends Seeder
|
|||
'key' => 'lottery_type',
|
||||
'name' => '彩种类型',
|
||||
'children' => [
|
||||
'七星彩',
|
||||
'排列三',
|
||||
'排列五',
|
||||
'大乐透',
|
||||
'传统足彩',
|
||||
'竞彩',
|
||||
'顶呱刮',
|
||||
'福彩',
|
||||
'合买',
|
||||
'电彩分票+',
|
||||
'即开分票+',
|
||||
['name' => '电彩分票-', 'value' => '-'],
|
||||
['name' => '即开分票-', 'value' => '-'],
|
||||
['name' => '七星彩', 'value' => '+'],
|
||||
['name' => '排列三', 'value' => '+'],
|
||||
['name' => '排列五', 'value' => '+'],
|
||||
['name' => '大乐透', 'value' => '+'],
|
||||
['name' => '传统足彩', 'value' => '+'],
|
||||
['name' => '竞彩', 'value' => '+'],
|
||||
['name' => '顶呱刮', 'value' => '+'],
|
||||
['name' => '福彩', 'value' => '+'],
|
||||
['name' => '合买', 'value' => '+'],
|
||||
['name' => '电彩分票+', 'value' => ''],
|
||||
['name' => '即开分票+', 'value' => ''],
|
||||
['name' => '电彩分票-', 'value' => ''],
|
||||
['name' => '即开分票-', 'value' => ''],
|
||||
],
|
||||
],
|
||||
[
|
||||
|
|
|
|||
Loading…
Reference in New Issue