本卡屬 FR-145(母卡見子卡清單回填),卡 3:階段結案報告讀模型、端點、Word/PDF、FE 報告頁。最大一棒。等卡 2(資料模型)與 FR-143 CM-2842(POA&M 讀端點)。
點進一份階段結案報告,看到一份正式文件:封面(專案、框架、受稽單位、顧問、期間…)、六章(1 專案概況、2 整體符合度、3 主要缺失與風險、4 改善計畫摘要、5 總結與建議、6 附件清單)、附件一(逐評估目標各稽核次判定)。前五章之外全部由系統從稽核計畫、稽核結果、改善計畫即時算出來,不可編輯;只有第 5 章是富文字編輯器讓人寫。頁首三顆:存檔(草稿)、定稿(鎖第 5 章、記 v1)、下載(下拉:Word、PDF、報告包 zip、報告包內容)。定稿後存檔消失、定稿變修訂。每次下載記日誌,右側顯示下載紀錄。
app/flow_control/service/ar_objective_app_service.py(CM-2826 讀模型:findings、observation、risk);ar_objective_view.py 整理 view。app/flow_control/service/ap_overview_app_service.py。jedi_compliance_audit/app/service/poam_app_service.py 經主專案 app service)。app/oscal/templates/ap/ar_report_template.docx、ar_docx_generator.py(docxtpl+python-docx 橫式附件,_landscape_section :187、_repeat_header :179 可複用);PDF 經 SspLibreOfficeConverter。api/project_summary_report/routes/project_summary_report_route.py:155-175,bleach 白名單 :162-168——第 5 章 HTML 清洗沿用這組常數。project_summary_report_history_service.py revert_data_from_cruise_project_report_history :68;FE ProjectSummaryReportHistory.vue。reference_audit_event_logging_pattern。src/views/project-summary-report/TipTapEditor.vue(2026-10-17 重整,FE 760d6648)。app/closing_report/service/closing_report_app_service.py 新模組:讀模型(六章+附件一)、存檔、定稿、修訂
app/closing_report/service/closing_report_docx_generator.py 新:Word
app/closing_report/service/closing_report_model.py 新:章節 dataclass
app/oscal/templates/closing/stage_report_template.docx 新:從 ar_report_template.docx 複製改章節
api/closing_report/routes/closing_report_route.py 新:五支端點
di_containers/closing_report_container.py 新
config/app_modules.py 註冊模組
compliance-manager-fe/src/views/closing-report/ClosingReportView.vue 新頁(取代 Form/TabView)
compliance-manager-fe/src/views/closing-report/… 子元件:封面、章節表、附件表、側欄
summary;附件一=逐 part_id 各 pass state+最終。先查再寫:統計用 ar_objective_app_service 既有方法,缺的加參數 extend,不另寫一套讀 findings。GET /closing-report/<uid>(讀模型+status/version/下載紀錄);PUT /closing-report/<uid>/summary(draft 才可,歷史記 U);POST …/issue(守門 summary 非空 → status=issued、issued_version+1、歷史記 version_no/issued=true;manager 守門;卡 4 接上後在此產定稿版 zip);POST …/revise(status=draft,版號不退;manager);GET …/export?format=docx|pdf(draft:PDF 加「草稿」浮水印、檔名無版號;issued:檔名 _v<N>;記事件 closing_report_download payload {report_uid, report_type, format, version})。能力點 D15:read/export 給 manager 與 auditor,update 只 manager——沿用 grc.summary-report.* 四個既有點。ar_report_template.docx 複製成 stage_report_template.docx,docxtpl 渲染封面+六章;附件一用 python-docx 橫式表(複用 _landscape_section、_repeat_header,直接 import 不複製)。第 5 章 HTML → docx:先 bleach 清洗(沿用 route :162-168 常數),再轉段落——先查 SSP 匯出(app/oscal/service/ssp_export*)有沒有 HTML→docx helper,有就用。浮水印在範本層做(頁首文字框,draft 時填「草稿」)。PDF 經 SspLibreOfficeConverter。ClosingReportView.vue 照雛形 prototype/round-closing-report.html——doc-shell 兩欄:左文件(封面 doc-cover、章節 h2 帶編號與來源標籤、表格 caption「表 2-1」、第 5 章 TipTap、附件一表),右 doc-side 固定目次+下載紀錄。頁首:下載下拉(Word/PDF/報告包 zip/報告包內容,後兩項卡 4 接上前先灰)、存檔、定稿;issued 時存檔隱藏、定稿→修訂、第 5 章唯讀、狀態「已定稿 vN · 日期」。拆子元件讓主檔 ≤800 行。歷史頁 ProjectSummaryReportHistory.vue 加「v1 定稿」標記(issued/version_no)。路由 /project-summary-report/<uid> 指向新頁,舊 Form/TabView 退役。