feat: add schedule preview functionality for production plans
- Implemented previewSchedule and previewSemiSchedule functions in the production controller to allow users to preview schedule changes without making actual database modifications. - Added corresponding routes for schedule preview in productionRoutes. - Enhanced productionPlanService with logic to generate schedule previews based on provided items and plan IDs. - Introduced SchedulePreviewDialog component to display the preview results in the frontend, including summary and detailed views of planned schedules. These updates improve the user experience by providing a way to visualize scheduling changes before applying them, ensuring better planning and decision-making. Made-with: Cursor
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# WACE 화면 시스템 - DB 스키마 & 컴포넌트 설정 전체 레퍼런스
|
||||
|
||||
> **최종 업데이트**: 2026-03-13
|
||||
> **최종 업데이트**: 2026-03-16
|
||||
> **용도**: AI 챗봇이 화면 생성 시 참조하는 DB 스키마, 컴포넌트 전체 설정 사전
|
||||
> **관련 문서**: `v2-component-usage-guide.md` (SQL 템플릿, 실행 예시)
|
||||
|
||||
@@ -532,15 +532,20 @@ CREATE TABLE "{테이블명}" (
|
||||
|
||||
---
|
||||
|
||||
### 3.11 v2-timeline-scheduler (간트차트)
|
||||
### 3.11 v2-timeline-scheduler (간트차트/타임라인)
|
||||
|
||||
**용도**: 시간축 기반 일정/계획 시각화. 드래그/리사이즈로 일정 편집.
|
||||
**용도**: 시간축 기반 일정/계획 시각화. 드래그/리사이즈로 일정 편집. 품목별 그룹 뷰, 자동 스케줄 생성, 반제품 계획 연동 지원.
|
||||
|
||||
**기본 설정**:
|
||||
|
||||
| 설정 | 타입 | 기본값 | 설명 |
|
||||
|------|------|--------|------|
|
||||
| selectedTable | string | - | 스케줄 데이터 테이블 |
|
||||
| customTableName | string | - | selectedTable 대신 사용 (useCustomTable=true 시) |
|
||||
| useCustomTable | boolean | `false` | customTableName 사용 여부 |
|
||||
| resourceTable | string | `"equipment_mng"` | 리소스(설비/작업자) 테이블 |
|
||||
| scheduleType | string | `"PRODUCTION"` | 스케줄 유형: `PRODUCTION`/`MAINTENANCE`/`SHIPPING`/`WORK_ASSIGN` |
|
||||
| viewMode | string | - | 뷰 모드: `"itemGrouped"` (품목별 카드 그룹) / 미설정 시 리소스 기반 |
|
||||
| defaultZoomLevel | string | `"day"` | 초기 줌: `day`/`week`/`month` |
|
||||
| editable | boolean | `true` | 편집 가능 |
|
||||
| draggable | boolean | `true` | 드래그 이동 허용 |
|
||||
@@ -548,15 +553,16 @@ CREATE TABLE "{테이블명}" (
|
||||
| rowHeight | number | `50` | 행 높이(px) |
|
||||
| headerHeight | number | `60` | 헤더 높이(px) |
|
||||
| resourceColumnWidth | number | `150` | 리소스 컬럼 너비(px) |
|
||||
| cellWidth.day | number | `60` | 일 단위 셀 너비 |
|
||||
| cellWidth.week | number | `120` | 주 단위 셀 너비 |
|
||||
| cellWidth.month | number | `40` | 월 단위 셀 너비 |
|
||||
| showConflicts | boolean | `true` | 시간 겹침 충돌 표시 |
|
||||
| showProgress | boolean | `true` | 진행률 바 표시 |
|
||||
| showTodayLine | boolean | `true` | 오늘 날짜 표시선 |
|
||||
| showToolbar | boolean | `true` | 상단 툴바 표시 |
|
||||
| showLegend | boolean | `true` | 범례(상태 색상 안내) 표시 |
|
||||
| showNavigation | boolean | `true` | 날짜 네비게이션 버튼 표시 |
|
||||
| showZoomControls | boolean | `true` | 줌 컨트롤 버튼 표시 |
|
||||
| showAddButton | boolean | `true` | 추가 버튼 |
|
||||
| height | number | `500` | 높이(px) |
|
||||
| maxHeight | number | - | 최대 높이(px) |
|
||||
|
||||
**fieldMapping (필수)**:
|
||||
|
||||
@@ -583,10 +589,74 @@ CREATE TABLE "{테이블명}" (
|
||||
| 상태 | 기본 색상 |
|
||||
|------|----------|
|
||||
| planned | `"#3b82f6"` (파랑) |
|
||||
| in_progress | `"#f59e0b"` (주황) |
|
||||
| completed | `"#10b981"` (초록) |
|
||||
| in_progress | `"#10b981"` (초록) |
|
||||
| completed | `"#6b7280"` (회색) |
|
||||
| delayed | `"#ef4444"` (빨강) |
|
||||
| cancelled | `"#6b7280"` (회색) |
|
||||
| cancelled | `"#9ca3af"` (연회색) |
|
||||
|
||||
**staticFilters (정적 필터)** - DB 조회 시 항상 적용되는 WHERE 조건:
|
||||
|
||||
| 설정 | 타입 | 설명 |
|
||||
|------|------|------|
|
||||
| product_type | string | `"완제품"` 또는 `"반제품"` 등 고정 필터 |
|
||||
| status | string | 상태값 필터 |
|
||||
| (임의 컬럼) | string | 해당 컬럼으로 필터링 |
|
||||
|
||||
```json
|
||||
"staticFilters": {
|
||||
"product_type": "완제품"
|
||||
}
|
||||
```
|
||||
|
||||
**linkedFilter (연결 필터)** - 다른 컴포넌트(주로 테이블)의 선택 이벤트와 연동:
|
||||
|
||||
| 설정 | 타입 | 설명 |
|
||||
|------|------|------|
|
||||
| sourceField | string | 소스 컴포넌트(좌측 테이블)의 필터 기준 컬럼 |
|
||||
| targetField | string | 타임라인 스케줄 데이터에서 매칭할 컬럼 |
|
||||
| sourceTableName | string | 이벤트 발신 테이블명 (이벤트 필터용) |
|
||||
| sourceComponentId | string | 이벤트 발신 컴포넌트 ID (선택) |
|
||||
| emptyMessage | string | 선택 전 빈 상태 메시지 |
|
||||
| showEmptyWhenNoSelection | boolean | 선택 전 빈 상태 표시 여부 |
|
||||
|
||||
```json
|
||||
"linkedFilter": {
|
||||
"sourceField": "part_code",
|
||||
"targetField": "item_code",
|
||||
"sourceTableName": "sales_order_mng",
|
||||
"emptyMessage": "좌측 수주 목록에서 품목을 선택하세요",
|
||||
"showEmptyWhenNoSelection": true
|
||||
}
|
||||
```
|
||||
|
||||
> **linkedFilter 동작 원리**: v2EventBus의 `TABLE_SELECTION_CHANGE` 이벤트를 구독.
|
||||
> 좌측 테이블에서 행을 선택하면 해당 행의 `sourceField` 값을 수집하여,
|
||||
> 타임라인 데이터 중 `targetField`가 일치하는 스케줄만 클라이언트 측에서 필터링 표시.
|
||||
> `staticFilters`는 서버 측 조회, `linkedFilter`는 클라이언트 측 필터링.
|
||||
|
||||
**viewMode: "itemGrouped" (품목별 그룹 뷰)**:
|
||||
|
||||
리소스(설비) 기반 간트차트 대신, 품목(item_code)별로 카드를 그룹화하여 표시하는 모드.
|
||||
각 카드 안에 해당 품목의 스케줄 바가 미니 타임라인으로 표시됨.
|
||||
|
||||
설정 시 `viewMode: "itemGrouped"`만 추가하면 됨. 툴바에 자동으로:
|
||||
- 날짜 네비게이션 (이전/오늘/다음)
|
||||
- 줌 컨트롤
|
||||
- 새로고침 버튼
|
||||
- (완제품 탭일 때) **완제품 계획 생성** / **반제품 계획 생성** 버튼
|
||||
|
||||
**자동 스케줄 생성 (내장 기능)**:
|
||||
|
||||
`viewMode: "itemGrouped"` + `staticFilters.product_type === "완제품"` 일 때 자동 활성화.
|
||||
|
||||
- **완제품 계획 생성**: linkedFilter로 선택된 수주 품목 기반, 미리보기 다이얼로그 → 확인 후 생성
|
||||
- API: `POST /production/generate-schedule/preview` → `POST /production/generate-schedule`
|
||||
- **반제품 계획 생성**: 현재 타임라인의 완제품 스케줄 기반, BOM 소요량으로 반제품 계획 미리보기 → 확인 후 생성
|
||||
- API: `POST /production/generate-semi-schedule/preview` → `POST /production/generate-semi-schedule`
|
||||
|
||||
> **중요**: 반제품 전용 타임라인에는 `linkedFilter`를 걸지 않는다.
|
||||
> 반제품 item_code가 수주 품목 코드와 다르므로 매칭 불가.
|
||||
> `staticFilters: { product_type: "반제품" }`만 설정하여 전체 반제품 계획을 표시.
|
||||
|
||||
---
|
||||
|
||||
@@ -923,16 +993,32 @@ CREATE TABLE "{테이블명}" (
|
||||
## 4. 패턴 의사결정 트리
|
||||
|
||||
```
|
||||
Q1. 시간축 기반 일정/간트차트? → v2-timeline-scheduler
|
||||
Q2. 다차원 피벗 분석? → v2-pivot-grid
|
||||
Q3. 그룹별 접기/펼치기? → v2-table-grouped
|
||||
Q4. 카드 형태 표시? → v2-card-display
|
||||
Q5. 마스터-디테일?
|
||||
Q1. 좌측 마스터 + 우측 탭(타임라인/테이블) 복합 구성?
|
||||
→ 패턴 F → v2-split-panel-layout(custom) + v2-tabs-widget + v2-timeline-scheduler
|
||||
Q2. 시간축 기반 일정/간트차트?
|
||||
├ 품목별 카드 그룹 뷰? → 패턴 E-2 → v2-timeline-scheduler(viewMode:itemGrouped)
|
||||
└ 리소스(설비) 기반? → 패턴 E → v2-timeline-scheduler
|
||||
Q3. 다차원 피벗 분석? → v2-pivot-grid
|
||||
Q4. 그룹별 접기/펼치기? → v2-table-grouped
|
||||
Q5. 카드 형태 표시? → v2-card-display
|
||||
Q6. 마스터-디테일?
|
||||
├ 우측 멀티 탭? → v2-split-panel-layout + additionalTabs
|
||||
└ 단일 디테일? → v2-split-panel-layout
|
||||
Q6. 단일 테이블? → v2-table-search-widget + v2-table-list
|
||||
Q7. 단일 테이블? → v2-table-search-widget + v2-table-list
|
||||
```
|
||||
|
||||
### 패턴 요약표
|
||||
|
||||
| 패턴 | 대표 화면 | 핵심 컴포넌트 |
|
||||
|------|----------|-------------|
|
||||
| A | 거래처관리 | v2-table-search-widget + v2-table-list |
|
||||
| B | 수주관리 | v2-split-panel-layout |
|
||||
| C | 수주관리(멀티탭) | v2-split-panel-layout + additionalTabs |
|
||||
| D | 재고현황 | v2-table-grouped |
|
||||
| E | 설비 작업일정 | v2-timeline-scheduler (리소스 기반) |
|
||||
| E-2 | 품목별 타임라인 | v2-timeline-scheduler (viewMode: itemGrouped) |
|
||||
| F | 생산계획 | split(custom) + tabs + timeline |
|
||||
|
||||
---
|
||||
|
||||
## 5. 관계(relation) 레퍼런스
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# WACE 화면 구현 실행 가이드 (챗봇/AI 에이전트 전용)
|
||||
|
||||
> **최종 업데이트**: 2026-03-13
|
||||
> **최종 업데이트**: 2026-03-16
|
||||
> **용도**: 사용자가 "수주관리 화면 만들어줘"라고 요청하면, 이 문서를 참조하여 SQL을 직접 생성하고 화면을 구현하는 AI 챗봇용 실행 가이드
|
||||
> **핵심**: 이 문서의 SQL 템플릿을 따라 INSERT하면 화면이 자동으로 생성된다
|
||||
|
||||
@@ -533,7 +533,9 @@ DO UPDATE SET layout_data = EXCLUDED.layout_data, updated_at = now();
|
||||
}
|
||||
```
|
||||
|
||||
### 8.5 패턴 E: 타임라인/간트차트
|
||||
### 8.5 패턴 E: 타임라인/간트차트 (리소스 기반)
|
||||
|
||||
**사용 조건**: 설비/작업자 등 리소스 기준으로 스케줄을 시간축에 표시
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -575,6 +577,246 @@ DO UPDATE SET layout_data = EXCLUDED.layout_data, updated_at = now();
|
||||
}
|
||||
```
|
||||
|
||||
### 8.6 패턴 E-2: 타임라인 (품목 그룹 뷰 + 연결 필터)
|
||||
|
||||
**사용 조건**: 좌측 테이블에서 선택한 품목 기반으로 타임라인을 필터링 표시. 품목별 카드 그룹 뷰.
|
||||
|
||||
> 리소스(설비) 기반이 아닌, **품목(item_code)별로 카드 그룹** 형태로 스케줄을 표시한다.
|
||||
> 좌측 테이블에서 행을 선택하면 `linkedFilter`로 해당 품목의 스케줄만 필터링.
|
||||
> `staticFilters`로 완제품/반제품 등 데이터 유형을 고정 필터링.
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "timeline_finished",
|
||||
"url": "@/lib/registry/components/v2-timeline-scheduler",
|
||||
"position": { "x": 0, "y": 0 },
|
||||
"size": { "width": 1920, "height": 800 },
|
||||
"displayOrder": 0,
|
||||
"overrides": {
|
||||
"label": "완제품 생산계획",
|
||||
"selectedTable": "{스케줄_테이블}",
|
||||
"viewMode": "itemGrouped",
|
||||
"fieldMapping": {
|
||||
"id": "id",
|
||||
"resourceId": "item_code",
|
||||
"title": "item_name",
|
||||
"startDate": "start_date",
|
||||
"endDate": "end_date",
|
||||
"status": "status"
|
||||
},
|
||||
"defaultZoomLevel": "day",
|
||||
"staticFilters": {
|
||||
"product_type": "완제품"
|
||||
},
|
||||
"linkedFilter": {
|
||||
"sourceField": "part_code",
|
||||
"targetField": "item_code",
|
||||
"sourceTableName": "{좌측_테이블명}",
|
||||
"emptyMessage": "좌측 목록에서 품목을 선택하세요",
|
||||
"showEmptyWhenNoSelection": true
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**핵심 설정 설명**:
|
||||
|
||||
| 설정 | 용도 |
|
||||
|------|------|
|
||||
| `viewMode: "itemGrouped"` | 리소스 행이 아닌, 품목별 카드 그룹으로 표시 |
|
||||
| `staticFilters` | DB 조회 시 항상 적용 (서버측 WHERE 조건) |
|
||||
| `linkedFilter` | 다른 컴포넌트 선택 이벤트로 클라이언트 측 필터링 |
|
||||
| `linkedFilter.sourceField` | 소스 테이블에서 가져올 값의 컬럼명 |
|
||||
| `linkedFilter.targetField` | 타임라인 데이터에서 매칭할 컬럼명 |
|
||||
|
||||
> **주의**: `linkedFilter`와 `staticFilters`의 차이
|
||||
> - `staticFilters`: DB SELECT 쿼리의 WHERE 절에 포함 → 서버에서 필터링
|
||||
> - `linkedFilter`: 전체 데이터를 불러온 후, 선택 이벤트에 따라 클라이언트에서 필터링
|
||||
|
||||
### 8.7 패턴 F: 복합 화면 (좌측 테이블 + 우측 탭 내 타임라인)
|
||||
|
||||
**사용 조건**: 생산계획처럼 좌측 마스터 테이블 + 우측에 탭으로 여러 타임라인/테이블을 표시하는 복합 화면.
|
||||
`v2-split-panel-layout`의 `rightPanel.displayMode: "custom"` + `v2-tabs-widget` + `v2-timeline-scheduler` 조합.
|
||||
|
||||
**구조 개요**:
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ v2-split-panel-layout │
|
||||
│ ┌──────────┬─────────────────────────────────┐ │
|
||||
│ │ leftPanel │ rightPanel (displayMode:custom)│ │
|
||||
│ │ │ ┌─────────────────────────────┐│ │
|
||||
│ │ v2-table- │ │ v2-tabs-widget ││ │
|
||||
│ │ grouped │ │ ┌───────┬───────┬─────────┐ ││ │
|
||||
│ │ (수주목록) │ │ │완제품 │반제품 │기타 탭 │ ││ │
|
||||
│ │ │ │ └───────┴───────┴─────────┘ ││ │
|
||||
│ │ │ │ ┌─────────────────────────┐ ││ │
|
||||
│ │ │ │ │ v2-timeline-scheduler │ ││ │
|
||||
│ │ │ │ │ (품목별 그룹 뷰) │ ││ │
|
||||
│ │ │ │ └─────────────────────────┘ ││ │
|
||||
│ │ │ └─────────────────────────────┘│ │
|
||||
│ └──────────┴─────────────────────────────────┘ │
|
||||
└──────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**실제 layout_data 예시** (생산계획 화면 참고):
|
||||
|
||||
```json
|
||||
{
|
||||
"version": "2.0",
|
||||
"components": [
|
||||
{
|
||||
"id": "split_pp",
|
||||
"url": "@/lib/registry/components/v2-split-panel-layout",
|
||||
"position": { "x": 0, "y": 0 },
|
||||
"size": { "width": 1920, "height": 850 },
|
||||
"displayOrder": 0,
|
||||
"overrides": {
|
||||
"label": "생산계획",
|
||||
"splitRatio": 25,
|
||||
"resizable": true,
|
||||
"autoLoad": true,
|
||||
"syncSelection": true,
|
||||
"leftPanel": {
|
||||
"title": "수주 목록",
|
||||
"displayMode": "custom",
|
||||
"components": [
|
||||
{
|
||||
"id": "grouped_orders",
|
||||
"componentType": "v2-table-grouped",
|
||||
"label": "수주별 품목",
|
||||
"position": { "x": 0, "y": 0 },
|
||||
"size": { "width": 600, "height": 800 },
|
||||
"componentConfig": {
|
||||
"selectedTable": "sales_order_mng",
|
||||
"groupConfig": {
|
||||
"groupByColumn": "order_number",
|
||||
"groupLabelFormat": "{value}",
|
||||
"defaultExpanded": true,
|
||||
"summary": { "showCount": true }
|
||||
},
|
||||
"columns": [
|
||||
{ "columnName": "part_code", "displayName": "품번", "visible": true, "width": 100 },
|
||||
{ "columnName": "part_name", "displayName": "품명", "visible": true, "width": 120 },
|
||||
{ "columnName": "order_qty", "displayName": "수량", "visible": true, "width": 60 },
|
||||
{ "columnName": "delivery_date", "displayName": "납기일", "visible": true, "width": 90 }
|
||||
],
|
||||
"showCheckbox": true,
|
||||
"checkboxMode": "multi"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"rightPanel": {
|
||||
"title": "생산 계획",
|
||||
"displayMode": "custom",
|
||||
"components": [
|
||||
{
|
||||
"id": "tabs_pp",
|
||||
"componentType": "v2-tabs-widget",
|
||||
"label": "생산계획 탭",
|
||||
"position": { "x": 0, "y": 0 },
|
||||
"size": { "width": 1400, "height": 800 },
|
||||
"componentConfig": {
|
||||
"tabs": [
|
||||
{
|
||||
"id": "tab_finished",
|
||||
"label": "완제품",
|
||||
"order": 1,
|
||||
"components": [
|
||||
{
|
||||
"id": "timeline_finished",
|
||||
"componentType": "v2-timeline-scheduler",
|
||||
"label": "완제품 타임라인",
|
||||
"position": { "x": 0, "y": 0 },
|
||||
"size": { "width": 1380, "height": 750 },
|
||||
"componentConfig": {
|
||||
"selectedTable": "production_plan_mng",
|
||||
"viewMode": "itemGrouped",
|
||||
"fieldMapping": {
|
||||
"id": "id",
|
||||
"resourceId": "item_code",
|
||||
"title": "item_name",
|
||||
"startDate": "start_date",
|
||||
"endDate": "end_date",
|
||||
"status": "status"
|
||||
},
|
||||
"defaultZoomLevel": "day",
|
||||
"staticFilters": {
|
||||
"product_type": "완제품"
|
||||
},
|
||||
"linkedFilter": {
|
||||
"sourceField": "part_code",
|
||||
"targetField": "item_code",
|
||||
"sourceTableName": "sales_order_mng",
|
||||
"emptyMessage": "좌측 수주 목록에서 품목을 선택하세요",
|
||||
"showEmptyWhenNoSelection": true
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "tab_semi",
|
||||
"label": "반제품",
|
||||
"order": 2,
|
||||
"components": [
|
||||
{
|
||||
"id": "timeline_semi",
|
||||
"componentType": "v2-timeline-scheduler",
|
||||
"label": "반제품 타임라인",
|
||||
"position": { "x": 0, "y": 0 },
|
||||
"size": { "width": 1380, "height": 750 },
|
||||
"componentConfig": {
|
||||
"selectedTable": "production_plan_mng",
|
||||
"viewMode": "itemGrouped",
|
||||
"fieldMapping": {
|
||||
"id": "id",
|
||||
"resourceId": "item_code",
|
||||
"title": "item_name",
|
||||
"startDate": "start_date",
|
||||
"endDate": "end_date",
|
||||
"status": "status"
|
||||
},
|
||||
"defaultZoomLevel": "day",
|
||||
"staticFilters": {
|
||||
"product_type": "반제품"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"defaultTab": "tab_finished"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"gridSettings": { "columns": 12, "gap": 16, "padding": 16 },
|
||||
"screenResolution": { "width": 1920, "height": 1080 }
|
||||
}
|
||||
```
|
||||
|
||||
**패턴 F 핵심 포인트**:
|
||||
|
||||
| 포인트 | 설명 |
|
||||
|--------|------|
|
||||
| `leftPanel.displayMode: "custom"` | 좌측에 v2-table-grouped 등 자유 배치 |
|
||||
| `rightPanel.displayMode: "custom"` | 우측에 v2-tabs-widget 등 자유 배치 |
|
||||
| `componentConfig` | custom 내부 컴포넌트는 overrides 대신 componentConfig 사용 |
|
||||
| `componentType` | custom 내부에서는 url 대신 componentType 사용 |
|
||||
| 완제품 탭에만 `linkedFilter` | 좌측 테이블과 연동 필터링 |
|
||||
| 반제품 탭에는 `linkedFilter` 없음 | 반제품 item_code가 수주 품목과 다르므로 전체 표시 |
|
||||
| 자동 스케줄 생성 버튼 | `staticFilters.product_type === "완제품"` 일 때 자동 표시 |
|
||||
|
||||
> **displayMode: "custom" 내부 컴포넌트 규칙**:
|
||||
> - `url` 대신 `componentType` 사용 (예: `"v2-timeline-scheduler"`, `"v2-table-grouped"`)
|
||||
> - `overrides` 대신 `componentConfig` 사용
|
||||
> - `position`, `size`는 동일하게 사용
|
||||
|
||||
---
|
||||
|
||||
## 9. Step 7: menu_info INSERT
|
||||
@@ -696,29 +938,47 @@ VALUES
|
||||
사용자가 화면을 요청하면 이 트리로 패턴을 결정한다.
|
||||
|
||||
```
|
||||
Q1. 시간축 기반 일정/간트차트가 필요한가?
|
||||
├─ YES → 패턴 E (타임라인) → v2-timeline-scheduler
|
||||
Q1. 좌측 마스터 + 우측에 탭으로 타임라인/테이블 등 복합 구성이 필요한가?
|
||||
├─ YES → 패턴 F (복합 화면) → v2-split-panel-layout(custom) + v2-tabs-widget + v2-timeline-scheduler
|
||||
└─ NO ↓
|
||||
|
||||
Q2. 다차원 집계/피벗 분석이 필요한가?
|
||||
Q2. 시간축 기반 일정/간트차트가 필요한가?
|
||||
├─ YES → Q2-1. 품목별 카드 그룹 뷰인가?
|
||||
│ ├─ YES → 패턴 E-2 (품목 그룹 타임라인) → v2-timeline-scheduler(viewMode:itemGrouped)
|
||||
│ └─ NO → 패턴 E (리소스 기반 타임라인) → v2-timeline-scheduler
|
||||
└─ NO ↓
|
||||
|
||||
Q3. 다차원 집계/피벗 분석이 필요한가?
|
||||
├─ YES → 피벗 → v2-pivot-grid
|
||||
└─ NO ↓
|
||||
|
||||
Q3. 데이터를 그룹별로 접기/펼치기가 필요한가?
|
||||
Q4. 데이터를 그룹별로 접기/펼치기가 필요한가?
|
||||
├─ YES → 패턴 D (그룹화) → v2-table-grouped
|
||||
└─ NO ↓
|
||||
|
||||
Q4. 이미지+정보를 카드 형태로 표시하는가?
|
||||
Q5. 이미지+정보를 카드 형태로 표시하는가?
|
||||
├─ YES → 카드뷰 → v2-card-display
|
||||
└─ NO ↓
|
||||
|
||||
Q5. 마스터 테이블 선택 시 연관 디테일이 필요한가?
|
||||
├─ YES → Q5-1. 디테일에 여러 탭이 필요한가?
|
||||
Q6. 마스터 테이블 선택 시 연관 디테일이 필요한가?
|
||||
├─ YES → Q6-1. 디테일에 여러 탭이 필요한가?
|
||||
│ ├─ YES → 패턴 C (마스터-디테일+탭) → v2-split-panel-layout + additionalTabs
|
||||
│ └─ NO → 패턴 B (마스터-디테일) → v2-split-panel-layout
|
||||
└─ NO → 패턴 A (기본 마스터) → v2-table-search-widget + v2-table-list
|
||||
```
|
||||
|
||||
### 패턴 선택 빠른 참조
|
||||
|
||||
| 패턴 | 대표 화면 | 핵심 컴포넌트 |
|
||||
|------|----------|-------------|
|
||||
| A | 거래처관리, 코드관리 | v2-table-search-widget + v2-table-list |
|
||||
| B | 수주관리, 발주관리 | v2-split-panel-layout |
|
||||
| C | 수주관리(멀티탭) | v2-split-panel-layout + additionalTabs |
|
||||
| D | 재고현황, 그룹별조회 | v2-table-grouped |
|
||||
| E | 설비 작업일정 | v2-timeline-scheduler (리소스 기반) |
|
||||
| E-2 | 단독 품목별 타임라인 | v2-timeline-scheduler (viewMode: itemGrouped) |
|
||||
| F | 생산계획, 작업지시 | v2-split-panel-layout(custom) + v2-tabs-widget + v2-timeline-scheduler |
|
||||
|
||||
---
|
||||
|
||||
## 13. 화면 간 연결 관계 정의
|
||||
@@ -1119,7 +1379,8 @@ VALUES (
|
||||
| 검색 바 | v2-table-search-widget | `autoSelectFirstTable` |
|
||||
| 좌우 분할 | v2-split-panel-layout | `leftPanel`, `rightPanel`, `relation`, `splitRatio` |
|
||||
| 그룹화 테이블 | v2-table-grouped | `groupConfig.groupByColumn`, `summary` |
|
||||
| 간트차트 | v2-timeline-scheduler | `fieldMapping`, `resourceTable` |
|
||||
| 간트차트 (리소스 기반) | v2-timeline-scheduler | `fieldMapping`, `resourceTable` |
|
||||
| 타임라인 (품목 그룹) | v2-timeline-scheduler | `viewMode:"itemGrouped"`, `staticFilters`, `linkedFilter` |
|
||||
| 피벗 분석 | v2-pivot-grid | `fields(area, summaryType)` |
|
||||
| 카드 뷰 | v2-card-display | `columnMapping`, `cardsPerRow` |
|
||||
| 액션 버튼 | v2-button-primary | `text`, `actionType`, `webTypeConfig.dataflowConfig` |
|
||||
@@ -1144,3 +1405,97 @@ VALUES (
|
||||
| 창고 랙 | v2-rack-structure | `codePattern`, `namePattern`, `maxRows` |
|
||||
| 공정 작업기준 | v2-process-work-standard | `dataSource.itemTable`, `dataSource.routingDetailTable` |
|
||||
| 품목 라우팅 | v2-item-routing | `dataSource.itemTable`, `dataSource.routingDetailTable` |
|
||||
|
||||
---
|
||||
|
||||
## 17. v2-timeline-scheduler 고급 설정 가이드
|
||||
|
||||
### 17.1 viewMode 선택 기준
|
||||
|
||||
| viewMode | 용도 | Y축 |
|
||||
|----------|------|-----|
|
||||
| (미설정) | 설비별 작업일정, 보전계획 | 설비/작업자 행 |
|
||||
| `"itemGrouped"` | 생산계획, 출하계획 | 품목별 카드 그룹 |
|
||||
|
||||
### 17.2 staticFilters vs linkedFilter 비교
|
||||
|
||||
| 구분 | staticFilters | linkedFilter |
|
||||
|------|--------------|-------------|
|
||||
| **적용 시점** | DB SELECT 쿼리 시 | 클라이언트 렌더링 시 |
|
||||
| **위치** | 서버 측 (WHERE 절) | 프론트 측 (JS 필터링) |
|
||||
| **변경 가능** | 고정 (layout에 하드코딩) | 동적 (이벤트 기반) |
|
||||
| **용도** | 완제품/반제품 구분 등 | 좌측 테이블 선택 연동 |
|
||||
|
||||
**조합 예시**:
|
||||
```
|
||||
staticFilters: { product_type: "완제품" } → DB에서 완제품만 조회
|
||||
linkedFilter: { sourceField: "part_code", targetField: "item_code" }
|
||||
→ 완제품 중 좌측에서 선택한 품목만 표시
|
||||
```
|
||||
|
||||
### 17.3 자동 스케줄 생성 (내장 기능)
|
||||
|
||||
`viewMode: "itemGrouped"` + `staticFilters.product_type === "완제품"` 조건 충족 시,
|
||||
타임라인 툴바에 **완제품 계획 생성** / **반제품 계획 생성** 버튼이 자동 표시됨.
|
||||
|
||||
**완제품 계획 생성 플로우**:
|
||||
```
|
||||
1. linkedFilter로 선택된 수주 품목 수집
|
||||
2. POST /production/generate-schedule/preview → 미리보기 다이얼로그
|
||||
3. 사용자 확인 → POST /production/generate-schedule → 실제 생성
|
||||
4. 타임라인 자동 새로고침
|
||||
```
|
||||
|
||||
**반제품 계획 생성 플로우**:
|
||||
```
|
||||
1. 현재 타임라인의 완제품 스케줄 ID 수집
|
||||
2. POST /production/generate-semi-schedule/preview → BOM 기반 소요량 계산
|
||||
3. 미리보기 다이얼로그 (기존 반제품 계획 삭제/유지 정보 포함)
|
||||
4. 사용자 확인 → POST /production/generate-semi-schedule → 실제 생성
|
||||
5. 반제품 탭으로 전환 시 새 데이터 표시
|
||||
```
|
||||
|
||||
### 17.4 반제품 탭 주의사항
|
||||
|
||||
반제품 전용 타임라인에는 `linkedFilter`를 **걸지 않는다**.
|
||||
|
||||
이유: 반제품의 `item_code`(예: `SEMI-001`)와 수주 품목의 `part_code`(예: `ITEM-001`)가
|
||||
서로 다른 값이므로 매칭이 불가능하다. `staticFilters: { product_type: "반제품" }`만 설정.
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "timeline_semi",
|
||||
"componentType": "v2-timeline-scheduler",
|
||||
"componentConfig": {
|
||||
"selectedTable": "production_plan_mng",
|
||||
"viewMode": "itemGrouped",
|
||||
"staticFilters": { "product_type": "반제품" },
|
||||
"fieldMapping": { "..." : "..." }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 17.5 이벤트 연동 (v2EventBus)
|
||||
|
||||
타임라인 컴포넌트는 `v2EventBus`를 통해 다른 컴포넌트와 통신한다.
|
||||
|
||||
| 이벤트 | 방향 | 설명 |
|
||||
|--------|------|------|
|
||||
| `TABLE_SELECTION_CHANGE` | 수신 | 좌측 테이블 행 선택 시 linkedFilter 적용 |
|
||||
| `TIMELINE_REFRESH` | 발신/수신 | 타임라인 데이터 새로고침 |
|
||||
|
||||
**연결 필터 이벤트 페이로드**:
|
||||
```typescript
|
||||
{
|
||||
eventType: "TABLE_SELECTION_CHANGE",
|
||||
source: "grouped_orders",
|
||||
tableName: "sales_order_mng",
|
||||
selectedRows: [
|
||||
{ id: "...", part_code: "ITEM-001", ... },
|
||||
{ id: "...", part_code: "ITEM-002", ... }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
타임라인은 `selectedRows`에서 `linkedFilter.sourceField` 값을 추출하여,
|
||||
자신의 데이터 중 `linkedFilter.targetField`가 일치하는 항목만 표시.
|
||||
|
||||
Reference in New Issue
Block a user