|
|
@@ -12,6 +12,89 @@
|
|
|
|
|
|
---
|
|
|
|
|
|
+## ⚠️ 执行状态盘点与增量任务(2026-10-14 对照代码核对)
|
|
|
+
|
|
|
+> 下方任务 1-9 为原始计划(2026-10-13 编写)。2026-10-14 对照当前代码逐项核对后:**任务 1/2/5/6/7 已完成落地**(实体 taskId 字段、Task/DTO 注释、RepeatTaskGenerator 生成、tasks.vue 分支、三打卡页 taskId 透传均已存在于代码中)。**仍有以下缺口未闭环**,执行者只需完成增量任务 A-D 即可:
|
|
|
+
|
|
|
+| 核对项 | 代码位置 | 状态 |
|
|
|
+|---|---|---|
|
|
|
+| 三实体 `taskId`(`@TableField(exist=false)`) | HealthMealRecord.java:57、HealthSleepRecord.java:41、HealthExerciseRecord.java:36 | ✅ 已完成 |
|
|
|
+| Task/CreateTaskDTO 注释含 diet/sleep/exercise | Task.java:130、CreateTaskDTO.java:66 | ✅ 已完成 |
|
|
|
+| RepeatTaskGenerator 内置打卡任务生成 | RepeatTaskGenerator.java:40-45,152,164-215 | ✅ 已完成(幂等,每日生成 [DIET]/[SLEEP]/[EXERCISE]) |
|
|
|
+| tasks.vue `getActionLabel`/`navigateByAction` 三分支 | tasks.vue:413-427,465-490 | ✅ 已完成 |
|
|
|
+| 三打卡页 onLoad/taskId 透传 | diet-checkin.vue:172,209; sleep-checkin.vue:99,111; exercise-checkin.vue:164,210 | ✅ 已完成 |
|
|
|
+| Controller 回写挂钩 **isDailyProgress 二次分流** | 三 Controller create() | ❌ **缺失**:当前 taskId≠null 时无条件走 completeTask,未按 spec 决策3 分流每日进度型任务 |
|
|
|
+| API_REFERENCE meal/sleep create 条目 | API_REFERENCE.md 4.7 节 | ❌ **缺失**(仅 exercise 有条目且未提 taskId) |
|
|
|
+| PROJECT-OVERVIEW 状态 | PROJECT-OVERVIEW.md:7 | ❌ 仍标"设计已提交" |
|
|
|
+
|
|
|
+**无 DDL 变更**:actionType 为 VARCHAR(32) 天然支持新值;taskId 非持久化;无需 DatabaseInitializer 迁移。
|
|
|
+
|
|
|
+### 增量任务 A:三 Controller 回写挂钩加 isDailyProgress 二次分流
|
|
|
+
|
|
|
+**文件:**
|
|
|
+- `cfc-backend/src/main/java/com/etotem/cfc/controller/HealthMealController.java:250-274`
|
|
|
+- `cfc-backend/src/main/java/com/etotem/cfc/controller/HealthSleepController.java:70-91`
|
|
|
+- `cfc-backend/src/main/java/com/etotem/cfc/controller/HealthExerciseController.java:92-114`
|
|
|
+
|
|
|
+三个 Controller 现有 try 块统一改为(以 Meal 为例;Sleep 的 taskKey 用 `SLEEP`、photoUrls 传 `""`、remark 兜底 `"睡眠打卡"`;Exercise 的 taskKey 用 `EXERCISE`、remark 兜底 `"运动打卡"`):
|
|
|
+
|
|
|
+```java
|
|
|
+// 分流规则(spec 决策3):taskId 指向的任务若为每日进度型(is_daily_progress=1) → updateProgress;
|
|
|
+// 一次性任务 → completeTask;不传 taskId → updateProgress 累计今日进度
|
|
|
+Task linkedTask = record.getTaskId() != null ? taskMapper.selectById(record.getTaskId()) : null;
|
|
|
+if (linkedTask != null && (linkedTask.getIsDailyProgress() == null || linkedTask.getIsDailyProgress() == 0)) {
|
|
|
+ // 一次性任务:直接完成
|
|
|
+ taskService.completeTask(record.getTaskId(), record.getMemberId(), record.getPhotoUrls(), record.getRemark(), "text");
|
|
|
+} else {
|
|
|
+ // 每日进度型任务(含未传 taskId):累计进度
|
|
|
+ com.etotem.cfc.entity.FamilyMember fm = familyMemberMapper.selectById(record.getMemberId());
|
|
|
+ if (fm != null && fm.getUserId() != null) {
|
|
|
+ taskService.updateProgress(fm.getUserId(), "DIET", 1); // Sleep→"SLEEP",Exercise→"EXERCISE"
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+- Meal 保留外层 `if (!isBackfill)` 补打守卫;Sleep/Exercise 实体无 isBackfill 字段,**不要**新增该字段或守卫。
|
|
|
+- [ ] 步骤:三文件改完 → `cd cfc-backend && mvn clean compile` → `BUILD SUCCESS` → commit:`feat(health): 打卡回写支持每日进度型任务二次分流(is_daily_progress=1 走 updateProgress)`
|
|
|
+
|
|
|
+### 增量任务 B:API_REFERENCE.md 补记 meal/sleep create
|
|
|
+
|
|
|
+**文件:** `docs/superpowers/api/API_REFERENCE.md:588`(exercise create 行附近)
|
|
|
+
|
|
|
+在 `POST /api/health/exercise/create` 行下方插入,并将 exercise 行改写为含 taskId 说明:
|
|
|
+
|
|
|
+```markdown
|
|
|
+| `POST /api/health/meal/create` | 创建饮食打卡(支持补打 `recordDate+isBackfill`;可带 `taskId` 联动任务——一次性任务打卡即完成,每日任务(is_daily_progress=1, taskKey=DIET)累计进度;补打不触发任务回写与积分) |
|
|
|
+| `POST /api/health/sleep/create` | 创建睡眠打卡(可带 `taskId` 联动任务,规则同 meal/create;无补打概念) |
|
|
|
+| `POST /api/health/exercise/create` | 创建运动打卡(支持 stepCount 微信步数;可带 `taskId` 联动任务,规则同 meal/create;无补打概念) |
|
|
|
+```
|
|
|
+
|
|
|
+- [ ] 步骤:改完 → `grep -n 'health/meal/create' docs/superpowers/api/API_REFERENCE.md` 命中 → commit:`docs(api): 补记 health/meal/create 与 health/sleep/create,exercise 补 taskId 说明`
|
|
|
+
|
|
|
+### 增量任务 C:PROJECT-OVERVIEW.md 状态更新
|
|
|
+
|
|
|
+**文件:** `docs/superpowers/PROJECT-OVERVIEW.md:7`
|
|
|
+
|
|
|
+将 `(📐 设计已提交,见 ...)` 改为 `(✅ 已实现,specs/ + plans/2026-10-13-health-checkin-task-linkage.md:方案B双轨...)`。
|
|
|
+
|
|
|
+- [ ] 步骤:改完 → commit:`docs: 打卡接入任务链路实现完成,更新 PROJECT-OVERVIEW 状态`
|
|
|
+
|
|
|
+### 增量任务 D:全量验证(同任务 9)
|
|
|
+
|
|
|
+- [ ] `cd cfc-backend && mvn clean compile` → BUILD SUCCESS
|
|
|
+- [ ] 前端语法校验:对 tasks.vue + 三打卡页提取 `<script>` 块 `node --check`
|
|
|
+- [ ] `cd cfc-frontend && node scripts/audit-duplicate-api-calls.js` → 退出码 0
|
|
|
+
|
|
|
+### 增量联调清单(人工)
|
|
|
+
|
|
|
+1. 一次性任务(actionType=diet)→ 打卡 → 任务 completed + 发积分
|
|
|
+2. `[DIET]饮食打卡` 每日任务 → 不带 taskId 打卡 → 进度 1/1 自动完成
|
|
|
+3. **核心回归点**:从任务列表点击每日任务(带 taskId 且 is_daily_progress=1)→ 打卡 → 验证走 updateProgress 而非 completeTask(增量任务 A 的修复点)
|
|
|
+4. 补打(isBackfill=1)→ 不触发任务回写、不发积分
|
|
|
+5. 睡眠/运动不带 taskId 打卡 → 对应每日任务正常累计
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
## 文件结构
|
|
|
|
|
|
| 文件 | 操作 | 职责 |
|