fix(WEB): 방화유리 수량 폴백 제거 및 수주→작업지시 파이프라인 개선

- OrderService: glass_qty에서 quantity 폴백 제거 (투시창 선택 시에만 유효)
- OrderService: createProductionOrder()에서 절곡 공정 bending_info 자동 생성
- OrderService: formula_source 없는 레거시 데이터의 sort_order 기반 개소 분배
- OrderService: note 파싱에서 '-' 단독값 무시 처리
- FormulaEvaluatorService: 철재 W1 계산 (W0+160 → W0+110) 레거시 일치
- WorkOrderService: store()에서 order_node_id null 품목용 rootNodes fallback 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-21 01:02:23 +09:00
parent 3ab4f24bb4
commit 400adb7c58
4 changed files with 94 additions and 19 deletions

View File

@@ -264,11 +264,23 @@ public function store(array $data)
// 품목 저장: 직접 전달된 품목이 없고 수주 ID가 있으면 수주에서 복사
if (empty($items) && $salesOrderId) {
$salesOrder = \App\Models\Orders\Order::with('items.node')->find($salesOrderId);
$salesOrder = \App\Models\Orders\Order::with(['items.node', 'rootNodes'])->find($salesOrderId);
if ($salesOrder && $salesOrder->items->isNotEmpty()) {
// order_node_id가 null인 품목용 fallback: 수주의 root node를 인덱스로 매핑
$rootNodes = $salesOrder->rootNodes;
$rootNodeCount = $rootNodes->count();
foreach ($salesOrder->items as $index => $orderItem) {
// 수주 품목 + 노드에서 options 조합
// 1순위: 품목에 직접 연결된 node, 2순위: root node fallback
$nodeOptions = $orderItem->node?->options ?? [];
if (empty($nodeOptions) && $rootNodeCount > 0) {
// root node가 1개면 모든 품목이 해당 node, 여러 개면 인덱스 기반 분배
$fallbackNode = $rootNodeCount === 1
? $rootNodes->first()
: $rootNodes->values()->get($index % $rootNodeCount);
$nodeOptions = $fallbackNode?->options ?? [];
}
$options = array_filter([
'floor' => $orderItem->floor_code,
'code' => $orderItem->symbol_code,