diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/DailyTask.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/DailyTask.java index ca029604..e749e19f 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/DailyTask.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/DailyTask.java @@ -324,43 +324,48 @@ public class DailyTask { */ private boolean isUserEligibleForGift(Long userId, LocalDateTime currentTime) { try { - // 查询用户NOBLE_VIP类型且origin为PURCHASING_GOLD_PROPS的流水记录 - List purchasingRecords = runningWaterUserPropsService.query() + // 查询用户NOBLE_VIP类型的所有流水记录 + List allRecords = runningWaterUserPropsService.query() .eq(RunningWaterUserProps::getUserId, userId) .eq(RunningWaterUserProps::getType, "NOBLE_VIP") - .eq(RunningWaterUserProps::getOrigin, "PURCHASING_GOLD_PROPS") - .orderByDesc(RunningWaterUserProps::getCreateTime) + .orderByAsc(RunningWaterUserProps::getCreateTime) .list(); + if (CollectionUtils.isEmpty(allRecords)) { + log.debug("用户 {} 没有NOBLE_VIP类型的流水记录,不符合赠送条件", userId); + return false; + } + + // 分离购买记录和扣除记录 + List purchasingRecords = allRecords.stream() + .filter(record -> "PURCHASING_GOLD_PROPS".equals(record.getOrigin())) + .collect(Collectors.toList()); + + // 检查非PURCHASING_GOLD_PROPS类型的扣除天数记录 + List deductionRecords = allRecords.stream() + .filter(record -> !"PURCHASING_GOLD_PROPS".equals(record.getOrigin()) && record.getDays() != null && record.getDays() < 0) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(purchasingRecords)) { log.debug("用户 {} 没有PURCHASING_GOLD_PROPS类型的流水记录,不符合赠送条件", userId); return false; } - // 检查是否有有效的购买记录(在有效期内) - for (RunningWaterUserProps record : purchasingRecords) { - LocalDateTime createTime = record.getCreateTime().toLocalDateTime(); - Integer days = record.getDays(); - - // days为-1表示永久有效 - if (days != null && days == -1) { - log.debug("用户 {} 有永久有效的购买记录,符合赠送条件", userId); - return true; - } - - // 计算有效期 - if (days != null && days > 0) { - LocalDateTime expireTime = createTime.plusDays(days); - if (currentTime.isBefore(expireTime) || currentTime.isEqual(expireTime)) { - log.debug("用户 {} 购买记录在有效期内,符合赠送条件。购买时间: {}, 有效天数: {}, 过期时间: {}", - userId, createTime, days, expireTime); - return true; - } - } + // 计算累计有效天数 + LocalDateTime earliestValidTime = calculateEffectiveValidTime(purchasingRecords, deductionRecords, currentTime); + + if (earliestValidTime == null) { + log.debug("用户 {} 没有有效的购买记录或所有记录都已过期,不符合赠送条件", userId); + return false; } - log.debug("用户 {} 所有购买记录都已过期,不符合赠送条件", userId); - return false; + // 判断当前时间是否在有效期内 + boolean isValid = currentTime.isBefore(earliestValidTime) || currentTime.isEqual(earliestValidTime); + + log.debug("用户 {} 赠送条件检查结果: {}, 当前时间: {}, 有效期截止时间: {}", + userId, isValid ? "符合" : "不符合", currentTime, earliestValidTime); + + return isValid; } catch (Exception e) { log.error("检查用户 {} 赠送资格时发生异常: {}", userId, e.getMessage(), e); @@ -368,6 +373,73 @@ public class DailyTask { } } + /** + * 计算用户的有效期截止时间 + * 根据购买记录和扣除记录,结合时间顺序累计计算有效期 + */ + private LocalDateTime calculateEffectiveValidTime(List purchasingRecords, + List deductionRecords, + LocalDateTime currentTime) { + + // 所有记录按时间排序 + purchasingRecords.sort(Comparator.comparing(RunningWaterUserProps::getCreateTime)); + deductionRecords.sort(Comparator.comparing(RunningWaterUserProps::getCreateTime)); + + LocalDateTime currentValidEndTime = null; + boolean hasValidRecord = false; + + // 先处理所有购买记录 + for (RunningWaterUserProps record : purchasingRecords) { + LocalDateTime recordCreateTime = record.getCreateTime().toLocalDateTime(); + Integer days = record.getDays(); + + if (days != null && days > 0) { + if (currentValidEndTime == null || recordCreateTime.isAfter(currentValidEndTime)) { + // 如果当前没有有效期或购买时间在当前有效期之后,从购买时间开始计算 + currentValidEndTime = recordCreateTime.plusDays(days); + } else { + // 如果购买时间在当前有效期内,在当前有效期基础上延长 + currentValidEndTime = currentValidEndTime.plusDays(days); + } + hasValidRecord = true; + log.debug("用户购买记录增加天数: {}, 购买时间: {}, 累计有效期至: {}", days, recordCreateTime, currentValidEndTime); + } + } + + // 再处理所有扣除记录 + for (RunningWaterUserProps record : deductionRecords) { + LocalDateTime recordCreateTime = record.getCreateTime().toLocalDateTime(); + Integer days = record.getDays(); + + if (days == null || days >= 0) { + log.warn("扣除天数无效:{}", days); + continue; + } + + if (currentValidEndTime == null) { + log.warn("无有效天数:{}", currentValidEndTime); + continue; + } + + if (recordCreateTime.isBefore(currentValidEndTime)) { + // 只有在有有效期且扣除时间在有效期内才能扣除 + LocalDateTime originalValidEndTime = currentValidEndTime; + currentValidEndTime = currentValidEndTime.plusDays(days); // days是负数,相当于减少天数 + log.debug("用户扣除记录减少天数: {}, 扣除时间: {}, 原有效期: {}, 调整后有效期: {}", + days, recordCreateTime, originalValidEndTime, currentValidEndTime); + + // 如果扣除后有效期已经过了当前时间或扣除时间之前,则无效 + if (currentValidEndTime.isBefore(currentTime) || currentValidEndTime.isBefore(recordCreateTime)) { + currentValidEndTime = null; + hasValidRecord = false; + log.debug("扣除后有效期已过期或无效,重置有效期"); + } + } + } + + return hasValidRecord ? currentValidEndTime : null; + } + private void sendFanVotesReward(String code, String sysOrigin) { List votesCounts = roomFanVotesActivityCountService