適用範圍:A5 Session C T14 FE manual smoke。BE + FE shipped 後 user 自跑驗收。 前置:BE branch feature/ssp-import-export-phase2 跑起來 + FE npm run dev 起來。 2026-05-21
§1
啟動環境
# BE
cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
set -a; source .env; set +a
python main_app.py # localhost:8000
# 看 log: tail -f log/app.log
# FE
cd ~/Projects/Billows/Audit-Manager/compliance-manager-fe
npm run dev # localhost:5180
登入:blsadmin / Billows@123!
§2
A. 路由 + 上傳頁
A.1 Create mode 路由
- 瀏覽器開 http://localhost:5180/module-frame/import-excel
- ✅ 預期:頁面標題「從 Excel 建立合規資源庫」+ framework + version 兩個 Dropdown + file upload
- ✅ 選 framework「CMMC 2.0」→ version dropdown 載入 published 版本清單
A.2 Update mode 路由
- 從 MF 詳細頁推導 MF uid(如
123e4567-...)
- 開 http://localhost:5180/module-frame/{uid}/import-excel
- ✅ 預期:頁面標題「從 Excel 匯入合規資源庫內容」+ 只顯示 file upload(無 framework picker)
A.3 解析錯誤路徑
- 上傳非 .xlsx 檔(如 .pdf / .docx)
- ✅ 預期:FileUpload 元件拒絕 + 不允許點「解析」按鈕
- 上傳結構錯誤 .xlsx(缺 sheet)
- ✅ 預期:toast 顯示「解析失敗」+ error_message
§3
B. 預覽頁 5 sheet TabView
B.1 載入 + tab badge
- 上傳合法 Excel → 解析成功 → 自動 redirect /module-frame/import-excel/preview/:parseUid
- ✅ 預期:5 個 tab:Devices / Information systems / Leveraged services / Parties / Controls
- ✅ 預期:tab 右上角 badge 顯示 unmatched 數量(紅)或 fuzzy 數量(橘)
B.2 Devices sheet
- 切到 Devices tab
- ✅ 預期:DataTable 顯示 name / IP / OS / device_type / status / match_status / 操作
- ✅ 預期:每行 match_status 顯示「已配對」/「模糊匹配 (XX%)」/「未配對」其一
B.3 InfoSystems sheet
- 切到 Information systems tab
- ✅ 預期:DataTable 顯示 name / abbreviation / system_status / description / match_status / 操作
B.4 Controls sheet (row expansion)
- 切到 Controls tab
- 點任一行的 expansion arrow
- ✅ 預期:展開後顯示 control statement 全文 + objectives DataTable(objective_key / statement)
§5
D. localStorage 持久化
D.1 重新整理頁面恢復
- 對 Devices 第 1 行設「新建」+ 第 2 行設「選現有」
- 切到 InfoSystems tab → 設一個「純文字保留」
- 重新整理頁面(F5)
- ✅ 預期:3 個 decision 全部恢復 + match_status 顯示正確
D.2 跨 tab 切換不丟 state
- 對 Devices tab 設 decision
- 切 Controls tab → 切回 Devices
- ✅ 預期:decision 還在
§6
E. Confirm flow
E.1 確認 Dialog
- 設好若干 decisions 後點「確認匯入」
- ✅ 預期:PrimeVue Dialog 開啟 + 顯示 4 個計數(自動配對 / 已改選 / 新建 / 純文字保留)
- ✅ 預期:若有 inline create → 底部 hint「將同步新建 N 筆基礎資料」
E.2 確認成功流程
- 點 Dialog「確認匯入」
- ✅ 預期:按鈕轉 loading + Cancel 按鈕 disabled
- ✅ 預期:成功 → toast「匯入成功」+ localStorage 清空 + redirect MF 詳細頁
E.3 確認失敗 rollback
- 故意製造失敗(如 inline create device.name 撞 duplicate)
- 點「確認匯入」
- ✅ 預期:toast「匯入失敗」+ Dialog 關閉但 store state 保留 + user 可修正後重試
- ✅ 預期 BE:tenant 表無髒資料(@transaction rollback 完整)
§7
F. Discard flow
- 上傳 + 進預覽 → 點「捨棄」按鈕
- ✅ 預期:DELETE /ssp-excel-import/:uid 呼叫成功
- ✅ 預期:toast「已捨棄」+ redirect /module-frame
- ✅ 預期:再開同 parseUid 的 preview URL → 顯示「找不到此解析資料」
§8
G. i18n 切換
- 在預覽頁切到 English
- ✅ 預期:所有 label / Tag / Dialog 文字翻譯到 English
- ✅ 預期:sheet tab header / match_status / RowActionMenu 都 i18n 過
§9
H. 已知限制(user-facing 影響待評估)
H.1 Decisions 對 write-time FK 不直接 propagate(design §10.2.1)
- ⚠ user 選的 matched_id_override / inline_create_row_idx 套用到 parsed_result,但實際寫 DB 的 FK 仍由 A4 orchestrator 決定
- smoke 觀察點:confirm 後到 MF 詳細頁看 device / info_system FK 是否真的對到 user 選的那筆
- 若 user 選 device A,但 BE 寫進去的是 device B → 確認此為已知限制,follow-up
F-A5-decision-write-propagation
H.2 Leveraged sheet action column 為空
- 設計偏差:BE InlineCreateSchema 不支援 leveraged inline;FE 也無 party menu API → 無從 picker
- smoke 觀察:leveraged sheet 操作欄為「-」placeholder
- 未來 polish 進 F-A5-leveraged-action
H.3 Parties sheet decisions 被 BE skip
- BE A3/A4 reconciler 處理 parties;A5 decisions 對 parties 一律忽略
- smoke 觀察:parties sheet 操作欄為「由 BE reconciler 自動配對」
H.4 Inline-created user 不發邀請信
- BE
add_user(entity, is_admin=False) 無 send_invite 機制
- smoke 觀察:新建 user 後該 user 不會收到邀請信 → admin 後續手動處理
H.5 SheetPreviewBasic + SheetPreviewRefDocs 未實作
- 01_基本資料 + 08_程序書 走 content_overrides;T14 未做 polish UI
- smoke 觀察:5 tab 只看到 5 個 decision sheet,沒有 basic / refdocs tab
§10
完成後
跑完所有 ✅ 後告知,會接著進 T15 task arc 收口 SUMMARY。 若任何項目踩雷 → 記錄到 design-A5.md §10.3 偏差段 + 視 priority 補 hotfix 或 follow-up。