我的任務(My Tasks,受稽方執行)
功能群:稽核執行|輪次狀態機與 AP→AR→POA&M 資料模型先讀 功能群總覽
事實基準:2026-07-05 從 FE / BE code 掃出(FR-038 v2 + 證據蒐集任務執行);API schema 逐條對照
api/grc/serializers/job.py、api/grc/serializers/job_batch_complete.py與app/participant/service/task_assignee_service.py
1. 功能描述
我的任務是受稽方執行人員的跨專案任務收件匣:列出當前使用者被指派的證據蒐集任務(prep-job,由專案規劃頁的任務指派 + 開始執行任務產生),提供上傳證據 / 填問卷 / 留言 / 完成任務的執行面。與 AP/AR/POA&M 頁不同,本頁不綁單一輪次階段,而是以任務狀態(TODO / PROCESSING / COMPLETED)為 gate,跨所有專案彙整當前使用者的待辦。
主要使用者:任務被指派人(assignee,受稽方);覆核人(reviewer / is_approver)另有退回權。
角色速覽(本頁角色是任務層,不是專案層的 manager/auditor/viewer):
| 角色 | 一句話 |
|---|---|
| assignee | 任務被指派人 — 受稽方,執行任務、上傳證據、完成 |
| reviewer | 覆核人(is_approver)— 可退回任務要求補件 |
任務的來源與文案真相在專案規劃頁的 prep-job(BPMN userTask 衍生,見 專案規劃頁);本頁是其執行下游。PM 在規劃頁「開始執行任務」把任務 TODO→PROCESSING 後,任務才出現在受稽方的收件匣可執行。
1.1 功能總覽(本頁全部功能)
| # | 功能 | 說明 | 位置 | 詳述 |
|---|---|---|---|---|
| 1 | 任務清單(分頁 / 排序) | 跨專案彙整當前使用者被指派任務;欄:專案 / 群組·控制項 / AO / 任務名 / 類型 / 狀態 | 左清單面板(55%) | §6.2 |
| 2 | 關鍵字搜尋 | 任務名關鍵字 | 清單工具列 | §6.2 |
| 3 | 狀態篩選 | 全部 / TODO / PROCESSING / COMPLETED(預設 PROCESSING) | 清單工具列 | §4 |
| 4 | 專案篩選 | 依專案下拉過濾 | 清單工具列 | §6.1 |
| 5 | 批次完成 | 多選可完成任務一鍵批次完成(逐專案分送) | 清單工具列(選取後出現) | UC-MT-02 |
| 6 | 任務明細抽屜 | 點列開右抽屜(45%):描述 / 指南 / 指派 / 部門 / 設備 / 問卷 / 證據 / 連結 / 留言 | 右抽屜 JobExecutionDrawer |
UC-MT-01 |
| 7 | 上傳檔案證據 | 拖放 / 瀏覽上傳檔案(FILE 證據),可預覽 / 刪除 | 抽屜證據區 | UC-MT-01 |
| 8 | 新增 / 編輯連結證據 | 標題 + URL(LINK 證據)增改刪 | 抽屜連結區 | UC-MT-03 |
| 9 | 填問卷 | 開問卷填寫頁(survey-v2-fill,新分頁);狀態顯示(0 TODO…9 完成) | 抽屜問卷區 | §11 |
| 10 | 留言 | 任務留言增改刪(作者本人可改刪) | 抽屜留言區 | UC-MT-04 |
| 11 | 完成任務 | 就緒後完成(general 需 ≥1 證據;survey 需全問卷完成) | 抽屜底部按鈕 | UC-MT-01 |
| 12 | 退回任務 | 覆核人(reviewer)退回任務(需理由) | 抽屜底部按鈕(reviewer 模式) | UC-MT-05 |
UC(§2)展開本頁所有具實質後端寫入邏輯的功能:單任務執行完成(含上傳 FILE 證據,1/7/11)、批次完成(5)、連結證據增改刪(8)、任務留言(10)、覆核人退回(12)。純顯示 / 導覽類(1 清單、2 搜尋、3/4 篩選)見 §5 / §6.2;填問卷(9)另有所屬頁面(開
survey-v2-fill新分頁填寫,本頁只顯示狀態並作為完成 gate,見 §11),於此只交叉連結不重複。
2. Use Case
角色速覽(本頁角色是任務層,不是專案層的 manager/auditor/viewer):
| 角色 | 一句話 |
|---|---|
| assignee | 任務被指派人 — 受稽方,執行任務、上傳證據、完成 |
| reviewer | 覆核人(is_approver)— 可退回任務要求補件 |
流程圖視覺慣例:菱形 = 判斷、橘底 = 例外/擋下、紅框 = 錯誤(標 error code)、綠框 = 成功終點、虛線 = 可選路徑。
UC-MT-01 執行並完成單一任務
| 項目 | 內容 |
|---|---|
| 角色 | assignee |
| 前置條件 | 任務狀態 = PROCESSING(PM 已在規劃頁「開始執行任務」);為任務指派人 |
| 產出 / 後置條件 | 證據寫 compliance.job_evidences;就緒後 complete →
job_executions.status COMPLETED(走 flow-engine) |
UC-MT-02 批次完成任務
| 項目 | 內容 |
|---|---|
| 角色 | assignee |
| 前置條件 | 多個 PROCESSING 任務皆就緒(可完成才可勾選) |
| 產出 / 後置條件 | 逐專案分送批次完成;per-job 成功 / 失敗回報(NO_EVIDENCE / SURVEY_INCOMPLETE);統一批次通知 |
UC-MT-03 新增 / 編輯連結證據(LINK)
| 項目 | 內容 |
|---|---|
| 角色 | assignee |
| 前置條件 | 任務狀態 = PROCESSING 且為指派人(COMPLETED 唯讀) |
| 產出 / 後置條件 | compliance.job_evidences 新增 / 更新 / 刪除 LINK
型(標題 + URL);attachment_count 反映(general
就緒判定) |
UC-MT-04 任務留言增改刪
| 項目 | 內容 |
|---|---|
| 角色 | assignee(新增);留言作者本人(修改 / 刪除) |
| 前置條件 | 開任務明細抽屜留言區 |
| 產出 / 後置條件 | compliance.job_execution_comments 新增 / 更新 /
刪除;修改與刪除限作者本人 |
UC-MT-05 覆核人退回任務
| 項目 | 內容 |
|---|---|
| 角色 | reviewer(覆核人,isReviewer 由專案 participant
role=reviewer 決定,FE 判定顯示退回鈕) |
| 前置條件 | 覆核模式;填退回理由 |
| 產出 / 後置條件 | job_executions.status 回退 PROCESSING(走 flow-engine
revert,BPMN userTask 回退) |
3. 權限矩陣
本頁以「任務指派關係」為權限基礎(非專案層角色):
| 操作 | FE 判定 | BE 強制 | BE 檢查位置 |
|---|---|---|---|
| 讀我的任務清單 | 登入即可(清單本身即過濾成當前使用者) | 以 user_id 查使用者任務佇列(僅回自己被指派的) |
app/participant/service/task_assignee_service.py::list_my_grc_jobs |
| 上傳證據 / 留言 / 完成 | 任務在 PROCESSING 且為指派人 | 走 job / flow-engine service(任務層) | app/grc/service/job_* |
| 退回任務 | isReviewer(專案 participant role=reviewer,FE
判定) |
flow-engine revert | flow-engine |
| 批次完成 | 只勾選 canComplete() 的任務 |
per-job 就緒複驗(NO_EVIDENCE / SURVEY_INCOMPLETE) | app/grc/service/job_batch_complete_service.py:30 |
本頁清單天然過濾成「當前使用者被指派」,故無專案角色守門;權限邊界在「任務是否指派給你」+「任務狀態是否 PROCESSING」。退回權(reviewer)是 FE 依專案 participant role 顯示。
4. 狀態機與前置條件
本頁 gate 是任務狀態(不是輪次階段):
TODO ──(PM 於規劃頁「開始執行任務」)──▶ PROCESSING ──(assignee 完成 / 批次完成)──▶ COMPLETED
▲ │
└────(reviewer 退回)────┘
| 條件 | 效果 | 出處 |
|---|---|---|
| 預設狀態篩選 = PROCESSING | 進頁先看進行中任務(TODO 尚未啟動不顯示) | MyTasksView.vue(mount 設 statusFilter) |
status === 'PROCESSING' |
可上傳 / 留言 / 完成 | FE canComplete/canEdit |
status === 'COMPLETED' |
抽屜唯讀(可看不可改) | FE |
| general 任務就緒 | attachment_count > 0(≥1 檔案 / 連結) |
FE canComplete |
| survey 任務就緒 | 所有 task_surveys.status === 9(全完成) |
FE canComplete |
輪次階段與本頁的關係:prep-job 在規劃期(planning)建立、PM「開始執行任務」啟動;受稽方在此執行。任務完成度回饋規劃頁的「證據蒐集執行進度卡」(見 專案規劃頁 §10)。
5. UI 設計
版面骨架與區塊職責(左清單 + 右分割抽屜;body 加
page-fullscreen
讓抽屜獨立捲動;彩色區塊可點跳對應小節錨點,API 僅標代表性):
實機截圖(STG,亮色模式,2026-07-05,帳號 blsadmin):


批次完成 dialog 截圖從缺:勾選框僅在任務已上傳至少 1 份證據(
attachment_count > 0)時才會啟用(見MyTasksView.vue::canComplete),2026-07-05 盤點 STG 目前所有任務證據數皆為 0,暫無可勾選資料;上傳證據屬寫入動作,不在本次唯讀截圖範圍內。
狀態呈現:任務狀態徽章(TODO/PROCESSING/COMPLETED);可完成任務才可勾選(否則
checkbox disabled 帶原因 tooltip);無 socket,動作後重取清單 /
明細。URL ?job=<uid> /
?execution=<uid> 可深鏈自動開任務(進頁後清
URL)。
6. API 規格
Envelope:成功 {"code": 1, "data": …}、失敗
{"code": 0, "msg": "…"}。分頁列表回
PageDataDto(meta + data)。
6.1 總清單(本頁呼叫的全部 endpoint)
| 分類 | Method + Path | 說明 | 完整規格 |
|---|---|---|---|
| 載入 | POST /grc/jobs/my/list |
我的任務分頁清單(filters 7 欄,見 §6.2) | §6.2 |
| 載入 | GET /grc/jobs/my/projects/menu |
專案篩選下拉 | GAI-SD-02 |
| 明細 | GET /grc/project/{project_uid}/job/{job_uid} |
任務明細(指派 / 部門 / 設備 / 問卷 / can_revert_job) | §6.3 |
| 證據 | GET /job-evidences?job_execution_uid={job_uid} |
任務證據(FILE / LINK) | GAI-SD-02 |
| 證據 | POST /job-evidences(FILE)・POST
/job-evidence(LINK)・PUT/DELETE
/job-evidence/{uid} |
證據增改刪 | GAI-SD-02 |
| 留言 | GET/POST
/grc/job-executions/{job_uid}/comments、PUT/DELETE
/grc/job/comment/{uid} |
任務留言 | GAI-SD-02 |
| 完成 | POST /flow-engine/task/complete/{template_job_id} |
單任務完成(走 BPMN) | GAI-SD-02 |
| 退回 | POST /flow-engine/task/revert/{template_job_id} |
覆核人退回任務 | GAI-SD-02 |
| 批次 | POST
/grc/project/{project_uid}/jobs/batch-complete |
批次完成(逐專案分送) | §6.4 |
| 問卷 | GET /task-survey/{task_survey_uid}、POST
/task-assignees |
問卷角色檢查 | GAI-SD-02 |
以下 §6.2~6.4 為核心 endpoint 完整規格(欄位逐條對照 serializer / service 組裝碼,出處標在各段末)。
6.2 我的任務清單
[POST] /grc/jobs/my/list
Request(MyJobListRequestSchema,繼承
RequestMetaSchema):
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
| pager | object | 是 | {page, page_size, with_total} |
| sort | array | 否 | 排序條件 |
| filters | object | 否 | MyJobFiltersSchema 共 7 欄皆選填:keyword
/ status / exclude_status /
project_uid / group_keyword /
control_code /
ao_keyword(api/grc/serializers/job.py:192-202;UI
常用前三項,其餘供跨群 / 控制項篩選) |
Response
data(MyJobResponseSchema,每項):
| 欄位 | 型別 | 說明 |
|---|---|---|
| id | string | 任務 uid |
| name / job_type / status | string | 任務名 / general·survey / TODO·PROCESSING·COMPLETED |
| project_uid / project_name | string | 所屬專案 |
| control_group_* / control_* / ao_* | string | 群組 / 控制項 / AO 定位 |
| workflow_execution_uid | string | BPMN 執行實體 |
| attachment_count | int | 證據數(general 就緒判定) |
| survey_completed | bool | 問卷全完成(survey 就緒判定) |
出處:serializer
api/grc/serializers/job.py:205(Request)/
:210(Response);service
app/participant/service/task_assignee_service.py:269(list_my_grc_jobs:查使用者任務佇列
→ 補 attachment_count / survey_completed)
6.3 任務明細
[GET] /grc/project/{project_uid}/job/{job_uid}
Response
data(JobDetailResponseSchema):
| 欄位 | 型別 | 說明 |
|---|---|---|
| id | string | 任務 uid |
| name | string | 任務名 |
| description | string | 任務描述 |
| guide | string | 任務指南 |
| job_type | string | general / survey |
| status | string | TODO / PROCESSING / COMPLETED |
| template_job_id | string | BPMN 範本 userTask id |
| can_revert_job | bool | 是否可退回 |
| workflow_execution_uid | string | BPMN 執行實體 |
| assignees | array | 每項 {id, name, avatar, is_approver} |
| departments | array | 部門關聯 |
| devices | array | 設備關聯 |
| surveys | array | 每項
{id, name, question_count, source_survey_uid, snapshot_uid, approval_required, task_surveys[{task_survey_uid, device_uid, device_name, status, approval_required}]} |
出處:api/grc/serializers/job.py:160
6.4 批次完成
[POST] /grc/project/{project_uid}/jobs/batch-complete
Request(BatchCompleteRequestSchema):
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
| job_uids | string[] | 是 | 要批次完成的任務 uid 陣列 |
| comment | string | 否 | 選填,預設 "" |
Response(BatchCompleteResponseSchema):
| 欄位 | 型別 | 說明 |
|---|---|---|
| total | int | 送出任務總數 |
| completed_count | int | 成功完成數 |
| failed_count | int | 失敗數 |
| results | array | 每項 {job_uid, success, error};error 為
NO_EVIDENCE / SURVEY_INCOMPLETE / 任務不存在 /
例外訊息 |
逐專案分送(FE 依 project 分組多次呼叫);per-job
suppress_notify,最後統一批次通知。出處:serializer
api/grc/serializers/job_batch_complete.py:5(Request)/
:16(Response);service
app/grc/service/job_batch_complete_service.py:30
7. 前端檔案地圖(compliance-manager-fe/)
| 檔案 | 角色 |
|---|---|
src/views/project/MyTasksView.vue |
主檢視(左清單 55% + 右抽屜 45%;搜尋 / 篩選 / 批次完成) |
src/components/grc/JobExecutionDrawer.vue |
任務明細抽屜(證據 / 連結 / 留言 CRUD、完成 / 退回) |
src/config/router/index.js:876-880 |
route project-my-tasks(path
/project/task-manage) |
| (留言輸入無獨立元件) | 留言 UI 內嵌於 JobExecutionDrawer.vue(約
:151-330),非 CommentInput.vue(該檔不存在) |
src/config/api/api.js |
端點常數 |
src/config/locales/i18n/{zh-tw,en}/my-tasks.json |
頁面 i18n(namespace lang.my_tasks.*) |
導覽入口:DashboardView「我的任務」區塊 / 「查看全部」→
router.push({name:'project-my-tasks', query:{job}});問卷開新分頁到survey-v2-fill。本頁不連 workflow-setup / workflow-view(那是 BPMN 範本編輯,屬另一群)。
8. 後端檔案地圖(本頁核心鏈路)
| 鏈路 | Route | App Service | 底層 |
|---|---|---|---|
| 我的任務清單 | api/grc/routes/job_route.py:212::MyJobListResource |
app/participant/service/task_assignee_service.py:269::list_my_grc_jobs(查佇列
+ 補 attachment_count / survey_completed) |
使用者任務佇列 view(依 task_assignees ×
job_executions)+ job_evidences count +
task_surveys 完成集 |
| 任務明細 | api/grc/routes/job_route.py:72::ProjectJobDetailResource |
app/grc/service/job_service.py::get_job |
job_executions + 關聯表 |
| 批次完成 | api/grc/routes/job_batch_complete_route.py:19::JobBatchCompleteRoute |
app/grc/service/job_batch_complete_service.py:30::batch_complete(per-job
就緒複驗 → flow-engine complete → 留言 → 統一通知) |
infra/grc/repository/job_batch_complete_query.py +
workflow service |
| 證據 / 留言 | job evidence / comment route | job_evidence_service /
job_comment_service |
job_evidences /
job_execution_comments |
DDD 提醒:清單走 app service(不在 route 查 DB);批次完成的就緒複驗在 service 層、每筆獨立成敗回報(不因一筆失敗整批 rollback)。
9. DB
9.1 資料表總清單(本頁讀寫的全部表)
| 表 | 讀/寫 | 說明 | 欄位詳述 |
|---|---|---|---|
| compliance.job_executions | 讀/寫(狀態) | 任務本體(prep-job):PROCESSING→COMPLETED | 見 project-planning §9.3 |
| compliance.task_assignees | 讀 | 任務指派人員(過濾成當前使用者) | 見 project-planning §9.3 |
| compliance.job_evidences | 寫 | 任務證據(FILE / LINK) | §9.3 |
| compliance.job_execution_comments | 寫 | 任務留言 | §9.3 |
| compliance.job_execution_devices / _org_units / _surveys | 讀 | 任務的設備 / 部門 / 問卷關聯(明細顯示) | GAI-SD-03 |
| survey.task_surveys | 讀 | 問卷執行狀態(就緒判定 status=9) | GAI-SD-03 |
| compliance.projects / project_participants | 讀 | 專案名 / reviewer 角色判定 | GAI-SD-03 |
清單讀取走「使用者任務佇列」查詢(
task_assigneesjoinjob_executions過濾 user_id),批次補job_evidences計數與task_surveys完成集。
9.3 核心表欄位(取自 DEV DB dump,含 DB comment)
compliance.job_evidences — 任務執行佐證資料
| 欄位 | 型別 | 說明 |
|---|---|---|
| uid | — | 證據識別 |
| job_execution_id | — | → job_executions(任務本體) |
| evidence_type | — | FILE(檔案)/ LINK(連結) |
| reference_url | — | LINK 型 URL |
| (檔案中繼) | — | 名稱 / 大小 / drive 參照等 |
compliance.job_execution_comments — 任務執行留言表
| 欄位 | 型別 | 說明 |
|---|---|---|
| job_execution_id | — | → job_executions |
| content | — | 留言內容 |
| (作者審計欄) | — | 作者 / 建立時間;作者本人可改刪 |
job_executions/task_assignees欄位卡見 專案規劃頁 §9.3(本頁不重複;那裡以寫入者視角、本頁以執行者視角讀寫同組表)。
10. 頁面邏輯與資料對應
載入時序:
關鍵欄位對應(畫面 ↔︎ API):
| 畫面元素 | FE state | API 欄位 |
|---|---|---|
| 任務狀態徽章 | job.status |
my/list status |
| 可完成(勾選) | canComplete(job) |
general: attachment_count>0;survey:
task_surveys 全 status=9 |
| 證據清單 | 抽屜 evidence | /job-evidences |
| 完成按鈕 | canCompleteJob |
flow-engine complete
{workflow_execution_uid, comment} |
| 批次結果 | 兩步 dialog | batch-complete results[{job_uid, success, error}] |
儲存流程:證據上傳 / 留言後重取明細;完成 / 退回走 flow-engine(BPMN 前進);批次完成逐專案分送、per-job 成敗獨立、最後統一通知。
錯誤對應:BE error envelope →
toast;GRC_JOB_NOT_FOUND(404)、GRC_PROJECT_PARTICIPANT_NOT_FOUND(404);批次錯誤碼
NO_EVIDENCE / SURVEY_INCOMPLETE(在
results[].error,非 GRC 碼,FE 對 i18n 顯示)。
11. 背景行為與外部依賴
| 類型 | 內容 |
|---|---|
| 通知 | 批次完成 per-job
suppress_notify、最後送一則批次摘要通知(threading) |
| BPMN | 完成 / 退回走 flow-engine/task/complete|revert(BPMN
userTask 前進 / 回退);prep-job 的 workflow_execution 由規劃期綁定 |
| 問卷 | survey 型任務開
survey-v2-fill(新分頁);task_surveys.status
追蹤(9=完成) |
| Socket | 本頁無 socket / 輪詢;動作後重取 |
| jedi-* 套件 | jedi-flow-engine(complete /
revert)、jedi-survey(問卷)、jedi-auth(JWT) |
| 系統參數 | 無 feature flag |
12. 邊界情況與已知坑
- 本頁 gate 是任務狀態不是輪次階段:TODO 未啟動不顯示;PROCESSING 才可執行;跨專案彙整,非單輪次頁
- 就緒條件按任務類型:general 需 ≥1 證據;survey 需全
task_surveysstatus=9;不就緒 checkbox disabled 帶原因 - 批次完成逐專案分送、per-job 獨立成敗:一筆失敗(NO_EVIDENCE / SURVEY_INCOMPLETE)不影響其他;結果摘要逐筆回報,非整批 rollback
- 全選只選當前分頁的可完成任務:不跨頁全選(防誤選未見任務)
- 退回權是 reviewer(FE
判定):
isReviewer由專案 participant role=reviewer 決定,只在覆核模式顯示退回 - 深鏈自動開任務:
?job=/?execution=進頁自動選任務後清 URL(避免連鎖導航) - 證據自成 FILE / LINK 兩型:FILE 走
/job-evidences(multipart)、LINK 走/job-evidence(FormData json);端點路徑單複數不同,改動注意 - 不連 workflow-setup / workflow-view:那是 BPMN 範本編輯頁(另一群),本頁任務執行走抽屜、非全頁導航
13. 開發與驗證
- 跑起來:BE
python main_socketio.py(port 8000,log 在log/app.log);FE 在compliance-manager-fe/起 Vite dev server。BE 改 service code 後必須重啟(無 hot reload) - 測試帳號:dev 環境被指派任務的受稽方帳號(密碼見
.env/ 部署文件) - 導航路徑:登入 → 儀表板「我的任務」或直接
/project/task-manage - 前置資料:需有專案在規劃頁指派任務給該帳號且 PM 已「開始執行任務」(任務 PROCESSING)
- E2E:
compliance-manager-test/repo(Cucumber + Playwright);以我的任務/my-tasks搜尋 - 相關文件:任務來源見 專案規劃頁;稽核員視角的清單見 我的稽核;DB / API 全量見 GAI-SD-02/03