| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- <?php
- namespace App\Module\Transfer\AdminControllers\Metrics;
- use UCore\DcatAdmin\Metrics\Examples\NewUsersDou;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- use App\Module\Transfer\Models\TransferOrder;
- use App\Module\Transfer\Enums\TransferType;
- use App\Module\Transfer\Enums\TransferStatus;
- use Carbon\Carbon;
- /**
- * 每日转入转出统计折线图
- * 显示每日转入和转出的数量和金额趋势
- */
- class DailyTransferChart extends NewUsersDou
- {
- /**
- * 图表默认高度
- *
- * @var int
- */
- protected $chartHeight = 200;
- /**
- * 初始化卡片内容
- */
- protected function init()
- {
- parent::init();
- $this->title('每日转入/转出统计');
- $this->dropdown([
- '7' => '最近 7 天',
- '14' => '最近 14 天',
- '30' => '最近 30 天',
- '90' => '最近 90 天',
- ]);
- }
- /**
- * 处理请求
- *
- * @param Request $request
- * @return mixed|void
- */
- public function handle(Request $request)
- {
- $days = (int)$request->get('option', 7);
- $chartData = $this->getTransferData($days);
-
- // 计算总交易数量作为卡片内容
- $totalTransfers = array_sum($chartData['data']['transfer_in']) + array_sum($chartData['data']['transfer_out']);
-
- // 卡片内容
- $this->withContent(number_format($totalTransfers));
-
- // 图表数据
- $this->withChart($chartData['series'], $chartData['categories']);
- }
- /**
- * 获取转账统计数据
- *
- * @param int $days
- * @return array
- */
- protected function getTransferData(int $days): array
- {
- // 生成日期范围
- $endDate = Carbon::today();
- $startDate = $endDate->copy()->subDays($days - 1);
-
- $dates = [];
- for ($date = $startDate->copy(); $date->lte($endDate); $date->addDay()) {
- $dates[] = $date->format('Y-m-d');
- }
- // 查询转账数据 - 按日期和类型分组统计
- $transferData = DB::table('transfer_orders')
- ->select([
- DB::raw('DATE(created_at) as date'),
- 'type',
- DB::raw('COUNT(*) as count'),
- DB::raw('SUM(amount) as total_amount'),
- DB::raw('SUM(actual_amount) as total_actual_amount')
- ])
- ->where('status', TransferStatus::COMPLETED->value) // 只统计已完成的订单
- ->where('created_at', '>=', $startDate)
- ->where('created_at', '<=', $endDate->endOfDay())
- ->groupBy(['date', 'type'])
- ->orderBy('date')
- ->get()
- ->groupBy(['date', 'type']);
- // 构建图表数据
- $transferInCounts = [];
- $transferOutCounts = [];
- $transferInAmounts = [];
- $transferOutAmounts = [];
-
- foreach ($dates as $date) {
- $dayData = $transferData->get($date, collect());
-
- // 转入数据
- $transferInData = $dayData->get(TransferType::IN->value, collect())->first();
- $transferInCounts[] = $transferInData ? (int)$transferInData->count : 0;
- $transferInAmounts[] = $transferInData ? (float)$transferInData->total_actual_amount : 0;
-
- // 转出数据
- $transferOutData = $dayData->get(TransferType::OUT->value, collect())->first();
- $transferOutCounts[] = $transferOutData ? (int)$transferOutData->count : 0;
- $transferOutAmounts[] = $transferOutData ? (float)$transferOutData->total_actual_amount : 0;
- }
- // 构建多线图表数据
- $series = [
- [
- 'name' => '转入笔数',
- 'data' => $transferInCounts,
- 'color' => '#28a745', // 绿色
- ],
- [
- 'name' => '转出笔数',
- 'data' => $transferOutCounts,
- 'color' => '#dc3545', // 红色
- ],
- [
- 'name' => '转入金额',
- 'data' => $transferInAmounts,
- 'color' => '#17a2b8', // 蓝色
- 'yAxis' => 1, // 使用第二个Y轴
- ],
- [
- 'name' => '转出金额',
- 'data' => $transferOutAmounts,
- 'color' => '#fd7e14', // 橙色
- 'yAxis' => 1, // 使用第二个Y轴
- ],
- ];
- return [
- 'series' => $series,
- 'categories' => $dates,
- 'data' => [
- 'transfer_in' => $transferInCounts,
- 'transfer_out' => $transferOutCounts,
- 'transfer_in_amounts' => $transferInAmounts,
- 'transfer_out_amounts' => $transferOutAmounts,
- ],
- ];
- }
- /**
- * 设置图表数据
- *
- * @param array $series
- * @param array $categories
- * @return $this
- */
- public function withChart(array $series, array $categories = [])
- {
- return $this->chart([
- 'series' => $series,
- 'xaxis' => [
- 'categories' => $categories,
- 'title' => [
- 'text' => '日期'
- ]
- ],
- 'yaxis' => [
- [
- 'title' => [
- 'text' => '交易笔数'
- ],
- 'labels' => [
- 'formatter' => 'function(val) { return val.toFixed(0); }'
- ]
- ],
- [
- 'opposite' => true,
- 'title' => [
- 'text' => '交易金额'
- ],
- 'labels' => [
- 'formatter' => 'function(val) { return val.toFixed(2); }'
- ]
- ]
- ],
- 'tooltip' => [
- 'shared' => true,
- 'intersect' => false,
- ],
- 'legend' => [
- 'position' => 'top',
- 'horizontalAlign' => 'left'
- ]
- ]);
- }
- }
|