|
|
@@ -274,6 +274,23 @@ HealthMealController.create(record)
|
|
|
返回任务列表 → 刷新 → 进度 1/1,任务自动完成 ✅
|
|
|
```
|
|
|
|
|
|
+## 完成逻辑分支矩阵
|
|
|
+
|
|
|
+判定入口统一在打卡 Controller 的 `create()` 挂钩中,依据两个条件分流:**①是否带 `taskId`;②(若带)反查 `tasks` 表得到的任务真实类型**。
|
|
|
+
|
|
|
+| taskId 参数 | 反查任务类型 | isBackfill | 调用方法 | 效果 |
|
|
|
+|:---:|:---|:---:|:---|:---|
|
|
|
+| 无 | —(不反查) | 0 | `updateProgress(userId, taskKey, 1)` | 累计今日对应 `taskKey` 的每日任务进度,无匹配任务则 `log.warn` 跳过 |
|
|
|
+| 无 | —(不反查) | 1 | 无 | 补打不回写,仅入库 |
|
|
|
+| 有 | `isDailyProgress=1`(每日进度型) | 0 | `updateProgress(userId, taskKey, 1)` | 累计进度,`progress >= target_value` 时自动完成并发奖 |
|
|
|
+| 有 | `isDailyProgress=1`(每日进度型) | 1 | 无 | 补打不回写 |
|
|
|
+| 有 | 一次性任务(`actionType` ∈ {diet,sleep,exercise} 且非每日进度型) | 0 | `completeTask(taskId, memberId, photoUrl, content, "text")` | 直接完成任务,发任务积分 |
|
|
|
+| 有 | 一次性任务 | 1 | 无 | 补打不回写 |
|
|
|
+| 有 | 任务不存在 / px已删除 | 0 | 无 | 打卡正常入库,仅 `log.warn` |
|
|
|
+| 有 | 已由其他打卡完成(status=completed) | 0 | `completeTask` 内部校验拒绝 | 打卡正常,任务状态不变,前端仅提示"打卡成功" |
|
|
|
+
|
|
|
+**关键约定**:分流以**任务真实类型**为准,而非依赖前端是否正确携带 `taskId`;错误处理统一 `try-catch`,不阻断打卡主流程与积分发放。
|
|
|
+
|
|
|
## 边界情况与错误处理
|
|
|
|
|
|
| 场景 | 行为 |
|