手冊首頁 / 合規稽核 / 框架版本匯入 / 編輯

框架版本匯入 / 編輯(Framework Version Import / Edit)

功能群:合規框架與 SSP|匯入三步式先讀 _overview §4、母頁 compliance-framework-manage

事實基準:2026-07-05 從 FE / BE code 掃出;endpoint 對 routes.json、schema 對 db_schema.json、error code 開檔驗

1. 功能描述

框架版本匯入 / 編輯是把框架版本的控制項全集從 PDF/OSCAL 匯入成 catalog、並編輯 catalog 內容的頁面。兩個相連頁面:

  • 匯入頁FrameworkImportPage.vue,2 route:/import-version 上傳、/import-version/:parseUid 預覽):走 parse→預覽→confirm 三步式(見 _overview §4),confirm 後寫 oscal.catalogs + 回填版本 catalog_id
  • 版本內容編輯頁FrameworkVersionEditView.vue):對已匯入 catalog 的群組 / 控制項 / AO 做內嵌編輯(直接 PUT/DELETE,無暫存)。

主要使用者:平台(root 租戶)管理員(框架是全域資源)。

角色速覽(本群非專案層角色,見 _overview §5):僅 platform admin 可匯入 / 編輯。

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

# 功能 說明 位置 詳述
1 選解析器 + 上傳 PDF parser 下拉 + .pdf 拖放 → 解析成 parse job 匯入 Step1 UC-CFI-01
2 草稿橫幅 列出 / 開啟 / 丟棄未完成 parse job 匯入 Step1 §6.1
3 預覽雙欄 左 PDF iframe、右 TabView(基本資訊 + 內容) 匯入 Step2 §5
4 版本 metadata version / release_date / publish_status(replace-mode 隱藏,沿用既有) 匯入 Step2 Tab §6.2
5 內容內嵌編輯 群組 / 控制項 / AO 編輯、標刪 / 還原、G/C/A 計數 匯入 Step2 / 編輯頁 §6.2
6 確認匯入 confirm → 寫 catalog + version 匯入 Step2 UC-CFI-01
7 丟棄 DELETE parse job(暫存不入正式表) 匯入 Step1/2 §6.1
8 失敗態 error_code + 訊息 → 重試 / 丟棄 匯入 §10
9 版本內容直接編輯 catalog control / group / assessment 內嵌 PUT/DELETE 編輯頁 UC-CFI-02
10 編輯權 gate draft 且 platform admin 才可編;有引用才可刪 編輯頁 §3

UC(§2)展開本頁所有具實質後端邏輯的功能:PDF 匯入三步(UC-CFI-01)、版本內容內嵌編輯(UC-CFI-02,與匯入不同機制、無暫存 diff)。草稿橫幅 / 失敗態 / 丟棄等純顯示或單步操作見 §6.1 / §10;replace-mode 等匯入變體併入 UC-CFI-01。

2. Use Case

角色速覽(本群非專案層角色,見 _overview §5):僅 platform admin 可匯入 / 編輯。

流程圖視覺慣例:菱形 = 判斷、橘底 = 例外 / 擋下、紅框 = 錯誤(標 error code)、綠框 = 成功終點、虛線 = 可選路徑。

UC-CFI-01 從 PDF 匯入框架版本控制集

項目 內容
角色 platform admin
前置條件 已登入;有目標框架(新版本或 replace 既有版本)
產出 / 後置條件 confirm 後寫 oscal.catalogs + framework_versions.catalog_id 回填
uc_cfi_01 start gate FE / BE:platform admin? start->gate deny toast 導回框架管理 BE 403 GRC_403060 gate->deny up Step1:選 parser + 上傳 PDF POST /oscal-framework-parse-jobs/parse (回 parse_uid) gate->up pfail 解析成功? up->pfail err 失敗態:error_code + 重試/丟棄 pfail->err prev Step2:GET /oscal-framework-parse-jobs/{uid} 預覽(PDF | 控制項樹)+ 填/確認版本 metadata pfail->prev conf POST .../{uid}/confirm (decisions + overrides + metadata) prev->conf 確認 drop 丟棄 → DELETE parse job prev->drop 丟棄 done 寫 oscal.catalogs + framework_versions (catalog_id 回填版本) conf->done
UC-CFI-01 流程:platform admin gate→上傳PDF解析→預覽/填metadata→confirm寫catalog→丟棄則DELETE parse job

UC-CFI-02 版本內容內嵌編輯(catalog 群組 / 控制項 / AO)

項目 內容
角色 platform admin
前置條件 版本 publish_status = 'draft'(非 draft → 唯讀);已匯入 catalog
產出 / 後置條件 catalog 群組 / 控制項 / AO 直接寫入(PUT)或刪除(DELETE,有引用不可刪);無暫存 diff,即時生效
uc_cfi_02 start open 開已匯入版本內容編輯頁 (FrameworkVersionEditView) start->open gate draft 且 platform admin? open->gate ro 唯讀(readOnly gate) BE 403 GRC_403060 gate->ro pick 內嵌選群組 / 控制項 / AO gate->pick kind 編輯或刪除? pick->kind edit 編輯 → PUT /oscal-catalog- {control,group,control-assessment}/{uid} (直接寫入,無暫存 diff) kind->edit 編輯 delchk 有引用? kind->delchk 刪除 done catalog 內容即時更新 (G/C/A 計數同步) edit->done delno allowDelete=false:刪除鈕禁用 delchk->delno del 刪除 → DELETE /oscal-catalog- {control,group,control-assessment}/{uid} delchk->del del->done
UC-CFI-02 流程:開內容編輯頁→draft 且 platform admin gate→選節點→PUT 編輯/有引用才可 DELETE→catalog 即時更新

3. 權限矩陣

操作 FE 判定 BE 強制 BE 檢查位置
進匯入 / 編輯頁 isPlatformAdmin(否則 toast 導回框架管理) require_platform_admin()GRC_403060 FrameworkImportPage:130-141;BE route/service
上傳 / confirm / 刪除 parse job 同上 require_platform_admin() app/oscal/service/framework_app_service.py
內容內嵌編輯 draft 且 platform admin(readOnly gate) require_platform_admin() catalog control/group/assessment routes
刪除控制項 allowDelete(有引用才可刪) 業務前置 同上

4. 狀態機與前置條件

發布生命週期見 _overview §3。本頁:

條件 效果 出處
parse job status='awaiting_review' 可預覽 / confirm parse job
parse job status='failed' 失敗態(error_code + 重試 / 丟棄) 同上
target_version_uid 已設(replace-mode) 基本資訊 tab 隱藏、metadata 沿用既有版本 FrameworkImportPage
版本 publish_status != 'draft' 內容編輯頁唯讀 FrameworkVersionEditView readOnly gate

5. UI 設計

📸 實機截圖三張皆從缺:本頁「新增/匯入版本」入口與本 route 都受 isPlatformAdmin 守門(ComplianceFrameworkVersionManage.vue::isPlatformAdmin——作用中租戶 path 為單層 /N/ 才算 root/平台租戶;合規框架屬全域資源,讀=所有租戶、寫=僅平台租戶)。2026-07-05 盤點:現有 E2E 測試帳號(blsadmin 等)所屬租戶皆非平台 root 租戶,直接打 route 也會被導回列表頁,暫無可用帳號截圖;待有平台租戶帳號再補。

版面骨架:

框架版本匯入 / 編輯 — platform admin only(require_platform_admin → GRC_403060) 開啟:UC-CFI-01 從 PDF 匯入框架版本控制集 Step 1:上傳並解析(route /import-version) 解析器下拉(parser)|.pdf 拖放上傳|草稿橫幅(列出/開啟/丟棄未完成 parse job) POST /oscal-framework-parse-jobs/parse(file, target_framework_uid, parser_type) GET /oscal-framework-parse-jobs(草稿清單) 開啟:UC-CFI-01 從 PDF 匯入框架版本控制集 Step 2:預覽並確認(route /import-version/:parseUid) 左 40%:PDF iframe 解析來源文件預覽(唯讀) 右 60% TabView:基本資訊(version/release_date/publish_status)+ 內容 內容 tab:群組/控制項/AO 內嵌編輯、標刪/還原、G/C/A 計數 GET /oscal-framework-parse-jobs/{uid}(parsed_result) POST …/{uid}/confirm(decisions, overrides → 寫 catalog+version) → #6-api-規格(點我開啟) 失敗態(error_code + 訊息 → 重新上傳 / 丟棄)|丟棄 DELETE /oscal-framework-parse-jobs/{uid} 開啟:UC-CFI-02 版本內容內嵌編輯(catalog 群組/控制項/AO) 另頁:版本內容編輯(FrameworkVersionEditView)— PDF 左/控制項條文右 直接 PUT/DELETE 內嵌編輯(無暫存 diff);draft 且 platform admin 才可編;有引用才可刪 PUT/DELETE /oscal-catalog-{control,group,control-assessment}/{uid} → UC-CFI-02(點我開啟) 彩色=可點跳本頁 §6/UC,灰=本頁結構|虛線=wizard step/dialog/條件顯示層 API 僅列代表性 2~3 條,完整規格見 §6
框架版本匯入版面:Step1 上傳解析(POST /oscal-framework-parse-jobs/parse)、Step2 預覽雙欄(PDF + metadata/內容 tab,confirm 寫 catalog)、另頁內容內嵌編輯(PUT/DELETE catalog-{control,group,control-assessment});可點跳 UC-CFI-01/02

狀態呈現:兩步分屬兩 route(reload 可復原);預覽用 Splitter(PDF 40% / 內容 60%);編輯頁直接 PUT/DELETE 內嵌(無暫存 diff)。

6. API 規格

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

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

分類 Method + Path 說明 完整規格
草稿 GET /oscal-framework-parse-jobs 未完成 parse job 清單 §6.2
解析 POST /oscal-framework-parse-jobs/parse 上傳 + 解析(回 parse_uid) §6.2
預覽 GET /oscal-framework-parse-jobs/{uid} 取解析結果 §6.2
確認 POST /oscal-framework-parse-jobs/{uid}/confirm 寫 catalog + version §6.2
丟棄 DELETE /oscal-framework-parse-jobs/{uid} 放棄 parse job GAI-SD-02
內容編輯 PUT/DELETE /oscal-catalog-{control,group,control-assessment}/{uid} catalog 內嵌編輯 GAI-SD-02

6.2 核心 endpoint

[POST] /oscal-framework-parse-jobs/parse

Request(multipart):

欄位 型別 必填 說明
file raw .pdf 檔案
target_framework_uid string 目標框架
parser_type string 解析器類型
target_parent_version_uid string
target_version_uid string replace-mode

Response data{parse_uid, status}。出處:api/oscal/routes/framework/...parse_jobs

[GET] /oscal-framework-parse-jobs/{uid}

Response data

欄位 型別 說明
status string awaiting_review / failed / confirmed
parsed_result object 解析結果,含 groups / controls / assessments
... 其他欄位

狀態 awaiting_review / failed / confirmed

[POST] /oscal-framework-parse-jobs/{uid}/confirm

Request:

欄位 型別 必填 說明
decisions array 決策清單
overrides object 內容覆寫,含 groups / controls / assessments
target_version string replace-mode 省略,沿用既有
target_release_date date replace-mode 省略,沿用既有
target_publish_status string replace-mode 省略,沿用既有

confirm 後寫 oscal.catalogs + 回填 framework_versions.catalog_idrequire_platform_adminGRC_403060。出處:app/oscal/service/framework_app_service.py

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

檔案 角色
src/views/compliance-framework/FrameworkImportPage.vue 匯入頁(Step1 上傳 / Step2 預覽 confirm)
src/views/compliance-framework/FrameworkVersionEditView.vue 版本內容內嵌編輯頁
src/components/.../FrameworkArticleContent.vue 群組 / 控制項 / AO 內嵌編輯元件
src/config/router/index.js:542-555 routes compliance-framework-import-version / -version-edit
src/config/api/api.js endpoint 常數
src/config/locales/i18n/zh-tw/compliance-framework-manage.json 共用 i18n

8. 後端檔案地圖(本頁核心鏈路)

鏈路 Route App Service 底層
解析 / confirm api/oscal/routes/framework/oscal_import_route.py...parse_jobs app/oscal/service/framework_app_service.py::import_framework_versioncatalog_service.import_catalog_from_{pdf,excel} jedi_oscal_v2 CatalogService + oscal.framework_parse_jobs
內容編輯 catalog control/group/assessment routes catalog edit service catalog repos

DDD 提醒:匯入走三步式(暫存 parse job → confirm 才入正式表);全程 require_platform_admin

9. DB

9.1 資料表總清單

讀/寫 說明 欄位詳述
oscal.framework_parse_jobs (暫存) PDF/OSCAL 解析暫存 job §9.3
oscal.frameworks / framework_versions 讀 / (catalog_id 回填) 框架 / 版本 manage §9.3
oscal.catalogs (confirm 生成) 版本 catalog GAI-SD-03
oscal.catalog_groups / catalog_controls / catalog_control_parts / 編輯 控制項三層 + AO GAI-SD-03

9.2 ER 圖

框架 → 版本 → catalog 結構見 compliance-framework-manage §9.2;本頁另寫暫存 oscal.framework_parse_jobs(confirm 後落地 catalog)。

9.3 核心表

oscal.framework_parse_jobs — 框架解析暫存 job

uid / statusawaiting_review / failed / confirmed)/ parsed_result(JSON 解析結果)/ target_framework_uid / parser_type / created_at / created_user。confirm 後結果落地正式 catalog;DELETE 放棄。

10. 頁面邏輯與資料對應

載入:Step1 GET 草稿清單;上傳 POST parse → 導向 Step2(/:parseUid);Step2 GET 解析結果 → 預覽 → confirm。

關鍵欄位對應

畫面元素 API 欄位
版本 metadata tab confirm target_version / target_release_date / target_publish_status
內容編輯 overrides {groups, controls, assessments} + decisions
內嵌 catalog 編輯 PUT/DELETE catalog-{control,group,control-assessment}

錯誤對應:非 platform admin GRC_403060;解析失敗 → 失敗態 error_code + 重試。

11. 背景行為與外部依賴

類型 內容
解析 PDF/OSCAL 解析成 catalog(CatalogService);暫存 parse job
Socket 本頁 socket
jedi-* 套件 jedi-oscal-v2(Catalog / Framework service)
系統參數 無 feature flag

12. 邊界情況與已知坑

  1. 三步式暫存:上傳解析成 framework_parse_jobs 暫存,confirm 才寫正式 catalog;未 confirm 可 DELETE 丟棄;草稿橫幅可續作
  2. 兩 route 分步/import-version(上傳)與 /import-version/:parseUid(預覽)分屬兩 route,reload 可復原、可分享連結
  3. replace-modetarget_version_uid 已設時 metadata tab 隱藏、沿用既有版本 metadata;confirm 不送新 metadata
  4. 內容編輯無暫存FrameworkVersionEditView 直接 PUT/DELETE 內嵌,非匯入的暫存 diff——與匯入頁不同機制
  5. 編輯 gate:版本非 draft 或非 platform admin → 唯讀;有引用(has_references)才可刪控制項
  6. platform admin only:框架全域資源,一般租戶 admin 也不能匯入 / 編輯(GRC_403060

13. 開發與驗證

  • 跑起來:BE python main_socketio.py(port 8000,log 在 log/app.log);FE Vite dev server。BE 改 service code 必重啟
  • 測試帳號:需 platform(root 租戶)admin;密碼見 .env / 部署文件
  • 導航路徑:合規框架管理 → 版本管理 → 匯入版本
  • 前置資料:一個框架;一份 PDF 控制集檔案
  • E2Ecompliance-manager-test/ repo;以 框架匯入 / framework-import 搜尋
  • 相關文件:母頁 compliance-framework-manage、匯入三步式 _overview §4