Files
DashBoard/openspec/changes/archive/2026-03-03-add-material-trace-page/tasks.md
egg 777751311c
Some checks failed
full-modernization-gates / frontend-route-governance (push) Has been cancelled
full-modernization-gates / backend-modernization-gates (push) Has been cancelled
released-pages-hardening-gates / released-pages-hardening (push) Has been cancelled
feat: add material trace page for bidirectional LOT/material query
Implement full-stack material trace feature enabling forward (LOT/工單 → 原物料)
and reverse (原物料 → LOT) queries with wildcard support, safeguards (memory guard,
IN-clause batching, Oracle slow-query channel), CSV export, and portal-shell integration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 17:32:41 +08:00

64 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 1. SQL 查詢檔
- [x] 1.1 建立 `src/mes_dashboard/sql/material_trace/` 目錄
- [x] 1.2 新增 `forward_by_lot.sql`:以 CONTAINERID IN (:ids) 查詢 `DW_MES_LOTMATERIALSHISTORY`LEFT JOIN `DW_MES_CONTAINER` 取 CONTAINERNAME含可選 WORKCENTERNAME IN 篩選
- [x] 1.3 新增 `forward_by_workorder.sql`:以 PJ_WORKORDER IN (:ids) 查詢,結構與 forward_by_lot 相同
- [x] 1.4 新增 `reverse_by_material_lot.sql`:以 MATERIALLOTNAME IN (:ids) 查詢LEFT JOIN `DW_MES_CONTAINER` 取 CONTAINERNAME含 FETCH FIRST 10001 ROWS ONLY 上限,含可選 WORKCENTERNAME IN 篩選
- [x] 1.5 新增 `resolve_container_ids.sql`:批次將 CONTAINERNAME 轉換為 CONTAINERID
## 2. 後端 Service
- [x] 2.1 新增 `src/mes_dashboard/services/material_trace_service.py`,包含 `forward_query(mode, values, workcenter_groups, page, per_page)` 函式
- [x] 2.2 在 `forward_query` 中實作 LOT ID 模式:呼叫 `resolve_container_ids.sql` 將 CONTAINERNAME 批次轉換為 CONTAINERID記錄未解析的名稱到 `meta.unresolved`
- [x] 2.3 在 `forward_query` 中實作工單模式:直接以 PJ_WORKORDER 查詢
- [x] 2.4 實作 `reverse_query(values, workcenter_groups, page, per_page)` 函式,以 MATERIALLOTNAME 查詢,檢查結果是否超過 10,000 筆並設定 `meta.truncated`
- [x] 2.5 實作共用 `_enrich_workcenter_group(df)` 函式:使用 `filter_cache.get_workcenter_mapping()` 對 DataFrame 添加 WORKCENTER_GROUP 欄位
- [x] 2.6 實作共用 `_apply_workcenter_group_filter(workcenter_groups)` 函式:透過 `filter_cache.get_workcenter_mapping()` 將站群組名稱解析為 WORKCENTERNAME 清單,供 SQL WHERE 使用
- [x] 2.7 實作 `export_csv(mode, values, workcenter_groups)` 函式,結果上限 50,000 筆,回傳 UTF-8 BOM CSV
## 3. 後端 Route
- [x] 3.1 新增 `src/mes_dashboard/routes/material_trace_routes.py`,建立 `material_trace_bp` Blueprintprefix `/api/material-trace`
- [x] 3.2 實作 `POST /query` 端點:驗證 modelot/workorder/material_lot、values 非空、筆數上限(正向 200 / 反向 50根據 mode 呼叫 `forward_query``reverse_query`;回傳分頁結果
- [x] 3.3 實作 `POST /export` 端點:與 query 相同參數驗證,呼叫 `export_csv`,回傳 CSV response
- [x] 3.4 實作 `GET /filter-options` 端點:回傳 `filter_cache.get_workcenter_groups()` 供前端站群組下拉選單使用
- [x] 3.5 加入 rate limitingquery 30/60sexport 10/60s
- [x] 3.6 在 `routes/__init__.py` 註冊 `material_trace_bp`
## 4. 前端頁面基礎
- [x] 4.1 新增 `frontend/material-trace.html` Vite entry point
- [x] 4.2 新增 `frontend/src/material-trace/main.js` 初始化 Vue app
- [x] 4.3 新增 `frontend/src/material-trace/App.vue` 主元件:包含 queryModeforward/reverse、forwardInputTypelot/workorder、inputText、workcenterGroups、results、pagination、loading、error 等 reactive state
- [x] 4.4 新增 `frontend/src/material-trace/style.css`,沿用 reject-history 的表格/banner 樣式基礎
- [x] 4.5 在 `vite.config.js` 加入 `material-trace` entry
- [x] 4.6 在 Flask 後端 `templates/` 新增頁面路由(或 Jinja template確認頁面可存取
## 5. 前端元件
- [x] 5.1 實作查詢模式切換 tab正向查詢 / 反向查詢),切換時清空輸入和結果
- [x] 5.2 實作正向模式的輸入類型選擇LOT ID / 工單),切換時清空輸入
- [x] 5.3 實作多筆輸入 textarea使用 `parseMultiLineInput()` 解析,顯示已輸入筆數
- [x] 5.4 實作前端輸入筆數驗證(正向 200 筆 / 反向 50 筆),超過時顯示 error banner 並阻止查詢
- [x] 5.5 實作站群組多選篩選下拉options 從 `/api/material-trace/filter-options` 載入)
- [x] 5.6 實作 `executePrimaryQuery()` 函式:呼叫 `/api/material-trace/query` API處理結果、分頁、error、unresolved、truncated 警告
- [x] 5.7 實作結果表格,含 13 個欄位CONTAINERNAME、PJ_WORKORDER、WORKCENTER_GROUP、WORKCENTERNAME、MATERIALPARTNAME、MATERIALLOTNAME、VENDORLOTNUMBER、QTYREQUIRED、QTYCONSUMED、EQUIPMENTNAME、TXNDATE、PRIMARY_CATEGORY、SECONDARY_CATEGORY
- [x] 5.8 實作分頁控制(上一頁/下一頁/頁碼顯示server-side 分頁
- [x] 5.9 實作匯出 CSV 按鈕,呼叫 `/api/material-trace/export`,無結果時 disabled
- [x] 5.10 實作 loading overlay、error banner、warning bannerunresolved LOT / 結果截斷)
## 6. 導覽整合
- [x] 6.1 在 sidebar/drawer 導覽列新增「原物料追溯查詢」頁面入口
## 7. 測試
- [x] 7.1 新增 `tests/test_material_trace_service.py`:測試正向 LOT 模式查詢mock Oracle 回傳),驗證 CONTAINERID resolve + 結果 enrichment
- [x] 7.2 測試正向工單模式查詢,驗證 PJ_WORKORDER 直接查詢
- [x] 7.3 測試反向查詢,驗證結果上限 10,000 筆截斷邏輯
- [x] 7.4 測試站群組篩選mock `get_workcenter_mapping()` 回傳 mapping驗證 WORKCENTERNAME IN 過濾
- [x] 7.5 測試未解析 LOT ID 的 `meta.unresolved` 回傳
- [x] 7.6 新增 `tests/test_material_trace_routes.py`測試輸入驗證mode 無效、values 空、超過筆數上限)回傳 HTTP 400
- [x] 7.7 測試 query 端點回傳正確分頁結構
- [x] 7.8 測試 export 端點回傳 CSV content-type 和 UTF-8 BOM