From 0cf54692efc067adca7fa4308af241f723930b58 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期五, 31 七月 2026 17:54:56 +0800
Subject: [PATCH] update

---
 backend/src/main/java/com/tourguide/modules/user/service/MiniUserService.java |   68 ++++++++++++++++++++++++++++++++-
 1 files changed, 65 insertions(+), 3 deletions(-)

diff --git a/backend/src/main/java/com/tourguide/modules/user/service/MiniUserService.java b/backend/src/main/java/com/tourguide/modules/user/service/MiniUserService.java
index b1072b4..bf18110 100644
--- a/backend/src/main/java/com/tourguide/modules/user/service/MiniUserService.java
+++ b/backend/src/main/java/com/tourguide/modules/user/service/MiniUserService.java
@@ -5,6 +5,10 @@
 import com.tourguide.common.api.PageResponse;
 import com.tourguide.common.exception.BusinessException;
 import com.tourguide.common.validation.ChineseIdCardValidator;
+import com.tourguide.modules.order.dto.VisitorOrderStatRow;
+import com.tourguide.modules.order.mapper.TourOrderMapper;
+import com.tourguide.modules.review.dto.VisitorReviewStatRow;
+import com.tourguide.modules.review.mapper.OrderReviewMapper;
 import com.tourguide.modules.user.dto.MiniProfileUpdateRequest;
 import com.tourguide.modules.user.dto.MiniRealNameUpdateRequest;
 import com.tourguide.modules.user.dto.MiniUserDetailResponse;
@@ -14,15 +18,26 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
+import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /** 仅处理小程序用户,管理后台只能通过本服务执行查询或状态管理。 */
 @Service
 public class MiniUserService {
     private final MiniUserMapper userMapper;
+    private final TourOrderMapper orderMapper;
+    private final OrderReviewMapper reviewMapper;
 
-    public MiniUserService(MiniUserMapper userMapper) { this.userMapper = userMapper; }
+    public MiniUserService(MiniUserMapper userMapper, TourOrderMapper orderMapper, OrderReviewMapper reviewMapper) {
+        this.userMapper = userMapper;
+        this.orderMapper = orderMapper;
+        this.reviewMapper = reviewMapper;
+    }
 
     public MiniUser findEnabledById(Long id) {
         MiniUser user = userMapper.selectById(id);
@@ -55,14 +70,55 @@
                 .lt(endDate != null, MiniUser::getCreatedAt, endDate == null ? null : endDate.plusDays(1).atStartOfDay())
                 .orderByDesc(MiniUser::getId);
         Page<MiniUser> result = userMapper.selectPage(new Page<MiniUser>(page, size), query);
-        return new PageResponse<MiniUserResponse>(result.getRecords().stream().map(MiniUserResponse::from).collect(Collectors.toList()),
+        List<MiniUser> users = result.getRecords();
+        Map<Long, UserStats> statsByUserId = loadUserStats(
+                users.stream().map(MiniUser::getId).collect(Collectors.toList()));
+        return new PageResponse<MiniUserResponse>(users.stream()
+                .map(user -> MiniUserResponse.from(user, statsOf(statsByUserId, user.getId()).orderCount))
+                .collect(Collectors.toList()),
                 result.getTotal(), result.getCurrent(), result.getSize());
     }
 
     public MiniUserDetailResponse detail(Long id) {
         MiniUser user = userMapper.selectById(id);
         if (user == null) { throw new BusinessException(404, "游客不存在"); }
-        return MiniUserDetailResponse.from(user);
+        UserStats stats = statsOf(loadUserStats(Collections.singletonList(id)), id);
+        return MiniUserDetailResponse.from(user, stats.orderCount, stats.totalConsumption, stats.reviewCount);
+    }
+
+    private Map<Long, UserStats> loadUserStats(List<Long> visitorIds) {
+        if (visitorIds.isEmpty()) { return Collections.emptyMap(); }
+        Map<Long, UserStats> statsByUserId = new HashMap<Long, UserStats>();
+        for (Long visitorId : visitorIds) {
+            statsByUserId.put(visitorId, new UserStats());
+        }
+        List<VisitorOrderStatRow> orderRows = orderMapper.selectVisitorOrderStats(visitorIds);
+        if (orderRows != null) {
+            for (VisitorOrderStatRow row : orderRows) {
+                if (row.getVisitorId() == null) { continue; }
+                UserStats stats = statsByUserId.computeIfAbsent(row.getVisitorId(), ignored -> new UserStats());
+                stats.orderCount = defaultLong(row.getOrderCount());
+                stats.totalConsumption = row.getTotalConsumption() == null ? BigDecimal.ZERO : row.getTotalConsumption();
+            }
+        }
+        List<VisitorReviewStatRow> reviewRows = reviewMapper.selectVisitorReviewStats(visitorIds);
+        if (reviewRows != null) {
+            for (VisitorReviewStatRow row : reviewRows) {
+                if (row.getVisitorId() == null) { continue; }
+                statsByUserId.computeIfAbsent(row.getVisitorId(), ignored -> new UserStats())
+                        .reviewCount = defaultLong(row.getReviewCount());
+            }
+        }
+        return statsByUserId;
+    }
+
+    private static UserStats statsOf(Map<Long, UserStats> statsByUserId, Long userId) {
+        UserStats stats = statsByUserId.get(userId);
+        return stats == null ? new UserStats() : stats;
+    }
+
+    private static long defaultLong(Long value) {
+        return value == null ? 0L : value;
     }
 
     @Transactional
@@ -106,4 +162,10 @@
         user.setStatus(status);
         userMapper.updateById(user);
     }
+
+    private static final class UserStats {
+        private long orderCount;
+        private BigDecimal totalConsumption = BigDecimal.ZERO;
+        private long reviewCount;
+    }
 }

--
Gitblit v1.7.1