feat: WIP 查詢排除原物料 (WORKORDER IS NULL)

在 _build_base_conditions() 新增預設條件排除 WORKORDER 為 NULL 的紀錄,
避免將原物料納入 WIP 統計計算。

影響範圍:
- /api/wip/overview/summary
- /api/wip/overview/matrix
- /api/wip/overview/hold
- /api/wip/detail/<workcenter>
- /api/wip/meta/workcenters
- /api/wip/meta/packages
- /api/wip/meta/search

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
beabigegg
2026-01-28 10:41:03 +08:00
parent fcfa942762
commit babe3fc7f8
4 changed files with 153 additions and 0 deletions

View File

@@ -0,0 +1,87 @@
# Design: WIP Exclude NULL Workorder
## Overview
`_build_base_conditions()` 函數中新增預設條件,排除 `WORKORDER` 為 NULL 的紀錄(原物料)。
## Technical Approach
### 修改位置
**File**: `src/mes_dashboard/services/wip_service.py`
**Function**: `_build_base_conditions()`
**Line**: 44-48 區域
### 實作方式
`conditions` 列表建立後,立即加入 NULL WORKORDER 排除條件:
```python
def _build_base_conditions(
include_dummy: bool = False,
workorder: Optional[str] = None,
lotid: Optional[str] = None
) -> List[str]:
conditions = []
# Exclude raw materials (NULL WORKORDER)
conditions.append("WORKORDER IS NOT NULL")
# DUMMY exclusion (default behavior)
if not include_dummy:
conditions.append("LOTID NOT LIKE '%DUMMY%'")
# ... rest unchanged
```
### 條件順序
`WORKORDER IS NOT NULL` 放在條件列表最前面,因為:
1. 這是最基本的篩選條件,應最先套用
2. 可能有助於 SQL 優化器先過濾大量資料
### 影響的查詢
此條件會自動套用到所有使用 `_build_base_conditions()` 的函數:
| 函數 | API Endpoint |
|------|--------------|
| `get_wip_summary()` | `/api/wip/overview/summary` |
| `get_wip_matrix()` | `/api/wip/overview/matrix` |
| `get_wip_hold_summary()` | `/api/wip/overview/hold` |
| `get_wip_detail()` | `/api/wip/detail/<workcenter>` |
| `get_workcenters()` | `/api/wip/meta/workcenters` |
| `get_packages()` | `/api/wip/meta/packages` |
| `search_workorders()` | `/api/wip/meta/search?type=workorder` |
| `search_lot_ids()` | `/api/wip/meta/search?type=lotid` |
## Data Considerations
### 原物料判斷邏輯
- `WORKORDER IS NULL` → 原物料,不納入 WIP 統計
- `WORKORDER IS NOT NULL` → 生產中的 Lot納入 WIP 統計
### 無需額外參數
不提供 `include_raw_materials` 參數,因為:
1. WIP 系統設計上就不應該顯示原物料
2. 簡化 API避免混淆
3. 如未來需要,可再新增參數
## Testing
### 驗證方式
1. 比較修改前後的 WIP 總數
2. 確認 NULL WORKORDER 的 Lot 不再出現於:
- Overview Summary 統計
- Matrix 表格
- Hold Summary 列表
- Detail 頁面
### 預期結果
- WIP 總數會減少(排除原物料)
- 各狀態統計更準確
- 不影響現有功能和 UI

View File

@@ -0,0 +1,48 @@
## Why
目前 WIP Overview 和 WIP Detail 的查詢會包含所有 `DWH.DW_PJ_LOT_V` 中的資料,包括 `WORKORDER` 為 NULL 的紀錄。這些 NULL WORKORDER 的紀錄通常是原物料Raw Materials不應該納入 WIP 統計計算。
將原物料納入計算會造成:
- WIP 總數被高估,無法反映真實生產中的 Lot 數量
- 各狀態RUN/QUEUE/HOLD的統計不準確
- Matrix 和 Detail 表格顯示非生產相關的資料,造成混淆
## What Changes
### 後端改動
1. **wip_service.py - `_build_base_conditions()` 函數**
- 新增預設條件 `WORKORDER IS NOT NULL`
- 此條件會自動套用到所有 WIP 查詢Summary、Matrix、Hold Summary、Detail、Meta APIs
### 影響範圍
此改動會影響以下 API 的回傳資料:
- `/api/wip/overview/summary` - 排除原物料後的 WIP 統計
- `/api/wip/overview/matrix` - 排除原物料後的 Matrix
- `/api/wip/overview/hold` - 排除原物料後的 Hold Summary
- `/api/wip/detail/<workcenter>` - 排除原物料後的 Detail 資料
- `/api/wip/meta/workcenters` - 排除原物料後的 Workcenter 列表
- `/api/wip/meta/packages` - 排除原物料後的 Package 列表
- `/api/wip/meta/search` - 搜尋結果排除原物料
### 前端改動
- **無需修改**:前端直接使用後端回傳的資料,無需任何改動
## Capabilities
### Modified Capabilities
- `wip-service`: 在基礎查詢條件中排除 WORKORDER 為 NULL 的紀錄
## Impact
- **修改檔案**:
- `src/mes_dashboard/services/wip_service.py` - 新增 `WORKORDER IS NOT NULL` 條件
- **無新增檔案**:僅修改一處
- **向後相容**此為資料過濾邏輯調整API 格式不變
- **風險評估**:低風險,僅排除不應顯示的原物料資料

View File

@@ -0,0 +1,15 @@
# Implementation Tasks
## Phase 1: Backend 修改
### wip_service.py
- [x]`_build_base_conditions()` 函數開頭新增 `WORKORDER IS NOT NULL` 條件
---
## Phase 2: 驗證
- [x] 手動測試WIP Overview 頁面載入正常
- [x] 手動測試WIP Detail 頁面載入正常
- [x] 確認NULL WORKORDER 的 Lot 不再顯示於統計中

View File

@@ -43,6 +43,9 @@ def _build_base_conditions(
"""
conditions = []
# Exclude raw materials (NULL WORKORDER)
conditions.append("WORKORDER IS NOT NULL")
# DUMMY exclusion (default behavior)
if not include_dummy:
conditions.append("LOTID NOT LIKE '%DUMMY%'")