專案

一般

配置概況

Bug #1327

是由 陳國瑋約 2 個月 前更新

## 客戶回報 
 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) comment, 會判定不同,接著呼叫對應 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 ,course 、date 、 有內容,但 waterComment/exerciseComment/weightComment/sleepComment/defecateComment    都是 null。 
 - 這類 payload 形態正好符合「更新單一類別留言時,其他類別 null 可能清掉既有值」的風險。 
 - A2604025 在 log 中可推到 course C0002730;A2605041 ;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 目前先開單追蹤,尚未進行修復。

返回