|
@@ -1293,22 +1293,41 @@ public class MembershipService implements MembershipServiceInterface {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 降级已过期的FAMILY会员为FREE
|
|
|
|
|
- * 由定时任务 daily 4:00AM 调用
|
|
|
|
|
|
|
+ * 降级已过期的FAMILY会员为FREE(由定时任务 daily 4:00AM 调用)
|
|
|
|
|
+ * 方案B:按家庭维度批量降级(避免单个成员过期导致全家降级遗漏)
|
|
|
*/
|
|
*/
|
|
|
public void downgradeExpiredMembers() {
|
|
public void downgradeExpiredMembers() {
|
|
|
- List<User> familyUsers = userMapper.selectList(
|
|
|
|
|
- new LambdaQueryWrapper<User>()
|
|
|
|
|
- .eq(User::getMemberLevel, "FAMILY")
|
|
|
|
|
- .isNotNull(User::getMemberExpireTime)
|
|
|
|
|
- .lt(User::getMemberExpireTime, new Date())
|
|
|
|
|
- );
|
|
|
|
|
|
|
+ // 策略:按家庭维度处理 — 找到所有有过期会员的家庭,批量降级全家
|
|
|
|
|
+ List<FamilyMembership> expiredMemberships = membershipMapper.selectList(
|
|
|
|
|
+ new LambdaQueryWrapper<FamilyMembership>()
|
|
|
|
|
+ .eq(FamilyMembership::getPaymentStatus, "paid")
|
|
|
|
|
+ .lt(FamilyMembership::getEndDate, new Date()));
|
|
|
|
|
+
|
|
|
|
|
+ // 按 familyId 去重(同一家庭可能有多条过期记录)
|
|
|
|
|
+ Set<Long> expiredFamilyIds = new java.util.HashSet<>();
|
|
|
|
|
+ for (FamilyMembership m : expiredMemberships) {
|
|
|
|
|
+ if (m.getFamilyId() != null) {
|
|
|
|
|
+ expiredFamilyIds.add(m.getFamilyId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- for (User user : familyUsers) {
|
|
|
|
|
|
|
+ for (Long familyId : expiredFamilyIds) {
|
|
|
try {
|
|
try {
|
|
|
- expireMember(user.getId());
|
|
|
|
|
|
|
+ // 方案B:检查该家庭是否还有其他有效会员
|
|
|
|
|
+ FamilyMembership active = getActiveFamilyMembership(familyId);
|
|
|
|
|
+ if (active == null) {
|
|
|
|
|
+ // 无有效会员 → 全家降级
|
|
|
|
|
+ downgradeFamilyMembers(familyId);
|
|
|
|
|
+ log.info("定时降级: familyId={} 无有效会员,全家降级 FREE", familyId);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 还有有效会员,只需更新过期记录对应的管理员过期状态(统一通过 sync)
|
|
|
|
|
+ // 方案B:重新同步到各成员的最新到期时间
|
|
|
|
|
+ syncMembershipToFamilyMembers(familyId, active.getLevelCode(), active.getEndDate(),
|
|
|
|
|
+ "periodic_sync", null);
|
|
|
|
|
+ log.info("定时同步: familyId={} 保留有效会员 {} 至 {}", familyId, active.getLevelCode(), active.getEndDate());
|
|
|
|
|
+ }
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
- // log error and continue
|
|
|
|
|
|
|
+ log.error("定时任务处理家庭会员过期失败: familyId={}", familyId, e);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|