| 項目 | 內容 |
|---|---|
| 範圍 | 專案規劃頁(ProjectPlanningView)任務指派接 v2 + 控制項實作資料帶出 + 階段推進 + UI 清理 |
| BE branch | feature/oscal-refactor(未切 branch、未 push) |
| FE branch | feature/oscal-refactor |
| 驗收前置 | ① 重啟 BE ② FE reload ③ 用「新建專案」測(舊專案無 per-AO job、不適用) |
| 備註 | 夜間作業期間 Anthropic classifier 服務多次中斷,部分編輯延後重試完成;所有變更已落地,未 push |
app/oscal/service/ssp_control_implementation_service.py::get_control_tree
je.id、we.uid,並 LEFT JOIN compliance.task_assignees + public.users,每個 job 回 assignees(user_uid/user_name/login_name/is_approver/role)。workflow_template_uid(cloned 流程範本 uid)+ workflow_execution_uid(BPMN 編輯器用,見 #7)。infra/grc/repository/grc_job_repo_impl.py::update_job(原 2A dark return None → v2 重建)
job_executions(name/description/guide/job_type)。task_assignees:task_id = job_executions.id、task_uid = je.uid、task_template_id = je.template_job_id、project_id 用 Project.uid 解析(同既有 resolve_project_id pattern)、control_id = 0 sentinel(v2 prep-job 無對應 OSCAL int control;(project_id, task_id, user_id) 已唯一;控制歸屬可由 job→workflow_execution→wecm 回推,讀路徑 control-tree 即如此)。compliance-manager-fe/.../ProjectPlanningView.vue
fetchTree 改吃 GET /ssp/<sspUid>/control-tree,把內嵌 jobs(含 assignees)直接灌進 taskMap、configured_job_count 由 jobs 推導、jobsLoadedSet 標記後舊 fetchAOJobs(dark /jobs/list)自動 no-op。fetchUsersMenu 指派人下拉改吃專案參與人員(CONTROL_PARTICIPANT_MENU 已 dark 回空)。saveTask 經 PUT /grc/.../job/<je.uid> 走 #2 的 v2 寫入(payload 已帶 job uid + assignees)。workflow_template_uid + workflow_execution_uid(見 #1)。fetchTree AO mapping 改讀 a.workflow_template_uid / a.workflow_execution_uid → BPMN 按鈕 v-if 條件成立即顯示,openBpmnEditor 已用這兩欄。ProjectPlanningView.vue::executeQuickConfig / openQuickConfigDialog
POST /task-assignees/batch(task_assignee_service.batch_add 已 2A dark return [])不沿用。PUT /grc/.../job/<uid>。零 BE 改動、複用已驗證的 #2。PROJECT_PARTICIPANT_MENU 舊路徑已 dark)。ProjectPlanningView.vue 移除:群組層 manage 按鈕 + 參與人員列、控制項層 manage 按鈕 + 參與人員列、ParticipantsPanel Sidebar。
openParticipants / handleParticipantSave / handleParticipantUpdate / canManageGroupParticipants / canManageControlParticipants / ParticipantsPanel import 等變成未使用的死碼,本次保留未刪(Vite build 不受影響;夜間 classifier 不穩,避免多餘編輯)。日後可清。project_start._init_ssp_control_implementations:新專案只建控制項層 IR(implementation-status=unknown),不建 AO 層 statement → control-tree 對 AO 回 ssp_implementation_status=None / description=None。AO 的實作狀態 / 現況描述對新專案本來就空,是給使用者在規劃階段填的(已修成 round planning 可編輯)。_generate_prep_jobs 在新專案建(start_project step 7b)。舊專案(舊單一 template、part.props 未回填)不會有。job_executions=10253、task_assignees=14435(資料是有的)。launch_audit handler 已註冊(register_stage_hooks_to_registry 實際 register,wrap audit_round_app_service);RoundPrepTasksDoneCheck.check 回 ok()(lenient 不擋);stage_advance_service 已 round-scoped;launch_audit 實作完整(snapshot living SSP→round.ssp_id、status→audit_planning)。flow_template_domain_service / workflow_template_snapshot_service / workflow_execution_service)已 wire;_create_first_round 有把 flow_template_uid 傳進 create_round;建專案頁 flowTemplateUid 為必填。workflow_execution_uid 為 NULL → Banner _resolve_workflow_context 無 workflow 可解 → 推進按鈕無法運作。flow_templates=12(範本有);但最新資源庫(module_frame 426「亞航CMMC導入計劃」)audit_flow_template_uid 為空(fallback (c) 不可用)。SELECT workflow_execution_uid FROM compliance.project_audit_rounds WHERE ... 是否有值 → 進規劃頁看 Banner 能否「啟動稽核」推進到 audit_planning。
_bind_round_main_workflow 綁定失敗(FE 送的 flow template uid 與 flow_templates.uid 對不上,或 master get_by_uid 回 None),需再修;可先 grep log/app.log 找 create_round ... bound / flow-binding warning 定位。audit_flow_template_uid 預設(讓 fallback (c) 生效)。重啟 BE + FE reload,建新專案(選資源庫 + 流程範本),進規劃頁「控制項實作」tab:
app/oscal/service/ssp_control_implementation_service.py、infra/grc/repository/grc_job_repo_impl.py(+ pyproject.toml dev path-dep 不 commit)。src/views/project/ProjectPlanningView.vue、src/views/project/ProjectAuditorOverview.vue、src/config/router/index.js。ssp_control_implementation_service / grc_job_repo_impl / job_service / api.grc.routes.job_route)。job_export_query / job_import_lookup 仍 dark)— user 指定後階段處理。