فهرست منبع

支付成功率统计

laowu 4 روز پیش
والد
کامیت
7bacb52b8c

+ 107 - 26
app/Http/Controllers/Admin/RechargeController.php

@@ -406,16 +406,9 @@ class RechargeController extends Controller
                 'amountSort' => $amountSort,
                 'request' => $request,
                 'payMethod' => $payMethod,
-                'payMethods' => [
-                    1 => 'cashapp',
-                    2 => 'paypal',
-                    4 => 'applepay',
-                    8 => 'googlepay',
-                    16 => 'btcpay',
-                    32 => 'eth',
-                    1024 => 'usdt',
-                    2048 => 'usdc',
-                ]
+                'payMethods' => array_map(function ($item) {
+                    return $item['key'];
+                }, config('payment.methods'))
             ]);
         }
     }
@@ -767,6 +760,107 @@ class RechargeController extends Controller
         }
     }
 
+    // 支付通道成功率(近4日)
+    public function payChannelRate(Request $request)
+    {
+        $payMethodsMap = array_map(function ($item) {
+            return $item['name'];
+        }, config('payment.methods'));
+
+        $today = Carbon::today();
+        $dates = [];
+        $dateLabels = [];
+
+        // 近4日: 今日, 昨日, 今日-2, 今日-3
+        for ($i = 0; $i < 4; $i++) {
+            $d = $today->copy()->subDays($i);
+            $dates[] = $d->format('Y-m-d');
+            if ($i == 0) {
+                $dateLabels[] = '今日';
+            } elseif ($i == 1) {
+                $dateLabels[] = '昨日';
+            } else {
+                $dateLabels[] = $d->format('Y-m-d') . '(今日-' . $i . '天)';
+            }
+        }
+
+        $rows = DB::connection('write')->table(DB::raw('agent.dbo.[order] as o WITH (NOLOCK)'))
+            ->where('o.created_at', '>=', $dates[3] . ' 00:00:00')
+            ->where('o.created_at', '<=', $dates[0] . ' 23:59:59')
+            ->selectRaw("
+                o.payment_code,
+                o.order_title,
+                SUM(CASE WHEN CONVERT(date, o.created_at) = '{$dates[0]}' THEN 1 ELSE 0 END) as d0_total,
+                SUM(CASE WHEN CONVERT(date, o.created_at) = '{$dates[0]}' AND o.pay_status = 1 THEN 1 ELSE 0 END) as d0_success,
+                SUM(CASE WHEN CONVERT(date, o.created_at) = '{$dates[1]}' THEN 1 ELSE 0 END) as d1_total,
+                SUM(CASE WHEN CONVERT(date, o.created_at) = '{$dates[1]}' AND o.pay_status = 1 THEN 1 ELSE 0 END) as d1_success,
+                SUM(CASE WHEN CONVERT(date, o.created_at) = '{$dates[2]}' THEN 1 ELSE 0 END) as d2_total,
+                SUM(CASE WHEN CONVERT(date, o.created_at) = '{$dates[2]}' AND o.pay_status = 1 THEN 1 ELSE 0 END) as d2_success,
+                SUM(CASE WHEN CONVERT(date, o.created_at) = '{$dates[3]}' THEN 1 ELSE 0 END) as d3_total,
+                SUM(CASE WHEN CONVERT(date, o.created_at) = '{$dates[3]}' AND o.pay_status = 1 THEN 1 ELSE 0 END) as d3_success
+            ")
+            ->groupBy('o.payment_code', 'o.order_title')
+            ->orderBy('o.payment_code')
+            ->orderBy('o.order_title')
+            ->get();
+
+        // 从 admin_configs 取所有支付渠道(type=pay),config_key 即为 payment_code
+        $paymentCodes = DB::connection('write')
+            ->table(DB::raw('agent.dbo.admin_configs WITH (NOLOCK)'))
+            ->where('type', 'pay')
+            ->where('config_key', '<>', '')
+            ->pluck('config_key')
+            ->unique()
+            ->values()
+            ->toArray();
+
+        // 将订单数据按 [payment_code][order_title] 索引
+        $dataIndex = [];
+        foreach ($rows as $row) {
+            $code = $row->payment_code;
+            $title = (int)$row->order_title;
+            $dataIndex[$code][$title] = $row;
+        }
+
+        $list = [];
+        foreach ($paymentCodes as $code) {
+            foreach ($payMethodsMap as $title => $name) {
+                $row = $dataIndex[$code][$title] ?? null;
+                $channelName = $code . ' ' . $name;
+
+                $days = [];
+                for ($i = 0; $i < 4; $i++) {
+                    if ($row) {
+                        $total = (int)$row->{'d' . $i . '_total'};
+                        $success = (int)$row->{'d' . $i . '_success'};
+                    } else {
+                        $total = 0;
+                        $success = 0;
+                    }
+                    $rate = $total > 0 ? round($success / $total * 100, 1) : 0;
+                    $days[] = [
+                        'total' => $total,
+                        'success' => $success,
+                        'rate' => $rate,
+                    ];
+                }
+
+                $list[] = [
+                    'payment_code' => $code,
+                    'order_title' => $title,
+                    'channel_name' => $channelName,
+                    'days' => $days,
+                ];
+            }
+        }
+
+        return view('admin.recharge.pay_channel_rate', [
+            'list' => $list,
+            'dateLabels' => $dateLabels,
+            'dates' => $dates,
+        ]);
+    }
+
     // 补单
     public function supplement(Request $request, $id)
     {
@@ -1142,25 +1236,12 @@ class RechargeController extends Controller
             
             // 构建支付方式数组
             $gearData = [];
-            $payMethodsMap = [
-                1 => 'cashapp',
-                2 => 'paypal',
-                4 => 'applepay',
-                8 => 'googlepay',
-                16 => 'btcpay',
-                32 => 'eth',
-                64 => 'usdt-trc20',
-                128 => 'usdt-erc20',
-                256 => 'usdc-trc20',
-                512 => 'usdc-erc20',
-                1024 => 'usdt',
-                2048 => 'usdc',
-            ];
+            $payMethodsMap = config('payment.methods');
             
-            foreach ($payMethodsMap as $value => $name) {
+            foreach ($payMethodsMap as $value => $item) {
                 if ($pay_methods & $value) {
                     $gearData[] = [
-                        'name' => $name,
+                        'name' => $item['key'],
                         'value' => $value,
                         'status' => 1
                     ];

+ 7 - 23
app/Http/logic/admin/RechargeLogic.php

@@ -130,17 +130,10 @@ class RechargeLogic extends BaseApiLogic
             ->get();
 
         $names = DB::table('agent.dbo.admin_configs')->where('type', 'pay')->pluck('name', 'id');
-        $payMethodsNames = [
-            'cashapp' => 'CashApp',
-            'paypal' => 'PayPal',
-            'applepay' => 'ApplePay',
-            'googlepay' => 'GooglePay',
-            'usdt-trc20' => 'USDT-TRC20',
-            'usdt-erc20' => 'USDT-ERC20',
-            'usdc-trc20' => 'USDC-TRC20',
-            'usdc-erc20' => 'USDC-ERC20',
-            'btcpay' => 'BTCPay',
-        ];
+        $payMethodsNames = [];
+        foreach (config('payment.methods') as $item) {
+            $payMethodsNames[$item['key']] = $item['name'];
+        }
         
         foreach ($list as &$value) {
 
@@ -267,21 +260,12 @@ class RechargeLogic extends BaseApiLogic
     {
         // 构建支付方式数组
         $gearData = [];
-        $payMethodsMap = [
-            1 => 'cashapp',
-            2 => 'paypal',
-            4 => 'applepay',
-            8 => 'googlepay',
-            64 => 'usdt-trc20',
-            128 => 'usdt-erc20',
-            256 => 'usdc-trc20',
-            512 => 'usdc-erc20'
-        ];
+        $payMethodsMap = config('payment.methods');
         
-        foreach ($payMethodsMap as $value => $name) {
+        foreach ($payMethodsMap as $value => $item) {
             if ($pay_methods & $value) {
                 $gearData[] = [
-                    'name' => $name,
+                    'name' => $item['key'],
                     'value' => $value,
                     'status' => 1
                 ];

+ 26 - 0
config/payment.php

@@ -0,0 +1,26 @@
+<?php
+/**
+ * 支付方式配置
+ * 
+ * key   = order_title 字段的位掩码值
+ * value = [
+ *   'key'  => 存储/传输用的键名(小写)
+ *   'name' => 展示用的名称
+ * ]
+ */
+return [
+    'methods' => [
+        1 => ['key' => 'cashapp',     'name' => 'Cash App'],
+        2 => ['key' => 'paypal',      'name' => 'PayPal'],
+        4 => ['key' => 'applepay',    'name' => 'ApplePay'],
+        8 => ['key' => 'googlepay',   'name' => 'GooglePay'],
+        16 => ['key' => 'btcpay',     'name' => 'BTC'],
+        32 => ['key' => 'eth',        'name' => 'ETH'],
+        64 => ['key' => 'usdt-trc20', 'name' => 'USDT-TRC20'],
+        128 => ['key' => 'usdt-erc20','name' => 'USDT-ERC20'],
+        256 => ['key' => 'usdc-trc20','name' => 'USDC-TRC20'],
+        512 => ['key' => 'usdc-erc20','name' => 'USDC-ERC20'],
+        1024 => ['key' => 'usdt',     'name' => 'USDT'],
+        2048 => ['key' => 'usdc',     'name' => 'USDC'],
+    ],
+];

+ 71 - 0
resources/views/admin/recharge/pay_channel_rate.blade.php

@@ -0,0 +1,71 @@
+@extends('base.base')
+@section('base')
+    <!-- 内容区域 -->
+    <div class="main-panel">
+        <div class="content-wrapper">
+            <div class="page-header">
+                <h3 class="page-title">
+                     <span class="page-title-icon bg-gradient-primary text-white mr-2">
+                        <i class="mdi mdi-chart-line"></i>
+                    </span>
+                    支付通道成功率
+                </h3>
+                <nav aria-label="breadcrumb">
+                    <ol class="breadcrumb">
+                        <li class="breadcrumb-item"><a href="#">充值管理</a></li>
+                        <li class="breadcrumb-item active" aria-current="page">支付通道成功率</li>
+                    </ol>
+                </nav>
+            </div>
+            <div class="row">
+                <div class="col-lg-12 grid-margin stretch-card">
+                    <div class="card">
+                        <div class="card-body">
+                            <h4 class="card-title">支付通道成功率(近4日)</h4>
+                            <div class="table-responsive">
+                                <table class="table table-bordered table-hover">
+                                    <thead>
+                                    <tr class="bg-gradient-primary text-white">
+                                        <th style="min-width: 180px">支付通道</th>
+                                        @foreach($dateLabels as $label)
+                                            <th style="min-width: 200px">{{ $label }}</th>
+                                        @endforeach
+                                    </tr>
+                                    </thead>
+                                    <tbody>
+                                    @forelse($list as $item)
+                                        <tr>
+                                            <td><strong>{{ $item['channel_name'] }}</strong></td>
+                                            @foreach($item['days'] as $day)
+                                                <td>
+                                                    @if($day['total'] > 0)
+                                                        <span class="text-primary" style="font-weight: bold; font-size: 15px;">{{ $day['rate'] }}%</span>
+                                                        <small class="text-muted">({{ $day['success'] }}/{{ $day['total'] }})</small>
+                                                        @if($day['rate'] < 50)
+                                                            <span class="badge badge-danger">低</span>
+                                                        @elseif($day['rate'] < 80)
+                                                            <span class="badge badge-warning">中</span>
+                                                        @else
+                                                            <span class="badge badge-success">高</span>
+                                                        @endif
+                                                    @else
+                                                        <span class="text-muted">-</span>
+                                                    @endif
+                                                </td>
+                                            @endforeach
+                                        </tr>
+                                    @empty
+                                        <tr>
+                                            <td colspan="4" class="text-center text-muted">暂无数据</td>
+                                        </tr>
+                                    @endforelse
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+@endsection

+ 2 - 0
routes/web.php

@@ -272,6 +272,8 @@ Route::group([
         $route->post('/recharge/gift_delete/{id}', 'Admin\RechargeController@gift_delete');
 
         $route->get('/recharge/methods', 'Admin\RechargeController@methods');
+        // 支付通道成功率(近4日)
+        $route->get('/recharge/pay_channel_rate', 'Admin\RechargeController@payChannelRate');
 
 
         /* 渠道管理*/