diff --git a/plans/document-management-system-changelog.md b/plans/document-management-system-changelog.md index 2116121..3765ace 100644 --- a/plans/document-management-system-changelog.md +++ b/plans/document-management-system-changelog.md @@ -19,4 +19,5 @@ | 2026-01-31 | Phase 2.2 완료 | 문서 데이터 입력 UI. ①섹션별 동적 검사 테이블 렌더링(complex/select/check/measurement/text 컬럼 타입 지원) ②서브 라벨 행(complex 컬럼의 n1/n2/n3) ③정적 컬럼 자동 매핑(NO/검사항목/검사기준/검사방식/검사주기→item속성) ④종합판정+비고 Footer ⑤JS 폼 데이터 수집(기본필드+섹션데이터+체크박스) ⑥백엔드 saveDocumentData() 공통 메서드(section_id/column_id/row_index EAV 저장) | 섹션 3.2 | - | | 2026-01-31 | Phase 2.3 완료 | 결재 워크플로우. ①API: submit(DRAFT→PENDING), approve(단계별 승인, 전체 완료 시 APPROVED), reject(반려 사유 필수, REJECTED) ②edit.blade: 결재 제출 버튼 + JS ③show.blade: 승인/반려 버튼, 반려 모달, 결재 현황 속성 수정(step/role/acted_at), 상태 배지 CSS ④재제출 시 결재라인 상태 초기화 ⑤라우트: submit/approve/reject 3개 추가 | 섹션 3.2 | - | | 2026-01-31 | Phase 2.4 완료 | 문서 목록/검색/필터. ①날짜 범위 필터(date_from/date_to) API + UI 추가 ②DRAFT 문서 삭제 버튼 + deleteDocument() JS (showDeleteConfirm + fetch DELETE) ③기존 구현 확인: 상태/템플릿/검색/페이징 정상 동작 | 섹션 3.2 | - | -| 2026-01-31 | Phase 3.1 완료 | 중간검사 양식 구조 설계. ①5130 레거시 4종(절곡/스크린/슬랫/조인트바) viewMidInspect*.php 전체 분석 ②검사항목·기준·판정방식·공차·이미지 문서화 ③컬럼 구조(check/complex/select) 매핑 설계 ④4종 비교표 + 양식 시스템 매핑 전략(Option A/B/C) ⑤공통 구조(결재3단계, 기본필드7개, Footer) 정의 | 섹션 5.2 | - | \ No newline at end of file +| 2026-01-31 | Phase 3.1 완료 | 중간검사 양식 구조 설계. ①5130 레거시 4종(절곡/스크린/슬랫/조인트바) viewMidInspect*.php 전체 분석 ②검사항목·기준·판정방식·공차·이미지 문서화 ③컬럼 구조(check/complex/select) 매핑 설계 ④4종 비교표 + 양식 시스템 매핑 전략(Option A/B/C) ⑤공통 구조(결재3단계, 기본필드7개, Footer) 정의 | 섹션 5.2 | - | +| 2026-01-31 | Phase 3.2 완료 | 5130 중간검사 데이터 이관 설계. ①JSON 공통 배열 구조 분석([0]결재/[1]입력값/[2]num/[3]table/[4]log/[5]checkbox) ②JSON→EAV 매핑 테이블(결재→document_approvals, 기본필드/측정값/체크박스→document_data) ③데이터 변환 규칙(날짜mm/dd→datetime, boolean→string, 이름→user_id) ④6단계 이관 프로세스 설계 ⑤절곡품 inputValue named object vs 나머지 flat array 차이 문서화 ⑥주의사항 5건 | 섹션 5.3 | - | \ No newline at end of file diff --git a/plans/document-management-system-plan.md b/plans/document-management-system-plan.md index b1860b5..e7afd06 100644 --- a/plans/document-management-system-plan.md +++ b/plans/document-management-system-plan.md @@ -106,9 +106,9 @@ Route::resource('documents', DocumentController::class); // /d | 항목 | 내용 | |------|------| -| **마지막 완료 작업** | Phase 3.1 - 중간검사 양식 구조 설계 (4종 검사항목/기준/판정방식 문서화) | -| **다음 작업** | Phase 3.2 - 5130 중간검사 데이터 이관 설계 | -| **진행률** | 10/20 (50%) - Phase 1 ✅, Phase 2.1~2.4 ✅, Phase 3.1 ✅ | +| **마지막 완료 작업** | Phase 3.2 - 5130 중간검사 데이터 이관 설계 (JSON→EAV 매핑 테이블 + 이관 프로세스) | +| **다음 작업** | Phase 3.3 - 중간검사 양식 시드 데이터 | +| **진행률** | 11/20 (55%) - Phase 1 ✅, Phase 2.1~2.4 ✅, Phase 3.1~3.2 ✅ | | **마지막 업데이트** | 2026-01-31 | --- @@ -286,7 +286,7 @@ documents # 문서 인스턴스 | # | 작업 항목 | 상태 | 완료 기준 | 비고 | |---|----------|:----:|----------|------| | 3.1 | 중간검사 양식 구조 설계 | ✅ | 절곡/스크린/슬랫/조인트바 4종의 검사항목/기준/판정방식 문서화 완료 | 섹션 5.2에 상세 설계. 절곡품 최고 복잡도(★5), 조인트바 최저(★1) | -| 3.2 | 5130 중간검사 데이터 이관 설계 | ⏳ | recordbendingMid 등 JSON→양식 매핑 테이블 완성 | | +| 3.2 | 5130 중간검사 데이터 이관 설계 | ✅ | recordbendingMid 등 JSON→양식 매핑 테이블 완성 | 섹션 5.3에 상세 설계. 6단계 이관 프로세스, 변환 규칙, 주의사항 문서화 | | 3.3 | 중간검사 양식 시드 데이터 | ⏳ | 4종 양식 seeder 생성, `mng.sam.kr/document-templates`에서 확인 가능 | | | 3.4 | 검사 기준 이미지 관리 | ⏳ | `5130/img/inspection/` 이미지 → `mng/storage/app/public/inspection/`로 이관. 양식에서 참조 가능 | 20+ 이미지 | @@ -697,7 +697,138 @@ Document 생성/관리 ------------> POST /documents/{id}/submit 결재 4. **check 컬럼 타입**: 현재 시스템에 `check` 컬럼 타입이 이미 존재. 양호/불량 체크박스로 사용 가능. -### 5.3 검사 기준 이미지 이관 +### 5.3 중간검사 데이터 이관 설계 (Phase 3.2) + +> **5130 JSON 구조 → 새 양식 시스템(EAV) 매핑** + +#### 5.3.1 5130 JSON 공통 배열 구조 + +4종 모두 동일한 배열 인덱스 패턴: + +``` +recordXxxMid = [ + [0]: { approval: { writer: {name,date}, reviewer: {name,date}, approver: {name,date} } } + [1]: { inputValue: { ... } } ← 절곡: named object / 스크린·슬랫·조인트바: flat array + [2]: { num: "주문번호" } + [3]: { tablename: "output" } + [4]: { update_log: "..." } ← 슬랫·조인트바는 없음 + [5]: { checkboxData: [ {good:[], bad:[], judgement:""}, ... ] } ← 슬랫·조인트바는 [4] +] +``` + +#### 5.3.2 JSON → EAV 매핑 테이블 + +**결재 데이터 (JSON[0] → document_approvals)** + +| JSON 경로 | EAV 대상 | 비고 | +|-----------|---------|------| +| `[0].approval.writer.name` | `document_approvals` (step=1, user→name) | 작성자 | +| `[0].approval.writer.date` | `document_approvals` (step=1, acted_at) | mm/dd → datetime | +| `[0].approval.reviewer.name` | `document_approvals` (step=2, user→name) | 검토자 | +| `[0].approval.reviewer.date` | `document_approvals` (step=2, acted_at) | mm/dd → datetime | +| `[0].approval.approver.name` | `document_approvals` (step=3, user→name) | 승인자 | +| `[0].approval.approver.date` | `document_approvals` (step=3, acted_at) | mm/dd → datetime | + +**기본필드 (JSON[1].inputValue → document_data, section_id=null)** + +| JSON 경로 | field_key | 비고 | +|-----------|----------|------| +| `[1].inputValue.inspectdate` | `basic_inspectdate` | 검사일자 | +| `[1].inputValue.reviewer_sub` | `basic_reviewer` | 검사자 | +| `[1].inputValue.*_false_comment` | `footer_remark` | 부적합 내용 | +| `[1].inputValue.resultJudgement` | `footer_judgement` | 종합판정 | + +**절곡품 측정 데이터 (JSON[1].inputValue → document_data)** + +| JSON 경로 | field_key 패턴 | 비고 | +|-----------|---------------|------| +| `[1].inputValue.lengthMeasurement[i]` | `s{섹션}_r{i}_length` | 길이 측정값 | +| `[1].inputValue.widthMeasurement[i]` | `s{섹션}_r{i}_width` | 너비 측정값 | +| `[1].inputValue.gapMeasurement[i]` | `s{섹션}_r{i}_gap_{point}` | 간격 측정값 (포인트별) | + +**스크린/슬랫/조인트바 측정 데이터 (JSON[1].inputValue → document_data)** + +| JSON 경로 | field_key 패턴 | 비고 | +|-----------|---------------|------| +| `[1].inputValue[n]` (col{row}_input_{dim}) | `s{섹션}_r{row}_c{col}_sub{dim}` | 순차 인덱스 → 행·컬럼 매핑 | + +**체크박스 데이터 (JSON[5/4].checkboxData → document_data)** + +| JSON 경로 | field_key 패턴 | 비고 | +|-----------|---------------|------| +| `checkboxData[row].good[col]` | `s{섹션}_r{row}_c{checkCol}_good` | 양호 체크 | +| `checkboxData[row].bad[col]` | `s{섹션}_r{row}_c{checkCol}_bad` | 불량 체크 | +| `checkboxData[row].judgement` | `s{섹션}_r{row}_judgement` | 행별 판정 (적/부) | + +#### 5.3.3 이관 시 데이터 변환 규칙 + +| 변환 항목 | 5130 형식 | 새 시스템 형식 | 변환 로직 | +|----------|----------|-------------|----------| +| 날짜 (결재) | `"1/31"` (mm/dd) | `datetime` | 연도 추정 필요 (output.indate 기준) | +| 날짜 (검사) | `"2026-01-31"` | `date` | 그대로 사용 | +| 체크박스 | `true/false` | `"1"/"0"` | boolean → string | +| 판정 | `"적"/"부"` | `"적"/"부"` | 그대로 사용 | +| 종합판정 | `"합격"/"불합격"` | `"합격"/"불합격"` | 그대로 사용 | +| 측정값 | `number/string` | `string` | EAV field_value는 string | +| 결재자 이름 | `string` | `user_id (FK)` | 이름→사용자 테이블 매칭 필요 | + +#### 5.3.4 이관 프로세스 설계 + +``` +Step 1: output 테이블에서 recordXxxMid IS NOT NULL 레코드 추출 + ↓ +Step 2: 각 레코드에 대해 해당 양식 템플릿 매핑 + - recordbendingMid → 절곡품 중간검사 양식 (template_id) + - recordscreenMid → 스크린 중간검사 양식 + - recordslatMid → 슬랫 중간검사 양식 + - recordjointbar → 조인트바 중간검사 양식 + ↓ +Step 3: documents 테이블에 문서 생성 + - template_id, tenant_id, document_no (MID-YYMMDD-NN) + - title: "{양식명} - {현장명}" + - status: APPROVED (이미 완료된 검사) + - created_at: output.indate 기준 + ↓ +Step 4: document_approvals 생성 + - JSON[0].approval → 3개 결재 레코드 + - 이름→user_id 매칭 (매칭 실패 시 created_by = system) + - status: APPROVED, acted_at: 변환된 날짜 + ↓ +Step 5: document_data (EAV) 생성 + - 기본필드: inspectdate, reviewer → field_key 매핑 + - 체크박스: checkboxData → good/bad/judgement 매핑 + - 측정값: inputValue → 행·컬럼 인덱스 매핑 + - Footer: false_comment → footer_remark, resultJudgement → footer_judgement + ↓ +Step 6: 검증 + - 원본 JSON과 변환 결과 대조 + - 종합판정·행별 판정 일치 확인 +``` + +#### 5.3.5 이관 대상 규모 추정 + +| 검사 종류 | DB 필드 | 조건 | 비고 | +|----------|---------|------|------| +| 절곡품 | recordbendingMid | IS NOT NULL AND != '' AND != '{}' | output 테이블 | +| 스크린 | recordscreenMid | 동일 | output 테이블 | +| 슬랫 | recordslatMid | 동일 | output 테이블 | +| 조인트바 | recordjointbar | 동일 | output 테이블 | + +> ⚠️ 실제 레코드 수는 5130 DB 조회 필요 (Phase 3.2 완료 기준 설계만 완성, 실행은 Phase 4 이후) + +#### 5.3.6 이관 시 주의사항 + +1. **절곡품 inputValue 구조 차이**: 절곡품만 named object (`lengthMeasurement[]`, `widthMeasurement[]`, `gapMeasurement[]`), 나머지 3종은 flat array. 이관 스크립트에서 분기 처리 필요. + +2. **update_log 유무**: 스크린만 별도 `update_log` 컬럼 업데이트. 슬랫·조인트바는 JSON 내부에만 포함 (실제로는 비어있을 수 있음). + +3. **결재자 이름 매칭**: 5130의 결재자는 문자열 이름만 저장. 새 시스템의 user_id(FK)로 변환 시 users 테이블에서 name 매칭 필요. 동명이인 주의. + +4. **행 수 불일치 가능성**: 5130에서 발주 제품 수에 따라 행이 동적 생성됨. 이관 시 원본 행 수 보존 필요. + +5. **이미지 참조**: 5130 JSON에는 이미지 참조명(`guiderail_wall_mid` 등)이 포함됨. 이관 시 새 시스템의 이미지 경로로 변환 필요. + +### 5.4 검사 기준 이미지 이관 `5130/img/inspection/` 디렉토리의 이미지를 mng storage로 이관: - `jointbar_inspection.jpg`