ERP-node/docs/screen-implementation-guide/03_production/production-plan.md

48 KiB

생산계획관리 (Production Plan Management)

Screen ID: /screens/{TBD} 메뉴 경로: 생산관리 > 생산계획관리

⚠️ 구현 상태 안내

  • 간소화 버전 (패턴 A): 즉시 구현 가능
  • 정식 버전 (복합 레이아웃): ⚠️ 컴포넌트 개발 후 구현 가능
    • v2-split-panel-layout 커스텀 모드 확장 구현 완료
    • v2-table-grouped, v2-timeline-scheduler 신규 개발 (2개)

1. 화면 개요

항목 내용
화면명 생산계획관리
영문명 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.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 레이아웃 구조

┌─────────────────────────────────────────────────────────────────────────────┐
│                              검색 섹션                                       │
│  [검색필드들...]           [사용자옵션] [엑셀업로드] [엑셀다운로드]            │
├────────────────────────────────┬──┬──────────────────────────────────────────┤
│     왼쪽 패널 (50%, 리사이즈)   │  │      오른쪽 패널 (50%)                    │
│ ┌────────────────────────────┐ │리│ ┌──────────────────────────────────────┐ │
│ │ [수주데이터] [안전재고부족] │ │사│ │ [완제품 생산계획] [반제품 생산계획]   │ │
│ ├────────────────────────────┤ │이│ ├──────────────────────────────────────┤ │
│ │                            │ │즈│ │                                      │ │
│ │  수주 목록 테이블           │ │핸│ │  타임라인 스케줄러                    │
│ │  (그룹화된 품목별 수주)      │ │들│ │  (간트차트 형태)                      │
│ │                            │ │  │ │                                      │ │
│ │  - 체크박스                 │ │  │ │  - 날짜별 그리드                      │
│ │  - 접기/펼치기 토글          │ │  │ │  - 생산계획 바 (드래그 가능)           │
│ │  - 품목별 그룹 행            │ │  │ │  - 납기일 마커                        │
│ │  - 수주 상세 행              │ │  │ │                                      │
│ │                            │ │  │ │                                      │
│ └────────────────────────────┘ │  │ └──────────────────────────────────────┘ │
│ [계획에 없는 품목만] [선택품목 불러오기] [새로고침] │ [자동스케줄] [저장] [초기화] │
└────────────────────────────────┴──┴──────────────────────────────────────────┘

2.3.2 탭 구조

왼쪽 패널 탭:

  1. 수주데이터: 수주 목록 (품목별 그룹핑)
  2. 안전재고 부족분: 안전재고 미달 품목 목록

오른쪽 패널 탭:

  1. 완제품 생산계획: 완제품 타임라인 스케줄러
  2. 반제품 생산계획: 반제품 타임라인 스케줄러

3. 테이블 정의

3.1 메인 테이블: production_plan_mng

컬럼명 타입 NULL 설명
id SERIAL NO PK
company_code VARCHAR(20) NO 회사 코드
plan_no VARCHAR(50) NO 생산계획번호
plan_date DATE NO 계획일자
item_code VARCHAR(50) NO 품목코드
item_name VARCHAR(200) YES 품명
plan_qty NUMERIC(15,3) NO 계획수량
start_date DATE NO 시작일
end_date DATE NO 종료일
due_date DATE YES 납기일
equipment_id INTEGER YES 설비 ID (FK)
equipment_name VARCHAR(100) YES 설비명
status VARCHAR(20) YES 상태 (계획/지시/진행/완료)
priority VARCHAR(20) YES 우선순위
work_shift VARCHAR(20) YES 작업조 (주간/야간/주야)
manager_name VARCHAR(100) YES 담당자
work_order_no VARCHAR(50) YES 작업지시번호
remarks TEXT YES 비고
order_no VARCHAR(50) YES 관련 수주번호
partner_id VARCHAR(50) YES 거래처 ID
hourly_capacity NUMERIC(15,3) YES 시간당 생산능력
daily_capacity NUMERIC(15,3) YES 일일 생산능력
lead_time INTEGER YES 리드타임 (일)
product_type VARCHAR(20) YES 제품유형 (완제품/반제품)
parent_plan_id INTEGER YES 모품목 계획 ID (반제품용)
created_date TIMESTAMPTZ YES 생성일시
created_by VARCHAR(50) YES 생성자
updated_date TIMESTAMPTZ YES 수정일시
updated_by VARCHAR(50) YES 수정자

3.2 관련 테이블

equipment_info (설비 정보)

컬럼명 타입 설명
id SERIAL PK
equipment_code VARCHAR(50) 설비코드
equipment_name VARCHAR(100) 설비명
equipment_type VARCHAR(50) 설비유형
capacity_per_hour NUMERIC(15,3) 시간당 생산능력
status VARCHAR(20) 상태

4. 구현 가능 여부 분석

4.1 현재 V2 컴포넌트로 구현 가능한 기능

기능 가능 여부 사용 컴포넌트 비고
검색 필터 v2-table-search-widget
기본 버튼 (엑셀, 사용자옵션) v2-button-primary
단일 테이블 목록 v2-table-list
기본 모달 폼 모달 화면
좌우 분할 패널 (커스텀 모드) v2-split-panel-layout displayMode: "custom" 지원
탭 컴포넌트 (기본) ⚠️ v2-tabs-widget 디자인 모드에서 컴포넌트 배치

4.2 현재 V2 컴포넌트의 제한 사항 및 확장 방안

v2-split-panel-layout 현재 기능

기능 지원 설명
좌우 분할 패널 리사이즈 가능
테이블/리스트 표시 displayMode: "list" | "table"
마스터-디테일 관계 relation 설정
우측 추가 탭 (additionalTabs) ⚠️ 타입만 정의, 렌더링 미구현
패널 내 임의 컴포넌트 배치 displayMode: "custom" - 구현 완료!

커스텀 모드 (구현 완료)

v2-tabs-widget과 동일한 구조로 패널 안에 컴포넌트를 자유롭게 배치:

leftPanel: {
  displayMode: "list" | "table" | "custom",  // ✅ 커스텀 모드 지원
  
  // 기존 모드 (list, table)
  tableName?: string,
  columns?: [...],
  
  // ✅ 커스텀 모드 - 패널 안에 자유롭게 컴포넌트 배치
  components?: PanelInlineComponent[],
}

// PanelInlineComponent 구조
interface PanelInlineComponent {
  id: string;
  componentType: string;
  label?: string;
  position?: { x: number; y: number };
  size?: { width: number; height: number };
  componentConfig?: Record<string, any>;
}

커스텀 모드 기능:

  • 드래그앤드롭으로 컴포넌트 이동
  • 리사이즈 핸들로 크기 조절
  • 컴포넌트 클릭 시 좌측 설정 패널에서 속성 편집
  • 디자인 모드에서 실제 컴포넌트 미리보기 렌더링
  • 탭, 테이블, 버튼 등 모든 V2 컴포넌트 배치 가능

v2-tabs-widget 현재 기능

기능 지원 설명
탭별 컴포넌트 배치 components[]
디자인 모드 드래그&드롭 위치/크기 조정
런타임 렌더링 DynamicComponentRenderer 사용

v2-tabs-widget 구조 (참고용):

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-tabs-widget 조합 (구현 완료)
오른쪽 패널 탭 (완제품/반제품) 커스텀 모드 + v2-tabs-widget 조합 (구현 완료)
그룹화된 테이블 (품목별 접기/펼치기) 신규 개발 필요
타임라인 스케줄러 (간트차트) 신규 개발 필요
드래그&드롭 스케줄 이동 v2-timeline-scheduler에 포함
복잡한 상세 모달 기존 모달 화면으로 충분

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-split-panel-layout 확장 - displayMode: "custom" 추가 [완료]
2. ✅ v2-table-grouped 신규 개발 - 그룹화 테이블 (접기/펼치기) [완료]
3. v2-timeline-scheduler 신규 개발 - 타임라인/간트차트 (핵심!)

4.5 현재 구현 가능한 최대 범위

현재 V2 컴포넌트로 구현 가능한 최대 범위:

┌──────────────────────────────────────────────────────────────┐
│ 검색 섹션 (v2-table-search-widget)                           │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  생산계획 테이블 (v2-table-list) - 단일 테이블, 그룹화 없음   │
│                                                              │
├──────────────────────────────────────────────────────────────┤
│ [등록] [수정] [삭제] (v2-button-primary)                      │
└──────────────────────────────────────────────────────────────┘

구현 불가능한 핵심 기능:

  • 품목별 그룹핑 (접기/펼치기)
  • 간트차트 타임라인
  • 자동 스케줄 생성
  • 드래그로 스케줄 이동

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. 단순화된 구현 방안 (임시)

현재 V2 컴포넌트만으로 간소화된 버전을 구현할 수 있습니다.

5.1 간소화 버전 레이아웃

┌──────────────────────────────────────────────────────────────┐
│ 검색 섹션                                                    │
│ [품목코드] [품명] [계획기간] [상태]   [사용자옵션] [엑셀다운로드] │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│                  생산계획 목록 테이블                          │
│  (단일 테이블, 그룹화 없음)                                    │
│                                                              │
├──────────────────────────────────────────────────────────────┤
│ [신규등록] [수정] [삭제]                                       │
└──────────────────────────────────────────────────────────────┘

5.2 컴포넌트 배치도 (간소화 버전)

┌─────────────────────────────────────────────────────────────────────────────┐
│ 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 컴포넌트 목록 (간소화 버전)

컴포넌트 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)

코드 표시명
완제품 완제품
반제품 반제품

6. 원본 HTML 기능 상세 분석

6.1 수주데이터 탭 (왼쪽 패널)

테이블 구조:

  • 품목별 그룹 행 (접기/펼치기 가능)
  • 수주 상세 행 (그룹 행 하위)

품목 그룹 행 컬럼:

컬럼 설명
체크박스 품목 그룹 선택
토글 상세 접기/펼치기
품목코드
품목명
총수주량 해당 품목의 모든 수주 합계
출고량
잔량 총수주량 - 출고량
현재고
안전재고
출하계획량
기생산계획량 이미 등록된 생산계획 수량
생산진행 현재 생산 중인 수량
필요생산계획 추가로 계획해야 할 수량 (빨간색 강조)

수주 상세 행:

  • 수주번호, 거래처, 상태 배지
  • 수주량, 출고량, 잔량
  • 납기일

버튼:

  • 계획에 없는 품목만 체크박스 필터
  • 선택 품목 불러오기: 선택한 품목을 생산계획으로 등록
  • 새로고침

6.2 안전재고 부족분 탭 (왼쪽 패널)

테이블 컬럼:

컬럼 설명
체크박스
품목코드
품목명
현재고
안전재고
부족수량 빨간색 (마이너스)
권장생산량 녹색
최종입고일

6.3 완제품 생산계획 탭 (오른쪽 패널)

스케줄 옵션:

  • 안전리드타임 (일)
  • 표시 기간 (주)
  • 미진행 계획 재계산 체크박스

범례:

  • 계획 (파란색)
  • 지시 (주황색)
  • 진행 (녹색)
  • 완료 (회색)
  • 납기일 (빨간 테두리)
  • 긴급 (빨간 아이콘)

타임라인 구조:

  • 날짜별 헤더 (일/월 표시, 주말 강조, 오늘 강조)
  • 품목별 행
  • 생산계획 바 (드래그로 이동 가능)
  • 클릭 시 상세 모달 오픈

버튼:

  • 새로고침
  • 자동 스케줄 생성: 선택된 품목에 대해 자동으로 생산계획 생성
  • 선택 계획 병합: 같은 품목의 계획을 하나로 병합
  • 선택 품목 → 반제품 계획: BOM 기반 반제품 계획 생성
  • 저장
  • 초기화

6.4 반제품 생산계획 탭 (오른쪽 패널)

옵션:

  • 현재고 및 안전재고 감안
  • 진행중인 계획 유지하고 재계산
  • 투입 완료된 반제품 제외

안내:

  • 완제품 생산계획 기준으로 필요한 반제품 계획 자동 생성
  • 모품목 생산 시작일 고려하여 납기일 설정
  • BOM(자재명세서) 정보 기반 필요 수량 계산

6.5 생산 스케줄 상세 모달

기본 정보:

  • 품목코드 (읽기전용)
  • 품목명 (읽기전용)

근거 정보:

  • 수주번호, 안전재고, 재고부족 등 표시

생산 정보:

  • 총 생산수량
  • 납기일 (읽기전용)
  • 계획 시작일 (수정 가능)
  • 계획 종료일 (수정 가능)
  • 생산 기간 (자동 계산)

과거 계획 경고:

  • 시작일이 과거인 경우 경고 표시
  • 오늘부터 재조정 버튼
  • 작업지시 즉시 생성 버튼

계획 분할:

  • 분할 개수 선택 (2~4개)
  • 각 분할 수량 입력
  • 분할 실행

설비 할당:

  • 설비 선택 버튼
  • 선택된 설비 목록

생산 상태:

  • 상태 (자동 관리): 계획됨/작업지시/진행중/완료

추가 정보:

  • 담당자
  • 작업지시번호
  • 비고

버튼:

  • 삭제
  • 취소
  • 저장

7. 구현 우선순위

Phase 1: 간소화 버전 (현재 구현 가능)

V2 컴포넌트로 기본 CRUD 화면 구현:

  • 검색 위젯
  • 단일 테이블 (그룹화 없음)
  • 기본 모달 폼
  • 상태 배지

Phase 2: 컴포넌트 확장 및 개발

  1. v2-split-panel-layout 확장 완료

    • displayMode: "custom" 추가
    • components[] 필드 지원 (탭 컴포넌트와 동일한 구조)
    • 디자인 모드에서 컴포넌트 드래그&드롭 지원
    • 컴포넌트 클릭 시 좌측 설정 패널에서 속성 편집
  2. v2-table-grouped 신규 개발 완료

    • 품목별 그룹핑 (접기/펼치기)
    • 그룹 행과 상세 행 구분
    • 체크박스 선택 (그룹 단위 / 개별 단위)
    • 그룹 요약 (개수, 합계, 평균 등)

Phase 3: 타임라인 스케줄러

  1. v2-timeline-scheduler 신규 개발

    • 간트차트 형태 타임라인
    • 날짜 그리드 (일/주/월 단위)
    • 생산계획 바 렌더링
  2. 드래그&드롭 기능

    • 계획 바 드래그로 날짜 이동
    • 계획 바 크기 조정 (기간 변경)
  3. 비즈니스 로직

    • 자동 스케줄 생성 API
    • BOM 기반 반제품 계획 연동
    • 설비별 용량 체크

8. 참고 사항

8.1 상태 배지 스타일

상태 배경색 글자색 설명
계획 #dbeafe #1e40af 파란색
지시 #fef3c7 #92400e 주황색
진행 #d1fae5 #065f46 녹색
완료 #f3f4f6 #4b5563 회색
긴급 #fee2e2 #991b1b 빨간색

8.2 자동 스케줄 생성 로직

1. 선택된 품목의 필요 생산수량 계산
   - 필요수량 = 잔량 + 안전재고 - 현재고 - 기생산계획량

2. 납기일에서 안전리드타임 차감하여 완료일 계산

3. 일일 생산능력으로 필요 생산일수 계산

4. 완료일에서 역산하여 시작일 계산

5. 설비 가용성 확인 및 자동 할당

6. 반제품이 필요한 경우 BOM 기반 반제품 계획 생성

8.3 계획 분할 로직

1. 원본 계획의 총 수량 확인

2. 분할 개수 선택 (2~4개)

3. 각 분할 수량 입력 (합계 = 원본 수량)

4. 분할 실행 시:
   - 원본 계획 삭제
   - 새로운 N개의 계획 생성
   - 각각 별도의 시작일/종료일 설정 가능

9. DB INSERT JSON (간소화 버전)

⚠️ 이 JSON은 간소화 버전입니다. 전체 기능 구현 시 별도 개발이 필요합니다.

9.1 screen_definitions

{
  "screen_name": "생산계획관리",
  "screen_code": "{COMPANY_CODE}_PP_MAIN",
  "table_name": "production_plan_mng",
  "company_code": "{COMPANY_CODE}",
  "description": "생산계획 관리 화면 (간소화 버전)",
  "is_active": "Y",
  "db_source_type": "internal",
  "data_source_type": "database"
}

9.2 screen_layouts_v2.layout_data (간소화 버전)

{
  "version": "2.0",
  "components": [
    {
      "id": "comp_search",
      "url": "@/lib/registry/components/v2-table-search-widget",
      "size": { "width": 1920, "height": 80 },
      "position": { "x": 0, "y": 20, "z": 1 },
      "overrides": {
        "type": "v2-table-search-widget",
        "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
    },
    {
      "id": "comp_table",
      "url": "@/lib/registry/components/v2-table-list",
      "size": { "width": 1920, "height": 700 },
      "position": { "x": 0, "y": 120, "z": 1 },
      "overrides": {
        "type": "v2-table-list",
        "label": "생산계획 목록",
        "columns": [
          { "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 },
        "defaultSort": { "field": "plan_date", "order": "desc" }
      },
      "displayOrder": 1
    },
    {
      "id": "comp_btn_register",
      "url": "@/lib/registry/components/v2-button-primary",
      "size": { "width": 100, "height": 40 },
      "position": { "x": 1480, "y": 70, "z": 1 },
      "overrides": {
        "text": "신규 등록",
        "type": "v2-button-primary",
        "action": { "type": "modal", "modalTitle": "생산계획 등록", "targetScreenId": null },
        "variant": "success"
      },
      "displayOrder": 2
    },
    {
      "id": "comp_btn_edit",
      "url": "@/lib/registry/components/v2-button-primary",
      "size": { "width": 80, "height": 40 },
      "position": { "x": 1590, "y": 70, "z": 1 },
      "overrides": {
        "text": "수정",
        "type": "v2-button-primary",
        "action": { "type": "edit", "modalTitle": "생산계획 수정", "targetScreenId": null },
        "variant": "secondary",
        "requireSelection": true
      },
      "displayOrder": 3
    },
    {
      "id": "comp_btn_delete",
      "url": "@/lib/registry/components/v2-button-primary",
      "size": { "width": 80, "height": 40 },
      "position": { "x": 1680, "y": 70, "z": 1 },
      "overrides": {
        "text": "삭제",
        "type": "v2-button-primary",
        "action": { "type": "delete" },
        "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
    }
  ]
}

10. 비즈니스 로직 요청서 (간소화 버전)

중요: 이 섹션은 표준 양식에 따라 작성되었습니다.

=== 비즈니스 로직 요청서 ===

【화면 정보】
- 화면명: 생산계획관리 (간소화 버전)
- 회사코드: {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 삭제 버튼 (조건부 삭제)

{
  "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 작업지시 생성 버튼

{
  "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 간소화 버전 (현재 구현 가능)

체크 항목 설명
테이블 생성 production_plan_mng 테이블 생성
화면 정의 screen_definitions INSERT
모달 화면 생성 등록/수정 모달 화면 생성
메인 화면 생성 screen_layouts_v2 INSERT
제어관리 설정 dataflow_diagrams INSERT (삭제, 작업지시 생성)
메뉴 연결 대상 메뉴에 화면 할당
기본 CRUD 테스트 등록/수정/삭제/조회 테스트
비즈니스 룰 테스트 조건부 삭제, 작업지시 생성 테스트

15.2 전체 버전 (향후 구현)

체크 항목 설명
v2-split-panel-layout 확장 displayMode: "custom" + components[] 추가 완료
v2-table-grouped 개발 그룹화 테이블 컴포넌트 완료
v2-timeline-scheduler 개발 타임라인/간트차트 스케줄러
드래그&드롭 기능 타임라인 바 드래그 이동/크기 조정
자동 스케줄 로직 자동 스케줄 생성 백엔드 API
반제품 연동 BOM 기반 반제품 계획 생성
정식 버전 화면 구성 커스텀 모드로 탭+테이블+타임라인 조합

16. 관련 문서


17. 참고: 표준 가이드