title('手续费统计') ->description('查看Transfer模块手续费统计数据') ->body($this->grid()); } /** * 详情页面 */ #[Get('transfer/fee-statistics/{id}', name: 'admin.transfer.fee-statistics.show')] public function show($id, Content $content) { return $content ->title('手续费统计详情') ->description('查看详细统计信息') ->body($this->detail($id)); } /** * 统计概览页面 */ #[Get('transfer/fee-statistics/overview', name: 'admin.transfer.fee-statistics.overview')] public function overview(Content $content) { return $content ->title('手续费统计概览') ->description('查看手续费统计概览和趋势') ->body($this->overviewCards()) ->body($this->trendChart()); } /** * 手动执行统计 */ #[Post('transfer/fee-statistics/run', name: 'admin.transfer.fee-statistics.run')] public function runStatistics(Request $request) { try { $date = $request->input('date', Carbon::yesterday()->format('Y-m-d')); $rerun = $request->boolean('rerun', false); if ($rerun) { $result = FeeStatisticsService::restatistics($date); } else { $result = FeeStatisticsService::runDailyStatistics($date); } return response()->json([ 'status' => true, 'message' => '统计执行成功', 'data' => $result ]); } catch (\Exception $e) { return response()->json([ 'status' => false, 'message' => '统计执行失败: ' . $e->getMessage() ]); } } /** * 数据验证 */ #[Post('transfer/fee-statistics/validate', name: 'admin.transfer.fee-statistics.validate')] public function validateStatistics(Request $request) { try { $date = $request->input('date', Carbon::yesterday()->format('Y-m-d')); $result = FeeStatisticsService::validateStatistics($date); return response()->json([ 'status' => true, 'message' => $result['valid'] ? '数据验证通过' : '数据验证失败', 'data' => $result ]); } catch (\Exception $e) { return response()->json([ 'status' => false, 'message' => '数据验证失败: ' . $e->getMessage() ]); } } /** * 创建数据表格 */ protected function grid(): Grid { return Grid::make($this->model::with('transferApp'), function (Grid $grid) { $grid->column('id', 'ID')->sortable(); $grid->column('stat_date', '统计日期')->display(function ($value) { return Carbon::parse($value)->format('Y-m-d'); })->sortable(); $grid->column('transferApp.title', '应用名称'); $grid->column('total_order_count', '总订单数')->sortable(); $grid->column('total_amount', '总交易金额')->display(function ($value) { return number_format($value, 4); })->sortable(); $grid->column('total_fee_amount', '总手续费')->display(function ($value) { return number_format($value, 4); })->sortable(); $grid->column('avg_fee_rate', '平均费率')->display(function ($value) { return number_format($value * 100, 2) . '%'; }); $grid->column('in_order_count', '转入订单数'); $grid->column('in_fee_amount', '转入手续费')->display(function ($value) { return number_format($value, 4); }); $grid->column('out_order_count', '转出订单数'); $grid->column('out_fee_amount', '转出手续费')->display(function ($value) { return number_format($value, 4); }); $grid->column('last_processed_order_id', '最后处理订单ID'); $grid->column('created_at', '创建时间')->sortable(); // 筛选器 $grid->filter(function (Grid\Filter $filter) { $filter->equal('transfer_app_id', '应用')->select( \App\Module\Transfer\Models\TransferApp::pluck('title', 'id') ); $filter->date('stat_date', '统计日期'); $filter->between('total_fee_amount', '手续费金额'); }); // 默认排序 $grid->model()->orderBy('stat_date', 'desc'); // 禁用创建、编辑、删除按钮 $grid->disableCreateButton(); $grid->disableActions(); // 添加工具栏按钮 $grid->tools(function (Grid\Tools $tools) { $tools->append('统计概览'); }); }); } /** * 创建详情显示 */ protected function detail($id): Show { return Show::make($id, $this->model::with('transferApp'), function (Show $show) { $show->field('id', 'ID'); $show->field('stat_date', '统计日期'); $show->field('transferApp.title', '应用名称'); $show->field('transferApp.keyname', '应用标识'); $show->divider('订单统计'); $show->field('total_order_count', '总订单数'); $show->field('total_amount', '总交易金额')->as(function ($value) { return number_format($value, 4); }); $show->field('total_fee_amount', '总手续费')->as(function ($value) { return number_format($value, 4); }); $show->field('avg_fee_rate', '平均费率')->as(function ($value) { return number_format($value * 100, 2) . '%'; }); $show->divider('转入统计'); $show->field('in_order_count', '转入订单数'); $show->field('in_total_amount', '转入总金额')->as(function ($value) { return number_format($value, 4); }); $show->field('in_fee_amount', '转入手续费')->as(function ($value) { return number_format($value, 4); }); $show->field('in_avg_fee_rate', '转入平均费率')->as(function ($value) { return number_format($value * 100, 2) . '%'; }); $show->divider('转出统计'); $show->field('out_order_count', '转出订单数'); $show->field('out_total_amount', '转出总金额')->as(function ($value) { return number_format($value, 4); }); $show->field('out_fee_amount', '转出手续费')->as(function ($value) { return number_format($value, 4); }); $show->field('out_avg_fee_rate', '转出平均费率')->as(function ($value) { return number_format($value * 100, 2) . '%'; }); $show->divider('处理信息'); $show->field('last_processed_order_id', '最后处理订单ID'); $show->field('created_at', '创建时间'); $show->field('updated_at', '更新时间'); }); } /** * 汇总卡片 */ protected function summaryCards() { // 获取最近7天的统计数据 $recentStats = FeeStatisticsService::getRecentTrend(7); $totalOrders = $recentStats['summary']['total_orders'] ?? 0; $totalFee = $recentStats['summary']['total_fee'] ?? 0; $avgFeeRate = $recentStats['summary']['avg_fee_rate'] ?? 0; return new Card('最近7天统计汇总', [ new Table(['指标', '数值'], [ ['总订单数', number_format($totalOrders)], ['总手续费', number_format((float)$totalFee, 4)], ['平均费率', number_format((float)$avgFeeRate * 100, 2) . '%'], ['统计天数', count($recentStats['data'] ?? [])], ]) ]); } /** * 概览卡片 */ protected function overviewCards() { // 获取应用汇总统计 $appSummary = FeeStatisticsService::getAppSummary(); $cards = []; foreach ($appSummary['data'] as $app) { $cards[] = new Card($app['transfer_app']['title'] ?? '未知应用', [ new Table(['指标', '数值'], [ ['统计天数', $app['stat_days']], ['总订单数', number_format($app['total_orders'])], ['总手续费', number_format($app['total_fee'], 4)], ['平均费率', number_format($app['avg_fee_rate'] * 100, 2) . '%'], ]) ]); } return $cards; } /** * 趋势图表 */ protected function trendChart() { // 这里可以添加图表组件,显示手续费趋势 return new Card('手续费趋势图', '图表功能待实现'); } }