本卡屬 FR-163(母卡見「母卡」欄),批 2,等 FR-163.1 合入並重啟 BE(上傳者/時間/預覽下載四欄才有值;其他欄位用既有 tree 就能先開工)。只改 FE repo。決策者核可的畫面是 D2 雛形。
專案總覽頁右上加「控制項視圖|證據視圖」。切到證據視圖:左邊還是那棵樹但控制項可以再展開到評估目標、每個節點尾巴寫有幾份證據(0 份紅字);右邊永遠是一張平的表,一列一份證據。使用者點群組/控制項/評估目標只是縮範圍,表的形狀不變。只看不改,要加檔回任務抽屜。
畫面以 ~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-163-2610-round-evidence-view/prototype/d2-evidence-flat.html 為準(用瀏覽器開,可點)。雛形只取結構與行為,字級/字型/配色一律走全站 dark-card。
BE 不開新端點(design D9),資料全在專案總覽頁已經載入的 control-tree 裡,這張卡是純 FE:攤平、去重、畫表。
src/views/project/ProjectAuditorOverview.vue:435-470 fetchGroups():打 ${API.SSP_CONTROL_TREE}/${sspUid}/control-tree,回 groups[].controls[].assessment_objects[].jobs[],存進 groups 與 controlsMap[groupId]。每個 job 有 evidences[](BE ssp_control_implementation_service.py:554)。id, uid, evidence_type('FILE'|'LINK'), source, name, reference_url, description, file_uid, file_size, created_user, created_user_name, created_at, classification_run_id。以 FR-163.1 回寫列出的最終鍵名為準。jobs[] 下各出現一次(同 uid)。攤平時以 uid 去重,把每次出現的路徑(群組/控制項 code+name/AO part_id+title)收成該列的 locations[]——這就是「位置」欄。assessment_objects[].title(現有左樹 AO 列就是顯示這個)。created_user_name || created_user(memory:兩邊缺一半就顯示帳號或空白且不報錯)。FilePreviewDialog(src/components/common/file-preview/FilePreviewDialog.vue)ref.open(fileUid, fileName);下載:openFileDownload(fileUid)(src/utils/signedDownloadUtil.js:70);連結:window.open(url, '_blank', 'noopener,noreferrer')。三者都照 JobExecutionDrawer.vue:1513-1523 的寫法。openJobDrawer(job, {groupId, controlId, aoId, groupCode, controlCode, aoName, workflowExecutionUid})(ProjectAuditorOverview.vue:1988-1996 的呼叫形狀),子元件 emit 事件讓父層呼叫,不要把抽屜搬進子元件。SourceBadge(src/components/grc/SourceBadge.vue),source 值 SYSTEM_UPLOAD / DRIVE_SYNC / DETECTION_TOOL / AI_CLASSIFIED / REUSED。① 切換鈕:ProjectAuditorOverview.vue 頁首面板(約 1036 行 planning-header)右側動作區加 PrimeVue SelectButton,兩個選項 控制項視圖|證據視圖,值記 localStorage(key 帶 project uid,例 auditor-overview-view:<projectUid>),預設控制項視圖。v-if 切換下方整個 master-detail 區(約 1398 行 <!-- Master-Detail Split Panel --> 那個 div)與新子元件。總覽頁只加這幾行,其餘全在子元件。
② 新子元件 src/components/grc/evidence-view/RoundEvidenceView.vue,props:groups、controlsMap、loading;emit:open-job。內部拆三支:EvidenceNavTree.vue(左)、EvidenceTable.vue(右表)、useEvidenceFlatten.js(composable:tree → 去重後的列+每節點份數)。
③ 版面:Splitter(:gutter-size="6"、state-key="auditor-overview-evidence-splitter"、state-storage="local")左 SplitterPanel :size="24" :min-size="16"、右 :size="76" :min-size="50",照 EvidenceClassificationReview.vue:433-470。
④ 左樹:沿用總覽頁左樹的視覺(群組 code 徽章、控制項 code 外框徽章、搜尋框、展開/收合全部),多一層評估目標(assessment_objects[].title,縮排一層、字級小一號)。每列尾巴:群組與控制項顯示「N 份」(該範圍內去重後的證據數),評估目標顯示份數,0 份紅字。點任一層=設定右欄範圍。