手冊首頁 / 專案與任務 / 專案規劃頁

專案規劃頁(Project Planning)

功能群:專案管理|狀態機與共用概念先讀 功能群總覽

事實基準:2026-07-05 從 FE / BE code 掃出(FR-038 v2 round-based 架構)

變更紀錄:2026-07-06 FR-047 — 本頁改造成 hub 導航頁;重功能拆出獨立子頁(現況編輯 / 任務配置 / 批次維護 / 基本資訊),階段推進橫幅抽成共用元件。

1. 功能描述

專案規劃頁是稽核輪次 planning 階段的主工作區:受評方在啟動稽核前,於此完成 SSP 現況說明與證據蒐集任務的準備。編輯的是專案的 living SSP(見 _overview §4);launch-audit 推進後 SSP 凍結成快照,本頁轉唯讀。

本頁功能複雜、切成 6 個 Tab 與多組批次作業,故採 hub 模式:本頁描述版面骨架、區塊 inventory 與頁級共用底盤(左樹導覽、進度卡、載入鏈、共用 gate),每個重功能各自有 field-level 子頁(見 §1.1「詳述」欄)。快速定位「有幾塊、動哪塊碰哪支檔」看本頁;一個功能的逐欄細節開子頁。

主要使用者:專案經理(manager)、控制群組 / 控制項管理人、被指派填寫現況的人員。

角色速覽(完整定義與 manager 全域代行慣例見 _overview §3;流程圖中的「manager」皆指專案層 manager):

角色 一句話
manager 專案經理 — 輪次生命週期與批次動作的擁有者,可代行 auditor 的規劃寫入
auditor 稽核員 — 稽核規劃與判定的執行者
viewer 一般參與者 — 只能檢視

1.1 功能總覽(本頁全部功能)

# 功能 說明 位置 詳述(field-level 子頁)
1 控制項 / AO 現況編輯 逐項填實作狀態(5 種)+ 現況描述、備註,各自獨立儲存 Tab0 右面板 現況編輯
2 程序書上傳與關聯 上傳或從程序書池挑,關聯到控制項層 / AO 層 Tab0 右面板 現況編輯
3 樹導覽 / 搜尋 / 篩選 群組→控制項→AO 三層樹;關鍵字 + 完成度 / 狀態篩選 Tab0 左樹 本頁 §5/§10
4 任務檢視與編輯 AO 證據蒐集任務逐欄配置(指派 / 部門 / 設備 / 問卷) Tab0 AO 面板 任務配置與啟動
5 快速配置 多選人員一鍵併入所有可編輯任務 Header 按鈕 任務配置與啟動
6 開始執行任務 PM 把已指派任務批次轉 PROCESSING + 通知 Header 按鈕(限 PM) 任務配置與啟動
7 SSP 現況 Excel 匯出 / 匯入 三步驗證管線批次維護現況 批次維護選單 批次維護
8 任務配置 Excel 匯出 / 匯入 三步驗證管線批次維護任務指派 批次維護選單 批次維護
9 SSP 文件匯出 匯出正式文件(docx / pdf / odt / …) 批次維護選單 批次維護
10 三張進度卡 SSP 完成度 / 任務配置 / 證據蒐集進度 Header 本頁 §10
11 階段推進橫幅 輪次階段進度與前置、推進到下一階段 頁面頂部橫幅 FlowPhaseBanner
12 群組 / 控制項層參與人員 對群組 / 控制項節點指派管理人員(影響三層編輯權) Tab0 Group / Control 面板 現況編輯
13 系統安全計畫(SSP)編輯 SSP 完整編輯(系統特性 / 單位人員 / 元件 / 授權 / 資產) Tab1 系統安全計畫編輯器
14 專案基本資訊 名稱 / 描述 / 起訖日期(改名觸發 Drive 改名) Tab2 基本資訊與參與人員
15 專案參與人員 專案層角色指派,全量覆寫、owner 保護 Tab3 基本資訊與參與人員
16 程序書池 / 雲端整合 程序書集中管理;Drive 等第三方整合設定 Tab4 / Tab5 程序書池 / 專案雲端整合

本頁(hub)只細講左樹導覽(3)與進度卡(10) 這兩塊頁級功能;其餘每一列的逐欄規格(畫面欄位 / 逐支 API request-response / DB / 坑)都在「詳述」欄的子頁。§2 UC 為索引,指向子頁的核心流程。

2. Use Case(索引)

本頁的核心流程圖分散在各子頁;下表為 UC 索引:

UC 主題 在哪頁
UC-PP-01 填寫控制項 / AO 現況說明 現況編輯
UC-PP-05 上傳程序書並關聯到控制項 / AO 現況編輯
UC-PP-08 群組 / 控制項層參與人員管理 現況編輯
UC-TE-01 / UC-PP-02 AO 任務逐欄編輯 / 快速配置與開始執行 任務配置與啟動
UC-PP-03 / UC-PP-06 / UC-PP-07 SSP 現況匯入 / 任務配置匯入 / SSP 文件匯出 批次維護
UC-PP-09 編輯專案基本資訊與參與人員 基本資訊與參與人員
UC-PP-04 推進階段(FlowPhaseBanner) FlowPhaseBanner

3. 權限矩陣(頁級速覽)

專案層角色基調見 _overview §3。本頁涉及的守門點速覽(細節在各子頁 §3):

操作 FE 判定 BE 強制 詳述
讀樹 / 讀 SSP 參與者即可 require_participantcommon/middleware/permission/ssp_permission.py
寫現況 / 程序書 三層遞進 canEdit(專案 → 群組 → 控制項 mgr,ProjectPlanningView.vue:663-679 require_manager 現況編輯 §3
任務更新 / 快速配置 同三層 canEdit ⚠️ 無角色守門(僅 JWT) 任務配置 §3
開始執行任務 isProjectManager _check_managerGRC_403002 任務配置 §3
節點參與人員 canManage*Participants assert_project_managerGRC_403002 現況編輯 §3
基本資訊 / 參與人員(Tab2/3) canEdit ⚠️ 只做可見性檢查、無角色守門 基本資訊 §3
階段推進 banner user_can_advance stage main_rolesGRC_403050 FlowPhaseBanner §3

⚠️ FE/BE 權限不對齊是本頁的共通議題:FE 三層遞進允許「群組 / 控制項 manager」編輯,但 BE 各寫入面守門粒度不一(現況 require_manager、任務無守門、Tab2/3 無守門)——改權限務必兩端一起看,各面細節見對應子頁 §12。

4. 狀態機與前置條件

輪次 7 態狀態機(含轉換圖)見 _overview §2。本頁相關的頁級 gate:

條件 效果 出處
apStatus === 'planning' canEditSsp=true:SSP 表單可編、匯入按鈕可用 ProjectPlanningView.vue:75
apStatus !== 'planning' 唯讀 banner + 表單 disabled(launch-audit 後凍結) 同上
apStatus === 'closed' 全頁禁用(closed_banner) 同上
任務指派 planning 階段內都可編(不受 SSP 編輯狀態影響) FE 行為
基本資訊 / 參與人員 不受輪次階段限制(見 基本資訊 §4

⚠️ BE 寫入 phase guard:SSP 寫入本身 phase 檢查(見各子頁坑)——唯讀是 FE 鎖的。

5. UI 設計

實機截圖(STG,亮色模式,2026-07-05;帳號 blsit,專案「回饋整合設定」):

專案規劃頁整頁:Tab0 左樹(群組/控制項)+ 右側預設面板 + 進度卡與 FlowPhaseBanner

批次維護選單展開:現況說明匯入/匯出、任務配置匯入/匯出、系統安全計畫文件匯出

版面骨架(hub 導航圖:各區塊標代表性 API,彩色區塊可點跳對應子頁):

Header 列:SSP 完成度|任務配置完成度|證據蒐集進度 + 快速配置/開始執行任務 GET /ssp/{uid}/control-tree ・ GET …/task-execution/progress(hub §6 載入類) 開啟:階段推進橫幅(FlowPhaseBanner)spec FlowPhaseBanner 階段推進(規劃 → 稽核計畫填寫 → 稽核 → 缺失改善) GET/POST /projects/{uid}/audit-round/{round_uid}/stage/info ・ …/stage/advance → shared-components/flow-phase-banner.md(跨頁共用元件,點我開啟) [0] 控制項實作 開啟:系統安全計畫編輯器 hub(5 子頁) [1] 系統安全計畫 開啟:專案基本資訊與參與人員 spec [2] 基本資訊 開啟:專案基本資訊與參與人員 spec [3] 參與人員 開啟:程序書池 spec(證據管理群) [4] 程序書管理 開啟:專案雲端整合 spec(證據管理群) [5] 雲端整合 Tab [0] 控制項實作 — 本頁主工作區(右面板依左樹選中節點型別切換) 左樹導覽 群組 → 控制項 → AO 搜尋/完成度篩選 (hub §5/§10) 開啟:控制項/AO 現況編輯與程序書 spec 控制項/AO 現況說明 + 程序書關聯 + 群組/控制項參與人員 GET/PUT /ssp/{uid}/control-implementation/{cid} ・ PUT …/objective/{stmt} POST/DELETE …/reference-documents(控制項/AO 兩層) → planning-status.md(UC-01/05/08,點我開啟) 開啟:AO 任務配置與啟動 spec AO 任務卡:inline 編輯/指派/快速配置/開始執行 PUT /grc/project/{uid}/job/{job_uid}(關聯欄位 full-replace) POST /grc/project/{uid}/start-task-execution(限 PM,idempotent) → project-task-edit.md(UC-02,點我開啟) 開啟:批次維護(匯入匯出與文件匯出)spec 批次維護 dialog 群:現況/任務配置 Excel 匯入匯出 + SSP 文件匯出 GET …/export + POST …/import → /validate → /confirm(現況、任務配置 ×2 組) GET /ssp/{uid}/export?format=docx|pdf|odt → planning-batch-ops.md(UC-03/06/07,點我開啟) 彩色=有獨立子頁的區塊,整塊可點擊跳轉(框內標檔名+代表性 API)|灰=hub 本頁描述|虛線框=dialog/條件顯示層 API 僅列代表性 2~3 條,完整規格見各子頁 §6;Tab 列 [1]~[5] 也可點往對應 spec
專案規劃頁 hub 版面骨架:Header 進度卡與批次動作、FlowPhaseBanner(可點)、六個 Tab、Tab0 左樹 + 右面板三區塊(現況編輯 / 任務配置 / 批次維護,各可點往子頁)

六個 Tab 各自的內容與所屬 spec(本頁 hub 只細畫 Tab0 的頁級底盤;各區塊 field-level 見子頁):

Tab 內容 詳細規格在哪
[0] 控制項實作 左樹導覽 + 右面板:現況編輯 / 任務配置 / 批次維護 / 節點參與人員 現況→現況編輯、任務→任務配置、批次→批次維護
[1] 系統安全計畫 SSP 完整編輯(系統特性、單位/人員、元件、授權、資產) 系統安全計畫編輯器SspTabPanel.vue
[2] 基本資訊 專案名稱 / 描述 / 起訖日期 基本資訊與參與人員ProjectBasicInfoPanel.vue
[3] 參與人員 專案層角色指派 基本資訊與參與人員ProjectParticipantsPanel.vue
[4] 程序書管理 程序書池集中管理 程序書池DocumentPoolPanel.vue
[5] 雲端整合 專案 Drive 資料夾驗證與修復 專案雲端整合ProjectCloudIntegrationsPanel.vue

左樹導覽(頁級功能 3):群組 → 控制項 → AO 三層樹;關鍵字搜尋 + 完成度篩選(全部 / 已填 / 未填)與狀態篩選;節點帶完成度徽章。右面板依左樹選中節點型別切換(群組 / 控制項 / AO 面板)。狀態呈現:儲存中 per-項目 spinner(sspSaving / taskSavingSet);無 socket,儲存後前端 state 更新;TabView 支援 ?tab=N 直鏈。

6. API 規格

Envelope:成功 {"status": true, "data": …}、失敗 {"error_code": "…", "msg": "…"}

6.1 總清單(本頁呼叫的全部 endpoint)

分類 Method + Path 說明 完整規格
載入 POST /projects/{uid}/audit-rounds/list 輪次清單 → apStatus / sspUid §6.2
載入 GET /ssp/{sspUid}/control-tree 三層樹 + 內嵌任務,一次載入 Tab0 §6.2
載入 GET /grc/project/{uid}/task-execution/progress 證據蒐集執行進度卡 §6.2
載入 GET /grc/project/{uid}/org-units/menu/users/menu/surveys/menu、POST /devices 專案資料 + 四種下拉 GAI-SD-02
現況 / 程序書 GET/PUT .../control-implementation/{cid}.../objective/{stmt}.../reference-documents 現況編輯 / 程序書 現況編輯 §6
節點參與人員 POST/PUT/DELETE /control-group-participant/project-control-participant 群組 / 控制項人員 現況編輯 §6
任務 PUT /grc/project/{uid}/job/{jobId}、POST .../start-task-execution 任務更新 / 開始執行 任務配置 §6
批次 .../control-implementations/*.../jobs/*/ssp/{uid}/export 三步匯入 / 文件匯出 批次維護 §6
基本資訊 GET/PUT /grc/project/{uid} Tab2/3 基本資訊 + 參與人員 基本資訊 §6
階段 GET/POST .../stage/info.../stage/advance 階段推進 FlowPhaseBanner §6

6.2 載入類(hub 頁級)

[POST] /projects/{project_uid}/audit-rounds/list

輪次清單(頁面據此定位當前輪次 → apStatus / sspUid)。無 body。Response data(陣列,每項):uid / name / round_no / round_type(initial·surveillance·close-out)/ status(7 態)/ parent_round_uid / ap_uid / ssp_uid(planning 期為 null 用 living)/ ar_result_id / poam_id / flow_template_snapshot_uid / workflow_execution_uid / start_at / end_at / created_at / created_user / created_user_name。出處:app/grc/service/audit_round_app_service.py:164-191_to_dto

[GET] /ssp/{ssp_uid}/control-tree

三層樹一次載入(含每個 AO 內嵌任務)。無 query。Response data.groups[] 各層節點:

  • Groupid / code / name / total_controls / controls[]
  • Controlid / uid / code / control_identifier / name / ssp_implementation_status / implementation_description / is_reviewed / reviewers[] / assessment_objects[]
  • AOid / uid / statement_identifier_obj.N)/ title / ssp_implementation_status / ssp_implementation_description / is_reviewed / reviewers[] / workflow_template_uid / workflow_execution_uid / jobs[]
  • Jobid / uid / name / description / guide / job_type / status / assignees[]{uid, user_uid, name, user_name, user_login_name, is_approver, role})/ departments[] / devices[] / surveys[]{id, name, source_survey_uid, snapshot_uid, approval_required}

出處:app/oscal/service/ssp_control_implementation_service.py:265-491build_control_tree_by_ssp_id

[GET] /grc/project/{project_uid}/task-execution/progress

Response data{total, completed, in_progress, not_started}(進度卡)。出處:api/grc/serializers/task_execution.py:11-17

7. 前端檔案地圖(compliance-manager-fe/)

檔案 角色 對應子頁
src/views/project/ProjectPlanningView.vue 主檢視(約 2,300 行;樹、面板、匯入匯出、快速配置都在此) 各 Tab0 子頁
src/config/router/index.js:785-848 三條 route:project-planning(legacy)/ -ap / -roundv2 推薦
src/components/grc/FlowPhaseBanner.vue 階段推進橫幅 FlowPhaseBanner
src/components/grc/ssp/SspTabPanel.vue Tab1 SSP 編輯 SSP 編輯器
src/components/grc/project/ProjectBasicInfoPanel.vue / ProjectParticipantsPanel.vue Tab2 / Tab3 基本資訊
src/components/grc/ParticipantsPanel.vue 節點參與人員 dialog 現況編輯
SspImportDialog / JobImportDialog 批次匯入 dialog 批次維護
src/service/SspService.js / menuStore.js SSP API 包裝 / 下拉資料

8. 後端檔案地圖(本頁載入鏈)

鏈路 Route App Service 底層
控制項樹 api/oscal/routes/ssp/ssp_control_implementation_route.py::SspControlTreeRoute get_control_treebuild_control_tree_by_ssp_id(免權限核心,背景任務共用) ProfileResolutionService.resolve + catalog repos + per-AO prep-job 反查
執行進度卡 同檔 TaskExecutionProgressRoute get_prep_job_progress 沿 living SSP → catalog → workflow → job 鏈統計
輪次列表 api/grc/routes/(audit rounds) audit_round_app_service.py::list_rounds compliance.project_audit_rounds

DDD 提醒:各寫入 API 的鏈路與守門在對應子頁 §8;新增本頁 API 照層級走(route 不碰 DB、app service @transaction、寫入加角色檢查)——現況有數處沒守到(見各子頁 §12),別複製。

9. DB

9.1 資料表總清單(讀取鏈 + 寫入指向子頁)

讀/寫 說明 詳述
compliance.project_audit_rounds 稽核輪次主檔(7 態、BPMN 綁定、凍結 SSP 指標) §9.3
compliance.project_extensions living_ssp_id 是本頁編輯的 SSP 錨點 §9.3
compliance.projects / project_participants 讀 / 寫 專案主檔 / 參與者 基本資訊 §9.3
oscal.system_security_plans / profile_imports / catalog_* SSP → catalog 導航 + 控制結構 GAI-SD-03
oscal.ssp_implemented_requirements / ssp_statements / ssp_reference_documents 現況 / 程序書 現況編輯 §9.3
compliance.job_executions + task_assignees / org_units / devices ・ survey.task_surveys 任務 + 四關聯 任務配置 §9.3
compliance.control_group_participants / project_control_participants 節點參與人員 現況編輯 §9.3
compliance.stage_objects 階段行為定義 FlowPhaseBanner §9.3

9.3 核心表欄位(hub 頁級:輪次 + 錨點)

compliance.project_audit_rounds — 稽核輪次主檔

FR-038 核心實體:一專案多輪,每輪 launch-audit 時 snapshot living SSP。狀態機 7 態,覆核(close-out)開新輪以 parent_round_id 串回母輪。

欄位 型別 說明
uid varchar(36) 對外識別碼
project_id bigint → compliance.projects.id(soft ref)
round_no / name int / varchar 輪次序號 / 名稱
round_type varchar(20) initial / close-out / surveillance
status varchar(20) 7 態(見 _overview §2
parent_round_id bigint|null 覆核母輪 self-FK;NOT NULL ⟺ close-out
assessment_plan_id / ssp_id bigint|null 本輪 AP / 凍結 SSP 快照
ar_result_id / poam_id bigint|null 稽核 / finalize 回填
flow_template_snapshot_uid / workflow_execution_uid varchar(36)|null 凍結 BPMN 範本 / main workflow

compliance.project_extensions — 專案擴展(1:1)

欄位 型別 說明
project_id int → compliance.projects.id(1:1,CASCADE)
living_ssp_id bigint|null 專案 living SSP(soft ref)——本頁編輯的 SSP 錨點;profile / catalog 由 ssp.import_profile_id → profile_imports.source_catalog_id 導航
module_frame_id / owner_id int|null 啟動範本參考 / 專案負責人

各寫入表的欄位卡在對應子頁 §9.3(現況 / 任務 / 節點人員 / 基本資訊各自)。

10. 頁面邏輯與資料對應

載入時序

planning_load_sequence cluster_p1 ① 並行 cluster_p2 ② 並行(menuStore) mounted onMounted proj GET /grc/project/{id} 專案+參與人員 → 角色判定 mounted->proj rounds POST /audit-rounds/list 定位當前輪次 → apStatus、sspUid mounted->rounds orgs GET /org-units/menu 部門下拉 mounted->orgs tree GET /ssp/{sspUid}/control-tree 三層樹+內嵌任務一次載入 → groups / controlsMap / sspStatuses / taskMap → 自動展開第一個群組 rounds->tree sspUid 到手才拉樹 menus surveys / users / devices menu 任務卡下拉資料 tree->menus prog GET /task-execution/progress 執行進度卡 tree->prog stage GET /stage/info FlowPhaseBanner 階段與前置條件 tree->stage ready 頁面就緒 URL query:?tab=N 切 tab|?control=id 預選控制項 menus->ready prog->ready stage->ready
頁面載入時序:兩段並行 + 樹載入是關鍵路徑(sspUid 由輪次清單決定)

進度卡計算

進度卡 FE state 來源
SSP 完成度 sspStats(computed) 由樹的 sspHasDescription 快取推導
任務配置完成度 taskStats(computed) 樹內 job 指派統計
證據蒐集執行進度 taskExecPercent /task-execution/progress{total, completed, in_progress, not_started}

載入流程:輪次清單 → 定位當前輪次(apStatus / sspUid)→ control-tree 一次載入 Tab0 全資料(樹 + 內嵌任務)+ 進度卡並行。各子頁的儲存更新本地 state,不重拉樹(除匯入 confirm 後 fetchTree() 全重載)。

11. 背景行為與外部依賴

類型 內容
Socket 本頁 socket / 輪詢;資料更新靠操作後的 state 更新與手動重載
通知 「開始執行任務」→ 按人聚合送站內通知(見 任務配置 §11
Drive 同步 專案改名 → best-effort(見 基本資訊 §11
BPMN 任務由輪次綁定的 BPMN 範本 userTask 衍生;階段推進 = BPMN 引擎前進(見 FlowPhaseBanner
jedi-* 套件 jedi-oscal-v2(SSP/catalog)、jedi-flow-engine(job/workflow)、jedi-survey(問卷)、jedi-auth(JWT)
系統參數 無 feature flag;BPMN 範本預設值來自 module_frames.audit_flow_template_uid

12. 邊界情況與已知坑(跨區塊)

各功能區塊的坑在對應子頁 §12;此處只留跨區塊 / 頁級的坑:

  1. AO 識別碼 _obj.N、任務文案真相在 BPMN userTask、v1 表已 drop:見 _overview §5——影響現況與任務兩塊。
  2. 無 socket 多人協作:多人同時編輯互相看不到;後儲存者覆蓋(props 整包 update)。客戶端多人協作要留意——跨所有 Tab0 編輯面。
  3. 舊 route 相容/ap/:apUid/planning 是 legacy,行為與 round route 有差(round 才有 stage banner 完整功能);修 bug 先確認使用者走哪條 route 進來。
  4. FE/BE 權限守門粒度不一(跨面):現況 require_manager、任務無守門、Tab2/3 無守門——見 §3 與各子頁 §12;改權限要通盤看。

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 環境 blsadmin(密碼見 .env / 部署文件)
  • 導航路徑:登入 → 專案列表 → 進專案 → 輪次(planning 狀態)→ 專案規劃
  • 前置資料:專案需已綁 ModuleFrame(才有 living SSP 與 BPMN 範本);沒有輪次先在總覽頁建立
  • E2Ecompliance-manager-test/(Cucumber + Playwright),以 專案規劃 / planning 搜尋
  • 相關子頁現況編輯 / 任務配置 / 批次維護 / 基本資訊 / FlowPhaseBanner;FR-038(v2 遷移)、FR-047(本次拆分)