游戏王修复

This commit is contained in:
tianfeng 2026-03-28 18:26:27 +08:00
parent c8007f3551
commit 79e476dfd1

View File

@ -18,16 +18,11 @@ import com.red.circle.other.inner.model.cmd.material.GivePropsBackpackCmd;
import com.red.circle.other.inner.model.dto.activity.props.ActivityRewardPropsDTO; import com.red.circle.other.inner.model.dto.activity.props.ActivityRewardPropsDTO;
import com.red.circle.other.inner.model.dto.sys.ActivityConfigDTO; import com.red.circle.other.inner.model.dto.sys.ActivityConfigDTO;
import com.red.circle.tool.core.collection.CollectionUtils; import com.red.circle.tool.core.collection.CollectionUtils;
import com.red.circle.tool.core.date.DateFormatConstant;
import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils;
import com.red.circle.tool.core.date.ZonedDateTimeUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.DayOfWeek;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -51,12 +46,14 @@ public class RankingRewardGrantCmdExe {
/** /**
* 处理排名奖励变化. * 处理排名奖励变化.
* 通过 cycleKey 变化检测周切换而非精确时间点判断避免边界值导致的道具多发/漏收问题.
*/ */
public void execute(String activityType, String origin, String cycleKey, public void execute(String activityType, String origin, String cycleKey,
String templateId, List<RankingUserData> currentRankingUsers, String templateId, List<RankingUserData> currentRankingUsers,
ActivityConfigVO activityConfig) { ActivityConfigVO activityConfig) {
RankingRewardSnapshot lastSnapshot = snapshotService.getLatestSnapshot(activityType, origin, isWeeklyReset() ? getLastWeekDate() : cycleKey); // 获取最新快照不限 cycleKey用于跨周期对比
RankingRewardSnapshot lastSnapshot = snapshotService.getLatestSnapshot(activityType, origin, cycleKey);
Map<Integer, RankingUserData> currentRankMap = currentRankingUsers.stream() Map<Integer, RankingUserData> currentRankMap = currentRankingUsers.stream()
.collect(Collectors.toMap(RankingUserData::getRank, u -> u)); .collect(Collectors.toMap(RankingUserData::getRank, u -> u));
@ -67,16 +64,21 @@ public class RankingRewardGrantCmdExe {
.collect(Collectors.toMap(RankingRewardSnapshot.RankingUserSnapshot::getUserId, u -> u)); .collect(Collectors.toMap(RankingRewardSnapshot.RankingUserSnapshot::getUserId, u -> u));
} }
// 检查是否为星期一0点(活动重置时间) // 通过 cycleKey 变化检测周切换而不是依赖精确的周一0点时间判断
if (isWeeklyReset()) { boolean isNewCycle = lastSnapshot != null
log.info("星期一0点活动重置收回所有用户道具"); && !cycleKey.equals(lastSnapshot.getCycleKey());
if (isNewCycle) {
log.info("检测到周期切换, 旧cycleKey: {}, 新cycleKey: {}, 收回所有旧奖励",
lastSnapshot.getCycleKey(), cycleKey);
revokeAllUserRewards(lastUserMap); revokeAllUserRewards(lastUserMap);
// 收回后清空 lastUserMap避免 processRewardChanges 用旧数据重复对比
return; lastUserMap = new HashMap<>();
} }
processRewardChanges(currentRankMap, lastUserMap, activityConfig); processRewardChanges(currentRankMap, lastUserMap, activityConfig);
// 始终保存快照确保下次执行有正确的对比基准
saveNewSnapshot(activityType, origin, cycleKey, templateId, currentRankingUsers, activityConfig); saveNewSnapshot(activityType, origin, cycleKey, templateId, currentRankingUsers, activityConfig);
} }
@ -114,19 +116,6 @@ public class RankingRewardGrantCmdExe {
} }
} }
/**
* 判断是否为星期一0点(活动重置时间).
*/
private boolean isWeeklyReset() {
LocalDateTime now = ZonedDateTimeAsiaRiyadhUtils.now().toLocalDateTime();
return now.getDayOfWeek() == DayOfWeek.MONDAY && now.getHour() == 0 && now.getMinute() == 0;
}
private String getLastWeekDate() {
return ZonedDateTimeUtils.format(ZonedDateTimeAsiaRiyadhUtils.getLastWeekMonday(),
DateFormatConstant.yyyyMMdd);
}
/** /**
* 收回所有用户的奖励(星期一重置). * 收回所有用户的奖励(星期一重置).