|
|
@@ -10,7 +10,6 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
-import java.util.Arrays;
|
|
|
import java.util.Calendar;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
@@ -25,7 +24,6 @@ import com.etotem.cfc.config.DatabaseInitializer;
|
|
|
* - weekly: 每周生成(按模板 deadline 的星期几)
|
|
|
* - monthly: 每月生成(按模板 deadline 的日)
|
|
|
* 兼容旧版 repeat_type (none/daily/weekly):repeat_type=daily 等价 frequency=daily,weekly 等价 weekly
|
|
|
- * 额外:每日为能登录用户生成 3 条内置健康打卡任务([DIET]/[SLEEP]/[EXERCISE],is_daily_progress=1)
|
|
|
*/
|
|
|
@Slf4j
|
|
|
@Component
|
|
|
@@ -37,13 +35,6 @@ public class RepeatTaskGenerator {
|
|
|
@Resource
|
|
|
private FamilyMemberMapper familyMemberMapper;
|
|
|
|
|
|
- /** 内置健康打卡任务模板定义(title 前缀约定与 TaskService.updateProgress 的 taskKey 匹配一致) */
|
|
|
- private static final List<String[]> CHECKIN_TEMPLATES = Arrays.asList(
|
|
|
- new String[]{"[DIET]饮食打卡", "diet"},
|
|
|
- new String[]{"[SLEEP]睡眠打卡", "sleep"},
|
|
|
- new String[]{"[EXERCISE]运动打卡", "exercise"}
|
|
|
- );
|
|
|
-
|
|
|
/**
|
|
|
* 每小时第5分执行,按频率分派生成重复任务
|
|
|
*/
|
|
|
@@ -148,72 +139,11 @@ public class RepeatTaskGenerator {
|
|
|
}
|
|
|
log.info("每小时重复任务生成完成,处理{}个模板", hourlyTasks.size());
|
|
|
|
|
|
- // 6. 内置健康打卡任务([DIET]/[SLEEP]/[EXERCISE])——每日为能登录用户生成
|
|
|
- generateBuiltinCheckinTasks(today);
|
|
|
-
|
|
|
} catch (Exception e) {
|
|
|
log.error("生成重复任务失败", e);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 每日为所有能登录用户生成 3 条内置健康打卡任务(is_daily_progress=1)
|
|
|
- * title 前缀约定:[DIET]/[SLEEP]/[EXERCISE],与 TaskService.updateProgress 的 taskKey 匹配一致
|
|
|
- * 幂等:当天已有对应实例则跳过
|
|
|
- */
|
|
|
- private void generateBuiltinCheckinTasks(Date today) {
|
|
|
- Date tomorrow = new Date(today.getTime() + 86400000L);
|
|
|
- // 所有能登录用户(family_members.userId 非空)
|
|
|
- List<FamilyMember> members = familyMemberMapper.selectList(
|
|
|
- new LambdaQueryWrapper<FamilyMember>()
|
|
|
- .isNotNull(FamilyMember::getUserId)
|
|
|
- );
|
|
|
- int created = 0;
|
|
|
- for (FamilyMember member : members) {
|
|
|
- for (String[] tpl : CHECKIN_TEMPLATES) {
|
|
|
- String title = tpl[0];
|
|
|
- String actionType = tpl[1];
|
|
|
- Long exists = taskMapper.selectCount(
|
|
|
- new LambdaQueryWrapper<Task>()
|
|
|
- .eq(Task::getFamilyMemberId, member.getId())
|
|
|
- .eq(Task::getTitle, title)
|
|
|
- .eq(Task::getIsDailyProgress, 1)
|
|
|
- .ge(Task::getCreatedAt, today)
|
|
|
- .lt(Task::getCreatedAt, tomorrow)
|
|
|
- );
|
|
|
- if (exists != null && exists > 0) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- Task checkinTask = new Task();
|
|
|
- checkinTask.setFamilyId(member.getFamilyId());
|
|
|
- checkinTask.setFamilyMemberId(member.getId());
|
|
|
- checkinTask.setCreatorId(member.getUserId());
|
|
|
- checkinTask.setExecutorType("child");
|
|
|
- checkinTask.setExecutorId(member.getId());
|
|
|
- checkinTask.setMemberId(member.getId());
|
|
|
- checkinTask.setTitle(title);
|
|
|
- checkinTask.setDescription("每日健康打卡任务");
|
|
|
- checkinTask.setPoints(5);
|
|
|
- checkinTask.setCategory("健康打卡");
|
|
|
- checkinTask.setStatus("pending");
|
|
|
- checkinTask.setNeedReview(0);
|
|
|
- checkinTask.setIsTemplate(0);
|
|
|
- checkinTask.setIsDailyProgress(1);
|
|
|
- checkinTask.setTargetValue(1);
|
|
|
- checkinTask.setActionType(actionType);
|
|
|
- checkinTask.setMemberOnly(0);
|
|
|
- checkinTask.setSourceType("self");
|
|
|
- checkinTask.setCreatedAt(new Date());
|
|
|
- checkinTask.setUpdatedAt(new Date());
|
|
|
- taskMapper.insert(checkinTask);
|
|
|
- created++;
|
|
|
- }
|
|
|
- }
|
|
|
- if (created > 0) {
|
|
|
- log.info("内置健康打卡任务生成完成,新增{}条(覆盖{}个能登录用户)", created, members.size());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 隔天判定:模板创建时间到今天的间隔天数为偶数 → 今天生成
|
|
|
*/
|