Forráskód Böngészése

第三方接口调整提交代码

liuchengsen 1 hónapja
szülő
commit
76cd11e027

+ 1 - 1
zhijiayun-activity/src/main/java/com/xuekairui/activity/dto/CheckInPeriodStatsResponse.java

@@ -31,7 +31,7 @@ public class CheckInPeriodStatsResponse {
     /** 周期状态:PENDING/ACTIVE/CLOSED */
     private String status;
 
-    /** 周期模式:FRI_THU/MON_SUN */
+    /** 周期模式:FRI_THU(周五~下周四) / MON_SUN(周一~周日),均7天一周期 */
     private String cycleMode;
 
     /** 需签到天数 */

+ 1 - 1
zhijiayun-activity/src/main/java/com/xuekairui/activity/entity/CheckInConfig.java

@@ -42,7 +42,7 @@ public class CheckInConfig {
     @Builder.Default
     private String rewardLevel = "PRO";
 
-    /** 周期模式(默认值,新建周期时使用):FRI_THU / MON_SUN */
+    /** 周期模式(默认值,新建周期时使用):FRI_THU(周五~下周四) / MON_SUN(周一~周日) */
     @Builder.Default
     private String cycleMode = "FRI_THU";
 

+ 1 - 1
zhijiayun-activity/src/main/java/com/xuekairui/activity/entity/CheckInPeriod.java

@@ -30,7 +30,7 @@ public class CheckInPeriod {
     /** 周期名称,如"第1周(7/10~7/16)" */
     private String periodName;
 
-    /** 周期模式:FRI_THU(周五~下周四) / MON_SUN(周一~周日) / WEEKLY(自然周) */
+    /** 周期模式:FRI_THU(周五~下周四) / MON_SUN(周一~周日) */
     private String cycleMode;
 
     /** 周期起始日 */

+ 4 - 0
zhijiayun-activity/src/main/java/com/xuekairui/activity/mapper/CheckInPeriodMapper.java

@@ -18,4 +18,8 @@ public interface CheckInPeriodMapper extends BaseMapper<CheckInPeriod> {
     /** 查询最近一个已结束的周期(按日期动态判断,不依赖静态 status) */
     @Select("SELECT * FROM t_checkin_period WHERE end_date < #{date} ORDER BY end_date DESC LIMIT 1")
     CheckInPeriod findLastClosedByDate(@Param("date") LocalDate date);
+
+    /** 按起止日期精确查询周期(用于 upsert 判断) */
+    @Select("SELECT * FROM t_checkin_period WHERE start_date = #{startDate} AND end_date = #{endDate} LIMIT 1")
+    CheckInPeriod findByDateRange(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
 }

+ 37 - 18
zhijiayun-activity/src/main/java/com/xuekairui/activity/service/CheckInConfigService.java

@@ -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++;

+ 27 - 9
zhijiayun-activity/src/main/resources/mapper/CheckInRecordMapper.xml

@@ -74,16 +74,34 @@
           AND checkin_date &lt;= #{endDate}
     </select>
 
-    <!-- 运营端:统计指定周期内达标的用户数(累计模式) -->
+    <!-- 运营端:统计指定周期内达标的用户数(按 rewardMode 区分累计/连续) -->
     <select id="countReachedUsersByPeriod" resultType="java.lang.Long">
-        SELECT COUNT(*) FROM (
-            SELECT user_id, COUNT(*) as checkin_count
-            FROM t_checkin_record
-            WHERE checkin_date &gt;= #{startDate}
-              AND checkin_date &lt;= #{endDate}
-            GROUP BY user_id
-            HAVING checkin_count &gt;= #{requiredDays}
-        ) t
+        <choose>
+            <when test="rewardMode == 'CONSECUTIVE'">
+                SELECT COUNT(DISTINCT t2.user_id) FROM (
+                    SELECT user_id, COUNT(*) as consec_days
+                    FROM (
+                        SELECT user_id, checkin_date,
+                               DATE_SUB(checkin_date, INTERVAL ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY checkin_date) DAY) AS grp
+                        FROM t_checkin_record
+                        WHERE checkin_date &gt;= #{startDate}
+                          AND checkin_date &lt;= #{endDate}
+                    ) t1
+                    GROUP BY user_id, grp
+                    HAVING COUNT(*) &gt;= #{requiredDays}
+                ) t2
+            </when>
+            <otherwise>
+                SELECT COUNT(*) FROM (
+                    SELECT user_id, COUNT(*) as checkin_count
+                    FROM t_checkin_record
+                    WHERE checkin_date &gt;= #{startDate}
+                      AND checkin_date &lt;= #{endDate}
+                    GROUP BY user_id
+                    HAVING checkin_count &gt;= #{requiredDays}
+                ) t
+            </otherwise>
+        </choose>
     </select>
 
 </mapper>