From 359fd2823fbf54d50904a4e550989d25160b7465 Mon Sep 17 00:00:00 2001 From: kjs Date: Thu, 16 Apr 2026 13:22:54 +0900 Subject: [PATCH 01/17] feat: Update pagination size for API requests across multiple pages - Changed the pagination size from 500 to 0 for various API requests in the equipment, logistics, master data, quality, and sales pages. - This adjustment aims to optimize data retrieval by potentially reducing the amount of data fetched in initial requests, improving performance and responsiveness. - Ensured that the changes are consistent across all relevant components to maintain uniformity in data handling. --- .../(main)/COMPANY_10/equipment/info/page.tsx | 10 +++---- .../equipment/inspection-record/page.tsx | 2 +- .../equipment/plc-settings/page.tsx | 6 ++--- .../logistics/inbound-outbound/page.tsx | 2 +- .../(main)/COMPANY_10/logistics/info/page.tsx | 6 ++--- .../COMPANY_10/logistics/inventory/page.tsx | 8 +++--- .../COMPANY_10/logistics/warehouse/page.tsx | 4 +-- .../COMPANY_10/master-data/company/page.tsx | 4 +-- .../master-data/department/page.tsx | 4 +-- .../COMPANY_10/monitoring/equipment/page.tsx | 2 +- .../outsourcing/subcontractor-item/page.tsx | 4 +-- .../outsourcing/subcontractor/page.tsx | 14 +++++----- .../(main)/COMPANY_10/production/bom/page.tsx | 4 +-- .../COMPANY_10/production/result/page.tsx | 2 +- .../(main)/COMPANY_10/purchase/order/page.tsx | 12 ++++----- .../purchase/purchase-item/page.tsx | 10 +++---- .../COMPANY_10/purchase/supplier/page.tsx | 26 +++++++++---------- .../quality/inspection-result/page.tsx | 2 +- .../COMPANY_10/quality/inspection/page.tsx | 8 +++--- .../quality/item-inspection/page.tsx | 12 ++++----- .../(main)/COMPANY_10/sales/claim/page.tsx | 2 +- .../(main)/COMPANY_10/sales/customer/page.tsx | 24 ++++++++--------- .../(main)/COMPANY_10/sales/order/page.tsx | 14 +++++----- .../COMPANY_10/sales/sales-item/page.tsx | 10 +++---- .../(main)/COMPANY_16/equipment/info/page.tsx | 10 +++---- .../equipment/inspection-record/page.tsx | 2 +- .../equipment/plc-settings/page.tsx | 6 ++--- .../logistics/inbound-outbound/page.tsx | 2 +- .../(main)/COMPANY_16/logistics/info/page.tsx | 6 ++--- .../COMPANY_16/logistics/inventory/page.tsx | 8 +++--- .../COMPANY_16/logistics/warehouse/page.tsx | 4 +-- .../COMPANY_16/master-data/company/page.tsx | 4 +-- .../master-data/department/page.tsx | 4 +-- .../COMPANY_16/monitoring/equipment/page.tsx | 2 +- .../outsourcing/subcontractor-item/page.tsx | 4 +-- .../outsourcing/subcontractor/page.tsx | 14 +++++----- .../(main)/COMPANY_16/production/bom/page.tsx | 4 +-- .../COMPANY_16/production/result/page.tsx | 2 +- .../(main)/COMPANY_16/purchase/order/page.tsx | 12 ++++----- .../purchase/purchase-item/page.tsx | 10 +++---- .../COMPANY_16/purchase/supplier/page.tsx | 26 +++++++++---------- .../quality/inspection-result/page.tsx | 2 +- .../COMPANY_16/quality/inspection/page.tsx | 8 +++--- .../quality/item-inspection/page.tsx | 12 ++++----- .../(main)/COMPANY_16/sales/claim/page.tsx | 2 +- .../(main)/COMPANY_16/sales/customer/page.tsx | 24 ++++++++--------- .../(main)/COMPANY_16/sales/order/page.tsx | 14 +++++----- .../COMPANY_16/sales/sales-item/page.tsx | 10 +++---- .../(main)/COMPANY_29/equipment/info/page.tsx | 10 +++---- .../equipment/inspection-record/page.tsx | 2 +- .../equipment/plc-settings/page.tsx | 6 ++--- .../logistics/inbound-outbound/page.tsx | 2 +- .../(main)/COMPANY_29/logistics/info/page.tsx | 6 ++--- .../COMPANY_29/logistics/inventory/page.tsx | 8 +++--- .../COMPANY_29/logistics/warehouse/page.tsx | 4 +-- .../COMPANY_29/master-data/company/page.tsx | 4 +-- .../master-data/department/page.tsx | 4 +-- .../COMPANY_29/monitoring/equipment/page.tsx | 2 +- .../outsourcing/subcontractor-item/page.tsx | 4 +-- .../outsourcing/subcontractor/page.tsx | 14 +++++----- .../(main)/COMPANY_29/production/bom/page.tsx | 4 +-- .../COMPANY_29/production/result/page.tsx | 2 +- .../(main)/COMPANY_29/purchase/order/page.tsx | 12 ++++----- .../purchase/purchase-item/page.tsx | 10 +++---- .../COMPANY_29/purchase/supplier/page.tsx | 26 +++++++++---------- .../quality/inspection-result/page.tsx | 2 +- .../COMPANY_29/quality/inspection/page.tsx | 8 +++--- .../quality/item-inspection/page.tsx | 12 ++++----- .../(main)/COMPANY_29/sales/claim/page.tsx | 2 +- .../(main)/COMPANY_29/sales/customer/page.tsx | 24 ++++++++--------- .../(main)/COMPANY_29/sales/order/page.tsx | 14 +++++----- .../COMPANY_29/sales/sales-item/page.tsx | 10 +++---- .../purchase/purchase-item/page.tsx | 10 +++---- .../COMPANY_30/sales/sales-item/page.tsx | 10 +++---- .../(main)/COMPANY_7/equipment/info/page.tsx | 10 +++---- .../equipment/inspection-record/page.tsx | 2 +- .../COMPANY_7/equipment/plc-settings/page.tsx | 6 ++--- .../logistics/inbound-outbound/page.tsx | 2 +- .../(main)/COMPANY_7/logistics/info/page.tsx | 6 ++--- .../COMPANY_7/logistics/inventory/page.tsx | 8 +++--- .../COMPANY_7/logistics/warehouse/page.tsx | 4 +-- .../COMPANY_7/master-data/company/page.tsx | 4 +-- .../COMPANY_7/master-data/department/page.tsx | 4 +-- .../COMPANY_7/monitoring/equipment/page.tsx | 2 +- .../outsourcing/subcontractor-item/page.tsx | 4 +-- .../outsourcing/subcontractor/page.tsx | 14 +++++----- .../(main)/COMPANY_7/production/bom/page.tsx | 4 +-- .../COMPANY_7/production/result/page.tsx | 2 +- .../(main)/COMPANY_7/purchase/order/page.tsx | 12 ++++----- .../COMPANY_7/purchase/purchase-item/page.tsx | 10 +++---- .../COMPANY_7/purchase/supplier/page.tsx | 26 +++++++++---------- .../quality/inspection-result/page.tsx | 2 +- .../COMPANY_7/quality/inspection/page.tsx | 8 +++--- .../quality/item-inspection/page.tsx | 12 ++++----- .../app/(main)/COMPANY_7/sales/claim/page.tsx | 2 +- .../(main)/COMPANY_7/sales/customer/page.tsx | 24 ++++++++--------- .../app/(main)/COMPANY_7/sales/order/page.tsx | 14 +++++----- .../COMPANY_7/sales/sales-item/page.tsx | 10 +++---- .../(main)/COMPANY_8/equipment/info/page.tsx | 10 +++---- .../equipment/inspection-record/page.tsx | 2 +- .../COMPANY_8/equipment/plc-settings/page.tsx | 6 ++--- .../logistics/inbound-outbound/page.tsx | 2 +- .../(main)/COMPANY_8/logistics/info/page.tsx | 6 ++--- .../COMPANY_8/logistics/inventory/page.tsx | 8 +++--- .../COMPANY_8/logistics/warehouse/page.tsx | 4 +-- .../COMPANY_8/master-data/company/page.tsx | 4 +-- .../COMPANY_8/master-data/department/page.tsx | 4 +-- .../COMPANY_8/monitoring/equipment/page.tsx | 2 +- .../outsourcing/subcontractor-item/page.tsx | 4 +-- .../outsourcing/subcontractor/page.tsx | 14 +++++----- .../(main)/COMPANY_8/production/bom/page.tsx | 4 +-- .../COMPANY_8/production/result/page.tsx | 2 +- .../(main)/COMPANY_8/purchase/order/page.tsx | 12 ++++----- .../COMPANY_8/purchase/purchase-item/page.tsx | 10 +++---- .../COMPANY_8/purchase/supplier/page.tsx | 26 +++++++++---------- .../quality/inspection-result/page.tsx | 2 +- .../COMPANY_8/quality/inspection/page.tsx | 8 +++--- .../quality/item-inspection/page.tsx | 12 ++++----- .../app/(main)/COMPANY_8/sales/claim/page.tsx | 2 +- .../(main)/COMPANY_8/sales/customer/page.tsx | 24 ++++++++--------- .../app/(main)/COMPANY_8/sales/order/page.tsx | 14 +++++----- .../COMPANY_8/sales/sales-item/page.tsx | 10 +++---- .../COMPANY_9/purchase/purchase-item/page.tsx | 10 +++---- .../COMPANY_9/sales/sales-item/page.tsx | 10 +++---- 124 files changed, 500 insertions(+), 500 deletions(-) diff --git a/frontend/app/(main)/COMPANY_10/equipment/info/page.tsx b/frontend/app/(main)/COMPANY_10/equipment/info/page.tsx index cad20e4d..c2f3c0ca 100644 --- a/frontend/app/(main)/COMPANY_10/equipment/info/page.tsx +++ b/frontend/app/(main)/COMPANY_10/equipment/info/page.tsx @@ -165,7 +165,7 @@ export default function EquipmentInfoPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${EQUIP_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -209,7 +209,7 @@ export default function EquipmentInfoPage() { setInspectionLoading(true); try { const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: selectedEquip.equipment_code }] }, autoFilter: true, }); @@ -226,7 +226,7 @@ export default function EquipmentInfoPage() { setConsumableLoading(true); try { const res = await apiClient.post(`/table-management/tables/${CONSUMABLE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: selectedEquip.equipment_code }] }, autoFilter: true, }); @@ -362,7 +362,7 @@ export default function EquipmentInfoPage() { if (consumableDiv) filters.push({ columnName: "division", operator: "equals", value: consumableDiv.valueCode }); const results = await Promise.all(filters.map((f) => apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [f] }, autoFilter: true, }) @@ -409,7 +409,7 @@ export default function EquipmentInfoPage() { setCopyLoading(true); try { const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: equipCode }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_10/equipment/inspection-record/page.tsx b/frontend/app/(main)/COMPANY_10/equipment/inspection-record/page.tsx index 40a1521a..45a34458 100644 --- a/frontend/app/(main)/COMPANY_10/equipment/inspection-record/page.tsx +++ b/frontend/app/(main)/COMPANY_10/equipment/inspection-record/page.tsx @@ -83,7 +83,7 @@ export default function EquipmentInspectionRecordPage() { }).catch(() => ({ data: { data: { data: [] } } })), apiClient.post(`/table-management/tables/equipment_mng/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }).catch(() => ({ data: { data: { data: [] } } })), ]); diff --git a/frontend/app/(main)/COMPANY_10/equipment/plc-settings/page.tsx b/frontend/app/(main)/COMPANY_10/equipment/plc-settings/page.tsx index 4e94d293..1736fe09 100644 --- a/frontend/app/(main)/COMPANY_10/equipment/plc-settings/page.tsx +++ b/frontend/app/(main)/COMPANY_10/equipment/plc-settings/page.tsx @@ -100,7 +100,7 @@ export default function PlcSettingsPage() { useEffect(() => { const load = async () => { try { - const eqRes = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, size: 500, autoFilter: true }); + const eqRes = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, size: 0, autoFilter: true }); const eqs = eqRes.data?.data?.data || eqRes.data?.data?.rows || []; setEquipOptions(eqs.map((r: any) => ({ code: r.equipment_code, label: `${r.equipment_code} - ${r.equipment_name || ""}` }))); } catch { /* skip */ } @@ -122,7 +122,7 @@ export default function PlcSettingsPage() { const filters: any[] = []; if (kw.trim()) filters.push({ columnName: "equipment_code", operator: "contains", value: kw.trim() }); const res = await apiClient.post(`/table-management/tables/${DATATYPE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -140,7 +140,7 @@ export default function PlcSettingsPage() { const filters: any[] = []; if (kw.trim()) filters.push({ columnName: "config_name", operator: "contains", value: kw.trim() }); const res = await apiClient.post(`/table-management/tables/${COLLECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_10/logistics/inbound-outbound/page.tsx b/frontend/app/(main)/COMPANY_10/logistics/inbound-outbound/page.tsx index bbad370b..806bb52d 100644 --- a/frontend/app/(main)/COMPANY_10/logistics/inbound-outbound/page.tsx +++ b/frontend/app/(main)/COMPANY_10/logistics/inbound-outbound/page.tsx @@ -150,7 +150,7 @@ export default function InboundOutboundPage() { if (writerIds.length > 0) { try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; const uMap: Record = {}; diff --git a/frontend/app/(main)/COMPANY_10/logistics/info/page.tsx b/frontend/app/(main)/COMPANY_10/logistics/info/page.tsx index 35764744..5f44e0ec 100644 --- a/frontend/app/(main)/COMPANY_10/logistics/info/page.tsx +++ b/frontend/app/(main)/COMPANY_10/logistics/info/page.tsx @@ -327,11 +327,11 @@ export default function LogisticsInfoPage() { try { const [carrierRes, routeRes] = await Promise.all([ apiClient.post("/table-management/tables/carrier_mng/data", { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "carrier_code", order: "asc" }, }), apiClient.post("/table-management/tables/delivery_route_mng/data", { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "route_code", order: "asc" }, }), ]); @@ -393,7 +393,7 @@ export default function LogisticsInfoPage() { const res = await apiClient.post( `/table-management/tables/${config.tableName}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: config.defaultSortColumn, order: "asc" }, } ); diff --git a/frontend/app/(main)/COMPANY_10/logistics/inventory/page.tsx b/frontend/app/(main)/COMPANY_10/logistics/inventory/page.tsx index 5c0ddcc1..0f9d675f 100644 --- a/frontend/app/(main)/COMPANY_10/logistics/inventory/page.tsx +++ b/frontend/app/(main)/COMPANY_10/logistics/inventory/page.tsx @@ -190,13 +190,13 @@ export default function InventoryStatusPage() { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const [stockRes, itemRes, whRes] = await Promise.all([ apiClient.post(`/table-management/tables/${STOCK_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "item_code", order: "asc" }, }), - apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/warehouse_info/data`, { page: 1, size: 500, autoFilter: true }), + apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/warehouse_info/data`, { page: 1, size: 0, autoFilter: true }), ]); const raw = stockRes.data?.data?.data || stockRes.data?.data?.rows || []; const items = itemRes.data?.data?.data || itemRes.data?.data?.rows || []; @@ -260,7 +260,7 @@ export default function InventoryStatusPage() { `/table-management/tables/${HISTORY_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: { enabled: true, filters: historyFilters }, autoFilter: true, sort: { columnName: "transaction_date", order: "desc" }, diff --git a/frontend/app/(main)/COMPANY_10/logistics/warehouse/page.tsx b/frontend/app/(main)/COMPANY_10/logistics/warehouse/page.tsx index 96b3d47e..2a194939 100644 --- a/frontend/app/(main)/COMPANY_10/logistics/warehouse/page.tsx +++ b/frontend/app/(main)/COMPANY_10/logistics/warehouse/page.tsx @@ -230,7 +230,7 @@ export default function WarehouseManagementPage() { `/table-management/tables/${WAREHOUSE_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "warehouse_code", order: "asc" }, @@ -270,7 +270,7 @@ export default function WarehouseManagementPage() { `/table-management/tables/${LOCATION_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: { enabled: true, filters: [ diff --git a/frontend/app/(main)/COMPANY_10/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_10/master-data/company/page.tsx index 0e4de0cd..a607b7ea 100644 --- a/frontend/app/(main)/COMPANY_10/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_10/master-data/company/page.tsx @@ -193,7 +193,7 @@ export default function CompanyPage() { setDeptLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DEPT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; setDepts(raw); @@ -217,7 +217,7 @@ export default function CompanyPage() { setMemberLoading(true); try { const res = await apiClient.post(`/table-management/tables/${USER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "dept_code", operator: "equals", value: selectedDeptCode }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_10/master-data/department/page.tsx b/frontend/app/(main)/COMPANY_10/master-data/department/page.tsx index 6eb4c2f2..a24fd804 100644 --- a/frontend/app/(main)/COMPANY_10/master-data/department/page.tsx +++ b/frontend/app/(main)/COMPANY_10/master-data/department/page.tsx @@ -99,7 +99,7 @@ export default function DepartmentPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${DEPT_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -129,7 +129,7 @@ export default function DepartmentPage() { ? [{ columnName: "dept_code", operator: "equals", value: selectedDeptCode }] : []; const res = await apiClient.post(`/table-management/tables/${USER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_10/monitoring/equipment/page.tsx b/frontend/app/(main)/COMPANY_10/monitoring/equipment/page.tsx index b165ff65..ed292682 100644 --- a/frontend/app/(main)/COMPANY_10/monitoring/equipment/page.tsx +++ b/frontend/app/(main)/COMPANY_10/monitoring/equipment/page.tsx @@ -170,7 +170,7 @@ export default function EquipmentMonitoringPage() { apiClient.post("/table-management/tables/equipment_mng/data", { autoFilter: true, page: 1, - size: 500, + size: 0, }), apiClient.get("/work-instruction/list").catch(() => ({ data: { data: [] } })), apiClient.post("/table-management/tables/work_order_process/data", { diff --git a/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor-item/page.tsx index 92673fa0..8f1802c4 100644 --- a/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor-item/page.tsx @@ -153,7 +153,7 @@ export default function SubcontractorItemPage() { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -191,7 +191,7 @@ export default function SubcontractorItemPage() { setSubcontractorLoading(true); try { const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor/page.tsx index 9624736b..2a5684b0 100644 --- a/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_10/outsourcing/subcontractor/page.tsx @@ -194,7 +194,7 @@ export default function SubcontractorManagementPage() { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${SUBCONTRACTOR_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -229,7 +229,7 @@ export default function SubcontractorManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, ]}, @@ -256,7 +256,7 @@ export default function SubcontractorManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, ]}, @@ -413,7 +413,7 @@ export default function SubcontractorManagementPage() { const filters: any[] = []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -550,7 +550,7 @@ export default function SubcontractorManagementPage() { }> = []; try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor!.subcontractor_code }, { columnName: "item_id", operator: "equals", value: itemKey }, @@ -610,7 +610,7 @@ export default function SubcontractorManagementPage() { // 2) 기존 단가 모두 삭제 (subcontractor_id + item_id 기준) try { const existingPrices = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, { columnName: "item_id", operator: "equals", value: itemKey }, @@ -727,7 +727,7 @@ export default function SubcontractorManagementPage() { if (subCodes.length > 0) { const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; diff --git a/frontend/app/(main)/COMPANY_10/production/bom/page.tsx b/frontend/app/(main)/COMPANY_10/production/bom/page.tsx index 9b2e32c8..ef441cfc 100644 --- a/frontend/app/(main)/COMPANY_10/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_10/production/bom/page.tsx @@ -349,7 +349,7 @@ export default function BomManagementPage() { const res = await apiClient.post(`/table-management/tables/${BOM_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "created_at", order: "desc" }, @@ -631,7 +631,7 @@ export default function BomManagementPage() { // bom_detail에서 child_item_id가 현재 품목인 행 조회 const itemId = bomHeader.item_id || bomHeader.id; const res = await apiClient.post(`/table-management/tables/bom_detail/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "child_item_id", operator: "equals", value: itemId }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_10/production/result/page.tsx b/frontend/app/(main)/COMPANY_10/production/result/page.tsx index b2176781..151bc0bf 100644 --- a/frontend/app/(main)/COMPANY_10/production/result/page.tsx +++ b/frontend/app/(main)/COMPANY_10/production/result/page.tsx @@ -183,7 +183,7 @@ export default function ProductionResultPage() { setProcessLoading(true); try { const res = await apiClient.post(`/table-management/tables/${WOP_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "wo_id", operator: "equals", value: selectedWiId }] }, autoFilter: true, sort: { columnName: "seq_no", order: "asc" }, diff --git a/frontend/app/(main)/COMPANY_10/purchase/order/page.tsx b/frontend/app/(main)/COMPANY_10/purchase/order/page.tsx index 5da53411..bfbca4e3 100644 --- a/frontend/app/(main)/COMPANY_10/purchase/order/page.tsx +++ b/frontend/app/(main)/COMPANY_10/purchase/order/page.tsx @@ -237,7 +237,7 @@ export default function PurchaseOrderPage() { ); try { const suppRes = await apiClient.post(`/table-management/tables/supplier_mng/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const supps = suppRes.data?.data?.data || suppRes.data?.data?.rows || []; optMap["supplier_code"] = supps.map((s: any) => ({ @@ -247,7 +247,7 @@ export default function PurchaseOrderPage() { } catch { /* skip */ } try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; optMap["manager"] = users.map((u: any) => ({ @@ -293,7 +293,7 @@ export default function PurchaseOrderPage() { } const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: detailFilters.length > 0 ? { enabled: true, filters: detailFilters } : undefined, autoFilter: true, sort: { columnName: "purchase_no", order: "desc" }, @@ -607,7 +607,7 @@ export default function PurchaseOrderPage() { try { const itemIds = selected.map((item) => item.item_number || item.id); const res = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ @@ -670,7 +670,7 @@ export default function PurchaseOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_number", operator: "in", value: itemCodes }] }, autoFilter: true, }); @@ -692,7 +692,7 @@ export default function PurchaseOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: supplierCode }, { columnName: "item_id", operator: "in", value: itemCodes }, diff --git a/frontend/app/(main)/COMPANY_10/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_10/purchase/purchase-item/page.tsx index fd203d40..42db2edf 100644 --- a/frontend/app/(main)/COMPANY_10/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_10/purchase/purchase-item/page.tsx @@ -328,7 +328,7 @@ export default function PurchaseItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -619,7 +619,7 @@ export default function PurchaseItemPage() { try { // 1. supplier_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -647,7 +647,7 @@ export default function PurchaseItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1104,7 +1104,7 @@ export default function PurchaseItemPage() { for (const suppCode of supplierCodes) { // 해당 공급업체의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, @@ -1121,7 +1121,7 @@ export default function PurchaseItemPage() { // 해당 공급업체의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, diff --git a/frontend/app/(main)/COMPANY_10/purchase/supplier/page.tsx b/frontend/app/(main)/COMPANY_10/purchase/supplier/page.tsx index 9b516330..964e7e09 100644 --- a/frontend/app/(main)/COMPANY_10/purchase/supplier/page.tsx +++ b/frontend/app/(main)/COMPANY_10/purchase/supplier/page.tsx @@ -219,7 +219,7 @@ export default function SupplierManagementPage() { } catch { /* skip */ } }; load(); - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }) + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }) .then((res) => { const users = res.data?.data?.data || res.data?.data?.rows || []; setEmployeeOptions(users.map((u: any) => ({ @@ -239,7 +239,7 @@ export default function SupplierManagementPage() { })); const res = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" }, @@ -284,7 +284,7 @@ export default function SupplierManagementPage() { const fetchMainContacts = useCallback(async () => { try { const contactRes = await apiClient.post(`/table-management/tables/${CONTACT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, dataFilter: { enabled: true, filters: [{ columnName: "is_main", operator: "equals", value: "Y" }] }, }); const allContacts = contactRes.data?.data?.data || contactRes.data?.data?.rows || []; @@ -310,7 +310,7 @@ export default function SupplierManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -337,7 +337,7 @@ export default function SupplierManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -412,7 +412,7 @@ export default function SupplierManagementPage() { setDeliveryLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_code", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -492,7 +492,7 @@ export default function SupplierManagementPage() { if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; const allRes = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "destination_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -565,7 +565,7 @@ export default function SupplierManagementPage() { const ruleId = ruleData.data.ruleId; // 기존 데이터에서 CUST-XXX 패턴의 최대 순번 조회 const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -766,7 +766,7 @@ export default function SupplierManagementPage() { const ruleData = ruleRes.data; if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; - const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { page: 1, size: 500, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" } }); + const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { page: 1, size: 0, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" } }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; let maxSeq = 0; for (const row of allRows) { const match = (row.supplier_code || "").match(/(\d+)$/); if (match) { const seq = parseInt(match[1], 10); if (seq > maxSeq) maxSeq = seq; } } @@ -819,7 +819,7 @@ export default function SupplierManagementPage() { const filters: any[] = []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -1227,7 +1227,7 @@ export default function SupplierManagementPage() { for (const itemId of itemIds) { // 해당 품목의 모든 매핑 조회 → supplier_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier!.supplier_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1244,7 +1244,7 @@ export default function SupplierManagementPage() { // 해당 품목의 모든 단가 조회 → supplier_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier!.supplier_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1316,7 +1316,7 @@ export default function SupplierManagementPage() { try { const allMappings: any[] = []; const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; const itemIds = [...new Set(mappings.map((m: any) => m.item_id).filter(Boolean))]; diff --git a/frontend/app/(main)/COMPANY_10/quality/inspection-result/page.tsx b/frontend/app/(main)/COMPANY_10/quality/inspection-result/page.tsx index d9e49d5f..d4093cab 100644 --- a/frontend/app/(main)/COMPANY_10/quality/inspection-result/page.tsx +++ b/frontend/app/(main)/COMPANY_10/quality/inspection-result/page.tsx @@ -101,7 +101,7 @@ export default function InspectionResultPage() { try { const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, search: { master_id: masterId }, }); diff --git a/frontend/app/(main)/COMPANY_10/quality/inspection/page.tsx b/frontend/app/(main)/COMPANY_10/quality/inspection/page.tsx index 359a81a7..4602a719 100644 --- a/frontend/app/(main)/COMPANY_10/quality/inspection/page.tsx +++ b/frontend/app/(main)/COMPANY_10/quality/inspection/page.tsx @@ -150,7 +150,7 @@ export default function InspectionManagementPage() { try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; @@ -209,7 +209,7 @@ export default function InspectionManagementPage() { })); const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -228,7 +228,7 @@ export default function InspectionManagementPage() { try { const res = await apiClient.post(`/table-management/tables/${DEFECT_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const rows = res.data?.data?.data || res.data?.data?.rows || []; @@ -246,7 +246,7 @@ export default function InspectionManagementPage() { try { const res = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const rows = res.data?.data?.data || res.data?.data?.rows || []; diff --git a/frontend/app/(main)/COMPANY_10/quality/item-inspection/page.tsx b/frontend/app/(main)/COMPANY_10/quality/item-inspection/page.tsx index becebe8f..0daf250d 100644 --- a/frontend/app/(main)/COMPANY_10/quality/item-inspection/page.tsx +++ b/frontend/app/(main)/COMPANY_10/quality/item-inspection/page.tsx @@ -119,9 +119,9 @@ export default function ItemInspectionInfoPage() { const loadOptions = async () => { try { const [itemRes, inspRes, userRes] = await Promise.all([ - apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }), + apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }), ]); const items = itemRes.data?.data?.data || itemRes.data?.data?.rows || []; setItemOptions(items.map((r: any) => ({ @@ -259,7 +259,7 @@ export default function ItemInspectionInfoPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -329,7 +329,7 @@ export default function ItemInspectionInfoPage() { try { const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_code", operator: "equals", value: code }] }, autoFilter: true, }); @@ -429,7 +429,7 @@ export default function ItemInspectionInfoPage() { try { if (editMode) { const existRes = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_code", operator: "equals", value: form.item_code }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_10/sales/claim/page.tsx b/frontend/app/(main)/COMPANY_10/sales/claim/page.tsx index a2c89599..48960623 100644 --- a/frontend/app/(main)/COMPANY_10/sales/claim/page.tsx +++ b/frontend/app/(main)/COMPANY_10/sales/claim/page.tsx @@ -190,7 +190,7 @@ export default function ClaimManagementPage() { const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "claim_date", order: "desc" }, diff --git a/frontend/app/(main)/COMPANY_10/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_10/sales/customer/page.tsx index fb410e54..44d6ac15 100644 --- a/frontend/app/(main)/COMPANY_10/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_10/sales/customer/page.tsx @@ -219,7 +219,7 @@ export default function CustomerManagementPage() { } catch { /* skip */ } }; load(); - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }) + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }) .then((res) => { const users = res.data?.data?.data || res.data?.data?.rows || []; setEmployeeOptions(users.map((u: any) => ({ @@ -284,7 +284,7 @@ export default function CustomerManagementPage() { const fetchMainContacts = useCallback(async () => { try { const contactRes = await apiClient.post(`/table-management/tables/${CONTACT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, dataFilter: { enabled: true, filters: [{ columnName: "is_main", operator: "equals", value: "Y" }] }, }); const allContacts = contactRes.data?.data?.data || contactRes.data?.data?.rows || []; @@ -310,7 +310,7 @@ export default function CustomerManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -337,7 +337,7 @@ export default function CustomerManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -413,7 +413,7 @@ export default function CustomerManagementPage() { setDeliveryLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_code", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -493,7 +493,7 @@ export default function CustomerManagementPage() { if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; const allRes = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "destination_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -566,7 +566,7 @@ export default function CustomerManagementPage() { const ruleId = ruleData.data.ruleId; // 기존 데이터에서 CUST-XXX 패턴의 최대 순번 조회 const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "customer_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -767,7 +767,7 @@ export default function CustomerManagementPage() { const ruleData = ruleRes.data; if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; - const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { page: 1, size: 500, autoFilter: true, sort: { columnName: "customer_code", order: "desc" } }); + const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { page: 1, size: 0, autoFilter: true, sort: { columnName: "customer_code", order: "desc" } }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; let maxSeq = 0; for (const row of allRows) { const match = (row.customer_code || "").match(/(\d+)$/); if (match) { const seq = parseInt(match[1], 10); if (seq > maxSeq) maxSeq = seq; } } @@ -822,7 +822,7 @@ export default function CustomerManagementPage() { ? [{ columnName: "division", operator: "contains", value: salesCode }] : []; const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters }, autoFilter: true, }); @@ -1247,7 +1247,7 @@ export default function CustomerManagementPage() { for (const itemId of itemIds) { // 해당 품목의 모든 매핑 조회 → customer_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer!.customer_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1264,7 +1264,7 @@ export default function CustomerManagementPage() { // 해당 품목의 모든 단가 조회 → customer_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer!.customer_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1336,7 +1336,7 @@ export default function CustomerManagementPage() { try { const allMappings: any[] = []; const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; const itemIds = [...new Set(mappings.map((m: any) => m.item_id).filter(Boolean))]; diff --git a/frontend/app/(main)/COMPANY_10/sales/order/page.tsx b/frontend/app/(main)/COMPANY_10/sales/order/page.tsx index 221a28d7..f62967f1 100644 --- a/frontend/app/(main)/COMPANY_10/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_10/sales/order/page.tsx @@ -277,7 +277,7 @@ export default function SalesOrderPage() { // 거래처 목록 try { const custRes = await apiClient.post(`/table-management/tables/customer_mng/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const custs = custRes.data?.data?.data || custRes.data?.data?.rows || []; optMap["partner_id"] = custs.map((c: any) => ({ code: c.customer_code, label: c.customer_name })); @@ -285,7 +285,7 @@ export default function SalesOrderPage() { // 사용자 목록 try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; optMap["manager_id"] = users.map((u: any) => ({ @@ -330,7 +330,7 @@ export default function SalesOrderPage() { })); const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "order_no", order: "desc" }, @@ -770,7 +770,7 @@ export default function SalesOrderPage() { if (isCustomerPrice && partnerId) { try { const mappingRes = await apiClient.post(`/table-management/tables/customer_item_mapping/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "customer_id", operator: "equals", value: partnerId }] }, autoFilter: true, }); @@ -860,7 +860,7 @@ export default function SalesOrderPage() { try { const itemIds = selected.map((item) => item.item_number || item.id); const res = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ @@ -931,7 +931,7 @@ export default function SalesOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_number", operator: "in", value: itemCodes }] }, autoFilter: true, }); @@ -954,7 +954,7 @@ export default function SalesOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: partnerId }, { columnName: "item_id", operator: "in", value: itemCodes }, diff --git a/frontend/app/(main)/COMPANY_10/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_10/sales/sales-item/page.tsx index 6e558a82..e03b9b65 100644 --- a/frontend/app/(main)/COMPANY_10/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_10/sales/sales-item/page.tsx @@ -327,7 +327,7 @@ export default function SalesItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -373,7 +373,7 @@ export default function SalesItemPage() { try { // 1. customer_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -401,7 +401,7 @@ export default function SalesItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1111,7 +1111,7 @@ export default function SalesItemPage() { for (const custCode of customerCodes) { // 해당 거래처의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, @@ -1128,7 +1128,7 @@ export default function SalesItemPage() { // 해당 거래처의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, diff --git a/frontend/app/(main)/COMPANY_16/equipment/info/page.tsx b/frontend/app/(main)/COMPANY_16/equipment/info/page.tsx index e08ad1a9..4eb21404 100644 --- a/frontend/app/(main)/COMPANY_16/equipment/info/page.tsx +++ b/frontend/app/(main)/COMPANY_16/equipment/info/page.tsx @@ -168,7 +168,7 @@ export default function EquipmentInfoPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${EQUIP_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -213,7 +213,7 @@ export default function EquipmentInfoPage() { setInspectionLoading(true); try { const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: selectedEquip.equipment_code }] }, autoFilter: true, }); @@ -231,7 +231,7 @@ export default function EquipmentInfoPage() { setConsumableLoading(true); try { const res = await apiClient.post(`/table-management/tables/${CONSUMABLE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: selectedEquip.equipment_code }] }, autoFilter: true, }); @@ -407,7 +407,7 @@ export default function EquipmentInfoPage() { if (consumableDiv) filters.push({ columnName: "division", operator: "equals", value: consumableDiv.valueCode }); const results = await Promise.all(filters.map((f) => apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [f] }, autoFilter: true, }) @@ -454,7 +454,7 @@ export default function EquipmentInfoPage() { setCopyLoading(true); try { const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: equipCode }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_16/equipment/inspection-record/page.tsx b/frontend/app/(main)/COMPANY_16/equipment/inspection-record/page.tsx index 40a1521a..45a34458 100644 --- a/frontend/app/(main)/COMPANY_16/equipment/inspection-record/page.tsx +++ b/frontend/app/(main)/COMPANY_16/equipment/inspection-record/page.tsx @@ -83,7 +83,7 @@ export default function EquipmentInspectionRecordPage() { }).catch(() => ({ data: { data: { data: [] } } })), apiClient.post(`/table-management/tables/equipment_mng/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }).catch(() => ({ data: { data: { data: [] } } })), ]); diff --git a/frontend/app/(main)/COMPANY_16/equipment/plc-settings/page.tsx b/frontend/app/(main)/COMPANY_16/equipment/plc-settings/page.tsx index 4e94d293..1736fe09 100644 --- a/frontend/app/(main)/COMPANY_16/equipment/plc-settings/page.tsx +++ b/frontend/app/(main)/COMPANY_16/equipment/plc-settings/page.tsx @@ -100,7 +100,7 @@ export default function PlcSettingsPage() { useEffect(() => { const load = async () => { try { - const eqRes = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, size: 500, autoFilter: true }); + const eqRes = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, size: 0, autoFilter: true }); const eqs = eqRes.data?.data?.data || eqRes.data?.data?.rows || []; setEquipOptions(eqs.map((r: any) => ({ code: r.equipment_code, label: `${r.equipment_code} - ${r.equipment_name || ""}` }))); } catch { /* skip */ } @@ -122,7 +122,7 @@ export default function PlcSettingsPage() { const filters: any[] = []; if (kw.trim()) filters.push({ columnName: "equipment_code", operator: "contains", value: kw.trim() }); const res = await apiClient.post(`/table-management/tables/${DATATYPE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -140,7 +140,7 @@ export default function PlcSettingsPage() { const filters: any[] = []; if (kw.trim()) filters.push({ columnName: "config_name", operator: "contains", value: kw.trim() }); const res = await apiClient.post(`/table-management/tables/${COLLECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_16/logistics/inbound-outbound/page.tsx b/frontend/app/(main)/COMPANY_16/logistics/inbound-outbound/page.tsx index bbad370b..806bb52d 100644 --- a/frontend/app/(main)/COMPANY_16/logistics/inbound-outbound/page.tsx +++ b/frontend/app/(main)/COMPANY_16/logistics/inbound-outbound/page.tsx @@ -150,7 +150,7 @@ export default function InboundOutboundPage() { if (writerIds.length > 0) { try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; const uMap: Record = {}; diff --git a/frontend/app/(main)/COMPANY_16/logistics/info/page.tsx b/frontend/app/(main)/COMPANY_16/logistics/info/page.tsx index 35764744..5f44e0ec 100644 --- a/frontend/app/(main)/COMPANY_16/logistics/info/page.tsx +++ b/frontend/app/(main)/COMPANY_16/logistics/info/page.tsx @@ -327,11 +327,11 @@ export default function LogisticsInfoPage() { try { const [carrierRes, routeRes] = await Promise.all([ apiClient.post("/table-management/tables/carrier_mng/data", { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "carrier_code", order: "asc" }, }), apiClient.post("/table-management/tables/delivery_route_mng/data", { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "route_code", order: "asc" }, }), ]); @@ -393,7 +393,7 @@ export default function LogisticsInfoPage() { const res = await apiClient.post( `/table-management/tables/${config.tableName}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: config.defaultSortColumn, order: "asc" }, } ); diff --git a/frontend/app/(main)/COMPANY_16/logistics/inventory/page.tsx b/frontend/app/(main)/COMPANY_16/logistics/inventory/page.tsx index 5c0ddcc1..0f9d675f 100644 --- a/frontend/app/(main)/COMPANY_16/logistics/inventory/page.tsx +++ b/frontend/app/(main)/COMPANY_16/logistics/inventory/page.tsx @@ -190,13 +190,13 @@ export default function InventoryStatusPage() { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const [stockRes, itemRes, whRes] = await Promise.all([ apiClient.post(`/table-management/tables/${STOCK_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "item_code", order: "asc" }, }), - apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/warehouse_info/data`, { page: 1, size: 500, autoFilter: true }), + apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/warehouse_info/data`, { page: 1, size: 0, autoFilter: true }), ]); const raw = stockRes.data?.data?.data || stockRes.data?.data?.rows || []; const items = itemRes.data?.data?.data || itemRes.data?.data?.rows || []; @@ -260,7 +260,7 @@ export default function InventoryStatusPage() { `/table-management/tables/${HISTORY_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: { enabled: true, filters: historyFilters }, autoFilter: true, sort: { columnName: "transaction_date", order: "desc" }, diff --git a/frontend/app/(main)/COMPANY_16/logistics/warehouse/page.tsx b/frontend/app/(main)/COMPANY_16/logistics/warehouse/page.tsx index 96b3d47e..2a194939 100644 --- a/frontend/app/(main)/COMPANY_16/logistics/warehouse/page.tsx +++ b/frontend/app/(main)/COMPANY_16/logistics/warehouse/page.tsx @@ -230,7 +230,7 @@ export default function WarehouseManagementPage() { `/table-management/tables/${WAREHOUSE_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "warehouse_code", order: "asc" }, @@ -270,7 +270,7 @@ export default function WarehouseManagementPage() { `/table-management/tables/${LOCATION_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: { enabled: true, filters: [ diff --git a/frontend/app/(main)/COMPANY_16/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_16/master-data/company/page.tsx index 0e4de0cd..a607b7ea 100644 --- a/frontend/app/(main)/COMPANY_16/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_16/master-data/company/page.tsx @@ -193,7 +193,7 @@ export default function CompanyPage() { setDeptLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DEPT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; setDepts(raw); @@ -217,7 +217,7 @@ export default function CompanyPage() { setMemberLoading(true); try { const res = await apiClient.post(`/table-management/tables/${USER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "dept_code", operator: "equals", value: selectedDeptCode }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_16/master-data/department/page.tsx b/frontend/app/(main)/COMPANY_16/master-data/department/page.tsx index 33ea1535..7ec5e3da 100644 --- a/frontend/app/(main)/COMPANY_16/master-data/department/page.tsx +++ b/frontend/app/(main)/COMPANY_16/master-data/department/page.tsx @@ -99,7 +99,7 @@ export default function DepartmentPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${DEPT_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -129,7 +129,7 @@ export default function DepartmentPage() { ? [{ columnName: "dept_code", operator: "equals", value: selectedDeptCode }] : []; const res = await apiClient.post(`/table-management/tables/${USER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_16/monitoring/equipment/page.tsx b/frontend/app/(main)/COMPANY_16/monitoring/equipment/page.tsx index b165ff65..ed292682 100644 --- a/frontend/app/(main)/COMPANY_16/monitoring/equipment/page.tsx +++ b/frontend/app/(main)/COMPANY_16/monitoring/equipment/page.tsx @@ -170,7 +170,7 @@ export default function EquipmentMonitoringPage() { apiClient.post("/table-management/tables/equipment_mng/data", { autoFilter: true, page: 1, - size: 500, + size: 0, }), apiClient.get("/work-instruction/list").catch(() => ({ data: { data: [] } })), apiClient.post("/table-management/tables/work_order_process/data", { diff --git a/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor-item/page.tsx index 92673fa0..8f1802c4 100644 --- a/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor-item/page.tsx @@ -153,7 +153,7 @@ export default function SubcontractorItemPage() { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -191,7 +191,7 @@ export default function SubcontractorItemPage() { setSubcontractorLoading(true); try { const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor/page.tsx index 9624736b..2a5684b0 100644 --- a/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_16/outsourcing/subcontractor/page.tsx @@ -194,7 +194,7 @@ export default function SubcontractorManagementPage() { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${SUBCONTRACTOR_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -229,7 +229,7 @@ export default function SubcontractorManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, ]}, @@ -256,7 +256,7 @@ export default function SubcontractorManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, ]}, @@ -413,7 +413,7 @@ export default function SubcontractorManagementPage() { const filters: any[] = []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -550,7 +550,7 @@ export default function SubcontractorManagementPage() { }> = []; try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor!.subcontractor_code }, { columnName: "item_id", operator: "equals", value: itemKey }, @@ -610,7 +610,7 @@ export default function SubcontractorManagementPage() { // 2) 기존 단가 모두 삭제 (subcontractor_id + item_id 기준) try { const existingPrices = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, { columnName: "item_id", operator: "equals", value: itemKey }, @@ -727,7 +727,7 @@ export default function SubcontractorManagementPage() { if (subCodes.length > 0) { const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; diff --git a/frontend/app/(main)/COMPANY_16/production/bom/page.tsx b/frontend/app/(main)/COMPANY_16/production/bom/page.tsx index 9b2e32c8..ef441cfc 100644 --- a/frontend/app/(main)/COMPANY_16/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_16/production/bom/page.tsx @@ -349,7 +349,7 @@ export default function BomManagementPage() { const res = await apiClient.post(`/table-management/tables/${BOM_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "created_at", order: "desc" }, @@ -631,7 +631,7 @@ export default function BomManagementPage() { // bom_detail에서 child_item_id가 현재 품목인 행 조회 const itemId = bomHeader.item_id || bomHeader.id; const res = await apiClient.post(`/table-management/tables/bom_detail/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "child_item_id", operator: "equals", value: itemId }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_16/production/result/page.tsx b/frontend/app/(main)/COMPANY_16/production/result/page.tsx index b2176781..151bc0bf 100644 --- a/frontend/app/(main)/COMPANY_16/production/result/page.tsx +++ b/frontend/app/(main)/COMPANY_16/production/result/page.tsx @@ -183,7 +183,7 @@ export default function ProductionResultPage() { setProcessLoading(true); try { const res = await apiClient.post(`/table-management/tables/${WOP_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "wo_id", operator: "equals", value: selectedWiId }] }, autoFilter: true, sort: { columnName: "seq_no", order: "asc" }, diff --git a/frontend/app/(main)/COMPANY_16/purchase/order/page.tsx b/frontend/app/(main)/COMPANY_16/purchase/order/page.tsx index 5da53411..bfbca4e3 100644 --- a/frontend/app/(main)/COMPANY_16/purchase/order/page.tsx +++ b/frontend/app/(main)/COMPANY_16/purchase/order/page.tsx @@ -237,7 +237,7 @@ export default function PurchaseOrderPage() { ); try { const suppRes = await apiClient.post(`/table-management/tables/supplier_mng/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const supps = suppRes.data?.data?.data || suppRes.data?.data?.rows || []; optMap["supplier_code"] = supps.map((s: any) => ({ @@ -247,7 +247,7 @@ export default function PurchaseOrderPage() { } catch { /* skip */ } try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; optMap["manager"] = users.map((u: any) => ({ @@ -293,7 +293,7 @@ export default function PurchaseOrderPage() { } const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: detailFilters.length > 0 ? { enabled: true, filters: detailFilters } : undefined, autoFilter: true, sort: { columnName: "purchase_no", order: "desc" }, @@ -607,7 +607,7 @@ export default function PurchaseOrderPage() { try { const itemIds = selected.map((item) => item.item_number || item.id); const res = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ @@ -670,7 +670,7 @@ export default function PurchaseOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_number", operator: "in", value: itemCodes }] }, autoFilter: true, }); @@ -692,7 +692,7 @@ export default function PurchaseOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: supplierCode }, { columnName: "item_id", operator: "in", value: itemCodes }, diff --git a/frontend/app/(main)/COMPANY_16/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_16/purchase/purchase-item/page.tsx index fd203d40..42db2edf 100644 --- a/frontend/app/(main)/COMPANY_16/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_16/purchase/purchase-item/page.tsx @@ -328,7 +328,7 @@ export default function PurchaseItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -619,7 +619,7 @@ export default function PurchaseItemPage() { try { // 1. supplier_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -647,7 +647,7 @@ export default function PurchaseItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1104,7 +1104,7 @@ export default function PurchaseItemPage() { for (const suppCode of supplierCodes) { // 해당 공급업체의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, @@ -1121,7 +1121,7 @@ export default function PurchaseItemPage() { // 해당 공급업체의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, diff --git a/frontend/app/(main)/COMPANY_16/purchase/supplier/page.tsx b/frontend/app/(main)/COMPANY_16/purchase/supplier/page.tsx index e72b223b..dcd6d8c1 100644 --- a/frontend/app/(main)/COMPANY_16/purchase/supplier/page.tsx +++ b/frontend/app/(main)/COMPANY_16/purchase/supplier/page.tsx @@ -224,7 +224,7 @@ export default function SupplierManagementPage() { } catch { /* skip */ } }; load(); - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }) + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }) .then((res) => { const users = res.data?.data?.data || res.data?.data?.rows || []; setEmployeeOptions(users.map((u: any) => ({ @@ -244,7 +244,7 @@ export default function SupplierManagementPage() { })); const res = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" }, @@ -289,7 +289,7 @@ export default function SupplierManagementPage() { const fetchMainContacts = useCallback(async () => { try { const contactRes = await apiClient.post(`/table-management/tables/${CONTACT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, dataFilter: { enabled: true, filters: [{ columnName: "is_main", operator: "equals", value: "Y" }] }, }); const allContacts = contactRes.data?.data?.data || contactRes.data?.data?.rows || []; @@ -315,7 +315,7 @@ export default function SupplierManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -342,7 +342,7 @@ export default function SupplierManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -417,7 +417,7 @@ export default function SupplierManagementPage() { setDeliveryLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_code", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -497,7 +497,7 @@ export default function SupplierManagementPage() { if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; const allRes = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "destination_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -570,7 +570,7 @@ export default function SupplierManagementPage() { const ruleId = ruleData.data.ruleId; // 기존 데이터에서 CUST-XXX 패턴의 최대 순번 조회 const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -771,7 +771,7 @@ export default function SupplierManagementPage() { const ruleData = ruleRes.data; if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; - const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { page: 1, size: 500, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" } }); + const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { page: 1, size: 0, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" } }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; let maxSeq = 0; for (const row of allRows) { const match = (row.supplier_code || "").match(/(\d+)$/); if (match) { const seq = parseInt(match[1], 10); if (seq > maxSeq) maxSeq = seq; } } @@ -824,7 +824,7 @@ export default function SupplierManagementPage() { const filters: any[] = []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -1232,7 +1232,7 @@ export default function SupplierManagementPage() { for (const itemId of itemIds) { // 해당 품목의 모든 매핑 조회 → supplier_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier!.supplier_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1249,7 +1249,7 @@ export default function SupplierManagementPage() { // 해당 품목의 모든 단가 조회 → supplier_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier!.supplier_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1324,7 +1324,7 @@ export default function SupplierManagementPage() { try { const allMappings: any[] = []; const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; const itemIds = [...new Set(mappings.map((m: any) => m.item_id).filter(Boolean))]; diff --git a/frontend/app/(main)/COMPANY_16/quality/inspection-result/page.tsx b/frontend/app/(main)/COMPANY_16/quality/inspection-result/page.tsx index d9e49d5f..d4093cab 100644 --- a/frontend/app/(main)/COMPANY_16/quality/inspection-result/page.tsx +++ b/frontend/app/(main)/COMPANY_16/quality/inspection-result/page.tsx @@ -101,7 +101,7 @@ export default function InspectionResultPage() { try { const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, search: { master_id: masterId }, }); diff --git a/frontend/app/(main)/COMPANY_16/quality/inspection/page.tsx b/frontend/app/(main)/COMPANY_16/quality/inspection/page.tsx index 359a81a7..4602a719 100644 --- a/frontend/app/(main)/COMPANY_16/quality/inspection/page.tsx +++ b/frontend/app/(main)/COMPANY_16/quality/inspection/page.tsx @@ -150,7 +150,7 @@ export default function InspectionManagementPage() { try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; @@ -209,7 +209,7 @@ export default function InspectionManagementPage() { })); const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -228,7 +228,7 @@ export default function InspectionManagementPage() { try { const res = await apiClient.post(`/table-management/tables/${DEFECT_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const rows = res.data?.data?.data || res.data?.data?.rows || []; @@ -246,7 +246,7 @@ export default function InspectionManagementPage() { try { const res = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const rows = res.data?.data?.data || res.data?.data?.rows || []; diff --git a/frontend/app/(main)/COMPANY_16/quality/item-inspection/page.tsx b/frontend/app/(main)/COMPANY_16/quality/item-inspection/page.tsx index becebe8f..0daf250d 100644 --- a/frontend/app/(main)/COMPANY_16/quality/item-inspection/page.tsx +++ b/frontend/app/(main)/COMPANY_16/quality/item-inspection/page.tsx @@ -119,9 +119,9 @@ export default function ItemInspectionInfoPage() { const loadOptions = async () => { try { const [itemRes, inspRes, userRes] = await Promise.all([ - apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }), + apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }), ]); const items = itemRes.data?.data?.data || itemRes.data?.data?.rows || []; setItemOptions(items.map((r: any) => ({ @@ -259,7 +259,7 @@ export default function ItemInspectionInfoPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -329,7 +329,7 @@ export default function ItemInspectionInfoPage() { try { const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_code", operator: "equals", value: code }] }, autoFilter: true, }); @@ -429,7 +429,7 @@ export default function ItemInspectionInfoPage() { try { if (editMode) { const existRes = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_code", operator: "equals", value: form.item_code }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_16/sales/claim/page.tsx b/frontend/app/(main)/COMPANY_16/sales/claim/page.tsx index a2c89599..48960623 100644 --- a/frontend/app/(main)/COMPANY_16/sales/claim/page.tsx +++ b/frontend/app/(main)/COMPANY_16/sales/claim/page.tsx @@ -190,7 +190,7 @@ export default function ClaimManagementPage() { const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "claim_date", order: "desc" }, diff --git a/frontend/app/(main)/COMPANY_16/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_16/sales/customer/page.tsx index 55473eae..45420523 100644 --- a/frontend/app/(main)/COMPANY_16/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_16/sales/customer/page.tsx @@ -224,7 +224,7 @@ export default function CustomerManagementPage() { } catch { /* skip */ } }; load(); - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }) + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }) .then((res) => { const users = res.data?.data?.data || res.data?.data?.rows || []; setEmployeeOptions(users.map((u: any) => ({ @@ -289,7 +289,7 @@ export default function CustomerManagementPage() { const fetchMainContacts = useCallback(async () => { try { const contactRes = await apiClient.post(`/table-management/tables/${CONTACT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, dataFilter: { enabled: true, filters: [{ columnName: "is_main", operator: "equals", value: "Y" }] }, }); const allContacts = contactRes.data?.data?.data || contactRes.data?.data?.rows || []; @@ -315,7 +315,7 @@ export default function CustomerManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -342,7 +342,7 @@ export default function CustomerManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -418,7 +418,7 @@ export default function CustomerManagementPage() { setDeliveryLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_code", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -498,7 +498,7 @@ export default function CustomerManagementPage() { if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; const allRes = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "destination_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -571,7 +571,7 @@ export default function CustomerManagementPage() { const ruleId = ruleData.data.ruleId; // 기존 데이터에서 CUST-XXX 패턴의 최대 순번 조회 const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "customer_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -772,7 +772,7 @@ export default function CustomerManagementPage() { const ruleData = ruleRes.data; if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; - const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { page: 1, size: 500, autoFilter: true, sort: { columnName: "customer_code", order: "desc" } }); + const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { page: 1, size: 0, autoFilter: true, sort: { columnName: "customer_code", order: "desc" } }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; let maxSeq = 0; for (const row of allRows) { const match = (row.customer_code || "").match(/(\d+)$/); if (match) { const seq = parseInt(match[1], 10); if (seq > maxSeq) maxSeq = seq; } } @@ -827,7 +827,7 @@ export default function CustomerManagementPage() { ? [{ columnName: "division", operator: "contains", value: salesCode }] : []; const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters }, autoFilter: true, }); @@ -1252,7 +1252,7 @@ export default function CustomerManagementPage() { for (const itemId of itemIds) { // 해당 품목의 모든 매핑 조회 → customer_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer!.customer_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1269,7 +1269,7 @@ export default function CustomerManagementPage() { // 해당 품목의 모든 단가 조회 → customer_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer!.customer_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1344,7 +1344,7 @@ export default function CustomerManagementPage() { try { const allMappings: any[] = []; const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; const itemIds = [...new Set(mappings.map((m: any) => m.item_id).filter(Boolean))]; diff --git a/frontend/app/(main)/COMPANY_16/sales/order/page.tsx b/frontend/app/(main)/COMPANY_16/sales/order/page.tsx index 221a28d7..f62967f1 100644 --- a/frontend/app/(main)/COMPANY_16/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_16/sales/order/page.tsx @@ -277,7 +277,7 @@ export default function SalesOrderPage() { // 거래처 목록 try { const custRes = await apiClient.post(`/table-management/tables/customer_mng/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const custs = custRes.data?.data?.data || custRes.data?.data?.rows || []; optMap["partner_id"] = custs.map((c: any) => ({ code: c.customer_code, label: c.customer_name })); @@ -285,7 +285,7 @@ export default function SalesOrderPage() { // 사용자 목록 try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; optMap["manager_id"] = users.map((u: any) => ({ @@ -330,7 +330,7 @@ export default function SalesOrderPage() { })); const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "order_no", order: "desc" }, @@ -770,7 +770,7 @@ export default function SalesOrderPage() { if (isCustomerPrice && partnerId) { try { const mappingRes = await apiClient.post(`/table-management/tables/customer_item_mapping/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "customer_id", operator: "equals", value: partnerId }] }, autoFilter: true, }); @@ -860,7 +860,7 @@ export default function SalesOrderPage() { try { const itemIds = selected.map((item) => item.item_number || item.id); const res = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ @@ -931,7 +931,7 @@ export default function SalesOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_number", operator: "in", value: itemCodes }] }, autoFilter: true, }); @@ -954,7 +954,7 @@ export default function SalesOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: partnerId }, { columnName: "item_id", operator: "in", value: itemCodes }, diff --git a/frontend/app/(main)/COMPANY_16/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_16/sales/sales-item/page.tsx index 6e558a82..e03b9b65 100644 --- a/frontend/app/(main)/COMPANY_16/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_16/sales/sales-item/page.tsx @@ -327,7 +327,7 @@ export default function SalesItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -373,7 +373,7 @@ export default function SalesItemPage() { try { // 1. customer_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -401,7 +401,7 @@ export default function SalesItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1111,7 +1111,7 @@ export default function SalesItemPage() { for (const custCode of customerCodes) { // 해당 거래처의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, @@ -1128,7 +1128,7 @@ export default function SalesItemPage() { // 해당 거래처의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, diff --git a/frontend/app/(main)/COMPANY_29/equipment/info/page.tsx b/frontend/app/(main)/COMPANY_29/equipment/info/page.tsx index cad20e4d..c2f3c0ca 100644 --- a/frontend/app/(main)/COMPANY_29/equipment/info/page.tsx +++ b/frontend/app/(main)/COMPANY_29/equipment/info/page.tsx @@ -165,7 +165,7 @@ export default function EquipmentInfoPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${EQUIP_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -209,7 +209,7 @@ export default function EquipmentInfoPage() { setInspectionLoading(true); try { const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: selectedEquip.equipment_code }] }, autoFilter: true, }); @@ -226,7 +226,7 @@ export default function EquipmentInfoPage() { setConsumableLoading(true); try { const res = await apiClient.post(`/table-management/tables/${CONSUMABLE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: selectedEquip.equipment_code }] }, autoFilter: true, }); @@ -362,7 +362,7 @@ export default function EquipmentInfoPage() { if (consumableDiv) filters.push({ columnName: "division", operator: "equals", value: consumableDiv.valueCode }); const results = await Promise.all(filters.map((f) => apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [f] }, autoFilter: true, }) @@ -409,7 +409,7 @@ export default function EquipmentInfoPage() { setCopyLoading(true); try { const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: equipCode }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_29/equipment/inspection-record/page.tsx b/frontend/app/(main)/COMPANY_29/equipment/inspection-record/page.tsx index 40a1521a..45a34458 100644 --- a/frontend/app/(main)/COMPANY_29/equipment/inspection-record/page.tsx +++ b/frontend/app/(main)/COMPANY_29/equipment/inspection-record/page.tsx @@ -83,7 +83,7 @@ export default function EquipmentInspectionRecordPage() { }).catch(() => ({ data: { data: { data: [] } } })), apiClient.post(`/table-management/tables/equipment_mng/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }).catch(() => ({ data: { data: { data: [] } } })), ]); diff --git a/frontend/app/(main)/COMPANY_29/equipment/plc-settings/page.tsx b/frontend/app/(main)/COMPANY_29/equipment/plc-settings/page.tsx index 4e94d293..1736fe09 100644 --- a/frontend/app/(main)/COMPANY_29/equipment/plc-settings/page.tsx +++ b/frontend/app/(main)/COMPANY_29/equipment/plc-settings/page.tsx @@ -100,7 +100,7 @@ export default function PlcSettingsPage() { useEffect(() => { const load = async () => { try { - const eqRes = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, size: 500, autoFilter: true }); + const eqRes = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, size: 0, autoFilter: true }); const eqs = eqRes.data?.data?.data || eqRes.data?.data?.rows || []; setEquipOptions(eqs.map((r: any) => ({ code: r.equipment_code, label: `${r.equipment_code} - ${r.equipment_name || ""}` }))); } catch { /* skip */ } @@ -122,7 +122,7 @@ export default function PlcSettingsPage() { const filters: any[] = []; if (kw.trim()) filters.push({ columnName: "equipment_code", operator: "contains", value: kw.trim() }); const res = await apiClient.post(`/table-management/tables/${DATATYPE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -140,7 +140,7 @@ export default function PlcSettingsPage() { const filters: any[] = []; if (kw.trim()) filters.push({ columnName: "config_name", operator: "contains", value: kw.trim() }); const res = await apiClient.post(`/table-management/tables/${COLLECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_29/logistics/inbound-outbound/page.tsx b/frontend/app/(main)/COMPANY_29/logistics/inbound-outbound/page.tsx index bbad370b..806bb52d 100644 --- a/frontend/app/(main)/COMPANY_29/logistics/inbound-outbound/page.tsx +++ b/frontend/app/(main)/COMPANY_29/logistics/inbound-outbound/page.tsx @@ -150,7 +150,7 @@ export default function InboundOutboundPage() { if (writerIds.length > 0) { try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; const uMap: Record = {}; diff --git a/frontend/app/(main)/COMPANY_29/logistics/info/page.tsx b/frontend/app/(main)/COMPANY_29/logistics/info/page.tsx index 35764744..5f44e0ec 100644 --- a/frontend/app/(main)/COMPANY_29/logistics/info/page.tsx +++ b/frontend/app/(main)/COMPANY_29/logistics/info/page.tsx @@ -327,11 +327,11 @@ export default function LogisticsInfoPage() { try { const [carrierRes, routeRes] = await Promise.all([ apiClient.post("/table-management/tables/carrier_mng/data", { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "carrier_code", order: "asc" }, }), apiClient.post("/table-management/tables/delivery_route_mng/data", { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "route_code", order: "asc" }, }), ]); @@ -393,7 +393,7 @@ export default function LogisticsInfoPage() { const res = await apiClient.post( `/table-management/tables/${config.tableName}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: config.defaultSortColumn, order: "asc" }, } ); diff --git a/frontend/app/(main)/COMPANY_29/logistics/inventory/page.tsx b/frontend/app/(main)/COMPANY_29/logistics/inventory/page.tsx index 5c0ddcc1..0f9d675f 100644 --- a/frontend/app/(main)/COMPANY_29/logistics/inventory/page.tsx +++ b/frontend/app/(main)/COMPANY_29/logistics/inventory/page.tsx @@ -190,13 +190,13 @@ export default function InventoryStatusPage() { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const [stockRes, itemRes, whRes] = await Promise.all([ apiClient.post(`/table-management/tables/${STOCK_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "item_code", order: "asc" }, }), - apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/warehouse_info/data`, { page: 1, size: 500, autoFilter: true }), + apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/warehouse_info/data`, { page: 1, size: 0, autoFilter: true }), ]); const raw = stockRes.data?.data?.data || stockRes.data?.data?.rows || []; const items = itemRes.data?.data?.data || itemRes.data?.data?.rows || []; @@ -260,7 +260,7 @@ export default function InventoryStatusPage() { `/table-management/tables/${HISTORY_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: { enabled: true, filters: historyFilters }, autoFilter: true, sort: { columnName: "transaction_date", order: "desc" }, diff --git a/frontend/app/(main)/COMPANY_29/logistics/warehouse/page.tsx b/frontend/app/(main)/COMPANY_29/logistics/warehouse/page.tsx index 96b3d47e..2a194939 100644 --- a/frontend/app/(main)/COMPANY_29/logistics/warehouse/page.tsx +++ b/frontend/app/(main)/COMPANY_29/logistics/warehouse/page.tsx @@ -230,7 +230,7 @@ export default function WarehouseManagementPage() { `/table-management/tables/${WAREHOUSE_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "warehouse_code", order: "asc" }, @@ -270,7 +270,7 @@ export default function WarehouseManagementPage() { `/table-management/tables/${LOCATION_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: { enabled: true, filters: [ diff --git a/frontend/app/(main)/COMPANY_29/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_29/master-data/company/page.tsx index 0e4de0cd..a607b7ea 100644 --- a/frontend/app/(main)/COMPANY_29/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_29/master-data/company/page.tsx @@ -193,7 +193,7 @@ export default function CompanyPage() { setDeptLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DEPT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; setDepts(raw); @@ -217,7 +217,7 @@ export default function CompanyPage() { setMemberLoading(true); try { const res = await apiClient.post(`/table-management/tables/${USER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "dept_code", operator: "equals", value: selectedDeptCode }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_29/master-data/department/page.tsx b/frontend/app/(main)/COMPANY_29/master-data/department/page.tsx index 6eb4c2f2..a24fd804 100644 --- a/frontend/app/(main)/COMPANY_29/master-data/department/page.tsx +++ b/frontend/app/(main)/COMPANY_29/master-data/department/page.tsx @@ -99,7 +99,7 @@ export default function DepartmentPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${DEPT_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -129,7 +129,7 @@ export default function DepartmentPage() { ? [{ columnName: "dept_code", operator: "equals", value: selectedDeptCode }] : []; const res = await apiClient.post(`/table-management/tables/${USER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_29/monitoring/equipment/page.tsx b/frontend/app/(main)/COMPANY_29/monitoring/equipment/page.tsx index b165ff65..ed292682 100644 --- a/frontend/app/(main)/COMPANY_29/monitoring/equipment/page.tsx +++ b/frontend/app/(main)/COMPANY_29/monitoring/equipment/page.tsx @@ -170,7 +170,7 @@ export default function EquipmentMonitoringPage() { apiClient.post("/table-management/tables/equipment_mng/data", { autoFilter: true, page: 1, - size: 500, + size: 0, }), apiClient.get("/work-instruction/list").catch(() => ({ data: { data: [] } })), apiClient.post("/table-management/tables/work_order_process/data", { diff --git a/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor-item/page.tsx index 92673fa0..8f1802c4 100644 --- a/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor-item/page.tsx @@ -153,7 +153,7 @@ export default function SubcontractorItemPage() { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -191,7 +191,7 @@ export default function SubcontractorItemPage() { setSubcontractorLoading(true); try { const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor/page.tsx index 9624736b..2a5684b0 100644 --- a/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_29/outsourcing/subcontractor/page.tsx @@ -194,7 +194,7 @@ export default function SubcontractorManagementPage() { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${SUBCONTRACTOR_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -229,7 +229,7 @@ export default function SubcontractorManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, ]}, @@ -256,7 +256,7 @@ export default function SubcontractorManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, ]}, @@ -413,7 +413,7 @@ export default function SubcontractorManagementPage() { const filters: any[] = []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -550,7 +550,7 @@ export default function SubcontractorManagementPage() { }> = []; try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor!.subcontractor_code }, { columnName: "item_id", operator: "equals", value: itemKey }, @@ -610,7 +610,7 @@ export default function SubcontractorManagementPage() { // 2) 기존 단가 모두 삭제 (subcontractor_id + item_id 기준) try { const existingPrices = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, { columnName: "item_id", operator: "equals", value: itemKey }, @@ -727,7 +727,7 @@ export default function SubcontractorManagementPage() { if (subCodes.length > 0) { const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; diff --git a/frontend/app/(main)/COMPANY_29/production/bom/page.tsx b/frontend/app/(main)/COMPANY_29/production/bom/page.tsx index 9b2e32c8..ef441cfc 100644 --- a/frontend/app/(main)/COMPANY_29/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_29/production/bom/page.tsx @@ -349,7 +349,7 @@ export default function BomManagementPage() { const res = await apiClient.post(`/table-management/tables/${BOM_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "created_at", order: "desc" }, @@ -631,7 +631,7 @@ export default function BomManagementPage() { // bom_detail에서 child_item_id가 현재 품목인 행 조회 const itemId = bomHeader.item_id || bomHeader.id; const res = await apiClient.post(`/table-management/tables/bom_detail/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "child_item_id", operator: "equals", value: itemId }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_29/production/result/page.tsx b/frontend/app/(main)/COMPANY_29/production/result/page.tsx index b2176781..151bc0bf 100644 --- a/frontend/app/(main)/COMPANY_29/production/result/page.tsx +++ b/frontend/app/(main)/COMPANY_29/production/result/page.tsx @@ -183,7 +183,7 @@ export default function ProductionResultPage() { setProcessLoading(true); try { const res = await apiClient.post(`/table-management/tables/${WOP_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "wo_id", operator: "equals", value: selectedWiId }] }, autoFilter: true, sort: { columnName: "seq_no", order: "asc" }, diff --git a/frontend/app/(main)/COMPANY_29/purchase/order/page.tsx b/frontend/app/(main)/COMPANY_29/purchase/order/page.tsx index 5da53411..bfbca4e3 100644 --- a/frontend/app/(main)/COMPANY_29/purchase/order/page.tsx +++ b/frontend/app/(main)/COMPANY_29/purchase/order/page.tsx @@ -237,7 +237,7 @@ export default function PurchaseOrderPage() { ); try { const suppRes = await apiClient.post(`/table-management/tables/supplier_mng/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const supps = suppRes.data?.data?.data || suppRes.data?.data?.rows || []; optMap["supplier_code"] = supps.map((s: any) => ({ @@ -247,7 +247,7 @@ export default function PurchaseOrderPage() { } catch { /* skip */ } try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; optMap["manager"] = users.map((u: any) => ({ @@ -293,7 +293,7 @@ export default function PurchaseOrderPage() { } const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: detailFilters.length > 0 ? { enabled: true, filters: detailFilters } : undefined, autoFilter: true, sort: { columnName: "purchase_no", order: "desc" }, @@ -607,7 +607,7 @@ export default function PurchaseOrderPage() { try { const itemIds = selected.map((item) => item.item_number || item.id); const res = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ @@ -670,7 +670,7 @@ export default function PurchaseOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_number", operator: "in", value: itemCodes }] }, autoFilter: true, }); @@ -692,7 +692,7 @@ export default function PurchaseOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: supplierCode }, { columnName: "item_id", operator: "in", value: itemCodes }, diff --git a/frontend/app/(main)/COMPANY_29/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_29/purchase/purchase-item/page.tsx index fd203d40..42db2edf 100644 --- a/frontend/app/(main)/COMPANY_29/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_29/purchase/purchase-item/page.tsx @@ -328,7 +328,7 @@ export default function PurchaseItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -619,7 +619,7 @@ export default function PurchaseItemPage() { try { // 1. supplier_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -647,7 +647,7 @@ export default function PurchaseItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1104,7 +1104,7 @@ export default function PurchaseItemPage() { for (const suppCode of supplierCodes) { // 해당 공급업체의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, @@ -1121,7 +1121,7 @@ export default function PurchaseItemPage() { // 해당 공급업체의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, diff --git a/frontend/app/(main)/COMPANY_29/purchase/supplier/page.tsx b/frontend/app/(main)/COMPANY_29/purchase/supplier/page.tsx index 9b516330..964e7e09 100644 --- a/frontend/app/(main)/COMPANY_29/purchase/supplier/page.tsx +++ b/frontend/app/(main)/COMPANY_29/purchase/supplier/page.tsx @@ -219,7 +219,7 @@ export default function SupplierManagementPage() { } catch { /* skip */ } }; load(); - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }) + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }) .then((res) => { const users = res.data?.data?.data || res.data?.data?.rows || []; setEmployeeOptions(users.map((u: any) => ({ @@ -239,7 +239,7 @@ export default function SupplierManagementPage() { })); const res = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" }, @@ -284,7 +284,7 @@ export default function SupplierManagementPage() { const fetchMainContacts = useCallback(async () => { try { const contactRes = await apiClient.post(`/table-management/tables/${CONTACT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, dataFilter: { enabled: true, filters: [{ columnName: "is_main", operator: "equals", value: "Y" }] }, }); const allContacts = contactRes.data?.data?.data || contactRes.data?.data?.rows || []; @@ -310,7 +310,7 @@ export default function SupplierManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -337,7 +337,7 @@ export default function SupplierManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -412,7 +412,7 @@ export default function SupplierManagementPage() { setDeliveryLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_code", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -492,7 +492,7 @@ export default function SupplierManagementPage() { if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; const allRes = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "destination_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -565,7 +565,7 @@ export default function SupplierManagementPage() { const ruleId = ruleData.data.ruleId; // 기존 데이터에서 CUST-XXX 패턴의 최대 순번 조회 const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -766,7 +766,7 @@ export default function SupplierManagementPage() { const ruleData = ruleRes.data; if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; - const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { page: 1, size: 500, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" } }); + const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { page: 1, size: 0, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" } }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; let maxSeq = 0; for (const row of allRows) { const match = (row.supplier_code || "").match(/(\d+)$/); if (match) { const seq = parseInt(match[1], 10); if (seq > maxSeq) maxSeq = seq; } } @@ -819,7 +819,7 @@ export default function SupplierManagementPage() { const filters: any[] = []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -1227,7 +1227,7 @@ export default function SupplierManagementPage() { for (const itemId of itemIds) { // 해당 품목의 모든 매핑 조회 → supplier_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier!.supplier_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1244,7 +1244,7 @@ export default function SupplierManagementPage() { // 해당 품목의 모든 단가 조회 → supplier_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier!.supplier_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1316,7 +1316,7 @@ export default function SupplierManagementPage() { try { const allMappings: any[] = []; const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; const itemIds = [...new Set(mappings.map((m: any) => m.item_id).filter(Boolean))]; diff --git a/frontend/app/(main)/COMPANY_29/quality/inspection-result/page.tsx b/frontend/app/(main)/COMPANY_29/quality/inspection-result/page.tsx index d9e49d5f..d4093cab 100644 --- a/frontend/app/(main)/COMPANY_29/quality/inspection-result/page.tsx +++ b/frontend/app/(main)/COMPANY_29/quality/inspection-result/page.tsx @@ -101,7 +101,7 @@ export default function InspectionResultPage() { try { const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, search: { master_id: masterId }, }); diff --git a/frontend/app/(main)/COMPANY_29/quality/inspection/page.tsx b/frontend/app/(main)/COMPANY_29/quality/inspection/page.tsx index 359a81a7..4602a719 100644 --- a/frontend/app/(main)/COMPANY_29/quality/inspection/page.tsx +++ b/frontend/app/(main)/COMPANY_29/quality/inspection/page.tsx @@ -150,7 +150,7 @@ export default function InspectionManagementPage() { try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; @@ -209,7 +209,7 @@ export default function InspectionManagementPage() { })); const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -228,7 +228,7 @@ export default function InspectionManagementPage() { try { const res = await apiClient.post(`/table-management/tables/${DEFECT_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const rows = res.data?.data?.data || res.data?.data?.rows || []; @@ -246,7 +246,7 @@ export default function InspectionManagementPage() { try { const res = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const rows = res.data?.data?.data || res.data?.data?.rows || []; diff --git a/frontend/app/(main)/COMPANY_29/quality/item-inspection/page.tsx b/frontend/app/(main)/COMPANY_29/quality/item-inspection/page.tsx index becebe8f..0daf250d 100644 --- a/frontend/app/(main)/COMPANY_29/quality/item-inspection/page.tsx +++ b/frontend/app/(main)/COMPANY_29/quality/item-inspection/page.tsx @@ -119,9 +119,9 @@ export default function ItemInspectionInfoPage() { const loadOptions = async () => { try { const [itemRes, inspRes, userRes] = await Promise.all([ - apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }), + apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }), ]); const items = itemRes.data?.data?.data || itemRes.data?.data?.rows || []; setItemOptions(items.map((r: any) => ({ @@ -259,7 +259,7 @@ export default function ItemInspectionInfoPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -329,7 +329,7 @@ export default function ItemInspectionInfoPage() { try { const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_code", operator: "equals", value: code }] }, autoFilter: true, }); @@ -429,7 +429,7 @@ export default function ItemInspectionInfoPage() { try { if (editMode) { const existRes = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_code", operator: "equals", value: form.item_code }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_29/sales/claim/page.tsx b/frontend/app/(main)/COMPANY_29/sales/claim/page.tsx index a2c89599..48960623 100644 --- a/frontend/app/(main)/COMPANY_29/sales/claim/page.tsx +++ b/frontend/app/(main)/COMPANY_29/sales/claim/page.tsx @@ -190,7 +190,7 @@ export default function ClaimManagementPage() { const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "claim_date", order: "desc" }, diff --git a/frontend/app/(main)/COMPANY_29/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_29/sales/customer/page.tsx index fb410e54..44d6ac15 100644 --- a/frontend/app/(main)/COMPANY_29/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_29/sales/customer/page.tsx @@ -219,7 +219,7 @@ export default function CustomerManagementPage() { } catch { /* skip */ } }; load(); - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }) + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }) .then((res) => { const users = res.data?.data?.data || res.data?.data?.rows || []; setEmployeeOptions(users.map((u: any) => ({ @@ -284,7 +284,7 @@ export default function CustomerManagementPage() { const fetchMainContacts = useCallback(async () => { try { const contactRes = await apiClient.post(`/table-management/tables/${CONTACT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, dataFilter: { enabled: true, filters: [{ columnName: "is_main", operator: "equals", value: "Y" }] }, }); const allContacts = contactRes.data?.data?.data || contactRes.data?.data?.rows || []; @@ -310,7 +310,7 @@ export default function CustomerManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -337,7 +337,7 @@ export default function CustomerManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -413,7 +413,7 @@ export default function CustomerManagementPage() { setDeliveryLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_code", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -493,7 +493,7 @@ export default function CustomerManagementPage() { if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; const allRes = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "destination_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -566,7 +566,7 @@ export default function CustomerManagementPage() { const ruleId = ruleData.data.ruleId; // 기존 데이터에서 CUST-XXX 패턴의 최대 순번 조회 const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "customer_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -767,7 +767,7 @@ export default function CustomerManagementPage() { const ruleData = ruleRes.data; if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; - const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { page: 1, size: 500, autoFilter: true, sort: { columnName: "customer_code", order: "desc" } }); + const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { page: 1, size: 0, autoFilter: true, sort: { columnName: "customer_code", order: "desc" } }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; let maxSeq = 0; for (const row of allRows) { const match = (row.customer_code || "").match(/(\d+)$/); if (match) { const seq = parseInt(match[1], 10); if (seq > maxSeq) maxSeq = seq; } } @@ -822,7 +822,7 @@ export default function CustomerManagementPage() { ? [{ columnName: "division", operator: "contains", value: salesCode }] : []; const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters }, autoFilter: true, }); @@ -1247,7 +1247,7 @@ export default function CustomerManagementPage() { for (const itemId of itemIds) { // 해당 품목의 모든 매핑 조회 → customer_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer!.customer_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1264,7 +1264,7 @@ export default function CustomerManagementPage() { // 해당 품목의 모든 단가 조회 → customer_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer!.customer_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1336,7 +1336,7 @@ export default function CustomerManagementPage() { try { const allMappings: any[] = []; const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; const itemIds = [...new Set(mappings.map((m: any) => m.item_id).filter(Boolean))]; diff --git a/frontend/app/(main)/COMPANY_29/sales/order/page.tsx b/frontend/app/(main)/COMPANY_29/sales/order/page.tsx index 221a28d7..f62967f1 100644 --- a/frontend/app/(main)/COMPANY_29/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_29/sales/order/page.tsx @@ -277,7 +277,7 @@ export default function SalesOrderPage() { // 거래처 목록 try { const custRes = await apiClient.post(`/table-management/tables/customer_mng/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const custs = custRes.data?.data?.data || custRes.data?.data?.rows || []; optMap["partner_id"] = custs.map((c: any) => ({ code: c.customer_code, label: c.customer_name })); @@ -285,7 +285,7 @@ export default function SalesOrderPage() { // 사용자 목록 try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; optMap["manager_id"] = users.map((u: any) => ({ @@ -330,7 +330,7 @@ export default function SalesOrderPage() { })); const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "order_no", order: "desc" }, @@ -770,7 +770,7 @@ export default function SalesOrderPage() { if (isCustomerPrice && partnerId) { try { const mappingRes = await apiClient.post(`/table-management/tables/customer_item_mapping/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "customer_id", operator: "equals", value: partnerId }] }, autoFilter: true, }); @@ -860,7 +860,7 @@ export default function SalesOrderPage() { try { const itemIds = selected.map((item) => item.item_number || item.id); const res = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ @@ -931,7 +931,7 @@ export default function SalesOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_number", operator: "in", value: itemCodes }] }, autoFilter: true, }); @@ -954,7 +954,7 @@ export default function SalesOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: partnerId }, { columnName: "item_id", operator: "in", value: itemCodes }, diff --git a/frontend/app/(main)/COMPANY_29/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_29/sales/sales-item/page.tsx index 6e558a82..e03b9b65 100644 --- a/frontend/app/(main)/COMPANY_29/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_29/sales/sales-item/page.tsx @@ -327,7 +327,7 @@ export default function SalesItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -373,7 +373,7 @@ export default function SalesItemPage() { try { // 1. customer_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -401,7 +401,7 @@ export default function SalesItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1111,7 +1111,7 @@ export default function SalesItemPage() { for (const custCode of customerCodes) { // 해당 거래처의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, @@ -1128,7 +1128,7 @@ export default function SalesItemPage() { // 해당 거래처의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, diff --git a/frontend/app/(main)/COMPANY_30/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_30/purchase/purchase-item/page.tsx index 225f69d4..c05f7ec0 100644 --- a/frontend/app/(main)/COMPANY_30/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_30/purchase/purchase-item/page.tsx @@ -334,7 +334,7 @@ export default function PurchaseItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -625,7 +625,7 @@ export default function PurchaseItemPage() { try { // 1. supplier_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -653,7 +653,7 @@ export default function PurchaseItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1110,7 +1110,7 @@ export default function PurchaseItemPage() { for (const suppCode of supplierCodes) { // 해당 공급업체의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, @@ -1127,7 +1127,7 @@ export default function PurchaseItemPage() { // 해당 공급업체의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, diff --git a/frontend/app/(main)/COMPANY_30/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_30/sales/sales-item/page.tsx index 70ebf5c2..b98232cf 100644 --- a/frontend/app/(main)/COMPANY_30/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_30/sales/sales-item/page.tsx @@ -333,7 +333,7 @@ export default function SalesItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -379,7 +379,7 @@ export default function SalesItemPage() { try { // 1. customer_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -407,7 +407,7 @@ export default function SalesItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1117,7 +1117,7 @@ export default function SalesItemPage() { for (const custCode of customerCodes) { // 해당 거래처의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, @@ -1134,7 +1134,7 @@ export default function SalesItemPage() { // 해당 거래처의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, diff --git a/frontend/app/(main)/COMPANY_7/equipment/info/page.tsx b/frontend/app/(main)/COMPANY_7/equipment/info/page.tsx index cad20e4d..c2f3c0ca 100644 --- a/frontend/app/(main)/COMPANY_7/equipment/info/page.tsx +++ b/frontend/app/(main)/COMPANY_7/equipment/info/page.tsx @@ -165,7 +165,7 @@ export default function EquipmentInfoPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${EQUIP_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -209,7 +209,7 @@ export default function EquipmentInfoPage() { setInspectionLoading(true); try { const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: selectedEquip.equipment_code }] }, autoFilter: true, }); @@ -226,7 +226,7 @@ export default function EquipmentInfoPage() { setConsumableLoading(true); try { const res = await apiClient.post(`/table-management/tables/${CONSUMABLE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: selectedEquip.equipment_code }] }, autoFilter: true, }); @@ -362,7 +362,7 @@ export default function EquipmentInfoPage() { if (consumableDiv) filters.push({ columnName: "division", operator: "equals", value: consumableDiv.valueCode }); const results = await Promise.all(filters.map((f) => apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [f] }, autoFilter: true, }) @@ -409,7 +409,7 @@ export default function EquipmentInfoPage() { setCopyLoading(true); try { const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: equipCode }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_7/equipment/inspection-record/page.tsx b/frontend/app/(main)/COMPANY_7/equipment/inspection-record/page.tsx index 40a1521a..45a34458 100644 --- a/frontend/app/(main)/COMPANY_7/equipment/inspection-record/page.tsx +++ b/frontend/app/(main)/COMPANY_7/equipment/inspection-record/page.tsx @@ -83,7 +83,7 @@ export default function EquipmentInspectionRecordPage() { }).catch(() => ({ data: { data: { data: [] } } })), apiClient.post(`/table-management/tables/equipment_mng/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }).catch(() => ({ data: { data: { data: [] } } })), ]); diff --git a/frontend/app/(main)/COMPANY_7/equipment/plc-settings/page.tsx b/frontend/app/(main)/COMPANY_7/equipment/plc-settings/page.tsx index 4e94d293..1736fe09 100644 --- a/frontend/app/(main)/COMPANY_7/equipment/plc-settings/page.tsx +++ b/frontend/app/(main)/COMPANY_7/equipment/plc-settings/page.tsx @@ -100,7 +100,7 @@ export default function PlcSettingsPage() { useEffect(() => { const load = async () => { try { - const eqRes = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, size: 500, autoFilter: true }); + const eqRes = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, size: 0, autoFilter: true }); const eqs = eqRes.data?.data?.data || eqRes.data?.data?.rows || []; setEquipOptions(eqs.map((r: any) => ({ code: r.equipment_code, label: `${r.equipment_code} - ${r.equipment_name || ""}` }))); } catch { /* skip */ } @@ -122,7 +122,7 @@ export default function PlcSettingsPage() { const filters: any[] = []; if (kw.trim()) filters.push({ columnName: "equipment_code", operator: "contains", value: kw.trim() }); const res = await apiClient.post(`/table-management/tables/${DATATYPE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -140,7 +140,7 @@ export default function PlcSettingsPage() { const filters: any[] = []; if (kw.trim()) filters.push({ columnName: "config_name", operator: "contains", value: kw.trim() }); const res = await apiClient.post(`/table-management/tables/${COLLECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_7/logistics/inbound-outbound/page.tsx b/frontend/app/(main)/COMPANY_7/logistics/inbound-outbound/page.tsx index bbad370b..806bb52d 100644 --- a/frontend/app/(main)/COMPANY_7/logistics/inbound-outbound/page.tsx +++ b/frontend/app/(main)/COMPANY_7/logistics/inbound-outbound/page.tsx @@ -150,7 +150,7 @@ export default function InboundOutboundPage() { if (writerIds.length > 0) { try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; const uMap: Record = {}; diff --git a/frontend/app/(main)/COMPANY_7/logistics/info/page.tsx b/frontend/app/(main)/COMPANY_7/logistics/info/page.tsx index 35764744..5f44e0ec 100644 --- a/frontend/app/(main)/COMPANY_7/logistics/info/page.tsx +++ b/frontend/app/(main)/COMPANY_7/logistics/info/page.tsx @@ -327,11 +327,11 @@ export default function LogisticsInfoPage() { try { const [carrierRes, routeRes] = await Promise.all([ apiClient.post("/table-management/tables/carrier_mng/data", { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "carrier_code", order: "asc" }, }), apiClient.post("/table-management/tables/delivery_route_mng/data", { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "route_code", order: "asc" }, }), ]); @@ -393,7 +393,7 @@ export default function LogisticsInfoPage() { const res = await apiClient.post( `/table-management/tables/${config.tableName}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: config.defaultSortColumn, order: "asc" }, } ); diff --git a/frontend/app/(main)/COMPANY_7/logistics/inventory/page.tsx b/frontend/app/(main)/COMPANY_7/logistics/inventory/page.tsx index 5c0ddcc1..0f9d675f 100644 --- a/frontend/app/(main)/COMPANY_7/logistics/inventory/page.tsx +++ b/frontend/app/(main)/COMPANY_7/logistics/inventory/page.tsx @@ -190,13 +190,13 @@ export default function InventoryStatusPage() { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const [stockRes, itemRes, whRes] = await Promise.all([ apiClient.post(`/table-management/tables/${STOCK_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "item_code", order: "asc" }, }), - apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/warehouse_info/data`, { page: 1, size: 500, autoFilter: true }), + apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/warehouse_info/data`, { page: 1, size: 0, autoFilter: true }), ]); const raw = stockRes.data?.data?.data || stockRes.data?.data?.rows || []; const items = itemRes.data?.data?.data || itemRes.data?.data?.rows || []; @@ -260,7 +260,7 @@ export default function InventoryStatusPage() { `/table-management/tables/${HISTORY_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: { enabled: true, filters: historyFilters }, autoFilter: true, sort: { columnName: "transaction_date", order: "desc" }, diff --git a/frontend/app/(main)/COMPANY_7/logistics/warehouse/page.tsx b/frontend/app/(main)/COMPANY_7/logistics/warehouse/page.tsx index 106469fd..bfb7fbfd 100644 --- a/frontend/app/(main)/COMPANY_7/logistics/warehouse/page.tsx +++ b/frontend/app/(main)/COMPANY_7/logistics/warehouse/page.tsx @@ -238,7 +238,7 @@ export default function WarehouseManagementPage() { `/table-management/tables/${WAREHOUSE_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "warehouse_code", order: "asc" }, @@ -279,7 +279,7 @@ export default function WarehouseManagementPage() { `/table-management/tables/${LOCATION_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: { enabled: true, filters: [ diff --git a/frontend/app/(main)/COMPANY_7/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_7/master-data/company/page.tsx index 0e4de0cd..a607b7ea 100644 --- a/frontend/app/(main)/COMPANY_7/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_7/master-data/company/page.tsx @@ -193,7 +193,7 @@ export default function CompanyPage() { setDeptLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DEPT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; setDepts(raw); @@ -217,7 +217,7 @@ export default function CompanyPage() { setMemberLoading(true); try { const res = await apiClient.post(`/table-management/tables/${USER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "dept_code", operator: "equals", value: selectedDeptCode }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_7/master-data/department/page.tsx b/frontend/app/(main)/COMPANY_7/master-data/department/page.tsx index 6eb4c2f2..a24fd804 100644 --- a/frontend/app/(main)/COMPANY_7/master-data/department/page.tsx +++ b/frontend/app/(main)/COMPANY_7/master-data/department/page.tsx @@ -99,7 +99,7 @@ export default function DepartmentPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${DEPT_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -129,7 +129,7 @@ export default function DepartmentPage() { ? [{ columnName: "dept_code", operator: "equals", value: selectedDeptCode }] : []; const res = await apiClient.post(`/table-management/tables/${USER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_7/monitoring/equipment/page.tsx b/frontend/app/(main)/COMPANY_7/monitoring/equipment/page.tsx index b165ff65..ed292682 100644 --- a/frontend/app/(main)/COMPANY_7/monitoring/equipment/page.tsx +++ b/frontend/app/(main)/COMPANY_7/monitoring/equipment/page.tsx @@ -170,7 +170,7 @@ export default function EquipmentMonitoringPage() { apiClient.post("/table-management/tables/equipment_mng/data", { autoFilter: true, page: 1, - size: 500, + size: 0, }), apiClient.get("/work-instruction/list").catch(() => ({ data: { data: [] } })), apiClient.post("/table-management/tables/work_order_process/data", { diff --git a/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor-item/page.tsx index 92673fa0..8f1802c4 100644 --- a/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor-item/page.tsx @@ -153,7 +153,7 @@ export default function SubcontractorItemPage() { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -191,7 +191,7 @@ export default function SubcontractorItemPage() { setSubcontractorLoading(true); try { const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor/page.tsx index 9624736b..2a5684b0 100644 --- a/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_7/outsourcing/subcontractor/page.tsx @@ -194,7 +194,7 @@ export default function SubcontractorManagementPage() { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${SUBCONTRACTOR_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -229,7 +229,7 @@ export default function SubcontractorManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, ]}, @@ -256,7 +256,7 @@ export default function SubcontractorManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, ]}, @@ -413,7 +413,7 @@ export default function SubcontractorManagementPage() { const filters: any[] = []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -550,7 +550,7 @@ export default function SubcontractorManagementPage() { }> = []; try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor!.subcontractor_code }, { columnName: "item_id", operator: "equals", value: itemKey }, @@ -610,7 +610,7 @@ export default function SubcontractorManagementPage() { // 2) 기존 단가 모두 삭제 (subcontractor_id + item_id 기준) try { const existingPrices = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, { columnName: "item_id", operator: "equals", value: itemKey }, @@ -727,7 +727,7 @@ export default function SubcontractorManagementPage() { if (subCodes.length > 0) { const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; diff --git a/frontend/app/(main)/COMPANY_7/production/bom/page.tsx b/frontend/app/(main)/COMPANY_7/production/bom/page.tsx index 9b2e32c8..ef441cfc 100644 --- a/frontend/app/(main)/COMPANY_7/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_7/production/bom/page.tsx @@ -349,7 +349,7 @@ export default function BomManagementPage() { const res = await apiClient.post(`/table-management/tables/${BOM_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "created_at", order: "desc" }, @@ -631,7 +631,7 @@ export default function BomManagementPage() { // bom_detail에서 child_item_id가 현재 품목인 행 조회 const itemId = bomHeader.item_id || bomHeader.id; const res = await apiClient.post(`/table-management/tables/bom_detail/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "child_item_id", operator: "equals", value: itemId }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_7/production/result/page.tsx b/frontend/app/(main)/COMPANY_7/production/result/page.tsx index b2176781..151bc0bf 100644 --- a/frontend/app/(main)/COMPANY_7/production/result/page.tsx +++ b/frontend/app/(main)/COMPANY_7/production/result/page.tsx @@ -183,7 +183,7 @@ export default function ProductionResultPage() { setProcessLoading(true); try { const res = await apiClient.post(`/table-management/tables/${WOP_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "wo_id", operator: "equals", value: selectedWiId }] }, autoFilter: true, sort: { columnName: "seq_no", order: "asc" }, diff --git a/frontend/app/(main)/COMPANY_7/purchase/order/page.tsx b/frontend/app/(main)/COMPANY_7/purchase/order/page.tsx index 5da53411..bfbca4e3 100644 --- a/frontend/app/(main)/COMPANY_7/purchase/order/page.tsx +++ b/frontend/app/(main)/COMPANY_7/purchase/order/page.tsx @@ -237,7 +237,7 @@ export default function PurchaseOrderPage() { ); try { const suppRes = await apiClient.post(`/table-management/tables/supplier_mng/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const supps = suppRes.data?.data?.data || suppRes.data?.data?.rows || []; optMap["supplier_code"] = supps.map((s: any) => ({ @@ -247,7 +247,7 @@ export default function PurchaseOrderPage() { } catch { /* skip */ } try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; optMap["manager"] = users.map((u: any) => ({ @@ -293,7 +293,7 @@ export default function PurchaseOrderPage() { } const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: detailFilters.length > 0 ? { enabled: true, filters: detailFilters } : undefined, autoFilter: true, sort: { columnName: "purchase_no", order: "desc" }, @@ -607,7 +607,7 @@ export default function PurchaseOrderPage() { try { const itemIds = selected.map((item) => item.item_number || item.id); const res = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ @@ -670,7 +670,7 @@ export default function PurchaseOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_number", operator: "in", value: itemCodes }] }, autoFilter: true, }); @@ -692,7 +692,7 @@ export default function PurchaseOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: supplierCode }, { columnName: "item_id", operator: "in", value: itemCodes }, diff --git a/frontend/app/(main)/COMPANY_7/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_7/purchase/purchase-item/page.tsx index fd203d40..42db2edf 100644 --- a/frontend/app/(main)/COMPANY_7/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_7/purchase/purchase-item/page.tsx @@ -328,7 +328,7 @@ export default function PurchaseItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -619,7 +619,7 @@ export default function PurchaseItemPage() { try { // 1. supplier_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -647,7 +647,7 @@ export default function PurchaseItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1104,7 +1104,7 @@ export default function PurchaseItemPage() { for (const suppCode of supplierCodes) { // 해당 공급업체의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, @@ -1121,7 +1121,7 @@ export default function PurchaseItemPage() { // 해당 공급업체의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, diff --git a/frontend/app/(main)/COMPANY_7/purchase/supplier/page.tsx b/frontend/app/(main)/COMPANY_7/purchase/supplier/page.tsx index 9b516330..964e7e09 100644 --- a/frontend/app/(main)/COMPANY_7/purchase/supplier/page.tsx +++ b/frontend/app/(main)/COMPANY_7/purchase/supplier/page.tsx @@ -219,7 +219,7 @@ export default function SupplierManagementPage() { } catch { /* skip */ } }; load(); - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }) + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }) .then((res) => { const users = res.data?.data?.data || res.data?.data?.rows || []; setEmployeeOptions(users.map((u: any) => ({ @@ -239,7 +239,7 @@ export default function SupplierManagementPage() { })); const res = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" }, @@ -284,7 +284,7 @@ export default function SupplierManagementPage() { const fetchMainContacts = useCallback(async () => { try { const contactRes = await apiClient.post(`/table-management/tables/${CONTACT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, dataFilter: { enabled: true, filters: [{ columnName: "is_main", operator: "equals", value: "Y" }] }, }); const allContacts = contactRes.data?.data?.data || contactRes.data?.data?.rows || []; @@ -310,7 +310,7 @@ export default function SupplierManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -337,7 +337,7 @@ export default function SupplierManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -412,7 +412,7 @@ export default function SupplierManagementPage() { setDeliveryLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_code", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -492,7 +492,7 @@ export default function SupplierManagementPage() { if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; const allRes = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "destination_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -565,7 +565,7 @@ export default function SupplierManagementPage() { const ruleId = ruleData.data.ruleId; // 기존 데이터에서 CUST-XXX 패턴의 최대 순번 조회 const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -766,7 +766,7 @@ export default function SupplierManagementPage() { const ruleData = ruleRes.data; if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; - const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { page: 1, size: 500, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" } }); + const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { page: 1, size: 0, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" } }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; let maxSeq = 0; for (const row of allRows) { const match = (row.supplier_code || "").match(/(\d+)$/); if (match) { const seq = parseInt(match[1], 10); if (seq > maxSeq) maxSeq = seq; } } @@ -819,7 +819,7 @@ export default function SupplierManagementPage() { const filters: any[] = []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -1227,7 +1227,7 @@ export default function SupplierManagementPage() { for (const itemId of itemIds) { // 해당 품목의 모든 매핑 조회 → supplier_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier!.supplier_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1244,7 +1244,7 @@ export default function SupplierManagementPage() { // 해당 품목의 모든 단가 조회 → supplier_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier!.supplier_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1316,7 +1316,7 @@ export default function SupplierManagementPage() { try { const allMappings: any[] = []; const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; const itemIds = [...new Set(mappings.map((m: any) => m.item_id).filter(Boolean))]; diff --git a/frontend/app/(main)/COMPANY_7/quality/inspection-result/page.tsx b/frontend/app/(main)/COMPANY_7/quality/inspection-result/page.tsx index d9e49d5f..d4093cab 100644 --- a/frontend/app/(main)/COMPANY_7/quality/inspection-result/page.tsx +++ b/frontend/app/(main)/COMPANY_7/quality/inspection-result/page.tsx @@ -101,7 +101,7 @@ export default function InspectionResultPage() { try { const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, search: { master_id: masterId }, }); diff --git a/frontend/app/(main)/COMPANY_7/quality/inspection/page.tsx b/frontend/app/(main)/COMPANY_7/quality/inspection/page.tsx index 359a81a7..4602a719 100644 --- a/frontend/app/(main)/COMPANY_7/quality/inspection/page.tsx +++ b/frontend/app/(main)/COMPANY_7/quality/inspection/page.tsx @@ -150,7 +150,7 @@ export default function InspectionManagementPage() { try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; @@ -209,7 +209,7 @@ export default function InspectionManagementPage() { })); const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -228,7 +228,7 @@ export default function InspectionManagementPage() { try { const res = await apiClient.post(`/table-management/tables/${DEFECT_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const rows = res.data?.data?.data || res.data?.data?.rows || []; @@ -246,7 +246,7 @@ export default function InspectionManagementPage() { try { const res = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const rows = res.data?.data?.data || res.data?.data?.rows || []; diff --git a/frontend/app/(main)/COMPANY_7/quality/item-inspection/page.tsx b/frontend/app/(main)/COMPANY_7/quality/item-inspection/page.tsx index becebe8f..0daf250d 100644 --- a/frontend/app/(main)/COMPANY_7/quality/item-inspection/page.tsx +++ b/frontend/app/(main)/COMPANY_7/quality/item-inspection/page.tsx @@ -119,9 +119,9 @@ export default function ItemInspectionInfoPage() { const loadOptions = async () => { try { const [itemRes, inspRes, userRes] = await Promise.all([ - apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }), + apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }), ]); const items = itemRes.data?.data?.data || itemRes.data?.data?.rows || []; setItemOptions(items.map((r: any) => ({ @@ -259,7 +259,7 @@ export default function ItemInspectionInfoPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -329,7 +329,7 @@ export default function ItemInspectionInfoPage() { try { const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_code", operator: "equals", value: code }] }, autoFilter: true, }); @@ -429,7 +429,7 @@ export default function ItemInspectionInfoPage() { try { if (editMode) { const existRes = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_code", operator: "equals", value: form.item_code }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_7/sales/claim/page.tsx b/frontend/app/(main)/COMPANY_7/sales/claim/page.tsx index a2c89599..48960623 100644 --- a/frontend/app/(main)/COMPANY_7/sales/claim/page.tsx +++ b/frontend/app/(main)/COMPANY_7/sales/claim/page.tsx @@ -190,7 +190,7 @@ export default function ClaimManagementPage() { const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "claim_date", order: "desc" }, diff --git a/frontend/app/(main)/COMPANY_7/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_7/sales/customer/page.tsx index fb410e54..44d6ac15 100644 --- a/frontend/app/(main)/COMPANY_7/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_7/sales/customer/page.tsx @@ -219,7 +219,7 @@ export default function CustomerManagementPage() { } catch { /* skip */ } }; load(); - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }) + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }) .then((res) => { const users = res.data?.data?.data || res.data?.data?.rows || []; setEmployeeOptions(users.map((u: any) => ({ @@ -284,7 +284,7 @@ export default function CustomerManagementPage() { const fetchMainContacts = useCallback(async () => { try { const contactRes = await apiClient.post(`/table-management/tables/${CONTACT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, dataFilter: { enabled: true, filters: [{ columnName: "is_main", operator: "equals", value: "Y" }] }, }); const allContacts = contactRes.data?.data?.data || contactRes.data?.data?.rows || []; @@ -310,7 +310,7 @@ export default function CustomerManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -337,7 +337,7 @@ export default function CustomerManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -413,7 +413,7 @@ export default function CustomerManagementPage() { setDeliveryLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_code", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -493,7 +493,7 @@ export default function CustomerManagementPage() { if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; const allRes = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "destination_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -566,7 +566,7 @@ export default function CustomerManagementPage() { const ruleId = ruleData.data.ruleId; // 기존 데이터에서 CUST-XXX 패턴의 최대 순번 조회 const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "customer_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -767,7 +767,7 @@ export default function CustomerManagementPage() { const ruleData = ruleRes.data; if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; - const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { page: 1, size: 500, autoFilter: true, sort: { columnName: "customer_code", order: "desc" } }); + const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { page: 1, size: 0, autoFilter: true, sort: { columnName: "customer_code", order: "desc" } }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; let maxSeq = 0; for (const row of allRows) { const match = (row.customer_code || "").match(/(\d+)$/); if (match) { const seq = parseInt(match[1], 10); if (seq > maxSeq) maxSeq = seq; } } @@ -822,7 +822,7 @@ export default function CustomerManagementPage() { ? [{ columnName: "division", operator: "contains", value: salesCode }] : []; const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters }, autoFilter: true, }); @@ -1247,7 +1247,7 @@ export default function CustomerManagementPage() { for (const itemId of itemIds) { // 해당 품목의 모든 매핑 조회 → customer_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer!.customer_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1264,7 +1264,7 @@ export default function CustomerManagementPage() { // 해당 품목의 모든 단가 조회 → customer_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer!.customer_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1336,7 +1336,7 @@ export default function CustomerManagementPage() { try { const allMappings: any[] = []; const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; const itemIds = [...new Set(mappings.map((m: any) => m.item_id).filter(Boolean))]; diff --git a/frontend/app/(main)/COMPANY_7/sales/order/page.tsx b/frontend/app/(main)/COMPANY_7/sales/order/page.tsx index 221a28d7..f62967f1 100644 --- a/frontend/app/(main)/COMPANY_7/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_7/sales/order/page.tsx @@ -277,7 +277,7 @@ export default function SalesOrderPage() { // 거래처 목록 try { const custRes = await apiClient.post(`/table-management/tables/customer_mng/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const custs = custRes.data?.data?.data || custRes.data?.data?.rows || []; optMap["partner_id"] = custs.map((c: any) => ({ code: c.customer_code, label: c.customer_name })); @@ -285,7 +285,7 @@ export default function SalesOrderPage() { // 사용자 목록 try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; optMap["manager_id"] = users.map((u: any) => ({ @@ -330,7 +330,7 @@ export default function SalesOrderPage() { })); const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "order_no", order: "desc" }, @@ -770,7 +770,7 @@ export default function SalesOrderPage() { if (isCustomerPrice && partnerId) { try { const mappingRes = await apiClient.post(`/table-management/tables/customer_item_mapping/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "customer_id", operator: "equals", value: partnerId }] }, autoFilter: true, }); @@ -860,7 +860,7 @@ export default function SalesOrderPage() { try { const itemIds = selected.map((item) => item.item_number || item.id); const res = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ @@ -931,7 +931,7 @@ export default function SalesOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_number", operator: "in", value: itemCodes }] }, autoFilter: true, }); @@ -954,7 +954,7 @@ export default function SalesOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: partnerId }, { columnName: "item_id", operator: "in", value: itemCodes }, diff --git a/frontend/app/(main)/COMPANY_7/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_7/sales/sales-item/page.tsx index 13aa6c20..c713cab6 100644 --- a/frontend/app/(main)/COMPANY_7/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_7/sales/sales-item/page.tsx @@ -328,7 +328,7 @@ export default function SalesItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -374,7 +374,7 @@ export default function SalesItemPage() { try { // 1. customer_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -402,7 +402,7 @@ export default function SalesItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1112,7 +1112,7 @@ export default function SalesItemPage() { for (const custCode of customerCodes) { // 해당 거래처의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, @@ -1129,7 +1129,7 @@ export default function SalesItemPage() { // 해당 거래처의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, diff --git a/frontend/app/(main)/COMPANY_8/equipment/info/page.tsx b/frontend/app/(main)/COMPANY_8/equipment/info/page.tsx index cad20e4d..c2f3c0ca 100644 --- a/frontend/app/(main)/COMPANY_8/equipment/info/page.tsx +++ b/frontend/app/(main)/COMPANY_8/equipment/info/page.tsx @@ -165,7 +165,7 @@ export default function EquipmentInfoPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${EQUIP_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -209,7 +209,7 @@ export default function EquipmentInfoPage() { setInspectionLoading(true); try { const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: selectedEquip.equipment_code }] }, autoFilter: true, }); @@ -226,7 +226,7 @@ export default function EquipmentInfoPage() { setConsumableLoading(true); try { const res = await apiClient.post(`/table-management/tables/${CONSUMABLE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: selectedEquip.equipment_code }] }, autoFilter: true, }); @@ -362,7 +362,7 @@ export default function EquipmentInfoPage() { if (consumableDiv) filters.push({ columnName: "division", operator: "equals", value: consumableDiv.valueCode }); const results = await Promise.all(filters.map((f) => apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [f] }, autoFilter: true, }) @@ -409,7 +409,7 @@ export default function EquipmentInfoPage() { setCopyLoading(true); try { const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "equipment_code", operator: "equals", value: equipCode }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_8/equipment/inspection-record/page.tsx b/frontend/app/(main)/COMPANY_8/equipment/inspection-record/page.tsx index 40a1521a..45a34458 100644 --- a/frontend/app/(main)/COMPANY_8/equipment/inspection-record/page.tsx +++ b/frontend/app/(main)/COMPANY_8/equipment/inspection-record/page.tsx @@ -83,7 +83,7 @@ export default function EquipmentInspectionRecordPage() { }).catch(() => ({ data: { data: { data: [] } } })), apiClient.post(`/table-management/tables/equipment_mng/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }).catch(() => ({ data: { data: { data: [] } } })), ]); diff --git a/frontend/app/(main)/COMPANY_8/equipment/plc-settings/page.tsx b/frontend/app/(main)/COMPANY_8/equipment/plc-settings/page.tsx index 4e94d293..1736fe09 100644 --- a/frontend/app/(main)/COMPANY_8/equipment/plc-settings/page.tsx +++ b/frontend/app/(main)/COMPANY_8/equipment/plc-settings/page.tsx @@ -100,7 +100,7 @@ export default function PlcSettingsPage() { useEffect(() => { const load = async () => { try { - const eqRes = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, size: 500, autoFilter: true }); + const eqRes = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, size: 0, autoFilter: true }); const eqs = eqRes.data?.data?.data || eqRes.data?.data?.rows || []; setEquipOptions(eqs.map((r: any) => ({ code: r.equipment_code, label: `${r.equipment_code} - ${r.equipment_name || ""}` }))); } catch { /* skip */ } @@ -122,7 +122,7 @@ export default function PlcSettingsPage() { const filters: any[] = []; if (kw.trim()) filters.push({ columnName: "equipment_code", operator: "contains", value: kw.trim() }); const res = await apiClient.post(`/table-management/tables/${DATATYPE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -140,7 +140,7 @@ export default function PlcSettingsPage() { const filters: any[] = []; if (kw.trim()) filters.push({ columnName: "config_name", operator: "contains", value: kw.trim() }); const res = await apiClient.post(`/table-management/tables/${COLLECTION_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_8/logistics/inbound-outbound/page.tsx b/frontend/app/(main)/COMPANY_8/logistics/inbound-outbound/page.tsx index 587940ce..a6cf4b13 100644 --- a/frontend/app/(main)/COMPANY_8/logistics/inbound-outbound/page.tsx +++ b/frontend/app/(main)/COMPANY_8/logistics/inbound-outbound/page.tsx @@ -150,7 +150,7 @@ export default function InboundOutboundPage() { if (writerIds.length > 0) { try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; const uMap: Record = {}; diff --git a/frontend/app/(main)/COMPANY_8/logistics/info/page.tsx b/frontend/app/(main)/COMPANY_8/logistics/info/page.tsx index 35764744..5f44e0ec 100644 --- a/frontend/app/(main)/COMPANY_8/logistics/info/page.tsx +++ b/frontend/app/(main)/COMPANY_8/logistics/info/page.tsx @@ -327,11 +327,11 @@ export default function LogisticsInfoPage() { try { const [carrierRes, routeRes] = await Promise.all([ apiClient.post("/table-management/tables/carrier_mng/data", { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "carrier_code", order: "asc" }, }), apiClient.post("/table-management/tables/delivery_route_mng/data", { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "route_code", order: "asc" }, }), ]); @@ -393,7 +393,7 @@ export default function LogisticsInfoPage() { const res = await apiClient.post( `/table-management/tables/${config.tableName}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: config.defaultSortColumn, order: "asc" }, } ); diff --git a/frontend/app/(main)/COMPANY_8/logistics/inventory/page.tsx b/frontend/app/(main)/COMPANY_8/logistics/inventory/page.tsx index 5c0ddcc1..0f9d675f 100644 --- a/frontend/app/(main)/COMPANY_8/logistics/inventory/page.tsx +++ b/frontend/app/(main)/COMPANY_8/logistics/inventory/page.tsx @@ -190,13 +190,13 @@ export default function InventoryStatusPage() { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const [stockRes, itemRes, whRes] = await Promise.all([ apiClient.post(`/table-management/tables/${STOCK_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "item_code", order: "asc" }, }), - apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/warehouse_info/data`, { page: 1, size: 500, autoFilter: true }), + apiClient.post(`/table-management/tables/item_info/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/warehouse_info/data`, { page: 1, size: 0, autoFilter: true }), ]); const raw = stockRes.data?.data?.data || stockRes.data?.data?.rows || []; const items = itemRes.data?.data?.data || itemRes.data?.data?.rows || []; @@ -260,7 +260,7 @@ export default function InventoryStatusPage() { `/table-management/tables/${HISTORY_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: { enabled: true, filters: historyFilters }, autoFilter: true, sort: { columnName: "transaction_date", order: "desc" }, diff --git a/frontend/app/(main)/COMPANY_8/logistics/warehouse/page.tsx b/frontend/app/(main)/COMPANY_8/logistics/warehouse/page.tsx index 96b3d47e..2a194939 100644 --- a/frontend/app/(main)/COMPANY_8/logistics/warehouse/page.tsx +++ b/frontend/app/(main)/COMPANY_8/logistics/warehouse/page.tsx @@ -230,7 +230,7 @@ export default function WarehouseManagementPage() { `/table-management/tables/${WAREHOUSE_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "warehouse_code", order: "asc" }, @@ -270,7 +270,7 @@ export default function WarehouseManagementPage() { `/table-management/tables/${LOCATION_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: { enabled: true, filters: [ diff --git a/frontend/app/(main)/COMPANY_8/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_8/master-data/company/page.tsx index 0e4de0cd..a607b7ea 100644 --- a/frontend/app/(main)/COMPANY_8/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_8/master-data/company/page.tsx @@ -193,7 +193,7 @@ export default function CompanyPage() { setDeptLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DEPT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; setDepts(raw); @@ -217,7 +217,7 @@ export default function CompanyPage() { setMemberLoading(true); try { const res = await apiClient.post(`/table-management/tables/${USER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "dept_code", operator: "equals", value: selectedDeptCode }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_8/master-data/department/page.tsx b/frontend/app/(main)/COMPANY_8/master-data/department/page.tsx index 6eb4c2f2..a24fd804 100644 --- a/frontend/app/(main)/COMPANY_8/master-data/department/page.tsx +++ b/frontend/app/(main)/COMPANY_8/master-data/department/page.tsx @@ -99,7 +99,7 @@ export default function DepartmentPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${DEPT_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -129,7 +129,7 @@ export default function DepartmentPage() { ? [{ columnName: "dept_code", operator: "equals", value: selectedDeptCode }] : []; const res = await apiClient.post(`/table-management/tables/${USER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_8/monitoring/equipment/page.tsx b/frontend/app/(main)/COMPANY_8/monitoring/equipment/page.tsx index b165ff65..ed292682 100644 --- a/frontend/app/(main)/COMPANY_8/monitoring/equipment/page.tsx +++ b/frontend/app/(main)/COMPANY_8/monitoring/equipment/page.tsx @@ -170,7 +170,7 @@ export default function EquipmentMonitoringPage() { apiClient.post("/table-management/tables/equipment_mng/data", { autoFilter: true, page: 1, - size: 500, + size: 0, }), apiClient.get("/work-instruction/list").catch(() => ({ data: { data: [] } })), apiClient.post("/table-management/tables/work_order_process/data", { diff --git a/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor-item/page.tsx b/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor-item/page.tsx index 92673fa0..8f1802c4 100644 --- a/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor-item/page.tsx +++ b/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor-item/page.tsx @@ -153,7 +153,7 @@ export default function SubcontractorItemPage() { filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword }); } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -191,7 +191,7 @@ export default function SubcontractorItemPage() { setSubcontractorLoading(true); try { const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx index 9624736b..2a5684b0 100644 --- a/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx @@ -194,7 +194,7 @@ export default function SubcontractorManagementPage() { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${SUBCONTRACTOR_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -229,7 +229,7 @@ export default function SubcontractorManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, ]}, @@ -256,7 +256,7 @@ export default function SubcontractorManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, ]}, @@ -413,7 +413,7 @@ export default function SubcontractorManagementPage() { const filters: any[] = []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -550,7 +550,7 @@ export default function SubcontractorManagementPage() { }> = []; try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor!.subcontractor_code }, { columnName: "item_id", operator: "equals", value: itemKey }, @@ -610,7 +610,7 @@ export default function SubcontractorManagementPage() { // 2) 기존 단가 모두 삭제 (subcontractor_id + item_id 기준) try { const existingPrices = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "subcontractor_id", operator: "equals", value: selectedSubcontractor.subcontractor_code }, { columnName: "item_id", operator: "equals", value: itemKey }, @@ -727,7 +727,7 @@ export default function SubcontractorManagementPage() { if (subCodes.length > 0) { const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; diff --git a/frontend/app/(main)/COMPANY_8/production/bom/page.tsx b/frontend/app/(main)/COMPANY_8/production/bom/page.tsx index 9b2e32c8..ef441cfc 100644 --- a/frontend/app/(main)/COMPANY_8/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_8/production/bom/page.tsx @@ -349,7 +349,7 @@ export default function BomManagementPage() { const res = await apiClient.post(`/table-management/tables/${BOM_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "created_at", order: "desc" }, @@ -631,7 +631,7 @@ export default function BomManagementPage() { // bom_detail에서 child_item_id가 현재 품목인 행 조회 const itemId = bomHeader.item_id || bomHeader.id; const res = await apiClient.post(`/table-management/tables/bom_detail/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "child_item_id", operator: "equals", value: itemId }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_8/production/result/page.tsx b/frontend/app/(main)/COMPANY_8/production/result/page.tsx index b2176781..151bc0bf 100644 --- a/frontend/app/(main)/COMPANY_8/production/result/page.tsx +++ b/frontend/app/(main)/COMPANY_8/production/result/page.tsx @@ -183,7 +183,7 @@ export default function ProductionResultPage() { setProcessLoading(true); try { const res = await apiClient.post(`/table-management/tables/${WOP_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "wo_id", operator: "equals", value: selectedWiId }] }, autoFilter: true, sort: { columnName: "seq_no", order: "asc" }, diff --git a/frontend/app/(main)/COMPANY_8/purchase/order/page.tsx b/frontend/app/(main)/COMPANY_8/purchase/order/page.tsx index 5da53411..bfbca4e3 100644 --- a/frontend/app/(main)/COMPANY_8/purchase/order/page.tsx +++ b/frontend/app/(main)/COMPANY_8/purchase/order/page.tsx @@ -237,7 +237,7 @@ export default function PurchaseOrderPage() { ); try { const suppRes = await apiClient.post(`/table-management/tables/supplier_mng/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const supps = suppRes.data?.data?.data || suppRes.data?.data?.rows || []; optMap["supplier_code"] = supps.map((s: any) => ({ @@ -247,7 +247,7 @@ export default function PurchaseOrderPage() { } catch { /* skip */ } try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; optMap["manager"] = users.map((u: any) => ({ @@ -293,7 +293,7 @@ export default function PurchaseOrderPage() { } const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: detailFilters.length > 0 ? { enabled: true, filters: detailFilters } : undefined, autoFilter: true, sort: { columnName: "purchase_no", order: "desc" }, @@ -607,7 +607,7 @@ export default function PurchaseOrderPage() { try { const itemIds = selected.map((item) => item.item_number || item.id); const res = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ @@ -670,7 +670,7 @@ export default function PurchaseOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_number", operator: "in", value: itemCodes }] }, autoFilter: true, }); @@ -692,7 +692,7 @@ export default function PurchaseOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: supplierCode }, { columnName: "item_id", operator: "in", value: itemCodes }, diff --git a/frontend/app/(main)/COMPANY_8/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_8/purchase/purchase-item/page.tsx index fd203d40..42db2edf 100644 --- a/frontend/app/(main)/COMPANY_8/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_8/purchase/purchase-item/page.tsx @@ -328,7 +328,7 @@ export default function PurchaseItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -619,7 +619,7 @@ export default function PurchaseItemPage() { try { // 1. supplier_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -647,7 +647,7 @@ export default function PurchaseItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1104,7 +1104,7 @@ export default function PurchaseItemPage() { for (const suppCode of supplierCodes) { // 해당 공급업체의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, @@ -1121,7 +1121,7 @@ export default function PurchaseItemPage() { // 해당 공급업체의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, diff --git a/frontend/app/(main)/COMPANY_8/purchase/supplier/page.tsx b/frontend/app/(main)/COMPANY_8/purchase/supplier/page.tsx index 9b516330..964e7e09 100644 --- a/frontend/app/(main)/COMPANY_8/purchase/supplier/page.tsx +++ b/frontend/app/(main)/COMPANY_8/purchase/supplier/page.tsx @@ -219,7 +219,7 @@ export default function SupplierManagementPage() { } catch { /* skip */ } }; load(); - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }) + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }) .then((res) => { const users = res.data?.data?.data || res.data?.data?.rows || []; setEmployeeOptions(users.map((u: any) => ({ @@ -239,7 +239,7 @@ export default function SupplierManagementPage() { })); const res = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" }, @@ -284,7 +284,7 @@ export default function SupplierManagementPage() { const fetchMainContacts = useCallback(async () => { try { const contactRes = await apiClient.post(`/table-management/tables/${CONTACT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, dataFilter: { enabled: true, filters: [{ columnName: "is_main", operator: "equals", value: "Y" }] }, }); const allContacts = contactRes.data?.data?.data || contactRes.data?.data?.rows || []; @@ -310,7 +310,7 @@ export default function SupplierManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -337,7 +337,7 @@ export default function SupplierManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -412,7 +412,7 @@ export default function SupplierManagementPage() { setDeliveryLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_code", operator: "equals", value: selectedSupplier.supplier_code }, ]}, @@ -492,7 +492,7 @@ export default function SupplierManagementPage() { if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; const allRes = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "destination_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -565,7 +565,7 @@ export default function SupplierManagementPage() { const ruleId = ruleData.data.ruleId; // 기존 데이터에서 CUST-XXX 패턴의 최대 순번 조회 const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -766,7 +766,7 @@ export default function SupplierManagementPage() { const ruleData = ruleRes.data; if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; - const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { page: 1, size: 500, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" } }); + const allRes = await apiClient.post(`/table-management/tables/${SUPPLIER_TABLE}/data`, { page: 1, size: 0, autoFilter: true, sort: { columnName: "supplier_code", order: "desc" } }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; let maxSeq = 0; for (const row of allRows) { const match = (row.supplier_code || "").match(/(\d+)$/); if (match) { const seq = parseInt(match[1], 10); if (seq > maxSeq) maxSeq = seq; } } @@ -819,7 +819,7 @@ export default function SupplierManagementPage() { const filters: any[] = []; if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword }); const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -1227,7 +1227,7 @@ export default function SupplierManagementPage() { for (const itemId of itemIds) { // 해당 품목의 모든 매핑 조회 → supplier_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier!.supplier_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1244,7 +1244,7 @@ export default function SupplierManagementPage() { // 해당 품목의 모든 단가 조회 → supplier_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "supplier_id", operator: "equals", value: selectedSupplier!.supplier_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1316,7 +1316,7 @@ export default function SupplierManagementPage() { try { const allMappings: any[] = []; const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; const itemIds = [...new Set(mappings.map((m: any) => m.item_id).filter(Boolean))]; diff --git a/frontend/app/(main)/COMPANY_8/quality/inspection-result/page.tsx b/frontend/app/(main)/COMPANY_8/quality/inspection-result/page.tsx index d9e49d5f..d4093cab 100644 --- a/frontend/app/(main)/COMPANY_8/quality/inspection-result/page.tsx +++ b/frontend/app/(main)/COMPANY_8/quality/inspection-result/page.tsx @@ -101,7 +101,7 @@ export default function InspectionResultPage() { try { const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, search: { master_id: masterId }, }); diff --git a/frontend/app/(main)/COMPANY_8/quality/inspection/page.tsx b/frontend/app/(main)/COMPANY_8/quality/inspection/page.tsx index 359a81a7..4602a719 100644 --- a/frontend/app/(main)/COMPANY_8/quality/inspection/page.tsx +++ b/frontend/app/(main)/COMPANY_8/quality/inspection/page.tsx @@ -150,7 +150,7 @@ export default function InspectionManagementPage() { try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; @@ -209,7 +209,7 @@ export default function InspectionManagementPage() { })); const res = await apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -228,7 +228,7 @@ export default function InspectionManagementPage() { try { const res = await apiClient.post(`/table-management/tables/${DEFECT_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const rows = res.data?.data?.data || res.data?.data?.rows || []; @@ -246,7 +246,7 @@ export default function InspectionManagementPage() { try { const res = await apiClient.post(`/table-management/tables/${EQUIPMENT_TABLE}/data`, { page: 1, - size: 500, + size: 0, autoFilter: true, }); const rows = res.data?.data?.data || res.data?.data?.rows || []; diff --git a/frontend/app/(main)/COMPANY_8/quality/item-inspection/page.tsx b/frontend/app/(main)/COMPANY_8/quality/item-inspection/page.tsx index becebe8f..0daf250d 100644 --- a/frontend/app/(main)/COMPANY_8/quality/item-inspection/page.tsx +++ b/frontend/app/(main)/COMPANY_8/quality/item-inspection/page.tsx @@ -119,9 +119,9 @@ export default function ItemInspectionInfoPage() { const loadOptions = async () => { try { const [itemRes, inspRes, userRes] = await Promise.all([ - apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, size: 500, autoFilter: true }), - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }), + apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/${INSPECTION_TABLE}/data`, { page: 1, size: 0, autoFilter: true }), + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }), ]); const items = itemRes.data?.data?.data || itemRes.data?.data?.rows || []; setItemOptions(items.map((r: any) => ({ @@ -259,7 +259,7 @@ export default function ItemInspectionInfoPage() { try { const filters = searchFilters.map((f) => ({ columnName: f.columnName, operator: f.operator, value: f.value })); const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -329,7 +329,7 @@ export default function ItemInspectionInfoPage() { try { const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_code", operator: "equals", value: code }] }, autoFilter: true, }); @@ -429,7 +429,7 @@ export default function ItemInspectionInfoPage() { try { if (editMode) { const existRes = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_code", operator: "equals", value: form.item_code }] }, autoFilter: true, }); diff --git a/frontend/app/(main)/COMPANY_8/sales/claim/page.tsx b/frontend/app/(main)/COMPANY_8/sales/claim/page.tsx index a2c89599..48960623 100644 --- a/frontend/app/(main)/COMPANY_8/sales/claim/page.tsx +++ b/frontend/app/(main)/COMPANY_8/sales/claim/page.tsx @@ -190,7 +190,7 @@ export default function ClaimManagementPage() { const res = await apiClient.post(`/table-management/tables/${TABLE_NAME}/data`, { page: 1, - size: 500, + size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "claim_date", order: "desc" }, diff --git a/frontend/app/(main)/COMPANY_8/sales/customer/page.tsx b/frontend/app/(main)/COMPANY_8/sales/customer/page.tsx index fb410e54..44d6ac15 100644 --- a/frontend/app/(main)/COMPANY_8/sales/customer/page.tsx +++ b/frontend/app/(main)/COMPANY_8/sales/customer/page.tsx @@ -219,7 +219,7 @@ export default function CustomerManagementPage() { } catch { /* skip */ } }; load(); - apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 500, autoFilter: true }) + apiClient.post(`/table-management/tables/user_info/data`, { page: 1, size: 0, autoFilter: true }) .then((res) => { const users = res.data?.data?.data || res.data?.data?.rows || []; setEmployeeOptions(users.map((u: any) => ({ @@ -284,7 +284,7 @@ export default function CustomerManagementPage() { const fetchMainContacts = useCallback(async () => { try { const contactRes = await apiClient.post(`/table-management/tables/${CONTACT_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, dataFilter: { enabled: true, filters: [{ columnName: "is_main", operator: "equals", value: "Y" }] }, }); const allContacts = contactRes.data?.data?.data || contactRes.data?.data?.rows || []; @@ -310,7 +310,7 @@ export default function CustomerManagementPage() { setPriceLoading(true); try { const mappingRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -337,7 +337,7 @@ export default function CustomerManagementPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -413,7 +413,7 @@ export default function CustomerManagementPage() { setDeliveryLoading(true); try { const res = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_code", operator: "equals", value: selectedCustomer.customer_code }, ]}, @@ -493,7 +493,7 @@ export default function CustomerManagementPage() { if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; const allRes = await apiClient.post(`/table-management/tables/${DELIVERY_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "destination_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -566,7 +566,7 @@ export default function CustomerManagementPage() { const ruleId = ruleData.data.ruleId; // 기존 데이터에서 CUST-XXX 패턴의 최대 순번 조회 const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, sort: { columnName: "customer_code", order: "desc" }, }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; @@ -767,7 +767,7 @@ export default function CustomerManagementPage() { const ruleData = ruleRes.data; if (ruleData?.success && ruleData?.data?.ruleId) { const ruleId = ruleData.data.ruleId; - const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { page: 1, size: 500, autoFilter: true, sort: { columnName: "customer_code", order: "desc" } }); + const allRes = await apiClient.post(`/table-management/tables/${CUSTOMER_TABLE}/data`, { page: 1, size: 0, autoFilter: true, sort: { columnName: "customer_code", order: "desc" } }); const allRows = allRes.data?.data?.data || allRes.data?.data?.rows || []; let maxSeq = 0; for (const row of allRows) { const match = (row.customer_code || "").match(/(\d+)$/); if (match) { const seq = parseInt(match[1], 10); if (seq > maxSeq) maxSeq = seq; } } @@ -822,7 +822,7 @@ export default function CustomerManagementPage() { ? [{ columnName: "division", operator: "contains", value: salesCode }] : []; const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters }, autoFilter: true, }); @@ -1247,7 +1247,7 @@ export default function CustomerManagementPage() { for (const itemId of itemIds) { // 해당 품목의 모든 매핑 조회 → customer_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer!.customer_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1264,7 +1264,7 @@ export default function CustomerManagementPage() { // 해당 품목의 모든 단가 조회 → customer_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: selectedCustomer!.customer_code }, { columnName: "item_id", operator: "equals", value: itemId }, @@ -1336,7 +1336,7 @@ export default function CustomerManagementPage() { try { const allMappings: any[] = []; const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 5000, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const mappings = mapRes.data?.data?.data || mapRes.data?.data?.rows || []; const itemIds = [...new Set(mappings.map((m: any) => m.item_id).filter(Boolean))]; diff --git a/frontend/app/(main)/COMPANY_8/sales/order/page.tsx b/frontend/app/(main)/COMPANY_8/sales/order/page.tsx index 221a28d7..f62967f1 100644 --- a/frontend/app/(main)/COMPANY_8/sales/order/page.tsx +++ b/frontend/app/(main)/COMPANY_8/sales/order/page.tsx @@ -277,7 +277,7 @@ export default function SalesOrderPage() { // 거래처 목록 try { const custRes = await apiClient.post(`/table-management/tables/customer_mng/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const custs = custRes.data?.data?.data || custRes.data?.data?.rows || []; optMap["partner_id"] = custs.map((c: any) => ({ code: c.customer_code, label: c.customer_name })); @@ -285,7 +285,7 @@ export default function SalesOrderPage() { // 사용자 목록 try { const userRes = await apiClient.post(`/table-management/tables/user_info/data`, { - page: 1, size: 500, autoFilter: true, + page: 1, size: 0, autoFilter: true, }); const users = userRes.data?.data?.data || userRes.data?.data?.rows || []; optMap["manager_id"] = users.map((u: any) => ({ @@ -330,7 +330,7 @@ export default function SalesOrderPage() { })); const res = await apiClient.post(`/table-management/tables/${DETAIL_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, sort: { columnName: "order_no", order: "desc" }, @@ -770,7 +770,7 @@ export default function SalesOrderPage() { if (isCustomerPrice && partnerId) { try { const mappingRes = await apiClient.post(`/table-management/tables/customer_item_mapping/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "customer_id", operator: "equals", value: partnerId }] }, autoFilter: true, }); @@ -860,7 +860,7 @@ export default function SalesOrderPage() { try { const itemIds = selected.map((item) => item.item_number || item.id); const res = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ @@ -931,7 +931,7 @@ export default function SalesOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/item_info/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_number", operator: "in", value: itemCodes }] }, autoFilter: true, }); @@ -954,7 +954,7 @@ export default function SalesOrderPage() { if (itemCodes.length === 0) return; try { const res = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "customer_id", operator: "equals", value: partnerId }, { columnName: "item_id", operator: "in", value: itemCodes }, diff --git a/frontend/app/(main)/COMPANY_8/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_8/sales/sales-item/page.tsx index 6e558a82..e03b9b65 100644 --- a/frontend/app/(main)/COMPANY_8/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_8/sales/sales-item/page.tsx @@ -327,7 +327,7 @@ export default function SalesItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -373,7 +373,7 @@ export default function SalesItemPage() { try { // 1. customer_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -401,7 +401,7 @@ export default function SalesItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1111,7 +1111,7 @@ export default function SalesItemPage() { for (const custCode of customerCodes) { // 해당 거래처의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, @@ -1128,7 +1128,7 @@ export default function SalesItemPage() { // 해당 거래처의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, diff --git a/frontend/app/(main)/COMPANY_9/purchase/purchase-item/page.tsx b/frontend/app/(main)/COMPANY_9/purchase/purchase-item/page.tsx index 225f69d4..c05f7ec0 100644 --- a/frontend/app/(main)/COMPANY_9/purchase/purchase-item/page.tsx +++ b/frontend/app/(main)/COMPANY_9/purchase/purchase-item/page.tsx @@ -334,7 +334,7 @@ export default function PurchaseItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -625,7 +625,7 @@ export default function PurchaseItemPage() { try { // 1. supplier_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -653,7 +653,7 @@ export default function PurchaseItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1110,7 +1110,7 @@ export default function PurchaseItemPage() { for (const suppCode of supplierCodes) { // 해당 공급업체의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, @@ -1127,7 +1127,7 @@ export default function PurchaseItemPage() { // 해당 공급업체의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/supplier_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "supplier_id", operator: "equals", value: suppCode }, diff --git a/frontend/app/(main)/COMPANY_9/sales/sales-item/page.tsx b/frontend/app/(main)/COMPANY_9/sales/sales-item/page.tsx index 70ebf5c2..b98232cf 100644 --- a/frontend/app/(main)/COMPANY_9/sales/sales-item/page.tsx +++ b/frontend/app/(main)/COMPANY_9/sales/sales-item/page.tsx @@ -333,7 +333,7 @@ export default function SalesItemPage() { } const res = await apiClient.post(`/table-management/tables/${ITEM_TABLE}/data`, { - page: 1, size: 5000, + page: 1, size: 0, dataFilter: filters.length > 0 ? { enabled: true, filters } : undefined, autoFilter: true, }); @@ -379,7 +379,7 @@ export default function SalesItemPage() { try { // 1. customer_item_mapping에서 해당 품목의 매핑 조회 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [{ columnName: "item_id", operator: "equals", value: itemKey }] }, autoFilter: true, sort: { columnName: "created_date", order: "asc" }, @@ -407,7 +407,7 @@ export default function SalesItemPage() { if (mappings.length > 0) { try { const priceRes = await apiClient.post(`/table-management/tables/${PRICE_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: itemKey }, ]}, @@ -1117,7 +1117,7 @@ export default function SalesItemPage() { for (const custCode of customerCodes) { // 해당 거래처의 모든 매핑 조회 → item_id null 처리 const mapRes = await apiClient.post(`/table-management/tables/${MAPPING_TABLE}/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, @@ -1134,7 +1134,7 @@ export default function SalesItemPage() { // 해당 거래처의 모든 단가 조회 → item_id null 처리 try { const priceRes = await apiClient.post(`/table-management/tables/customer_item_prices/data`, { - page: 1, size: 500, + page: 1, size: 0, dataFilter: { enabled: true, filters: [ { columnName: "item_id", operator: "equals", value: selectedItem!.item_number }, { columnName: "customer_id", operator: "equals", value: custCode }, From dc7dd2776b773b65928f64f5b492df6feae28c64 Mon Sep 17 00:00:00 2001 From: kjs Date: Thu, 16 Apr 2026 13:41:35 +0900 Subject: [PATCH 02/17] feat: Enhance receiving update functionality and clean up imports - Updated the receiving controller to allow for the update of inbound records, including both header and item fields (inbound_qty, unit_price, total_amount). - Cleaned up the import statements in the receiving page by removing a duplicate toast import, improving code clarity and maintainability. --- backend-node/src/controllers/receivingController.ts | 8 +++++++- .../app/(main)/COMPANY_30/logistics/receiving/page.tsx | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/backend-node/src/controllers/receivingController.ts b/backend-node/src/controllers/receivingController.ts index 06d13b6e..0a40b6e8 100644 --- a/backend-node/src/controllers/receivingController.ts +++ b/backend-node/src/controllers/receivingController.ts @@ -472,7 +472,7 @@ export async function update(req: AuthenticatedRequest, res: Response) { await client.query("BEGIN"); - // 헤더 업데이트 (inbound_mng) — 헤더 레벨 필드만 + // 입고 레코드 업데이트 (헤더 + 품목 필드 모두) const headerResult = await client.query( `UPDATE inbound_mng SET inbound_date = COALESCE($1::date, inbound_date), @@ -482,6 +482,9 @@ export async function update(req: AuthenticatedRequest, res: Response) { inspector = COALESCE($5, inspector), manager = COALESCE($6, manager), memo = COALESCE($7, memo), + inbound_qty = COALESCE($11::numeric, inbound_qty), + unit_price = COALESCE($12::numeric, unit_price), + total_amount = COALESCE($13::numeric, total_amount), updated_date = NOW(), updated_by = $8 WHERE id = $9 AND company_code = $10 @@ -497,6 +500,9 @@ export async function update(req: AuthenticatedRequest, res: Response) { userId, id, companyCode, + inbound_qty || null, + unit_price || null, + total_amount || null, ], ); diff --git a/frontend/app/(main)/COMPANY_30/logistics/receiving/page.tsx b/frontend/app/(main)/COMPANY_30/logistics/receiving/page.tsx index a80f1e07..c6875196 100644 --- a/frontend/app/(main)/COMPANY_30/logistics/receiving/page.tsx +++ b/frontend/app/(main)/COMPANY_30/logistics/receiving/page.tsx @@ -56,7 +56,6 @@ import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover import { cn } from "@/lib/utils"; import { toast } from "sonner"; import { apiClient } from "@/lib/api/client"; -import { toast } from "sonner"; import { useTableSettings } from "@/hooks/useTableSettings"; import { TableSettingsModal } from "@/components/common/TableSettingsModal"; import { DynamicSearchFilter, FilterValue } from "@/components/common/DynamicSearchFilter"; From b158b0aa775e515e66d22e4322f014c10542670f Mon Sep 17 00:00:00 2001 From: kjs Date: Thu, 16 Apr 2026 18:23:20 +0900 Subject: [PATCH 03/17] feat: Enhance mold serial summary retrieval and improve category handling - Updated the `getMoldSerialSummary` function to dynamically retrieve category values for mold statuses and operations, allowing for more flexible data aggregation. - Implemented a mapping mechanism to categorize status codes based on their labels, improving the clarity of the summary results. - Adjusted SQL queries to utilize the new category mappings for more accurate counts of mold statuses. - Refactored the packaging and loading unit deletion logic to handle company code checks more efficiently, ensuring proper data access control. --- .../src/controllers/moldController.ts | 31 +++++++- .../src/controllers/packagingController.ts | 18 +++-- .../(main)/COMPANY_10/equipment/info/page.tsx | 16 ++-- .../COMPANY_10/master-data/company/page.tsx | 4 - .../app/(main)/COMPANY_10/mold/info/page.tsx | 73 +++++++++++-------- .../(main)/COMPANY_10/production/bom/page.tsx | 47 ------------ .../process-info/ItemRoutingTab.tsx | 32 ++++++-- .../process-info/ProcessMasterTab.tsx | 28 ++++--- .../(main)/COMPANY_16/equipment/info/page.tsx | 16 ++-- .../COMPANY_16/master-data/company/page.tsx | 4 - .../app/(main)/COMPANY_16/mold/info/page.tsx | 73 +++++++++++-------- .../(main)/COMPANY_16/production/bom/page.tsx | 47 ------------ .../process-info/ItemRoutingTab.tsx | 32 ++++++-- .../process-info/ProcessMasterTab.tsx | 28 ++++--- .../(main)/COMPANY_29/equipment/info/page.tsx | 16 ++-- .../COMPANY_29/master-data/company/page.tsx | 4 - .../app/(main)/COMPANY_29/mold/info/page.tsx | 73 +++++++++++-------- .../(main)/COMPANY_29/production/bom/page.tsx | 47 ------------ .../process-info/ItemRoutingTab.tsx | 32 ++++++-- .../process-info/ProcessMasterTab.tsx | 28 ++++--- .../(main)/COMPANY_30/equipment/info/page.tsx | 16 ++-- .../COMPANY_30/master-data/company/page.tsx | 4 - .../app/(main)/COMPANY_30/mold/info/page.tsx | 73 +++++++++++-------- .../(main)/COMPANY_30/production/bom/page.tsx | 47 ------------ .../process-info/ItemRoutingTab.tsx | 32 ++++++-- .../process-info/ProcessMasterTab.tsx | 28 ++++--- .../(main)/COMPANY_7/equipment/info/page.tsx | 16 ++-- .../COMPANY_7/master-data/company/page.tsx | 4 - .../app/(main)/COMPANY_7/mold/info/page.tsx | 73 +++++++++++-------- .../(main)/COMPANY_7/production/bom/page.tsx | 47 ------------ .../process-info/ItemRoutingTab.tsx | 32 ++++++-- .../process-info/ProcessMasterTab.tsx | 28 ++++--- .../(main)/COMPANY_8/equipment/info/page.tsx | 16 ++-- .../COMPANY_8/master-data/company/page.tsx | 4 - .../COMPANY_8/master-data/item-info/page.tsx | 53 ++++++++++---- .../app/(main)/COMPANY_8/mold/info/page.tsx | 73 +++++++++++-------- .../outsourcing/subcontractor/page.tsx | 27 +++++++ .../(main)/COMPANY_8/production/bom/page.tsx | 47 ------------ .../process-info/ItemRoutingTab.tsx | 32 ++++++-- .../process-info/ProcessMasterTab.tsx | 29 +++++--- .../COMPANY_8/purchase/supplier/page.tsx | 27 +++++++ .../(main)/COMPANY_8/sales/customer/page.tsx | 37 ++++++++++ .../(main)/COMPANY_9/equipment/info/page.tsx | 16 ++-- .../COMPANY_9/master-data/company/page.tsx | 4 - .../app/(main)/COMPANY_9/mold/info/page.tsx | 73 +++++++++++-------- .../(main)/COMPANY_9/production/bom/page.tsx | 47 ------------ .../process-info/ItemRoutingTab.tsx | 32 ++++++-- .../process-info/ProcessMasterTab.tsx | 28 ++++--- frontend/components/common/EDataTable.tsx | 7 +- 49 files changed, 824 insertions(+), 777 deletions(-) diff --git a/backend-node/src/controllers/moldController.ts b/backend-node/src/controllers/moldController.ts index 25e49186..19ef1eb2 100644 --- a/backend-node/src/controllers/moldController.ts +++ b/backend-node/src/controllers/moldController.ts @@ -512,13 +512,36 @@ export async function getMoldSerialSummary(req: AuthenticatedRequest, res: Respo const companyCode = req.user!.companyCode; const { moldCode } = req.params; + // 카테고리 코드/영문코드/한글라벨 모두 대응 + // 먼저 카테고리 값 조회하여 매핑 + // mold_serial.status + mold_mng.operation_status 양쪽 카테고리 모두 조회 + const catSql = `SELECT value_code, value_label FROM category_values + WHERE ((table_name='mold_serial' AND column_name='status') OR (table_name='mold_mng' AND column_name='operation_status')) + AND company_code=$1`; + const catRows = await query(catSql, [companyCode]); + + // 카테고리 라벨 기준으로 그룹핑할 코드 목록 생성 + const codesByLabel: Record = { "사용중": ["IN_USE"], "수리중": ["REPAIR"], "보관중": ["STORED"], "폐기": ["DISPOSED"] }; + for (const cat of catRows) { + const label = cat.value_label || ""; + if (label.includes("사용")) (codesByLabel["사용중"] = codesByLabel["사용중"] || []).push(cat.value_code); + else if (label.includes("수리")) (codesByLabel["수리중"] = codesByLabel["수리중"] || []).push(cat.value_code); + else if (label.includes("보관") || label.includes("미사용")) (codesByLabel["보관중"] = codesByLabel["보관중"] || []).push(cat.value_code); + else if (label.includes("폐기")) (codesByLabel["폐기"] = codesByLabel["폐기"] || []).push(cat.value_code); + } + + const inUseCodes = codesByLabel["사용중"].map(c => `'${c}'`).join(","); + const repairCodes = codesByLabel["수리중"].map(c => `'${c}'`).join(","); + const storedCodes = codesByLabel["보관중"].map(c => `'${c}'`).join(","); + const disposedCodes = codesByLabel["폐기"].map(c => `'${c}'`).join(","); + const sql = ` SELECT COUNT(*) as total, - COUNT(*) FILTER (WHERE status = 'IN_USE') as in_use, - COUNT(*) FILTER (WHERE status = 'REPAIR') as repair, - COUNT(*) FILTER (WHERE status = 'STORED') as stored, - COUNT(*) FILTER (WHERE status = 'DISPOSED') as disposed + COUNT(*) FILTER (WHERE status IN (${inUseCodes})) as in_use, + COUNT(*) FILTER (WHERE status IN (${repairCodes})) as repair, + COUNT(*) FILTER (WHERE status IN (${storedCodes})) as stored, + COUNT(*) FILTER (WHERE status IN (${disposedCodes})) as disposed FROM mold_serial WHERE mold_code = $1 AND company_code = $2 `; diff --git a/backend-node/src/controllers/packagingController.ts b/backend-node/src/controllers/packagingController.ts index d87c0c7e..037ab46a 100644 --- a/backend-node/src/controllers/packagingController.ts +++ b/backend-node/src/controllers/packagingController.ts @@ -228,10 +228,11 @@ export async function deletePkgUnitItem( const { id } = req.params; const pool = getPool(); - const result = await pool.query( - `DELETE FROM pkg_unit_item WHERE id=$1 AND company_code=$2 RETURNING id`, - [id, companyCode] - ); + const query = companyCode === "*" + ? `DELETE FROM pkg_unit_item WHERE id=$1 RETURNING id` + : `DELETE FROM pkg_unit_item WHERE id=$1 AND company_code=$2 RETURNING id`; + const params = companyCode === "*" ? [id] : [id, companyCode]; + const result = await pool.query(query, params); if (result.rowCount === 0) { res.status(404).json({ success: false, message: "데이터를 찾을 수 없습니다." }); @@ -471,10 +472,11 @@ export async function deleteLoadingUnitPkg( const { id } = req.params; const pool = getPool(); - const result = await pool.query( - `DELETE FROM loading_unit_pkg WHERE id=$1 AND company_code=$2 RETURNING id`, - [id, companyCode] - ); + const query = companyCode === "*" + ? `DELETE FROM loading_unit_pkg WHERE id=$1 RETURNING id` + : `DELETE FROM loading_unit_pkg WHERE id=$1 AND company_code=$2 RETURNING id`; + const params = companyCode === "*" ? [id] : [id, companyCode]; + const result = await pool.query(query, params); if (result.rowCount === 0) { res.status(404).json({ success: false, message: "데이터를 찾을 수 없습니다." }); diff --git a/frontend/app/(main)/COMPANY_10/equipment/info/page.tsx b/frontend/app/(main)/COMPANY_10/equipment/info/page.tsx index c2f3c0ca..17d81598 100644 --- a/frontend/app/(main)/COMPANY_10/equipment/info/page.tsx +++ b/frontend/app/(main)/COMPANY_10/equipment/info/page.tsx @@ -147,17 +147,17 @@ export default function EquipmentInfoPage() { const colProps: Record> = { equipment_code: { width: "w-[110px]" }, equipment_name: { minWidth: "min-w-[130px]", truncate: true, render: (v) => v || "-" }, - equipment_type: { width: "w-[90px]", render: (v) => v || "-" }, + equipment_type: { width: "w-[90px]", render: (v) => resolve("equipment_type", v) || v || "-" }, manufacturer: { width: "w-[100px]", render: (v) => v || "-" }, installation_location: { width: "w-[100px]", render: (v) => v || "-" }, - operation_status: { width: "w-[80px]", render: (v) => v || "-" }, + operation_status: { width: "w-[80px]", render: (v) => resolve("operation_status", v) || v || "-" }, }; return ts.visibleColumns.map((col) => ({ key: col.key, label: col.label, ...colProps[col.key], })); - }, [ts.visibleColumns]); + }, [ts.visibleColumns, catOptions]); // 설비 조회 const fetchEquipments = useCallback(async () => { @@ -170,11 +170,7 @@ export default function EquipmentInfoPage() { autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; - setEquipments(raw.map((r: any) => ({ - ...r, - equipment_type: resolve("equipment_type", r.equipment_type), - operation_status: resolve("operation_status", r.operation_status), - }))); + setEquipments(raw); setEquipCount(res.data?.data?.total || raw.length); } catch { toast.error("설비 목록 조회 실패"); } finally { setEquipLoading(false); } }, [searchFilters, catOptions]); @@ -437,9 +433,9 @@ export default function EquipmentInfoPage() { const handleExcelDownload = async () => { if (equipments.length === 0) return; await exportToExcel(equipments.map((e) => ({ - 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: e.equipment_type, + 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: resolve("equipment_type", e.equipment_type), 제조사: e.manufacturer, 모델명: e.model_name, 설치장소: e.installation_location, - 도입일자: e.introduction_date, 가동상태: e.operation_status, + 도입일자: e.introduction_date, 가동상태: resolve("operation_status", e.operation_status), })), "설비정보.xlsx", "설비"); toast.success("다운로드 완료"); }; diff --git a/frontend/app/(main)/COMPANY_10/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_10/master-data/company/page.tsx index a607b7ea..4cf60273 100644 --- a/frontend/app/(main)/COMPANY_10/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_10/master-data/company/page.tsx @@ -563,10 +563,6 @@ export default function CompanyPage() { {/* 기본 정보 그리드 (2열) */}
-
- - -
@@ -470,7 +500,7 @@ export default function MoldInfoPage() {

{mold.mold_code}

{mold.mold_name}

{mold.mold_type && ( - {mold.mold_type} + {resolveMoldType(mold.mold_type)} )}
@@ -531,10 +561,7 @@ export default function MoldInfoPage() { 전체 - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})} @@ -546,10 +573,7 @@ export default function MoldInfoPage() { 전체 - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -670,13 +694,13 @@ export default function MoldInfoPage() {

{selectedMold.mold_name}

{selectedMold.mold_type && ( - {selectedMold.mold_type} + {resolveMoldType(selectedMold.mold_type)} )} {selectedMold.category && ( {selectedMold.category} )} - - {STATUS_MAP[selectedMold.operation_status]?.label || selectedMold.operation_status || "-"} + + {resolveOpStatus(selectedMold.operation_status) || "-"}
@@ -811,15 +835,15 @@ export default function MoldInfoPage() { {serials.map((s: any) => { - const ss = SERIAL_STATUS_MAP[s.status] || { label: s.status || "-", variant: "secondary" as const }; - const maxShot = detail?.shot_count || 0; + const ssLabel = resolveOpStatus(s.status); + const maxShot = selectedMold?.shot_count || 0; const curShot = s.current_shot_count || 0; const pct = maxShot > 0 ? Math.min(Math.round((curShot / maxShot) * 100), 100) : 0; return ( {s.serial_number} - {ss.label} + {ssLabel} {maxShot > 0 ? ( @@ -1043,10 +1067,7 @@ export default function MoldInfoPage() { - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})} @@ -1117,10 +1138,7 @@ export default function MoldInfoPage() { - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -1175,10 +1193,7 @@ export default function MoldInfoPage() { - 사용중 - 보관중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} diff --git a/frontend/app/(main)/COMPANY_10/production/bom/page.tsx b/frontend/app/(main)/COMPANY_10/production/bom/page.tsx index ef441cfc..8c7b582b 100644 --- a/frontend/app/(main)/COMPANY_10/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_10/production/bom/page.tsx @@ -1530,53 +1530,6 @@ export default function BomManagementPage() { ) : (
- {/* 상세 카드 */} -
-
-

BOM 상세정보

- -
- {detailLoading ? ( -
- -
- ) : bomHeader ? ( -
-
- 품목코드 - {bomHeader.item_code || bomHeader.item_number || "-"} -
-
- 품명 - {bomHeader.item_name || "-"} -
-
- BOM 유형 - {BOM_TYPE_OPTIONS.find((o) => o.code === bomHeader.bom_type)?.label || bomHeader.bom_type || "-"} -
-
- 버전 - {bomHeader.version || "-"} -
-
- 기준수량 - {bomHeader.base_qty || "1"} {bomHeader.unit || ""} -
-
- 상태 - {renderStatusBadge(bomHeader.status)} -
-
- 메모 - {bomHeader.remark || "-"} -
-
- ) : null} -
- {/* 하단 탭: 트리뷰 / 버전 / 이력 */}
{ diff --git a/frontend/app/(main)/COMPANY_10/production/process-info/ItemRoutingTab.tsx b/frontend/app/(main)/COMPANY_10/production/process-info/ItemRoutingTab.tsx index e50e27d5..4eefd66c 100644 --- a/frontend/app/(main)/COMPANY_10/production/process-info/ItemRoutingTab.tsx +++ b/frontend/app/(main)/COMPANY_10/production/process-info/ItemRoutingTab.tsx @@ -92,6 +92,7 @@ export function ItemRoutingTab() { const [formWorkType, setFormWorkType] = useState("내부"); const [formStandardTime, setFormStandardTime] = useState(""); const [formOutsource, setFormOutsource] = useState(""); + const [subcontractorOptions, setSubcontractorOptions] = useState<{ code: string; name: string }[]>([]); const [detailSubmitting, setDetailSubmitting] = useState(false); const [registerDialogOpen, setRegisterDialogOpen] = useState(false); @@ -107,6 +108,19 @@ export function ItemRoutingTab() { return () => window.clearTimeout(t); }, [searchInput]); + // 외주사 목록 로드 + useEffect(() => { + (async () => { + try { + const res = await apiClient.post("/table-management/tables/subcontractor_mng/data", { + page: 1, size: 500, autoFilter: true, + }); + const rows = res.data?.data?.data || res.data?.data?.rows || []; + setSubcontractorOptions(rows.map((r: any) => ({ code: r.subcontractor_code || r.id, name: r.subcontractor_name || "" }))); + } catch { /* skip */ } + })(); + }, []); + useEffect(() => { const t = window.setTimeout(() => setRegisterSearchDebounced(registerSearch.trim()), 300); return () => window.clearTimeout(t); @@ -469,9 +483,9 @@ export function ItemRoutingTab() { details.map((d) => ({ ...d, process_display: d.process_name || d.process_code, - outsource_display: d.outsource_supplier || "—", + outsource_display: subcontractorOptions.find((s) => s.code === d.outsource_supplier)?.name || d.outsource_supplier || "—", })), - [details], + [details, subcontractorOptions], ); return ( @@ -896,12 +910,14 @@ export function ItemRoutingTab() { {showOutsourceField && (
- setFormOutsource(e.target.value)} - placeholder="외주 업체명" - className="h-9" - /> +
)}
diff --git a/frontend/app/(main)/COMPANY_10/production/process-info/ProcessMasterTab.tsx b/frontend/app/(main)/COMPANY_10/production/process-info/ProcessMasterTab.tsx index cfbee962..207fa3ad 100644 --- a/frontend/app/(main)/COMPANY_10/production/process-info/ProcessMasterTab.tsx +++ b/frontend/app/(main)/COMPANY_10/production/process-info/ProcessMasterTab.tsx @@ -221,18 +221,28 @@ export function ProcessMasterTab() { }; const openEdit = () => { - if (!selectedProcess) { - toast.message("수정할 공정을 좌측 목록에서 선택해주세요"); + if (selectedIds.size === 0) { + toast.message("수정할 공정을 체크박스로 선택해주세요"); + return; + } + if (selectedIds.size > 1) { + toast.message("수정은 1건만 선택해주세요"); + return; + } + const targetId = Array.from(selectedIds)[0]; + const target = processes.find((p) => p.id === targetId); + if (!target) { + toast.error("선택한 공정을 찾을 수 없습니다"); return; } setFormMode("edit"); - setEditingId(selectedProcess.id); - setFormProcessCode(selectedProcess.process_code); - setFormProcessName(selectedProcess.process_name); - setFormProcessType(selectedProcess.process_type); - setFormStandardTime(selectedProcess.standard_time ?? ""); - setFormWorkerCount(selectedProcess.worker_count ?? ""); - setFormUseYn(selectedProcess.use_yn); + setEditingId(target.id); + setFormProcessCode(target.process_code); + setFormProcessName(target.process_name); + setFormProcessType(target.process_type); + setFormStandardTime(target.standard_time ?? ""); + setFormWorkerCount(target.worker_count ?? ""); + setFormUseYn(target.use_yn); setFormOpen(true); }; diff --git a/frontend/app/(main)/COMPANY_16/equipment/info/page.tsx b/frontend/app/(main)/COMPANY_16/equipment/info/page.tsx index 4eb21404..0b297655 100644 --- a/frontend/app/(main)/COMPANY_16/equipment/info/page.tsx +++ b/frontend/app/(main)/COMPANY_16/equipment/info/page.tsx @@ -150,17 +150,17 @@ export default function EquipmentInfoPage() { const colProps: Record> = { equipment_code: { width: "w-[110px]" }, equipment_name: { minWidth: "min-w-[130px]", truncate: true, render: (v) => v || "-" }, - equipment_type: { width: "w-[90px]", render: (v) => v || "-" }, + equipment_type: { width: "w-[90px]", render: (v) => resolve("equipment_type", v) || v || "-" }, manufacturer: { width: "w-[100px]", render: (v) => v || "-" }, installation_location: { width: "w-[100px]", render: (v) => v || "-" }, - operation_status: { width: "w-[80px]", render: (v) => v || "-" }, + operation_status: { width: "w-[80px]", render: (v) => resolve("operation_status", v) || v || "-" }, }; return ts.visibleColumns.map((col) => ({ key: col.key, label: col.label, ...colProps[col.key], })); - }, [ts.visibleColumns]); + }, [ts.visibleColumns, catOptions]); // 설비 조회 const fetchEquipments = useCallback(async () => { @@ -173,11 +173,7 @@ export default function EquipmentInfoPage() { autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; - setEquipments(raw.map((r: any) => ({ - ...r, - equipment_type: resolve("equipment_type", r.equipment_type), - operation_status: resolve("operation_status", r.operation_status), - }))); + setEquipments(raw); setEquipCount(res.data?.data?.total || raw.length); } catch { toast.error("설비 목록 조회 실패"); } finally { setEquipLoading(false); } }, [searchFilters, catOptions]); @@ -482,9 +478,9 @@ export default function EquipmentInfoPage() { const handleExcelDownload = async () => { if (equipments.length === 0) return; await exportToExcel(equipments.map((e) => ({ - 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: e.equipment_type, + 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: resolve("equipment_type", e.equipment_type), 제조사: e.manufacturer, 모델명: e.model_name, 설치장소: e.installation_location, - 도입일자: e.introduction_date, 가동상태: e.operation_status, + 도입일자: e.introduction_date, 가동상태: resolve("operation_status", e.operation_status), })), "설비정보.xlsx", "설비"); toast.success("다운로드 완료"); }; diff --git a/frontend/app/(main)/COMPANY_16/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_16/master-data/company/page.tsx index a607b7ea..4cf60273 100644 --- a/frontend/app/(main)/COMPANY_16/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_16/master-data/company/page.tsx @@ -563,10 +563,6 @@ export default function CompanyPage() { {/* 기본 정보 그리드 (2열) */}
-
- - -
@@ -470,7 +500,7 @@ export default function MoldInfoPage() {

{mold.mold_code}

{mold.mold_name}

{mold.mold_type && ( - {mold.mold_type} + {resolveMoldType(mold.mold_type)} )}
@@ -531,10 +561,7 @@ export default function MoldInfoPage() { 전체 - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})}
@@ -546,10 +573,7 @@ export default function MoldInfoPage() { 전체 - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -670,13 +694,13 @@ export default function MoldInfoPage() {

{selectedMold.mold_name}

{selectedMold.mold_type && ( - {selectedMold.mold_type} + {resolveMoldType(selectedMold.mold_type)} )} {selectedMold.category && ( {selectedMold.category} )} - - {STATUS_MAP[selectedMold.operation_status]?.label || selectedMold.operation_status || "-"} + + {resolveOpStatus(selectedMold.operation_status) || "-"}
@@ -811,15 +835,15 @@ export default function MoldInfoPage() { {serials.map((s: any) => { - const ss = SERIAL_STATUS_MAP[s.status] || { label: s.status || "-", variant: "secondary" as const }; - const maxShot = detail?.shot_count || 0; + const ssLabel = resolveOpStatus(s.status); + const maxShot = selectedMold?.shot_count || 0; const curShot = s.current_shot_count || 0; const pct = maxShot > 0 ? Math.min(Math.round((curShot / maxShot) * 100), 100) : 0; return ( {s.serial_number} - {ss.label} + {ssLabel} {maxShot > 0 ? ( @@ -1043,10 +1067,7 @@ export default function MoldInfoPage() { - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})} @@ -1117,10 +1138,7 @@ export default function MoldInfoPage() { - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -1175,10 +1193,7 @@ export default function MoldInfoPage() { - 사용중 - 보관중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} diff --git a/frontend/app/(main)/COMPANY_16/production/bom/page.tsx b/frontend/app/(main)/COMPANY_16/production/bom/page.tsx index ef441cfc..8c7b582b 100644 --- a/frontend/app/(main)/COMPANY_16/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_16/production/bom/page.tsx @@ -1530,53 +1530,6 @@ export default function BomManagementPage() { ) : (
- {/* 상세 카드 */} -
-
-

BOM 상세정보

- -
- {detailLoading ? ( -
- -
- ) : bomHeader ? ( -
-
- 품목코드 - {bomHeader.item_code || bomHeader.item_number || "-"} -
-
- 품명 - {bomHeader.item_name || "-"} -
-
- BOM 유형 - {BOM_TYPE_OPTIONS.find((o) => o.code === bomHeader.bom_type)?.label || bomHeader.bom_type || "-"} -
-
- 버전 - {bomHeader.version || "-"} -
-
- 기준수량 - {bomHeader.base_qty || "1"} {bomHeader.unit || ""} -
-
- 상태 - {renderStatusBadge(bomHeader.status)} -
-
- 메모 - {bomHeader.remark || "-"} -
-
- ) : null} -
- {/* 하단 탭: 트리뷰 / 버전 / 이력 */}
{ diff --git a/frontend/app/(main)/COMPANY_16/production/process-info/ItemRoutingTab.tsx b/frontend/app/(main)/COMPANY_16/production/process-info/ItemRoutingTab.tsx index e50e27d5..4eefd66c 100644 --- a/frontend/app/(main)/COMPANY_16/production/process-info/ItemRoutingTab.tsx +++ b/frontend/app/(main)/COMPANY_16/production/process-info/ItemRoutingTab.tsx @@ -92,6 +92,7 @@ export function ItemRoutingTab() { const [formWorkType, setFormWorkType] = useState("내부"); const [formStandardTime, setFormStandardTime] = useState(""); const [formOutsource, setFormOutsource] = useState(""); + const [subcontractorOptions, setSubcontractorOptions] = useState<{ code: string; name: string }[]>([]); const [detailSubmitting, setDetailSubmitting] = useState(false); const [registerDialogOpen, setRegisterDialogOpen] = useState(false); @@ -107,6 +108,19 @@ export function ItemRoutingTab() { return () => window.clearTimeout(t); }, [searchInput]); + // 외주사 목록 로드 + useEffect(() => { + (async () => { + try { + const res = await apiClient.post("/table-management/tables/subcontractor_mng/data", { + page: 1, size: 500, autoFilter: true, + }); + const rows = res.data?.data?.data || res.data?.data?.rows || []; + setSubcontractorOptions(rows.map((r: any) => ({ code: r.subcontractor_code || r.id, name: r.subcontractor_name || "" }))); + } catch { /* skip */ } + })(); + }, []); + useEffect(() => { const t = window.setTimeout(() => setRegisterSearchDebounced(registerSearch.trim()), 300); return () => window.clearTimeout(t); @@ -469,9 +483,9 @@ export function ItemRoutingTab() { details.map((d) => ({ ...d, process_display: d.process_name || d.process_code, - outsource_display: d.outsource_supplier || "—", + outsource_display: subcontractorOptions.find((s) => s.code === d.outsource_supplier)?.name || d.outsource_supplier || "—", })), - [details], + [details, subcontractorOptions], ); return ( @@ -896,12 +910,14 @@ export function ItemRoutingTab() { {showOutsourceField && (
- setFormOutsource(e.target.value)} - placeholder="외주 업체명" - className="h-9" - /> +
)}
diff --git a/frontend/app/(main)/COMPANY_16/production/process-info/ProcessMasterTab.tsx b/frontend/app/(main)/COMPANY_16/production/process-info/ProcessMasterTab.tsx index cfbee962..207fa3ad 100644 --- a/frontend/app/(main)/COMPANY_16/production/process-info/ProcessMasterTab.tsx +++ b/frontend/app/(main)/COMPANY_16/production/process-info/ProcessMasterTab.tsx @@ -221,18 +221,28 @@ export function ProcessMasterTab() { }; const openEdit = () => { - if (!selectedProcess) { - toast.message("수정할 공정을 좌측 목록에서 선택해주세요"); + if (selectedIds.size === 0) { + toast.message("수정할 공정을 체크박스로 선택해주세요"); + return; + } + if (selectedIds.size > 1) { + toast.message("수정은 1건만 선택해주세요"); + return; + } + const targetId = Array.from(selectedIds)[0]; + const target = processes.find((p) => p.id === targetId); + if (!target) { + toast.error("선택한 공정을 찾을 수 없습니다"); return; } setFormMode("edit"); - setEditingId(selectedProcess.id); - setFormProcessCode(selectedProcess.process_code); - setFormProcessName(selectedProcess.process_name); - setFormProcessType(selectedProcess.process_type); - setFormStandardTime(selectedProcess.standard_time ?? ""); - setFormWorkerCount(selectedProcess.worker_count ?? ""); - setFormUseYn(selectedProcess.use_yn); + setEditingId(target.id); + setFormProcessCode(target.process_code); + setFormProcessName(target.process_name); + setFormProcessType(target.process_type); + setFormStandardTime(target.standard_time ?? ""); + setFormWorkerCount(target.worker_count ?? ""); + setFormUseYn(target.use_yn); setFormOpen(true); }; diff --git a/frontend/app/(main)/COMPANY_29/equipment/info/page.tsx b/frontend/app/(main)/COMPANY_29/equipment/info/page.tsx index c2f3c0ca..17d81598 100644 --- a/frontend/app/(main)/COMPANY_29/equipment/info/page.tsx +++ b/frontend/app/(main)/COMPANY_29/equipment/info/page.tsx @@ -147,17 +147,17 @@ export default function EquipmentInfoPage() { const colProps: Record> = { equipment_code: { width: "w-[110px]" }, equipment_name: { minWidth: "min-w-[130px]", truncate: true, render: (v) => v || "-" }, - equipment_type: { width: "w-[90px]", render: (v) => v || "-" }, + equipment_type: { width: "w-[90px]", render: (v) => resolve("equipment_type", v) || v || "-" }, manufacturer: { width: "w-[100px]", render: (v) => v || "-" }, installation_location: { width: "w-[100px]", render: (v) => v || "-" }, - operation_status: { width: "w-[80px]", render: (v) => v || "-" }, + operation_status: { width: "w-[80px]", render: (v) => resolve("operation_status", v) || v || "-" }, }; return ts.visibleColumns.map((col) => ({ key: col.key, label: col.label, ...colProps[col.key], })); - }, [ts.visibleColumns]); + }, [ts.visibleColumns, catOptions]); // 설비 조회 const fetchEquipments = useCallback(async () => { @@ -170,11 +170,7 @@ export default function EquipmentInfoPage() { autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; - setEquipments(raw.map((r: any) => ({ - ...r, - equipment_type: resolve("equipment_type", r.equipment_type), - operation_status: resolve("operation_status", r.operation_status), - }))); + setEquipments(raw); setEquipCount(res.data?.data?.total || raw.length); } catch { toast.error("설비 목록 조회 실패"); } finally { setEquipLoading(false); } }, [searchFilters, catOptions]); @@ -437,9 +433,9 @@ export default function EquipmentInfoPage() { const handleExcelDownload = async () => { if (equipments.length === 0) return; await exportToExcel(equipments.map((e) => ({ - 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: e.equipment_type, + 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: resolve("equipment_type", e.equipment_type), 제조사: e.manufacturer, 모델명: e.model_name, 설치장소: e.installation_location, - 도입일자: e.introduction_date, 가동상태: e.operation_status, + 도입일자: e.introduction_date, 가동상태: resolve("operation_status", e.operation_status), })), "설비정보.xlsx", "설비"); toast.success("다운로드 완료"); }; diff --git a/frontend/app/(main)/COMPANY_29/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_29/master-data/company/page.tsx index a607b7ea..4cf60273 100644 --- a/frontend/app/(main)/COMPANY_29/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_29/master-data/company/page.tsx @@ -563,10 +563,6 @@ export default function CompanyPage() { {/* 기본 정보 그리드 (2열) */}
-
- - -
@@ -470,7 +500,7 @@ export default function MoldInfoPage() {

{mold.mold_code}

{mold.mold_name}

{mold.mold_type && ( - {mold.mold_type} + {resolveMoldType(mold.mold_type)} )}
@@ -531,10 +561,7 @@ export default function MoldInfoPage() { 전체 - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})}
@@ -546,10 +573,7 @@ export default function MoldInfoPage() { 전체 - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -670,13 +694,13 @@ export default function MoldInfoPage() {

{selectedMold.mold_name}

{selectedMold.mold_type && ( - {selectedMold.mold_type} + {resolveMoldType(selectedMold.mold_type)} )} {selectedMold.category && ( {selectedMold.category} )} - - {STATUS_MAP[selectedMold.operation_status]?.label || selectedMold.operation_status || "-"} + + {resolveOpStatus(selectedMold.operation_status) || "-"}
@@ -811,15 +835,15 @@ export default function MoldInfoPage() { {serials.map((s: any) => { - const ss = SERIAL_STATUS_MAP[s.status] || { label: s.status || "-", variant: "secondary" as const }; - const maxShot = detail?.shot_count || 0; + const ssLabel = resolveOpStatus(s.status); + const maxShot = selectedMold?.shot_count || 0; const curShot = s.current_shot_count || 0; const pct = maxShot > 0 ? Math.min(Math.round((curShot / maxShot) * 100), 100) : 0; return ( {s.serial_number} - {ss.label} + {ssLabel} {maxShot > 0 ? ( @@ -1043,10 +1067,7 @@ export default function MoldInfoPage() { - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})} @@ -1117,10 +1138,7 @@ export default function MoldInfoPage() { - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -1175,10 +1193,7 @@ export default function MoldInfoPage() { - 사용중 - 보관중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} diff --git a/frontend/app/(main)/COMPANY_29/production/bom/page.tsx b/frontend/app/(main)/COMPANY_29/production/bom/page.tsx index ef441cfc..8c7b582b 100644 --- a/frontend/app/(main)/COMPANY_29/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_29/production/bom/page.tsx @@ -1530,53 +1530,6 @@ export default function BomManagementPage() { ) : (
- {/* 상세 카드 */} -
-
-

BOM 상세정보

- -
- {detailLoading ? ( -
- -
- ) : bomHeader ? ( -
-
- 품목코드 - {bomHeader.item_code || bomHeader.item_number || "-"} -
-
- 품명 - {bomHeader.item_name || "-"} -
-
- BOM 유형 - {BOM_TYPE_OPTIONS.find((o) => o.code === bomHeader.bom_type)?.label || bomHeader.bom_type || "-"} -
-
- 버전 - {bomHeader.version || "-"} -
-
- 기준수량 - {bomHeader.base_qty || "1"} {bomHeader.unit || ""} -
-
- 상태 - {renderStatusBadge(bomHeader.status)} -
-
- 메모 - {bomHeader.remark || "-"} -
-
- ) : null} -
- {/* 하단 탭: 트리뷰 / 버전 / 이력 */}
{ diff --git a/frontend/app/(main)/COMPANY_29/production/process-info/ItemRoutingTab.tsx b/frontend/app/(main)/COMPANY_29/production/process-info/ItemRoutingTab.tsx index e50e27d5..4eefd66c 100644 --- a/frontend/app/(main)/COMPANY_29/production/process-info/ItemRoutingTab.tsx +++ b/frontend/app/(main)/COMPANY_29/production/process-info/ItemRoutingTab.tsx @@ -92,6 +92,7 @@ export function ItemRoutingTab() { const [formWorkType, setFormWorkType] = useState("내부"); const [formStandardTime, setFormStandardTime] = useState(""); const [formOutsource, setFormOutsource] = useState(""); + const [subcontractorOptions, setSubcontractorOptions] = useState<{ code: string; name: string }[]>([]); const [detailSubmitting, setDetailSubmitting] = useState(false); const [registerDialogOpen, setRegisterDialogOpen] = useState(false); @@ -107,6 +108,19 @@ export function ItemRoutingTab() { return () => window.clearTimeout(t); }, [searchInput]); + // 외주사 목록 로드 + useEffect(() => { + (async () => { + try { + const res = await apiClient.post("/table-management/tables/subcontractor_mng/data", { + page: 1, size: 500, autoFilter: true, + }); + const rows = res.data?.data?.data || res.data?.data?.rows || []; + setSubcontractorOptions(rows.map((r: any) => ({ code: r.subcontractor_code || r.id, name: r.subcontractor_name || "" }))); + } catch { /* skip */ } + })(); + }, []); + useEffect(() => { const t = window.setTimeout(() => setRegisterSearchDebounced(registerSearch.trim()), 300); return () => window.clearTimeout(t); @@ -469,9 +483,9 @@ export function ItemRoutingTab() { details.map((d) => ({ ...d, process_display: d.process_name || d.process_code, - outsource_display: d.outsource_supplier || "—", + outsource_display: subcontractorOptions.find((s) => s.code === d.outsource_supplier)?.name || d.outsource_supplier || "—", })), - [details], + [details, subcontractorOptions], ); return ( @@ -896,12 +910,14 @@ export function ItemRoutingTab() { {showOutsourceField && (
- setFormOutsource(e.target.value)} - placeholder="외주 업체명" - className="h-9" - /> +
)}
diff --git a/frontend/app/(main)/COMPANY_29/production/process-info/ProcessMasterTab.tsx b/frontend/app/(main)/COMPANY_29/production/process-info/ProcessMasterTab.tsx index cfbee962..207fa3ad 100644 --- a/frontend/app/(main)/COMPANY_29/production/process-info/ProcessMasterTab.tsx +++ b/frontend/app/(main)/COMPANY_29/production/process-info/ProcessMasterTab.tsx @@ -221,18 +221,28 @@ export function ProcessMasterTab() { }; const openEdit = () => { - if (!selectedProcess) { - toast.message("수정할 공정을 좌측 목록에서 선택해주세요"); + if (selectedIds.size === 0) { + toast.message("수정할 공정을 체크박스로 선택해주세요"); + return; + } + if (selectedIds.size > 1) { + toast.message("수정은 1건만 선택해주세요"); + return; + } + const targetId = Array.from(selectedIds)[0]; + const target = processes.find((p) => p.id === targetId); + if (!target) { + toast.error("선택한 공정을 찾을 수 없습니다"); return; } setFormMode("edit"); - setEditingId(selectedProcess.id); - setFormProcessCode(selectedProcess.process_code); - setFormProcessName(selectedProcess.process_name); - setFormProcessType(selectedProcess.process_type); - setFormStandardTime(selectedProcess.standard_time ?? ""); - setFormWorkerCount(selectedProcess.worker_count ?? ""); - setFormUseYn(selectedProcess.use_yn); + setEditingId(target.id); + setFormProcessCode(target.process_code); + setFormProcessName(target.process_name); + setFormProcessType(target.process_type); + setFormStandardTime(target.standard_time ?? ""); + setFormWorkerCount(target.worker_count ?? ""); + setFormUseYn(target.use_yn); setFormOpen(true); }; diff --git a/frontend/app/(main)/COMPANY_30/equipment/info/page.tsx b/frontend/app/(main)/COMPANY_30/equipment/info/page.tsx index f415be9c..5aeac1f7 100644 --- a/frontend/app/(main)/COMPANY_30/equipment/info/page.tsx +++ b/frontend/app/(main)/COMPANY_30/equipment/info/page.tsx @@ -145,17 +145,17 @@ export default function EquipmentInfoPage() { const colProps: Record> = { equipment_code: { width: "w-[110px]" }, equipment_name: { minWidth: "min-w-[130px]", truncate: true, render: (v) => v || "-" }, - equipment_type: { width: "w-[90px]", render: (v) => v || "-" }, + equipment_type: { width: "w-[90px]", render: (v) => resolve("equipment_type", v) || v || "-" }, manufacturer: { width: "w-[100px]", render: (v) => v || "-" }, installation_location: { width: "w-[100px]", render: (v) => v || "-" }, - operation_status: { width: "w-[80px]", render: (v) => v || "-" }, + operation_status: { width: "w-[80px]", render: (v) => resolve("operation_status", v) || v || "-" }, }; return ts.visibleColumns.map((col) => ({ key: col.key, label: col.label, ...colProps[col.key], })); - }, [ts.visibleColumns]); + }, [ts.visibleColumns, catOptions]); // 설비 조회 const fetchEquipments = useCallback(async () => { @@ -168,11 +168,7 @@ export default function EquipmentInfoPage() { autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; - setEquipments(raw.map((r: any) => ({ - ...r, - equipment_type: resolve("equipment_type", r.equipment_type), - operation_status: resolve("operation_status", r.operation_status), - }))); + setEquipments(raw); setEquipCount(res.data?.data?.total || raw.length); } catch { toast.error("설비 목록 조회 실패"); } finally { setEquipLoading(false); } }, [searchFilters, catOptions]); @@ -415,9 +411,9 @@ export default function EquipmentInfoPage() { const handleExcelDownload = async () => { if (equipments.length === 0) return; await exportToExcel(equipments.map((e) => ({ - 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: e.equipment_type, + 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: resolve("equipment_type", e.equipment_type), 제조사: e.manufacturer, 모델명: e.model_name, 설치장소: e.installation_location, - 도입일자: e.introduction_date, 가동상태: e.operation_status, + 도입일자: e.introduction_date, 가동상태: resolve("operation_status", e.operation_status), })), "설비정보.xlsx", "설비"); toast.success("다운로드 완료"); }; diff --git a/frontend/app/(main)/COMPANY_30/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_30/master-data/company/page.tsx index 0e4de0cd..347ea2ea 100644 --- a/frontend/app/(main)/COMPANY_30/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_30/master-data/company/page.tsx @@ -563,10 +563,6 @@ export default function CompanyPage() { {/* 기본 정보 그리드 (2열) */}
-
- - -
@@ -470,7 +500,7 @@ export default function MoldInfoPage() {

{mold.mold_code}

{mold.mold_name}

{mold.mold_type && ( - {mold.mold_type} + {resolveMoldType(mold.mold_type)} )}
@@ -531,10 +561,7 @@ export default function MoldInfoPage() { 전체 - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})}
@@ -546,10 +573,7 @@ export default function MoldInfoPage() { 전체 - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -670,13 +694,13 @@ export default function MoldInfoPage() {

{selectedMold.mold_name}

{selectedMold.mold_type && ( - {selectedMold.mold_type} + {resolveMoldType(selectedMold.mold_type)} )} {selectedMold.category && ( {selectedMold.category} )} - - {STATUS_MAP[selectedMold.operation_status]?.label || selectedMold.operation_status || "-"} + + {resolveOpStatus(selectedMold.operation_status) || "-"}
@@ -811,15 +835,15 @@ export default function MoldInfoPage() { {serials.map((s: any) => { - const ss = SERIAL_STATUS_MAP[s.status] || { label: s.status || "-", variant: "secondary" as const }; - const maxShot = detail?.shot_count || 0; + const ssLabel = resolveOpStatus(s.status); + const maxShot = selectedMold?.shot_count || 0; const curShot = s.current_shot_count || 0; const pct = maxShot > 0 ? Math.min(Math.round((curShot / maxShot) * 100), 100) : 0; return ( {s.serial_number} - {ss.label} + {ssLabel} {maxShot > 0 ? ( @@ -1043,10 +1067,7 @@ export default function MoldInfoPage() { - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})} @@ -1117,10 +1138,7 @@ export default function MoldInfoPage() { - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -1175,10 +1193,7 @@ export default function MoldInfoPage() { - 사용중 - 보관중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} diff --git a/frontend/app/(main)/COMPANY_30/production/bom/page.tsx b/frontend/app/(main)/COMPANY_30/production/bom/page.tsx index 9b2e32c8..81356855 100644 --- a/frontend/app/(main)/COMPANY_30/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_30/production/bom/page.tsx @@ -1530,53 +1530,6 @@ export default function BomManagementPage() { ) : (
- {/* 상세 카드 */} -
-
-

BOM 상세정보

- -
- {detailLoading ? ( -
- -
- ) : bomHeader ? ( -
-
- 품목코드 - {bomHeader.item_code || bomHeader.item_number || "-"} -
-
- 품명 - {bomHeader.item_name || "-"} -
-
- BOM 유형 - {BOM_TYPE_OPTIONS.find((o) => o.code === bomHeader.bom_type)?.label || bomHeader.bom_type || "-"} -
-
- 버전 - {bomHeader.version || "-"} -
-
- 기준수량 - {bomHeader.base_qty || "1"} {bomHeader.unit || ""} -
-
- 상태 - {renderStatusBadge(bomHeader.status)} -
-
- 메모 - {bomHeader.remark || "-"} -
-
- ) : null} -
- {/* 하단 탭: 트리뷰 / 버전 / 이력 */}
{ diff --git a/frontend/app/(main)/COMPANY_30/production/process-info/ItemRoutingTab.tsx b/frontend/app/(main)/COMPANY_30/production/process-info/ItemRoutingTab.tsx index e50e27d5..4eefd66c 100644 --- a/frontend/app/(main)/COMPANY_30/production/process-info/ItemRoutingTab.tsx +++ b/frontend/app/(main)/COMPANY_30/production/process-info/ItemRoutingTab.tsx @@ -92,6 +92,7 @@ export function ItemRoutingTab() { const [formWorkType, setFormWorkType] = useState("내부"); const [formStandardTime, setFormStandardTime] = useState(""); const [formOutsource, setFormOutsource] = useState(""); + const [subcontractorOptions, setSubcontractorOptions] = useState<{ code: string; name: string }[]>([]); const [detailSubmitting, setDetailSubmitting] = useState(false); const [registerDialogOpen, setRegisterDialogOpen] = useState(false); @@ -107,6 +108,19 @@ export function ItemRoutingTab() { return () => window.clearTimeout(t); }, [searchInput]); + // 외주사 목록 로드 + useEffect(() => { + (async () => { + try { + const res = await apiClient.post("/table-management/tables/subcontractor_mng/data", { + page: 1, size: 500, autoFilter: true, + }); + const rows = res.data?.data?.data || res.data?.data?.rows || []; + setSubcontractorOptions(rows.map((r: any) => ({ code: r.subcontractor_code || r.id, name: r.subcontractor_name || "" }))); + } catch { /* skip */ } + })(); + }, []); + useEffect(() => { const t = window.setTimeout(() => setRegisterSearchDebounced(registerSearch.trim()), 300); return () => window.clearTimeout(t); @@ -469,9 +483,9 @@ export function ItemRoutingTab() { details.map((d) => ({ ...d, process_display: d.process_name || d.process_code, - outsource_display: d.outsource_supplier || "—", + outsource_display: subcontractorOptions.find((s) => s.code === d.outsource_supplier)?.name || d.outsource_supplier || "—", })), - [details], + [details, subcontractorOptions], ); return ( @@ -896,12 +910,14 @@ export function ItemRoutingTab() { {showOutsourceField && (
- setFormOutsource(e.target.value)} - placeholder="외주 업체명" - className="h-9" - /> +
)}
diff --git a/frontend/app/(main)/COMPANY_30/production/process-info/ProcessMasterTab.tsx b/frontend/app/(main)/COMPANY_30/production/process-info/ProcessMasterTab.tsx index cfbee962..207fa3ad 100644 --- a/frontend/app/(main)/COMPANY_30/production/process-info/ProcessMasterTab.tsx +++ b/frontend/app/(main)/COMPANY_30/production/process-info/ProcessMasterTab.tsx @@ -221,18 +221,28 @@ export function ProcessMasterTab() { }; const openEdit = () => { - if (!selectedProcess) { - toast.message("수정할 공정을 좌측 목록에서 선택해주세요"); + if (selectedIds.size === 0) { + toast.message("수정할 공정을 체크박스로 선택해주세요"); + return; + } + if (selectedIds.size > 1) { + toast.message("수정은 1건만 선택해주세요"); + return; + } + const targetId = Array.from(selectedIds)[0]; + const target = processes.find((p) => p.id === targetId); + if (!target) { + toast.error("선택한 공정을 찾을 수 없습니다"); return; } setFormMode("edit"); - setEditingId(selectedProcess.id); - setFormProcessCode(selectedProcess.process_code); - setFormProcessName(selectedProcess.process_name); - setFormProcessType(selectedProcess.process_type); - setFormStandardTime(selectedProcess.standard_time ?? ""); - setFormWorkerCount(selectedProcess.worker_count ?? ""); - setFormUseYn(selectedProcess.use_yn); + setEditingId(target.id); + setFormProcessCode(target.process_code); + setFormProcessName(target.process_name); + setFormProcessType(target.process_type); + setFormStandardTime(target.standard_time ?? ""); + setFormWorkerCount(target.worker_count ?? ""); + setFormUseYn(target.use_yn); setFormOpen(true); }; diff --git a/frontend/app/(main)/COMPANY_7/equipment/info/page.tsx b/frontend/app/(main)/COMPANY_7/equipment/info/page.tsx index c2f3c0ca..17d81598 100644 --- a/frontend/app/(main)/COMPANY_7/equipment/info/page.tsx +++ b/frontend/app/(main)/COMPANY_7/equipment/info/page.tsx @@ -147,17 +147,17 @@ export default function EquipmentInfoPage() { const colProps: Record> = { equipment_code: { width: "w-[110px]" }, equipment_name: { minWidth: "min-w-[130px]", truncate: true, render: (v) => v || "-" }, - equipment_type: { width: "w-[90px]", render: (v) => v || "-" }, + equipment_type: { width: "w-[90px]", render: (v) => resolve("equipment_type", v) || v || "-" }, manufacturer: { width: "w-[100px]", render: (v) => v || "-" }, installation_location: { width: "w-[100px]", render: (v) => v || "-" }, - operation_status: { width: "w-[80px]", render: (v) => v || "-" }, + operation_status: { width: "w-[80px]", render: (v) => resolve("operation_status", v) || v || "-" }, }; return ts.visibleColumns.map((col) => ({ key: col.key, label: col.label, ...colProps[col.key], })); - }, [ts.visibleColumns]); + }, [ts.visibleColumns, catOptions]); // 설비 조회 const fetchEquipments = useCallback(async () => { @@ -170,11 +170,7 @@ export default function EquipmentInfoPage() { autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; - setEquipments(raw.map((r: any) => ({ - ...r, - equipment_type: resolve("equipment_type", r.equipment_type), - operation_status: resolve("operation_status", r.operation_status), - }))); + setEquipments(raw); setEquipCount(res.data?.data?.total || raw.length); } catch { toast.error("설비 목록 조회 실패"); } finally { setEquipLoading(false); } }, [searchFilters, catOptions]); @@ -437,9 +433,9 @@ export default function EquipmentInfoPage() { const handleExcelDownload = async () => { if (equipments.length === 0) return; await exportToExcel(equipments.map((e) => ({ - 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: e.equipment_type, + 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: resolve("equipment_type", e.equipment_type), 제조사: e.manufacturer, 모델명: e.model_name, 설치장소: e.installation_location, - 도입일자: e.introduction_date, 가동상태: e.operation_status, + 도입일자: e.introduction_date, 가동상태: resolve("operation_status", e.operation_status), })), "설비정보.xlsx", "설비"); toast.success("다운로드 완료"); }; diff --git a/frontend/app/(main)/COMPANY_7/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_7/master-data/company/page.tsx index a607b7ea..4cf60273 100644 --- a/frontend/app/(main)/COMPANY_7/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_7/master-data/company/page.tsx @@ -563,10 +563,6 @@ export default function CompanyPage() { {/* 기본 정보 그리드 (2열) */}
-
- - -
@@ -470,7 +500,7 @@ export default function MoldInfoPage() {

{mold.mold_code}

{mold.mold_name}

{mold.mold_type && ( - {mold.mold_type} + {resolveMoldType(mold.mold_type)} )}
@@ -531,10 +561,7 @@ export default function MoldInfoPage() { 전체 - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})}
@@ -546,10 +573,7 @@ export default function MoldInfoPage() { 전체 - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -670,13 +694,13 @@ export default function MoldInfoPage() {

{selectedMold.mold_name}

{selectedMold.mold_type && ( - {selectedMold.mold_type} + {resolveMoldType(selectedMold.mold_type)} )} {selectedMold.category && ( {selectedMold.category} )} - - {STATUS_MAP[selectedMold.operation_status]?.label || selectedMold.operation_status || "-"} + + {resolveOpStatus(selectedMold.operation_status) || "-"}
@@ -811,15 +835,15 @@ export default function MoldInfoPage() { {serials.map((s: any) => { - const ss = SERIAL_STATUS_MAP[s.status] || { label: s.status || "-", variant: "secondary" as const }; - const maxShot = detail?.shot_count || 0; + const ssLabel = resolveOpStatus(s.status); + const maxShot = selectedMold?.shot_count || 0; const curShot = s.current_shot_count || 0; const pct = maxShot > 0 ? Math.min(Math.round((curShot / maxShot) * 100), 100) : 0; return ( {s.serial_number} - {ss.label} + {ssLabel} {maxShot > 0 ? ( @@ -1043,10 +1067,7 @@ export default function MoldInfoPage() { - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})} @@ -1117,10 +1138,7 @@ export default function MoldInfoPage() { - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -1175,10 +1193,7 @@ export default function MoldInfoPage() { - 사용중 - 보관중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} diff --git a/frontend/app/(main)/COMPANY_7/production/bom/page.tsx b/frontend/app/(main)/COMPANY_7/production/bom/page.tsx index ef441cfc..8c7b582b 100644 --- a/frontend/app/(main)/COMPANY_7/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_7/production/bom/page.tsx @@ -1530,53 +1530,6 @@ export default function BomManagementPage() { ) : (
- {/* 상세 카드 */} -
-
-

BOM 상세정보

- -
- {detailLoading ? ( -
- -
- ) : bomHeader ? ( -
-
- 품목코드 - {bomHeader.item_code || bomHeader.item_number || "-"} -
-
- 품명 - {bomHeader.item_name || "-"} -
-
- BOM 유형 - {BOM_TYPE_OPTIONS.find((o) => o.code === bomHeader.bom_type)?.label || bomHeader.bom_type || "-"} -
-
- 버전 - {bomHeader.version || "-"} -
-
- 기준수량 - {bomHeader.base_qty || "1"} {bomHeader.unit || ""} -
-
- 상태 - {renderStatusBadge(bomHeader.status)} -
-
- 메모 - {bomHeader.remark || "-"} -
-
- ) : null} -
- {/* 하단 탭: 트리뷰 / 버전 / 이력 */}
{ diff --git a/frontend/app/(main)/COMPANY_7/production/process-info/ItemRoutingTab.tsx b/frontend/app/(main)/COMPANY_7/production/process-info/ItemRoutingTab.tsx index e50e27d5..4eefd66c 100644 --- a/frontend/app/(main)/COMPANY_7/production/process-info/ItemRoutingTab.tsx +++ b/frontend/app/(main)/COMPANY_7/production/process-info/ItemRoutingTab.tsx @@ -92,6 +92,7 @@ export function ItemRoutingTab() { const [formWorkType, setFormWorkType] = useState("내부"); const [formStandardTime, setFormStandardTime] = useState(""); const [formOutsource, setFormOutsource] = useState(""); + const [subcontractorOptions, setSubcontractorOptions] = useState<{ code: string; name: string }[]>([]); const [detailSubmitting, setDetailSubmitting] = useState(false); const [registerDialogOpen, setRegisterDialogOpen] = useState(false); @@ -107,6 +108,19 @@ export function ItemRoutingTab() { return () => window.clearTimeout(t); }, [searchInput]); + // 외주사 목록 로드 + useEffect(() => { + (async () => { + try { + const res = await apiClient.post("/table-management/tables/subcontractor_mng/data", { + page: 1, size: 500, autoFilter: true, + }); + const rows = res.data?.data?.data || res.data?.data?.rows || []; + setSubcontractorOptions(rows.map((r: any) => ({ code: r.subcontractor_code || r.id, name: r.subcontractor_name || "" }))); + } catch { /* skip */ } + })(); + }, []); + useEffect(() => { const t = window.setTimeout(() => setRegisterSearchDebounced(registerSearch.trim()), 300); return () => window.clearTimeout(t); @@ -469,9 +483,9 @@ export function ItemRoutingTab() { details.map((d) => ({ ...d, process_display: d.process_name || d.process_code, - outsource_display: d.outsource_supplier || "—", + outsource_display: subcontractorOptions.find((s) => s.code === d.outsource_supplier)?.name || d.outsource_supplier || "—", })), - [details], + [details, subcontractorOptions], ); return ( @@ -896,12 +910,14 @@ export function ItemRoutingTab() { {showOutsourceField && (
- setFormOutsource(e.target.value)} - placeholder="외주 업체명" - className="h-9" - /> +
)}
diff --git a/frontend/app/(main)/COMPANY_7/production/process-info/ProcessMasterTab.tsx b/frontend/app/(main)/COMPANY_7/production/process-info/ProcessMasterTab.tsx index cfbee962..207fa3ad 100644 --- a/frontend/app/(main)/COMPANY_7/production/process-info/ProcessMasterTab.tsx +++ b/frontend/app/(main)/COMPANY_7/production/process-info/ProcessMasterTab.tsx @@ -221,18 +221,28 @@ export function ProcessMasterTab() { }; const openEdit = () => { - if (!selectedProcess) { - toast.message("수정할 공정을 좌측 목록에서 선택해주세요"); + if (selectedIds.size === 0) { + toast.message("수정할 공정을 체크박스로 선택해주세요"); + return; + } + if (selectedIds.size > 1) { + toast.message("수정은 1건만 선택해주세요"); + return; + } + const targetId = Array.from(selectedIds)[0]; + const target = processes.find((p) => p.id === targetId); + if (!target) { + toast.error("선택한 공정을 찾을 수 없습니다"); return; } setFormMode("edit"); - setEditingId(selectedProcess.id); - setFormProcessCode(selectedProcess.process_code); - setFormProcessName(selectedProcess.process_name); - setFormProcessType(selectedProcess.process_type); - setFormStandardTime(selectedProcess.standard_time ?? ""); - setFormWorkerCount(selectedProcess.worker_count ?? ""); - setFormUseYn(selectedProcess.use_yn); + setEditingId(target.id); + setFormProcessCode(target.process_code); + setFormProcessName(target.process_name); + setFormProcessType(target.process_type); + setFormStandardTime(target.standard_time ?? ""); + setFormWorkerCount(target.worker_count ?? ""); + setFormUseYn(target.use_yn); setFormOpen(true); }; diff --git a/frontend/app/(main)/COMPANY_8/equipment/info/page.tsx b/frontend/app/(main)/COMPANY_8/equipment/info/page.tsx index c2f3c0ca..17d81598 100644 --- a/frontend/app/(main)/COMPANY_8/equipment/info/page.tsx +++ b/frontend/app/(main)/COMPANY_8/equipment/info/page.tsx @@ -147,17 +147,17 @@ export default function EquipmentInfoPage() { const colProps: Record> = { equipment_code: { width: "w-[110px]" }, equipment_name: { minWidth: "min-w-[130px]", truncate: true, render: (v) => v || "-" }, - equipment_type: { width: "w-[90px]", render: (v) => v || "-" }, + equipment_type: { width: "w-[90px]", render: (v) => resolve("equipment_type", v) || v || "-" }, manufacturer: { width: "w-[100px]", render: (v) => v || "-" }, installation_location: { width: "w-[100px]", render: (v) => v || "-" }, - operation_status: { width: "w-[80px]", render: (v) => v || "-" }, + operation_status: { width: "w-[80px]", render: (v) => resolve("operation_status", v) || v || "-" }, }; return ts.visibleColumns.map((col) => ({ key: col.key, label: col.label, ...colProps[col.key], })); - }, [ts.visibleColumns]); + }, [ts.visibleColumns, catOptions]); // 설비 조회 const fetchEquipments = useCallback(async () => { @@ -170,11 +170,7 @@ export default function EquipmentInfoPage() { autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; - setEquipments(raw.map((r: any) => ({ - ...r, - equipment_type: resolve("equipment_type", r.equipment_type), - operation_status: resolve("operation_status", r.operation_status), - }))); + setEquipments(raw); setEquipCount(res.data?.data?.total || raw.length); } catch { toast.error("설비 목록 조회 실패"); } finally { setEquipLoading(false); } }, [searchFilters, catOptions]); @@ -437,9 +433,9 @@ export default function EquipmentInfoPage() { const handleExcelDownload = async () => { if (equipments.length === 0) return; await exportToExcel(equipments.map((e) => ({ - 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: e.equipment_type, + 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: resolve("equipment_type", e.equipment_type), 제조사: e.manufacturer, 모델명: e.model_name, 설치장소: e.installation_location, - 도입일자: e.introduction_date, 가동상태: e.operation_status, + 도입일자: e.introduction_date, 가동상태: resolve("operation_status", e.operation_status), })), "설비정보.xlsx", "설비"); toast.success("다운로드 완료"); }; diff --git a/frontend/app/(main)/COMPANY_8/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_8/master-data/company/page.tsx index a607b7ea..4cf60273 100644 --- a/frontend/app/(main)/COMPANY_8/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_8/master-data/company/page.tsx @@ -563,10 +563,6 @@ export default function CompanyPage() { {/* 기본 정보 그리드 (2열) */}
-
- - -
- ) : numberingParts.some(p => p.isManual) ? ( - // 파트별 세그먼트 렌더링 (수동 입력 파트 있음) + ) : ( + // 자동 채번값 표시 + 사용자 직접 수정 가능 + setFormData(prev => ({ ...prev, [field.key]: e.target.value }))} + onFocus={(e) => e.target.select()} + placeholder="자동 채번 (직접 입력 가능)" + className="h-9" + /> + ) + /* 기존 세그먼트 UI 비활성화 — 대진산업은 직접 입력 허용 + numberingParts.some(p => p.isManual) ? (
{numberingParts.map((part, idx) => { const isFirst = idx === 0; @@ -852,7 +878,6 @@ export default function ItemInfoPage() { })}
) : ( - // 전체 auto: 읽기전용 표시 ) + */ ) : ["selling_price", "standard_price"].includes(field.key) ? ( + {ConfirmDialogComponent}
); } diff --git a/frontend/app/(main)/COMPANY_8/mold/info/page.tsx b/frontend/app/(main)/COMPANY_8/mold/info/page.tsx index 126c803d..ac3b2f9d 100644 --- a/frontend/app/(main)/COMPANY_8/mold/info/page.tsx +++ b/frontend/app/(main)/COMPANY_8/mold/info/page.tsx @@ -72,6 +72,36 @@ export default function MoldInfoPage() { const [selectedMoldCode, setSelectedMoldCode] = useState(null); const [viewMode, setViewMode] = useState<"list" | "grid">("list"); + // ─── 카테고리 옵션 (금형유형, 운영상태) ─── + const [moldTypeCatOptions, setMoldTypeCatOptions] = useState<{ code: string; label: string }[]>([]); + const [operationStatusCatOptions, setOperationStatusCatOptions] = useState<{ code: string; label: string }[]>([]); + + useEffect(() => { + const flatten = (arr: any[]): { code: string; label: string }[] => { + const result: { code: string; label: string }[] = []; + for (const v of arr) { result.push({ code: v.valueCode, label: v.valueLabel }); if (v.children?.length) result.push(...flatten(v.children)); } + return result; + }; + (async () => { + try { + const [typeRes, statusRes] = await Promise.all([ + apiClient.get("/table-categories/mold_mng/mold_type/values"), + apiClient.get("/table-categories/mold_mng/operation_status/values"), + ]); + if (typeRes.data?.success) setMoldTypeCatOptions(flatten(typeRes.data.data || [])); + if (statusRes.data?.success) setOperationStatusCatOptions(flatten(statusRes.data.data || [])); + } catch { /* skip */ } + })(); + }, []); + + const resolveMoldType = (code: string) => moldTypeCatOptions.find((o) => o.code === code)?.label || code; + const resolveOpStatus = (code: string) => { + const catLabel = operationStatusCatOptions.find((o) => o.code === code)?.label; + if (catLabel) return catLabel; + const legacyMap: Record = { ACTIVE: "사용중", INACTIVE: "미사용", REPAIR: "수리중", DISPOSED: "폐기", IN_USE: "사용중" }; + return legacyMap[code] || code; + }; + // ─── 검색 필터 ─── const [filterCode, setFilterCode] = useState(""); const [filterName, setFilterName] = useState(""); @@ -426,7 +456,7 @@ export default function MoldInfoPage() { // ─── 카드 렌더링 ─── const renderCard = (mold: any) => { const pct = calcLifePct(mold); - const st = STATUS_MAP[mold.operation_status] || { label: mold.operation_status || "-", variant: "secondary" as const }; + const stLabel = resolveOpStatus(mold.operation_status); const isSelected = selectedMoldCode === mold.mold_code; return ( @@ -460,7 +490,7 @@ export default function MoldInfoPage() { )}
- {st.label} + {stLabel}
@@ -470,7 +500,7 @@ export default function MoldInfoPage() {

{mold.mold_code}

{mold.mold_name}

{mold.mold_type && ( - {mold.mold_type} + {resolveMoldType(mold.mold_type)} )} @@ -531,10 +561,7 @@ export default function MoldInfoPage() { 전체 - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})} @@ -546,10 +573,7 @@ export default function MoldInfoPage() { 전체 - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -670,13 +694,13 @@ export default function MoldInfoPage() {

{selectedMold.mold_name}

{selectedMold.mold_type && ( - {selectedMold.mold_type} + {resolveMoldType(selectedMold.mold_type)} )} {selectedMold.category && ( {selectedMold.category} )} - - {STATUS_MAP[selectedMold.operation_status]?.label || selectedMold.operation_status || "-"} + + {resolveOpStatus(selectedMold.operation_status) || "-"}
@@ -811,15 +835,15 @@ export default function MoldInfoPage() { {serials.map((s: any) => { - const ss = SERIAL_STATUS_MAP[s.status] || { label: s.status || "-", variant: "secondary" as const }; - const maxShot = detail?.shot_count || 0; + const ssLabel = resolveOpStatus(s.status); + const maxShot = selectedMold?.shot_count || 0; const curShot = s.current_shot_count || 0; const pct = maxShot > 0 ? Math.min(Math.round((curShot / maxShot) * 100), 100) : 0; return ( {s.serial_number} - {ss.label} + {ssLabel} {maxShot > 0 ? ( @@ -1043,10 +1067,7 @@ export default function MoldInfoPage() { - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})} @@ -1117,10 +1138,7 @@ export default function MoldInfoPage() { - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -1175,10 +1193,7 @@ export default function MoldInfoPage() { - 사용중 - 보관중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} diff --git a/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx b/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx index 2a5684b0..4a86ef27 100644 --- a/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx +++ b/frontend/app/(main)/COMPANY_8/outsourcing/subcontractor/page.tsx @@ -1096,6 +1096,33 @@ export default function SubcontractorManagementPage() { /> {formErrors.business_number &&

{formErrors.business_number}

} +
+ + setSubcontractorForm((p) => ({ ...p, representative: e.target.value }))} + placeholder="대표이름" + className="h-9 text-sm" + /> +
+
+ + handleFormChange("phone", e.target.value)} + placeholder="02-0000-0000" + className="h-9 text-sm" + /> +
+
+ + handleFormChange("fax", e.target.value)} + placeholder="02-0000-0000" + className="h-9 text-sm" + /> +
) : (
- {/* 상세 카드 */} -
-
-

BOM 상세정보

- -
- {detailLoading ? ( -
- -
- ) : bomHeader ? ( -
-
- 품목코드 - {bomHeader.item_code || bomHeader.item_number || "-"} -
-
- 품명 - {bomHeader.item_name || "-"} -
-
- BOM 유형 - {BOM_TYPE_OPTIONS.find((o) => o.code === bomHeader.bom_type)?.label || bomHeader.bom_type || "-"} -
-
- 버전 - {bomHeader.version || "-"} -
-
- 기준수량 - {bomHeader.base_qty || "1"} {bomHeader.unit || ""} -
-
- 상태 - {renderStatusBadge(bomHeader.status)} -
-
- 메모 - {bomHeader.remark || "-"} -
-
- ) : null} -
- {/* 하단 탭: 트리뷰 / 버전 / 이력 */}
{ diff --git a/frontend/app/(main)/COMPANY_8/production/process-info/ItemRoutingTab.tsx b/frontend/app/(main)/COMPANY_8/production/process-info/ItemRoutingTab.tsx index e50e27d5..4eefd66c 100644 --- a/frontend/app/(main)/COMPANY_8/production/process-info/ItemRoutingTab.tsx +++ b/frontend/app/(main)/COMPANY_8/production/process-info/ItemRoutingTab.tsx @@ -92,6 +92,7 @@ export function ItemRoutingTab() { const [formWorkType, setFormWorkType] = useState("내부"); const [formStandardTime, setFormStandardTime] = useState(""); const [formOutsource, setFormOutsource] = useState(""); + const [subcontractorOptions, setSubcontractorOptions] = useState<{ code: string; name: string }[]>([]); const [detailSubmitting, setDetailSubmitting] = useState(false); const [registerDialogOpen, setRegisterDialogOpen] = useState(false); @@ -107,6 +108,19 @@ export function ItemRoutingTab() { return () => window.clearTimeout(t); }, [searchInput]); + // 외주사 목록 로드 + useEffect(() => { + (async () => { + try { + const res = await apiClient.post("/table-management/tables/subcontractor_mng/data", { + page: 1, size: 500, autoFilter: true, + }); + const rows = res.data?.data?.data || res.data?.data?.rows || []; + setSubcontractorOptions(rows.map((r: any) => ({ code: r.subcontractor_code || r.id, name: r.subcontractor_name || "" }))); + } catch { /* skip */ } + })(); + }, []); + useEffect(() => { const t = window.setTimeout(() => setRegisterSearchDebounced(registerSearch.trim()), 300); return () => window.clearTimeout(t); @@ -469,9 +483,9 @@ export function ItemRoutingTab() { details.map((d) => ({ ...d, process_display: d.process_name || d.process_code, - outsource_display: d.outsource_supplier || "—", + outsource_display: subcontractorOptions.find((s) => s.code === d.outsource_supplier)?.name || d.outsource_supplier || "—", })), - [details], + [details, subcontractorOptions], ); return ( @@ -896,12 +910,14 @@ export function ItemRoutingTab() { {showOutsourceField && (
- setFormOutsource(e.target.value)} - placeholder="외주 업체명" - className="h-9" - /> +
)}
diff --git a/frontend/app/(main)/COMPANY_8/production/process-info/ProcessMasterTab.tsx b/frontend/app/(main)/COMPANY_8/production/process-info/ProcessMasterTab.tsx index cfbee962..ab75ae0d 100644 --- a/frontend/app/(main)/COMPANY_8/production/process-info/ProcessMasterTab.tsx +++ b/frontend/app/(main)/COMPANY_8/production/process-info/ProcessMasterTab.tsx @@ -221,18 +221,29 @@ export function ProcessMasterTab() { }; const openEdit = () => { - if (!selectedProcess) { - toast.message("수정할 공정을 좌측 목록에서 선택해주세요"); + // 체크박스 기준: 1개만 체크된 경우 수정 + if (selectedIds.size === 0) { + toast.message("수정할 공정을 체크박스로 선택해주세요"); + return; + } + if (selectedIds.size > 1) { + toast.message("수정은 1건만 선택해주세요"); + return; + } + const targetId = Array.from(selectedIds)[0]; + const target = processes.find((p) => p.id === targetId); + if (!target) { + toast.error("선택한 공정을 찾을 수 없습니다"); return; } setFormMode("edit"); - setEditingId(selectedProcess.id); - setFormProcessCode(selectedProcess.process_code); - setFormProcessName(selectedProcess.process_name); - setFormProcessType(selectedProcess.process_type); - setFormStandardTime(selectedProcess.standard_time ?? ""); - setFormWorkerCount(selectedProcess.worker_count ?? ""); - setFormUseYn(selectedProcess.use_yn); + setEditingId(target.id); + setFormProcessCode(target.process_code); + setFormProcessName(target.process_name); + setFormProcessType(target.process_type); + setFormStandardTime(target.standard_time ?? ""); + setFormWorkerCount(target.worker_count ?? ""); + setFormUseYn(target.use_yn); setFormOpen(true); }; diff --git a/frontend/app/(main)/COMPANY_8/purchase/supplier/page.tsx b/frontend/app/(main)/COMPANY_8/purchase/supplier/page.tsx index 964e7e09..355a67e5 100644 --- a/frontend/app/(main)/COMPANY_8/purchase/supplier/page.tsx +++ b/frontend/app/(main)/COMPANY_8/purchase/supplier/page.tsx @@ -1896,6 +1896,33 @@ export default function SupplierManagementPage() { /> {formErrors.business_number &&

{formErrors.business_number}

}
+
+ + setSupplierForm((p) => ({ ...p, representative_name: e.target.value }))} + placeholder="대표이름" + className="h-9" + /> +
+
+ + handleFormChange("phone", e.target.value)} + placeholder="02-0000-0000" + className="h-9" + /> +
+
+ + handleFormChange("fax_number", e.target.value)} + placeholder="02-0000-0000" + className="h-9" + /> +
{formErrors.business_number &&

{formErrors.business_number}

}
+
+ + setCustomerForm((p) => ({ ...p, representative_name: e.target.value }))} + placeholder="대표이름" + className="h-9" + /> +
+
+ + handleFormChange("phone", e.target.value)} + placeholder="02-0000-0000" + className="h-9" + /> +
+
+ + handleFormChange("fax", e.target.value)} + placeholder="02-0000-0000" + className="h-9" + /> +
+
+ + handleFormChange("email", e.target.value)} + placeholder="example@email.com" + className={cn("h-9", formErrors.email && "border-destructive")} + /> + {formErrors.email &&

{formErrors.email}

} +
> = { equipment_code: { width: "w-[110px]" }, equipment_name: { minWidth: "min-w-[130px]", truncate: true, render: (v) => v || "-" }, - equipment_type: { width: "w-[90px]", render: (v) => v || "-" }, + equipment_type: { width: "w-[90px]", render: (v) => resolve("equipment_type", v) || v || "-" }, manufacturer: { width: "w-[100px]", render: (v) => v || "-" }, installation_location: { width: "w-[100px]", render: (v) => v || "-" }, - operation_status: { width: "w-[80px]", render: (v) => v || "-" }, + operation_status: { width: "w-[80px]", render: (v) => resolve("operation_status", v) || v || "-" }, }; return ts.visibleColumns.map((col) => ({ key: col.key, label: col.label, ...colProps[col.key], })); - }, [ts.visibleColumns]); + }, [ts.visibleColumns, catOptions]); // 설비 조회 const fetchEquipments = useCallback(async () => { @@ -170,11 +170,7 @@ export default function EquipmentInfoPage() { autoFilter: true, }); const raw = res.data?.data?.data || res.data?.data?.rows || []; - setEquipments(raw.map((r: any) => ({ - ...r, - equipment_type: resolve("equipment_type", r.equipment_type), - operation_status: resolve("operation_status", r.operation_status), - }))); + setEquipments(raw); setEquipCount(res.data?.data?.total || raw.length); } catch { toast.error("설비 목록 조회 실패"); } finally { setEquipLoading(false); } }, [searchFilters, catOptions]); @@ -437,9 +433,9 @@ export default function EquipmentInfoPage() { const handleExcelDownload = async () => { if (equipments.length === 0) return; await exportToExcel(equipments.map((e) => ({ - 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: e.equipment_type, + 설비코드: e.equipment_code, 설비명: e.equipment_name, 설비유형: resolve("equipment_type", e.equipment_type), 제조사: e.manufacturer, 모델명: e.model_name, 설치장소: e.installation_location, - 도입일자: e.introduction_date, 가동상태: e.operation_status, + 도입일자: e.introduction_date, 가동상태: resolve("operation_status", e.operation_status), })), "설비정보.xlsx", "설비"); toast.success("다운로드 완료"); }; diff --git a/frontend/app/(main)/COMPANY_9/master-data/company/page.tsx b/frontend/app/(main)/COMPANY_9/master-data/company/page.tsx index 0e4de0cd..347ea2ea 100644 --- a/frontend/app/(main)/COMPANY_9/master-data/company/page.tsx +++ b/frontend/app/(main)/COMPANY_9/master-data/company/page.tsx @@ -563,10 +563,6 @@ export default function CompanyPage() { {/* 기본 정보 그리드 (2열) */}
-
- - -
@@ -470,7 +500,7 @@ export default function MoldInfoPage() {

{mold.mold_code}

{mold.mold_name}

{mold.mold_type && ( - {mold.mold_type} + {resolveMoldType(mold.mold_type)} )}
@@ -531,10 +561,7 @@ export default function MoldInfoPage() { 전체 - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})}
@@ -546,10 +573,7 @@ export default function MoldInfoPage() { 전체 - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})}
@@ -670,13 +694,13 @@ export default function MoldInfoPage() {

{selectedMold.mold_name}

{selectedMold.mold_type && ( - {selectedMold.mold_type} + {resolveMoldType(selectedMold.mold_type)} )} {selectedMold.category && ( {selectedMold.category} )} - - {STATUS_MAP[selectedMold.operation_status]?.label || selectedMold.operation_status || "-"} + + {resolveOpStatus(selectedMold.operation_status) || "-"}
@@ -811,15 +835,15 @@ export default function MoldInfoPage() { {serials.map((s: any) => { - const ss = SERIAL_STATUS_MAP[s.status] || { label: s.status || "-", variant: "secondary" as const }; - const maxShot = detail?.shot_count || 0; + const ssLabel = resolveOpStatus(s.status); + const maxShot = selectedMold?.shot_count || 0; const curShot = s.current_shot_count || 0; const pct = maxShot > 0 ? Math.min(Math.round((curShot / maxShot) * 100), 100) : 0; return ( {s.serial_number} - {ss.label} + {ssLabel} {maxShot > 0 ? ( @@ -1043,10 +1067,7 @@ export default function MoldInfoPage() { - 사출금형 - 프레스금형 - 다이캐스팅 - 단조금형 + {moldTypeCatOptions.map((o) => {o.label})} @@ -1117,10 +1138,7 @@ export default function MoldInfoPage() { - 사용중 - 점검중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} @@ -1175,10 +1193,7 @@ export default function MoldInfoPage() { - 사용중 - 보관중 - 수리중 - 폐기 + {operationStatusCatOptions.map((o) => {o.label})} diff --git a/frontend/app/(main)/COMPANY_9/production/bom/page.tsx b/frontend/app/(main)/COMPANY_9/production/bom/page.tsx index 9b2e32c8..81356855 100644 --- a/frontend/app/(main)/COMPANY_9/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_9/production/bom/page.tsx @@ -1530,53 +1530,6 @@ export default function BomManagementPage() { ) : (
- {/* 상세 카드 */} -
-
-

BOM 상세정보

- -
- {detailLoading ? ( -
- -
- ) : bomHeader ? ( -
-
- 품목코드 - {bomHeader.item_code || bomHeader.item_number || "-"} -
-
- 품명 - {bomHeader.item_name || "-"} -
-
- BOM 유형 - {BOM_TYPE_OPTIONS.find((o) => o.code === bomHeader.bom_type)?.label || bomHeader.bom_type || "-"} -
-
- 버전 - {bomHeader.version || "-"} -
-
- 기준수량 - {bomHeader.base_qty || "1"} {bomHeader.unit || ""} -
-
- 상태 - {renderStatusBadge(bomHeader.status)} -
-
- 메모 - {bomHeader.remark || "-"} -
-
- ) : null} -
- {/* 하단 탭: 트리뷰 / 버전 / 이력 */}
{ diff --git a/frontend/app/(main)/COMPANY_9/production/process-info/ItemRoutingTab.tsx b/frontend/app/(main)/COMPANY_9/production/process-info/ItemRoutingTab.tsx index e50e27d5..4eefd66c 100644 --- a/frontend/app/(main)/COMPANY_9/production/process-info/ItemRoutingTab.tsx +++ b/frontend/app/(main)/COMPANY_9/production/process-info/ItemRoutingTab.tsx @@ -92,6 +92,7 @@ export function ItemRoutingTab() { const [formWorkType, setFormWorkType] = useState("내부"); const [formStandardTime, setFormStandardTime] = useState(""); const [formOutsource, setFormOutsource] = useState(""); + const [subcontractorOptions, setSubcontractorOptions] = useState<{ code: string; name: string }[]>([]); const [detailSubmitting, setDetailSubmitting] = useState(false); const [registerDialogOpen, setRegisterDialogOpen] = useState(false); @@ -107,6 +108,19 @@ export function ItemRoutingTab() { return () => window.clearTimeout(t); }, [searchInput]); + // 외주사 목록 로드 + useEffect(() => { + (async () => { + try { + const res = await apiClient.post("/table-management/tables/subcontractor_mng/data", { + page: 1, size: 500, autoFilter: true, + }); + const rows = res.data?.data?.data || res.data?.data?.rows || []; + setSubcontractorOptions(rows.map((r: any) => ({ code: r.subcontractor_code || r.id, name: r.subcontractor_name || "" }))); + } catch { /* skip */ } + })(); + }, []); + useEffect(() => { const t = window.setTimeout(() => setRegisterSearchDebounced(registerSearch.trim()), 300); return () => window.clearTimeout(t); @@ -469,9 +483,9 @@ export function ItemRoutingTab() { details.map((d) => ({ ...d, process_display: d.process_name || d.process_code, - outsource_display: d.outsource_supplier || "—", + outsource_display: subcontractorOptions.find((s) => s.code === d.outsource_supplier)?.name || d.outsource_supplier || "—", })), - [details], + [details, subcontractorOptions], ); return ( @@ -896,12 +910,14 @@ export function ItemRoutingTab() { {showOutsourceField && (
- setFormOutsource(e.target.value)} - placeholder="외주 업체명" - className="h-9" - /> +
)}
diff --git a/frontend/app/(main)/COMPANY_9/production/process-info/ProcessMasterTab.tsx b/frontend/app/(main)/COMPANY_9/production/process-info/ProcessMasterTab.tsx index cfbee962..207fa3ad 100644 --- a/frontend/app/(main)/COMPANY_9/production/process-info/ProcessMasterTab.tsx +++ b/frontend/app/(main)/COMPANY_9/production/process-info/ProcessMasterTab.tsx @@ -221,18 +221,28 @@ export function ProcessMasterTab() { }; const openEdit = () => { - if (!selectedProcess) { - toast.message("수정할 공정을 좌측 목록에서 선택해주세요"); + if (selectedIds.size === 0) { + toast.message("수정할 공정을 체크박스로 선택해주세요"); + return; + } + if (selectedIds.size > 1) { + toast.message("수정은 1건만 선택해주세요"); + return; + } + const targetId = Array.from(selectedIds)[0]; + const target = processes.find((p) => p.id === targetId); + if (!target) { + toast.error("선택한 공정을 찾을 수 없습니다"); return; } setFormMode("edit"); - setEditingId(selectedProcess.id); - setFormProcessCode(selectedProcess.process_code); - setFormProcessName(selectedProcess.process_name); - setFormProcessType(selectedProcess.process_type); - setFormStandardTime(selectedProcess.standard_time ?? ""); - setFormWorkerCount(selectedProcess.worker_count ?? ""); - setFormUseYn(selectedProcess.use_yn); + setEditingId(target.id); + setFormProcessCode(target.process_code); + setFormProcessName(target.process_name); + setFormProcessType(target.process_type); + setFormStandardTime(target.standard_time ?? ""); + setFormWorkerCount(target.worker_count ?? ""); + setFormUseYn(target.use_yn); setFormOpen(true); }; diff --git a/frontend/components/common/EDataTable.tsx b/frontend/components/common/EDataTable.tsx index 1b16a772..c1a47615 100644 --- a/frontend/components/common/EDataTable.tsx +++ b/frontend/components/common/EDataTable.tsx @@ -715,16 +715,17 @@ export function EDataTable = any>({ const id = getRowId(row, rowKey); const isSelected = selectedId != null && String(selectedId) === String(id); const isChecked = checkedIds.includes(id); - const highlighted = isSelected || isChecked; return ( { onSelect?.(id); From 173b85b4765c84595720bfe105ab05f7ebf482e7 Mon Sep 17 00:00:00 2001 From: kjs Date: Fri, 17 Apr 2026 13:11:01 +0900 Subject: [PATCH 04/17] feat: Implement copy functionality for item inspection information - Added a modal for copying inspection information from a selected item to multiple target items. - Implemented search and selection logic for target items to facilitate the copying process. - Included validation to ensure a source item is selected and that target items are valid before proceeding with the copy operation. - Enhanced user feedback with toast notifications for successful and error states during the copy process. - Updated BOM management to include unit label handling for better clarity in item representation. --- .../tableCategoryValueController.ts | 4 +- .../src/services/categoryTreeService.ts | 5 +- .../src/services/tableCategoryValueService.ts | 7 +- .../COMPANY_10/master-data/options/page.tsx | 97 +++++++- .../(main)/COMPANY_10/production/bom/page.tsx | 13 +- .../COMPANY_10/quality/inspection/page.tsx | 141 ++++++----- .../quality/item-inspection/page.tsx | 230 +++++++++++++++++- .../COMPANY_16/master-data/options/page.tsx | 99 +++++++- .../(main)/COMPANY_16/production/bom/page.tsx | 13 +- .../COMPANY_16/quality/inspection/page.tsx | 141 ++++++----- .../quality/item-inspection/page.tsx | 230 +++++++++++++++++- .../COMPANY_29/master-data/options/page.tsx | 97 +++++++- .../(main)/COMPANY_29/production/bom/page.tsx | 13 +- .../COMPANY_29/quality/inspection/page.tsx | 141 ++++++----- .../quality/item-inspection/page.tsx | 230 +++++++++++++++++- .../COMPANY_30/master-data/options/page.tsx | 97 +++++++- .../(main)/COMPANY_30/production/bom/page.tsx | 13 +- .../COMPANY_30/quality/inspection/page.tsx | 141 ++++++----- .../quality/item-inspection/page.tsx | 230 +++++++++++++++++- .../(main)/COMPANY_30/sales/customer/page.tsx | 2 +- .../(main)/COMPANY_30/sales/order/page.tsx | 2 +- .../COMPANY_7/master-data/options/page.tsx | 97 +++++++- .../(main)/COMPANY_7/production/bom/page.tsx | 13 +- .../COMPANY_7/quality/inspection/page.tsx | 141 ++++++----- .../quality/item-inspection/page.tsx | 230 +++++++++++++++++- .../COMPANY_8/master-data/options/page.tsx | 97 +++++++- .../(main)/COMPANY_8/production/bom/page.tsx | 13 +- .../COMPANY_8/quality/inspection/page.tsx | 141 ++++++----- .../quality/item-inspection/page.tsx | 230 +++++++++++++++++- .../COMPANY_9/master-data/options/page.tsx | 97 +++++++- .../(main)/COMPANY_9/production/bom/page.tsx | 13 +- .../COMPANY_9/quality/inspection/page.tsx | 141 ++++++----- .../quality/item-inspection/page.tsx | 230 +++++++++++++++++- .../(main)/COMPANY_9/sales/customer/page.tsx | 2 +- .../app/(main)/COMPANY_9/sales/order/page.tsx | 2 +- frontend/components/common/EDataTable.tsx | 4 +- frontend/lib/api/tableCategoryValue.ts | 6 +- 37 files changed, 2944 insertions(+), 459 deletions(-) diff --git a/backend-node/src/controllers/tableCategoryValueController.ts b/backend-node/src/controllers/tableCategoryValueController.ts index cff7ccfa..508b3159 100644 --- a/backend-node/src/controllers/tableCategoryValueController.ts +++ b/backend-node/src/controllers/tableCategoryValueController.ts @@ -67,6 +67,7 @@ export const getCategoryValues = async (req: AuthenticatedRequest, res: Response const includeInactive = req.query.includeInactive === "true"; const menuObjid = req.query.menuObjid ? Number(req.query.menuObjid) : undefined; const filterCompanyCode = req.query.filterCompanyCode as string | undefined; + const topLevelOnly = req.query.topLevelOnly === "true"; // 최고관리자가 특정 회사 기준 필터링을 요청한 경우 해당 회사 코드 사용 const effectiveCompanyCode = (userCompanyCode === "*" && filterCompanyCode) @@ -86,7 +87,8 @@ export const getCategoryValues = async (req: AuthenticatedRequest, res: Response columnName, effectiveCompanyCode, includeInactive, - menuObjid + menuObjid, + topLevelOnly ); return res.json({ diff --git a/backend-node/src/services/categoryTreeService.ts b/backend-node/src/services/categoryTreeService.ts index 462a5191..b236a7f5 100644 --- a/backend-node/src/services/categoryTreeService.ts +++ b/backend-node/src/services/categoryTreeService.ts @@ -223,13 +223,14 @@ class CategoryTreeService { const query = ` INSERT INTO category_values ( - table_name, column_name, value_code, value_label, value_order, + value_id, table_name, column_name, value_code, value_label, value_order, parent_value_id, depth, path, description, color, icon, is_active, is_default, company_code, created_by, updated_by ) VALUES ( + (SELECT COALESCE(MAX(value_id), 0) + 1 FROM category_values), $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $15 ) - RETURNING + RETURNING value_id AS "valueId", table_name AS "tableName", column_name AS "columnName", diff --git a/backend-node/src/services/tableCategoryValueService.ts b/backend-node/src/services/tableCategoryValueService.ts index 16bc75a2..712bf646 100644 --- a/backend-node/src/services/tableCategoryValueService.ts +++ b/backend-node/src/services/tableCategoryValueService.ts @@ -167,7 +167,8 @@ class TableCategoryValueService { columnName: string, companyCode: string, includeInactive: boolean = false, - menuObjid?: number + menuObjid?: number, + topLevelOnly: boolean = false ): Promise { try { logger.info("카테고리 값 목록 조회 (메뉴 스코프)", { @@ -235,6 +236,10 @@ class TableCategoryValueService { query += ` AND is_active = true`; } + if (topLevelOnly) { + query += ` AND (depth = 1 OR depth IS NULL OR parent_value_id IS NULL)`; + } + query += ` ORDER BY value_order, value_label`; const result = await pool.query(query, params); diff --git a/frontend/app/(main)/COMPANY_10/master-data/options/page.tsx b/frontend/app/(main)/COMPANY_10/master-data/options/page.tsx index 7506ad94..6053f27f 100644 --- a/frontend/app/(main)/COMPANY_10/master-data/options/page.tsx +++ b/frontend/app/(main)/COMPANY_10/master-data/options/page.tsx @@ -5,7 +5,12 @@ import { Settings2, Tags, Hash } from "lucide-react"; import { cn } from "@/lib/utils"; import { CategoryColumnList } from "@/components/table-category/CategoryColumnList"; import { CategoryValueManager } from "@/components/table-category/CategoryValueManager"; +import { CategoryValueManagerTree } from "@/components/table-category/CategoryValueManagerTree"; import { NumberingRuleDesigner } from "@/components/numbering-rule/NumberingRuleDesigner"; +import { Switch } from "@/components/ui/switch"; +import { Label } from "@/components/ui/label"; +import { useConfirmDialog } from "@/components/common/ConfirmDialog"; +import { getCategoryValues } from "@/lib/api/tableCategoryValue"; const TABS = [ { id: "category", label: "카테고리 설정", icon: Tags }, @@ -21,6 +26,12 @@ export default function OptionsSettingPage() { const [selectedColumnLabel, setSelectedColumnLabel] = useState(""); const [selectedTableName, setSelectedTableName] = useState(""); + const [useHierarchy, setUseHierarchy] = useState(false); + const [hasChildRows, setHasChildRows] = useState(false); + const [detectingHierarchy, setDetectingHierarchy] = useState(false); + + const { confirm, ConfirmDialogComponent } = useConfirmDialog(); + const [leftWidth, setLeftWidth] = useState(340); const [isDragging, setIsDragging] = useState(false); const containerRef = useRef(null); @@ -51,6 +62,71 @@ export default function OptionsSettingPage() { }; }, [isDragging]); + useEffect(() => { + if (!selectedColumn || !selectedTableName) { + setUseHierarchy(false); + setHasChildRows(false); + return; + } + const columnNameOnly = selectedColumn.includes(".") + ? selectedColumn.split(".").pop()! + : selectedColumn; + let cancelled = false; + setDetectingHierarchy(true); + (async () => { + const res = await getCategoryValues(selectedTableName, columnNameOnly, true); + if (cancelled) return; + const values = (res as any)?.data || []; + const hasChild = Array.isArray(values) + ? values.some( + (v: any) => + (typeof v.depth === "number" && v.depth > 1) || + (v.parentValueId !== null && v.parentValueId !== undefined), + ) + : false; + setHasChildRows(hasChild); + setUseHierarchy(hasChild); + setDetectingHierarchy(false); + })(); + return () => { + cancelled = true; + }; + }, [selectedColumn, selectedTableName]); + + const handleToggleHierarchy = useCallback( + async (checked: boolean) => { + if (!checked && hasChildRows) { + const ok = await confirm( + "이미 등록된 하위분류(중/소분류)가 있습니다.\n하위분류 사용을 해제해도 기존 데이터는 삭제되지 않으며, 다시 사용 설정 시 그대로 복원됩니다.\n계속하시겠습니까?", + { variant: "destructive", confirmText: "해제" }, + ); + if (!ok) return; + } + setUseHierarchy(checked); + }, + [hasChildRows, confirm], + ); + + const columnNameOnly = selectedColumn + ? selectedColumn.includes(".") + ? selectedColumn.split(".").pop()! + : selectedColumn + : ""; + + const headerRight = selectedColumn ? ( +
+ + +
+ ) : null; + return (
@@ -108,11 +184,21 @@ export default function OptionsSettingPage() {
{selectedColumn && selectedTableName ? ( - + useHierarchy ? ( + + ) : ( + + ) ) : (
@@ -131,6 +217,7 @@ export default function OptionsSettingPage() {
)}
+ {ConfirmDialogComponent}
); } diff --git a/frontend/app/(main)/COMPANY_10/production/bom/page.tsx b/frontend/app/(main)/COMPANY_10/production/bom/page.tsx index 8c7b582b..c8618672 100644 --- a/frontend/app/(main)/COMPANY_10/production/bom/page.tsx +++ b/frontend/app/(main)/COMPANY_10/production/bom/page.tsx @@ -497,12 +497,14 @@ export default function BomManagementPage() { const c = code.trim(); return categoryOptions["division"]?.find((o) => o.code === c)?.label || c; }).filter((v: string) => v && v !== "s").join(", "); + const rawUnit = d.unit || item?.inventory_unit || ""; + const unitLabel = categoryOptions["inventory_unit"]?.find((o) => o.code === rawUnit)?.label || rawUnit; return { ...d, item_number: item?.item_number || "", item_name: item?.item_name || "", item_type: divisionLabel, - unit: d.unit || item?.inventory_unit || "", + unit: unitLabel, spec: item?.size || item?.spec || "", writer: d.writer || "", updated_date: d.updated_at || d.updated_date || "", @@ -818,6 +820,15 @@ export default function BomManagementPage() { return; } + // 같은 레벨(같은 부모) 중복 품목 체크 + const siblings = addTargetParentId + ? (findNodeById(editingTree, addTargetParentId)?.children || []) + : editingTree; + if (siblings.some((n) => n.child_item_id === item.id)) { + toast.error("같은 레벨에 이미 동일 품목이 존재합니다"); + return; + } + const tempId = `temp_${Date.now()}_${Math.random().toString(36).slice(2)}`; const parentNode = addTargetParentId ? findNodeById(editingTree, addTargetParentId) : null; const newLevel = parentNode ? ((parentNode._level ?? parentNode.level ?? 0) as number) + 1 : 0; diff --git a/frontend/app/(main)/COMPANY_10/quality/inspection/page.tsx b/frontend/app/(main)/COMPANY_10/quality/inspection/page.tsx index 4602a719..b1998a64 100644 --- a/frontend/app/(main)/COMPANY_10/quality/inspection/page.tsx +++ b/frontend/app/(main)/COMPANY_10/quality/inspection/page.tsx @@ -31,6 +31,7 @@ import { Settings2, } from "lucide-react"; import { DynamicSearchFilter, FilterValue } from "@/components/common/DynamicSearchFilter"; +import { ImageUpload } from "@/components/common/ImageUpload"; import { cn } from "@/lib/utils"; import { apiClient } from "@/lib/api/client"; import { previewNumberingCode, allocateNumberingCode } from "@/lib/api/numberingRule"; @@ -59,11 +60,12 @@ const DEFECT_TABLE = "defect_standard_mng"; const EQUIPMENT_TABLE = "inspection_equipment_mng"; /* ───── 카테고리 flatten ───── */ -const flattenCategories = (vals: any[]): { code: string; label: string }[] => { - const result: { code: string; label: string }[] = []; +type CatOption = { code: string; label: string; depth: number; parentCode?: string }; +const flattenCategories = (vals: any[], parentCode?: string): CatOption[] => { + const result: CatOption[] = []; for (const v of vals) { - result.push({ code: v.valueCode, label: v.valueLabel }); - if (v.children?.length) result.push(...flattenCategories(v.children)); + result.push({ code: v.valueCode, label: v.valueLabel, depth: v.depth ?? 1, parentCode }); + if (v.children?.length) result.push(...flattenCategories(v.children, v.valueCode)); } return result; }; @@ -113,13 +115,13 @@ export default function InspectionManagementPage() { const [previewCode, setPreviewCode] = useState(null); /* ───── 카테고리 옵션 ───── */ - const [catOptions, setCatOptions] = useState>({}); + const [catOptions, setCatOptions] = useState>({}); const [userOptions, setUserOptions] = useState<{ code: string; label: string }[]>([]); /* ═══════════════════ 카테고리 로드 ═══════════════════ */ useEffect(() => { const load = async () => { - const optMap: Record = {}; + const optMap: Record = {}; const catList = [ { table: INSPECTION_TABLE, col: "inspection_type" }, { table: INSPECTION_TABLE, col: "apply_type" }, @@ -867,7 +869,7 @@ export default function InspectionManagementPage() { .filter(Boolean) .map((t: string) => ( - {t} + {getCatLabel(DEFECT_TABLE, "inspection_type", t)} )) : "-"} @@ -945,6 +947,9 @@ export default function InspectionManagementPage() { onCheckedChange={(v) => setEqChecked(v ? filteredEquipments.map((r) => r.id) : [])} /> + + 이미지 + 장비코드 @@ -980,13 +985,13 @@ export default function InspectionManagementPage() { {eqLoading ? ( - + ) : filteredEquipments.length === 0 ? ( - +

등록된 검사장비가 없어요

@@ -1015,6 +1020,18 @@ export default function InspectionManagementPage() { } />
+ + {row.image_path ? ( + { (e.target as HTMLImageElement).style.display = "none"; }} + /> + ) : ( +
+ )} + {row.equipment_code || "-"} {row.equipment_name || "-"} @@ -1421,24 +1438,26 @@ export default function InspectionManagementPage() { 검사유형 * (다중선택)
- {(catOptions[`${DEFECT_TABLE}.inspection_type`] || []).map((o) => { - const types: string[] = defForm.inspection_type - ? defForm.inspection_type.split(",").filter(Boolean) - : []; - const checked = types.includes(o.code); - return ( -
- { - const next = v ? [...types, o.code] : types.filter((t) => t !== o.code); - setDefForm((p) => ({ ...p, inspection_type: next.join(","), apply_target: "" })); - }} - /> - -
- ); - })} + {(catOptions[`${DEFECT_TABLE}.inspection_type`] || []) + .filter((o) => o.depth === 1) + .map((o) => { + const types: string[] = defForm.inspection_type + ? defForm.inspection_type.split(",").filter(Boolean) + : []; + const checked = types.includes(o.code); + return ( +
+ { + const next = v ? [...types, o.code] : types.filter((t) => t !== o.code); + setDefForm((p) => ({ ...p, inspection_type: next.join(","), apply_target: "" })); + }} + /> + +
+ ); + })}
{/* 적용대상 (다중선택, 검사유형별 동적) */} @@ -1451,38 +1470,37 @@ export default function InspectionManagementPage() { : []; if (selectedTypes.length === 0) return

검사유형을 먼저 선택하세요

; - const typeTargetMap: Record = {}; const defInspOpts = catOptions[`${DEFECT_TABLE}.inspection_type`] || []; - for (const code of selectedTypes) { - const label = defInspOpts.find((o) => o.code === code)?.label || ""; - if (label.includes("수입")) - typeTargetMap[label] = ["구매입고", "외주입고", "반품입고", "무상입고", "기타입고"]; - else if (label.includes("공정")) - typeTargetMap[label] = ["가공", "조립", "도장", "열처리", "표면처리", "용접"]; - else if (label.includes("출하")) - typeTargetMap[label] = ["국내출하", "수출출하", "반품출하", "샘플출하"]; - else if (label.includes("최종")) typeTargetMap[label] = ["완제품", "반제품", "부품"]; - } const targets: string[] = defForm.apply_target ? defForm.apply_target.split(",").filter(Boolean) : []; - return Object.entries(typeTargetMap).map(([typeName, opts]) => ( -
-

{typeName}

-
- {opts.map((t) => ( -
- { - const next = v ? [...targets, t] : targets.filter((x) => x !== t); - setDefForm((p) => ({ ...p, apply_target: next.join(",") })); - }} - /> - + return selectedTypes.map((parentCode: string) => { + const parentLabel = defInspOpts.find((o) => o.code === parentCode)?.label || parentCode; + const children = defInspOpts.filter((o) => o.parentCode === parentCode); + return ( +
+

{parentLabel}

+ {children.length === 0 ? ( +

+ 하위분류가 없습니다. 옵션설정에서 "{parentLabel}"의 하위분류를 등록해주세요. +

+ ) : ( +
+ {children.map((t) => ( +
+ { + const next = v ? [...targets, t.code] : targets.filter((x) => x !== t.code); + setDefForm((p) => ({ ...p, apply_target: next.join(",") })); + }} + /> + +
+ ))}
- ))} + )}
-
- )); + ); + }); })()}
@@ -1710,7 +1728,18 @@ export default function InspectionManagementPage() {
- {/* Row 5: 비고 (full width) */} + {/* Row 5: 이미지 (full width) */} +
+ + setEqForm((p) => ({ ...p, image_path: v }))} + tableName={EQUIPMENT_TABLE} + recordId={eqForm.id} + columnName="image_path" + /> +
+ {/* Row 6: 비고 (full width) */}