Selaa lähdekoodia

fix: 客服列表订单数/消费金额不显示及NaN问题,订单列表增加活动ID列

- User实体增加 totalOrders/totalSpent 透传字段,Service批量填充
- OrderMapper新增 batchSumPaidAmountByUserIds 批量金额聚合
- 客服列表移除头像/昵称/性别/信用分列,修复消费金额NaN
- 订单管理列表在订单编号后增加活动ID列

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 2 viikkoa sitten
vanhempi
säilyke
44202858f7

+ 3 - 36
haha-admin-web/src/views/customer/utils/hook.tsx

@@ -31,45 +31,11 @@ export function useCustomer(tableRef: Ref) {
       prop: "id",
       width: 80
     },
-    {
-      label: "头像",
-      prop: "avatar",
-      width: 80,
-      cellRenderer: ({ row }) => (
-        <el-avatar size={40} src={row.avatar}>
-          {row.nickname?.charAt(0)}
-        </el-avatar>
-      )
-    },
-    {
-      label: "昵称",
-      prop: "nickname",
-      minWidth: 120
-    },
     {
       label: "手机号",
       prop: "phone",
       minWidth: 120
     },
-    {
-      label: "性别",
-      prop: "gender",
-      minWidth: 80,
-      cellRenderer: ({ row }) => {
-        const genderMap = { 0: "未知", 1: "男", 2: "女" };
-        return <span>{genderMap[row.gender] || "未知"}</span>;
-      }
-    },
-    {
-      label: "信用分",
-      prop: "creditScore",
-      minWidth: 100,
-      cellRenderer: ({ row }) => (
-        <el-tag type={row.creditScore >= 80 ? "success" : row.creditScore >= 60 ? "warning" : "danger"}>
-          {row.creditScore}
-        </el-tag>
-      )
-    },
     {
       label: "消费标签",
       prop: "userTagLabel",
@@ -88,13 +54,14 @@ export function useCustomer(tableRef: Ref) {
     {
       label: "订单数",
       prop: "totalOrders",
-      minWidth: 80
+      minWidth: 80,
+      formatter: ({ totalOrders }) => totalOrders ?? 0
     },
     {
       label: "消费金额",
       prop: "totalSpent",
       minWidth: 100,
-      formatter: ({ totalSpent }) => `¥${(totalSpent / 100).toFixed(2)}`
+      formatter: ({ totalSpent }) => totalSpent != null ? `¥${Number(totalSpent).toFixed(2)}` : "¥0.00"
     },
     {
       label: "状态",

+ 0 - 2
haha-admin-web/src/views/customer/utils/types.ts

@@ -3,8 +3,6 @@ export interface CustomerItem {
   id: number;
   phone: string;
   nickname: string;
-  avatar?: string;
-  gender?: number;
   status: number;
   creditScore: number;
   totalOrders: number;

+ 6 - 0
haha-admin-web/src/views/order/utils/hook.tsx

@@ -58,6 +58,12 @@ export function useOrder(tableRef: Ref) {
       minWidth: 160,
       formatter: ({ orderNo }) => orderNo || "-"
     },
+    {
+      label: "活动ID",
+      prop: "activityId",
+      minWidth: 120,
+      formatter: ({ activityId }) => activityId || "-"
+    },
     {
       label: "支付订单号",
       prop: "outTradeNo",

+ 6 - 0
haha-entity/src/main/java/com/haha/entity/User.java

@@ -53,4 +53,10 @@ public class User implements Serializable {
     /** 用户消费标签中文描述 */
     @TableField(exist = false)
     private String userTagLabel;
+
+    @TableField(exist = false)
+    private Long totalOrders;
+
+    @TableField(exist = false)
+    private java.math.BigDecimal totalSpent;
 }

+ 10 - 0
haha-mapper/src/main/java/com/haha/mapper/OrderMapper.java

@@ -143,4 +143,14 @@ public interface OrderMapper extends BaseMapper<Order> {
             " GROUP BY user_id" +
             "</script>")
     List<Map<String, Object>> batchCountAllOrdersByUserIds(@Param("userIds") List<Long> userIds);
+
+    @Select("<script>" +
+            "SELECT user_id, COALESCE(SUM(paid_amount), 0) as total_spent FROM t_order " +
+            "WHERE pay_status IN ('PAID', 'PARTIAL_REFUND', 'REFUND') AND user_id IN " +
+            "<foreach collection='userIds' item='id' open='(' separator=',' close=')'>" +
+            "#{id}" +
+            "</foreach>" +
+            " GROUP BY user_id" +
+            "</script>")
+    List<Map<String, Object>> batchSumPaidAmountByUserIds(@Param("userIds") List<Long> userIds);
 }

+ 22 - 1
haha-service/src/main/java/com/haha/service/impl/UserServiceImpl.java

@@ -31,6 +31,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
     private final UserTagService userTagService;
     private final AccountService accountService;
+    private final com.haha.mapper.OrderMapper orderMapper;
 
     @Override
     public User getUserByOpenId(String openId) {
@@ -114,7 +115,23 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 .collect(Collectors.toList());
         Map<Long, UserTag> userTagMap = userTagService.batchComputeUserTags(userIds);
 
-        // 2. 逐条填充标签
+        // 2. 批量查询订单统计
+        Map<Long, Long> orderCountMap = orderMapper.batchCountAllOrdersByUserIds(userIds)
+                .stream()
+                .collect(Collectors.toMap(
+                        m -> ((Number) m.get("user_id")).longValue(),
+                        m -> ((Number) m.get("order_count")).longValue(),
+                        (a, b) -> a
+                ));
+        Map<Long, BigDecimal> spentMap = orderMapper.batchSumPaidAmountByUserIds(userIds)
+                .stream()
+                .collect(Collectors.toMap(
+                        m -> ((Number) m.get("user_id")).longValue(),
+                        m -> (BigDecimal) m.get("total_spent"),
+                        (a, b) -> a
+                ));
+
+        // 3. 逐条填充标签
         for (User user : users) {
             // 用户消费标签
             UserTag tag = userTagMap.get(user.getId());
@@ -136,6 +153,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     user.setStatusColor("info");
                 }
             }
+
+            // 订单统计
+            user.setTotalOrders(orderCountMap.getOrDefault(user.getId(), 0L));
+            user.setTotalSpent(spentMap.getOrDefault(user.getId(), BigDecimal.ZERO));
         }
     }
 }