فهرست منبع

feat(admin): 添加交易订单统计数据显示

- 在交易订单页面新增统计数据展示卡片
- 显示支付成功总额和确认收货总额
- 添加相应的CSS样式美化统计卡片
- 后端控制器返回统计数据
- 新增服务方法计算订单统计信息
- 使用渐变背景和悬停效果增强视觉体验
runphp 3 ماه پیش
والد
کامیت
cd827c09ff
3فایلهای تغییر یافته به همراه95 افزوده شده و 1 حذف شده
  1. 72 0
      resource/admin/TradeOrder.vue
  2. 7 1
      src/Controller/Admin/TradeOrderController.php
  3. 16 0
      src/Service/PaymentRecordService.php

+ 72 - 0
resource/admin/TradeOrder.vue

@@ -38,6 +38,24 @@
       </el-form>
     </el-card>
 
+    <!-- 统计数据 -->
+    <el-card class="stats-card" v-if="statsData">
+      <el-row :gutter="20" justify="space-between">
+        <el-col :span="12">
+          <div class="stat-item pay-success">
+            <div class="stat-label">支付成功总额</div>
+            <div class="stat-value">¥{{ statsData.pay_success_amount }}</div>
+          </div>
+        </el-col>
+        <el-col :span="12">
+          <div class="stat-item confirm-success">
+            <div class="stat-label">确认收货总额</div>
+            <div class="stat-value">¥{{ statsData.confirm_success_amount }}</div>
+          </div>
+        </el-col>
+      </el-row>
+    </el-card>
+
     <!-- 列表数据 -->
     <el-card class="table-card">
       <template #header>
@@ -181,6 +199,7 @@ export default {
         { label: '商品订单支付', value: 1 }
       ],
       tableData: [],
+      statsData: null,
       pagination: {
         page: 1,
         limit: 10,
@@ -271,6 +290,13 @@ export default {
           this.tableData = res.page.data
           this.pagination.total = res.page.total
           this.pagination.limit = res.page.per_page
+          
+          // 获取统计数据
+          if (res.data?.stats) {
+            this.statsData = res.data.stats;
+          } else {
+            this.statsData = null;
+          }
         } else {
           this.$message.error(res.msg || res.message || '获取数据失败')
         }
@@ -369,6 +395,52 @@ export default {
   margin-bottom: 20px;
 }
 
+.stats-card {
+  margin-bottom: 20px;
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  border-radius: 8px;
+  background: linear-gradient(120deg, #e0f7fa 0%, #bbdefb 100%);
+}
+
+.stat-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 25px 0;
+  text-align: center;
+  border-radius: 8px;
+  transition: all 0.3s ease;
+}
+
+.stat-item:hover {
+  transform: translateY(-5px);
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+}
+
+.stat-item.pay-success {
+  background: linear-gradient(135deg, #8eefe8 0%, #4db6ac 100%);
+}
+
+.stat-item.confirm-success {
+  background: linear-gradient(135deg, #ffd54f 0%, #ffb300 100%);
+}
+
+.stat-label {
+  font-size: 16px;
+  font-weight: 500;
+  color: #ffffff;
+  margin-bottom: 10px;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+}
+
+.stat-value {
+  font-size: 24px;
+  font-weight: 600;
+  color: #ffffff;
+  text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
+}
+
 .table-card {
   margin-bottom: 20px;
 }

+ 7 - 1
src/Controller/Admin/TradeOrderController.php

@@ -20,7 +20,13 @@ class TradeOrderController
             'wechat_transaction_id/s' => '',
             'order_state/d' => 0,
         ]);
-        return page_response(page: $service->getTradeOrderList($params, $request->pageAndLimit()));
+        $stats = $service->getTradeOrderStats();
+        return page_response(
+            page: $service->getTradeOrderList($params, $request->pageAndLimit()),
+            data: [
+                'stats' => $stats
+            ]
+        );
     }
 
     public function updateExpressCompany(int $id, Request $request, LakalaWechatPaymentEntity $lakalaWechatPaymentEntity): Response

+ 16 - 0
src/Service/PaymentRecordService.php

@@ -189,4 +189,20 @@ class PaymentRecordService
             });
         }
     }
+
+    public function getTradeOrderStats():array
+    {
+        $stats = ExtensionPaymentModel::alias('p')
+            ->leftJoin('lakala_wechat_payment wp', 'p.id = wp.payment_id')
+            ->where(['p.status' => PaymentStatusEnum::SUCCESS, 'p.pay_type' => 'lakala'])
+            ->field([
+                "COALESCE(SUM(p.amount), 0) AS pay_success_amount",
+                "COALESCE(SUM(CASE WHEN wp.order_state = 4 THEN p.amount ELSE 0 END), 0) AS confirm_success_amount",
+            ])->find();
+        return [
+            'pay_success_amount' => (float)$stats['pay_success_amount'],
+            'confirm_success_amount' => (float)$stats['confirm_success_amount'],
+        ];
+
+    }
 }