37 KiB
문서관리 시스템 개발 계획
작성일: 2026-01-31 목적: mng에서 문서양식(템플릿)을 관리하고 문서를 생성하여, SAM(react)에서 JSON으로 소비하는 문서관리 시스템을 구축한다 기준 문서:
docs/specs/database-schema.md,mng/CLAUDE.md상태: 📋 계획 확정 → Phase 1 시작 대기
🚀 새 세션 시작 가이드
이 섹션은 새 세션에서 이 문서만 보고 작업을 시작할 수 있도록 작성되었습니다.
프로젝트 정보
| 항목 | 내용 |
|---|---|
| 작업 프로젝트 | 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/ |
mng Git 저장소
cd /Users/kent/Works/@KD_SAM/SAM/mng
git status && git branch
주의: SAM/ 루트는 Git 저장소가 아님. api/, mng/, react/ 각각 독립 Git 저장소.
세션 시작 체크리스트
1. 이 문서를 읽는다 (📍 현재 진행 상태 섹션 확인)
2. mng/CLAUDE.md 를 읽는다 (mng 프로젝트 규칙 확인)
3. 마지막 완료 작업 확인 → 다음 작업 결정
4. 해당 Phase의 상세 절차(섹션 11)를 읽는다
5. 작업 시작 전 사용자에게 "Phase X.X 시작할까요?" 확인
핵심 파일 (작업 빈도순)
| 파일 | 설명 | 크기 |
|---|---|---|
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줄) |
양식/문서 라우트 |
모델 관계 구조 (코드 참조)
// DocumentTemplate.php 주요 관계
class DocumentTemplate extends Model {
use BelongsToTenant, SoftDeletes;
// 결재라인: template->approval_lines (작성/검토/승인)
public function approvalLines() { return $this->hasMany(DocumentTemplateApprovalLine::class, 'template_id')->orderBy('sort_order'); }
// 기본필드: template->basic_fields (품명, LOT NO 등)
public function basicFields() { return $this->hasMany(DocumentTemplateBasicField::class, 'template_id')->orderBy('sort_order'); }
// 섹션: template->sections->items (검사기준서 섹션 + 검사항목)
public function sections() { return $this->hasMany(DocumentTemplateSection::class, 'template_id')->orderBy('sort_order'); }
// 컬럼: template->columns (데이터 테이블 컬럼 정의)
public function columns() { return $this->hasMany(DocumentTemplateColumn::class, 'template_id')->orderBy('sort_order'); }
}
// Document.php 주요 관계
class Document extends Model {
use BelongsToTenant, SoftDeletes;
// 상태: 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(); } // 다형성 연결 (수주, 작업지시 등)
}
mng 라우트 구조
// mng/routes/web.php (340-353줄)
Route::resource('document-templates', DocumentTemplateController::class); // /document-templates
Route::resource('documents', DocumentController::class); // /documents
URL 확인:
https://mng.sam.kr/document-templates(양식 관리),https://mng.sam.kr/documents(문서 관리)
📍 현재 진행 상태
| 항목 | 내용 |
|---|---|
| 마지막 완료 작업 | Phase 2.4 - 문서 목록/검색/필터 (날짜 필터 + 삭제 기능 추가) |
| 다음 작업 | Phase 3.1 - 중간검사 양식 구조 설계 |
| 진행률 | 9/20 (45%) - Phase 1 ✅, Phase 2.1~2.4 ✅ |
| 마지막 업데이트 | 2026-01-31 |
1. 개요
1.1 배경
현재 SAM(react)에는 검사 성적서(수입검사, 중간검사), 작업일지 등이 하드코딩된 모달 컴포넌트로 존재한다. 5130 레거시 시스템에도 동일 문서들이 PHP 파일 단위로 구현되어 있다. 이들을 mng에서 동적으로 양식을 관리하고, API를 통해 JSON으로 제공하여 SAM에서 렌더링하는 구조로 전환한다.
핵심 문제:
- 현재 검사 문서가 React 컴포넌트에 하드코딩되어, 새 양식 추가 시 코드 수정이 필요
- 5130의 수입검사만 약 40종의 자재별 페이지가 개별 PHP 파일로 존재
- 검사 기준, 항목, 판정 로직이 코드와 혼재되어 비개발자가 관리 불가
- 중간검사(절곡/스크린/슬랫/조인트바)도 각각 별도 컴포넌트로 분산
해결 방향:
- mng에서 문서양식(템플릿)을 동적으로 정의 → 검사 항목/기준/판정 로직 포함
- 양식 기반으로 실제 문서 인스턴스를 생성 → 데이터 입력/결재/출력
- SAM에서 API로 양식+데이터를 JSON 수신 → 범용 렌더러로 표시
1.2 기준 원칙
┌─────────────────────────────────────────────────────────────────┐
│ 핵심 원칙 │
├─────────────────────────────────────────────────────────────────┤
│ 1. 양식 정의는 mng에서만 관리 (비개발자도 양식 수정 가능하도록) │
│ 2. SAM(react)은 JSON을 받아 렌더링만 담당 (문서 로직 없음) │
│ 3. 기존 DB 구조(document_templates 계열) 최대한 활용 │
│ 4. 5130 레거시의 검사 기준/항목을 데이터로 이관 │
│ 5. 결재 워크플로우(DRAFT->PENDING->APPROVED) 유지 │
└─────────────────────────────────────────────────────────────────┘
1.3 변경 승인 정책
| 분류 | 예시 | 승인 |
|---|---|---|
| 즉시 가능 | 양식 필드 추가/변경, 검사항목 추가, 기준값 수정, 뷰(Blade) 수정 | 불필요 |
| 컨펌 필요 | 새 DB 테이블 추가, 기존 테이블 컬럼 변경, API 엔드포인트 추가, 마이그레이션 | 필수 |
| 금지 | 기존 document_templates 테이블 구조 파괴적 변경, 기존 API 삭제 | 별도 협의 |
1.4 준수 규칙
docs/specs/database-schema.md- DB 스키마 참조docs/standards/quality-checklist.md- 품질 체크리스트mng/CLAUDE.md- MNG 프로젝트 규칙
2. 현황 분석
2.1 기존 DB 구조 (이미 생성됨)
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 # 첨부 파일
주요 테이블 컬럼:
| 테이블 | 핵심 컬럼 |
|---|---|
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 |
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/ |
존재 |
2.3 5130 레거시 검사 문서 현황
수입검사 (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)
3. 대상 범위
3.1 Phase 1: mng 양식 관리 기능 완성 (수입검사)
수입검사 양식 20여종을 mng에서 동적으로 관리할 수 있도록 기존 코드를 보강한다.
| # | 작업 항목 | 상태 | 완료 기준 | 비고 |
|---|---|---|---|---|
| 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 구현 완료 |
3.2 Phase 2: mng 문서 생성/관리 기능
양식을 기반으로 실제 검사 문서를 생성하고 데이터를 입력/결재하는 기능.
| # | 작업 항목 | 상태 | 완료 기준 | 비고 |
|---|---|---|---|---|
| 2.1 | 문서 생성 (양식 선택 -> 빈 문서 생성) | ✅ | 양식 선택 후 빈 문서(DRAFT)가 documents 테이블에 생성됨. 문서번호 자동 채번 | 카테고리별 prefix (IQC/PRD/SLS/PUR), 결재라인 초기화, 기본필드 뷰 수정 완료 |
| 2.2 | 문서 데이터 입력 UI | ✅ | 양식의 columns/sections 기반 동적 테이블 렌더링. complex/select/check/measurement/text 컬럼 타입 지원. EAV 저장 (section_id, column_id, row_index) | field_key 패턴: s{섹션}_r{행}_c{컬럼}_sub{인덱스} |
| 2.3 | 결재 워크플로우 (제출/승인/반려) | ✅ | DRAFT→PENDING→APPROVED/REJECTED 전체 동작. 단계별 승인, 반려 사유 필수, 재제출 시 결재라인 초기화 | submit/approve/reject API + 승인·반려 UI |
| 2.4 | 문서 목록/검색/필터 | ✅ | 상태별(DRAFT/PENDING/APPROVED), 양식별, 날짜별 필터 동작. 페이징 포함 | 날짜 범위 필터(date_from/date_to) + DRAFT 문서 삭제 기능 추가 |
| 2.5 | 문서 PDF 출력 | ⏭️ | 추후 고려 - react에 이미 html2pdf.js 구현됨 (6.2 결정사항 #1 참고) |
3.3 Phase 3: 중간검사 양식 추가
| # | 작업 항목 | 상태 | 완료 기준 | 비고 |
|---|---|---|---|---|
| 3.1 | 중간검사 양식 구조 설계 | ⏳ | 절곡/스크린/슬랫/조인트바 4종의 검사항목/기준/판정방식 문서화 완료 | 5130 JSON 구조 분석 |
| 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+ 이미지 |
3.4 Phase 4: API 연동 및 mng JSON 화면 구현
| # | 작업 항목 | 상태 | 완료 기준 | 비고 |
|---|---|---|---|---|
| 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) | 협의 결과 문서화 |
3.5 Phase 5 (추후): 기타 문서 확장
| # | 작업 항목 | 상태 | 비고 |
|---|---|---|---|
| 5.1 | 제품검사 양식 | ⏳ | Phase 3 이후 |
| 5.2 | 작업일지 양식 | ⏳ | WorkLogContent 기반 |
| 5.3 | 견적서/거래명세서/발주서 양식 | ⏳ | 기존 문서 모달 분석 필요 |
4. 아키텍처 설계
4.1 시스템 흐름
[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 다운로드
4.2 JSON 응답 구조 (양식 상세)
{
"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": ["합격", "불합격"]
}
}
4.3 JSON 응답 구조 (문서 상세)
{
"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": "-" },
"판정": "적합"
}
}
]
}
],
"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" }
]
}
}
5. 5130 데이터 이관 계획
5.1 수입검사 자재 목록 (주요)
5130의 instock/fetch_inspection.php에서 자재코드별로 로딩하는 개별 페이지를 분석하여, 각 자재별 검사항목을 양식 시드 데이터로 변환한다.
| # | 자재 | 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 파일 | 다양 | 낮음 |
5.2 중간검사 이관 항목
| 검사 종류 | 5130 DB 필드 | 검사 항목 | 판정 방식 |
|---|---|---|---|
| 절곡품 | recordbendingMid (JSON) |
겉모양, 치수(높이/길이/간격), 가공상태 | 양호/불량 + 측정값 허용범위 |
| 스크린 | recordscreenMid (JSON) |
가공상태, 재봉상태, 조립상태, 길이, 나비, 간격 | 양호/불량 + OK/NG |
| 슬랫 | recordslatMid (JSON) |
절곡품과 유사 구조 | 양호/불량 + 측정값 |
| 조인트바 | recordjointbar (JSON) |
가공상태, 조립상태, 치수(높이1/높이2/길이/간격) | 양호/불량 + 측정값 허용치 |
5.3 검사 기준 이미지 이관
5130/img/inspection/ 디렉토리의 이미지를 mng storage로 이관:
jointbar_inspection.jpgscreen_inspection.jpgbending_inspection1.jpg,bending_inspection2.jpgslat_inspection.jpgguiderail_*(다수 변형)- 기타 17+ 이미지
6. 기술 결정사항
6.1 확정된 사항
| 항목 | 결정 | 이유 |
|---|---|---|
| 양식 관리 위치 | 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 컴포넌트 확장 |
6.2 검토 완료 사항 (2026-01-31 확정)
| # | 항목 | 결정 | 근거 |
|---|---|---|---|
| 1 | PDF 생성 | 추후 고려 | react에 이미 구현됨 (html2pdf.js + DocumentViewer). mng 단계에서는 PDF 불필요 |
| 2 | 검사 판정 로직 | 프론트에서 입력, 결과만 저장 | 양식이 검사항목/기준을 정의하고, 프론트에서 사용자가 입력. 저장 시 입력값+판정 결과를 그대로 저장. 별도 판정 엔진 불필요 |
| 3 | 양식 버전 관리 | 수정 시 새 버전 생성 | 요청마다 검사 기준이 다를 수 있으므로 버전 관리 필수. document_templates에 version 컬럼 추가 필요 |
| 4 | 기존 react 컴포넌트 전환 | 기존 react 미수정 | mng에서 JSON 기반 화면 구현까지만 개발. 이후 프론트엔드 담당자와 협의하여 react 전환 여부 결정 |
7. 컨펌 대기 목록
| # | 항목 | 변경 내용 | 영향 범위 | 상태 |
|---|---|---|---|---|
| 1 | API 엔드포인트 추가 | /api/v1/document-templates, /api/v1/documents |
api 저장소 | ⏳ Phase 4 전 |
| 2 | DB 마이그레이션 변경 여부 | 기존 테이블로 충분한지 vs version 컬럼 추가 필요 (6.2 #3 확정) | api 저장소 | ⏳ Phase 1 중 |
| 3 | - | ✅ 해결됨 (6.2 #2) | ||
| 4 | - | ✅ 해결됨 (6.2 #1) |
8. 변경 이력
📎 별도 파일로 관리:
document-management-system-changelog.md
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.php340-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.phpapi/database/migrations/2026_01_28_200000_create_documents_table.php
11. Phase별 상세 실행 절차
각 Phase 작업 시 이 섹션을 먼저 읽고 진행한다.
11.1 Phase 1.1 - 기존 document-templates 편집 UI 점검 및 보완
목표: mng.sam.kr/document-templates/{id}/edit에서 수입검사 양식에 필요한 모든 구성요소를 관리할 수 있는지 확인하고 부족한 부분을 보완한다.
사전 조건: 없음 (첫 번째 작업)
실행 절차:
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 삭제 확인
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(
iListhidden 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 - 수입검사 양식 시드 데이터 생성
실행 절차:
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 에서 목록 확인
└── 각 양식 편집 화면에서 데이터 정합성 확인
12. 자기완결성 점검 결과
12.1 체크리스트 검증
| # | 검증 항목 | 상태 | 비고 |
|---|---|---|---|
| 1 | 작업 목적이 명확한가? | ✅ | 섹션 1.1 배경 |
| 2 | 성공 기준이 정의되어 있는가? | ✅ | 각 Phase 작업 항목에 "완료 기준" 컬럼 추가됨 |
| 3 | 작업 범위가 구체적인가? | ✅ | 섹션 3 Phase 1-5 + 섹션 11 상세 절차 |
| 4 | 의존성이 명시되어 있는가? | ✅ | 기존 DB/모델/컨트롤러 현황 + 새 세션 가이드 |
| 5 | 참고 파일 경로가 정확한가? | ✅ | 절대 경로 + 상대 경로 모두 명시 |
| 6 | 단계별 절차가 실행 가능한가? | ✅ | 섹션 11 Phase별 Step-by-step 절차 |
| 7 | 검증 방법이 명시되어 있는가? | ✅ | 각 Phase 완료 기준에 검증 방법 포함 |
| 8 | 모호한 표현이 없는가? | ✅ | 구체적 파일/테이블/컬럼/URL 명시 |
12.2 새 세션 시뮬레이션 테스트
| 질문 | 답변 가능 | 참조 섹션 |
|---|---|---|
| Q1. 이 작업의 목적은 무엇인가? | ✅ | 1.1 배경 |
| 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 상세 실행 절차 추가, 컨펌 대기 목록 해결 항목 반영 |
이 문서는 /plan 스킬로 생성되었습니다.