From c9899eed81c77f03f280c768680e017490cb048d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Thu, 12 Feb 2026 19:57:44 +0900 Subject: [PATCH] =?UTF-8?q?docs:=EB=AC=B8=EC=84=9C=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EB=A7=88=EC=8A=A4=ED=84=B0/=EC=9E=91=EC=97=85=EC=9D=BC?= =?UTF-8?q?=EC=A7=80=20=EA=B3=84=ED=9A=8D=20=EB=AC=B8=EC=84=9C=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20(Phase=205.3=20mng=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=EB=B3=B4=EA=B8=B0=20=EC=99=84=EB=A3=8C=20=EB=B0=98?= =?UTF-8?q?=EC=98=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 결정사항 #13~#16 추가 (bf_ 분기, 개소별 LOT, 취소 상쇄, 자재 투입 방식 변경 요청) - mng 작업일지 상세보기 작업 항목 α.1~α.7 추가 - mng 데이터 흐름도, 핵심 파일 경로, 변경 이력 갱신 Co-Authored-By: Claude Opus 4.6 --- plans/document-system-master.md | 444 ++++++++++++++++++++++++++++++ plans/document-system-work-log.md | 326 ++++++++++++++++++++++ 2 files changed, 770 insertions(+) create mode 100644 plans/document-system-master.md create mode 100644 plans/document-system-work-log.md diff --git a/plans/document-system-master.md b/plans/document-system-master.md new file mode 100644 index 0000000..1a2417f --- /dev/null +++ b/plans/document-system-master.md @@ -0,0 +1,444 @@ +# 문서관리 시스템 - 마스터 진행 관리 + +> **작성일**: 2026-02-10 +> **목적**: mng에서 문서양식(템플릿)을 관리하고, SAM(react)에서 JSON으로 소비하는 문서관리 시스템. 수입검사/중간검사/제품검사/작업일지 폼을 지원한다. +> **상태**: Phase 1~3 ✅, Phase 4 🔄, Phase 5.0 ✅, Phase 5.1 🔄, Phase 5.3 🔄 (5.3.1~3 ✅, 5.3.4 ⏳, mng 상세보기 완료) + +--- + +## 🚀 새 세션 시작 가이드 + +> **이 문서만 보고 작업을 시작할 수 있도록 작성되었습니다.** + +### 프로젝트 정보 + +| 항목 | 내용 | +|------|------| +| **SAM 루트** | `/Users/kent/Works/@KD_SAM/SAM/` (Git 저장소 아님) | +| **mng** | `/Users/kent/Works/@KD_SAM/SAM/mng/` — Laravel 12 + Blade + DaisyUI + HTMX + Alpine.js | +| **api** | `/Users/kent/Works/@KD_SAM/SAM/api/` — Laravel 12 REST API | +| **react** | `/Users/kent/Works/@KD_SAM/SAM/react/` — Next.js 15 프론트엔드 | +| **5130** | `/Users/kent/Works/@KD_SAM/SAM/5130/` — 레거시 (참조 전용) | +| **docs** | `/Users/kent/Works/@KD_SAM/SAM/docs/` — 기술 문서 | +| **mng URL** | `https://mng.sam.kr` (Docker 로컬, `admin.sam.kr` 동일) | +| **react URL** | `https://dev.sam.kr` (Docker 로컬) | +| **api URL** | `https://api.sam.kr` (Docker 로컬) | + +> **Git**: api/, mng/, react/ 각각 독립 Git 저장소 + +### 세션 시작 체크리스트 + +``` +1. 이 문서를 읽는다 (📍 현재 진행 상태 확인) +2. 다음 작업할 Phase의 상세 문서를 읽는다 (섹션 1 링크) +3. 해당 프로젝트의 CLAUDE.md를 읽는다 (mng/CLAUDE.md 또는 api/CLAUDE.md) +4. 작업 시작 전 사용자에게 확인 +``` + +--- + +## 📍 현재 진행 상태 + +| 항목 | 내용 | +|------|------| +| **마지막 완료** | Phase 5.3.3 API ✅ + mng 작업일지 상세보기 완성 (템플릿 컬럼 렌더링, 재단 알고리즘, 개소별 LOT, 취소 상쇄) (2026-02-12) | +| **미완료** | Phase 4.4 - 프론트엔드 담당자 협의 후 react 전환 결정 | +| **현재 작업** | Phase 5.1.6 (결재 워크플로우 보류), Phase 5.3.4 (React 전환 대기) | +| **진행률** | Phase 1~3 ✅, Phase 4 (3/4), Phase 5.0 ✅, Phase 5.1 (5/6), Phase 5.3 (3/4+α, mng ✅) | +| **마지막 업데이트** | 2026-02-12 | + +--- + +## 1. 전체 진행 현황 + +| Phase | 이름 | 진행률 | 상태 | 상세 문서 | +|-------|------|--------|:----:|----------| +| 1 | mng 양식 관리 (수입검사) | 5/5 | ✅ | [Phase 1~4 아카이브](#9-phase-14-아카이브-요약) | +| 2 | mng 문서 생성/관리 | 4/5 | ✅ | [Phase 1~4 아카이브](#9-phase-14-아카이브-요약) | +| 3 | 중간검사 양식 추가 (시더/이관설계) | 4/4 | ✅ | [Phase 1~4 아카이브](#9-phase-14-아카이브-요약) | +| 4 | API 연동 및 mng JSON | 3/4 | 🔄 | [Phase 1~4 아카이브](#9-phase-14-아카이브-요약) | +| **5.0** | **공통: 검사기준서↔컬럼 연동 (방안1)** | 3/3 | ✅ | [섹션 7.5](#75-방안1-columns-자동-파생-설계) | +| **5.1** | **중간검사(PQC) 폼 구현** | 5/6 | 🔄 | [**document-system-mid-inspection.md**](./document-system-mid-inspection.md) | +| **5.2** | **제품검사(FQC) 폼 구현** | 0/5 | ⏳ | [**document-system-product-inspection.md**](./document-system-product-inspection.md) | +| **5.3** | **작업일지 폼 구현** | 3/4+α (mng ✅) | 🔄 | [**document-system-work-log.md**](./document-system-work-log.md) | +| 5.4 | 기타문서 확장 | - | ⏭️ | 추후 정의 | + +### Phase 4.4 (미완료) + +- **내용**: 프론트엔드 담당자와 협의하여 react 기존 하드코딩 컴포넌트를 양식 JSON 기반으로 전환할지 결정 +- **영향**: Phase 5의 React 작업 방향에 영향. 협의 전까지 mng/api 작업 우선 진행 가능 + +--- + +## 2. 핵심 결정사항 + +| # | 항목 | 결정 | 날짜 | +|---|------|------|------| +| 1 | 조인트바 처리 | 슬랫 공정 하위 유지 (별도 공정 등록 안함) | 2026-02-10 | +| 2 | 제품검사 단위 | 개소별 1문서 (수주 50개소 = Document 50건) | 2026-02-10 | +| 3 | 작업일지 방식 | 하이브리드 (양식 정의는 mng 템플릿, 전용 UI/로직은 별도) | 2026-02-10 | +| 4 | 기타문서 범위 | 나중에 정의 (검사 관련만 먼저 진행) | 2026-02-10 | +| 5 | 제품검사 = 품질검사 | 동일 개념, "제품검사(FQC)"로 통일 | 2026-02-10 | +| 6 | PDF 생성 | 추후 고려 (react에 html2pdf.js 기존 구현) | 2026-01-31 | +| 7 | 판정 로직 | 프론트에서 입력, 결과만 저장 (별도 판정 엔진 없음) | 2026-01-31 | +| 8 | react 기존 컴포넌트 | mng 완성 후 프론트 담당자와 협의하여 전환 여부 결정 | 2026-01-31 | +| 11 | **자재 LOT 처리** | **개소별 품목 = 작업내역 테이블, 공용 자재(내화실 등) = 자재 투입(MaterialInput) 시스템으로 조회. 예외 필드 없이 기존 시스템 역할 분리** | 2026-02-11 | +| 12 | **중간검사 데이터 정규화** | **document_data를 section_id/column_id/field_key 기반 정규화 형식으로 저장. 레거시(section_X_item_Y) 자동 변환 지원** | 2026-02-11 | +| 13 | **mng 작업일지 bf_ backfill 분기** | **작업일지(섹션 없음)=label 기반 매핑, 검사 문서(섹션 있음)=field_key 기반 매핑. resolveAndBackfillBasicFields에서 자동 판별** | 2026-02-12 | +| 14 | **개소별 투입자재 LOT** | **work_order_material_inputs 테이블 기반 개소별(work_order_item_id) LOT 매핑. 입고 LOT NO 컬럼에 표시** | 2026-02-12 | +| 15 | **취소 트랜잭션 상쇄** | **stock_transactions에서 work_order_input(OUT) + work_order_input_cancel(IN) 합산으로 순수 투입량 계산** | 2026-02-12 | +| 16 | **자재 투입 방식 변경 (요청)** | **수량 입력 → 필요수량 기반 LOT 선택 방식으로 변경 요청됨. 미착수** | 2026-02-12 | +| 9 | **검사기준서↔테이블컬럼 연동** | **방안1: items.measurement_type → columns 자동 파생. 테이블 컬럼 탭은 "자동 생성 결과 확인/미세조정"용** | 2026-02-10 | +| 10 | section_fields 필수화 | 모든 시더에 section_fields 생성 포함. 없으면 검사 기준서 탭 렌더링 불가 | 2026-02-10 | + +--- + +## 3. 검사 유형별 데이터 연동 구조 + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ 검사 유형 연동 대상 단위 linkable │ +├─────────────────────────────────────────────────────────────────┤ +│ 수입검사(IQC) Material + Lot 아이템별 Material │ +│ 중간검사(PQC) WorkOrder + Process 개소별 WorkOrder │ +│ 제품검사(FQC) Order + OrderItem 개소별 OrderItem │ +│ 작업일지 WorkOrder + Process 작업지시별 WorkOrder │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### 3.1 개소(Location) 관리 체계 + +``` +Order (수주) +├─ OrderItem[0]: floor_code="1F", symbol_code="A", quantity=2 +├─ OrderItem[1]: floor_code="2F", symbol_code="B", quantity=4 +└─ OrderItem[N]: ... + ↓ +WorkOrder (작업지시) +├─ WorkOrderItem[0] → OrderItem[0] (source_order_item_id) +├─ WorkOrderItem[1] → OrderItem[1] +└─ ... + ↓ +Document (검사문서) +├─ 중간검사: WorkOrder 단위, 내부에 개소별 행(row) +└─ 제품검사: OrderItem(개소) 단위, 개소당 1문서 +``` + +--- + +## 4. DB 테이블 관계 + +### 4.1 문서 시스템 테이블 + +``` +document_templates (양식 마스터) +├── document_template_approval_lines (결재라인: 작성/검토/승인) +├── document_template_basic_fields (기본필드: 품명, LOT NO 등) +├── document_template_sections (섹션: 검사기준서) +│ └── document_template_section_items (검사항목: 겉모양, 치수 등) +├── document_template_columns (테이블 컬럼: text/check/complex/select) +├── document_template_section_fields (동적 필드 정의) +├── document_template_links (외부 키 매핑) +└── document_template_field_presets (필드 프리셋) + +documents (문서 인스턴스) +├── document_approvals (결재: PENDING/APPROVED/REJECTED) +├── document_data (EAV: section_id, column_id, row_index, field_key, field_value) +├── document_attachments (첨부파일) +└── document_links (외부 엔티티 연결) + +process_steps +└── document_template_id (FK) → 공정별 검사 양식 매핑 +└── needs_inspection (bool) → 검사 필요 단계 표시 +``` + +### 4.2 모델 관계 (코드 참조) + +```php +// DocumentTemplate.php +class DocumentTemplate extends Model { + use BelongsToTenant, SoftDeletes; + public function approvalLines() // hasMany, sort_order + public function basicFields() // hasMany, sort_order + public function sections() // hasMany → section.items() + public function columns() // hasMany, sort_order +} + +// Document.php +class Document extends Model { + use BelongsToTenant, SoftDeletes; + // status: DRAFT → PENDING → APPROVED/REJECTED/CANCELLED + public function template() // belongsTo DocumentTemplate + public function approvals() // hasMany DocumentApproval + public function data() // hasMany DocumentData (EAV) + public function linkable() // morphTo (Order, WorkOrder, OrderItem, Material 등) +} +``` + +### 4.3 현재 양식 시더 (mng) + +| ID | 양식명 | 카테고리 | 시더 | +|----|--------|---------|------| +| 7 | EGI 1.55T 수입검사 | 품질/수입검사 | IncomingInspectionTemplateSeeder | +| 8 | SUS Plate 수입검사 | 품질/수입검사 | IncomingInspectionTemplateSeeder | +| 10 | 조인트바 중간검사 | 품질/중간검사 | MidInspectionTemplateSeeder | +| 11 | 슬랫 중간검사 | 품질/중간검사 | MidInspectionTemplateSeeder | +| 12 | 스크린 중간검사 | 품질/중간검사 | MidInspectionTemplateSeeder | +| 13 | 절곡품 중간검사 | 품질/중간검사 | MidInspectionTemplateSeeder | +| 62 | 스크린 작업일지 | 생산/작업일지 | WorkLogTemplateSeeder | +| 63 | 슬랫 작업일지 | 생산/작업일지 | WorkLogTemplateSeeder | +| 64 | 절곡 작업일지 | 생산/작업일지 | WorkLogTemplateSeeder | + +--- + +## 5. 핵심 파일 경로 + +### 5.1 mng (양식 관리) + +| 파일 | 설명 | +|------|------| +| `mng/resources/views/document-templates/edit.blade.php` | 양식 편집 UI (44.5KB, 4개 탭) | +| `mng/resources/views/documents/show.blade.php` | 문서 조회 (검사문서+작업일지 동적 렌더링, 재단 알고리즘 포함) | +| `mng/resources/views/documents/print.blade.php` | 문서 인쇄 (성적서 양식) | +| `mng/app/Http/Controllers/DocumentTemplateController.php` | 양식 CRUD | +| `mng/app/Http/Controllers/DocumentController.php` | 문서 CRUD + 결재 + bf_ backfill (작업일지/검사 분기) | +| `mng/app/Models/DocumentTemplate.php` | 양식 모델 | +| `mng/app/Models/Documents/Document.php` | 문서 모델 | +| `mng/database/seeders/IncomingInspectionTemplateSeeder.php` | 수입검사 시더 | +| `mng/database/seeders/MidInspectionTemplateSeeder.php` | 중간검사 시더 | +| `mng/database/seeders/WorkLogTemplateSeeder.php` | 작업일지 시더 | +| `mng/routes/web.php` (340-353줄) | 양식/문서 라우트 | + +### 5.2 api (REST API) + +| 파일 | 설명 | +|------|------| +| `api/app/Http/Controllers/V1/DocumentTemplateController.php` | 양식 조회 API | +| `api/app/Http/Controllers/V1/DocumentController.php` | 문서 CRUD + 결재 API | +| `api/app/Models/Documents/Document.php` | 문서 모델 | +| `api/app/Models/Order.php` | 수주 모델 (OrderItem 관계) | +| `api/app/Models/WorkOrder.php` | 작업지시 모델 | +| `api/app/Models/Process.php` | 공정 모델 (ProcessStep 관계) | +| `api/app/Services/WorkOrderService.php` | 작업지시 서비스 (검사, 작업일지, materialInputLots) | +| `api/app/Services/DocumentService.php` | 문서 서비스 (create, update, formatTemplateForReact) | +| `api/app/Console/Commands/NormalizeDocumentData.php` | 문서 데이터 정규화 커맨드 | +| `api/routes/api/v1/production.php` | 작업지시/작업일지 라우트 | + +### 5.3 react (프론트엔드) + +| 파일 | 설명 | +|------|------| +| `react/src/components/document-system/viewer/DocumentViewer.tsx` | 문서 뷰어 (zoom, drag, print) | +| `react/src/components/document-system/components/DocumentHeader.tsx` | 문서 헤더 (로고, 결재라인) | +| `react/src/components/production/WorkOrders/documents/InspectionReportModal.tsx` | 중간검사 모달 (~900행) | +| `react/src/components/production/WorkOrders/documents/inspection-shared.tsx` | 검사 공유 유틸 | +| `react/src/components/production/WorkOrders/documents/Screen|Slat|Bending*.tsx` | 공정별 검사 Content | +| `react/src/components/production/WorkerScreen/InspectionInputModal.tsx` | 검사 입력 모달 (~950행) | +| `react/src/components/production/WorkerScreen/WorkLogModal.tsx` | 작업일지 모달 (공정관리 양식 연동) | +| `react/src/components/production/WorkerScreen/WorkLogContent.tsx` | 작업일지 범용 (~280행) | +| `react/src/app/[locale]/(protected)/quality/qms/components/documents/ProductInspectionDocument.tsx` | 제품검사 (하드코딩) | +| `react/src/app/[locale]/(protected)/quality/inspections/` | 품질검사 페이지 라우트 | + +### 5.4 확인 URL + +| URL | 내용 | +|-----|------| +| `https://mng.sam.kr/document-templates` | 양식 관리 | +| `https://mng.sam.kr/document-templates/51/edit` | 양식 편집 (검사기준서 탭) | +| `https://mng.sam.kr/documents` | 문서 관리 | +| `https://dev.sam.kr/production/worker-screen` | 작업자 화면 (중간검사/작업일지 모달) | +| `https://dev.sam.kr/quality/inspections/1?mode=view` | 제품검사 요청서/모달 | + +--- + +## 6. 작업 우선순위 + +``` +Phase 5.0 공통 기반 ✅ ──→ Phase 5.1 중간검사 (5/6) ──→ Phase 5.2 제품검사 +(완료: columns 자동파생, (결재 워크플로우만 남음) (중간검사 패턴 재사용) + section_fields 필수화) + +Phase 5.3 작업일지 ──→ 5.0과 독립 (검사기준서/columns 자동파생 해당 없음) +(하이브리드 방식, 시더 ✅, 양식연동 ✅, 편집검증 ✅, API ✅, mng상세 ✅ → React 전환 남음) + 섹션 없음) +``` + +### Phase 5.0 작업 항목 (✅ 완료) + +| # | 작업 | 상태 | 완료 기준 | 구현 위치 | +|---|------|:----:|----------|----------| +| 5.0.1 | `generateColumnsFromItems()` JS 함수 구현 | ✅ | items의 measurement_type 분석 → 정적+동적 columns 자동 생성 | edit.blade.php line 1040-1139 | +| 5.0.2 | 시더에 section_fields 생성 추가 | ✅ | MidInspectionTemplateSeeder(7필드), IncomingInspectionTemplateSeeder(6필드) 모두 section_fields 포함 | 각 시더 createSectionFields() | +| 5.0.3 | 테이블 컬럼 탭 "자동 생성 + 미세조정" 모드 전환 | ✅ | "기준서에서 자동 생성" 버튼 + `_auto` 플래그 + 수동 편집 병행 | edit.blade.php line 259-1299 | + +### Phase 5.1 작업 항목 (🔄 5/6) + +| # | 작업 | 상태 | 완료 기준 | 비고 | +|---|------|:----:|----------|------| +| 5.1.1 | section_fields 생성 | ✅ | Phase 5.0.2에서 해결됨 | MidInspection 7필드, IncomingInspection 6필드 | +| 5.1.2 | mng 양식 편집/미리보기 검증 | ✅ | 4종 양식 edit/미리보기/저장 정상 동작 | edit.blade.php 4탭 CRUD | +| 5.1.3 | API 중간검사 문서 생성 연동 | ✅ | `createInspectionDocument()` 완전 구현. 정규화+레거시 형식 지원 | WorkOrderService line 1810+ | +| 5.1.4 | React 중간검사 모달 → 양식 기반 전환 | ✅ | TemplateInspectionContent 동적 렌더링 구현 | 템플릿/레거시 모드 병행 | +| 5.1.5 | 개소별 검사 데이터 저장/조회 | ✅ | getInspectionData, saveInspectionDocument 구현 | 정규화 레코드 형식 | +| 5.1.6 | 결재 워크플로우 연동 | ⏳ | 작성→검토→승인 3단계 결재 | API ready, 프론트 연동 필요 | + +--- + +## 7. 알려진 이슈 + +### 7.1 ~~스키마 불일치~~ → 해결됨 (2026-02-10 분석) +- `document_template_section_items` 테이블에 `tolerance`, `standard_criteria`, `measurement_type`, `frequency_n`, `frequency_c`, `field_values` 컬럼 **모두 존재** (마이그레이션 순차 추가됨) +- Controller line 174-188은 `field_values` JSON 우선, 직접 컬럼 fallback으로 정상 동작 +- **실제 문제**: 중간검사 템플릿에 `section_fields` 레코드 누락 → 검사 기준서 탭이 빈 테이블로 렌더링됨 +- **해결**: 결정사항 #10에 따라 모든 시더에 section_fields 생성 추가 + +### 7.2 검사기준서 ↔ 테이블컬럼 분리 문제 → 방안1 채택 (2026-02-10) +- **현상**: 두 탭이 완전 독립. 검사 항목 추가해도 컬럼 자동 반영 안됨 +- **해결**: 결정사항 #9에 따라 `items.measurement_type → columns 자동 파생` 구현 +- 상세: [아래 섹션 7.5 참조](#75-방안1-columns-자동-파생-설계) + +### 7.3 절곡품 동적 구성 +- 제품코드(KSS01/KSS02/KWE01) + 마감유형(S1/S2/S3)에 따라 검사항목 변경 +- 기본 양식에 구성품 목록 정의 → 문서 생성 시 동적 행 구성 (권장) + +### 7.4 절곡 재공품 양식 미존재 +- React `BendingWipInspectionContent`에 대응하는 mng 양식 없음 +- 신규 시더 추가 필요 + +### 7.5 방안1: columns 자동 파생 설계 + +#### 아키텍처 개요 + +``` +현재: section_items ─── ✕ ─── columns (독립, 불일치 가능) + +방안1: section_items.measurement_type ──→ columns 자동 파생 (Single Source of Truth) +``` + +#### 기존 매핑 로직 (edit.blade.php:684, 이미 존재) + +```javascript +// 검사방식 → 측정유형 자동 매핑 +METHOD_TO_MEASUREMENT = { + 'visual': 'checkbox', // → check 컬럼 + 'check': 'numeric', // → complex 컬럼 (n1,n2,n3...) + 'mill_sheet': 'single_value', // → text 컬럼 + 'certified_agency': 'single_value', + 'substitute_cert': 'substitute', + 'other': 'text' +}; +``` + +#### columns 자동 파생 규칙 + +``` +Step 1: 정적 컬럼 (항상 포함) +├── NO (text, 40px) → 행 번호 +├── 검사항목 (text, 120px) → item.item 속성 매핑 +└── 검사기준 (text, 150px) → item.standard 속성 매핑 + +Step 2: 동적 컬럼 (items의 measurement_type에서 파생) +├── checkbox 존재 → check 컬럼 추가 (OK/NG 체크, 50px) +├── numeric 존재 → complex 컬럼 추가 (sub_labels: n1~n{max(frequency_n)}) +├── single_value 존재 → text 컬럼 추가 (단일값 입력) +└── 공통 → select 컬럼 추가 (판정: 적합/부적합) + +Step 3: 부가 컬럼 (옵션) +├── 검사방식 (text) → item.method가 다양하면 포함 +└── 비고 (text) → 항상 포함 +``` + +#### 구현 위치 + +| 항목 | 위치 | 변경 내용 | +|------|------|----------| +| 자동 파생 로직 | `edit.blade.php` JS `generateColumnsFromItems()` | items 분석 → columns 생성 | +| 트리거 | 검사 기준서 탭에서 항목 추가/삭제/수정 시 | 테이블 컬럼 탭 자동 갱신 | +| 수동 override | 테이블 컬럼 탭에서 미세조정 가능 | 자동 생성 + 수동 편집 공존 | +| 시더 변경 | 모든 시더에 section_fields 생성 추가 | columns 정의는 자동 파생으로 생략 가능 | +| 저장 로직 | `saveTemplate()` JS | sections + columns 함께 저장 | + +#### 시더 변경 영향 + +```php +// Before: items + columns 각각 정의 (불일치 위험) +'items' => [...], +'columns' => [...], // 수동 정의 필요 + +// After: items만 정의, columns는 자동 파생 (또는 명시적 override) +'items' => [...], +'section_fields' => [...], // 필수 추가 +// columns 생략 가능 → 저장 시 자동 생성 +``` + +--- + +## 8. 변경 이력 + +| 날짜 | 내용 | +|------|------| +| 2026-02-10 | 마스터 문서 신규 생성. Phase 5 하위 문서 3개 분리 | +| 2026-02-10 | 핵심 결정사항 5건 확정 | +| 2026-02-10 | 새 세션 가이드, 핵심 파일 경로, 알려진 이슈 보강 | +| 2026-02-10 | 방안1 채택: items.measurement_type → columns 자동 파생. Phase 5.0 신설, 결정사항 #9/#10 추가 | +| 2026-02-11 | Phase 5.3.1: WorkLogTemplateSeeder 3종 생성 (스크린ID:62, 슬랫ID:63, 절곡ID:64). 범용(ID:61) 삭제. 공정별 React 코드 기준 구조 반영 | +| 2026-02-11 | React: WorkLogModal 공정관리 양식 연동 (workLogTemplateId/Name prop, resolveProcessTypeFromTemplate) | +| 2026-02-11 | React: ScreenWorkLogContent 자재 LOT 동적화 (하드코딩 "내화실" → materialLots item_name별 그룹핑) | +| 2026-02-11 | API: materialInputLots 엔드포인트 추가 (stock_transactions 기반 투입 LOT 조회) | +| 2026-02-11 | API: 중간검사 document_data 정규화 형식 지원 (section_id/column_id/field_key). 레거시 자동 변환 | +| 2026-02-11 | MNG: 문서 양식 편집 개선 (이미지 업로드 API 연동, 미리보기 모달) | +| 2026-02-11 | 결정사항 #11(자재 LOT 역할 분리), #12(중간검사 정규화) 추가 | +| 2026-02-11 | Phase 5.0/5.1/5.3 상태 분석 및 문서 동기화: 5.0 ✅완료(3/3), 5.1 🔄(5/6), 5.3 🔄(1/4+α) | +| 2026-02-12 | Phase 5.3.2 완료: mng 작업일지 양식 편집/미리보기 코드 레벨 검증 (정상 동작 확인) | +| 2026-02-12 | Phase 5.3.3 완료: API 작업일지 생성/조회 구현 (getWorkLogTemplate, getWorkLog, createWorkLog). 라우트 3개, i18n 추가 | +| 2026-02-12 | WorkOrder 모델에 documents() MorphMany 관계 추가 | +| 2026-02-12 | MNG: DocumentController resolveAndBackfillBasicFields 확장 — 작업일지(label 기반) vs 검사 문서(field_key 기반) 분기. buildWorkLogResolveMap, buildInspectionResolveMap 추가 | +| 2026-02-12 | MNG: show.blade.php 작업일지 전용 섹션 추가 — 템플릿 컬럼 기반 동적 테이블, PHP 재단 알고리즘(calculateCutSize), 작업통계, 투입 자재 LOT, 비고 | +| 2026-02-12 | MNG: 개소별 투입자재 LOT 매핑 (work_order_material_inputs → stock_lots JOIN, work_order_item_id별 lot_no 조회) | +| 2026-02-12 | MNG: 투입자재 취소 트랜잭션 상쇄 처리 (work_order_input + work_order_input_cancel 합산, 순수 투입량 계산) | +| 2026-02-12 | MNG: show() 메서드에 workOrder, salesOrder, materialInputLots, itemLotMap 변수 추가 | +| 2026-02-12 | 결정사항 #13~#16 추가 (bf_ 분기, 개소별 LOT, 취소 상쇄, 자재 투입 방식 변경 요청) | + +> 상세 변경 이력: [`document-management-system-changelog.md`](./document-management-system-changelog.md) + +--- + +## 9. Phase 1~4 아카이브 요약 + +> **상세 문서**: [`document-management-system-plan.md`](./document-management-system-plan.md) (Phase 1~4 전체 설계/이력) +> **5130 이관 설계**: 같은 문서 섹션 5.2~5.3 (JSON→EAV 매핑, 데이터 변환 규칙) + +### 완료된 Phase 요약 + +| Phase | 내용 | 주요 산출물 | +|-------|------|-----------| +| **1** (수입검사 양식) | edit.blade.php 5개 탭 CRUD, 시더 2종(EGI/SUS), 미리보기, 복제 | IncomingInspectionTemplateSeeder | +| **2** (문서 생성/관리) | 문서 생성(IQC prefix), EAV 입력/저장, 결재(submit/approve/reject), 목록/필터 | DocumentController, edit/show.blade | +| **3** (중간검사 양식) | 4종 구조 설계, JSON→EAV 이관 설계, 시더 4종, 이미지 27개 이관 | MidInspectionTemplateSeeder, 이미지 | +| **4** (API 연동) | Template 조회 API 6모델+Swagger, Document 결재 4 API, mng show.blade JSON 렌더링 | api 컨트롤러, Swagger | + +### Phase 1~4 문서를 다시 봐야 하는 경우 + +| 상황 | 참조 섹션 | +|------|----------| +| 5130 중간검사 데이터 이관 작업 시 | 섹션 5.3 (JSON→EAV 매핑, 변환 규칙, 6단계 프로세스) | +| 수입검사 자재별 양식 추가 시 | 섹션 5.1 (23개 자재 목록), 섹션 11.3 (시더 생성 절차) | +| 기존 양식 편집 UI 구조 파악 시 | 섹션 11.1 (edit.blade.php 분석 절차) | +| API JSON 응답 구조 확인 시 | 섹션 4.2~4.3 (양식/문서 JSON 스키마) | + +--- + +## 10. 참고 문서 + +| 문서 | 경로 | 용도 | +|------|------|------| +| Phase 1~4 상세 | `docs/plans/document-management-system-plan.md` | 이력/설계/5130 이관 | +| 변경 이력 | `docs/plans/document-management-system-changelog.md` | 전체 변경 로그 | +| DB 스키마 | `docs/specs/database-schema.md` | 테이블 구조 | +| API 규칙 | `docs/standards/api-rules.md` | Service-First, FormRequest | +| 품질 체크리스트 | `docs/standards/quality-checklist.md` | 코드 품질 기준 | +| mng 규칙 | `mng/CLAUDE.md` | mng 프로젝트 규칙 | + +--- + +*이 문서는 /plan 스킬로 생성되었습니다.* \ No newline at end of file diff --git a/plans/document-system-work-log.md b/plans/document-system-work-log.md new file mode 100644 index 0000000..14c22ae --- /dev/null +++ b/plans/document-system-work-log.md @@ -0,0 +1,326 @@ +# Phase 5.3: 작업일지 폼 구현 계획 + +> **작성일**: 2026-02-10 +> **마스터 문서**: [`document-system-master.md`](./document-system-master.md) +> **상태**: 🔄 진행 중 (3/4+α, mng 상세보기 ✅) +> **선행 조건**: Phase 5.0과 독립 (검사기준서 없음). 병렬 진행 가능 + +--- + +## 1. 개요 + +### 1.1 목적 +mng에서 작업일지 양식 템플릿을 정의하고, React 작업자 화면(`/production/worker-screen`)의 작업일지 모달에서 해당 양식을 기반으로 작업 내역을 기록/조회할 수 있도록 한다. + +### 1.2 하이브리드 방식 +- **양식 정의**: mng 템플릿 시스템 (DocumentTemplate) 활용 +- **전용 UI/로직**: React에서 작업일지 전용 컴포넌트로 구현 (검사 성적서와 다른 구조) +- **이유**: 작업일지는 검사 항목표가 아닌, 품목 목록 + 작업 통계 + 특이사항 구조 + +### 1.3 현재 상태 + +| 항목 | 상태 | 비고 | +|------|:----:|------| +| React WorkLogContent.tsx | ✅ | 정적 문서, DocumentHeader + 기본정보 + 품목테이블 + 작업내역 + 특이사항 | +| mng 양식 템플릿 | ✅ | WorkLogTemplateSeeder 3종 (스크린:62, 슬랫:63, 절곡:64) | +| WorkLogModal 양식 연동 | ✅ | 공정관리 workLogTemplateId 기반 콘텐츠 분기, processType 폴백 | +| ScreenWorkLogContent 자재 LOT | ✅ | materialLots item_name별 동적 그룹핑 (하드코딩 "내화실" 제거) | +| API 자재 투입 LOT 조회 | ✅ | materialInputLots 엔드포인트 (stock_transactions 기반) | +| API 작업일지 전용 | ✅ | getWorkLogTemplate, getWorkLog, createWorkLog (3개 라우트) | +| 작업 통계 계산 | ✅ | calculateWorkStats() 함수 존재 (완료/진행중/대기 수량) | +| **mng 문서 상세보기** | ✅ | **show.blade.php 작업일지 전용 섹션 (템플릿 컬럼 기반 동적 렌더링)** | +| **mng bf_ backfill 분기** | ✅ | **resolveAndBackfillBasicFields: 작업일지=label 기반, 검사=field_key 기반** | +| **mng 재단 알고리즘 (PHP)** | ✅ | **React calculateCutSize 동일 구현. 실리카/와이어/화이바 원단별 설정** | +| **mng 개소별 투입자재 LOT** | ✅ | **work_order_material_inputs → stock_lots JOIN, 개소별 lot_no 매핑** | +| **mng 취소 트랜잭션 상쇄** | ✅ | **work_order_input + work_order_input_cancel 합산 → 순수 투입량** | + +### 1.4 성공 기준 +1. mng에서 작업일지 양식 정의 가능 (기본필드, 결재라인) +2. React에서 WorkOrder 선택 시 작업일지 자동생성 또는 수동생성 +3. 품목 목록(WorkOrderItem[])이 자동으로 테이블에 매핑 +4. 작업 통계(지시수량/완료수량/진행률) 자동 계산 +5. 특이사항 입력/저장 가능 + +--- + +## 2. 데이터 흐름 + +``` +WorkOrder (작업지시) +├─ work_order_no: "KD-WO-260210-01" +├─ process_id → Process (공정: 스크린/슬랫/절곡) +├─ sales_order_id → Order (수주) +│ ├─ client_name: "발주처명" +│ └─ site_name: "현장명" +└─ items: WorkOrderItem[] + ├─ [0] item_name="와이어 스크린", quantity=2, status="completed" + ├─ [1] item_name="메쉬 스크린", quantity=4, status="in_progress" + └─ [N] ... + +작업일지 생성: + ↓ +Document (작업일지 1건 / 작업지시 1건) +├─ template_id → 작업일지 양식 +├─ linkable_type = 'WorkOrder' +├─ linkable_id = work_order.id +├─ status: DRAFT → PENDING → APPROVED +└─ document_data (EAV) + ├─ 기본필드: 발주처, 현장명, 작업일자, LOT NO, 납기일, 작업지시번호 + ├─ 품목데이터: 행(row) = WorkOrderItem별 + │ ├─ r{행}_item_name = "와이어 스크린" + │ ├─ r{행}_floor_code = "1F-A" + │ ├─ r{행}_specification = "W7400×H2950" + │ ├─ r{행}_quantity = "2" + │ └─ r{행}_status = "completed" + ├─ 작업통계: order_qty, completed_qty, in_progress_qty, waiting_qty, progress + └─ 특이사항: remarks +``` + +### 2.1 mng 상세보기 데이터 흐름 (구현 완료) + +``` +DocumentController::show($id) +├─ Document + relations 로드 +├─ linkable_type === 'work_order' ? +│ ├─ workOrderItems (work_order_items, options JSON decode) +│ ├─ workOrder (work_orders) +│ ├─ salesOrder (orders, via work_order.sales_order_id) +│ ├─ materialInputLots (stock_transactions: work_order_input + cancel 상쇄) +│ │ └─ 순수 투입량 = SUM(qty) where qty < 0 → abs() +│ └─ itemLotMap (work_order_material_inputs → stock_lots JOIN) +│ └─ groupBy(work_order_item_id) → lot_no 문자열 +├─ resolveAndBackfillBasicFields($document) +│ ├─ isWorkLog = sections 없음? +│ ├─ 작업일지 → buildWorkLogResolveMap (label 기반: 발주처, 현장명, 수주일 등) +│ └─ 검사 문서 → buildInspectionResolveMap (field_key 기반: product_name 등) +└─ view('documents.show', [...]) + +show.blade.php (작업일지 전용 섹션) +├─ 템플릿 컬럼 기반 동적 테이블 +│ ├─ 헤더: simple 컬럼 = 1행, complex 컬럼 = colspan + sub_labels 2행 +│ ├─ 데이터: $getCellValue (label 기반 매핑), $getSubCellValue (sub_label 매핑) +│ └─ PHP $calculateCutSize (재단 알고리즘: FABRIC_CONFIG 원단별) +├─ 작업 통계 (지시수량/완료/진행중/대기/진행률) +├─ 투입 자재 LOT 테이블 (materialInputLots) +└─ 비고 (remarks) +``` + +### 2.2 중간검사 문서와의 차이 + +| 항목 | 중간검사 | 작업일지 | +|------|---------|---------| +| 단위 | 작업지시 (내부 개소별 행) | 작업지시 (1:1) | +| 테이블 내용 | 검사항목 + 측정값 + 판정 | 품목 목록 + 상태 | +| 통계 | 적합/부적합 비율 | 완료/진행중/대기 수량 | +| Footer | 부적합 내용 + 종합판정 | 특이사항 | +| 결재 | 작성→검토→승인 (3단계) | 작성→확인 (2단계) | + +--- + +## 3. 작업 항목 + +| # | 작업 | 상태 | 완료 기준 | 비고 | +|---|------|:----:|----------|------| +| 5.3.1 | mng 작업일지 양식 시더 생성 | ✅ | WorkLogTemplateSeeder 3종. 스크린(62)/슬랫(63)/절곡(64). 공정별 결재+기본필드+컬럼 | 검사 기준서 섹션 없음, 판정 없음 | +| 5.3.2 | mng 양식 편집 검증 | ✅ | 작업일지 양식 edit → 미리보기 정상 동작 확인 (코드 레벨 검증) | 빈 sections/judgement 안전 처리 | +| 5.3.3 | API 작업일지 생성/저장 | ✅ | getWorkLogTemplate, getWorkLog, createWorkLog 구현. 3개 라우트 추가 | EAV 저장, 기본필드 자동매핑, 작업통계 자동계산 | +| 5.3.4 | React WorkLogContent 양식 기반 전환 | ⏳ | 양식의 기본필드/결재라인을 API에서 받아 렌더링. 품목테이블/통계는 전용 로직 유지 | 하이브리드 | + +### mng 작업일지 상세보기 (추가 작업, ✅ 완료) + +| # | 작업 | 상태 | 설명 | +|---|------|:----:|------| +| α.1 | resolveAndBackfillBasicFields 작업일지/검사 분기 | ✅ | 섹션 유무로 판별. 작업일지=label 기반(발주처, 현장명 등), 검사=field_key 기반(product_name 등) | +| α.2 | show() 메서드 데이터 로딩 확장 | ✅ | workOrder, salesOrder, materialInputLots, itemLotMap 변수 추가 | +| α.3 | 템플릿 컬럼 기반 동적 테이블 렌더링 | ✅ | template.columns 구조대로 헤더/데이터 렌더링. complex 컬럼(제작사이즈, 규격매수) sub_labels 지원 | +| α.4 | PHP 재단 알고리즘 (calculateCutSize) | ✅ | React 동일 구현. FABRIC_CONFIG(실리카1220/와이어1100/화이바1100), 나머지높이+규격(매수) 자동계산 | +| α.5 | 개소별 투입자재 LOT 매핑 | ✅ | work_order_material_inputs → stock_lots JOIN. 입고 LOT NO 컬럼에 개소별 lot_no 표시 | +| α.6 | 투입자재 취소 트랜잭션 상쇄 | ✅ | stock_transactions에서 work_order_input(OUT,음수) + work_order_input_cancel(IN,양수) 합산 | +| α.7 | 작업통계/자재LOT/비고 섹션 | ✅ | 지시수량/완료/진행중/대기 통계, 투입 자재 LOT 테이블, 비고 표시 | + +--- + +## 4. 작업일지 구조 (React 현재 기준) + +### 4.1 WorkLogContent.tsx 구조 + +``` +작업일지 문서 +├─ DocumentHeader +│ ├─ 로고 (케이디산업) +│ ├─ 제목: "작업일지" +│ └─ 결재라인: 작성 / 확인 +│ +├─ 기본 정보 테이블 +│ ├─ 발주처 / 현장명 +│ ├─ 작업일자 / LOT NO +│ └─ 납기일 / 작업지시번호 +│ +├─ 품목 테이블 +│ ├─ No | 품목명 | 층-부호 | 규격 | 수량 | 상태 +│ ├─ [1] 와이어 스크린 | 1F-A | W7400×H2950 | 2 | 완료 +│ ├─ [2] 메쉬 스크린 | 2F-B | W5200×H3100 | 4 | 작업중 +│ └─ [N] ... +│ +├─ 작업내역 (공정별) +│ ├─ 지시수량: 50 +│ ├─ 완료수량: 30 +│ ├─ 진행률: 60% +│ └─ 대기: 10 / 작업중: 10 / 완료: 30 +│ +└─ 특이사항 + └─ (자유 텍스트 입력) +``` + +### 4.2 작업 통계 계산 (기존 로직) + +```typescript +function calculateWorkStats(items: WorkOrderItem[]): WorkStats { + return { + orderQty: items.length, // 전체 개소 수 + completedQty: items.filter(i => i.status === 'completed').length, + inProgressQty: items.filter(i => i.status === 'in_progress').length, + waitingQty: items.filter(i => i.status === 'waiting').length, + progress: (completedQty / orderQty) * 100 + } +} +``` + +--- + +## 5. 양식 시더 구조 (구현 완료 - 3종) + +```php +// WorkLogTemplateSeeder - 공정별 3종 +// 스크린(ID:62): 결재 3단계(작성/검토/승인), 규격매수 컬럼(기준폭/900/800/600/400/300) +// 슬랫(ID:63): 결재 4단계(작성/승인×3), 방화유리/조인트바/코일 컬럼 +// 절곡(ID:64): 결재 4단계(작성/승인×3), 유형명/세부품명/재질/길이규격 컬럼 +// +// 공통: 기본필드 9개(신청업체4+신청내용5), 판정 없음, 비고만 +[ + 'name' => '스크린 작업일지', // or 슬랫/절곡 + 'category' => '생산/작업일지', + 'title' => '작업일지 (스크린)', + 'company_name' => '케이디산업', + 'footer_remark_label' => '비고', + 'footer_judgement_label' => '', // NOT NULL 컬럼 → 빈문자열 + 'footer_judgement_options' => [], // 작업일지는 종합판정 없음 + + 'approval_lines' => [ + ['name' => '작성', 'dept' => '생산', 'role' => '담당자', 'sort_order' => 1], + ['name' => '확인', 'dept' => '생산', 'role' => '관리자', 'sort_order' => 2], + ], + + 'basic_fields' => [ + ['label' => '발주처', 'field_type' => 'text'], + ['label' => '현장명', 'field_type' => 'text'], + ['label' => '작업일자', 'field_type' => 'date'], + ['label' => 'LOT NO', 'field_type' => 'text'], + ['label' => '납기일', 'field_type' => 'date'], + ['label' => '작업지시번호', 'field_type' => 'text'], + ], + + // 섹션 없음 (작업일지는 검사 기준서가 필요 없음) + 'sections' => [], + + // 컬럼: 품목 테이블용 (React에서 직접 렌더링하므로 참조용) + 'columns' => [ + ['label' => 'No', 'column_type' => 'text', 'width' => '40px'], + ['label' => '품목명', 'column_type' => 'text', 'width' => '150px'], + ['label' => '층-부호', 'column_type' => 'text', 'width' => '80px'], + ['label' => '규격', 'column_type' => 'text', 'width' => '150px'], + ['label' => '수량', 'column_type' => 'text', 'width' => '60px'], + ['label' => '상태', 'column_type' => 'select', 'width' => '80px'], + ], +] +``` + +--- + +## 6. 하이브리드 구현 전략 + +### mng 템플릿에서 관리하는 것 +- 결재라인 (작성/확인 or 커스텀) +- 기본필드 (발주처, 현장명, 작업일자 등) +- 회사명, 문서 제목 + +### React 전용 로직으로 유지하는 것 +- 품목 테이블 (WorkOrderItem[] 기반 동적 생성) +- 작업 통계 계산 (calculateWorkStats) +- 상태 배지 (완료/작업중/대기 → 색상 표시) +- 특이사항 입력 UI + +### API 요청 흐름 + +``` +1. 작업일지 생성 요청 + POST /api/v1/work-orders/{id}/create-work-log + → Document 생성 (template_id, linkable → WorkOrder) + → 기본필드 자동매핑 (발주처, 현장명, LOT NO 등) + +2. 작업일지 데이터 저장 + PUT /api/v1/documents/{id} + Body: { + basic_data: { ... }, // 기본필드 (양식 기반) + table_data: [ ... ], // 품목 테이블 (전용 로직) + stats: { ... }, // 작업 통계 (자동 계산) + remarks: "특이사항" // 자유 텍스트 + } + +3. 작업일지 조회 + GET /api/v1/documents/{id} + → 양식 JSON + 저장된 데이터 반환 +``` + +--- + +## 7. 핵심 파일 경로 + +### mng +| 파일 | 용도 | +|------|------| +| `mng/database/seeders/WorkLogTemplateSeeder.php` | ✅ 3종 생성 (62/63/64) | +| `mng/app/Http/Controllers/DocumentController.php` | ✅ show() 작업일지 데이터 로딩, resolveAndBackfillBasicFields 분기, buildWorkLogResolveMap | +| `mng/resources/views/documents/show.blade.php` | ✅ 작업일지 전용 섹션 (템플릿 컬럼 동적 렌더링, PHP 재단 알고리즘, 통계, 자재LOT, 비고) | + +### react +| 파일 | 용도 | +|------|------| +| `react/src/components/production/WorkerScreen/WorkLogModal.tsx` | ✅ 작업일지 모달 (공정관리 양식 연동) | +| `react/src/components/production/WorkerScreen/WorkLogContent.tsx` | 작업일지 범용 (~280행) | +| `react/src/components/production/WorkOrders/documents/ScreenWorkLogContent.tsx` | ✅ 스크린 작업일지 (자재 LOT 동적화) | +| `react/src/components/production/WorkOrders/documents/SlatWorkLogContent.tsx` | 슬랫 작업일지 | +| `react/src/components/production/WorkOrders/documents/BendingWorkLogContent.tsx` | 절곡 작업일지 | +| `react/src/components/production/WorkerScreen/actions.ts` | API 호출 | +| `react/src/components/document-system/viewer/DocumentViewer.tsx` | 문서 뷰어 | + +### api +| 파일 | 용도 | +|------|------| +| `api/app/Services/WorkOrderService.php` | ✅ getWorkLogTemplate, getWorkLog, createWorkLog | +| `api/app/Http/Controllers/Api/V1/WorkOrderController.php` | ✅ 작업일지 3개 엔드포인트 | +| `api/routes/api/v1/production.php` | ✅ work-log-template, work-log 라우트 | +| `api/app/Models/Production/WorkOrder.php` | ✅ documents() MorphMany 관계 | + +--- + +## 8. 변경 이력 + +| 날짜 | 내용 | +|------|------| +| 2026-02-10 | Phase 5.3 계획 문서 신규 생성 | +| 2026-02-11 | 5.3.1 완료: WorkLogTemplateSeeder 3종 생성 (스크린62/슬랫63/절곡64). 범용(61) 삭제. React 공정별 코드 분석 기반 구조 반영. 판정 없음 확정 | +| 2026-02-11 | WorkLogModal 공정관리 양식 연동: workLogTemplateId/Name prop 추가, resolveProcessTypeFromTemplate() | +| 2026-02-11 | ScreenWorkLogContent 자재 LOT 동적화: "내화실 입고 LOT NO" → materialLots item_name별 그룹핑 | +| 2026-02-11 | 결정: 자재 LOT 역할 분리 — 개소별 품목=작업내역 테이블, 공용 자재=자재 투입 시스템 (예외 필드 없음) | +| 2026-02-12 | 5.3.2 완료: mng 양식 편집/미리보기 코드 레벨 검증 (빈 sections/judgement 안전 처리 확인) | +| 2026-02-12 | 5.3.3 완료: API 작업일지 3개 엔드포인트 구현 (getWorkLogTemplate, getWorkLog, createWorkLog). 기본필드 자동매핑, 작업통계 자동계산, EAV 저장 | +| 2026-02-12 | MNG α.1~7 완료: 작업일지 상세보기 전면 구현 | +| 2026-02-12 | DocumentController: resolveAndBackfillBasicFields 작업일지(label)/검사(field_key) 분기. buildWorkLogResolveMap, buildInspectionResolveMap 추가 | +| 2026-02-12 | show.blade.php: 템플릿 컬럼 기반 동적 테이블 (complex 컬럼 sub_labels 지원), PHP 재단 알고리즘 (React calculateCutSize 동일) | +| 2026-02-12 | show(): workOrder, salesOrder, materialInputLots(취소 상쇄), itemLotMap(개소별 LOT) 변수 추가 | +| 2026-02-12 | 자재 투입 방식 변경 요청 기록 (수량 입력 → LOT 선택 방식, 미착수) | + +--- + +*이 문서는 /plan 스킬로 생성되었습니다.* \ No newline at end of file