專案

一般

配置概況

動作

Bug #1327

進行中

[Bug] 後台療程日誌留言可能被 null 覆蓋或未實際儲存(MIA 6/8 營養師回覆不見)

是由 陳國瑋約 2 個月 前加入. 於 約 2 個月 前更新.

狀態:
New
優先權:
High
被分派者:
開始日期:
2026-06-10
完成日期:
預估工時:

概述

客戶回報

2026-06-09 客戶回報 MIA 營養師 CASE 在 2026-06-08 有一週紀錄顯示營養師沒有回覆,但營養師確認當天都有回覆,且 6/8 早上有查看一次。

涉及個案:

  • A2604025 呂貞儀(代號記錄於 ss3a_member.line_name)
  • A2605041 謝志強(代號記錄於 ss3a_member.line_name)

使用者描述:莊美玲營養師表示 A2605041 這位在 6/8 白天也確定有留言回覆,但晚上查看時訊息不見。客戶問題是:能否判斷是不是沒有儲存到,或只有這一天異常。

初步調查結論(尚未修復)

目前從程式碼與 6/8 request log 初判,後台 /api/admin/course/diary/update 有兩個高風險 bug,可能造成「營養師留言不見 / 看起來沒回覆」:

  1. Partial update payload 可能把既有留言覆蓋成 null

    • CourseAdminServiceImpl.updateCourseDiary() 會一次比對 diet/water/exercise/weight/sleep/defecate 六類 comment。
    • 若前端只送某一類留言,其他欄位為 null,而 DB 原本其他類別已有 comment,StringUtils.equals(existing, null) 會判定不同,接著呼叫對應 updateComment(..., null, ...)。
    • 結果:未出現在 payload 的舊留言可能被清空。
  2. 當日該類 record 不存在時,native update 會 0 rows,但 service 仍當成功

    • 各 repository 的 updateComment 都是 UPDATE hm_course_* SET comment = ? WHERE course_id = ? AND record_date = ?。
    • 若當天該類 record 尚未建立,update 不會 insert,也沒有檢查 affected rows。
    • 結果:後台顯示「成功更新 CourseDiary」,但實際 DB 可能沒有任何留言被存入。
  3. comment hint 可能被設為 true,即使 comment 未真正寫入

    • service 在呼叫 repository update 後立即 hint.setXxx(true),沒有確認 update row count。
    • 結果:前/後台可能呈現有新留言提示,但查該日 record comment 時為空。

已看到的 log 線索

  • 2026-06-08 07:29:55 有 POST /api/admin/course/diary/update,course C0002832、date 2026-06-06、dietComment 有內容,但 waterComment/exerciseComment/weightComment/sleepComment/defecateComment 都是 null。
  • 這類 payload 形態正好符合「更新單一類別留言時,其他類別 null 可能清掉既有值」的風險。
  • A2604025 在 log 中可推到 course C0002730;A2605041 在 log 中可推到 course C0002892,但此對應需用 production DB 依 ss3a_member.line_name 再正式確認。

相關程式位置

  • java/src/main/java/com/crazysundiet/hm/admin/course/service/CourseAdminServiceImpl.java
    • updateCourseDiary() line around 357-422
  • java/src/main/java/com/crazysundiet/hm/repository/CourseRepository.java
    • getDiaryComment() native query line around 78-94
  • java/src/main/java/com/crazysundiet/hm/repository/CourseDietRecordRepository.java
  • java/src/main/java/com/crazysundiet/hm/repository/CourseWaterRecordRepository.java
  • java/src/main/java/com/crazysundiet/hm/repository/CourseExerciseRecordRepository.java
  • java/src/main/java/com/crazysundiet/hm/repository/CourseWeightRecordRepository.java
  • java/src/main/java/com/crazysundiet/hm/repository/CourseSleepRecordRepository.java
  • java/src/main/java/com/crazysundiet/hm/repository/CourseDefecateRecordRepository.java

建議修復方向

  1. ReqUpdateCourseDiary 區分「欄位未送」與「使用者刻意清空」,避免 partial update 把未送欄位寫成 null。
  2. Repository updateComment 改回傳 affected row count,若 0 rows 則應建立該類 record 或回報明確錯誤。
  3. CourseCommentHint 只在 DB 寫入成功後設定。
  4. 補整合測試:
    • DB 原本 waterComment 有值,只更新 dietComment,waterComment 不應被清空。
    • 當日 diet record 不存在時,留言更新不得假成功。
    • 清空留言需有明確 payload 語意。

待確認

  • 請用正式 production DB host 52.196.20.250 依 ss3a_member.line_name 查 A2604025 / A2605041 對應 course 與 2026-06-08 各 hm_course_* comment 實際狀態。
  • 本 issue 目前先開單追蹤,尚未進行修復。

客戶報告(附件)

  • 檔名issue-1327-client-brief.md
  • 版本:v1.1(2026-06-10 final)
  • 用途:給客戶/業主之修飾版報告(含本次檢查耗時 3.5 hr、預估修復工時 10.5 hr、7 節結構、個資處理依 spec.md §2.1)
  • 規格依循~/.openclaw/common-docs/client-report/spec.md

詳細內容請參見本 issue 之附件。


檔案

issue-1327-client-brief.md (4.94 KB) issue-1327-client-brief.md 陳國瑋, 2026-06-10 04:07
動作

匯出至 Atom PDF