退回任務允許使用者將已完成的任務(COMPLETED)重新設為進行中(PROCESSING),並將後續任務狀態還原,以便重新執行。
can_revert_job呼叫 GET /api/1.0/grc/project/{project_uid}/job/{job_uid} 時,response 內含 can_revert_job: bool。
前提條件:
- job.status == "COMPLETED"
- job 的 template_job_id 存在且可在 BPMN XML 中找到對應節點
單 task 流程(Start → A → End):
- 一律 can_revert_job = true
多 task 流程(Start → A → B → C → End):
┌──────────────────────────────────────────────────────────────────┐
│ 情境 │ can_revert_job │
├──────────────────────────────────────────────────────────────────┤
│ 此 task 是最後一個(無下一個 XML job) │ │
│ 且 workflow.status == COMPLETED │ true │
│ 且 workflow.status != COMPLETED │ false │
├──────────────────────────────────────────────────────────────────┤
│ 此 task 是第一個(無前一個 task) │ │
│ 且下一個 job_execution = PROCESSING │ true(允許退第一個) │
│ 且下一個 job_execution != PROCESSING │ false │
├──────────────────────────────────────────────────────────────────┤
│ 此 task 是中間 task │ │
│ 且下一個 job_execution = PROCESSING │ true │
│ 且下一個 job_execution != PROCESSING │ false │
└──────────────────────────────────────────────────────────────────┘
核心規則:can_revert_job = true 代表此 task 是目前流程中「最後一個完成的任務」(即緊鄰在當前 PROCESSING 任務之前),或者是流程最後一個 task 且整個流程已完成。
流程:Start → A → B → C → End
| A | B | C | Workflow | A.can_revert | B.can_revert | C.can_revert |
|---|---|---|---|---|---|---|
| PROCESSING | TODO | TODO | PROCESSING | ❌ | ❌ | ❌ |
| COMPLETED | PROCESSING | TODO | PROCESSING | ✅ | ❌ | ❌ |
| COMPLETED | COMPLETED | PROCESSING | PROCESSING | ❌ | ✅ | ❌ |
| COMPLETED | COMPLETED | COMPLETED | COMPLETED | ❌ | ❌ | ✅ |
POST /api/1.0/flow-engine/task/revert/{id}
| Key | Value |
|---|---|
Authorization |
Bearer <token> |
| 參數 | 型別 | 說明 |
|---|---|---|
id |
string | 目前呼叫退回的 job 的 template_job_id(即發起退回動作的 PROCESSING job) |
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
workflow_execution_uid |
string | ✅ | 該 AO 對應的 workflow execution UID |
revert_to_job_id |
string | ✅ | 要退回到的目標 job 的 template_job_id |
comment |
string | 退回原因(可空字串) |
template_job_id對應GET /api/1.0/grc/project/{project_uid}/job/{job_uid}response 中的template_job_id欄位。
{
"workflow_execution_uid": "wf-exec-uuid-...",
"revert_to_job_id": "Activity_a1b2c3d4",
"comment": "資料有誤,需重新填寫"
}{
"status": true,
"data": true
}執行退回時,後端依序完成以下操作:
revert_to_job_id 對應的 job_execution,將 status 改為 PROCESSING,清除 end_timeactionType == "survey"),同步將關聯問卷狀態設回 EDITING{id} 對應的 job_execution,將 status 改為 TODO,清除 end_timejob_id != revert_to_job_id 時執行(避免退回自身時重複處理)revert_to_job_id 之後的所有 jobs(reset_jobs)reset_job 的 job_execution.status 改為 TODOcomment 寫入發起 job 與目標 job 的 element_variable(name="comment")assessment_plan_task.status 更新為 IN_PROGRESS退回前:Start → A(COMPLETED) → B(PROCESSING) → C(TODO) → End
退回後:Start → A(PROCESSING) → B(TODO) → C(TODO) → End
API 呼叫:
POST /api/1.0/flow-engine/task/revert/{B.template_job_id}
{
"workflow_execution_uid": "...",
"revert_to_job_id": "{A.template_job_id}",
"comment": "退回原因"
}
退回前:Start → A(COMPLETED) → B(COMPLETED) → C(PROCESSING) → End
退回後:Start → A(COMPLETED) → B(PROCESSING) → C(TODO) → End
API 呼叫:
POST /api/1.0/flow-engine/task/revert/{C.template_job_id}
{
"workflow_execution_uid": "...",
"revert_to_job_id": "{B.template_job_id}",
"comment": "退回原因"
}
退回前:Start → A(COMPLETED) → B(COMPLETED) → C(COMPLETED) → End [workflow=COMPLETED]
退回後:Start → A(COMPLETED) → B(COMPLETED) → C(PROCESSING) → End [workflow=PROCESSING]
API 呼叫:
POST /api/1.0/flow-engine/task/revert/{C.template_job_id}
{
"workflow_execution_uid": "...",
"revert_to_job_id": "{C.template_job_id}",
"comment": "退回原因"
}
流程完成狀態下退回最後一個 task 時,URL
{id}與revert_to_job_id均填入 C 的template_job_id。
GET /api/1.0/grc/project/{project_uid}/job/{job_uid} 的 can_revert_job 決定是否顯示退回按鈕comment)revert_to_job_id 填入目標 job 的 template_job_id(通常為上一個 COMPLETED job;若為流程完成退回自身,則填入自身的 template_job_id){id} 填入當前 PROCESSING job 的 template_job_id;若退回最後一個(流程已完成),填入 C 自身的 template_job_idworkflow_execution_uid 可從 My Jobs list API(POST /api/1.0/grc/jobs/my/list)的 workflow_execution_uid 欄位取得| 資訊 | 取得來源 | 欄位 |
|---|---|---|
template_job_id |
GET /api/1.0/grc/project/{project_uid}/job/{job_uid} |
template_job_id |
can_revert_job |
GET /api/1.0/grc/project/{project_uid}/job/{job_uid} |
can_revert_job |
workflow_execution_uid |
POST /api/1.0/grc/jobs/my/list |
workflow_execution_uid |