本卡屬 FR-150(母卡見上方連結),第 ① 棒:後端全部。做完用 curl 就能列出候選任務、寄出提醒、在通知紀錄看到手動列。FE 卡依賴本卡。

這一棒在做什麼(白話)

讓後端能回答兩件事:「這個專案本輪有哪些未完成任務、各自該催誰、上次手動催是什麼時候」,以及「PM 勾了這幾張,幫我寄提醒信、寫紀錄、在卡上留言」。自動到期提醒的行為不能變。

資料(一支主線 migration)

scripts/sql/2026-10-xx-fr150-task-alert-triggered-by.sql
ALTER TABLE compliance.task_alert_notifications ADD COLUMN IF NOT EXISTS triggered_by varchar(64);
COMMENT ON COLUMN ... IS '手動觸發者 login_name;排程自動寄的為 NULL';

端點(新 route 放 api/task_alert/routes/,route 不碰 DB)

GET  /project/<project_uid>/job-due-reminder/candidates
POST /project/<project_uid>/job-due-reminder   body {job_uids: [1..200], message: 可空 ≤500}

service

新檔 app/task_alert/service/manual_job_due_reminder_service.py,list_candidates 與 send 兩個 public method 都 @transaction。DI 在 di_containers/ 的 task_alert container wiring。