2026-01-31 04:32:41 +09:00
# 문서관리 시스템 개발 계획
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
> **작성일**: 2026-01-31
> **목적**: mng에서 문서양식(템플릿)을 관리하고 문서를 생성하여, SAM(react)에서 JSON으로 소비하는 문서관리 시스템을 구축한다
> **기준 문서**: `docs/specs/database-schema.md`, `mng/CLAUDE.md`
> **상태**: 📋 계획 확정 → Phase 1 시작 대기
2026-01-28 20:41:37 +09:00
---
2026-01-31 04:32:41 +09:00
## 🚀 새 세션 시작 가이드
> **이 섹션은 새 세션에서 이 문서만 보고 작업을 시작할 수 있도록 작성되었습니다.**
### 프로젝트 정보
2026-01-28 20:41:37 +09:00
| 항목 | 내용 |
|------|------|
2026-01-31 04:32:41 +09:00
| **작업 프로젝트** | `mng` (관리자 패널) |
| **절대 경로** | `/Users/kent/Works/@KD_SAM/SAM/mng/` |
| **기술 스택** | Laravel 12 + Plain Blade + DaisyUI + HTMX + Alpine.js |
| **로컬 URL** | `https://mng.sam.kr` (Docker 로컬, `admin.sam.kr` 도 동일) |
| **관련 API** | `/Users/kent/Works/@KD_SAM/SAM/api/` (Laravel 12 REST API) |
| **프론트** | `/Users/kent/Works/@KD_SAM/SAM/react/` (Next.js 15, 이 작업에서는 미수정) |
| **5130 레거시** | `/Users/kent/Works/@KD_SAM/SAM/5130/` (참조 전용) |
| **문서 경로** | `/Users/kent/Works/@KD_SAM/SAM/docs/` |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### mng Git 저장소
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
```bash
cd /Users/kent/Works/@KD_SAM/SAM/mng
git status & & git branch
```
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
> **주의**: SAM/ 루트는 Git 저장소가 아님. api/, mng/, react/ 각각 독립 Git 저장소.
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 세션 시작 체크리스트
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
```
1. 이 문서를 읽는다 (📍 현재 진행 상태 섹션 확인)
2. mng/CLAUDE.md 를 읽는다 (mng 프로젝트 규칙 확인)
3. 마지막 완료 작업 확인 → 다음 작업 결정
4. 해당 Phase의 상세 절차(섹션 11)를 읽는다
5. 작업 시작 전 사용자에게 "Phase X.X 시작할까요?" 확인
2026-01-28 20:41:37 +09:00
```
2026-01-31 04:32:41 +09:00
### 핵심 파일 (작업 빈도순)
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
| 파일 | 설명 | 크기 |
|------|------|------|
| `mng/resources/views/document-templates/edit.blade.php` | 양식 편집 UI (메인 작업 대상) | 44.5KB |
| `mng/app/Http/Controllers/DocumentTemplateController.php` | 양식 CRUD 컨트롤러 | |
| `mng/app/Http/Controllers/DocumentController.php` | 문서 CRUD 컨트롤러 | |
| `mng/app/Models/DocumentTemplate.php` | 양식 모델 (관계 정의) | |
| `mng/app/Models/Documents/Document.php` | 문서 모델 (상태 워크플로우) | |
| `mng/routes/web.php` (340-353줄) | 양식/문서 라우트 | |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 모델 관계 구조 (코드 참조)
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
```php
// DocumentTemplate.php 주요 관계
class DocumentTemplate extends Model {
use BelongsToTenant, SoftDeletes;
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
// 결재라인: template->approval_lines (작성/검토/승인)
public function approvalLines() { return $this->hasMany(DocumentTemplateApprovalLine::class, 'template_id')->orderBy('sort_order'); }
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
// 기본필드: template->basic_fields (품명, LOT NO 등)
public function basicFields() { return $this->hasMany(DocumentTemplateBasicField::class, 'template_id')->orderBy('sort_order'); }
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
// 섹션: template->sections->items (검사기준서 섹션 + 검사항목)
public function sections() { return $this->hasMany(DocumentTemplateSection::class, 'template_id')->orderBy('sort_order'); }
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
// 컬럼: template->columns (데이터 테이블 컬럼 정의)
public function columns() { return $this->hasMany(DocumentTemplateColumn::class, 'template_id')->orderBy('sort_order'); }
}
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
// Document.php 주요 관계
class Document extends Model {
use BelongsToTenant, SoftDeletes;
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
// 상태: DRAFT -> PENDING -> APPROVED/REJECTED/CANCELLED
protected $casts = ['status' => DocumentStatus::class];
public function template() { return $this->belongsTo(DocumentTemplate::class); }
public function approvals() { return $this->hasMany(DocumentApproval::class); }
public function data() { return $this->hasMany(DocumentData::class); } // EAV 패턴
public function attachments() { return $this->hasMany(DocumentAttachment::class); }
public function linkable() { return $this->morphTo(); } // 다형성 연결 (수주, 작업지시 등)
}
2026-01-28 20:41:37 +09:00
```
2026-01-31 04:32:41 +09:00
### mng 라우트 구조
```php
// mng/routes/web.php (340-353줄)
Route::resource('document-templates', DocumentTemplateController::class); // /document-templates
Route::resource('documents', DocumentController::class); // /documents
2026-01-28 20:41:37 +09:00
```
2026-01-31 04:32:41 +09:00
> **URL 확인**: `https://mng.sam.kr/document-templates` (양식 관리), `https://mng.sam.kr/documents` (문서 관리)
---
## 📍 현재 진행 상태
| 항목 | 내용 |
|------|------|
2026-01-31 05:36:37 +09:00
| **마지막 완료 작업** | Phase 3.1 - 중간검사 양식 구조 설계 (4종 검사항목/기준/판정방식 문서화) |
| **다음 작업** | Phase 3.2 - 5130 중간검사 데이터 이관 설계 |
| **진행률** | 10/20 (50%) - Phase 1 ✅, Phase 2.1~2.4 ✅, Phase 3.1 ✅ |
2026-01-31 04:32:41 +09:00
| **마지막 업데이트** | 2026-01-31 |
2026-01-28 20:41:37 +09:00
---
## 1. 개요
### 1.1 배경
2026-01-31 04:32:41 +09:00
현재 SAM(react)에는 검사 성적서(수입검사, 중간검사), 작업일지 등이 하드코딩된 모달 컴포넌트로 존재한다. 5130 레거시 시스템에도 동일 문서들이 PHP 파일 단위로 구현되어 있다. 이들을 **mng에서 동적으로 양식을 관리**하고, **API를 통해 JSON으로 제공**하여 SAM에서 렌더링하는 구조로 전환한다.
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
**핵심 문제:**
- 현재 검사 문서가 React 컴포넌트에 하드코딩되어, 새 양식 추가 시 코드 수정이 필요
- 5130의 수입검사만 약 40종의 자재별 페이지가 개별 PHP 파일로 존재
- 검사 기준, 항목, 판정 로직이 코드와 혼재되어 비개발자가 관리 불가
- 중간검사(절곡/스크린/슬랫/조인트바)도 각각 별도 컴포넌트로 분산
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
**해결 방향:**
- mng에서 문서양식(템플릿)을 동적으로 정의 → 검사 항목/기준/판정 로직 포함
- 양식 기반으로 실제 문서 인스턴스를 생성 → 데이터 입력/결재/출력
- SAM에서 API로 양식+데이터를 JSON 수신 → 범용 렌더러로 표시
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 1.2 기준 원칙
2026-01-28 20:41:37 +09:00
```
┌─────────────────────────────────────────────────────────────────┐
2026-01-31 04:32:41 +09:00
│ 핵심 원칙 │
2026-01-28 20:41:37 +09:00
├─────────────────────────────────────────────────────────────────┤
2026-01-31 04:32:41 +09:00
│ 1. 양식 정의는 mng에서만 관리 (비개발자도 양식 수정 가능하도록) │
│ 2. SAM(react)은 JSON을 받아 렌더링만 담당 (문서 로직 없음) │
│ 3. 기존 DB 구조(document_templates 계열) 최대한 활용 │
│ 4. 5130 레거시의 검사 기준/항목을 데이터로 이관 │
│ 5. 결재 워크플로우(DRAFT->PENDING->APPROVED) 유지 │
2026-01-28 20:41:37 +09:00
└─────────────────────────────────────────────────────────────────┘
```
### 1.3 변경 승인 정책
| 분류 | 예시 | 승인 |
|------|------|------|
2026-01-31 04:32:41 +09:00
| 즉시 가능 | 양식 필드 추가/변경, 검사항목 추가, 기준값 수정, 뷰(Blade) 수정 | 불필요 |
| 컨펌 필요 | 새 DB 테이블 추가, 기존 테이블 컬럼 변경, API 엔드포인트 추가, 마이그레이션 | **필수** |
| 금지 | 기존 document_templates 테이블 구조 파괴적 변경, 기존 API 삭제 | 별도 협의 |
### 1.4 준수 규칙
- `docs/specs/database-schema.md` - DB 스키마 참조
- `docs/standards/quality-checklist.md` - 품질 체크리스트
- `mng/CLAUDE.md` - MNG 프로젝트 규칙
2026-01-28 20:41:37 +09:00
---
2026-01-31 04:32:41 +09:00
## 2. 현황 분석
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 2.1 기존 DB 구조 (이미 생성됨)
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
```
document_templates # 양식 마스터
├── document_template_approval_lines # 결재라인 (작성/검토/승인)
├── document_template_basic_fields # 기본필드 (품명, LOT NO 등)
├── document_template_sections # 섹션 (검사기준서 섹션)
│ └── document_template_section_items # 섹션 항목 (검사항목)
└── document_template_columns # 데이터 테이블 컬럼
documents # 문서 인스턴스
├── document_approvals # 결재 이력
├── document_data # 필드 데이터 (EAV 패턴)
└── document_attachments # 첨부 파일
```
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
**주요 테이블 컬럼:**
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
| 테이블 | 핵심 컬럼 |
|--------|----------|
| `document_templates` | tenant_id, name, category, title, company_name, footer_remark_label, footer_judgement_label, footer_judgement_options(json) |
| `document_template_approval_lines` | template_id, name, dept, role, sort_order |
| `document_template_basic_fields` | template_id, label, field_type(text/date), default_value, sort_order |
| `document_template_sections` | template_id, title, image_path, sort_order |
| `document_template_section_items` | section_id, category, item, standard, method, frequency, regulation, sort_order |
| `document_template_columns` | template_id, label, column_type(text/check/measurement/select/complex), group_name, sub_labels(json), width, sort_order |
| `documents` | tenant_id, template_id, document_no, title, status(DRAFT/PENDING/APPROVED/REJECTED/CANCELLED), linkable_type, linkable_id |
| `document_data` | document_id, section_id, column_id, row_index, field_key, field_value |
| `document_approvals` | document_id, user_id, step, role, status(PENDING/APPROVED/REJECTED), comment, acted_at |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 2.2 기존 MNG 코드 현황
| 항목 | 경로 | 상태 |
|------|------|------|
| DocumentTemplate 모델 | `mng/app/Models/DocumentTemplate.php` | 존재 |
| Document 모델 | `mng/app/Models/Documents/Document.php` | 존재 |
| 관련 하위 모델 6개 | `mng/app/Models/Documents/` , `mng/app/Models/DocumentTemplate*.php` | 존재 |
| DocumentTemplateController | `mng/app/Http/Controllers/DocumentTemplateController.php` | 존재 |
| DocumentController | `mng/app/Http/Controllers/DocumentController.php` | 존재 |
| 라우트 (templates, documents) | `mng/routes/web.php` 340-353줄 | 존재 |
| 양식 편집 Blade | `mng/resources/views/document-templates/edit.blade.php` (44.5KB) | 존재 |
| 문서 Blade (index/edit/show) | `mng/resources/views/documents/` | 존재 |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 2.3 5130 레거시 검사 문서 현황
2026-01-28 22:01:39 +09:00
2026-01-31 04:32:41 +09:00
#### 수입검사 (instock)
| 항목 | 내용 |
|------|------|
| 위치 | `5130/instock/` |
| 자재별 검사 페이지 | 40+ PHP 파일 (`i_EGI155.php` , `i_SUSplate.php` , `i_wire.php` , `i_motor.php` 등) |
| 메인 로더 | `fetch_inspection.php` (21.8KB) - 자재코드별 동적 로딩 |
| 검사 필드 | 로트번호, 검사일, 납품업체, 품명, 규격, 단위, 품목코드, 입고량, 자재번호, 제조사 |
| 판정 방식 | 항목별 합격/불합격 -> 종합판정 자동계산 |
| LOT 관리 | `lotnum.txt` 파일 기반, YYMMDD-## 형식 |
| PDF 출력 | html2pdf.js 사용 |
#### 중간검사 (output)
| 검사 종류 | 파일 | DB 필드 |
|----------|------|---------|
| 절곡품 중간검사 | `viewMidInspectBending.php` (60.7KB) | `recordbendingMid` (JSON) |
| 스크린 중간검사 | `viewMidInspectScreen.php` (33.6KB) | `recordscreenMid` (JSON) |
| 슬랫 중간검사 | `viewMidInspectSlat.php` | `recordslatMid` (JSON) |
| 조인트바 검사 | `viewinspectionJointbar.php` (34.1KB) | `recordjointbar` (JSON) |
#### 검사 공통 구조
- 결재: 작성(판매/Order) -> 검토(생산) -> 승인(품질/QC)
- 검사 기준 이미지: `5130/img/inspection/` (20+ 이미지)
- 데이터: JSON으로 DB 저장 (approval chain + measurements)
- QC 관리자 권한 제어 (이세희, 함신옥, 이경호, 노완호)
### 2.4 SAM(react) 현재 검사 컴포넌트
| 컴포넌트 | 경로 | 용도 |
|---------|------|------|
| ImportInspectionDocument | `react/src/.../quality/qms/components/documents/` | 수입검사 성적서 |
| ScreenInspectionDocument | 동일 경로 | 스크린 중간검사 성적서 |
| SlatInspectionDocument | 동일 경로 | 슬랫 중간검사 성적서 |
| BendingInspectionDocument | 동일 경로 | 절곡품 중간검사 성적서 |
| JointbarInspectionDocument | 동일 경로 | 조인트바 중간검사 성적서 |
| ProductInspectionDocument | 동일 경로 | 제품검사 성적서 |
| WorkLogContent | `react/src/components/production/WorkerScreen/` | 작업일지 |
| InspectionReportModal | `react/src/components/production/WorkOrders/documents/` | 중간검사 모달 |
| DocumentViewer | `react/src/components/document-system/viewer/` | 범용 문서 뷰어 |
**공통 컴포넌트 (document-system):**
- `DocumentHeader.tsx` - 문서 헤더 (로고, 결재라인)
- `QualityApprovalTable.tsx` - 품질 결재표
- `InfoTable.tsx` - 정보 테이블
- `DocumentViewer.tsx` - 문서 뷰어 (zoom, drag, print, download)
2026-01-28 20:41:37 +09:00
---
2026-01-31 04:32:41 +09:00
## 3. 대상 범위
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 3.1 Phase 1: mng 양식 관리 기능 완성 (수입검사)
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
수입검사 양식 20여종을 mng에서 동적으로 관리할 수 있도록 기존 코드를 보강한다.
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
| # | 작업 항목 | 상태 | 완료 기준 | 비고 |
|---|----------|:----:|----------|------|
| 1.1 | 기존 document-templates 편집 UI 점검 및 보완 | ✅ | `mng.sam.kr/document-templates/{id}/edit` 에서 결재라인/기본필드/섹션/항목/컬럼 모두 CRUD 가능. 저장 후 DB에 정상 반영 확인 | 5개 탭 전체 CRUD 완료 확인 |
| 1.2 | 5130 수입검사 데이터 분석 및 양식 구조 설계 | ✅ | 라우팅 구조 + 대표 자재 2종(EGI, SUS) 상세 분석 완료. 나머지 21종은 Phase 1.3에서 개별 분석 병행 | viewJS.php 라우팅 + 공통패턴 추출 |
| 1.3 | 수입검사 양식 시드 데이터 생성 | ✅ | EGI(ID:7), SUS(ID:8) 2종 생성 완료. 각각 결재2+기본필드10+섹션1+검사항목7~8+컬럼7. 나머지 자재는 개별 분석 후 시더에 추가 | `IncomingInspectionTemplateSeeder.php` |
| 1.4 | 양식 미리보기 기능 | ✅ | edit.blade.php에 모달 미리보기 구현 완료. 결재란+기본정보+검사이미지+검사테이블(complex 지원)+Footer(비고+판정) 모두 렌더링 | 기존 구현 확인 완료 |
| 1.5 | 양식 복제 기능 | ✅ | API `POST /{id}/duplicate` + 목록 복제 버튼. 이름 입력 prompt → 전체 관계(결재/필드/섹션/항목/컬럼) 복제. 비활성 상태로 생성 | API+UI 구현 완료 |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 3.2 Phase 2: mng 문서 생성/관리 기능
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
양식을 기반으로 실제 검사 문서를 생성하고 데이터를 입력/결재하는 기능.
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
| # | 작업 항목 | 상태 | 완료 기준 | 비고 |
|---|----------|:----:|----------|------|
| 2.1 | 문서 생성 (양식 선택 -> 빈 문서 생성) | ✅ | 양식 선택 후 빈 문서(DRAFT)가 documents 테이블에 생성됨. 문서번호 자동 채번 | 카테고리별 prefix (IQC/PRD/SLS/PUR), 결재라인 초기화, 기본필드 뷰 수정 완료 |
2026-01-31 04:43:15 +09:00
| 2.2 | 문서 데이터 입력 UI | ✅ | 양식의 columns/sections 기반 동적 테이블 렌더링. complex/select/check/measurement/text 컬럼 타입 지원. EAV 저장 (section_id, column_id, row_index) | field_key 패턴: s{섹션}_r{행}_c{컬럼}_sub{인덱스} |
2026-01-31 05:00:50 +09:00
| 2.3 | 결재 워크플로우 (제출/승인/반려) | ✅ | DRAFT→PENDING→APPROVED/REJECTED 전체 동작. 단계별 승인, 반려 사유 필수, 재제출 시 결재라인 초기화 | submit/approve/reject API + 승인·반려 UI |
2026-01-31 05:07:38 +09:00
| 2.4 | 문서 목록/검색/필터 | ✅ | 상태별(DRAFT/PENDING/APPROVED), 양식별, 날짜별 필터 동작. 페이징 포함 | 날짜 범위 필터(date_from/date_to) + DRAFT 문서 삭제 기능 추가 |
2026-01-31 04:32:41 +09:00
| 2.5 | 문서 PDF 출력 | ⏭️ | **추후 고려** - react에 이미 html2pdf.js 구현됨 (6.2 결정사항 #1 참고) | |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 3.3 Phase 3: 중간검사 양식 추가
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
| # | 작업 항목 | 상태 | 완료 기준 | 비고 |
|---|----------|:----:|----------|------|
2026-01-31 05:36:37 +09:00
| 3.1 | 중간검사 양식 구조 설계 | ✅ | 절곡/스크린/슬랫/조인트바 4종의 검사항목/기준/판정방식 문서화 완료 | 섹션 5.2에 상세 설계. 절곡품 최고 복잡도(★5), 조인트바 최저(★1) |
2026-01-31 04:32:41 +09:00
| 3.2 | 5130 중간검사 데이터 이관 설계 | ⏳ | recordbendingMid 등 JSON→양식 매핑 테이블 완성 | |
| 3.3 | 중간검사 양식 시드 데이터 | ⏳ | 4종 양식 seeder 생성, `mng.sam.kr/document-templates` 에서 확인 가능 | |
| 3.4 | 검사 기준 이미지 관리 | ⏳ | `5130/img/inspection/` 이미지 → `mng/storage/app/public/inspection/` 로 이관. 양식에서 참조 가능 | 20+ 이미지 |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 3.4 Phase 4: API 연동 및 mng JSON 화면 구현
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
| # | 작업 항목 | 상태 | 완료 기준 | 비고 |
|---|----------|:----:|----------|------|
| 4.1 | API 엔드포인트 설계 (양식 조회, 문서 CRUD) | ⏳ | api 저장소에 REST 엔드포인트 구현. Swagger 문서화 완료. 섹션 4.1의 엔드포인트 전체 동작 | ⚠️ 컨펌 필요 |
| 4.2 | mng에서 JSON 기반 문서 화면 구현 | ⏳ | API에서 받은 양식 JSON으로 검사 성적서 형태 화면 렌더링. 기본정보+검사테이블+판정란 표시 | Blade + HTMX |
| 4.3 | mng에서 문서 데이터 입력/저장 연동 | ⏳ | JSON 화면에서 검사값 입력→API 호출→DB 저장. 판정(합격/불합격) 결과 저장 확인 | 6.2 결정사항 #2 적용 |
| 4.4 | 프론트엔드 담당자 협의 후 react 전환 결정 | ⏳ | mng 완성 후 프론트 담당자와 미팅. react 기존 컴포넌트는 미수정 (6.2 결정사항 #4 ) | 협의 결과 문서화 |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 3.5 Phase 5 (추후): 기타 문서 확장
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
| # | 작업 항목 | 상태 | 비고 |
|---|----------|:----:|------|
| 5.1 | 제품검사 양식 | ⏳ | Phase 3 이후 |
| 5.2 | 작업일지 양식 | ⏳ | WorkLogContent 기반 |
| 5.3 | 견적서/거래명세서/발주서 양식 | ⏳ | 기존 문서 모달 분석 필요 |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
---
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
## 4. 아키텍처 설계
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 4.1 시스템 흐름
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
```
[mng - 양식 관리] [api - REST API] [SAM - react 프론트]
DocumentTemplate CRUD ----------> GET /document-templates 양식 목록/상세
- 결재라인 설정 GET /document-templates/{id}
- 기본필드 설정
- 섹션/항목 설정 POST /documents 문서 생성
- 컬럼 설정 PUT /documents/{id} 데이터 입력
GET /documents/{id} 문서 조회
Document 생성/관리 ------------> POST /documents/{id}/submit 결재 제출
- 데이터 입력 POST /documents/{id}/approve 결재 승인
- 결재 처리 POST /documents/{id}/reject 결재 반려
- PDF 출력 GET /documents/{id}/pdf PDF 다운로드
```
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 4.2 JSON 응답 구조 (양식 상세)
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
```json
2026-01-28 20:41:37 +09:00
{
2026-01-31 04:32:41 +09:00
"template": {
"id": 1,
"name": "EGI 1.55T 수입검사",
"category": "incoming_inspection",
"title": "수 입 검 사 성 적 서",
"companyName": "케이디산업",
"approvalLines": [
{ "name": "작성", "dept": "판매/Order", "role": "담당자", "sortOrder": 1 },
{ "name": "검토", "dept": "생산", "role": "담당자", "sortOrder": 2 },
{ "name": "승인", "dept": "품질", "role": "QC", "sortOrder": 3 }
],
"basicFields": [
{ "label": "품명", "fieldType": "text", "sortOrder": 1 },
{ "label": "규격", "fieldType": "text", "sortOrder": 2 },
{ "label": "LOT NO", "fieldType": "text", "sortOrder": 3 },
{ "label": "검사일자", "fieldType": "date", "sortOrder": 4 },
{ "label": "납품업체", "fieldType": "text", "sortOrder": 5 },
{ "label": "검사자", "fieldType": "text", "sortOrder": 6 }
],
"sections": [
{
"title": "가이드레일",
"imagePath": "/storage/inspection/guiderail.jpg",
"items": [
{
"category": "겉모양",
"item": "사용상 결함이 될 흠이 없을 것",
"standard": "KS D 3506",
"method": "육안검사",
"frequency": "체크검사",
"regulation": "KS D 3506"
},
{
"category": "치수",
"item": "두께",
"standard": "1.55 +/- 0.15",
"method": "계측",
"frequency": "입고시",
"regulation": "KS D 3506"
}
]
}
],
"columns": [
{ "label": "NO", "columnType": "text", "width": "50px", "sortOrder": 1 },
{ "label": "검사항목", "columnType": "text", "width": "120px", "sortOrder": 2 },
{ "label": "검사기준", "columnType": "text", "width": "150px", "sortOrder": 3 },
{
"label": "검사 DATA",
"columnType": "complex",
"groupName": "검사 DATA",
"subLabels": ["1", "2", "3", "4", "5"],
"width": "300px",
"sortOrder": 4
},
{ "label": "판정", "columnType": "select", "width": "80px", "sortOrder": 5 }
],
"footerRemarkLabel": "부적합 내용",
"footerJudgementLabel": "종합판정",
"footerJudgementOptions": ["합격", "불합격"]
}
2026-01-28 20:41:37 +09:00
}
```
2026-01-31 04:32:41 +09:00
### 4.3 JSON 응답 구조 (문서 상세)
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
```json
2026-01-28 20:41:37 +09:00
{
2026-01-31 04:32:41 +09:00
"document": {
"id": 1,
"templateId": 1,
"documentNo": "IQC-260131-01",
"title": "EGI 1.55T 수입검사 성적서",
"status": "APPROVED",
"template": { "...위 구조와 동일..." },
"basicData": {
"품명": "전기 아연도금 강판",
"규격": "EGI 1.55T",
"LOT NO": "260131-01",
"검사일자": "2026-01-31",
"납품업체": "포스코",
"검사자": "이세희"
},
"tableData": [
{
"sectionId": 1,
"rows": [
{
"rowIndex": 0,
"values": {
"NO": "1",
"검사항목": "겉모양",
"검사기준": "사용상 결함 없을 것",
"검사 DATA": { "1": "양호", "2": "양호", "3": "양호", "4": "-", "5": "-" },
"판정": "적합"
2026-01-28 20:41:37 +09:00
}
2026-01-31 04:32:41 +09:00
}
]
}
],
"footerData": {
"remark": "",
"judgement": "합격"
},
"approvals": [
{ "step": 1, "role": "작성", "userName": "홍길동", "status": "APPROVED", "actedAt": "2026-01-31" },
{ "step": 2, "role": "검토", "userName": "김철수", "status": "APPROVED", "actedAt": "2026-01-31" },
{ "step": 3, "role": "승인", "userName": "이세희", "status": "APPROVED", "actedAt": "2026-01-31" }
]
}
2026-01-28 20:41:37 +09:00
}
```
2026-01-31 04:32:41 +09:00
---
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
## 5. 5130 데이터 이관 계획
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 5.1 수입검사 자재 목록 (주요)
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
5130의 `instock/fetch_inspection.php` 에서 자재코드별로 로딩하는 개별 페이지를 분석하여, 각 자재별 검사항목을 양식 시드 데이터로 변환한다.
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
| # | 자재 | 5130 파일 | 검사 항목 수 | 우선순위 |
|---|------|----------|:----------:|:-------:|
| 1 | EGI 1.55T (전기아연도금강판) | `i_EGI155.php` | ~8 | 높음 |
| 2 | SUS Plate (스테인리스강판) | `i_SUSplate.php` | ~6 | 높음 |
| 3 | GI Plate (아연도금강판) | `i_GIplate.php` | ~6 | 높음 |
| 4 | Wire (와이어) | `i_wire.php` | ~4 | 중간 |
| 5 | Motor (모터) | `i_motor.php` | ~5 | 중간 |
| 6 | Angle (앵글) | `i_angle.php` | ~4 | 중간 |
| 7-20+ | 기타 자재 | 개별 PHP 파일 | 다양 | 낮음 |
2026-01-28 20:41:37 +09:00
2026-01-31 05:36:37 +09:00
### 5.2 중간검사 양식 구조 설계 (Phase 3.1)
> **5130 레거시 분석 결과** - 4종 중간검사의 검사항목/기준/판정방식을 문서화
#### 5.2.0 공통 구조
**결재라인 (4종 공통)**
| step | name | dept | role |
|------|------|------|------|
| 1 | 작성 | 판매/Order | 담당자 |
| 2 | 검토 | 생산 | 담당자 |
| 3 | 승인 | 품질 | QC |
**기본필드 (4종 공통)**
| # | label | field_type | 비고 |
|---|-------|-----------|------|
| 1 | 품명 | text | 절곡품/스크린/철재스라트/조인트바 |
| 2 | 규격 | text | 제품 규격 |
| 3 | 로트크기 | text | 개소 수 |
| 4 | 발주처 | text | 고객사명 |
| 5 | 현장명 | text | 설치 현장 |
| 6 | 검사일자 | date | - |
| 7 | 검사자 | text | - |
**Footer (4종 공통)**
- `footer_remark_label` : "부적합 내용"
- `footer_judgement_label` : "종합판정"
- `footer_judgement_options` : ["합격", "불합격"]
- 종합판정 로직: 모든 행 "적" → 합격, 하나라도 "부" → 불합격
---
#### 5.2.1 절곡품 중간검사 (Bending Mid-Inspection)
**양식 정보**
| 항목 | 값 |
|------|-----|
| name | 절곡품 중간검사 성적서 |
| category | 품질/중간검사 |
| title | 절곡품 - 중간 검사 성적서 |
| 5130 DB필드 | `recordbendingMid` (JSON) |
**섹션 구조**: 제품 코드별 다른 검사 항목 (동적 구성)
구성품별 검사항목:
| 구성품 | 검사 항목 | 비고 |
|--------|----------|------|
| 가이드레일 (벽면형 120× 70) | 겉모양(절곡상태), 길이, 너비, 간격(4포인트) | S1: 30/80/45/40mm |
| 가이드레일 (측면형 120× 120) | 겉모양(절곡상태), 길이, 너비, 간격(6포인트) | S1: 30/70/45/35/95/90mm |
| 하단마감재 (60× 40) | 겉모양, 너비(60mm) | 길이 3000/4000mm |
| 하단 L-BAR (17× 60) | 겉모양, 너비(17mm) | - |
| 케이스/셔터박스 | 겉모양, 높이, 하단, 차이, 위치 | 양면/밑면/후면 |
| 연기차단재 (가이드레일용) | 너비(50mm), 간격(12mm) | - |
| 연기차단재 (케이스용) | 너비(80mm), 간격(12mm) | - |
**컬럼 구조**
| # | label | column_type | 비고 |
|---|-------|-----------|------|
| 1 | 분류/제품명 | text | 자동매핑 (KSS01 등) |
| 2 | 타입 | text | 벽면형/측면형/규격 |
| 3 | 겉모양(절곡상태) | check | 양호/불량 체크 |
| 4 | 길이 | complex | sub_labels: ['도면치수', '측정값'] |
| 5 | 너비 | complex | sub_labels: ['도면치수', '측정값'] |
| 6 | 간격 | complex | sub_labels: POINT별 ['도면치수', '측정값'] (가변) |
| 7 | 판정(적/부) | select | 자동계산 가능 |
**허용 공차**
- 길이: ±4mm
- 간격: ±2mm
**참조 이미지**: `bending_inspection1.jpg` , `bending_inspection2.jpg` , `guiderail_*` , `box_*` , `Lbar_mid` , `smoke`
**⚠️ 특이사항**: 절곡품은 제품 코드(KSS01/KSS02/KWE01)와 마감유형(S1/S2/S3)에 따라 검사 항목이 동적으로 변경됨. 현재 양식 시스템에서 이를 표현하려면 **가장 포괄적인 구성을 기본 양식으로 만들고** , 실제 문서 생성 시 해당 제품에 맞는 행만 활성화하는 방식 검토 필요.
---
#### 5.2.2 스크린 중간검사 (Screen Mid-Inspection)
**양식 정보**
| 항목 | 값 |
|------|-----|
| name | 스크린 중간검사 성적서 |
| category | 품질/중간검사 |
| title | 스크린 - 중간 검사 성적서 |
| 5130 DB필드 | `recordscreenMid` (JSON) |
**섹션: 스크린 검사 항목**
| # | 검사항목 | 타입 | 기준 | 비고 |
|---|---------|------|------|------|
| 겉모양-1 | 가공상태 | check | 양호/불량 | - |
| 겉모양-2 | 재봉상태 | check | 양호/불량 | - |
| 겉모양-3 | 조립상태 | check | 양호/불량 | - |
| 치수-① | 길이 | measurement | 도면치수 ±4mm | col10_SW/col10 |
| 치수-② | 높이 | measurement | 도면치수 ±40mm | col11_SH/col11 |
| 치수-③ | 간격 | check | 400 이하 → OK/NG | 고정 기준 |
**컬럼 구조**
| # | label | column_type | 비고 |
|---|-------|-----------|------|
| 1 | 일련번호 | text | 자동 (제품 순번) |
| 2 | 가공상태 | check | 양호/불량 |
| 3 | 재봉상태 | check | 양호/불량 |
| 4 | 조립상태 | check | 양호/불량 |
| 5 | ①길이 | complex | sub_labels: ['도면치수', '측정값'] |
| 6 | ②높이 | complex | sub_labels: ['도면치수', '측정값'] |
| 7 | ③간격 | complex | sub_labels: ['기준치', 'OK/NG'] |
| 8 | 판정(적/부) | select | 자동계산 |
**행 개수**: 발주 제품 수(estimateList)만큼 동적 생성
---
#### 5.2.3 슬랫(철재스라트) 중간검사 (Slat Mid-Inspection)
**양식 정보**
| 항목 | 값 |
|------|-----|
| name | 슬랫 중간검사 성적서 |
| category | 품질/중간검사 |
| title | 슬랫 - 중간 검사 성적서 |
| 5130 DB필드 | `recordslatMid` (JSON) |
**섹션: 슬랫 검사 항목**
| # | 검사항목 | 타입 | 기준 | 비고 |
|---|---------|------|------|------|
| 겉모양-1 | 가공상태 | check | 양호/불량 | - |
| 겉모양-2 | 조립상태 | check | 양호/불량 | 재봉상태 없음 (스크린과 차이) |
| 치수-① | 높이(1) | measurement | 16.5 ± 1mm | 고정 기준값 |
| 치수-② | 높이(2) | measurement | 14.5 ± 1mm | 고정 기준값 |
| 치수-③ | 길이(엔드락제외) | measurement | 도면치수 ±4mm | col10 |
**컬럼 구조**
| # | label | column_type | 비고 |
|---|-------|-----------|------|
| 1 | 일련번호 | text | 자동 |
| 2 | 가공상태 | check | 양호/불량 |
| 3 | 조립상태 | check | 양호/불량 |
| 4 | ①높이 | complex | sub_labels: ['기준(16.5±1)', '측정값'] |
| 5 | ②높이 | complex | sub_labels: ['기준(14.5±1)', '측정값'] |
| 6 | ③길이 | complex | sub_labels: ['도면치수', '측정값'] |
| 7 | 판정(적/부) | select | 자동계산 |
**행 개수**: 발주 제품 수(estimateSlatList)만큼 동적 생성
**스크린 vs 슬랫 차이점**
| 항목 | 스크린 | 슬랫 |
|------|--------|------|
| 겉모양 | 3개 (가공/재봉/조립) | 2개 (가공/조립) |
| 치수①② | 길이·높이 (도면치수) | 높이(1)(2) (고정값 16.5/14.5) |
| 치수③ | 간격 (400이하, OK/NG) | 길이 (도면치수 ±4mm) |
| 공차 | ±4mm, ±40mm | ±1mm, ±1mm, ±4mm |
---
#### 5.2.4 조인트바 중간검사 (Jointbar Mid-Inspection)
**양식 정보**
| 항목 | 값 |
|------|-----|
| name | 조인트바 중간검사 성적서 |
| category | 품질/중간검사 |
| title | 조인트바 - 중간 검사 성적서 |
| 5130 DB필드 | `recordjointbar` (JSON) |
**섹션: 조인트바 검사 항목**
| # | 검사항목 | 타입 | 기준값 | 공차 |
|---|---------|------|-------|------|
| 겉모양-1 | 가공상태 | check | 양호/불량 | - |
| 겉모양-2 | 조립상태 | check | 양호/불량 | - |
| 치수-① | 높이(1) | measurement | 16.5mm | ±1mm |
| 치수-② | 높이(2) | measurement | 14.5mm | ±1mm |
| 치수-③ | 길이(엔드락제외) | measurement | 300mm | ±4mm |
| 치수-④ | 간격 | measurement | 150mm | ±4mm |
**컬럼 구조**
| # | label | column_type | 비고 |
|---|-------|-----------|------|
| 1 | 일련번호 | text | 자동 |
| 2 | 가공상태 | check | 양호/불량 |
| 3 | 조립상태 | check | 양호/불량 |
| 4 | ①높이 | complex | sub_labels: ['기준(16.5±1)', '측정값'] |
| 5 | ②높이 | complex | sub_labels: ['기준(14.5±1)', '측정값'] |
| 6 | ③길이 | complex | sub_labels: ['기준(300±4)', '측정값'] |
| 7 | ④간격 | complex | sub_labels: ['기준(150±4)', '측정값'] |
| 8 | 판정(적/부) | select | 자동계산 |
**행 개수**: 단일 행 (제품 1건 단위 검사)
**참조 이미지**: `jointbar_inspection.jpg`
---
#### 5.2.5 4종 비교 요약
| 항목 | 절곡품 | 스크린 | 슬랫 | 조인트바 |
|------|--------|--------|------|---------|
| 겉모양 수 | 1 (절곡상태) | 3 (가공/재봉/조립) | 2 (가공/조립) | 2 (가공/조립) |
| 치수 항목 | 길이+너비+간격(가변) | 3 (길이/높이/간격) | 3 (높이× 2/길이) | 4 (높이× 2/길이/간격) |
| 행 구성 | 구성품별 (동적) | 발주제품별 (동적) | 발주제품별 (동적) | 단일 행 |
| 기준값 | 도면치수+포인트별 | 도면치수+고정(400) | 고정(16.5/14.5)+도면 | 전체 고정값 |
| 공차 | ±4mm/±2mm | ±4/±40mm | ±1/±1/±4mm | ±1/±1/±4/±4mm |
| 참조이미지 | 다수 (구성품별) | 별도 | 별도 | 1장 |
| 복잡도 | ★★★★★ (최고) | ★★★ | ★★☆ | ★☆ (최저) |
#### 5.2.6 양식 시스템 매핑 전략
**현재 양식 시스템의 한계와 대응**:
1. **조인트바/슬랫** : 현재 양식 구조(섹션+항목+컬럼)로 **그대로 표현 가능** . 수입검사와 동일 패턴으로 시더 생성.
2. **스크린** : 겉모양 check 컬럼 + complex 측정 컬럼 조합으로 표현 가능. 행이 발주 제품별 동적이므로 **문서 생성 시 행 수를 결정**하는 로직 필요.
3. **절곡품** : 제품 코드별로 검사 항목이 완전히 달라지므로 **가장 복잡** . 접근 방식:
- **Option A**: 포괄 양식 1개 + 문서 생성 시 해당 행만 활성화
- **Option B**: 제품 유형별 양식 분리 (S1/S2/S3 별도)
- **Option C (권장)**: 기본 양식에 구성품 목록만 정의하고, **문서 생성 시 제품 코드에 따라 동적으로 행 구성** (Phase 3.3에서 구현)
2026-01-28 20:41:37 +09:00
2026-01-31 05:36:37 +09:00
4. **check 컬럼 타입** : 현재 시스템에 `check` 컬럼 타입이 이미 존재. 양호/불량 체크박스로 사용 가능.
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 5.3 검사 기준 이미지 이관
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
`5130/img/inspection/` 디렉토리의 이미지를 mng storage로 이관:
- `jointbar_inspection.jpg`
- `screen_inspection.jpg`
- `bending_inspection1.jpg` , `bending_inspection2.jpg`
- `slat_inspection.jpg`
- `guiderail_*` (다수 변형)
- 기타 17+ 이미지
2026-01-28 20:41:37 +09:00
---
2026-01-31 04:32:41 +09:00
## 6. 기술 결정사항
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 6.1 확정된 사항
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
| 항목 | 결정 | 이유 |
|------|------|------|
| 양식 관리 위치 | mng (Laravel + Blade) | 관리자 전용, HTMX 기반 UI 이미 존재 |
| 데이터 저장 패턴 | EAV (document_data 테이블) | 이미 설계됨, 동적 필드 지원 |
| 문서 상태 | DRAFT -> PENDING -> APPROVED/REJECTED/CANCELLED | 이미 구현됨 |
| API 제공 | api 저장소 (Laravel REST API) | SAM 표준 아키텍처 |
| 프론트엔드 소비 | react (Next.js) JSON 렌더링 | 기존 document-system 컴포넌트 확장 |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 6.2 검토 완료 사항 (2026-01-31 확정)
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
| # | 항목 | 결정 | 근거 |
|---|------|------|------|
| 1 | PDF 생성 | **추후 고려** | react에 이미 구현됨 (html2pdf.js + DocumentViewer). mng 단계에서는 PDF 불필요 |
| 2 | 검사 판정 로직 | **프론트에서 입력, 결과만 저장** | 양식이 검사항목/기준을 정의하고, 프론트에서 사용자가 입력. 저장 시 입력값+판정 결과를 그대로 저장. 별도 판정 엔진 불필요 |
| 3 | 양식 버전 관리 | **수정 시 새 버전 생성** | 요청마다 검사 기준이 다를 수 있으므로 버전 관리 필수. document_templates에 version 컬럼 추가 필요 |
| 4 | 기존 react 컴포넌트 전환 | **기존 react 미수정** | mng에서 JSON 기반 화면 구현까지만 개발. 이후 프론트엔드 담당자와 협의하여 react 전환 여부 결정 |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
---
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
## 7. 컨펌 대기 목록
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
| # | 항목 | 변경 내용 | 영향 범위 | 상태 |
|---|------|----------|----------|------|
| 1 | API 엔드포인트 추가 | `/api/v1/document-templates` , `/api/v1/documents` | api 저장소 | ⏳ Phase 4 전 |
| 2 | DB 마이그레이션 변경 여부 | 기존 테이블로 충분한지 vs version 컬럼 추가 필요 (6.2 #3 확정) | api 저장소 | ⏳ Phase 1 중 |
| 3 | ~~검사 판정 로직 위치~~ | ~~프론트 vs 백엔드~~ → **프론트 입력, 결과만 저장** | - | ✅ 해결됨 (6.2 #2 ) |
| 4 | ~~PDF 생성 방식~~ | ~~클라이언트 vs 서버~~ → **추후 고려** (react 기 구현) | - | ✅ 해결됨 (6.2 #1 ) |
2026-01-28 20:41:37 +09:00
---
2026-01-31 04:32:41 +09:00
## 8. 변경 이력
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
> 📎 별도 파일로 관리: [`document-management-system-changelog.md`](./document-management-system-changelog.md)
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
---
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
## 9. 참고 문서 및 파일
### 프로젝트 문서
- `docs/specs/database-schema.md` - DB 스키마
- `docs/standards/quality-checklist.md` - 품질 체크리스트
- `mng/CLAUDE.md` - MNG 프로젝트 규칙
### 기존 코드 (mng)
- `mng/app/Models/DocumentTemplate.php` - 양식 모델
- `mng/app/Models/Documents/Document.php` - 문서 모델
- `mng/app/Http/Controllers/DocumentTemplateController.php` - 양식 컨트롤러
- `mng/app/Http/Controllers/DocumentController.php` - 문서 컨트롤러
- `mng/resources/views/document-templates/edit.blade.php` - 양식 편집 UI (44.5KB)
- `mng/routes/web.php` 340-353줄 - 라우트
### 기존 코드 (react)
- `react/src/components/document-system/` - 문서 공통 시스템
- `react/src/app/[locale]/(protected)/quality/qms/components/documents/` - QMS 검사 문서
- `react/src/components/production/WorkerScreen/WorkLogContent.tsx` - 작업일지
- `react/src/components/production/WorkOrders/documents/` - 중간검사
### 5130 레거시
- `5130/instock/fetch_inspection.php` - 수입검사 메인 로더 (21.8KB)
- `5130/instock/i_*.php` - 자재별 수입검사 페이지 (40+)
- `5130/output/viewMidInspect*.php` - 중간검사 성적서
- `5130/output/viewinspectionJointbar.php` - 조인트바 검사
- `5130/img/inspection/` - 검사 기준 이미지 (20+)
### DB 마이그레이션
- `api/database/migrations/2026_01_26_200000_create_document_templates_table.php`
- `api/database/migrations/2026_01_28_200000_create_documents_table.php`
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
---
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
## 11. Phase별 상세 실행 절차
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
> 각 Phase 작업 시 이 섹션을 먼저 읽고 진행한다.
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 11.1 Phase 1.1 - 기존 document-templates 편집 UI 점검 및 보완
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
**목표**: `mng.sam.kr/document-templates/{id}/edit` 에서 수입검사 양식에 필요한 모든 구성요소를 관리할 수 있는지 확인하고 부족한 부분을 보완한다.
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
**사전 조건**: 없음 (첫 번째 작업)
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
**실행 절차**:
2026-01-28 20:41:37 +09:00
```
2026-01-31 04:32:41 +09:00
Step 1: 현재 UI 분석
├── mng/resources/views/document-templates/edit.blade.php (44.5KB) 읽기
├── 기존 기능 목록 정리:
│ - 양식 기본정보 (이름, 카테고리, 제목, 회사명) 편집 가능?
│ - 결재라인 (approval_lines) CRUD 가능?
│ - 기본필드 (basic_fields) CRUD 가능?
│ - 섹션 (sections) CRUD 가능?
│ - 섹션 항목 (section_items) CRUD 가능?
│ - 컬럼 (columns) CRUD 가능?
│ - footer_remark_label, footer_judgement_label, footer_judgement_options 편집 가능?
└── 누락된 기능 목록화
Step 2: 브라우저에서 실제 동작 확인
├── https://mng.sam.kr/document-templates 접속
├── 기존 양식 편집 시도 (or 새 양식 생성 후 편집)
├── 각 탭/섹션별 CRUD 동작 확인
└── JS 에러, 저장 실패 등 이슈 기록
Step 3: 보완 작업
├── 누락된 CRUD 기능 구현 (Blade + HTMX + Alpine.js)
├── DocumentTemplateController 메서드 보강
├── 유효성 검증 추가 (FormRequest 패턴)
└── 섹션 항목(section_items)의 drag-drop 정렬 (있는 경우 확인, 없으면 sort_order 수동 관리)
Step 4: 검증
├── 새 양식 생성 → 모든 하위 요소 추가 → 저장 → DB 확인
├── 기존 양식 수정 → 저장 → 정상 반영 확인
└── 양식 삭제 → 하위 요소 cascade 삭제 확인
2026-01-28 20:41:37 +09:00
```
2026-01-31 04:32:41 +09:00
### 11.2 Phase 1.2 - 5130 수입검사 데이터 분석
**목표**: 5130의 자재별 수입검사 파일을 분석하여, 양식 시드 데이터로 변환할 수 있는 구조화된 데이터를 생성한다.
**상태**: ✅ 완료 (2026-01-31, 경량 분석)
**분석 결과**:
#### 라우팅 구조
`5130/instock/common/viewJS.php` 의 `viewBoardInstock()` 함수가 **item_name(품명) 기준 switch-case**로 개별 검사 페이지(`i_*.php` )를 팝업 호출한다.
- `fetch_inspection.php` = 데이터 입력 폼 (목록에서 호출)
- `i_*.php` = 검사 성적서 뷰 (viewinspection 버튼에서 호출)
- 총 23개 파일, 품명별 1:1 또는 N:1 매핑
#### 자재 → 검사파일 매핑 (23개)
| 품명 | 파일 | 비고 |
|---|---|---|
| EGI1.55T, EGI1.15T, EGI1.6T | `i_EGI155.php` | 전기아연도금강판 |
| SUS1.55T, SUS1.5T, SUS1.2T | `i_SUSplate.php` | 스테인리스강판 |
| GI0.5T, GI0.45T | `i_GIplate.php` | 아연도금강판 |
| 앵글 | `i_angle.php` | |
| 받침용앵글 | `i_anglebottom.php` | |
| 방화유리 | `i_antifireglass.php` | |
| 절곡코일(EGI) | `i_bendingcoil.php` | spec 앞3자=EGI |
| 베어링부 | `i_bracket.php` | |
| 바이오세라크울96K | `i_cerakwool.php` | |
| 연동제어기 | `i_controller.php` | |
| 화이바원단 | `i_fiber.php` | |
| 내화충진재 | `i_Fireproof_sealings.php` | |
| 내화실 | `i_fireproofWire.php` | |
| 전동개폐기 | `i_motor.php` | |
| 평철 | `i_platesteel.php` | |
| 마환봉 | `i_pole.php` | |
| 각파이프 | `i_recpipe.php` | |
| 감기샤프트 | `i_shaft.php` | |
| 실리카원단 | `i_sillica.php` | |
| 슬랫코일 | `i_slatcoil.php` | |
| 절곡코일(SUS) | `i_SUScoil.php` | spec 앞3자=SUS |
| 와이어원단 | `i_wire.php` | 기본 |
| 와이어원단(대한) | `i_wireDaehan.php` | remarks에 '대한' 포함 시 |
#### 대표 자재 분석: EGI 1.55T (`i_EGI155.php`)
| NO | 검사항목 | 검사기준 | 검사방식 | 검사주기 | 데이터 타입 |
|---|---|---|---|---|---|
| 1 | 겉모양 | 사용상 해로울 결함이 없을 것 | 육안검사 | n=3, c=0 | OK/NG 체크 × 3 |
| 2 | 치수-두께 | 두께별 허용범위 (±0.07~±0.12, 4구간) | 체크검사 | n=3, c=0 | 측정값 × 3 |
| 2 | 치수-너비 | 1250 미만: +7/-0 | 체크검사 | n=3, c=0 | 측정값 × 3 |
| 2 | 치수-길이 | 길이별 허용범위 (+10~+20/-0, 3구간) | 체크검사 | n=3, c=0 | 측정값 × 3 |
| 3 | 인장강도 (N/mm²) | 270 이상 | 밀시트 | 입고시 | 단일값 |
| 4 | 연신율 (%) | 두께별 36~38 이상 (3구간) | 밀시트 | 입고시 | 단일값 |
| 5 | 아연 최소 부착량 (g/m²) | 한면 17 이상 | 밀시트 | 입고시 | 단일값 |
#### 대표 자재 분석: SUS Plate (`i_SUSplate.php`)
| NO | 검사항목 | 검사기준 | 검사방식 | 검사주기 | 데이터 타입 |
|---|---|---|---|---|---|
| 1 | 겉모양 | 사용상 해로울 결함이 없을 것 | 육안검사 | n=3, c=0 | OK/NG 체크 × 3 |
| 2 | 치수-두께 | 두께별 허용범위 (±0.10~±0.12, 2구간) | 체크검사 | n=3, c=0 | 측정값 × 3 |
| 2 | 치수-너비 | 1250 미만: +7/-0 | 체크검사 | n=3, c=0 | 측정값 × 3 |
| 2 | 치수-길이 | 길이별 허용범위 (+10~+20/-0, 2구간) | 체크검사 | n=3, c=0 | 측정값 × 3 |
| 3 | 항복강도 (N/mm²) | 205 이상 | 밀시트 | 입고시 | 단일값 |
| 4 | 인장강도 (N/mm²) | 520 이상 | 밀시트 | 입고시 | 단일값 |
| 5 | 연신율 (%) | 40 이상 | 밀시트 | 입고시 | 단일값 |
| 6 | 경도 (HV) | 200 이하 | 밀시트 | 입고시 | 단일값 |
#### 공통 패턴 요약
**공통 구조 (모든 자재 동일):**
- **결재**: 담당 / 부서장 (2단계)
- **기본정보**: 품명, 규격(두께×너비×길이), 납품업체/제조업체, 로트번호, 자재번호, 검사일자, 로트크기, 검사자
- **검사 테이블 컬럼**: NO / 검사항목 / 검사기준 / 검사방식 / 검사주기 / 측정치(n1,n2,n3) / 판정(적/부)
- **Footer**: 부적합 내용 + 종합판정(합격/불합격)
- **판정 로직**: JS 자동 계산 (모든 항목 적→합격, 하나라도 부→불합격)
- **저장**: JSON(`iList` hidden field) → AJAX POST → `insert_iList.php`
**자재별 차이점:**
- 검사항목 수/종류 (EGI: 5항목 7행, SUS: 6항목 8행)
- 기준값 범위 (두께별 허용 오차, 강도/경도 기준 등)
- 두께 범위 구간 수 (EGI: 4구간, SUS: 2구간)
- 밀시트 항목 차이 (EGI: 인장+연신+아연, SUS: 항복+인장+연신+경도)
> **결론**: 나머지 21개 자재는 Phase 1.3 시드 데이터 생성 시 개별 분석하면서 병행 진행
### 11.3 Phase 1.3 - 수입검사 양식 시드 데이터 생성
**실행 절차**:
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
```
Step 1: Seeder 파일 생성
├── mng/database/seeders/IncomingInspectionTemplateSeeder.php 생성
├── 1.2에서 정리한 데이터 기반
└── 주요 자재 10종 양식 생성 (EGI, SUS, GI, Wire, Motor, Angle 등)
Step 2: 실행 및 검증
├── php artisan db:seed --class=IncomingInspectionTemplateSeeder
├── mng.sam.kr/document-templates 에서 목록 확인
└── 각 양식 편집 화면에서 데이터 정합성 확인
2026-01-28 20:41:37 +09:00
```
---
2026-01-31 04:32:41 +09:00
## 12. 자기완결성 점검 결과
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 12.1 체크리스트 검증
2026-01-28 20:41:37 +09:00
| # | 검증 항목 | 상태 | 비고 |
|---|----------|:----:|------|
2026-01-31 04:32:41 +09:00
| 1 | 작업 목적이 명확한가? | ✅ | 섹션 1.1 배경 |
| 2 | 성공 기준이 정의되어 있는가? | ✅ | 각 Phase 작업 항목에 "완료 기준" 컬럼 추가됨 |
| 3 | 작업 범위가 구체적인가? | ✅ | 섹션 3 Phase 1-5 + 섹션 11 상세 절차 |
| 4 | 의존성이 명시되어 있는가? | ✅ | 기존 DB/모델/컨트롤러 현황 + 새 세션 가이드 |
| 5 | 참고 파일 경로가 정확한가? | ✅ | 절대 경로 + 상대 경로 모두 명시 |
| 6 | 단계별 절차가 실행 가능한가? | ✅ | 섹션 11 Phase별 Step-by-step 절차 |
| 7 | 검증 방법이 명시되어 있는가? | ✅ | 각 Phase 완료 기준에 검증 방법 포함 |
| 8 | 모호한 표현이 없는가? | ✅ | 구체적 파일/테이블/컬럼/URL 명시 |
2026-01-28 20:41:37 +09:00
2026-01-31 04:32:41 +09:00
### 12.2 새 세션 시뮬레이션 테스트
2026-01-28 20:41:37 +09:00
| 질문 | 답변 가능 | 참조 섹션 |
|------|:--------:|----------|
| Q1. 이 작업의 목적은 무엇인가? | ✅ | 1.1 배경 |
2026-01-31 04:32:41 +09:00
| Q2. 어디서부터 시작해야 하는가? | ✅ | 🚀 새 세션 시작 가이드 + 📍 현재 진행 상태 |
| Q3. 어떤 파일을 수정해야 하는가? | ✅ | 새 세션 가이드 "핵심 파일" + 2.2 + 9. 참고 파일 |
| Q4. 작업 완료 확인 방법은? | ✅ | 각 Phase "완료 기준" 컬럼 |
| Q5. 막혔을 때 참고 문서는? | ✅ | 9. 참고 문서 + 새 세션 가이드 |
| Q6. mng 기술 스택과 로컬 환경은? | ✅ | 새 세션 가이드 "프로젝트 정보" |
| Q7. 모델 관계와 DB 구조는? | ✅ | 새 세션 가이드 "모델 관계 구조" + 2.1 |
| Q8. Phase 1.1의 구체적 첫 단계는? | ✅ | 11.1 상세 실행 절차 |
**결과**: 8/8 통과 - 자기완결성 확보
### 12.3 보완 이력
| 날짜 | 항목 | 원본 | 보완 내용 |
|------|------|------|----------|
| 2026-01-31 | 초기 검증 | - | 5/5 통과 |
| 2026-01-31 | 자기완결성 강화 | 새 세션에서 시작 불가 | 🚀 새 세션 시작 가이드 추가, 절대 경로/기술 스택/모델 코드 인라인, Phase 완료 기준 추가, 섹션 11 상세 실행 절차 추가, 컨펌 대기 목록 해결 항목 반영 |
2026-01-28 20:41:37 +09:00
---
*이 문서는 /plan 스킬로 생성되었습니다.*