本卡屬 FR-143,第 5 棒:修現行退卡只重開最新一站的問題(D10/D12)。依賴第 1 棒的 task 形狀。
一個任務是一條流程,可能有好幾站(證據上傳 → 主管檢核 → 顧問檢核)。現在內稽退卡只把「最新那一站」改回進行中:三站都做完時重開的是顧問檢核,負責補證據的人打開看到自己那站已完成、不能改,顧問被叫去檢核還沒補的證據。DEV 現有 6 筆退卡紀錄全是單站流程,所以沒被測出來。決策者裁:每個任務退回第一站整條重跑;PM 設的到期日寫進該任務每一站;指派人改成執行人員。
首腦核對:
app/flow_control/service/not_met_job_redo_service.py:103 _redo_one:pick_latest(get_job_executions(workflow_execution_id, template_id)) 取最新一站 → reopen_job_execution。compliance.job_executions 流程 79310 三站(80007 收證據、80206 主管檢核、80207 顧問檢核)同一 workflow_execution_id,due_at 只在站層,compliance.workflow_executions 沒有期限欄。app/flow_engine/service/workflow_execution_service.py:787 revert_job 會重開目標站並把後續站改 TODO,但帶 assert_job_operator 與 _assert_round_not_frozen_for_workflow 守門,系統退卡呼叫會被擋。app/flow_control/service/not_met_job_redo_service.py:48 redo_not_met_jobs(讀 earliest_milestone_dates/milestones_by_control → 第 1 棒改回逐 task)
app/flow_control/service/not_met_job_redo_service.py:103 _redo_one(pick_latest 只重開最新站)
app/flow_engine/service/job_reopen.py reopen_job_execution(單站重開,可沿用)
app/flow_engine/service/workflow_execution_service.py:787 revert_job(參考後續站改 TODO 的寫法,不直接呼叫)
app/flow_control/service/job_due_date_service.py due_at_from_milestone_date(台北 23:59:59)
app/flow_control/service/not_met_redo_comment.py build_redo_comment(系統留言)
pkg/jedi-compliance-audit/.../audit_round_app_service.py:543 launch_reverify(覆核輪產新任務;918 行超標)
app/flow_control/service/reverify_inheritance_service.py 覆核輪承襲指派人(clone_assignees)
compliance.task_assignees 指派人(多人;保留 is_approver)
app/flow_control/service/job_restart_service.py:restart_from_first_station(workflow_execution_id, due_date, assignee_user_ids, advice, pass_id, curr_user, operator)。步驟:取該流程全部站(get_latest_station_jobs),用 BPMN(BpmnUtils(we.workflow_template_xml))找起始站;起始站 reopen_job_execution(進行中、清 end_time、通知);其餘站 status=TODO、end_time=None;流程 status=PROCESSING;每一站 due_at=due_at_from_milestone_date(due_date)、due_at_manual=False;task_assignees 改成 assignee_user_ids(DELETE+INSERT,沿用既有 is_approver 值,寫法照 job_import_service.py:491-520);每站寫一筆 job_execution_redo_log;系統留言一則(build_redo_comment,內容帶改善措施)。caller 在 @transaction 內。redo_not_met_jobs 改成:讀第 1 棒的逐 task 清單 [{job_uid, target_date, assignee_user_ids, advice}],逐筆呼叫 ①;不再依 control_id 找流程。_redo_one 與 earliest_milestone_dates 舊用法退役。launch_reverify(超標,新開 pkg/jedi-compliance-audit/.../reverify_task_due_service.py 或主專案 reverify_inheritance_service.py 加一段):新任務建好後,依母輪 POA&M 的逐 task 清單,把對應流程的每一站 due_at 與指派人寫成計畫值(新任務本來就從第一站開始,不用重跑)。先查再寫:後續站改 TODO 的寫法 revert_job:842-860 可抄;指派人改寫 job_import_service 已有;留言 build_redo_comment 已有;不新增表。
test/,新測試放同目錄(app service 測試難寫時用 domain service 層測)。due_at=到期日 23:59:59、task_assignees 等於執行人員、卡上有系統留言;「我的任務」第一站顯示到期日、執行人員收到通知。due_at 與指派人照計畫。