feat: [재공품] STOCK 작업지시 dynamic_bom 생성 + 자재 매칭 구현

- BendingCodeService: lengthCodeToMm() public static 메서드 추가
- BendingInfoBuilder: buildDynamicBomForStockItem() 신규 메서드
  - bending_lot(prodCode/specCode/lengthCode) + partKey → BD 품목 코드 → dynamic_bom 엔트리 생성
  - PrefixResolver 활용하여 정확한 prefix 매핑
- OrderService: STOCK 확정 시 bending_lot 기반 dynamic_bom 자동 생성
- WorkOrderService: 기존 STOCK 호환 fallback (getMaterials + getMaterialsForItem)
  - dynamic_bom 없는 기존 재공품도 bending_lot.material로 원자재 검색
This commit is contained in:
김보곤
2026-03-22 14:54:11 +09:00
parent af69f2df0c
commit a8b04e15c3
4 changed files with 305 additions and 1 deletions

View File

@@ -1735,6 +1735,24 @@ public function createProductionOrder(int $orderId, array $data)
}
}
// STOCK(재고생산): bending_lot 기반 dynamic_bom 생성
if ($isStock && empty($woItemOptions['dynamic_bom'])) {
$orderOptions = $order->options ?? [];
$bendingLot = $orderOptions['bending_lot'] ?? null;
if ($bendingLot) {
$partKey = \App\Services\WorkOrderService::parseStockPartKeyStatic($orderItem->item_name);
$stockDynamicBom = app(BendingInfoBuilder::class)->buildDynamicBomForStockItem(
$bendingLot,
$partKey,
(int) ($orderItem->quantity ?? 1),
$tenantId,
);
if (! empty($stockDynamicBom)) {
$woItemOptions['dynamic_bom'] = $stockDynamicBom;
}
}
}
DB::table('work_order_items')->insert([
'tenant_id' => $tenantId,
'work_order_id' => $workOrder->id,
@@ -2239,7 +2257,7 @@ private static function buildStockBendingInfoFromLot(array $bendingLot, int $qua
}
// length_code → mm 변환
$lengthMm = self::stockLengthCodeToMmStatic($prodCode, $lengthCode);
$lengthMm = \App\Services\BendingCodeService::lengthCodeToMm($prodCode, $lengthCode);
if ($lengthMm <= 0) {
return null;
}