diff --git a/src/components/production/WorkerScreen/MaterialInputModal.tsx b/src/components/production/WorkerScreen/MaterialInputModal.tsx index 37a6c420..134021b0 100644 --- a/src/components/production/WorkerScreen/MaterialInputModal.tsx +++ b/src/components/production/WorkerScreen/MaterialInputModal.tsx @@ -192,35 +192,20 @@ export function MaterialInputModal({ return; } - // 복수 item IDs가 있으면 각각 병렬 조회 후 합치기 (절곡 공정 등) - const itemIds = workOrderItemIds && workOrderItemIds.length > 0 - ? workOrderItemIds - : workOrderItemId ? [workOrderItemId] : null; + // 개소 대표 아이템 1개만 조회 (dynamic_bom은 개소 내 모든 아이템에 동일하게 저장됨) + const itemId = workOrderItemId + ?? (workOrderItemIds && workOrderItemIds.length > 0 ? workOrderItemIds[0] : null); - if (itemIds && itemIds.length > 0) { - // 개소 내 모든 items의 자재를 병렬 조회 - const results = await Promise.all( - itemIds.map((id) => getMaterialsForItem(order.id, id)) - ); - const allMaterials: MaterialForItemInput[] = []; - let hasError = false; - for (let i = 0; i < results.length; i++) { - const result = results[i]; - if (result.success) { - // 각 자재에 소스 work_order_item_id 태깅 (submit 시 올바른 item에 등록하기 위함) - const tagged = result.data.map((m) => ({ - ...m, - workOrderItemId: m.workOrderItemId || itemIds[i], - })); - allMaterials.push(...tagged); - } else { - hasError = true; - } - } - if (allMaterials.length > 0) { - setMaterials(allMaterials); - } else if (hasError) { - toast.error('자재 목록 조회에 실패했습니다.'); + if (itemId) { + const result = await getMaterialsForItem(order.id, itemId); + if (result.success) { + const tagged = result.data.map((m) => ({ + ...m, + workOrderItemId: m.workOrderItemId || itemId, + })); + setMaterials(tagged); + } else { + toast.error(result.error || '자재 목록 조회에 실패했습니다.'); } } else { // 전체 작업지시 기준 조회 @@ -277,31 +262,14 @@ export function MaterialInputModal({ setIsSubmitting(true); try { - // 복수 item IDs가 있으면 item별로 그룹핑하여 각각 등록 + // 대표 아이템 기준 자재 투입 등록 let result: { success: boolean; error?: string }; + const targetItemId = workOrderItemId + ?? (workOrderItemIds && workOrderItemIds.length > 0 ? workOrderItemIds[0] : null); - if (workOrderItemIds && workOrderItemIds.length > 1) { - // inputs를 work_order_item_id별로 그룹핑 - const grouped = new Map(); - for (const input of inputs) { - const woItemId = input.work_order_item_id; - if (woItemId) { - if (!grouped.has(woItemId)) grouped.set(woItemId, []); - grouped.get(woItemId)!.push({ stock_lot_id: input.stock_lot_id, qty: input.qty }); - } - } - // 각 item별로 병렬 등록 - const results = await Promise.all( - Array.from(grouped.entries()).map(([itemId, itemInputs]) => - registerMaterialInputForItem(order.id, itemId, itemInputs) - ) - ); - const hasFailure = results.some((r) => !r.success); - result = hasFailure - ? { success: false, error: results.find((r) => !r.success)?.error } - : { success: true }; - } else if (workOrderItemId) { - result = await registerMaterialInputForItem(order.id, workOrderItemId, inputs); + if (targetItemId) { + const simpleInputs = inputs.map(({ stock_lot_id, qty }) => ({ stock_lot_id, qty })); + result = await registerMaterialInputForItem(order.id, targetItemId, simpleInputs); } else { result = await registerMaterialInput(order.id, inputs); }