本卡屬 FR-143(母卡 CM-2840),修第 6 棒 CM-2846 做出的清單頁:平列版改成依專案分組展開,規則與 FR-142 稽核作業(CM-2850)同一套,直接取代平列版、不做兩種模式切換。決策者 2026-10-17 裁。
側邊選單「改善計畫」的清單,現在是一個稽核次一列,同一個專案稽核過三次就出現三列,PM 看不出哪個專案現在卡在哪。改成一個專案一列:專案列顯示「目前這一次」的數字(最急的那次:待規劃 > 已送出 > 覆核中 > 已結束,同狀態取最晚到期最近的),點專案列展開底下每一份改善計畫,「目前」那次加粗標 tag。只有一份的專案不展開、小字直接寫稽核次、點列直接進去。預設展開有待規劃的專案,工具列加「全部展開/收合」。專案名下小字寫「共 N 份改善計畫 · 第 R 輪」(決策者裁 A 案,N=點開看到的子列數)。
last_due 最近的(沒有 last_due 排後面)。專案名下小字:「共 N 份改善計畫 · 第 R 輪」,N=該專案全部(未套篩選)有改善計畫的稽核次數,R=最大 round_no;套了頁籤或下拉篩選後 N 與子列數不同時加「(符合篩選 M 次)」。小字後接「 · 標準名」。closed_at 由舊到新;第一格縮排+樹線(├/└)+稽核次文字,「目前這一次」加粗並掛小 tag「目前」。子列其他欄位與現行平列版一列完全相同(狀態膠囊、已規劃÷不符合、退回任務數、最晚到期含 30 天內橘/過期紅、結案日、送出日)。點子列進該次改善計畫頁(現行 enter,帶該次的 round_uid 與 pass_uid)。子列背景 --bg-active、hover --bg-hover;已結束的子列文字 --text-muted。status_counts,不變)。選某狀態時:只留有該狀態稽核次的專案,子列只剩那幾次,專案列的「目前這一次」改在符合篩選的那幾次裡取。稽核性質、標準兩個下拉同理。~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/views/project/MyPoamsView.vue 243 行,現行平列版(棒 6 產出);本卡的全部改動在這支+composable+i18n
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/composables/useAuditWorkGroups.js 123 行,CM-2850 給稽核作業頁寫的分組 composable——攤平陣列、open 集合、touched、toggleAll、以專案為單位排序分頁都在裡面;本卡要共用它,見「怎麼做」①
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/views/project/MyAuditsView.vue 378 行,稽核作業頁怎麼接 composable、模板怎麼畫兩層列,先看它
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/config/locales/i18n/zh-tw/my-poams.json 與 en/my-poams.json:新 key 加這裡
~/Projects/Billows/Audit-Manager/compliance-manager-be/api/project/serializers/poam_dashboard.py:23-39 每筆已回 project_uid/round_uid/pass_uid/is_current/status/objectives/planned/jobs/last_due/closed_at/submitted_at——分組用 project_uid 當 key,不動 BE
~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-143-2610-poam-ao-worksheet-and-excel/prototype/my-poams-grouped.html 決策者看過的定案雛形,目前這一次/預設展開/搜尋自動展開/A 案小字的邏輯都在裡面可直接對照
useAuditWorkGroups.js 目前綁了兩個稽核作業專屬的東西——預設展開看 cur.ap_status === 'auditing'(:62),以及 mergeAuditors(:84,專案列合併稽核人員)。把它泛用化:建構參數多收 defaultOpen: (g) => boolean 與 extraProjectFields: (g) => object(稽核作業頁傳 auditors 合併、本頁傳空),排序鍵 _status/_end 改由呼叫端 decorate 時給(本頁 _status=planning 0/submitted 1/reverifying 2/closed 3,_end=last_due 毫秒,無則 Infinity)。改完稽核作業頁行為不得變——MyAuditsView.vue 只改傳參那幾行;CM-2850 若仍在進行中,先看它的 commit 有沒有動這支檔,動了就以它為準再加參數,不要互相蓋。fetch 一次撈全部稽核次(BE 已有分頁,改傳 page_size 夠大或加 paging:false,先看 RequestMetaSchema 的 pager.paging 支不支援不分頁;不支援就分頁撈到底再合併);decorate 後搜尋與頁籤篩選先在稽核次層做,再丟 composable 分組;模板照 MyAuditsView.vue 的兩層列寫法,rowClass 依 _kind 給 proj-row/sub-row,分頁用自己的 Paginator 算專案數。MyPoamsView.vue 243 行,加上分組模板不應超過 800;超過就把本頁的 decorate/篩選抽成 src/composables/usePoamGroups.js,view 只留模板。poam_count_round=「共 {n} 份改善計畫 · 第 {r} 輪」/「{n} POA&Ms · Round {r}」、filtered_count=「(符合篩選 {m} 次)」、current_tag=「目前」/「Current」、expand_all/collapse_all、pager_projects=「第 {from}~{to} 個專案,共 {total} 個」。已有同名 key 在 my-audits.json 的,不要跨檔引用,各頁各自一份。