Files
egg f14591c7dc feat(mid-section-defect): full-line bidirectional defect trace center with dual query mode
Transform /mid-section-defect from TMTT-only backward analysis into a full-line
bidirectional defect traceability center supporting all detection stations.

Key changes:
- Parameterized station detection: any workcenter group as detection station
- Bidirectional tracing: backward (upstream attribution) + forward (downstream reject rates)
- Dual query mode: date range OR LOT/工單/WAFER container-based seed resolution
- Multi-select filters for upstream station, equipment model (RESOURCEFAMILYNAME), and loss reasons
- Progressive 3-stage trace pipeline (seed-resolve → lineage → events) with streaming UI
- Equipment model lookup via resource cache instead of SPECNAME
- Session caching, auto-refresh, searchable MultiSelect with fuzzy matching
- Remove legacy tmtt-defect module (fully superseded)
- Archive openspec change artifacts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 16:16:33 +08:00

54 lines
3.6 KiB
Markdown

## ADDED Requirements
### Requirement: Detection SQL SHALL be parameterized by workcenter group
The system SHALL replace hardcoded TMTT station filtering with a `{{ STATION_FILTER }}` template placeholder in `station_detection.sql`. The filter SHALL be built from `WORKCENTER_GROUPS[station]['patterns']` and `['exclude']` defined in `workcenter_groups.py`, generating OR-LIKE clauses with bind parameters.
#### Scenario: Station filter built from workcenter group patterns
- **WHEN** `station='電鍍'` is requested
- **THEN** the system SHALL build a SQL fragment: `UPPER(h.WORKCENTERNAME) LIKE :wc_p0 OR UPPER(h.WORKCENTERNAME) LIKE :wc_p1 OR ...` with bind values `['%掛鍍%', '%滾鍍%', '%條鍍%', '%電鍍%', '%補鍍%', '%TOTAI%', '%BANDL%']`
#### Scenario: Station filter respects exclude patterns
- **WHEN** `station='切割'` is requested (which has `exclude: ['元件切割', 'PKG_SAW']`)
- **THEN** the filter SHALL include patterns for '切割' AND exclude patterns via `AND UPPER(h.WORKCENTERNAME) NOT LIKE :wc_ex0 AND NOT LIKE :wc_ex1`
#### Scenario: Default station is 測試
- **WHEN** no `station` parameter is provided
- **THEN** the system SHALL default to `station='測試'` (patterns: `['TMTT', '測試']`)
- **THEN** results SHALL be equivalent to the previous hardcoded TMTT behavior
### Requirement: station_detection.sql SHALL generalize tmtt_detection.sql
`station_detection.sql` SHALL be a new SQL file that replaces `tmtt_detection.sql` with parameterized station filtering. Column aliases SHALL use `DETECTION_` prefix instead of `TMTT_` prefix.
#### Scenario: SQL column renaming
- **WHEN** `station_detection.sql` is executed
- **THEN** output columns SHALL include `DETECTION_EQUIPMENTID` and `DETECTION_EQUIPMENTNAME` (not `TMTT_EQUIPMENTID` / `TMTT_EQUIPMENTNAME`)
#### Scenario: Both WIP and reject CTEs use station filter
- **WHEN** the SQL is executed
- **THEN** both the WIP history CTE and the reject history CTE SHALL apply `{{ STATION_FILTER }}` to filter by the selected station
### Requirement: Station options endpoint SHALL return all workcenter groups
`GET /api/mid-section-defect/station-options` SHALL return the 12 workcenter groups from `WORKCENTER_GROUPS` as an ordered list with `name` and `order` fields.
#### Scenario: Station options response format
- **WHEN** the endpoint is called
- **THEN** it SHALL return a JSON array of 12 objects: `[{"name": "切割", "order": 0}, {"name": "焊接_DB", "order": 1}, ...]` sorted by order
### Requirement: All API endpoints SHALL accept station and direction parameters
All `/api/mid-section-defect/*` endpoints (`/analysis`, `/analysis/detail`, `/loss-reasons`, `/export`) SHALL accept `station` (string, default `'測試'`) and `direction` (string, `'backward'` | `'forward'`, default `'backward'`) query parameters.
#### Scenario: Parameters passed to service layer
- **WHEN** `/api/mid-section-defect/analysis?station=成型&direction=forward` is called
- **THEN** `query_analysis()` SHALL receive `station='成型'` and `direction='forward'`
#### Scenario: Invalid station rejected
- **WHEN** a station name not in `WORKCENTER_GROUPS` is provided
- **THEN** the endpoint SHALL return HTTP 400 with an error message
### Requirement: Cache key SHALL include station and direction
The cache key for analysis results SHALL include `station` and `direction` to prevent cross-contamination between different query contexts.
#### Scenario: Different station/direction combinations cached separately
- **WHEN** `station=測試, direction=backward` is queried, then `station=成型, direction=forward` is queried
- **THEN** each SHALL have its own independent cache entry