# 제조업 공정 관리 방법론

## 📋 목차
1. [개요](#개요)
2. [7가지 공정 관리 변수](#7가지-공정-관리-변수)
3. [데이터 구조 설계](#데이터-구조-설계)
4. [실무 시나리오별 해결 방법](#실무-시나리오별-해결-방법)
5. [구현 화면](#구현-화면)

---

## 개요

제조업에서 품목별 공정 관리는 다양한 변수를 고려해야 합니다. 본 문서는 이러한 변수들을 체계적으로 관리하기 위한 방법론을 제시합니다.

---

## 7가지 공정 관리 변수

### 1. 품목별로 공정순서가 정해져있는 경우
- **해결방안**: `순서고정여부` = Y
- **예시**: 재단 → 가공 → 조립 (반드시 이 순서)

### 2. 어떤 품목은 공정순서가 바뀌어도 되는 경우
- **해결방안**: `순서고정여부` = N
- **예시**: 도장과 가공의 순서 변경 가능

### 3. 어떤 공정은 내부 또는 외부(외주)에서 선택적으로 하는 경우
- **해결방안**: `작업구분` = "선택가능"
- **예시**: 가공 공정을 내부 또는 외주 중 선택

### 4. 어떤 외주에서는 상황에 따라 여럿 공정이 거쳐지는 경우
- **해결방안**: `외주업체목록` 컬럼에 복수 업체 저장
- **예시**: A업체, B업체, C업체 중 선택

### 5. 어떤 경우에는 정해진 공정중 배제하고 하는 경우
- **해결방안**: `필수여부` = N
- **예시**: 도장 공정을 생략 가능

### 6. 공정 작업중 재작업의 경우
- **해결방안**: `공정상태` = "재작업", `재작업회차` 관리
- **예시**: 조립 공정 재실행

### 7. 공정 작업중 이전 다른공정에서 재작업
- **해결방안**: `원공정순번` 기록, 공정 히스토리 추적
- **예시**: 검사 불합격 → 가공 공정으로 돌아가서 재작업

---

## 데이터 구조 설계

### 1. 공정 마스터 (ProcessMaster)
```
- process_code (공정코드, PK)
- process_name (공정명)
- process_type (공정유형: 내부/외주/선택가능)
- standard_time (표준작업시간, 분)
- equipment (사용설비)
- worker_count (작업인원수)
- use_yn (사용여부)
- remark (비고)
```

### 2. 품목별 라우팅 (ItemRouting)
```
- routing_id (라우팅ID, PK)
- item_code (품목코드, FK)
- version (버전: v1, v2, ...)
- routing_name (라우팅명)
- is_default (기본여부: Y/N)
- use_yn (사용여부)
```

### 3. 라우팅 상세 (RoutingDetail)
```
- routing_id (라우팅ID, FK)
- seq_no (순번: 10, 20, 30...)
- process_code (공정코드, FK)
- is_required (필수여부: Y/N) ← 조건5 해결
- is_fixed_order (순서고정여부: Y/N) ← 조건2 해결
- work_type (작업구분: 내부/외주/선택) ← 조건3 해결
- vendor_list (외주업체목록, JSON) ← 조건4 해결
- prev_process (선행공정, FK, nullable)
- standard_time (표준작업시간)
- remark (비고)
```

### 4. 작업지시별 공정 (WorkOrderProcess)
```
- wo_no (작업지시번호, FK)
- seq_no (순번)
- process_code (공정코드)
- process_type (공정유형: STANDARD/ADDED/REWORK)
- is_from_routing (기본라우팅여부: Y/N)
- work_type (실제작업구분: 내부/외주)
- vendor_code (외주업체코드, 선택시)
- status (공정상태: 대기/진행중/완료/재작업)
- rework_count (재작업회차) ← 조건6 해결
- original_seq (원공정순번, 재작업시) ← 조건7 해결
- add_reason (추가사유)
- add_user (추가자)
- add_datetime (추가일시)
- start_time (시작시간)
- end_time (종료시간)
```

### 5. 공정 변경 이력 (ProcessChangeHistory)
```
- history_id (이력ID, PK)
- wo_no (작업지시번호)
- change_type (변경유형: ADD/DELETE/MODIFY/REORDER)
- process_code (공정코드)
- seq_no (순번)
- change_reason (변경사유)
- changed_by (변경자)
- changed_at (변경일시)
```

---

## 실무 시나리오별 해결 방법

### 시나리오 1: 작업지시 생성 시 공정 추가/제거

**상황:**
```
기본 라우팅: 재단 → 가공 → 조립 → 검사

작업지시 생성 시:
재단 → 가공 → [열처리 추가] → 조립 → 검사
```

**해결방법:**
1. 작업지시 생성 화면에서 품목의 기본 라우팅을 불러옴
2. "라우팅 편집" 기능으로 공정 추가/삭제/순서변경
3. 편집된 라우팅을 `WorkOrderProcess` 테이블에 저장
4. `is_from_routing` = N (추가된 공정)
5. `process_type` = 'ADDED'
6. `add_reason`에 추가 사유 기록

**프로세스:**
```
[작업지시 생성]
  ↓
[품목 선택] → 기본 라우팅 자동 로드
  ↓
[라우팅 편집] (선택사항)
  - 공정 추가 버튼
  - 공정 삭제 (필수여부=N인 공정만)
  - 순서 변경 (드래그 앤 드롭)
  - 외주업체 선택
  ↓
[저장] → WorkOrderProcess에 저장
```

---

### 시나리오 2: 작업 진행 중 긴급 공정 추가 ⭐ (핵심!)

**상황:**
```
작업 진행 상황:
✅ 10. 재단 (완료)
✅ 20. 가공 (완료)
⏸️ 30. 조립 (진행중)
⏳ 40. 검사 (대기)

→ 문제 발견! "표면처리" 공정이 필요함
→ 조립 전에 표면처리를 해야 함
```

**해결방법 A: 공정 중간 삽입 (권장)**
```
1. 조립 공정 일시중지 (상태: 진행중 → 대기)
2. "긴급 공정 추가" 버튼 클릭
3. 공정 선택: 표면처리
4. 삽입 위치: 25 (20과 30 사이)
5. 추가 사유 입력: "표면 결함 발견, 표면처리 필요"
6. 저장

결과:
✅ 10. 재단 (완료)
✅ 20. 가공 (완료)
⏳ 25. 표면처리 (대기) ← 긴급 추가
⏳ 30. 조립 (대기)
⏳ 40. 검사 (대기)
```

**데이터 저장:**
```sql
INSERT INTO WorkOrderProcess VALUES (
    'WO-2025-001',  -- wo_no
    25,             -- seq_no
    'P099',         -- process_code (표면처리)
    'ADDED',        -- process_type
    'N',            -- is_from_routing
    '내부',         -- work_type
    NULL,           -- vendor_code
    '대기',         -- status
    0,              -- rework_count
    NULL,           -- original_seq
    '표면 결함 발견, 표면처리 필요',  -- add_reason
    '김철수',       -- add_user
    NOW()           -- add_datetime
);

INSERT INTO ProcessChangeHistory VALUES (
    UUID(),
    'WO-2025-001',
    'ADD',
    'P099',
    25,
    '표면 결함 발견, 표면처리 필요',
    '김철수',
    NOW()
);
```

**해결방법 B: 동적 라우팅 (가장 유연)**
- 기본 라우팅은 "권장 사항"일 뿐
- 실제 작업은 현장에서 실시간 결정
- 모든 공정 추가/삭제가 자유로움
- 단, 변경 이력은 철저히 기록

---

### 시나리오 3: 재작업 시 추가 공정

**상황:**
```
원래 라우팅: 재단 → 가공 → 도장 → 조립 → 검사

진행 상황:
✅ 10. 재단 (완료)
✅ 20. 가공 (완료)
✅ 30. 도장 (완료)
✅ 40. 조립 (완료)
❌ 50. 검사 (불합격) → 도장 불량 발견
```

**해결방법:**
```
1. 검사 불합격 처리
2. "재작업" 버튼 클릭
3. 재작업 공정 선택: 도장
4. 추가 공정 필요 여부 확인
   → "연마" 공정 추가 필요
5. 재작업 라우팅 생성:
   35. 연마 (추가, REWORK)
   30. 도장 (재작업, 회차=1)
   40. 조립 (재작업, 회차=1)
   50. 검사 (재작업, 회차=1)
```

**데이터 저장:**
```sql
-- 연마 공정 추가
INSERT INTO WorkOrderProcess VALUES (
    'WO-2025-001',
    35,
    'P100',  -- 연마
    'REWORK',
    'N',
    '내부',
    NULL,
    '대기',
    1,       -- rework_count
    30,      -- original_seq (도장의 원래 순번)
    '도장 불량으로 인한 연마 작업 필요',
    '이영희',
    NOW()
);

-- 도장 재작업
UPDATE WorkOrderProcess 
SET status = '대기', 
    rework_count = rework_count + 1,
    original_seq = 30
WHERE wo_no = 'WO-2025-001' AND seq_no = 30;
```

---

### 시나리오 4: 순서 변경 가능한 공정

**상황:**
```
품목: 스틸 브라켓
기본 라우팅: 재단 → 가공 → 도장 → 조립
특징: 가공과 도장은 순서 변경 가능 (is_fixed_order = N)
```

**해결방법:**
```
작업지시 생성 시:
- 도장을 먼저 하고 싶음
- 순서 변경:
  10. 재단
  20. 도장 ← 순서 변경
  30. 가공 ← 순서 변경
  40. 조립

시스템 체크:
- 재단(is_fixed_order=Y) → 순서 변경 불가
- 도장(is_fixed_order=N) → 순서 변경 가능 ✓
- 가공(is_fixed_order=N) → 순서 변경 가능 ✓
- 조립(is_fixed_order=Y) → 순서 변경 불가
```

---

### 시나리오 5: 공정 배제

**상황:**
```
품목: 플라스틱 케이스
기본 라우팅: 사출 → 연마 → 도장 → 검사
특징: 연마(is_required=N), 도장(is_required=N)
```

**해결방법:**
```
작업지시 생성 시:
- "연마" 공정 제외 (고객 요청으로 불필요)
- "도장" 공정 포함 (필요)

최종 라우팅:
10. 사출
30. 도장 (연마 제외)
40. 검사

시스템 체크:
- 연마(is_required=N) → 제외 가능 ✓
- 도장(is_required=N) → 제외 가능하지만 포함하기로 결정
```

---

### 시나리오 6: 내부/외주 선택

**상황:**
```
품목: 알루미늄 프레임
공정: 가공 (work_type = '선택가능')
가능 외주업체: [A업체, B업체, C업체]
```

**해결방법:**
```
작업지시 생성 시:
1. 가공 공정에서 작업구분 선택
   - 내부 선택 → 자체 설비로 작업
   - 외주 선택 → 외주업체 목록 표시
     * A업체 (리드타임 3일, 단가 10,000원)
     * B업체 (리드타임 5일, 단가 8,000원)
     * C업체 (리드타임 2일, 단가 12,000원)
2. B업체 선택
3. 저장

최종 데이터:
- work_type: '외주'
- vendor_code: 'V002' (B업체)
```

---

## 구현 화면

### 1. 공정 마스터 관리 (공정관리.html)
**경로:** `화면개발/공정관리.html`

**기능:**
- 공정 등록/수정/삭제
- 공정코드, 공정명, 공정유형 관리
- 표준작업시간, 사용설비, 작업인원수 설정
- 검색 및 필터링

**샘플 데이터:**
- P001: 재단 (내부)
- P002: 가공 (선택가능)
- P003: 도장 (외주)
- P004: 조립 (내부)
- P005: 검사 (내부)

---

### 2. 품목별 라우팅 관리 (품목라우팅관리.html)
**경로:** `화면개발/품목라우팅관리.html`

**기능:**
- 품목 선택 후 라우팅 설정
- 다중 라우팅 버전 관리 (v1, v2, ...)
- 기본 라우팅 설정
- 공정별 상세 설정:
  - 순번 (10, 20, 30... 중간 삽입 가능)
  - 필수여부 (공정 배제 가능)
  - 순서고정여부 (순서 변경 가능 여부)
  - 작업구분 (내부/외주/선택가능)
  - 외주업체 다중 선택
  - 표준작업시간
- 공정 추가/삭제
- 드래그 앤 드롭 (준비)

**화면 구성:**
```
┌─────────────────────────────────────────────┐
│ [왼쪽: 품목 목록]  [오른쪽: 라우팅 관리]     │
│                                              │
│ 📦 품목 목록        품목: 알루미늄 프레임      │
│ ┌──────────┐      라우팅: ⭐v1 기본 v2 대체  │
│ │ITEM001   │      ┌─────────────────────┐  │
│ │알루미늄   │      │ 공정 순서           │  │
│ │프레임    │      │ ✓ 10 재단 필수 고정  │  │
│ └──────────┘      │ ✓ 20 가공 필수 변경  │  │
│ ITEM002          │   30 도장 선택 변경  │  │
│ 스틸 브라켓       │ ✓ 40 조립 필수 고정  │  │
│                   │ ✓ 50 검사 필수 고정  │  │
│                   └─────────────────────┘  │
└─────────────────────────────────────────────┘
```

---

### 3. 작업지시 관리 (추후 구현 예정)
**경로:** `화면개발/작업지시관리.html`

**기능:**
- 작업지시 생성 시 기본 라우팅 로드
- 라우팅 편집 (공정 추가/삭제/순서변경)
- 외주업체 선택
- 작업 진행 중 긴급 공정 추가
- 공정별 시작/완료 처리
- 재작업 처리
- 공정 변경 이력 조회

**화면 구성:**
```
[작업지시 정보]
작업지시번호: WO-2025-001
품목: 알루미늄 프레임
수량: 100개

[공정 진행 현황]
┌──┬────────┬──────┬──────┬──────┬────────┐
│선택│순번   │공정명  │상태  │작업구분│관리    │
├──┼────────┼──────┼──────┼──────┼────────┤
│□ │10     │재단   │완료  │내부  │        │
├──┼────────┼──────┼──────┼──────┼────────┤
│□ │20     │가공   │완료  │내부  │        │
├──┼────────┼──────┼──────┼──────┼────────┤
│□ │30     │조립   │진행중│내부  │일시중지│
├──┼────────┼──────┼──────┼──────┼────────┤
│□ │40     │검사   │대기  │내부  │        │
└──┴────────┴──────┴──────┴──────┴────────┘

[긴급 공정 추가] [선택 삭제] [재작업] [변경이력]
```

---

## 핵심 원칙

### 1. 기본 라우팅 = 템플릿
- 기본 라우팅은 템플릿 역할
- 작업지시 생성 시 복사해서 사용
- 원본은 보존되어야 함

### 2. 작업지시별 독립적인 공정 목록
- 각 작업지시는 자체 공정 목록을 보유
- 실시간 추가/수정/삭제 가능
- 기본 라우팅과 독립적

### 3. 유연한 순번 체계
- 순번을 10단위로 관리 (10, 20, 30, 40...)
- 중간 공정 추가 가능 (15, 25, 35...)
- 순서 변경 시 재번호 부여

### 4. 변경 이력 철저히 기록
- 누가(who), 언제(when), 왜(why) 추가/변경했는지
- 추적 가능성(traceability) 확보
- 감사(audit) 대응

### 5. 공정 유형 명확히 구분
- **STANDARD**: 기본 라우팅에서 온 표준 공정
- **ADDED**: 작업지시 생성 시 또는 진행 중 추가된 공정
- **REWORK**: 재작업 공정

### 6. 권한 관리
- **작업자**: 공정 시작/완료만 가능
- **반장/조장**: 긴급 공정 추가 가능
- **관리자**: 모든 공정 변경 가능
- **승인 프로세스**: 필요시 구현

### 7. 실시간성과 추적성의 균형
- 현장의 유연성 확보 (실시간 공정 추가)
- 변경 사유 및 이력 필수 기록 (추적성)

---

## 데이터 흐름

```
[공정 마스터 등록]
     ↓
[품목별 라우팅 설정] (기본 라우팅)
     ↓
[작업지시 생성] → 기본 라우팅 복사
     ↓
[라우팅 편집] (선택사항)
  - 공정 추가/삭제
  - 순서 변경
  - 외주업체 선택
     ↓
[작업지시별 라우팅 확정]
     ↓
[작업 진행]
  - 공정별 시작/완료
  - 긴급 공정 추가 (필요시)
  - 재작업 (필요시)
     ↓
[완료]
```

---

## 구현 우선순위

### Phase 1: 기본 마스터 관리
- [x] 공정 마스터 관리 화면
- [x] 품목별 라우팅 관리 화면
- [ ] 외주업체 마스터 관리

### Phase 2: 작업지시 관리
- [ ] 작업지시 생성 화면
- [ ] 기본 라우팅 로드 및 편집
- [ ] 작업지시별 공정 저장

### Phase 3: 현장 작업 관리
- [ ] 작업 진행 현황 화면
- [ ] 공정별 시작/완료 처리
- [ ] 긴급 공정 추가 기능
- [ ] 재작업 처리

### Phase 4: 이력 및 분석
- [ ] 공정 변경 이력 조회
- [ ] 공정별 작업시간 분석
- [ ] 외주 실적 분석

---

## 참고사항

### 외주 관리 고려사항
- 외주 발주서 자동 생성
- 외주 일정 관리
- 외주 입고 처리
- 외주 비용 관리

### BOM 연계
- 공정별 소요 자재/부품
- 자재 투입 시점
- 재고 차감

### 품질 관리 연계
- 공정별 검사 기준
- 불량 유형 관리
- 재작업 사유 분석

### 원가 관리 연계
- 공정별 원가 집계
- 내부 공정: 인건비 + 설비비
- 외주 공정: 외주비

---

## 작성 정보

- **작성일**: 2025-01-XX
- **작성자**: AI Assistant
- **버전**: 1.0
- **목적**: 공정 관리 시스템 구현을 위한 설계 문서
- **적용 범위**: 제조업 ERP 시스템

---

## 추후 개선 방향

1. **AI 기반 라우팅 추천**
   - 과거 작업 이력 분석
   - 최적 라우팅 자동 제안

2. **실시간 공정 모니터링**
   - 각 공정별 진행률 실시간 표시
   - 지연 공정 알림

3. **모바일 앱 연동**
   - 현장 작업자용 모바일 앱
   - QR 코드 스캔으로 공정 시작/완료

4. **IoT 센서 연동**
   - 설비 가동률 실시간 수집
   - 자동 작업시간 기록

5. **예측 유지보수**
   - 설비 고장 예측
   - 공정 지연 사전 감지











