本卡屬 FR-145(母卡見子卡清單回填),卡 2:資料模型加欄、自動建立 hook、清單端點與 FE 清單頁重做。可先派、不依賴 FR-143;是卡 3~5 的地基。本卡新增主線 migration 1 支。
把「專案調查結果」這張表加幾個欄位,讓一筆報告能綁到某一輪(階段結案報告)或某個專案(專案總報告),並記狀態與版號。然後在兩個流程事件上掛「自動建報告」:輪次結案時,如果最後一次稽核還有不符合就建該輪的階段報告;專案狀態變成已完成就建專案總報告。清單頁改成一個專案一列,點開看該專案底下的報告子列(階段報告依時間排、總報告最後);側邊選單「專案調查結果」改名「結案報告」。既有舊資料標 legacy 留著唯讀。
infra/project_summary_report/models/project_summary_report.py compliance.project_summary_reports(uid、project_id、name、summary、is_delete);歷史表 models/project_summary_report_history.py(report_id、type U/R、name、summary)。api/project_summary_report/__init__.py:23-31——POST /project-summary-reports(list)、/project-summary-report[/<uid>] CRUD、/export/<uid>、histories、history、history-revert。app/project_summary_report/service/project_summary_report_service.py _require_participant :38 守門(專案參與者)、CRUD :69-176。ui_routes id 15 report-manage /project-summary-report 群組 42 sort 70;子頁 74 tab-view、75 history。FE i18n menu.json:33 report-manage: 專案調查結果。pkg/jedi-compliance-audit/app/service/audit_round_app_service.py finalize_audit :470(terminal=True 才 closed)、_sync_project_status :157(全輪 closed → ProjectStatus.COMPLETED,呼叫點 :283/:435/:490)。主專案呼叫這些的地方在 app/project/(grep finalize_audit\|close_round)。app/flow_control/service/ar_objective_app_service.py 有 findings 統計(CM-2826 讀模型),用它算最後一個 pass 的 not_met。src/views/project-summary-report/ProjectSummaryReportManage.vue 329 行(已超 1/3,重做不往裡塞);清單版式對照 FR-144 my-audit-plans.html。scripts/sql/2026-10-17-closing-report-columns.sql 新 migration(主線 phase=active)
infra/project_summary_report/models/project_summary_report.py 加欄 mapping
infra/project_summary_report/models/project_summary_report_history.py 加 version_no/issued/bundle_ref
app/project_summary_report/service/closing_report_creator.py 新檔:on_round_closed/create_for_round/create_for_project
app/project_summary_report/service/closing_report_list_service.py 新檔:一專案一列讀模型
app/project/service/<呼叫 finalize_audit/close_round 的 service> 套件回傳後呼叫 creator(同 @transaction)
api/project_summary_report/routes/project_summary_report_route.py list 回模型改
compliance-manager-fe/src/views/project-summary-report/ProjectSummaryReportManage.vue 重做
sql-migration skill 格式:檔頭 -- Date:、每句日期註解、收尾 INSERT schema_migrations):project_summary_reports 加 report_type varchar(20) NOT NULL DEFAULT 'legacy'、audit_round_id int FK project_audit_rounds ON DELETE CASCADE、status varchar(20) NOT NULL DEFAULT 'draft'、issued_version int NOT NULL DEFAULT 0、issued_at timestamptz、issued_user varchar(50);部分唯一索引 (audit_round_id) WHERE audit_round_id IS NOT NULL AND is_delete=0、(project_id) WHERE report_type='final' AND is_delete=0;歷史表加 version_no int、issued bool NOT NULL DEFAULT false、bundle_ref varchar(500);UPDATE … SET status='issued' WHERE report_type='legacy'(舊資料視為已定稿唯讀);ui_routes id 15 name 改 closing-report。既有列必有預設,否則有資料的庫會炸。on_round_closed(round_id, curr_user)——round.status≠closed 直接 return;not_met = ar_objective_app_service.<統計>(last_pass);>0 → create_for_round(name=第 {round_no} 輪結案報告、report_type=stage、status=draft);重讀 project,status==COMPLETED → create_for_project(name=專案總報告、report_type=final)。兩個都先查唯一索引已有就跳過(idempotent;事件可能重入)。finalize_audit/close_round 的 app service 方法,在套件回傳後同一 @transaction 內呼叫 creator.on_round_closed。不改套件。DI:creator 注入 di_containers/project_summary_report_container.py,hook 所在 container 加依賴。meta.bucket_counts 三桶筆數。歸屬:_require_participant 邏輯(manager/auditor),reviewer 不列。分頁、搜尋走後端。ProjectSummaryReportManage.vue 重做——PrimeVue DataTable 行展開(expandedRows 用物件 key {[uid]:true} 不是陣列);外層欄:專案/報告、專案進度、報告狀態(N 份待撰寫 N 份已定稿)、最新定稿日、顧問、專案經理;子列:報告名+「階段/總報告」小標籤、涵蓋稽核次、狀態、不符合、定稿日、版本、撰寫/開啟鈕(進卡 3 報告頁,路由先留 /project-summary-report/<uid>)。分段鈕待撰寫/已完成/尚未結案/全部。對照雛形 prototype/closing-report-list.html。legacy 子列標「舊版」、只能開啟。menu.json report-manage 改「結案報告」(key 名可留,顯示字改);ui_routes 由 migration 改。