docs: 생산계획관리 화면 구현 계획 및 테이블 구조 분석 업데이트

- 생산계획관리 화면의 구현 상태와 필요 작업을 명시하였습니다.
- 화면 구조 분석을 통해 사용 테이블 및 관계를 상세히 설명하였습니다.
- 커스텀 모드 추가 및 신규 컴포넌트 개발 필요성을 강조하여 향후 개발 방향을 명확히 하였습니다.
- 현재 V2 컴포넌트의 제한 사항과 확장 방안을 정리하여 개발자들이 참고할 수 있도록 하였습니다.
This commit is contained in:
kjs 2026-01-30 14:51:09 +09:00
parent 4ab2761c82
commit 152558d593
1 changed files with 728 additions and 109 deletions

View File

@ -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<string, any>;
}
```
### 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)