初版计算
This commit is contained in:
parent
02451e7a86
commit
4e27be35c2
@ -324,43 +324,48 @@ public class DailyTask {
|
|||||||
*/
|
*/
|
||||||
private boolean isUserEligibleForGift(Long userId, LocalDateTime currentTime) {
|
private boolean isUserEligibleForGift(Long userId, LocalDateTime currentTime) {
|
||||||
try {
|
try {
|
||||||
// 查询用户NOBLE_VIP类型且origin为PURCHASING_GOLD_PROPS的流水记录
|
// 查询用户NOBLE_VIP类型的所有流水记录
|
||||||
List<RunningWaterUserProps> purchasingRecords = runningWaterUserPropsService.query()
|
List<RunningWaterUserProps> allRecords = runningWaterUserPropsService.query()
|
||||||
.eq(RunningWaterUserProps::getUserId, userId)
|
.eq(RunningWaterUserProps::getUserId, userId)
|
||||||
.eq(RunningWaterUserProps::getType, "NOBLE_VIP")
|
.eq(RunningWaterUserProps::getType, "NOBLE_VIP")
|
||||||
.eq(RunningWaterUserProps::getOrigin, "PURCHASING_GOLD_PROPS")
|
.orderByAsc(RunningWaterUserProps::getCreateTime)
|
||||||
.orderByDesc(RunningWaterUserProps::getCreateTime)
|
|
||||||
.list();
|
.list();
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(allRecords)) {
|
||||||
|
log.debug("用户 {} 没有NOBLE_VIP类型的流水记录,不符合赠送条件", userId);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分离购买记录和扣除记录
|
||||||
|
List<RunningWaterUserProps> purchasingRecords = allRecords.stream()
|
||||||
|
.filter(record -> "PURCHASING_GOLD_PROPS".equals(record.getOrigin()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
// 检查非PURCHASING_GOLD_PROPS类型的扣除天数记录
|
||||||
|
List<RunningWaterUserProps> deductionRecords = allRecords.stream()
|
||||||
|
.filter(record -> !"PURCHASING_GOLD_PROPS".equals(record.getOrigin()) && record.getDays() != null && record.getDays() < 0)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
if (CollectionUtils.isEmpty(purchasingRecords)) {
|
if (CollectionUtils.isEmpty(purchasingRecords)) {
|
||||||
log.debug("用户 {} 没有PURCHASING_GOLD_PROPS类型的流水记录,不符合赠送条件", userId);
|
log.debug("用户 {} 没有PURCHASING_GOLD_PROPS类型的流水记录,不符合赠送条件", userId);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否有有效的购买记录(在有效期内)
|
// 计算累计有效天数
|
||||||
for (RunningWaterUserProps record : purchasingRecords) {
|
LocalDateTime earliestValidTime = calculateEffectiveValidTime(purchasingRecords, deductionRecords, currentTime);
|
||||||
LocalDateTime createTime = record.getCreateTime().toLocalDateTime();
|
|
||||||
Integer days = record.getDays();
|
|
||||||
|
|
||||||
// days为-1表示永久有效
|
if (earliestValidTime == null) {
|
||||||
if (days != null && days == -1) {
|
log.debug("用户 {} 没有有效的购买记录或所有记录都已过期,不符合赠送条件", userId);
|
||||||
log.debug("用户 {} 有永久有效的购买记录,符合赠送条件", userId);
|
return false;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
log.debug("用户 {} 所有购买记录都已过期,不符合赠送条件", userId);
|
// 判断当前时间是否在有效期内
|
||||||
return false;
|
boolean isValid = currentTime.isBefore(earliestValidTime) || currentTime.isEqual(earliestValidTime);
|
||||||
|
|
||||||
|
log.debug("用户 {} 赠送条件检查结果: {}, 当前时间: {}, 有效期截止时间: {}",
|
||||||
|
userId, isValid ? "符合" : "不符合", currentTime, earliestValidTime);
|
||||||
|
|
||||||
|
return isValid;
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("检查用户 {} 赠送资格时发生异常: {}", userId, e.getMessage(), e);
|
log.error("检查用户 {} 赠送资格时发生异常: {}", userId, e.getMessage(), e);
|
||||||
@ -368,6 +373,73 @@ public class DailyTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算用户的有效期截止时间
|
||||||
|
* 根据购买记录和扣除记录,结合时间顺序累计计算有效期
|
||||||
|
*/
|
||||||
|
private LocalDateTime calculateEffectiveValidTime(List<RunningWaterUserProps> purchasingRecords,
|
||||||
|
List<RunningWaterUserProps> 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) {
|
private void sendFanVotesReward(String code, String sysOrigin) {
|
||||||
|
|
||||||
List<RoomFanVotesActivityCount> votesCounts = roomFanVotesActivityCountService
|
List<RoomFanVotesActivityCount> votesCounts = roomFanVotesActivityCountService
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user