From 7179c45512daa3e04345d55dc42b19ba75e7aaa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sun, 22 Mar 2026 19:24:36 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20[changes]=202026-03-22=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=9D=B4=EB=A0=A5=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=E2=80=94=2012=EA=B1=B4=20=EC=A2=85=ED=95=A9=20(?= =?UTF-8?q?=EC=9E=91=EC=97=85=EC=A0=95=EB=B3=B4=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EC=A0=80=EC=9E=A5,=20=EC=B6=9C=EA=B3=A0=20STOCK=20=EC=A0=9C?= =?UTF-8?q?=EC=99=B8,=20=EC=9E=AC=EA=B3=A0=EC=A1=B0=EC=A0=95,=20=EC=B5=9C?= =?UTF-8?q?=EC=A2=85=EC=9E=85=EC=B6=9C=EA=B3=A0=20=EC=BB=AC=EB=9F=BC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- INDEX.md | 2 +- ...oduction_material_document_improvements.md | 99 +++++++++++++------ 2 files changed, 72 insertions(+), 29 deletions(-) diff --git a/INDEX.md b/INDEX.md index 2476a1f..c7abdb0 100644 --- a/INDEX.md +++ b/INDEX.md @@ -317,7 +317,7 @@ DB 도메인별: | [20260321_process_parent_id_tree.md](changes/20260321_process_parent_id_tree.md) | 공정관리 parent_id 트리 구조 도입 (2depth, 작업자 화면 그룹 탭) | | [20260321_wip_inspection_report_fix.md](changes/20260321_wip_inspection_report_fix.md) | 재공품 검사성적서 검사부위 공백/도면치수/테스트입력 수정 | | [20260322_wip_worker_screen_improvements.md](changes/20260322_wip_worker_screen_improvements.md) | 재공품 작업자화면 종합 개선 (검사판정/작업일지/자재투입/재고유형) | -| [20260322_production_material_document_improvements.md](changes/20260322_production_material_document_improvements.md) | 생산관리 자재투입·문서·현황판 종합 개선 (7건) | +| [20260322_production_material_document_improvements.md](changes/20260322_production_material_document_improvements.md) | 생산관리 자재투입·문서·현황판·재고 종합 개선 (12건) | --- diff --git a/changes/20260322_production_material_document_improvements.md b/changes/20260322_production_material_document_improvements.md index f36c2e5..d62c5a2 100644 --- a/changes/20260322_production_material_document_improvements.md +++ b/changes/20260322_production_material_document_improvements.md @@ -1,11 +1,11 @@ -# 생산관리 자재투입·문서·현황판 종합 개선 +# 생산관리 자재투입·문서·현황판·재고 종합 개선 **날짜:** 2026-03-22 **작업자:** Claude Code ## 변경 개요 -재공품 자재 투입, 재고생산 품목코드, 수주서 절곡품 이미지, 생산현황판 탭 구조, 자재투입 배정 버그, 작업자화면 자동 완료 등 생산관리 전반 7건의 개선/수정 작업을 수행했다. +재공품 자재 투입, 재고생산 품목코드, 수주서 절곡품 이미지, 생산현황판 탭 구조, 자재투입 배정 버그, 작업자화면 자동 완료, 작업정보 자동저장, 출고관리 STOCK 제외, 재고조정 오류, 재고 최종입출고 컬럼 등 생산관리 전반 12건의 개선/수정 작업을 수행했다. --- @@ -18,23 +18,29 @@ | `app/Services/BendingCodeService.php` | `lengthCodeToMm()` public static 메서드 추가 | | `app/Services/Production/BendingInfoBuilder.php` | `buildDynamicBomForStockItem()` 신규 — STOCK용 dynamic_bom 생성 | | `app/Services/OrderService.php` | STOCK 확정 시 dynamic_bom 생성 블록 추가 | -| `app/Services/WorkOrderService.php` | STOCK 호환 fallback 추가 + `buildBendingImageUrls` public 변경 | -| `app/Services/QmsLotAuditService.php` | 수주서 bending_parts에 이미지 + bending_images 맵 포함 | +| `app/Services/WorkOrderService.php` | STOCK 호환 fallback + `buildBendingImageUrls` public 변경 | +| `app/Services/QmsLotAuditService.php` | 수주서 bending_parts 이미지 + bending_images 맵 포함 | +| `app/Services/ShipmentService.php` | 출고 목록/통계에서 STOCK 수주 제외 | +| `app/Services/StockService.php` | 재고조정 Item ID fallback + adjustments 동일 적용 | +| `app/Models/Tenants/Stock.php` | `last_receipt_date`/`last_issue_date` cast `date:Y-m-d` (UTC 변환 방지) | ### React (`sam/react`) | 파일 | 변경 내용 | |------|----------| -| `src/components/production/WorkerScreen/actions.ts` | `searchStockByCode` 필드 매핑 수정 + itemType 필터 + `StepProgressItem.work_order_status_changed` | -| `src/components/production/WorkerScreen/MaterialInputModal.tsx` | 재공품 원자재 필터 + 배정 뱃지 토글 + physicalAvail 교차추적 수정 + DEV 강제입고 | -| `src/components/production/WorkerScreen/index.tsx` | 탭 width 축소 + 자동 완료 감지 → 목록 새로고침 | -| `src/components/stocks/BendingLotForm.tsx` | `expectedItemCode` 상태 추가 — 품목코드 동적 반영 | -| `src/components/stocks/StockProductionList.tsx` | 품목코드 검색 + completed→'생산완료' 통일 | -| `src/components/stocks/StockProductionDetail.tsx` | completed→'생산완료' 통일 | +| `src/components/production/WorkerScreen/actions.ts` | `searchStockByCode` 필드 매핑 + itemType 필터 + `StepProgressItem.work_order_status_changed` + `updateWorkOrderInfo` | +| `src/components/production/WorkerScreen/MaterialInputModal.tsx` | 원자재 필터 + 배정 뱃지 토글 + physicalAvail 교차추적 + DEV 강제입고 | +| `src/components/production/WorkerScreen/index.tsx` | 탭 축소 + 자동 완료 + 작업정보 onChange 자동저장 + `saveWorkOrderField` | +| `src/components/stocks/BendingLotForm.tsx` | `expectedItemCode` — 품목코드 동적 반영 | +| `src/components/stocks/StockProductionList.tsx` | 품목코드 검색 + '생산완료' 통일 | +| `src/components/stocks/StockProductionDetail.tsx` | '생산완료' 통일 | | `src/components/orders/documents/SalesOrderDocument.tsx` | R2 bending_images 기반 이미지 연결 | | `src/components/orders/documents/OrderDocumentModal.tsx` | `bendingImages` prop 전달 | | `src/components/production/ProductionDashboard/index.tsx` | 절곡 탭 depth 구조 | -| `src/components/production/ProductionDashboard/types.ts` | `TabOption.children` 추가 | +| `src/components/production/ProductionDashboard/types.ts` | `TabOption.children` + `WorkOrder.assigneeId` | +| `src/components/material/StockStatus/StockStatusList.tsx` | 최종 입출고 컬럼 + 날짜 기준 정렬 | +| `src/components/material/StockStatus/types.ts` | `StockItem.lastTransactionDate` 필드 | +| `src/components/material/StockStatus/actions.ts` | `lastTransactionDate` 계산 (receipt/issue 최신) | --- @@ -48,47 +54,79 @@ ### 2. 재고생산 품목코드 동적 반영 -- `expectedItemCode` 상태 추가: 품목 선택 시 즉시 품목코드 input에 반영 -- 저장 시 `resolvedItem?.item_code || expectedItemCode` fallback 적용 +- `expectedItemCode` 상태: 품목 선택 시 즉시 품목코드 input에 반영 +- 저장 시 `resolvedItem?.item_code || expectedItemCode` fallback - 수정 화면 진입 시 `initialData.items[0].itemCode`로 초기화 - 재고생산 목록 검색에 품목코드 필터 추가 -- `completed` 상태 라벨을 '생산완료'로 통일 (목록 + 상세) +- `completed` 상태 라벨을 '생산완료'로 통일 ### 3. STOCK 작업지시 dynamic_bom 생성 -- `BendingInfoBuilder::buildDynamicBomForStockItem()`: bending_lot 정보 + partKey → BD 코드 → item_id → DynamicBomEntry 생성 +- `BendingInfoBuilder::buildDynamicBomForStockItem()`: bending_lot + partKey → BD 코드 → DynamicBomEntry - `OrderService::confirmAndCreateWorkOrders()`: STOCK 확정 시 자동 호출 - `WorkOrderService`: 기존 STOCK 호환 fallback (bending_lot.material 기반 RM 검색) -- `BendingCodeService::lengthCodeToMm()`: 길이코드→mm 변환 공유 메서드 +- `BendingCodeService::lengthCodeToMm()`: 길이코드→mm 변환 공유 ### 4. 수주서 절곡품 이미지 연동 -- `QmsLotAuditService::getBendingGroupImages()`: bending_items의 files 기반 이미지 조회 -- `bending_images` 맵 (R2 presigned URL): `WorkOrderService::buildBendingImageUrls()` 공유 -- `SalesOrderDocument`: `getBendingImageUrl()` 유틸로 R2 이미지 맵 사용 +- R2 bending_images 맵: `WorkOrderService::buildBendingImageUrls()` 공유 (작업일지와 동일 소스) +- `SalesOrderDocument`: `getBendingImageUrl()` 유틸로 productCode 기반 정확한 이미지 매칭 - 가이드레일/케이스/하단마감재/연기차단재 모든 위치에 실제 이미지 표시 -- 인증 문제 해결: `image_file_id` → `/api/proxy/files/{id}/view` 프록시 경유 +- 인증 문제 해결: `/api/proxy/files/{id}/view` 프록시 경유 ### 5. 생산현황판 탭 depth 구조 -- 절곡 계열 공정(P-003~P-007)을 부모(절곡) + 하위(가이드레일/케이스/하단마감재/기타) 그룹화 +- 절곡 계열 공정(P-003~P-007)을 부모(절곡) + 하위 그룹화 - `TabOption.children` 필드 추가 - 재공품 라벨 간소화: "절곡 (재공품-가이드레일)" → "가이드레일" - 작업자화면 탭 width 축소 (`md:w-full` → `w-max`) ### 6. 자재투입 자동입력 배정수량 버그 수정 -- **원인**: 같은 물리 LOT가 다른 BOM 그룹(상부덮개/마구리)에서 사용될 때 `physicalUsed` 교차 추적에서 `lotInputtedQty`가 그룹마다 달라 부정확한 차감 발생 -- **수정**: `physicalAvail = lotAvailableQty + SUM(모든 그룹의 lotInputtedQty)`로 초기화 +- **원인**: 같은 물리 LOT가 다른 BOM 그룹에서 사용될 때 `lotInputtedQty`가 그룹마다 달라 부정확한 교차 차감 +- **수정**: `physicalAvail = lotAvailableQty + SUM(모든 그룹의 lotInputtedQty)` - 배정완료 뱃지 클릭 → 미배정 그룹만 토글 필터 - 배정 미완료 그룹에서만 DEV 강제입고 버튼 표시 ### 7. 작업자화면 전 공정 자동 완료 처리 -- `StepProgressItem`에 `work_order_status_changed` 필드 추가 -- `handleStepClick`: 단계 토글 후 자동 완료 감지 → 작업 목록 새로고침 + 토스트 -- `handleInspectionComplete`: 검사 완료 후에도 자동 완료 토스트 표시 -- 슬랫/스크린/절곡 모든 공정에 동일 적용 (백엔드 `autoCompleteWorkOrderIfAllStepsDone` 연동) +- `StepProgressItem.work_order_status_changed` 필드 추가 +- `handleStepClick`: 자동 완료 감지 → 목록 새로고침 + 토스트 +- `handleInspectionComplete`: 검사 완료 후에도 자동 완료 토스트 +- 슬랫/스크린/절곡 모든 공정에 동일 적용 + +### 8. 작업정보 onChange 자동 저장 + +- `saveWorkOrderField` 헬퍼: API 저장 + `workOrders` state 동시 동기화 +- 부서 변경 → `team_id` 즉시 저장 +- 담당자 변경 → `assignee_id` 즉시 저장 +- 생산일자 변경 → `scheduled_date` 즉시 저장 +- 작업지시 전환 시 저장된 값 복원 (`assigneeId` 포함) +- `useEffect` 의존성 정리: 사용자 수정값이 덮어쓰이지 않도록 개선 + +### 9. 생산일자 자동 저장 (3개 시점) + +- **단계 완료 시**: 생산일자가 비어있으면 오늘 날짜로 자동 저장 +- **검사 완료 시**: 항상 오늘 날짜로 저장 +- **전체 완료 시**: 항상 오늘 날짜로 저장 + +### 10. 출고관리 STOCK 제외 + +- `ShipmentService::index()`: `whereDoesntHave('order', STOCK)` 조건 추가 +- `ShipmentService::stats()`: 모든 통계 쿼리에 동일 조건 적용 +- 재공품 수주의 출고가 목록/통계에서 제외 + +### 11. 재고 조정 Item ID 호환 + +- **원인**: 재고 목록 API가 Item ID를 반환하는데, 재고조정 API는 Stock ID 기대 → 404 에러 +- **수정**: `adjustments()`/`createAdjustment()`에서 Stock ID 검색 실패 시 `item_id`로 재검색 + +### 12. 재고 현황 최종 입출고 컬럼 + UTC 수정 + +- `StockItem.lastTransactionDate`: `last_receipt_date`/`last_issue_date` 중 최신 표시 +- 테이블에 '최종 입출고' 컬럼 추가 +- 기본 정렬: 최종 입출고 일자 내림차순 (최신 거래가 위) +- **UTC 변환 오류 수정**: Stock 모델의 date cast를 `date:Y-m-d`로 변경 → JSON 직렬화 시 UTC 변환 없이 날짜 문자열만 반환 (한국시간 3/22가 UTC 3/21로 표시되던 문제 해결) --- @@ -104,6 +142,11 @@ - [x] 자재투입 자동입력 배정수량 정확성 - [x] 배정완료 뱃지 토글 필터 - [x] 작업자화면 단계 완료 시 자동 완료 전환 +- [x] 작업정보 onChange 자동 저장 (부서/담당자/생산일자) +- [x] 출고관리에서 STOCK 수주 제외 +- [x] 재고 조정 등록 정상 동작 +- [x] 재고 현황 최종 입출고 컬럼 표시 +- [x] 최종 입출고 일자 한국시간 정확 표시 - [ ] 연기차단재 이미지 (기초관리에 데이터 등록 필요) - [ ] 실제 운영 데이터로 자동 완료 흐름 검증 @@ -111,7 +154,7 @@ ## 관련 문서 -- `rules/wip-production-policy.md` — 재공품 생산 정책 +- `rules/wip-production-policy.md` — 재공품 생산 정책 (자재 매칭/자동 완료 섹션 추가됨) - `frontend/api-specs/stock-production-api.md` — 재고생산 API 명세 - `frontend/api-specs/bending-lot-api.md` — 절곡품 LOT API