From 68c0494673ccf2cc80263764a77c95b0076d3614 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sat, 21 Mar 2026 17:51:09 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[bending]=20STOCK=20=EC=9E=91=EC=97=85?= =?UTF-8?q?=EC=A7=80=EC=8B=9C=20=EB=8B=A8=EC=9D=BC=EB=B6=80=ED=92=88=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=EB=A7=81=20=EC=A7=80=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - buildStockBendingInfoFromLot()에 isStockProduction 플래그 추가 - fillStockBendingInfo()에서 work_order_items 부품명 파싱하여 stockPartFilter 저장 - parseStockPartKey()로 품목명에서 부품키 추출 (본체/C형/D형/마감재 등) - 기존 작업지시 194~196 stockPartFilter 백필 완료 --- app/Services/OrderService.php | 8 +++++ app/Services/WorkOrderService.php | 49 +++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index 919395db..8d71fe81 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -1614,6 +1614,13 @@ public function createProductionOrder(int $orderId, array $data) $orderOptions['target_stock_qty'] ?? $order->quantity ?? 1 ); if ($stockBendingInfo) { + // STOCK 부품 필터 정보 추가 + $stockBendingInfo['stockPartFilter'] = collect($items)->map(function ($item) { + return [ + 'itemName' => $item->item_name, + 'partKey' => \App\Services\WorkOrderService::parseStockPartKeyStatic($item->item_name), + ]; + })->values()->toArray(); $workOrderOptions = array_merge($workOrderOptions ?? [], ['bending_info' => $stockBendingInfo]); } } @@ -2258,6 +2265,7 @@ private static function buildStockBendingInfoFromLot(array $bendingLot, int $qua 'productCode' => $productCode, 'finishMaterial' => $finishMaterial, 'common' => ['type' => $guideType], + 'isStockProduction' => true, ]; // 가이드레일 (R=벽면, S=측면) diff --git a/app/Services/WorkOrderService.php b/app/Services/WorkOrderService.php index 7f0806a5..6847ebe1 100644 --- a/app/Services/WorkOrderService.php +++ b/app/Services/WorkOrderService.php @@ -216,6 +216,17 @@ private function fillStockBendingInfo(WorkOrder $workOrder): void ); if ($stockBendingInfo) { + // work_order_items에서 부품명 추출하여 필터 정보 추가 + $items = $workOrder->items ?? collect(); + if ($items->isNotEmpty()) { + $stockBendingInfo['stockPartFilter'] = $items->map(function ($item) { + return [ + 'itemName' => $item->item_name, + 'partKey' => self::parseStockPartKey($item->item_name), + ]; + })->values()->toArray(); + } + $opts = $workOrder->options ?? []; $opts['bending_info'] = $stockBendingInfo; $workOrder->options = $opts; @@ -223,6 +234,44 @@ private function fillStockBendingInfo(WorkOrder $workOrder): void } } + /** + * STOCK 품목명에서 부품 키 추출 + * + * "가이드레일(측면) 본체(철재) 2438mm" → "본체" + * "가이드레일(측면) C형 1219mm" → "C형" + */ + public static function parseStockPartKeyStatic(string $itemName): string + { + return self::parseStockPartKey($itemName); + } + + private static function parseStockPartKey(string $itemName): string + { + // "본체", "C형", "D형", "마감재", "별도마감", "BASE" 등 추출 + $patterns = [ + '/본체/' => '본체', + '/C형/' => 'C형', + '/D형/' => 'D형', + '/별도마감/' => '별도마감', + '/마감재/' => '마감재', + '/BASE/i' => 'BASE', + '/하단마감/' => '하단마감재', + '/전면판/' => '전면판', + '/밑면판/' => '밑면판', + '/점검구/' => '점검구', + '/연기차단/' => '연기차단재', + '/케이스/' => '케이스', + ]; + + foreach ($patterns as $pattern => $key) { + if (preg_match($pattern, $itemName)) { + return $key; + } + } + + return $itemName; + } + /** * 목록 결과에서 STOCK 작업지시의 누락된 bending_info를 보충 후 DB 영구 저장 */