Przeglądaj źródła

feat: 实现 getTeamTree 树形扁平数据(含 memberConsumption、myCfEarnedFromMember)

Sisyphus 1 tydzień temu
rodzic
commit
8b8e4ff8f1

+ 85 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/CommissionService.java

@@ -722,6 +722,91 @@ public class CommissionService {
         return result;
     }
 
+    /**
+     * 获取团队树形扁平数据(不含根节点,仅 level>=1 成员)
+     * 每个节点包含 memberConsumption、myCfEarnedFromMember
+     */
+    public Map<String, Object> getTeamTree(Long userId, Integer maxLevel) {
+        if (maxLevel == null || maxLevel <= 0) maxLevel = 3;
+        if (maxLevel > 10) maxLevel = 10;
+
+        Map<String, Object> result = new LinkedHashMap<>();
+        List<Map<String, Object>> nodes = new ArrayList<>();
+
+        // 1. 查 referral_tree
+        List<ReferralTree> treeNodes = referralTreeMapper.selectList(
+                new LambdaQueryWrapper<ReferralTree>()
+                        .eq(ReferralTree::getParentId, userId)
+                        .le(ReferralTree::getLevel, maxLevel)
+                        .orderByAsc(ReferralTree::getLevel)
+        );
+
+        if (treeNodes.isEmpty()) {
+            result.put("nodes", nodes);
+            result.put("totalMembers", 0);
+            result.put("maxLevel", maxLevel);
+            return result;
+        }
+
+        // 2. 批量查用户基本信息
+        List<Long> childIds = treeNodes.stream().map(ReferralTree::getChildId).distinct().collect(Collectors.toList());
+        Map<Long, User> userMap = userMapper.selectBatchIds(childIds).stream()
+                .collect(Collectors.toMap(User::getId, u -> u));
+
+        // 3. 按成员聚合 memberConsumption(fulfillStatus=completed 订单总额)
+        Map<Long, Integer> memberConsumptionMap = new HashMap<>();
+        if (!childIds.isEmpty()) {
+            List<ProductOrder> orders = productOrderMapper.selectList(
+                    new LambdaQueryWrapper<ProductOrder>()
+                            .in(ProductOrder::getBuyerId, childIds)
+                            .eq(ProductOrder::getFulfillStatus, "completed")
+            );
+            for (ProductOrder o : orders) {
+                if (o.getBuyerId() != null && o.getTotalAmount() != null) {
+                    memberConsumptionMap.merge(o.getBuyerId(), o.getTotalAmount(), Integer::sum);
+                }
+            }
+        }
+
+        // 4. 按成员聚合 myCfEarnedFromMember(commission_records 已结算+待结算,排除 cancelled)
+        Map<Long, Integer> myCfEarnedMap = new HashMap<>();
+        if (!childIds.isEmpty()) {
+            List<CommissionRecord> records = commissionRecordMapper.selectList(
+                    new LambdaQueryWrapper<CommissionRecord>()
+                            .eq(CommissionRecord::getReferrerId, userId)
+                            .in(CommissionRecord::getBuyerId, childIds)
+                            .ne(CommissionRecord::getStatus, "cancelled")
+            );
+            for (CommissionRecord r : records) {
+                if (r.getBuyerId() != null && r.getCommissionAmount() != null) {
+                    myCfEarnedMap.merge(r.getBuyerId(), r.getCommissionAmount(), Integer::sum);
+                }
+            }
+        }
+
+        // 5. 组装 nodes(不含根节点,仅 level>=1 的成员)
+        for (ReferralTree node : treeNodes) {
+            User u = userMap.get(node.getChildId());
+            if (u == null) continue;
+
+            Map<String, Object> n = new LinkedHashMap<>();
+            n.put("userId", node.getChildId());
+            n.put("nickname", u.getNickname());
+            n.put("avatar", u.getAvatar());
+            n.put("level", node.getLevel());
+            n.put("parentId", node.getParentId());
+            n.put("referrerId", u.getReferrerId());
+            n.put("memberConsumption", memberConsumptionMap.getOrDefault(node.getChildId(), 0));
+            n.put("myCfEarnedFromMember", myCfEarnedMap.getOrDefault(node.getChildId(), 0));
+            nodes.add(n);
+        }
+
+        result.put("nodes", nodes);
+        result.put("totalMembers", nodes.size());
+        result.put("maxLevel", maxLevel);
+        return result;
+    }
+
     /**
      * 获取佣金统计(首页面板数据)
      */