diff --git a/docs/screen-implementation-guide/03_production/production-plan.md b/docs/screen-implementation-guide/03_production/production-plan.md index 22ef6a7a..855102c3 100644 --- a/docs/screen-implementation-guide/03_production/production-plan.md +++ b/docs/screen-implementation-guide/03_production/production-plan.md @@ -1,6 +1,13 @@ # 생산계획관리 (Production Plan Management) -> ⚠️ **중요 안내**: 이 화면은 **복합형 레이아웃** (좌우 분할 패널 + 타임라인 스케줄러)으로, 현재 V2 컴포넌트만으로는 완전한 구현이 불가능합니다. 아래 문서는 화면 분석 및 향후 구현 계획을 위한 참조용입니다. +> **Screen ID**: /screens/{TBD} +> **메뉴 경로**: 생산관리 > 생산계획관리 + +> ⚠️ **구현 상태 안내** +> - **간소화 버전 (패턴 A)**: ✅ 즉시 구현 가능 +> - **정식 버전 (복합 레이아웃)**: ⚠️ 컴포넌트 확장/개발 후 구현 가능 +> - `v2-split-panel-layout` 커스텀 모드 확장 (1개) +> - `v2-table-grouped`, `v2-timeline-scheduler` 신규 개발 (2개) --- @@ -10,16 +17,61 @@ |------|------| | **화면명** | 생산계획관리 | | **영문명** | Production Plan Management | -| **화면 유형** | 복합형 (좌우 분할 패널 + 타임라인 스케줄러) | +| **Screen ID** | /screens/{TBD} | +| **메뉴 경로** | 생산관리 > 생산계획관리 | +| **화면 유형 (전체)** | 복합형 (좌우 분할 패널 + 타임라인 스케줄러) - ⚠️ 컴포넌트 확장 후 구현 | +| **화면 유형 (간소화)** | **패턴 A** (기본 마스터 화면) - ✅ 즉시 구현 가능 | | **메인 테이블** | `production_plan_mng` | | **관련 테이블** | `sales_order_mng`, `item_info`, `equipment_info`, `bom_info` | | **주요 기능** | 수주 기반 생산계획 수립, 타임라인 스케줄러, 자동 스케줄 생성, 반제품 계획 연동 | +| **필요 작업** | 1. `v2-split-panel-layout` 확장 2. `v2-table-grouped` 개발 3. `v2-timeline-scheduler` 개발 | --- -## 2. 화면 구조 분석 +## 2. 테이블 선택 및 화면 구조 -### 2.1 레이아웃 구조 +### 2.1 사용 테이블 + +| 테이블명 | 용도 | 비고 | +|----------|------|------| +| `production_plan_mng` | 생산계획 마스터 | 주 테이블 | +| `sales_order_mng` | 수주 정보 | 참조 (수주 기반 계획) | +| `item_info` | 품목 정보 | 참조 (품목코드, 품명) | +| `equipment_info` | 설비 정보 | 참조 (설비 할당) | +| `bom_info` | BOM 정보 | 참조 (반제품 계획 생성) | + +### 2.2 테이블 관계 + +``` +┌──────────────────────┐ ┌──────────────────────┐ +│ sales_order_mng │ │ production_plan_mng │ +├──────────────────────┤ ├──────────────────────┤ +│ order_no (PK) │──N:1──│ order_no (FK) │ +│ item_code │ │ id (PK) │ +│ ... │ │ plan_no │ +└──────────────────────┘ │ item_code │ + │ equipment_id (FK) │ +┌──────────────────────┐ │ parent_plan_id (FK) │ +│ item_info │ │ ... │ +├──────────────────────┤ └──────────────────────┘ +│ item_code (PK) │──1:N── │ +│ item_name │ │ +│ ... │ │ +└──────────────────────┘ │ + │ +┌──────────────────────┐ │ +│ equipment_info │ │ +├──────────────────────┤ │ +│ id (PK) │──1:N──────────┘ +│ equipment_code │ +│ equipment_name │ +│ ... │ +└──────────────────────┘ +``` + +### 2.3 화면 구조 분석 (전체 버전) + +#### 2.3.1 레이아웃 구조 ``` ┌─────────────────────────────────────────────────────────────────────────────┐ @@ -44,7 +96,7 @@ └────────────────────────────────┴──┴──────────────────────────────────────────┘ ``` -### 2.2 탭 구조 +#### 2.3.2 탭 구조 **왼쪽 패널 탭**: 1. **수주데이터**: 수주 목록 (품목별 그룹핑) @@ -120,51 +172,112 @@ | 좌우 분할 패널 (기본) | ⚠️ | `v2-split-panel-layout` | 테이블/리스트만 표시 가능 | | 탭 컴포넌트 (기본) | ⚠️ | `v2-tabs-widget` | 디자인 모드에서 컴포넌트 배치 | -### 4.2 현재 V2 컴포넌트의 제한 사항 +### 4.2 현재 V2 컴포넌트의 제한 사항 및 확장 방안 -#### `v2-split-panel-layout` 제한 +#### `v2-split-panel-layout` 현재 기능 -**현재 기능**: -- 좌우 분할 패널 (리사이즈 가능) -- 각 패널에 **테이블** 또는 **리스트** 표시 (`displayMode: "list" | "table"`) -- leftPanel ↔ rightPanel 관계 설정 (relation) -- 우측 패널에 추가 탭 (additionalTabs) +| 기능 | 지원 | 설명 | +|------|:----:|------| +| 좌우 분할 패널 | ✅ | 리사이즈 가능 | +| 테이블/리스트 표시 | ✅ | `displayMode: "list" \| "table"` | +| 마스터-디테일 관계 | ✅ | `relation` 설정 | +| 우측 추가 탭 (`additionalTabs`) | ⚠️ | **타입만 정의, 렌더링 미구현** | +| 패널 내 임의 컴포넌트 배치 | ❌ | 미지원 | -**제한 사항**: -- ❌ 패널 안에 **임의의 컴포넌트** (타임라인 등)를 배치할 수 없음 -- ❌ **그룹화된 테이블** (접기/펼치기) 미지원 -- ❌ 복잡한 커스텀 UI 배치 불가 +#### 🆕 확장 방안: 커스텀 모드 추가 -#### `v2-tabs-widget` 제한 +`v2-tabs-widget`처럼 패널 안에 컴포넌트를 자유롭게 배치하는 **커스텀 모드** 추가: -**현재 기능**: -- 탭별 컴포넌트 자유 배치 -- 디자인 모드에서 드래그&드롭 +```typescript +// 현재 구조 +leftPanel: { + displayMode: "list" | "table", // 2가지만 지원 + tableName: string, + columns: [...], +} -**제한 사항**: -- ❌ 탭 내에 **다른 V2 컴포넌트**를 완전히 자유롭게 배치하기 어려움 -- ❌ 런타임에서 복잡한 컴포넌트 렌더링 제한 +// 🆕 확장 구조 +leftPanel: { + displayMode: "list" | "table" | "custom", // 커스텀 모드 추가 + + // 기존 모드 (list, table) + tableName?: string, + columns?: [...], + + // 🆕 커스텀 모드 (탭 컴포넌트처럼 컴포넌트 배치) + components?: TabInlineComponent[], // 패널 안에 자유롭게 컴포넌트 배치 +} +``` + +**커스텀 모드 장점**: +- 기존 `v2-tabs-widget`의 드래그&드롭 로직 재사용 +- 패널 안에 탭, 테이블, 타임라인 등 어떤 컴포넌트든 배치 가능 +- `v2-split-panel-enhanced` 별도 개발 불필요 + +#### `v2-tabs-widget` 현재 기능 + +| 기능 | 지원 | 설명 | +|------|:----:|------| +| 탭별 컴포넌트 배치 | ✅ | `components[]` | +| 디자인 모드 드래그&드롭 | ✅ | 위치/크기 조정 | +| 런타임 렌더링 | ✅ | `DynamicComponentRenderer` 사용 | + +**`v2-tabs-widget` 구조** (참고용): +```typescript +interface TabItem { + id: string; + label: string; + components?: TabInlineComponent[]; // 탭 안에 배치된 컴포넌트들 +} + +interface TabInlineComponent { + id: string; + componentType: string; // "v2-table-list", "v2-timeline-scheduler" 등 + position?: { x: number; y: number }; + size?: { width: number; height: number }; + componentConfig?: Record; +} +``` ### 4.3 생산계획관리에 필요한 기능 vs 현재 지원 -| 필요 기능 | 현재 지원 | 설명 | -|----------|:---------:|------| -| 좌우 분할 패널 | ⚠️ 부분 | `v2-split-panel-layout` - 테이블만 가능 | -| 왼쪽 패널 탭 (수주/안전재고) | ❌ | 분할 패널 내 탭 조합 미지원 | -| **그룹화된 테이블** (품목별 접기/펼치기) | ❌ | 신규 개발 필요 | -| 오른쪽 패널 탭 (완제품/반제품) | ❌ | 분할 패널 내 탭 조합 미지원 | -| **타임라인 스케줄러** (간트차트) | ❌ | 신규 개발 필요 | -| 드래그&드롭 스케줄 이동 | ❌ | 신규 개발 필요 | -| 복잡한 상세 모달 (분할, 설비할당) | ❌ | 커스텀 모달 개발 필요 | +| 필요 기능 | 현재 지원 | 해결 방안 | +|----------|:---------:|----------| +| 좌우 분할 패널 | ✅ | `v2-split-panel-layout` | +| 왼쪽 패널 탭 (수주/안전재고) | ⚠️ | 커스텀 모드 + `v2-tabs-widget` 조합 | +| 오른쪽 패널 탭 (완제품/반제품) | ⚠️ | 커스텀 모드 + `v2-tabs-widget` 조합 | +| **그룹화된 테이블** (품목별 접기/펼치기) | ❌ | **신규 개발 필요** | +| **타임라인 스케줄러** (간트차트) | ❌ | **신규 개발 필요** | +| 드래그&드롭 스케줄 이동 | ❌ | `v2-timeline-scheduler`에 포함 | +| 복잡한 상세 모달 | ✅ | 기존 모달 화면으로 충분 | -### 4.4 향후 개발 필요 컴포넌트 +### 4.4 향후 개발 필요 사항 + +#### 기존 컴포넌트 확장 (1개) + +| 컴포넌트 | 작업 내용 | 난이도 | +|----------|----------|:------:| +| `v2-split-panel-layout` | `displayMode: "custom"` 추가 + `components[]` 지원 | 중 | + +#### 신규 컴포넌트 개발 (2개) - 대체 불가 + +| 컴포넌트 | 필요 이유 | 난이도 | +|----------|----------|:------:| +| **`v2-table-grouped`** | 품목별 접기/펼치기 그룹화 테이블 | 중 | +| **`v2-timeline-scheduler`** | 간트차트 형태의 타임라인 스케줄러 | 상 | + +#### 불필요한 컴포넌트 (이전 분석에서 제외) + +| 컴포넌트 | 제외 이유 | +|----------|----------| +| ~~`v2-split-panel-enhanced`~~ | 커스텀 모드로 대체 가능 | +| ~~`v2-modal-complex`~~ | 기존 모달 화면으로 충분 | ``` -필요 컴포넌트 목록: -1. v2-timeline-scheduler - 타임라인/간트차트 스케줄러 (핵심!) -2. v2-table-grouped - 그룹화된 테이블 (접기/펼치기) -3. v2-split-panel-enhanced - 패널 내 임의 컴포넌트 배치 가능한 확장판 -4. v2-modal-complex - 복잡한 모달 (분할, 다단계, 설비할당) +최종 필요 작업: +1. v2-split-panel-layout 확장 - displayMode: "custom" 추가 +2. v2-table-grouped 신규 개발 - 그룹화 테이블 (접기/펼치기) +3. v2-timeline-scheduler 신규 개발 - 타임라인/간트차트 (핵심!) ``` ### 4.5 현재 구현 가능한 최대 범위 @@ -189,6 +302,63 @@ - 자동 스케줄 생성 - 드래그로 스케줄 이동 +### 4.6 정식 버전 구현 구조 (확장 후) + +`v2-split-panel-layout`에 커스텀 모드를 추가한 후의 **정식 버전 구현 구조**: + +``` +┌──────────────────────────────────────────────────────────────────────┐ +│ v2-split-panel-layout (양쪽 패널 displayMode: "custom") │ +├────────────────────────────────┬─────────────────────────────────────┤ +│ leftPanel.components: [ │ rightPanel.components: [ │ +│ v2-tabs-widget { │ v2-tabs-widget { │ +│ tabs: [ │ tabs: [ │ +│ { │ { │ +│ label: "수주데이터", │ label: "완제품 생산계획", │ +│ components: [ │ components: [ │ +│ v2-table-grouped │ v2-timeline-scheduler │ +│ ] │ ] │ +│ }, │ }, │ +│ { │ { │ +│ label: "안전재고부족", │ label: "반제품 생산계획", │ +│ components: [ │ components: [ │ +│ v2-table-grouped │ v2-timeline-scheduler │ +│ ] │ ] │ +│ } │ } │ +│ ] │ ] │ +│ } │ } │ +│ ] │ ] │ +└────────────────────────────────┴─────────────────────────────────────┘ +``` + +**컴포넌트 중첩 구조**: +``` +v2-split-panel-layout (displayMode: "custom") +├── leftPanel.components[] +│ └── v2-tabs-widget +│ ├── tabs[0]: "수주데이터" +│ │ └── components[] +│ │ └── v2-table-grouped (품목별 그룹화) +│ └── tabs[1]: "안전재고부족" +│ └── components[] +│ └── v2-table-grouped +│ +└── rightPanel.components[] + └── v2-tabs-widget + ├── tabs[0]: "완제품 생산계획" + │ └── components[] + │ └── v2-timeline-scheduler (간트차트) + └── tabs[1]: "반제품 생산계획" + └── components[] + └── v2-timeline-scheduler +``` + +**장점**: +- 기존 `v2-tabs-widget` 로직 100% 재사용 +- 패널 안에 어떤 컴포넌트든 배치 가능 +- 별도 `v2-split-panel-enhanced` 개발 불필요 +- 확장성 뛰어남 (향후 다른 복합 화면에도 적용 가능) + --- ## 5. 단순화된 구현 방안 (임시) @@ -211,42 +381,107 @@ └──────────────────────────────────────────────────────────────┘ ``` -### 5.2 간소화 버전 테이블 컬럼 +### 5.2 컴포넌트 배치도 (간소화 버전) -| 순서 | 컬럼명 | 표시명 | 정렬 | 형식 | -|:----:|--------|--------|:----:|------| -| 1 | plan_no | 계획번호 | left | text | -| 2 | plan_date | 계획일자 | center | date | -| 3 | item_code | 품목코드 | left | text | -| 4 | item_name | 품명 | left | text | -| 5 | plan_qty | 계획수량 | right | number | -| 6 | start_date | 시작일 | center | date | -| 7 | end_date | 종료일 | center | date | -| 8 | due_date | 납기일 | center | date | -| 9 | equipment_name | 설비 | left | text | -| 10 | status | 상태 | center | badge | -| 11 | manager_name | 담당자 | left | text | -| 12 | product_type | 제품유형 | center | text | +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ v2-table-search-widget (comp_search) │ +│ [품목코드] [품명] [계획기간: 시작~종료] [상태] [조회] [엑셀다운로드] │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ 생산계획 목록 [신규등록] [수정] [삭제] [작업지시 생성] │ +│ ─────────────────────────────────────────────────────────────────────────── │ +│ v2-table-list (comp_table) │ +│ □ | 계획번호 | 계획일자 | 품목코드 | 품명 | 계획수량 | 시작일 | 종료일 | ... │ +│ □ | PP-001 | 2026-01 | ITEM001 | 제품A| 1,000 | 01-30 | 02-05 | ... │ +│ □ | PP-002 | 2026-01 | ITEM002 | 제품B| 500 | 02-01 | 02-10 | ... │ +│ │ +│ [1] [2] [3] ... [10] 페이지당: [20] ▼ │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` -### 5.3 간소화 버전 모달 필드 +### 5.3 컴포넌트 목록 (간소화 버전) -| 필드명 | 라벨 | 타입 | 필수 | -|--------|------|------|:----:| -| plan_no | 계획번호 | text | ✅ | -| plan_date | 계획일자 | date | ✅ | -| item_code | 품목코드 | select (품목 검색) | ✅ | -| item_name | 품명 | text (자동) | | -| plan_qty | 계획수량 | number | ✅ | -| start_date | 시작일 | date | ✅ | -| end_date | 종료일 | date | ✅ | -| due_date | 납기일 | date | | -| equipment_id | 설비 | select | | -| status | 상태 | select | ✅ | -| priority | 우선순위 | select | | -| work_shift | 작업조 | select | | -| manager_name | 담당자 | text | | -| remarks | 비고 | textarea | | -| product_type | 제품유형 | select | | +| 컴포넌트 ID | 컴포넌트 타입 | 역할 | +|-------------|---------------|------| +| `comp_search` | v2-table-search-widget | 검색 필터 | +| `comp_table` | v2-table-list | 생산계획 목록 | +| `comp_btn_register` | v2-button-primary | 신규 등록 | +| `comp_btn_edit` | v2-button-primary | 수정 | +| `comp_btn_delete` | v2-button-primary | 삭제 | +| `comp_btn_work_order` | v2-button-primary | 작업지시 생성 | + +### 5.4 간소화 버전 테이블 컬럼 + +| 순서 | 컬럼명 | 표시명 | 정렬 | 형식 | 너비 | +|:----:|--------|--------|:----:|------|:----:| +| 1 | plan_no | 계획번호 | left | text | 120 | +| 2 | plan_date | 계획일자 | center | date | 100 | +| 3 | item_code | 품목코드 | left | text | 100 | +| 4 | item_name | 품명 | left | text | 150 | +| 5 | plan_qty | 계획수량 | right | number | 100 | +| 6 | start_date | 시작일 | center | date | 100 | +| 7 | end_date | 종료일 | center | date | 100 | +| 8 | due_date | 납기일 | center | date | 100 | +| 9 | equipment_name | 설비 | left | text | 120 | +| 10 | status | 상태 | center | badge | 80 | +| 11 | manager_name | 담당자 | left | text | 100 | +| 12 | product_type | 제품유형 | center | text | 80 | + +### 5.5 간소화 버전 모달 필드 + +| 필드명 | 라벨 | 타입 | 필수 | 비고 | +|--------|------|------|:----:|------| +| plan_no | 계획번호 | text (readonly) | ✅ | 자동채번: PP-YYYYMMDD-0001 | +| plan_date | 계획일자 | date | ✅ | 기본값: 오늘 | +| item_code | 품목코드 | select (품목 검색) | ✅ | 엔티티: item_info | +| item_name | 품명 | text (readonly) | | 자동 입력 | +| plan_qty | 계획수량 | number | ✅ | min: 1 | +| start_date | 시작일 | date | ✅ | | +| end_date | 종료일 | date | ✅ | start_date 이후 | +| due_date | 납기일 | date | | | +| equipment_id | 설비 | select | | 엔티티: equipment_info | +| equipment_name | 설비명 | text (readonly) | | 자동 입력 | +| status | 상태 | select | ✅ | 공통코드: PROD_PLAN_STATUS | +| priority | 우선순위 | select | | 공통코드: PRIORITY | +| work_shift | 작업조 | select | | 공통코드: WORK_SHIFT | +| manager_name | 담당자 | text | | | +| product_type | 제품유형 | select | | 공통코드: PRODUCT_TYPE | +| remarks | 비고 | textarea | | | + +### 5.6 상태 배지 및 공통코드 + +#### 상태 (PROD_PLAN_STATUS) + +| 코드 | 표시명 | 배경색 | 글자색 | +|------|--------|--------|--------| +| 계획 | 계획 | #dbeafe | #1e40af | +| 지시 | 지시 | #fef3c7 | #92400e | +| 진행 | 진행 | #d1fae5 | #065f46 | +| 완료 | 완료 | #f3f4f6 | #4b5563 | + +#### 우선순위 (PRIORITY) + +| 코드 | 표시명 | +|------|--------| +| 긴급 | 긴급 | +| 높음 | 높음 | +| 보통 | 보통 | +| 낮음 | 낮음 | + +#### 작업조 (WORK_SHIFT) + +| 코드 | 표시명 | +|------|--------| +| 주간 | 주간 | +| 야간 | 야간 | +| 주야 | 주야 | + +#### 제품유형 (PRODUCT_TYPE) + +| 코드 | 표시명 | +|------|--------| +| 완제품 | 완제품 | +| 반제품 | 반제품 | --- @@ -395,18 +630,33 @@ V2 컴포넌트로 기본 CRUD 화면 구현: - 기본 모달 폼 - 상태 배지 -### Phase 2: 컴포넌트 개발 후 +### Phase 2: 컴포넌트 확장 및 개발 -1. `v2-tabs` 컴포넌트 개발 -2. `v2-split-panel` 컴포넌트 개발 -3. `v2-table-grouped` 컴포넌트 개발 +1. **`v2-split-panel-layout` 확장** + - `displayMode: "custom"` 추가 + - `components[]` 필드 지원 (탭 컴포넌트와 동일한 구조) + - 디자인 모드에서 컴포넌트 드래그&드롭 지원 + +2. **`v2-table-grouped` 신규 개발** + - 품목별 그룹핑 (접기/펼치기) + - 그룹 행과 상세 행 구분 + - 체크박스 선택 (그룹 단위 / 개별 단위) ### Phase 3: 타임라인 스케줄러 -1. `v2-timeline-scheduler` 컴포넌트 개발 -2. 드래그&드롭 기능 -3. 자동 스케줄 생성 로직 -4. 반제품 연동 +1. **`v2-timeline-scheduler` 신규 개발** + - 간트차트 형태 타임라인 + - 날짜 그리드 (일/주/월 단위) + - 생산계획 바 렌더링 + +2. **드래그&드롭 기능** + - 계획 바 드래그로 날짜 이동 + - 계획 바 크기 조정 (기간 변경) + +3. **비즈니스 로직** + - 자동 스케줄 생성 API + - BOM 기반 반제품 계획 연동 + - 설비별 용량 체크 --- @@ -488,7 +738,25 @@ V2 컴포넌트로 기본 CRUD 화면 구현: "position": { "x": 0, "y": 20, "z": 1 }, "overrides": { "type": "v2-table-search-widget", - "label": "검색 필터" + "label": "검색 필터", + "searchFields": [ + { "field": "item_code", "label": "품목코드", "type": "text" }, + { "field": "item_name", "label": "품명", "type": "text" }, + { "field": "plan_date", "label": "계획기간", "type": "daterange" }, + { + "field": "status", + "label": "상태", + "type": "select", + "options": [ + { "value": "", "label": "전체" }, + { "value": "계획", "label": "계획" }, + { "value": "지시", "label": "지시" }, + { "value": "진행", "label": "진행" }, + { "value": "완료", "label": "완료" } + ] + } + ], + "targetTableId": "comp_table" }, "displayOrder": 0 }, @@ -501,23 +769,39 @@ V2 컴포넌트로 기본 CRUD 화면 구현: "type": "v2-table-list", "label": "생산계획 목록", "columns": [ - { "columnName": "plan_no", "displayName": "계획번호", "order": 0, "visible": true, "sortable": true, "format": "text", "align": "left" }, - { "columnName": "plan_date", "displayName": "계획일자", "order": 1, "visible": true, "sortable": true, "format": "date", "align": "center" }, - { "columnName": "item_code", "displayName": "품목코드", "order": 2, "visible": true, "sortable": true, "format": "text", "align": "left" }, - { "columnName": "item_name", "displayName": "품명", "order": 3, "visible": true, "sortable": true, "format": "text", "align": "left" }, - { "columnName": "plan_qty", "displayName": "계획수량", "order": 4, "visible": true, "sortable": true, "format": "number", "align": "right" }, - { "columnName": "start_date", "displayName": "시작일", "order": 5, "visible": true, "sortable": true, "format": "date", "align": "center" }, - { "columnName": "end_date", "displayName": "종료일", "order": 6, "visible": true, "sortable": true, "format": "date", "align": "center" }, - { "columnName": "due_date", "displayName": "납기일", "order": 7, "visible": true, "sortable": true, "format": "date", "align": "center" }, - { "columnName": "equipment_name", "displayName": "설비", "order": 8, "visible": true, "sortable": true, "format": "text", "align": "left" }, - { "columnName": "status", "displayName": "상태", "order": 9, "visible": true, "sortable": true, "format": "text", "align": "center" }, - { "columnName": "product_type", "displayName": "제품유형", "order": 10, "visible": true, "sortable": true, "format": "text", "align": "center" }, - { "columnName": "manager_name", "displayName": "담당자", "order": 11, "visible": true, "sortable": true, "format": "text", "align": "left" } + { "columnName": "plan_no", "displayName": "계획번호", "order": 0, "visible": true, "sortable": true, "format": "text", "align": "left", "width": 120 }, + { "columnName": "plan_date", "displayName": "계획일자", "order": 1, "visible": true, "sortable": true, "format": "date", "align": "center", "width": 100 }, + { "columnName": "item_code", "displayName": "품목코드", "order": 2, "visible": true, "sortable": true, "format": "text", "align": "left", "width": 100 }, + { "columnName": "item_name", "displayName": "품명", "order": 3, "visible": true, "sortable": true, "format": "text", "align": "left", "width": 150 }, + { "columnName": "plan_qty", "displayName": "계획수량", "order": 4, "visible": true, "sortable": true, "format": "number", "align": "right", "width": 100 }, + { "columnName": "start_date", "displayName": "시작일", "order": 5, "visible": true, "sortable": true, "format": "date", "align": "center", "width": 100 }, + { "columnName": "end_date", "displayName": "종료일", "order": 6, "visible": true, "sortable": true, "format": "date", "align": "center", "width": 100 }, + { "columnName": "due_date", "displayName": "납기일", "order": 7, "visible": true, "sortable": true, "format": "date", "align": "center", "width": 100 }, + { "columnName": "equipment_name", "displayName": "설비", "order": 8, "visible": true, "sortable": true, "format": "text", "align": "left", "width": 120 }, + { + "columnName": "status", + "displayName": "상태", + "order": 9, + "visible": true, + "sortable": true, + "format": "badge", + "align": "center", + "width": 80, + "badgeConfig": { + "계획": { "background": "#dbeafe", "color": "#1e40af" }, + "지시": { "background": "#fef3c7", "color": "#92400e" }, + "진행": { "background": "#d1fae5", "color": "#065f46" }, + "완료": { "background": "#f3f4f6", "color": "#4b5563" } + } + }, + { "columnName": "product_type", "displayName": "제품유형", "order": 10, "visible": true, "sortable": true, "format": "text", "align": "center", "width": 80 }, + { "columnName": "manager_name", "displayName": "담당자", "order": 11, "visible": true, "sortable": true, "format": "text", "align": "left", "width": 100 } ], "selectedTable": "production_plan_mng", "pagination": { "enabled": true, "pageSize": 20, "pageSizeOptions": [10, 20, 50, 100] }, "checkbox": { "enabled": true, "multiple": true }, - "horizontalScroll": { "enabled": true, "minColumnWidth": 80, "maxColumnWidth": 200 } + "horizontalScroll": { "enabled": true, "minColumnWidth": 80, "maxColumnWidth": 200 }, + "defaultSort": { "field": "plan_date", "order": "desc" } }, "displayOrder": 1 }, @@ -525,7 +809,7 @@ V2 컴포넌트로 기본 CRUD 화면 구현: "id": "comp_btn_register", "url": "@/lib/registry/components/v2-button-primary", "size": { "width": 100, "height": 40 }, - "position": { "x": 1580, "y": 70, "z": 1 }, + "position": { "x": 1480, "y": 70, "z": 1 }, "overrides": { "text": "신규 등록", "type": "v2-button-primary", @@ -538,12 +822,13 @@ V2 컴포넌트로 기본 CRUD 화면 구현: "id": "comp_btn_edit", "url": "@/lib/registry/components/v2-button-primary", "size": { "width": 80, "height": 40 }, - "position": { "x": 1690, "y": 70, "z": 1 }, + "position": { "x": 1590, "y": 70, "z": 1 }, "overrides": { "text": "수정", "type": "v2-button-primary", "action": { "type": "edit", "modalTitle": "생산계획 수정", "targetScreenId": null }, - "variant": "secondary" + "variant": "secondary", + "requireSelection": true }, "displayOrder": 3 }, @@ -551,14 +836,34 @@ V2 컴포넌트로 기본 CRUD 화면 구현: "id": "comp_btn_delete", "url": "@/lib/registry/components/v2-button-primary", "size": { "width": 80, "height": 40 }, - "position": { "x": 1780, "y": 70, "z": 1 }, + "position": { "x": 1680, "y": 70, "z": 1 }, "overrides": { "text": "삭제", "type": "v2-button-primary", "action": { "type": "delete" }, - "variant": "danger" + "variant": "danger", + "requireSelection": true, + "enableDataflowControl": true, + "dataflowDiagramId": null }, "displayOrder": 4 + }, + { + "id": "comp_btn_work_order", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 120, "height": 40 }, + "position": { "x": 1770, "y": 70, "z": 1 }, + "overrides": { + "text": "작업지시 생성", + "type": "v2-button-primary", + "action": { "type": "custom" }, + "variant": "primary", + "requireSelection": true, + "enableDataflowControl": true, + "dataflowDiagramId": null, + "confirmMessage": "선택한 계획에 대해 작업지시를 생성하시겠습니까?" + }, + "displayOrder": 5 } ] } @@ -566,9 +871,312 @@ V2 컴포넌트로 기본 CRUD 화면 구현: --- -## 10. 구현 체크리스트 +## 10. 비즈니스 로직 요청서 (간소화 버전) -### 10.1 간소화 버전 (현재 구현 가능) +> **중요**: 이 섹션은 표준 양식에 따라 작성되었습니다. + +``` +=== 비즈니스 로직 요청서 === + +【화면 정보】 +- 화면명: 생산계획관리 (간소화 버전) +- 회사코드: {COMPANY_CODE} +- 메뉴ID: {TBD} + +【테이블 정보】 +- 메인 테이블: production_plan_mng +- 디테일 테이블: 없음 (간소화 버전) +- 관계 FK: 없음 + +【버튼 목록】 +버튼1: + - 버튼명: 신규 등록 + - 동작 유형: 모달 열기 (insert) + - 조건: 없음 + - 대상 테이블: production_plan_mng + - 추가 동작: + 1. plan_no 자동채번 (PP-YYYYMMDD-0001) + 2. plan_date 기본값 = 오늘 + 3. status 기본값 = '계획' + +버튼2: + - 버튼명: 수정 + - 동작 유형: 모달 열기 (update) + - 조건: 행 선택 필수 + - 대상 테이블: production_plan_mng + - 추가 동작: 없음 + +버튼3: + - 버튼명: 삭제 + - 동작 유형: 삭제 (delete) + - 조건: + 1. 행 선택 필수 + 2. status != '진행' AND status != '완료' + - 대상 테이블: production_plan_mng + - 추가 동작: 삭제 확인 다이얼로그 + +버튼4: + - 버튼명: 작업지시 생성 + - 동작 유형: 수정 (update) + - 조건: + 1. 행 선택 필수 (다중 선택 가능) + 2. status = '계획' + - 대상 테이블: production_plan_mng + - 추가 동작: + 1. status를 '지시'로 변경 + 2. work_order_no 자동채번 (WO-YYYYMMDD-0001) + 3. work_order_mng에 INSERT (작업지시 테이블) + +【추가 요구사항】 +- 진행/완료 상태의 계획은 수정/삭제 불가 +- 계획번호(plan_no) 자동채번: PP-YYYYMMDD-0001 +- 품목코드 선택 시 품명 자동 입력 +- 설비 선택 시 시간당 생산능력 자동 입력 +- 시작일/종료일 기반 생산기간 자동 계산 +``` + +--- + +## 11. 제어관리 설정 (dataflow_diagrams) + +### 11.1 신규 등록 버튼 (기본 저장) + +> 기본 INSERT 액션은 화면 디자이너에서 처리되므로 별도 dataflow 불필요 + +### 11.2 삭제 버튼 (조건부 삭제) + +```json +{ + "diagram_name": "생산계획관리_삭제", + "company_code": "{COMPANY_CODE}", + "control": { + "actionType": "delete", + "triggerType": "before", + "conditions": [ + { + "id": "cond-status-not-in-progress", + "type": "condition", + "field": "status", + "operator": "!=", + "value": "진행", + "dataType": "string" + }, + { + "id": "cond-status-not-completed", + "type": "condition", + "field": "status", + "operator": "!=", + "value": "완료", + "dataType": "string" + } + ], + "conditionLogic": "AND", + "errorMessage": "진행 중이거나 완료된 계획은 삭제할 수 없습니다." + }, + "plan": { + "actions": [ + { + "id": "action-delete", + "actionType": "delete", + "targetTable": "production_plan_mng" + } + ] + } +} +``` + +### 11.3 작업지시 생성 버튼 + +```json +{ + "diagram_name": "생산계획관리_작업지시생성", + "company_code": "{COMPANY_CODE}", + "control": { + "actionType": "update", + "triggerType": "after", + "conditions": [ + { + "id": "cond-status-plan", + "type": "condition", + "field": "status", + "operator": "=", + "value": "계획", + "dataType": "string" + } + ], + "errorMessage": "계획 상태인 항목만 작업지시를 생성할 수 있습니다." + }, + "plan": { + "actions": [ + { + "id": "action-update-status", + "actionType": "update", + "targetTable": "production_plan_mng", + "fieldMappings": [ + { "targetField": "status", "defaultValue": "지시" }, + { "targetField": "updated_date", "defaultValue": "#NOW" }, + { "targetField": "updated_by", "defaultValue": "#USER" } + ] + }, + { + "id": "action-insert-workorder", + "actionType": "insert", + "targetTable": "work_order_mng", + "fieldMappings": [ + { "sourceField": "plan_no", "targetField": "plan_no" }, + { "sourceField": "item_code", "targetField": "item_code" }, + { "sourceField": "item_name", "targetField": "item_name" }, + { "sourceField": "plan_qty", "targetField": "order_qty" }, + { "sourceField": "start_date", "targetField": "work_start_date" }, + { "sourceField": "end_date", "targetField": "work_end_date" }, + { "sourceField": "equipment_id", "targetField": "equipment_id" }, + { "sourceField": "equipment_name", "targetField": "equipment_name" }, + { "targetField": "status", "defaultValue": "대기" }, + { "targetField": "company_code", "defaultValue": "#COMPANY" }, + { "targetField": "created_date", "defaultValue": "#NOW" }, + { "targetField": "created_by", "defaultValue": "#USER" } + ] + } + ] + } +} +``` + +--- + +## 12. 컴포넌트 연동 설정 (간소화 버전) + +### 12.1 이벤트 흐름 + +``` +[화면 진입] + │ + ▼ +v2-table-search-widget (검색 필터) + │ onFilterChange + ▼ +v2-table-list (생산계획 목록) + │ onRowSelect + ▼ +[버튼 활성화/비활성화] + │ + ├── [신규 등록] 클릭 → 등록 모달 오픈 + │ │ onSave + │ ▼ + │ INSERT → 테이블 Refresh + │ + ├── [수정] 클릭 → 수정 모달 오픈 + │ │ onSave + │ ▼ + │ UPDATE → 테이블 Refresh + │ + ├── [삭제] 클릭 → 조건 체크 + │ │ 통과 시 + │ ▼ + │ DELETE → 테이블 Refresh + │ + └── [작업지시 생성] 클릭 → 조건 체크 + │ 통과 시 + ▼ + UPDATE + INSERT → 테이블 Refresh +``` + +### 12.2 연동 설정 테이블 + +| 소스 컴포넌트 | 이벤트 | 대상 컴포넌트 | 동작 | +|---------------|--------|---------------|------| +| search-widget | onFilterChange | main-table | 필터 적용 후 재조회 | +| main-table | onRowSelect | btn-edit, btn-delete | 버튼 활성화 | +| main-table | onRowDoubleClick | modal-edit | 수정 모달 오픈 | +| btn-register | onClick | modal-register | 등록 모달 오픈 | +| btn-edit | onClick | modal-edit | 수정 모달 오픈 | +| btn-delete | onClick | dataflow | 삭제 실행 | +| btn-work-order | onClick | dataflow | 작업지시 생성 실행 | +| modal-* | onSave | main-table | 테이블 새로고침 | + +--- + +## 13. 사용자 사용 예시 시나리오 (간소화 버전) + +### 시나리오 1: 생산계획 조회 + +| 단계 | 사용자 동작 | 기대 결과 | +|:----:|-------------|-----------| +| 1 | 화면 진입 | 전체 생산계획 목록 표시 (최근순) | +| 2 | 품목코드 입력 후 [조회] 클릭 | 해당 품목의 생산계획만 필터링 | +| 3 | 상태 드롭다운에서 '계획' 선택 | 계획 상태인 항목만 표시 | +| 4 | 컬럼 헤더 클릭 | 해당 컬럼 기준 정렬 | + +### 시나리오 2: 생산계획 등록 + +| 단계 | 사용자 동작 | 기대 결과 | +|:----:|-------------|-----------| +| 1 | [신규 등록] 버튼 클릭 | 등록 모달 오픈 | +| 2 | 품목코드 검색/선택 | 품명 자동 입력 | +| 3 | 계획수량, 시작일, 종료일 입력 | 입력 필드 채움 | +| 4 | 설비 선택 | 시간당 생산능력 표시 | +| 5 | [저장] 버튼 클릭 | 저장 완료, 목록에 신규 행 표시 | + +### 시나리오 3: 생산계획 수정 + +| 단계 | 사용자 동작 | 기대 결과 | +|:----:|-------------|-----------| +| 1 | 목록에서 행 선택 | 행 하이라이트 | +| 2 | [수정] 버튼 클릭 (또는 더블클릭) | 수정 모달 오픈 (기존 값 로드) | +| 3 | 필요한 필드 수정 | 값 변경 | +| 4 | [저장] 버튼 클릭 | 저장 완료, 목록 갱신 | + +### 시나리오 4: 생산계획 삭제 + +| 단계 | 사용자 동작 | 기대 결과 | +|:----:|-------------|-----------| +| 1 | 삭제할 행 체크박스 선택 | 선택 표시 | +| 2 | [삭제] 버튼 클릭 | 삭제 확인 다이얼로그 표시 | +| 3-a | (상태가 계획/지시) 확인 클릭 | 삭제 완료, 목록에서 제거 | +| 3-b | (상태가 진행/완료) 확인 클릭 | "삭제할 수 없습니다" 오류 메시지 | + +### 시나리오 5: 작업지시 생성 + +| 단계 | 사용자 동작 | 기대 결과 | +|:----:|-------------|-----------| +| 1 | 계획 상태인 행 체크박스 선택 (다중 가능) | 선택 표시 | +| 2 | [작업지시 생성] 버튼 클릭 | 확인 다이얼로그 표시 | +| 3-a | (상태가 계획) 확인 클릭 | 상태가 '지시'로 변경, 작업지시번호 생성 | +| 3-b | (상태가 계획 아님) 확인 클릭 | "계획 상태만 가능합니다" 오류 메시지 | + +--- + +## 14. 검증 체크리스트 + +### 14.1 기능 테스트 + +- [ ] 데이터 조회가 정상 동작하는가? +- [ ] 검색 필터가 정상 동작하는가? +- [ ] 신규 등록이 정상 동작하는가? +- [ ] 수정이 정상 동작하는가? +- [ ] 삭제가 정상 동작하는가? (조건 포함) +- [ ] 작업지시 생성이 정상 동작하는가? (조건 포함) +- [ ] 페이지네이션이 정상 동작하는가? +- [ ] 정렬이 정상 동작하는가? + +### 14.2 데이터 검증 + +- [ ] 계획번호(plan_no) 자동채번이 중복 없이 생성되는가? +- [ ] 품목코드 선택 시 품명이 자동 입력되는가? +- [ ] 설비 선택 시 시간당 생산능력이 표시되는가? +- [ ] company_code 필터링이 적용되는가? (멀티테넌시) + +### 14.3 비즈니스 룰 검증 + +- [ ] 진행/완료 상태는 삭제 불가한가? +- [ ] 계획 상태만 작업지시 생성 가능한가? +- [ ] 작업지시 생성 시 work_order_mng에 데이터가 INSERT되는가? + +--- + +## 15. 구현 체크리스트 + +### 15.1 간소화 버전 (현재 구현 가능) | 체크 | 항목 | 설명 | |:----:|------|------| @@ -576,26 +1184,37 @@ V2 컴포넌트로 기본 CRUD 화면 구현: | ☐ | **화면 정의** | `screen_definitions` INSERT | | ☐ | **모달 화면 생성** | 등록/수정 모달 화면 생성 | | ☐ | **메인 화면 생성** | `screen_layouts_v2` INSERT | +| ☐ | **제어관리 설정** | `dataflow_diagrams` INSERT (삭제, 작업지시 생성) | | ☐ | **메뉴 연결** | 대상 메뉴에 화면 할당 | | ☐ | **기본 CRUD 테스트** | 등록/수정/삭제/조회 테스트 | +| ☐ | **비즈니스 룰 테스트** | 조건부 삭제, 작업지시 생성 테스트 | -### 10.2 전체 버전 (향후 구현) +### 15.2 전체 버전 (향후 구현) | 체크 | 항목 | 설명 | |:----:|------|------| -| ☐ | **v2-tabs 개발** | 탭 컴포넌트 개발 | -| ☐ | **v2-split-panel 개발** | 분할 패널 컴포넌트 개발 | -| ☐ | **v2-table-grouped 개발** | 그룹화 테이블 컴포넌트 개발 | -| ☐ | **v2-timeline-scheduler 개발** | 타임라인 스케줄러 개발 | +| ☐ | **v2-split-panel-layout 확장** | `displayMode: "custom"` + `components[]` 추가 | +| ☐ | **v2-table-grouped 개발** | 그룹화 테이블 컴포넌트 (접기/펼치기) | +| ☐ | **v2-timeline-scheduler 개발** | 타임라인/간트차트 스케줄러 | +| ☐ | **드래그&드롭 기능** | 타임라인 바 드래그 이동/크기 조정 | | ☐ | **자동 스케줄 로직** | 자동 스케줄 생성 백엔드 API | | ☐ | **반제품 연동** | BOM 기반 반제품 계획 생성 | -| ☐ | **드래그&드롭** | 타임라인 드래그 이동 기능 | +| ☐ | **정식 버전 화면 구성** | 커스텀 모드로 탭+테이블+타임라인 조합 | --- -## 11. 관련 문서 +## 16. 관련 문서 - [수주관리](../02_sales/order.md) - [품목정보](../01_master-data/item-info.md) -- [설비관리](../05_equipment/equipment-info.md) (예정) -- [BOM관리](../01_master-data/bom-info.md) (예정) +- [설비관리](../05_equipment/equipment-info.md) +- [BOM관리](../01_master-data/bom.md) +- [작업지시](./work-order.md) + +--- + +## 17. 참고: 표준 가이드 + +- [화면개발 표준 가이드](../화면개발_표준_가이드.md) +- [V2 컴포넌트 사용 가이드](../00_analysis/v2-component-usage-guide.md) +- [전체 화면 분석 보고서](../00_analysis/full-screen-analysis.md)