From 0746db5effb0d53facb6995d1de8a0d1b0884e57 Mon Sep 17 00:00:00 2001 From: kjs Date: Fri, 8 May 2026 17:01:54 +0900 Subject: [PATCH] Enhance Item Search Functionality in Sales Order Page - Updated the item search logic to include additional filters for both item name and item number, improving search accuracy. - Implemented an API call to fetch item information based on the search keyword, allowing for dynamic filtering of results. - Adjusted the state management to handle cases where no items are found, ensuring a smooth user experience. (TASK: ERP-031) --- .../(main)/COMPANY_10/sales/order/page.tsx | 23 ++++++++++++++++++- .../(main)/COMPANY_16/sales/order/page.tsx | 23 ++++++++++++++++++- .../(main)/COMPANY_28/sales/order/page.tsx | 23 ++++++++++++++++++- .../(main)/COMPANY_29/sales/order/page.tsx | 23 ++++++++++++++++++- .../app/(main)/COMPANY_7/sales/order/page.tsx | 23 ++++++++++++++++++- .../app/(main)/COMPANY_8/sales/order/page.tsx | 23 ++++++++++++++++++- .../app/(main)/COMPANY_9/sales/order/page.tsx | 23 ++++++++++++++++++- 7 files changed, 154 insertions(+), 7 deletions(-) diff --git a/frontend/app/(main)/COMPANY_10/sales/order/page.tsx b/frontend/app/(main)/COMPANY_10/sales/order/page.tsx index 94f02289..179e82e0 100644 --- a/frontend/app/(main)/COMPANY_10/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_10/sales/order/page.tsx @@ -784,7 +784,28 @@ export default function SalesOrderPage() { setItemSearchLoading(true); try { const filters: any[] = []; - if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); + if (itemSearchKeyword) { + const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, { + page: 1, size: 0, + dataFilter: { + enabled: true, + matchType: "any", + filters: [ + { columnName: "item_name", operator: "contains", value: itemSearchKeyword }, + { columnName: "item_number", operator: "contains", value: itemSearchKeyword }, + ], + }, + autoFilter: true, + }); + const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || []; + const kwIds = kwRows.map((r: any) => r.id).filter(Boolean); + if (kwIds.length === 0) { + setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1); + setItemSearchLoading(false); + return; + } + filters.push({ columnName: "id", operator: "in", value: kwIds }); + } // 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용 if (itemSearchDivision !== "all") { diff --git a/frontend/app/(main)/COMPANY_16/sales/order/page.tsx b/frontend/app/(main)/COMPANY_16/sales/order/page.tsx index 941a9397..2be59cc0 100644 --- a/frontend/app/(main)/COMPANY_16/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_16/sales/order/page.tsx @@ -784,7 +784,28 @@ export default function SalesOrderPage() { setItemSearchLoading(true); try { const filters: any[] = []; - if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); + if (itemSearchKeyword) { + const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, { + page: 1, size: 0, + dataFilter: { + enabled: true, + matchType: "any", + filters: [ + { columnName: "item_name", operator: "contains", value: itemSearchKeyword }, + { columnName: "item_number", operator: "contains", value: itemSearchKeyword }, + ], + }, + autoFilter: true, + }); + const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || []; + const kwIds = kwRows.map((r: any) => r.id).filter(Boolean); + if (kwIds.length === 0) { + setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1); + setItemSearchLoading(false); + return; + } + filters.push({ columnName: "id", operator: "in", value: kwIds }); + } // 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용 if (itemSearchDivision !== "all") { diff --git a/frontend/app/(main)/COMPANY_28/sales/order/page.tsx b/frontend/app/(main)/COMPANY_28/sales/order/page.tsx index 94f02289..179e82e0 100644 --- a/frontend/app/(main)/COMPANY_28/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_28/sales/order/page.tsx @@ -784,7 +784,28 @@ export default function SalesOrderPage() { setItemSearchLoading(true); try { const filters: any[] = []; - if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); + if (itemSearchKeyword) { + const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, { + page: 1, size: 0, + dataFilter: { + enabled: true, + matchType: "any", + filters: [ + { columnName: "item_name", operator: "contains", value: itemSearchKeyword }, + { columnName: "item_number", operator: "contains", value: itemSearchKeyword }, + ], + }, + autoFilter: true, + }); + const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || []; + const kwIds = kwRows.map((r: any) => r.id).filter(Boolean); + if (kwIds.length === 0) { + setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1); + setItemSearchLoading(false); + return; + } + filters.push({ columnName: "id", operator: "in", value: kwIds }); + } // 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용 if (itemSearchDivision !== "all") { diff --git a/frontend/app/(main)/COMPANY_29/sales/order/page.tsx b/frontend/app/(main)/COMPANY_29/sales/order/page.tsx index 94f02289..179e82e0 100644 --- a/frontend/app/(main)/COMPANY_29/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_29/sales/order/page.tsx @@ -784,7 +784,28 @@ export default function SalesOrderPage() { setItemSearchLoading(true); try { const filters: any[] = []; - if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); + if (itemSearchKeyword) { + const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, { + page: 1, size: 0, + dataFilter: { + enabled: true, + matchType: "any", + filters: [ + { columnName: "item_name", operator: "contains", value: itemSearchKeyword }, + { columnName: "item_number", operator: "contains", value: itemSearchKeyword }, + ], + }, + autoFilter: true, + }); + const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || []; + const kwIds = kwRows.map((r: any) => r.id).filter(Boolean); + if (kwIds.length === 0) { + setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1); + setItemSearchLoading(false); + return; + } + filters.push({ columnName: "id", operator: "in", value: kwIds }); + } // 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용 if (itemSearchDivision !== "all") { diff --git a/frontend/app/(main)/COMPANY_7/sales/order/page.tsx b/frontend/app/(main)/COMPANY_7/sales/order/page.tsx index 68601014..e56d3c50 100644 --- a/frontend/app/(main)/COMPANY_7/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_7/sales/order/page.tsx @@ -785,7 +785,28 @@ export default function SalesOrderPage() { setItemSearchLoading(true); try { const filters: any[] = []; - if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); + if (itemSearchKeyword) { + const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, { + page: 1, size: 0, + dataFilter: { + enabled: true, + matchType: "any", + filters: [ + { columnName: "item_name", operator: "contains", value: itemSearchKeyword }, + { columnName: "item_number", operator: "contains", value: itemSearchKeyword }, + ], + }, + autoFilter: true, + }); + const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || []; + const kwIds = kwRows.map((r: any) => r.id).filter(Boolean); + if (kwIds.length === 0) { + setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1); + setItemSearchLoading(false); + return; + } + filters.push({ columnName: "id", operator: "in", value: kwIds }); + } // 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용 if (itemSearchDivision !== "all") { diff --git a/frontend/app/(main)/COMPANY_8/sales/order/page.tsx b/frontend/app/(main)/COMPANY_8/sales/order/page.tsx index 94f02289..179e82e0 100644 --- a/frontend/app/(main)/COMPANY_8/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_8/sales/order/page.tsx @@ -784,7 +784,28 @@ export default function SalesOrderPage() { setItemSearchLoading(true); try { const filters: any[] = []; - if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); + if (itemSearchKeyword) { + const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, { + page: 1, size: 0, + dataFilter: { + enabled: true, + matchType: "any", + filters: [ + { columnName: "item_name", operator: "contains", value: itemSearchKeyword }, + { columnName: "item_number", operator: "contains", value: itemSearchKeyword }, + ], + }, + autoFilter: true, + }); + const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || []; + const kwIds = kwRows.map((r: any) => r.id).filter(Boolean); + if (kwIds.length === 0) { + setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1); + setItemSearchLoading(false); + return; + } + filters.push({ columnName: "id", operator: "in", value: kwIds }); + } // 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용 if (itemSearchDivision !== "all") { diff --git a/frontend/app/(main)/COMPANY_9/sales/order/page.tsx b/frontend/app/(main)/COMPANY_9/sales/order/page.tsx index 18d668b5..d954fe91 100644 --- a/frontend/app/(main)/COMPANY_9/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_9/sales/order/page.tsx @@ -599,7 +599,28 @@ export default function JeilGlassOrderPage() { const filters: any[] = []; if (salesCode) filters.push({ columnName: "division", operator: "contains", value: salesCode }); if (productCode) filters.push({ columnName: "type", operator: "equals", value: productCode }); - if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); + if (itemSearchKeyword) { + const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, { + page: 1, size: 0, + dataFilter: { + enabled: true, + matchType: "any", + filters: [ + { columnName: "item_name", operator: "contains", value: itemSearchKeyword }, + { columnName: "item_number", operator: "contains", value: itemSearchKeyword }, + ], + }, + autoFilter: true, + }); + const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || []; + const kwIds = kwRows.map((r: any) => r.id).filter(Boolean); + if (kwIds.length === 0) { + setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1); + setItemSearchLoading(false); + return; + } + filters.push({ columnName: "id", operator: "in", value: kwIds }); + } if (itemSearchWidth) filters.push({ columnName: "width", operator: "equals", value: itemSearchWidth }); if (itemSearchHeight) filters.push({ columnName: "height", operator: "equals", value: itemSearchHeight }); if (itemSearchThickness) filters.push({ columnName: "thickness", operator: "equals", value: itemSearchThickness });