動作
Bug #1327
進行中[Bug] 後台療程日誌留言可能被 null 覆蓋或未實際儲存(MIA 6/8 營養師回覆不見)
開始日期:
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,可能造成「營養師留言不見 / 看起來沒回覆」:
-
Partial update payload 可能把既有留言覆蓋成 null
- CourseAdminServiceImpl.updateCourseDiary() 會一次比對 diet/water/exercise/weight/sleep/defecate 六類 comment。
- 若前端只送某一類留言,其他欄位為 null,而 DB 原本其他類別已有 comment,StringUtils.equals(existing, null) 會判定不同,接著呼叫對應 updateComment(..., null, ...)。
- 結果:未出現在 payload 的舊留言可能被清空。
-
當日該類 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 可能沒有任何留言被存入。
-
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
建議修復方向¶
- ReqUpdateCourseDiary 區分「欄位未送」與「使用者刻意清空」,避免 partial update 把未送欄位寫成 null。
- Repository updateComment 改回傳 affected row count,若 0 rows 則應建立該類 record 或回報明確錯誤。
- CourseCommentHint 只在 DB 寫入成功後設定。
- 補整合測試:
- 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 之附件。
檔案
動作