Browse Source

feat: 实现 getMyReferrer 获取我的直推人信息

Sisyphus 1 week ago
parent
commit
600ab9c6ff

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

@@ -503,6 +503,29 @@ public class CommissionService {
             }
         }
 
+        // 批量预取成员汇总(避免 N+1):已完成履约订单总额 + 非cancelled佣金总额,循环内直接取用
+        List<Long> buyerIds = new ArrayList<>(memberMap.keySet());
+        Map<Long, Long> consumptionMap = new HashMap<>();
+        Map<Long, Integer> cfEarnedMap = new HashMap<>();
+        if (!buyerIds.isEmpty()) {
+            LambdaQueryWrapper<ProductOrder> consumptionWrapper = new LambdaQueryWrapper<ProductOrder>()
+                    .in(ProductOrder::getBuyerId, buyerIds)
+                    .eq(ProductOrder::getFulfillStatus, "completed");
+            for (ProductOrder order : productOrderMapper.selectList(consumptionWrapper)) {
+                if (order.getBuyerId() == null || order.getTotalAmount() == null) continue;
+                consumptionMap.merge(order.getBuyerId(), order.getTotalAmount().longValue(), Long::sum);
+            }
+
+            LambdaQueryWrapper<CommissionRecord> cfWrapper = new LambdaQueryWrapper<CommissionRecord>()
+                    .eq(CommissionRecord::getReferrerId, userId)
+                    .in(CommissionRecord::getBuyerId, buyerIds)
+                    .ne(CommissionRecord::getStatus, "cancelled");
+            for (CommissionRecord record : commissionRecordMapper.selectList(cfWrapper)) {
+                if (record.getBuyerId() == null || record.getCommissionAmount() == null) continue;
+                cfEarnedMap.merge(record.getBuyerId(), record.getCommissionAmount(), Integer::sum);
+            }
+        }
+
         for (Map.Entry<Long, Map<String, Object>> entry : memberMap.entrySet()) {
             Long buyerId = entry.getKey();
             Map<String, Object> memberInfo = entry.getValue();
@@ -531,6 +554,9 @@ public class CommissionService {
                     .mapToInt(r -> r.getCommissionAmount() != null ? r.getCommissionAmount() : 0)
                     .sum();
             memberInfo.put("commissionEarned", commissionEarned);
+
+            memberInfo.put("memberConsumption", consumptionMap.getOrDefault(buyerId, 0L));
+            memberInfo.put("myCfEarnedFromMember", cfEarnedMap.getOrDefault(buyerId, 0));
         }
 
         List<Map<String, Object>> allMembers = new ArrayList<>(memberMap.values());
@@ -672,6 +698,30 @@ public class CommissionService {
         return result;
     }
 
+    /**
+     * 获取我的推荐人信息(直推人)
+     */
+    public Map<String, Object> getMyReferrer(Long userId) {
+        Map<String, Object> result = new LinkedHashMap<>();
+        User user = userMapper.selectById(userId);
+        if (user == null || user.getReferrerId() == null) {
+            result.put("hasReferrer", false);
+            return result;
+        }
+        User referrer = userMapper.selectById(user.getReferrerId());
+        if (referrer == null) {
+            result.put("hasReferrer", false);
+            return result;
+        }
+        result.put("hasReferrer", true);
+        result.put("referrerId", referrer.getId());
+        result.put("nickname", referrer.getNickname());
+        result.put("avatar", referrer.getAvatar());
+        result.put("referralCode", referrer.getReferralCode());
+        result.put("bindTime", user.getCreatedAt()); // 以用户创建时间作为绑定时间近似
+        return result;
+    }
+
     /**
      * 获取佣金统计(首页面板数据)
      */