docs:Phase 3.2 완료 - 5130 중간검사 JSON→EAV 이관 설계 (진행률 55%)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-31 08:28:41 +09:00
parent c1de7ebfc1
commit 1d43bd1cdf
2 changed files with 138 additions and 6 deletions

View File

@@ -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`