fix: 자재투입 모달 개소 대표 아이템 단일 조회로 변경
- 개소 내 5개 아이템 병렬 조회 → 대표 아이템 1개만 조회 (5배 중복 제거) - submit 로직 단순화: 복수 그룹핑 병렬 등록 → 단일 아이템 등록
This commit is contained in:
@@ -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<number, { stock_lot_id: number; qty: number }[]>();
|
||||
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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user