|
|
@@ -33,8 +33,8 @@ public class CheckInConfigService {
|
|
|
|
|
|
/** 周期模式 → 周期起始星期映射(当前支持两种周期类型) */
|
|
|
private static final Map<String, DayOfWeek> PERIOD_START_DAY = Map.of(
|
|
|
- "FRI_THU", DayOfWeek.FRIDAY,
|
|
|
- "MON_SUN", DayOfWeek.MONDAY
|
|
|
+ "FRI_THU", DayOfWeek.FRIDAY, // 周五到下周四
|
|
|
+ "MON_SUN", DayOfWeek.MONDAY // 周一到周日
|
|
|
);
|
|
|
|
|
|
private final CheckInConfigMapper checkinConfigMapper;
|
|
|
@@ -160,9 +160,10 @@ public class CheckInConfigService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 在指定时间范围内生成周期
|
|
|
+ * 在指定时间范围内生成周期(upsert:已有则更新,无则插入)
|
|
|
* <p>根据周期模式(FRI_THU / MON_SUN)定位每个周期的起始星期,每个周期固定7天。
|
|
|
* 第一个周期从活动开始日所在周的周期起始星期开始(用 previousOrSame 回溯到本周起始日,避免漏掉当前周期)。
|
|
|
+ * 已存在同日期范围的周期时更新字段而非重复插入,保留已有签到数据。
|
|
|
*/
|
|
|
private void generatePeriodsInRange(LocalDate start, LocalDate end, String cycleMode, CheckInConfig config) {
|
|
|
DayOfWeek periodStartDay = PERIOD_START_DAY.getOrDefault(cycleMode.toUpperCase(), DayOfWeek.MONDAY);
|
|
|
@@ -175,22 +176,40 @@ public class CheckInConfigService {
|
|
|
periodEnd = end;
|
|
|
}
|
|
|
|
|
|
- CheckInPeriod period = CheckInPeriod.builder()
|
|
|
- .periodName("第" + periodIndex + "周期(" + periodStart.getMonthValue() + "/" + periodStart.getDayOfMonth()
|
|
|
- + "~" + periodEnd.getMonthValue() + "/" + periodEnd.getDayOfMonth() + ")")
|
|
|
- .cycleMode(cycleMode)
|
|
|
- .startDate(periodStart)
|
|
|
- .endDate(periodEnd)
|
|
|
- .requiredDays(config.getRequiredDays())
|
|
|
- .rewardMode(orDefault(config.getRewardMode(), "CUMULATIVE"))
|
|
|
- .rewardDays(config.getRewardDays())
|
|
|
- .rewardLevel(orDefault(config.getRewardLevel(), "PRO"))
|
|
|
- .status(determineStatus(periodStart, periodEnd))
|
|
|
- .sort(periodIndex)
|
|
|
- .build();
|
|
|
+ String periodName = "第" + periodIndex + "周期(" + periodStart.getMonthValue() + "/" + periodStart.getDayOfMonth()
|
|
|
+ + "~" + periodEnd.getMonthValue() + "/" + periodEnd.getDayOfMonth() + ")";
|
|
|
|
|
|
- periodMapper.insert(period);
|
|
|
- log.info("自动生成周期: {} {}~{}", period.getPeriodName(), periodStart, periodEnd);
|
|
|
+ // 查询是否已存在同日期范围的周期
|
|
|
+ CheckInPeriod existing = periodMapper.findByDateRange(periodStart, periodEnd);
|
|
|
+ if (existing != null) {
|
|
|
+ // 已有周期 → 更新字段(保留签到数据)
|
|
|
+ existing.setPeriodName(periodName);
|
|
|
+ existing.setCycleMode(cycleMode);
|
|
|
+ existing.setRequiredDays(config.getRequiredDays());
|
|
|
+ existing.setRewardMode(orDefault(config.getRewardMode(), "CUMULATIVE"));
|
|
|
+ existing.setRewardDays(config.getRewardDays());
|
|
|
+ existing.setRewardLevel(orDefault(config.getRewardLevel(), "PRO"));
|
|
|
+ existing.setStatus(determineStatus(periodStart, periodEnd));
|
|
|
+ existing.setSort(periodIndex);
|
|
|
+ periodMapper.updateById(existing);
|
|
|
+ log.info("更新已有周期: {} {}~{}", periodName, periodStart, periodEnd);
|
|
|
+ } else {
|
|
|
+ // 无周期 → 插入新周期
|
|
|
+ CheckInPeriod period = CheckInPeriod.builder()
|
|
|
+ .periodName(periodName)
|
|
|
+ .cycleMode(cycleMode)
|
|
|
+ .startDate(periodStart)
|
|
|
+ .endDate(periodEnd)
|
|
|
+ .requiredDays(config.getRequiredDays())
|
|
|
+ .rewardMode(orDefault(config.getRewardMode(), "CUMULATIVE"))
|
|
|
+ .rewardDays(config.getRewardDays())
|
|
|
+ .rewardLevel(orDefault(config.getRewardLevel(), "PRO"))
|
|
|
+ .status(determineStatus(periodStart, periodEnd))
|
|
|
+ .sort(periodIndex)
|
|
|
+ .build();
|
|
|
+ periodMapper.insert(period);
|
|
|
+ log.info("自动生成周期: {} {}~{}", periodName, periodStart, periodEnd);
|
|
|
+ }
|
|
|
|
|
|
periodStart = periodStart.plusWeeks(1);
|
|
|
periodIndex++;
|