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:
@@ -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
|
||||
@@ -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 格式不變
|
||||
|
||||
- **風險評估**:低風險,僅排除不應顯示的原物料資料
|
||||
@@ -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 不再顯示於統計中
|
||||
@@ -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%'")
|
||||
|
||||
Reference in New Issue
Block a user