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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user