# 공정 작업기준 컴포넌트 (v2-process-work-standard) 구현 계획

> **작성일**: 2026-02-24
> **컴포넌트 ID**: `v2-process-work-standard`
> **성격**: 도메인 특화 컴포넌트 (v2-rack-structure와 동일 패턴)

---

## 1. 현황 분석

### 1.1 기존 DB 테이블 (참조용, 이미 존재)

| 테이블 | 역할 | 핵심 컬럼 |
|--------|------|----------|
| `item_info` | 품목 마스터 | id, item_name, item_number, company_code |
| `item_routing_version` | 라우팅 버전 | id, item_code, version_name, company_code |
| `item_routing_detail` | 라우팅 상세 (공정 배정) | id, routing_version_id, seq_no, process_code, company_code |
| `process_mng` | 공정 마스터 | id, process_code, process_name, company_code |

### 1.2 신규 생성 필요 테이블

**`process_work_item`** - 작업 항목 (검사 장비 준비, 외관 검사 등)

| 컬럼 | 타입 | 설명 |
|------|------|------|
| id | VARCHAR PK | UUID |
| company_code | VARCHAR NOT NULL | 멀티테넌시 |
| routing_detail_id | VARCHAR NOT NULL | item_routing_detail.id FK |
| work_phase | VARCHAR NOT NULL | Config의 phases[].key 값 (예: 'PRE', 'IN', 'POST' 또는 사용자 정의) |
| title | VARCHAR NOT NULL | 항목 제목 (예: 검사 장비 준비) |
| is_required | VARCHAR | 'Y' / 'N' |
| sort_order | INTEGER | 표시 순서 |
| description | TEXT | 비고/설명 |
| created_date | TIMESTAMP | 생성일 |
| updated_date | TIMESTAMP | 수정일 |
| writer | VARCHAR | 작성자 |

**`process_work_item_detail`** - 작업 항목 상세 (버니어 캘리퍼스 상태 소정 등)

| 컬럼 | 타입 | 설명 |
|------|------|------|
| id | VARCHAR PK | UUID |
| company_code | VARCHAR NOT NULL | 멀티테넌시 |
| work_item_id | VARCHAR NOT NULL | process_work_item.id FK |
| detail_type | VARCHAR | 'CHECK' / 'INSPECTION' / 'MEASUREMENT' 등 |
| content | VARCHAR NOT NULL | 상세 내용 |
| is_required | VARCHAR | 'Y' / 'N' |
| sort_order | INTEGER | 표시 순서 |
| remark | TEXT | 비고 |
| created_date | TIMESTAMP | 생성일 |
| updated_date | TIMESTAMP | 수정일 |
| writer | VARCHAR | 작성자 |

### 1.3 데이터 흐름 (5단계 연쇄)

```
item_info (품목)
  └─→ item_routing_version (라우팅 버전)
        └─→ item_routing_detail (공정 배정)  ← JOIN → process_mng (공정명)
              └─→ process_work_item (작업 항목, phase별)
                    └─→ process_work_item_detail (상세)
```

---

## 2. 파일 구조 계획

### 2.1 프론트엔드 (컴포넌트 등록)

```
frontend/lib/registry/components/v2-process-work-standard/
├── index.ts                              # createComponentDefinition
├── types.ts                              # 타입 정의
├── config.ts                             # 기본 설정
├── ProcessWorkStandardRenderer.tsx       # AutoRegisteringComponentRenderer
├── ProcessWorkStandardConfigPanel.tsx    # 설정 패널
├── ProcessWorkStandardComponent.tsx      # 메인 UI (좌우 분할)
├── components/
│   ├── ItemProcessSelector.tsx           # 좌측: 품목/라우팅/공정 아코디언 트리
│   ├── WorkStandardEditor.tsx            # 우측: 작업기준 편집 영역 전체
│   ├── WorkPhaseSection.tsx              # Pre/In/Post 섹션 (3회 재사용)
│   ├── WorkItemCard.tsx                  # 작업 항목 카드
│   ├── WorkItemDetailList.tsx            # 상세 리스트
│   └── WorkItemAddModal.tsx              # 작업 항목 추가/수정 모달
├── hooks/
│   ├── useProcessWorkStandard.ts         # 전체 데이터 관리 훅
│   ├── useItemProcessTree.ts            # 좌측 트리 데이터 훅
│   └── useWorkItems.ts                   # 작업 항목 CRUD 훅
└── README.md
```

### 2.2 백엔드 (API)

```
backend-node/src/
├── routes/processWorkStandardRoutes.ts   # 라우트 정의
└── controllers/processWorkStandardController.ts  # 컨트롤러
```

### 2.3 DB 마이그레이션

```
db/migrations/XXX_create_process_work_standard_tables.sql
```

---

## 3. API 설계

| Method | Endpoint | 설명 |
|--------|----------|------|
| GET | `/api/process-work-standard/items` | 품목 목록 (라우팅 있는 품목만) |
| GET | `/api/process-work-standard/items/:itemCode/routings` | 품목별 라우팅 버전 + 공정 목록 |
| GET | `/api/process-work-standard/routing-detail/:routingDetailId/work-items` | 공정별 작업 항목 목록 (phase별 그룹) |
| POST | `/api/process-work-standard/work-items` | 작업 항목 추가 |
| PUT | `/api/process-work-standard/work-items/:id` | 작업 항목 수정 |
| DELETE | `/api/process-work-standard/work-items/:id` | 작업 항목 삭제 |
| GET | `/api/process-work-standard/work-items/:workItemId/details` | 작업 항목 상세 목록 |
| POST | `/api/process-work-standard/work-item-details` | 상세 추가 |
| PUT | `/api/process-work-standard/work-item-details/:id` | 상세 수정 |
| DELETE | `/api/process-work-standard/work-item-details/:id` | 상세 삭제 |
| PUT | `/api/process-work-standard/save-all` | 전체 저장 (작업 항목 + 상세 일괄) |

---

## 4. 구현 단계 (TDD 기반)

### Phase 1: DB + API 기반

- [ ] 1-1. 마이그레이션 SQL 작성 (process_work_item, process_work_item_detail)
- [ ] 1-2. 마이그레이션 실행 및 테이블 생성 확인
- [ ] 1-3. 백엔드 라우트/컨트롤러 작성 (CRUD API)
- [ ] 1-4. API 테스트 (품목 목록, 라우팅 조회, 작업항목 CRUD)

### Phase 2: 컴포넌트 기본 구조

- [ ] 2-1. types.ts, config.ts, index.ts 작성 (컴포넌트 정의)
- [ ] 2-2. Renderer, ConfigPanel 작성 (V2 시스템 등록)
- [ ] 2-3. components/index.ts에 import 추가
- [ ] 2-4. getComponentConfigPanel.tsx에 매핑 추가
- [ ] 2-5. 화면 디자이너에서 컴포넌트 배치 가능 확인

### Phase 3: 좌측 패널 (품목/공정 선택)

- [ ] 3-1. useItemProcessTree 훅 구현 (품목 목록 + 라우팅 조회)
- [ ] 3-2. ItemProcessSelector 컴포넌트 (아코디언 + 공정 리스트)
- [ ] 3-3. 검색 기능 (품목명/공정명 검색)
- [ ] 3-4. 선택 상태 관리 + 우측 패널 연동

### Phase 4: 우측 패널 (작업기준 편집)

- [ ] 4-1. WorkStandardEditor 기본 레이아웃 (Pre/In/Post 3단 섹션)
- [ ] 4-2. useWorkItems 훅 (작업 항목 + 상세 CRUD)
- [ ] 4-3. WorkPhaseSection 컴포넌트 (섹션 헤더 + 카드 영역 + 상세 영역)
- [ ] 4-4. WorkItemCard 컴포넌트 (카드 UI + 카운트 배지)
- [ ] 4-5. WorkItemDetailList 컴포넌트 (상세 목록 + 인라인 편집)
- [ ] 4-6. WorkItemAddModal (작업 항목 추가/수정 모달 + 상세 추가)

### Phase 5: 통합 + 전체 저장

- [ ] 5-1. 전체 저장 기능 (변경사항 일괄 저장 API 연동)
- [ ] 5-2. 공정 선택 시 데이터 로딩/전환 처리
- [ ] 5-3. Empty State 처리 (데이터 없을 때 안내 UI)
- [ ] 5-4. 로딩/에러 상태 처리

### Phase 6: 마무리

- [ ] 6-1. 멀티테넌시 검증 (company_code 필터링)
- [ ] 6-2. 반응형 디자인 점검
- [ ] 6-3. README.md 작성

---

## 5. 핵심 UI 설계

### 5.1 전체 레이아웃

```
┌─────────────────────────────────────────────────────────────────────┐
│ v2-process-work-standard                                           │
├────────────────────┬────────────────────────────────────────────────┤
│ 품목 및 공정 선택    │ [품목명] - [공정명]              [전체 저장]   │
│                    │                                               │
│ [검색 입력]         │ ── 작업 전 (Pre-Work)  N개 항목 ── [+항목추가] │
│                    │ ┌────────┐ ┌─────────────────────────────┐    │
│ ▼ 볼트 M8x20       │ │카드    │ │ 상세 리스트 (선택 시 표시)    │    │
│   ★ 기본 라우팅     │ │       │ │                             │    │
│   ◉ 재단           │ └────────┘ └─────────────────────────────┘    │
│   ◉ 검사 ← 선택    │                                               │
│   ★ 버전2          │ ── 작업 중 (In-Work)  N개 항목 ── [+항목추가]  │
│                    │ ┌────────┐ ┌────────┐                        │
│ ▶ 기어 50T         │ │카드1   │ │카드2   │  (상세: 우측 표시)      │
│ ▶ 샤프트 D30       │ └────────┘ └────────┘                        │
│                    │                                               │
│                    │ ── 작업 후 (Post-Work)  N개 항목 ── [+항목추가] │
│                    │ (동일 구조)                                    │
├────────────────────┴────────────────────────────────────────────────┤
│ 30%               │                 70%                            │
└─────────────────────────────────────────────────────────────────────┘
```

### 5.2 WorkPhaseSection 내부 구조

```
── 작업 전 (Pre-Work)  4개 항목  ────────────────── [+ 작업항목 추가]
┌──────────────────────────────┬──────────────────────────────────────┐
│ 작업 항목 카드 목록            │ 선택된 항목 상세                       │
│                              │                                      │
│ ┌──────────────────────┐    │ [항목 제목]                 [+ 상세추가]│
│ │ ≡ 검사 장비 준비   ✏️ 🗑 │    │ ───────────────────────────────────  │
│ │   4개  필수          │    │ 순서│유형  │내용              │필수│관리│
│ └──────────────────────┘    │  1 │체크  │버니어 캘리퍼스... │필수│✏️🗑│
│                              │  2 │체크  │마이크로미터...   │선택│✏️🗑│
│ ┌──────────────────────┐    │  3 │체크  │검사대 청소       │선택│✏️🗑│
│ │ ≡ 측정 도구 확인   ✏️ 🗑 │    │  4 │체크  │검사 기록지 준비  │필수│✏️🗑│
│ │   2개  선택          │    │                                      │
│ └──────────────────────┘    │                                      │
└──────────────────────────────┴──────────────────────────────────────┘
```

### 5.3 작업 항목 추가 모달

```
┌─────────────────────────────────────────────┐
│ 작업 항목 추가                          ✕    │
├─────────────────────────────────────────────┤
│ 기본 정보                                    │
│                                             │
│ 항목 제목 *           필수 여부               │
│ [                 ]   [필수      ▼]          │
│                                             │
│ 비고                                        │
│ [                                         ] │
│                                             │
│ 상세 항목                       [+ 상세 추가] │
│ ┌───┬──────┬──────────────┬────┬────┐      │
│ │순서│유형  │내용           │필수│관리│      │
│ ├───┼──────┼──────────────┼────┼────┤      │
│ │ 1 │체크  │              │필수│ 🗑 │      │
│ └───┴──────┴──────────────┴────┴────┘      │
│                                             │
│              [취소]  [저장]                   │
└─────────────────────────────────────────────┘
```

---

## 6. 컴포넌트 Config 설계

### 6.1 설정 패널 UI 구조

```
┌─────────────────────────────────────────────────┐
│ 공정 작업기준 설정                                 │
├─────────────────────────────────────────────────┤
│                                                 │
│ ── 데이터 소스 설정 ──────────────────────────    │
│                                                 │
│ 품목 테이블                                      │
│ [item_info                              ▼]     │
│ 품목명 컬럼            품목코드 컬럼               │
│ [item_name         ▼]  [item_number    ▼]      │
│                                                 │
│ 라우팅 버전 테이블                                │
│ [item_routing_version                   ▼]     │
│ 품목 연결 컬럼 (FK)                               │
│ [item_code                              ▼]     │
│                                                 │
│ 라우팅 상세 테이블                                │
│ [item_routing_detail                    ▼]     │
│                                                 │
│ 공정 마스터 테이블                                │
│ [process_mng                            ▼]     │
│                                                 │
│ ── 작업 단계 설정 ──────────────────────────     │
│                                                 │
│ ┌────┬────────────────────┬─────────────┬───┐  │
│ │순서│ 단계 키(DB저장용)    │ 표시 이름    │관리│  │
│ ├────┼────────────────────┼─────────────┼───┤  │
│ │ 1  │ PRE                │ 작업 전      │ 🗑 │  │
│ │ 2  │ IN                 │ 작업 중      │ 🗑 │  │
│ │ 3  │ POST               │ 작업 후      │ 🗑 │  │
│ └────┴────────────────────┴─────────────┴───┘  │
│                         [+ 단계 추가]            │
│                                                 │
│ ── 상세 유형 옵션 ──────────────────────────     │
│                                                 │
│ ┌────────────────────┬─────────────┬───┐       │
│ │ 유형 값(DB저장용)    │ 표시 이름    │관리│       │
│ ├────────────────────┼─────────────┼───┤       │
│ │ CHECK              │ 체크        │ 🗑 │       │
│ │ INSPECTION         │ 검사        │ 🗑 │       │
│ │ MEASUREMENT        │ 측정        │ 🗑 │       │
│ └────────────────────┴─────────────┴───┘       │
│                        [+ 유형 추가]             │
│                                                 │
│ ── UI 설정 ──────────────────────────           │
│                                                 │
│ 좌우 분할 비율                                   │
│ [30        ] %                                  │
│                                                 │
│ 좌측 패널 제목                                   │
│ [품목 및 공정 선택                        ]      │
│                                                 │
│ 읽기 전용 모드                                   │
│ [ ] 활성화                                      │
│                                                 │
└─────────────────────────────────────────────────┘
```

### 6.2 Config 타입 정의

```typescript
// 작업 단계 정의 (사용자가 추가/삭제/이름변경 가능)
interface WorkPhaseDefinition {
  key: string;       // DB 저장용 키 (예: "PRE", "IN", "POST", "QC")
  label: string;     // 화면 표시명 (예: "작업 전 (Pre-Work)")
  sortOrder: number; // 표시 순서
}

// 상세 유형 정의 (사용자가 추가/삭제 가능)
interface DetailTypeDefinition {
  value: string;     // DB 저장용 값 (예: "CHECK")
  label: string;     // 화면 표시명 (예: "체크")
}

// 데이터 소스 설정 (사용자가 테이블 지정 가능)
interface DataSourceConfig {
  // 품목 테이블
  itemTable: string;             // 기본: "item_info"
  itemNameColumn: string;        // 기본: "item_name"
  itemCodeColumn: string;        // 기본: "item_number"

  // 라우팅 버전 테이블
  routingVersionTable: string;   // 기본: "item_routing_version"
  routingItemFkColumn: string;   // 기본: "item_code" (품목과 연결하는 FK)
  routingVersionNameColumn: string; // 기본: "version_name"

  // 라우팅 상세 테이블
  routingDetailTable: string;    // 기본: "item_routing_detail"

  // 공정 마스터 테이블
  processTable: string;          // 기본: "process_mng"
  processNameColumn: string;     // 기본: "process_name"
  processCodeColumn: string;     // 기본: "process_code"
}

// 전체 Config
interface ProcessWorkStandardConfig {
  // 데이터 소스 설정
  dataSource: DataSourceConfig;

  // 작업 단계 정의 (기본 3개, 사용자가 추가/삭제/수정 가능)
  phases: WorkPhaseDefinition[];
  // 기본값: [
  //   { key: "PRE",  label: "작업 전 (Pre-Work)",  sortOrder: 1 },
  //   { key: "IN",   label: "작업 중 (In-Work)",   sortOrder: 2 },
  //   { key: "POST", label: "작업 후 (Post-Work)",  sortOrder: 3 },
  // ]

  // 상세 유형 옵션 (사용자가 추가/삭제 가능)
  detailTypes: DetailTypeDefinition[];
  // 기본값: [
  //   { value: "CHECK",       label: "체크" },
  //   { value: "INSPECTION",  label: "검사" },
  //   { value: "MEASUREMENT", label: "측정" },
  // ]

  // UI 설정
  splitRatio?: number;           // 좌우 분할 비율, 기본: 30
  leftPanelTitle?: string;       // 좌측 패널 제목, 기본: "품목 및 공정 선택"
  readonly?: boolean;            // 읽기 전용 모드, 기본: false
}
```

### 6.3 커스터마이징 시나리오 예시

**시나리오 A: 제조업 (기본)**
```
단계: 작업 전 → 작업 중 → 작업 후
유형: 체크, 검사, 측정
```

**시나리오 B: 품질검사 강화 회사**
```
단계: 준비 → 검사 → 판정 → 기록 → 보관
유형: 육안검사, 치수검사, 강도검사, 내구검사, 기능검사
```

**시나리오 C: 단순 2단계 회사**
```
단계: 사전점검 → 사후점검
유형: 확인, 기록
```

**시나리오 D: 다른 테이블 사용 회사**
```
품목 테이블: product_master (item_info 대신)
공정 테이블: operation_mng (process_mng 대신)
```

### 6.4 DB 설계 반영 사항

`work_phase` 컬럼은 고정 ENUM이 아니라 **사용자 정의 키(VARCHAR)** 로 저장합니다.
- Config에서 `phases[].key` 로 정의한 값이 DB에 저장됨
- 예: "PRE", "IN", "POST" 또는 "PREPARE", "INSPECT", "JUDGE", "RECORD", "STORE"
- 회사별 Config에 따라 다른 값이 저장되므로, 조회 시 Config의 phases 정의를 기준으로 섹션을 렌더링

---

## 7. 등록 체크리스트

| 항목 | 파일 | 작업 |
|------|------|------|
| 컴포넌트 정의 | `v2-process-work-standard/index.ts` | createComponentDefinition |
| 렌더러 등록 | `v2-process-work-standard/...Renderer.tsx` | registerSelf() |
| 컴포넌트 로드 | `components/index.ts` | import 추가 |
| 설정 패널 매핑 | `getComponentConfigPanel.tsx` | CONFIG_PANEL_MAP 추가 |
| 라우트 등록 | `backend-node/src/app.ts` | router.use() 추가 |

---

## 8. 의존성

- 외부 라이브러리 추가: 없음 (기존 shadcn/ui + Lucide 아이콘만 사용)
- 기존 API 재사용: dataRoutes의 범용 CRUD는 사용하지 않고 전용 API 개발
  - 이유: 5단계 JOIN + phase별 그룹핑 등 범용 API로는 처리 불가
