建議 model:opus/effort:medium — 要同時維持新舊兩條 route 都能用,且 state 的 key 格式要換。
本卡屬 FR-107(母卡 CM-1843)第 .3 棒(子需求卡 CM-1846),子任務 T-3.3:做出用新編號(run uid)讀寫分類結果的 API,並讓批次詳情帶上結果與「這份檔內容跟某個既有證據一樣」的提示。
分類結果現在要用新的編號(run 的 uid)來存取,不再用 Google Drive 資料夾編號。這張卡做三件事:
/classification-run/<run_uid>/state(讀/寫審閱結果)、/file/<file_uid>/preview(預覽檔案,走儲存插座取檔再轉 PDF)、兩份報表改讀目標集快照。state 裡的 key 換格式:檔案的 key 從 Google Drive 檔案編號改成 file_uid;檢查點的 key 從 AC.L1-3.1.1[a](字母格式)改成 AC.L1-3.1.1_obj.2(系統內的 part_id),每筆保留 ao_letter 給畫面顯示用。same_content_evidences——如果這份檔的內容雜湊跟這個輪次裡某個既有證據一樣,就提示「與任務 X 既有證據內容相同」。只提示、不阻擋。🔴 舊的路徑要原樣保留(用 Drive 資料夾編號的那些),POC 上的舊資料還要打得開(D3)。
套件(走 path dependency 開發)
~/Projects/Jedicogy/module/jedi-python-package/jedi-evidence-classification/
.../api/routing.py
:56 /classification-run/<run_folder_id>/state ← 🔴 原樣保留,docstring 標 legacy
:60 .../archive ← 原樣保留
:64 .../file/<file_drive_id>/preview ← 原樣保留
:70 :74 兩份報表 ← 原樣保留 + 新增 run_uid 版
← 新增 /classification-run/<run_uid>/state(GET/PUT)
← 新增 /classification-run/<run_uid>/file/<file_uid>/preview
← 新增 /classification-run/<run_uid>/report/validation、.../adjudication
.../app/service/evidence_classification_service.py
:733 put_state(run_folder_id, ...) ← 保留;新增以 run uid 定址的版本
.../report/report_common.py
:60 load_catalog ← 改讀 run 的 catalog_snapshot;
🔴 沒有快照的舊列 fallback 舊 JSON(T-5.2 才刪 JSON)
批次詳情(T-1.3 做的 GET /evidence-batches/<batch_uid>)
← 每檔加 same_content_evidences(走 ITaskEvidenceSink.find_same_content)
方法 路徑 守門
GET/PUT /evidence-batches 系列已在 T-1.3
GET/PUT /classification-run/<run_uid>/state participant/manager
GET /classification-run/<run_uid>/file/<file_uid>/preview participant
GET /classification-run/<run_uid>/report/validation participant
GET /classification-run/<run_uid>/report/adjudication participant
state 的資料形狀(design.md §6.1.4)
檔案 key:file_uid(原本是 Drive file id)
AO key: part_id,形如 AC.L1-3.1.1_obj.2(原本是 AC.L1-3.1.1[a])
每筆保留 ao_letter 欄位供前端顯示
批次詳情每檔多帶
same_content_evidences: [{job_execution_id, evidence_uid, job_name}] D9 提示,不阻擋
/file/<file_uid>/preview 用 IEvidenceStorage.get_bytes 取檔、IDocumentConverter 轉 PDF。不要自己再寫一套取檔。load_catalog(:60)改成「run 有 catalog_snapshot 就讀它,沒有就走舊的讀套件 JSON」。舊 JSON 在 T-5.2 才刪,本卡刪掉會讓舊 run 的報表立刻壞。find_same_content 這時候還是 NotImplementedError(T-2.2 留的,T-4.1 才實作)。本卡把呼叫接好,回空清單也可以——但要在回寫講清楚「提示功能要等 T-4.1 才會真的有內容」,並在 T-4.1 驗收時補驗。participant 用 T-1.3 加的 is_project_participant,manager 用既有的 is_project_manager。守門在 app service 層,不要做成 route decorator(資源域守門要先 resolve 資源)。