Bläddra i källkod

feat(task): 三个Controller补isDailyProgress二次分流、前端三个打卡页+tasks.vue透传taskId

iwt 1 vecka sedan
förälder
incheckning
cabf0ef5a4

+ 16 - 8
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthExerciseController.java

@@ -92,18 +92,26 @@ public class HealthExerciseController {
         // ===== 任务回写挂钩 =====
         try {
             if (record.getTaskId() != null) {
-                // 一次性任务:直接完成
                 Task linkedTask = taskMapper.selectById(record.getTaskId());
                 if (linkedTask != null) {
-                    taskService.completeTask(
-                            record.getTaskId(),
-                            record.getMemberId(),
-                            record.getPhotoUrls() != null ? record.getPhotoUrls() : "",
-                            record.getRemark() != null ? record.getRemark() : "运动打卡",
-                            "text");
+                    if (linkedTask.getIsDailyProgress() != null && linkedTask.getIsDailyProgress() == 1) {
+                        // 每日进度型任务:累计进度(taskKey=EXERCISE)
+                        com.etotem.cfc.entity.FamilyMember fm = familyMemberMapper.selectById(record.getMemberId());
+                        if (fm != null && fm.getUserId() != null) {
+                            taskService.updateProgress(fm.getUserId(), "EXERCISE", 1);
+                        }
+                    } else {
+                        // 一次性任务:直接完成
+                        taskService.completeTask(
+                                record.getTaskId(),
+                                record.getMemberId(),
+                                record.getPhotoUrls() != null ? record.getPhotoUrls() : "",
+                                record.getRemark() != null ? record.getRemark() : "运动打卡",
+                                "text");
+                    }
                 }
             } else {
-                // 每日进度型任务:累计进度
+                // 未带 taskId:累计今日每日运动打卡任务进度(无则 log.warn 跳过)
                 com.etotem.cfc.entity.FamilyMember fm = familyMemberMapper.selectById(record.getMemberId());
                 if (fm != null && fm.getUserId() != null) {
                     taskService.updateProgress(fm.getUserId(), "EXERCISE", 1);

+ 16 - 7
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthMealController.java

@@ -254,15 +254,24 @@ public class HealthMealController {
                 if (record.getTaskId() != null) {
                     Task linkedTask = taskMapper.selectById(record.getTaskId());
                     if (linkedTask != null) {
-                        taskService.completeTask(
-                                record.getTaskId(),
-                                record.getMemberId(),
-                                record.getPhotoUrls(),
-                                record.getRemark(),
-                                "text");
+                        if (linkedTask.getIsDailyProgress() != null && linkedTask.getIsDailyProgress() == 1) {
+                            // 每日进度型任务:累计进度(taskKey=DIET)
+                            com.etotem.cfc.entity.FamilyMember fm = familyMemberMapper.selectById(record.getMemberId());
+                            if (fm != null && fm.getUserId() != null) {
+                                taskService.updateProgress(fm.getUserId(), "DIET", 1);
+                            }
+                        } else {
+                            // 一次性任务:直接完成
+                            taskService.completeTask(
+                                    record.getTaskId(),
+                                    record.getMemberId(),
+                                    record.getPhotoUrls(),
+                                    record.getRemark(),
+                                    "text");
+                        }
                     }
                 } else {
-                    // 每日进度型任务:累计进度
+                    // 未带 taskId:仍累计今日每日打卡任务进度(无则 log.warn 跳过)
                     com.etotem.cfc.entity.FamilyMember fm = familyMemberMapper.selectById(record.getMemberId());
                     if (fm != null && fm.getUserId() != null) {
                         taskService.updateProgress(fm.getUserId(), "DIET", 1);

+ 16 - 7
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthSleepController.java

@@ -72,15 +72,24 @@ public class HealthSleepController {
             if (record.getTaskId() != null) {
                 Task linkedTask = taskMapper.selectById(record.getTaskId());
                 if (linkedTask != null) {
-                    taskService.completeTask(
-                            record.getTaskId(),
-                            record.getMemberId(),
-                            "",
-                            record.getRemark() != null ? record.getRemark() : "睡眠打卡",
-                            "text");
+                    if (linkedTask.getIsDailyProgress() != null && linkedTask.getIsDailyProgress() == 1) {
+                        // 每日进度型任务:累计进度(taskKey=SLEEP)
+                        com.etotem.cfc.entity.FamilyMember fm = familyMemberMapper.selectById(record.getMemberId());
+                        if (fm != null && fm.getUserId() != null) {
+                            taskService.updateProgress(fm.getUserId(), "SLEEP", 1);
+                        }
+                    } else {
+                        // 一次性任务:直接完成
+                        taskService.completeTask(
+                                record.getTaskId(),
+                                record.getMemberId(),
+                                "",
+                                record.getRemark() != null ? record.getRemark() : "睡眠打卡",
+                                "text");
+                    }
                 }
             } else {
-                // 每日进度型任务:累计进度
+                // 未带 taskId:累计今日每日睡眠打卡任务进度(无则 log.warn 跳过)
                 com.etotem.cfc.entity.FamilyMember fm = familyMemberMapper.selectById(record.getMemberId());
                 if (fm != null && fm.getUserId() != null) {
                     taskService.updateProgress(fm.getUserId(), "SLEEP", 1);

+ 4 - 1
cfc-frontend/pages/growth/diet-checkin.vue

@@ -169,6 +169,7 @@ export default {
   data() {
     return {
       memberId: null,
+      taskId: null,
       submitting: false,
       pendingSubmit: false,
       isRecording: false,
@@ -206,6 +207,7 @@ export default {
     }
   },
     onLoad: function(options) {
+    this.taskId = options.taskId || null
     this.todayText = this.getToday()
     this.setShareInfo('我在用浠艾福记录孩子的每日饮食,一起来打卡吧', '/pages/growth/diet-checkin')
     var role = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
@@ -449,6 +451,7 @@ export default {
           method: 'POST',
           data: {
             memberId: self.memberId,
+            taskId: self.taskId || undefined,
             mealType: self.form.mealType,
             foodItems: self.form.foodItems || '',
             remark: self.form.remark || '',
@@ -462,7 +465,7 @@ export default {
 success: function(res) {
               self.submitting = false
               if (res.data && res.data.code === 200) {
-                uni.showToast({ title: '打卡成功', icon: 'success' })
+                uni.showToast({ title: self.taskId ? '打卡成功,任务已完成' : '打卡成功', icon: 'success' })
                 setTimeout(function() {
                   uni.navigateBack()
                 }, 800)

+ 5 - 2
cfc-frontend/pages/growth/exercise-checkin.vue

@@ -161,6 +161,7 @@ export default {
   data() {
     return {
       memberId: null,
+      taskId: null,
       isSelfCheckin: false,
       submitting: false,
       pendingSubmit: false,
@@ -206,7 +207,8 @@ export default {
       return '录音 ' + this.recordSeconds + '秒'
     }
   },
-  onLoad: function() {
+  onLoad: function(options) {
+    this.taskId = options.taskId || null
     this.todayText = this.getToday()
     var role = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
     if (role !== 'child') {
@@ -445,6 +447,7 @@ export default {
           method: 'POST',
           data: {
             memberId: self.memberId,
+            taskId: self.taskId || undefined,
             exerciseType: self.form.exerciseType,
             durationMinutes: self.form.durationMinutes ? parseInt(self.form.durationMinutes) : null,
             intensity: self.form.intensity,
@@ -458,7 +461,7 @@ export default {
           header: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token },
           success: function(res) {
             if (res.data && res.data.code === 200) {
-              uni.showToast({ title: '打卡成功', icon: 'success' })
+              uni.showToast({ title: self.taskId ? '打卡成功,任务已完成' : '打卡成功', icon: 'success' })
               self.syncedStepText = ''
               setTimeout(function() {
                 uni.navigateBack()

+ 5 - 2
cfc-frontend/pages/growth/sleep-checkin.vue

@@ -96,6 +96,7 @@ export default {
   data() {
     return {
       memberId: null,
+      taskId: null,
       submitting: false,
       history: [],
       todayText: '',
@@ -107,7 +108,8 @@ export default {
       }
     }
   },
-  onLoad: function() {
+  onLoad: function(options) {
+    this.taskId = options.taskId || null
     this.todayText = this.getToday()
     var role = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || 'parent'
     if (role !== 'child') {
@@ -165,6 +167,7 @@ export default {
           method: 'POST',
           data: {
             memberId: self.memberId,
+            taskId: self.taskId || undefined,
             sleepTime: self.form.sleepTime,
             wakeTime: self.form.wakeTime,
             durationMinutes: duration,
@@ -175,7 +178,7 @@ export default {
           success: function(res) {
               self.submitting = false
               if (res.data && res.data.code === 200) {
-                uni.showToast({ title: '打卡成功', icon: 'success' })
+                uni.showToast({ title: self.taskId ? '打卡成功,任务已完成' : '打卡成功', icon: 'success' })
                 setTimeout(function() {
                   uni.navigateBack()
                 }, 800)

+ 9 - 0
cfc-frontend/pages/tasks/tasks.vue

@@ -420,6 +420,9 @@ export default {
       if (at === 'article') return '去阅读'
       if (at === 'activity') return '去报名'
       if (at === 'cart' || at === 'order') return '去购物'
+      if (at === 'diet') return '去打卡'
+      if (at === 'sleep') return '去打卡'
+      if (at === 'exercise') return '去打卡'
       return '完成'
     },
     /** 统一任务动作入口:开始/联动跳转/填写/直接完成 */
@@ -477,6 +480,12 @@ export default {
         uni.navigateTo({ url: '/pages/activity/list?taskId=' + taskId })
       } else if (at === 'cart' || at === 'order') {
         uni.navigateTo({ url: '/pages/shop/cart?taskId=' + taskId })
+      } else if (at === 'diet') {
+        uni.navigateTo({ url: '/pages/growth/diet-checkin?taskId=' + taskId })
+      } else if (at === 'sleep') {
+        uni.navigateTo({ url: '/pages/growth/sleep-checkin?taskId=' + taskId })
+      } else if (at === 'exercise') {
+        uni.navigateTo({ url: '/pages/growth/exercise-checkin?taskId=' + taskId })
       }
     },
     closeInputModal() {