專案規劃頁(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_participant(common/middleware/permission/ssp_permission.py) |
— |
| 寫現況 / 程序書 | 三層遞進 canEdit(專案 → 群組 → 控制項
mgr,ProjectPlanningView.vue:663-679) |
require_manager |
現況編輯 §3 |
| 任務更新 / 快速配置 | 同三層 canEdit |
⚠️ 無角色守門(僅 JWT) | 任務配置 §3 |
| 開始執行任務 | isProjectManager |
_check_manager → GRC_403002 |
任務配置 §3 |
| 節點參與人員 | canManage*Participants |
assert_project_manager → GRC_403002 |
現況編輯 §3 |
| 基本資訊 / 參與人員(Tab2/3) | canEdit |
⚠️ 只做可見性檢查、無角色守門 | 基本資訊 §3 |
| 階段推進 | banner user_can_advance |
stage main_roles → GRC_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,專案「回饋整合設定」):


版面骨架(hub 導航圖:各區塊標代表性 API,彩色區塊可點跳對應子頁):
六個 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[] 各層節點:
- Group:
id/code/name/total_controls/controls[] - Control:
id/uid/code/control_identifier/name/ssp_implementation_status/implementation_description/is_reviewed/reviewers[]/assessment_objects[] - AO:
id/uid/statement_identifier(_obj.N)/title/ssp_implementation_status/ssp_implementation_description/is_reviewed/reviewers[]/workflow_template_uid/workflow_execution_uid/jobs[] - Job:
id/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-491(build_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 / -round(v2 推薦) |
— |
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_tree →
build_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. 頁面邏輯與資料對應
載入時序:
進度卡計算:
| 進度卡 | 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;此處只留跨區塊 / 頁級的坑:
- AO 識別碼
_obj.N、任務文案真相在 BPMN userTask、v1 表已 drop:見 _overview §5——影響現況與任務兩塊。 - 無 socket 多人協作:多人同時編輯互相看不到;後儲存者覆蓋(props 整包 update)。客戶端多人協作要留意——跨所有 Tab0 編輯面。
- 舊 route 相容:
/ap/:apUid/planning是 legacy,行為與 round route 有差(round 才有 stage banner 完整功能);修 bug 先確認使用者走哪條 route 進來。 - 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 範本);沒有輪次先在總覽頁建立
- E2E:
compliance-manager-test/(Cucumber + Playwright),以專案規劃/planning搜尋 - 相關子頁:現況編輯 / 任務配置 / 批次維護 / 基本資訊 / FlowPhaseBanner;FR-038(v2 遷移)、FR-047(本次拆分)