From b9e1b07b3cc26c23c88df38b507547043088ece8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Sat, 21 Feb 2026 09:49:03 +0900 Subject: [PATCH] =?UTF-8?q?fix(WEB):=20=EC=88=98=EC=A3=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=8B=9C=20skippedIds=20=EA=B8=B0=EB=B0=98=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A0=95=ED=99=95=ED=95=9C=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - handleForceDelete/handleBulkDelete/handleConfirmDelete에서 skippedIds 처리 - 실제 삭제된 항목만 리스트 제거, skip된 항목은 warning toast 표시 - UniversalListPage config의 deleteBulk도 동일 수정 --- .../sales/order-management-sales/page.tsx | 72 +++++++++++++------ 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/src/app/[locale]/(protected)/sales/order-management-sales/page.tsx b/src/app/[locale]/(protected)/sales/order-management-sales/page.tsx index fd4c57e5..98d3e2dc 100644 --- a/src/app/[locale]/(protected)/sales/order-management-sales/page.tsx +++ b/src/app/[locale]/(protected)/sales/order-management-sales/page.tsx @@ -374,10 +374,18 @@ function OrderListContent() { try { const result = await deleteOrders(selectedIds); if (result.success) { - setOrders(orders.filter((o) => !selectedIds.includes(o.id))); + const deletedCount = result.deletedCount ?? 0; + const skippedCount = result.skippedCount ?? 0; + const skippedSet = new Set((result.skippedIds ?? []).map(String)); + // 실제 삭제된 항목만 리스트에서 제거 + setOrders(orders.filter((o) => skippedSet.has(o.id) || !selectedIds.includes(o.id))); setSelectedItems(new Set()); - toast.success(`${selectedIds.length}개의 수주가 삭제되었습니다.`); - // 통계 새로고침 + if (deletedCount > 0) { + toast.success(`${deletedCount}개의 수주가 삭제되었습니다.`); + } + if (skippedCount > 0) { + toast.warning(`${skippedCount}개의 수주는 상태/작업지시로 인해 삭제할 수 없습니다.`); + } const statsResult = await getOrderStats(); if (statsResult.success && statsResult.data) { setApiStats(statsResult.data); @@ -400,31 +408,41 @@ function OrderListContent() { const count = deleteTargetIds.length; setIsDeleting(true); try { - let success = false; if (count === 1) { const result = await deleteOrder(deleteTargetIds[0]); - success = result.success; - if (!success) { + if (result.success) { + setOrders(orders.filter((o) => o.id !== deleteTargetIds[0])); + setSelectedItems(new Set()); + toast.success("수주가 삭제되었습니다."); + const statsResult = await getOrderStats(); + if (statsResult.success && statsResult.data) { + setApiStats(statsResult.data); + } + } else { toast.error(result.error || "삭제에 실패했습니다."); } } else { const result = await deleteOrders(deleteTargetIds); - success = result.success; - if (!success) { + if (result.success) { + const deletedCount = result.deletedCount ?? 0; + const skippedCount = result.skippedCount ?? 0; + const skippedSet = new Set((result.skippedIds ?? []).map(String)); + setOrders(orders.filter((o) => skippedSet.has(o.id) || !deleteTargetIds.includes(o.id))); + setSelectedItems(new Set()); + if (deletedCount > 0) { + toast.success(`${deletedCount}개의 수주가 삭제되었습니다.`); + } + if (skippedCount > 0) { + toast.warning(`${skippedCount}개의 수주는 상태/작업지시로 인해 삭제할 수 없습니다.`); + } + const statsResult = await getOrderStats(); + if (statsResult.success && statsResult.data) { + setApiStats(statsResult.data); + } + } else { toast.error(result.error || "삭제에 실패했습니다."); } } - - if (success) { - setOrders(orders.filter((o) => !deleteTargetIds.includes(o.id))); - setSelectedItems(new Set()); - toast.success(`${count}개의 수주가 삭제되었습니다.`); - // 통계 새로고침 - const statsResult = await getOrderStats(); - if (statsResult.success && statsResult.data) { - setApiStats(statsResult.data); - } - } } catch (error) { console.error("Error deleting orders:", error); toast.error("삭제 중 오류가 발생했습니다."); @@ -444,9 +462,18 @@ function OrderListContent() { try { const result = await deleteOrders(selectedIds, { force: true }); if (result.success) { - setOrders(orders.filter((o) => !selectedIds.includes(o.id))); + const deletedCount = result.deletedCount ?? 0; + const skippedCount = result.skippedCount ?? 0; + const skippedSet = new Set((result.skippedIds ?? []).map(String)); + // 실제 삭제된 항목만 리스트에서 제거 + setOrders(orders.filter((o) => skippedSet.has(o.id) || !selectedIds.includes(o.id))); setSelectedItems(new Set()); - toast.success(`${result.deletedCount ?? selectedIds.length}개의 수주가 완전삭제되었습니다.`); + if (deletedCount > 0) { + toast.success(`${deletedCount}개의 수주가 완전삭제되었습니다.`); + } + if (skippedCount > 0) { + toast.warning(`${skippedCount}개의 수주는 삭제할 수 없습니다.`); + } const statsResult = await getOrderStats(); if (statsResult.success && statsResult.data) { setApiStats(statsResult.data); @@ -687,7 +714,8 @@ function OrderListContent() { deleteBulk: async (ids) => { const result = await deleteOrders(ids); if (result.success) { - setOrders((prev) => prev.filter((o) => !ids.includes(o.id))); + const skippedSet = new Set((result.skippedIds ?? []).map(String)); + setOrders((prev) => prev.filter((o) => skippedSet.has(o.id) || !ids.includes(o.id))); const statsResult = await getOrderStats(); if (statsResult.success && statsResult.data) { setApiStats(statsResult.data);