|
|
@@ -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;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取佣金统计(首页面板数据)
|
|
|
*/
|