Quellcode durchsuchen

feat(family-member): 成员被邀请走时原家庭付费会员权益合并到邀请人家庭

Sisyphus vor 1 Monat
Ursprung
Commit
107c700043

+ 10 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/FamilyMemberService.java

@@ -73,6 +73,9 @@ public class FamilyMemberService {
     @Resource
     private HealthReportMapper healthReportMapper;
 
+    @Resource
+    private MembershipService membershipService;
+
     /**
      * 添加家庭成员
      */
@@ -615,6 +618,13 @@ public class FamilyMemberService {
         member.setStatus("active");
         familyMemberMapper.updateById(member);
 
+        // 原家庭是付费会员时,将会员权益合并到邀请人家庭
+        try {
+            membershipService.mergeMembershipToTargetFamily(oldFamilyId, targetFamilyId);
+        } catch (Exception e) {
+            log.warn("合并会员权益异常: oldFamilyId={}, targetFamilyId={}", oldFamilyId, targetFamilyId, e);
+        }
+
         user.setFamilyId(targetFamilyId);
         user.setUpdatedAt(new Date());
         userMapper.updateById(user);

+ 41 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/MembershipService.java

@@ -161,6 +161,47 @@ public class MembershipService implements MembershipServiceInterface {
         return level != null ? toLevelDTO(level) : null;
     }
 
+    /**
+     * 将原家庭的活跃付费会员合并到目标家庭(成员被邀请走时调用)
+     * 规则:
+     * - 原家庭存在活跃付费会员(paymentStatus=paid 且未过期)时,把该会员记录转移到目标家庭
+     * - 若目标家庭已有到期日晚于原家庭会员的活跃付费会员,则跳过(目标家庭权益不低于原家庭)
+     * @return 是否发生了合并
+     */
+    public boolean mergeMembershipToTargetFamily(Long oldFamilyId, Long targetFamilyId) {
+        if (oldFamilyId == null || targetFamilyId == null || oldFamilyId.equals(targetFamilyId)) {
+            return false;
+        }
+        Date now = new Date();
+        FamilyMembership oldMembership = membershipMapper.selectOne(
+                new LambdaQueryWrapper<FamilyMembership>()
+                        .eq(FamilyMembership::getFamilyId, oldFamilyId)
+                        .eq(FamilyMembership::getPaymentStatus, "paid")
+                        .gt(FamilyMembership::getEndDate, now)
+                        .orderByDesc(FamilyMembership::getEndDate)
+                        .last("LIMIT 1"));
+        if (oldMembership == null) {
+            return false;
+        }
+        // 目标家庭已有更晚到期的活跃会员则不覆盖
+        FamilyMembership targetMembership = membershipMapper.selectOne(
+                new LambdaQueryWrapper<FamilyMembership>()
+                        .eq(FamilyMembership::getFamilyId, targetFamilyId)
+                        .eq(FamilyMembership::getPaymentStatus, "paid")
+                        .gt(FamilyMembership::getEndDate, now)
+                        .orderByDesc(FamilyMembership::getEndDate)
+                        .last("LIMIT 1"));
+        if (targetMembership != null && targetMembership.getEndDate().after(oldMembership.getEndDate())) {
+            return false;
+        }
+        oldMembership.setFamilyId(targetFamilyId);
+        oldMembership.setUpdatedAt(now);
+        membershipMapper.updateById(oldMembership);
+        log.info("会员合并: 原家庭{}的{}会员(至{})合并到目标家庭{}",
+                oldFamilyId, oldMembership.getLevelCode(), oldMembership.getEndDate(), targetFamilyId);
+        return true;
+    }
+
     /**
      * 检查功能权限
      */