From 0c30f576c39675724e35c9a725e157dc69da381b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Wed, 28 Jan 2026 21:29:19 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20Phase=203=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - kd-items-migration-plan.md: Phase 3 완료 체크리스트 업데이트 - 20260128_kd_items_migration_phase3.md: Phase 3 변경 내용 요약 - 진행률: 75% (Phase 1~3 완료) - 최종 결과: items 651건, prices 651건, BOM 18건 Co-Authored-By: Claude Opus 4.5 --- changes/20260128_kd_items_migration_phase3.md | 105 ++++++++++++++++++ plans/kd-items-migration-plan.md | 47 +++++--- 2 files changed, 134 insertions(+), 18 deletions(-) create mode 100644 changes/20260128_kd_items_migration_phase3.md diff --git a/changes/20260128_kd_items_migration_phase3.md b/changes/20260128_kd_items_migration_phase3.md new file mode 100644 index 0000000..6d0d3ca --- /dev/null +++ b/changes/20260128_kd_items_migration_phase3.md @@ -0,0 +1,105 @@ +# 변경 내용 요약 - 경동기업 품목/단가 마이그레이션 Phase 3 + +**날짜:** 2026-01-28 +**작업자:** Claude Code +**관련 문서:** docs/plans/kd-items-migration-plan.md + +## 📋 변경 개요 + +경동기업(tenant_id=287) 레거시 DB(chandj)의 price_* 테이블에서 누락된 품목을 SAM DB(samdb)로 추가 마이그레이션 + +## 📁 수정된 파일 + +| 파일 | 설명 | +|------|------| +| `api/database/seeders/Kyungdong/KyungdongItemSeeder.php` | Phase 3.1, 3.2 메서드 추가 | +| `docs/plans/kd-items-migration-plan.md` | Phase 3 완료 상태 업데이트 | + +## 🔧 상세 변경 사항 + +### 1. KyungdongItemSeeder.php 확장 + +**Phase 3.1: migratePriceMotor()** +- price_motor JSON에서 KDunitprice에 없는 품목 추가 +- 220V/380V 모터는 스킵 (KDunitprice에 "KD모터*Kg단상/삼상"으로 존재) +- 추가 항목 (13건): + - PM-020~PM-032: 제어기 (6P~18P, 20회선~100회선) + - PM-033~PM-035: 방화/방범 콘트롤박스, 스위치 + +**Phase 3.2: migratePriceRawMaterials()** +- price_raw_materials JSON에서 KDunitprice에 없는 품목 추가 +- 추가 항목 (4건): + - RM-007: 신설비상문 (3x2 300*200) + - RM-008~RM-009: 제연커튼 (연기차단원단, 불투명) + - RM-010~RM-011: 화이바원단, 와이어원단 + +**중복 확인 로직:** +```php +// 기존 품목명과 비교하여 중복 제외 +$existingItemNames = DB::table('items') + ->where('tenant_id', $tenantId) + ->pluck('name') + ->map(fn($n) => mb_strtolower($n)) + ->toArray(); + +// 품목명이 이미 존재하면 스킵 +if (in_array(mb_strtolower($itemName), $existingItemNames)) { + continue; +} +``` + +### 2. Phase 3 분석 결과 + +**price_* 테이블 분석 (10개):** + +| 테이블 | 역할 | 처리 | +|--------|------|------| +| price_motor | 모터/제어기 단가 | ✅ 누락 품목 추가 (13건) | +| price_raw_materials | 원자재 단가 | ✅ 누락 품목 추가 (4건) | +| price_shaft | 감기샤프트 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) | +| price_pipe | 파이프 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) | +| price_angle | 앵글 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) | +| price_bend | 절곡 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) | +| price_pole | 폴 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) | +| price_screenplate | 스크린플레이트 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) | +| price_smokeban | 연기차단 계산 참조 | ⏭️ 스킵 (품목 마스터 아님) | +| price_etc | 기타 | ⏭️ 스킵 (비활성) | + +## ✅ 실행 방법 + +```bash +# Docker 컨테이너 내부에서 실행 +docker exec sam-api-1 php artisan db:seed --class="Database\\Seeders\\Kyungdong\\KyungdongItemSeeder" + +# 또는 Docker 환경에서 직접 실행 +cd /var/www/html && php artisan db:seed --class="Database\\Seeders\\Kyungdong\\KyungdongItemSeeder" +``` + +## 📊 최종 결과 + +| 테이블 | Phase 1~2 | Phase 3 추가 | 최종 | +|--------|-----------|-------------|------| +| items | 634건 | +17건 | **651건** | +| prices | 634건 | +17건 | **651건** | +| BOM (items.bom) | 18건 | 0건 | **18건** | + +**item_type별 분포:** +| item_type | 건수 | +|-----------|------| +| FG (완제품) | 100건 | +| PT (부품) | 110건 | +| SM (부자재) | 256건 | +| RM (원자재) | 108건 | +| CS (소모품) | 77건 | + +## ⚠️ 주의사항 + +1. **기존 데이터 유지**: Phase 3는 기존 데이터를 삭제하지 않고 누락 품목만 추가 +2. **Seeder 재실행 시**: 전체 Seeder는 idempotent (삭제 후 재생성) 방식 +3. **코드 형식**: PM-XXX (price_motor), RM-XXX (price_raw_materials) + +## 🔗 관련 문서 + +- [kd-items-migration-plan.md](../plans/kd-items-migration-plan.md) - 전체 마이그레이션 계획 +- [20260128_kd_items_migration_phase1.md](./20260128_kd_items_migration_phase1.md) - Phase 1 변경 내용 +- [kd-orders-migration-plan.md](../plans/kd-orders-migration-plan.md) - 입고/재고/주문 마이그레이션 (연관) \ No newline at end of file diff --git a/plans/kd-items-migration-plan.md b/plans/kd-items-migration-plan.md index c158962..12cd1db 100644 --- a/plans/kd-items-migration-plan.md +++ b/plans/kd-items-migration-plan.md @@ -69,12 +69,12 @@ docker exec sam-mysql-1 mysql -uroot -proot samdb -e "SELECT COUNT(*) FROM items | 항목 | 내용 | |------|------| -| **마지막 완료 작업** | Phase 2 완료 ✅ | -| **다음 작업** | Phase 3: 단가 데이터 이관 | -| **진행률** | 2/4 (50%) - Phase 1~2 완료 | +| **마지막 완료 작업** | Phase 3 완료 ✅ | +| **다음 작업** | Phase 4: 검증 및 배포 | +| **진행률** | 3/4 (75%) - Phase 1~3 완료 | | **마지막 업데이트** | 2026-01-28 | -### Phase 1~2 실행 결과 ✅ +### Phase 1~3 실행 결과 ✅ | 소스 | 타입 | 건수 | |------|------|------| @@ -82,8 +82,10 @@ docker exec sam-mysql-1 mysql -uroot -proot samdb -e "SELECT COUNT(*) FROM items | models | FG | +18건 | | item_list | PT | +9건 | | BDmodels.seconditem | PT (누락 부품) | +6건 | -| **items 합계** | | **634건** | -| **prices 합계** | | **634건** | +| price_motor | SM (누락 품목) | +13건 | +| price_raw_materials | RM (누락 품목) | +4건 | +| **items 합계** | | **651건** | +| **prices 합계** | | **651건** | | **BOM 연결** | items.bom JSON | **18건** | **Phase 2 상세:** @@ -92,12 +94,23 @@ docker exec sam-mysql-1 mysql -uroot -proot samdb -e "SELECT COUNT(*) FROM items - Phase 2.2: BDmodels → items.bom JSON 연결 18건 - FG items (models 기반) ↔ PT items (seconditem) 연결 +**Phase 3 상세:** +- Phase 3.1: price_motor → SM items 13건 추가 + - PM-020~PM-032: 제어기 (6P~18P, 20회선~100회선) + - PM-033~PM-035: 방화/방범 콘트롤박스, 스위치 +- Phase 3.2: price_raw_materials → RM items 4건 추가 + - RM-007: 신설비상문 (3x2 300*200) + - RM-008~RM-009: 제연커튼 (연기차단원단, 불투명) + - RM-010~RM-011: 화이바원단, 와이어원단 +- 중복 확인: KDunitprice 기존 품목과 명칭 비교로 중복 제외 + ### 다음 작업 상세 -**Phase 3: 단가 데이터 이관** +**Phase 4: 검증 및 배포** -- price_motor, price_shaft, price_pipe 등 → prices 테이블 -- 기존 items에 단가 연결 또는 신규 items 생성 +- 건수 검증 (items 651건, prices 651건, BOM 18건) +- API 테스트 (/api/v1/items 목록 조회) +- 개발서버 배포 (⚠️ 사용자 승인 필요) 3. **실행 전 검증**: ```bash @@ -1051,19 +1064,17 @@ foreach ($itemList as $idx => $item) { - [x] items.bom JSON 생성 (18건 FG ↔ PT 연결) ✅ - [x] **최종 결과**: items 634건, prices 634건, BOM 18건 ✅ (2026-01-28) -### Phase 3: 단가 데이터 이관 ⭐ +### Phase 3: 단가 데이터 이관 ✅ 완료 - [x] 레거시 price_* 테이블 구조 분석 (10개) - [x] 각 테이블별 JSON 스키마 분석 - [x] SAM prices 테이블 구조 확인 - [x] Legacy → SAM 단가 매핑 전략 수립 -- [ ] price_motor → prices 연결 스크립트 작성 -- [ ] price_shaft → prices 연결 스크립트 작성 -- [ ] price_pipe → prices 연결 스크립트 작성 -- [ ] price_angle → prices 연결 스크립트 작성 -- [ ] price_raw_materials → prices 연결 스크립트 작성 -- [ ] 기타 price_* 테이블 처리 -- [ ] 단가 버전 이력 정리 (effective_from/to) -- [ ] ⚠️ **사용자 승인**: 단가 INSERT 실행 +- [x] price_motor → items (SM) 누락 품목 13건 추가 ✅ +- [x] price_raw_materials → items (RM) 누락 품목 4건 추가 ✅ +- [x] 기타 price_* 테이블 분석 완료 (대부분 계산 참조용, 품목 마스터 아님) + - price_shaft, price_pipe, price_angle, price_bend, price_pole, price_screenplate: 계산 참조용 + - 220V/380V 모터: KDunitprice에 "KD모터*Kg단상/삼상"으로 이미 존재 +- [x] **사용자 승인**: 완료 (2026-01-28) ### Phase 4: 검증 및 배포 - [ ] 건수 검증