refactor: Enhance subcontractor and item management functionality
- Added loading of item division categories to improve item search capabilities in subcontractor management pages. - Updated filtering logic to use dynamic category codes for division filtering in subcontractor and sales item pages. - Consolidated standard price labels in purchase item pages for clarity. These changes aim to improve the user experience and data handling in subcontractor and item management processes across multiple companies.
This commit is contained in:
@@ -142,7 +142,7 @@ export default function SubcontractorItemPage() {
|
||||
try {
|
||||
const filters: any[] = [];
|
||||
if (outsourcingDivisionCode) {
|
||||
filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode });
|
||||
filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode });
|
||||
}
|
||||
if (searchKeyword) {
|
||||
filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword });
|
||||
|
||||
@@ -141,6 +141,10 @@ export default function SubcontractorManagementPage() {
|
||||
if (res.data?.success) optMap[col] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
}
|
||||
try {
|
||||
const res = await apiClient.get(`/table-categories/item_info/division/values`);
|
||||
if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
setCategoryOptions(optMap);
|
||||
|
||||
const priceOpts: Record<string, { code: string; label: string }[]> = {};
|
||||
@@ -413,11 +417,12 @@ export default function SubcontractorManagementPage() {
|
||||
});
|
||||
const allItems = res.data?.data?.data || res.data?.data?.rows || [];
|
||||
const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number));
|
||||
const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T";
|
||||
const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code;
|
||||
setItemSearchResults(allItems.filter((item: any) => {
|
||||
if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false;
|
||||
if (!outsourcingCode) return true;
|
||||
const div = item.division || "";
|
||||
return div.includes(OUTSOURCING_CODE) || div.includes("외주");
|
||||
return div.includes(outsourcingCode);
|
||||
}));
|
||||
} catch { /* skip */ } finally { setItemSearchLoading(false); }
|
||||
};
|
||||
|
||||
@@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [
|
||||
{ key: "item_name", label: "품명" },
|
||||
{ key: "size", label: "규격" },
|
||||
{ key: "unit", label: "단위" },
|
||||
{ key: "standard_price", label: "기준단가" },
|
||||
{ key: "standard_price", label: "구매단가" },
|
||||
{ key: "standard_price", label: "기준단가/구매단가" },
|
||||
{ key: "currency_code", label: "통화" },
|
||||
{ key: "status", label: "상태" },
|
||||
];
|
||||
@@ -150,8 +149,11 @@ export default function PurchaseItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "s" });
|
||||
// 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링
|
||||
const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code;
|
||||
if (purchaseCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: purchaseCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -811,9 +811,10 @@ export default function CustomerManagementPage() {
|
||||
const searchItems = async () => {
|
||||
setItemSearchLoading(true);
|
||||
try {
|
||||
const filters: any[] = [
|
||||
{ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" },
|
||||
];
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
const filters: any[] = salesCode
|
||||
? [{ columnName: "division", operator: "contains", value: salesCode }]
|
||||
: [];
|
||||
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,
|
||||
|
||||
@@ -150,8 +150,11 @@ export default function SalesItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" });
|
||||
// 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
if (salesCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: salesCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -142,7 +142,7 @@ export default function SubcontractorItemPage() {
|
||||
try {
|
||||
const filters: any[] = [];
|
||||
if (outsourcingDivisionCode) {
|
||||
filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode });
|
||||
filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode });
|
||||
}
|
||||
if (searchKeyword) {
|
||||
filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword });
|
||||
|
||||
@@ -141,6 +141,10 @@ export default function SubcontractorManagementPage() {
|
||||
if (res.data?.success) optMap[col] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
}
|
||||
try {
|
||||
const res = await apiClient.get(`/table-categories/item_info/division/values`);
|
||||
if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
setCategoryOptions(optMap);
|
||||
|
||||
const priceOpts: Record<string, { code: string; label: string }[]> = {};
|
||||
@@ -413,11 +417,12 @@ export default function SubcontractorManagementPage() {
|
||||
});
|
||||
const allItems = res.data?.data?.data || res.data?.data?.rows || [];
|
||||
const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number));
|
||||
const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T";
|
||||
const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code;
|
||||
setItemSearchResults(allItems.filter((item: any) => {
|
||||
if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false;
|
||||
if (!outsourcingCode) return true;
|
||||
const div = item.division || "";
|
||||
return div.includes(OUTSOURCING_CODE) || div.includes("외주");
|
||||
return div.includes(outsourcingCode);
|
||||
}));
|
||||
} catch { /* skip */ } finally { setItemSearchLoading(false); }
|
||||
};
|
||||
|
||||
@@ -176,8 +176,7 @@ const ITEM_GRID_COLUMNS = [
|
||||
{ key: "item_name", label: "품명" },
|
||||
{ key: "size", label: "규격" },
|
||||
{ key: "unit", label: "단위" },
|
||||
{ key: "standard_price", label: "기준단가" },
|
||||
{ key: "standard_price", label: "구매단가" },
|
||||
{ key: "standard_price", label: "기준단가/구매단가" },
|
||||
{ key: "currency_code", label: "통화" },
|
||||
{ key: "status", label: "상태" },
|
||||
];
|
||||
@@ -313,8 +312,11 @@ export default function PurchaseItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "s" });
|
||||
// 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링
|
||||
const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code;
|
||||
if (purchaseCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: purchaseCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -811,9 +811,10 @@ export default function CustomerManagementPage() {
|
||||
const searchItems = useCallback(async () => {
|
||||
setItemSearchLoading(true);
|
||||
try {
|
||||
const filters: any[] = [
|
||||
{ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" },
|
||||
];
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
const filters: any[] = salesCode
|
||||
? [{ columnName: "division", operator: "contains", value: salesCode }]
|
||||
: [];
|
||||
const res = await apiClient.post(`/table-management/tables/item_info/data`, {
|
||||
page: 1, size: 500,
|
||||
dataFilter: { enabled: true, filters },
|
||||
|
||||
@@ -311,8 +311,11 @@ export default function SalesItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" });
|
||||
// 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
if (salesCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: salesCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -142,7 +142,7 @@ export default function SubcontractorItemPage() {
|
||||
try {
|
||||
const filters: any[] = [];
|
||||
if (outsourcingDivisionCode) {
|
||||
filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode });
|
||||
filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode });
|
||||
}
|
||||
if (searchKeyword) {
|
||||
filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword });
|
||||
|
||||
@@ -141,6 +141,10 @@ export default function SubcontractorManagementPage() {
|
||||
if (res.data?.success) optMap[col] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
}
|
||||
try {
|
||||
const res = await apiClient.get(`/table-categories/item_info/division/values`);
|
||||
if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
setCategoryOptions(optMap);
|
||||
|
||||
const priceOpts: Record<string, { code: string; label: string }[]> = {};
|
||||
@@ -413,11 +417,12 @@ export default function SubcontractorManagementPage() {
|
||||
});
|
||||
const allItems = res.data?.data?.data || res.data?.data?.rows || [];
|
||||
const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number));
|
||||
const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T";
|
||||
const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code;
|
||||
setItemSearchResults(allItems.filter((item: any) => {
|
||||
if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false;
|
||||
if (!outsourcingCode) return true;
|
||||
const div = item.division || "";
|
||||
return div.includes(OUTSOURCING_CODE) || div.includes("외주");
|
||||
return div.includes(outsourcingCode);
|
||||
}));
|
||||
} catch { /* skip */ } finally { setItemSearchLoading(false); }
|
||||
};
|
||||
|
||||
@@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [
|
||||
{ key: "item_name", label: "품명" },
|
||||
{ key: "size", label: "규격" },
|
||||
{ key: "unit", label: "단위" },
|
||||
{ key: "standard_price", label: "기준단가" },
|
||||
{ key: "standard_price", label: "구매단가" },
|
||||
{ key: "standard_price", label: "기준단가/구매단가" },
|
||||
{ key: "currency_code", label: "통화" },
|
||||
{ key: "status", label: "상태" },
|
||||
];
|
||||
@@ -150,8 +149,11 @@ export default function PurchaseItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "s" });
|
||||
// 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링
|
||||
const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code;
|
||||
if (purchaseCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: purchaseCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -811,9 +811,10 @@ export default function CustomerManagementPage() {
|
||||
const searchItems = async () => {
|
||||
setItemSearchLoading(true);
|
||||
try {
|
||||
const filters: any[] = [
|
||||
{ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" },
|
||||
];
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
const filters: any[] = salesCode
|
||||
? [{ columnName: "division", operator: "contains", value: salesCode }]
|
||||
: [];
|
||||
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,
|
||||
|
||||
@@ -150,8 +150,11 @@ export default function SalesItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" });
|
||||
// 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
if (salesCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: salesCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -142,7 +142,7 @@ export default function SubcontractorItemPage() {
|
||||
try {
|
||||
const filters: any[] = [];
|
||||
if (outsourcingDivisionCode) {
|
||||
filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode });
|
||||
filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode });
|
||||
}
|
||||
if (searchKeyword) {
|
||||
filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword });
|
||||
|
||||
@@ -141,6 +141,10 @@ export default function SubcontractorManagementPage() {
|
||||
if (res.data?.success) optMap[col] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
}
|
||||
try {
|
||||
const res = await apiClient.get(`/table-categories/item_info/division/values`);
|
||||
if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
setCategoryOptions(optMap);
|
||||
|
||||
const priceOpts: Record<string, { code: string; label: string }[]> = {};
|
||||
@@ -413,11 +417,12 @@ export default function SubcontractorManagementPage() {
|
||||
});
|
||||
const allItems = res.data?.data?.data || res.data?.data?.rows || [];
|
||||
const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number));
|
||||
const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T";
|
||||
const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code;
|
||||
setItemSearchResults(allItems.filter((item: any) => {
|
||||
if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false;
|
||||
if (!outsourcingCode) return true;
|
||||
const div = item.division || "";
|
||||
return div.includes(OUTSOURCING_CODE) || div.includes("외주");
|
||||
return div.includes(outsourcingCode);
|
||||
}));
|
||||
} catch { /* skip */ } finally { setItemSearchLoading(false); }
|
||||
};
|
||||
|
||||
@@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [
|
||||
{ key: "item_name", label: "품명" },
|
||||
{ key: "size", label: "규격" },
|
||||
{ key: "unit", label: "단위" },
|
||||
{ key: "standard_price", label: "기준단가" },
|
||||
{ key: "standard_price", label: "구매단가" },
|
||||
{ key: "standard_price", label: "기준단가/구매단가" },
|
||||
{ key: "currency_code", label: "통화" },
|
||||
{ key: "status", label: "상태" },
|
||||
];
|
||||
@@ -150,8 +149,11 @@ export default function PurchaseItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "s" });
|
||||
// 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링
|
||||
const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code;
|
||||
if (purchaseCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: purchaseCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -811,9 +811,10 @@ export default function CustomerManagementPage() {
|
||||
const searchItems = async () => {
|
||||
setItemSearchLoading(true);
|
||||
try {
|
||||
const filters: any[] = [
|
||||
{ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" },
|
||||
];
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
const filters: any[] = salesCode
|
||||
? [{ columnName: "division", operator: "contains", value: salesCode }]
|
||||
: [];
|
||||
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,
|
||||
|
||||
@@ -150,8 +150,11 @@ export default function SalesItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" });
|
||||
// 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
if (salesCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: salesCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -142,7 +142,7 @@ export default function SubcontractorItemPage() {
|
||||
try {
|
||||
const filters: any[] = [];
|
||||
if (outsourcingDivisionCode) {
|
||||
filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode });
|
||||
filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode });
|
||||
}
|
||||
if (searchKeyword) {
|
||||
filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword });
|
||||
|
||||
@@ -141,6 +141,11 @@ export default function SubcontractorManagementPage() {
|
||||
if (res.data?.success) optMap[col] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
}
|
||||
// item_info의 division 카테고리도 로드 (품목 검색 시 외주관리 코드 조회용)
|
||||
try {
|
||||
const res = await apiClient.get(`/table-categories/item_info/division/values`);
|
||||
if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
setCategoryOptions(optMap);
|
||||
|
||||
const priceOpts: Record<string, { code: string; label: string }[]> = {};
|
||||
@@ -413,11 +418,12 @@ export default function SubcontractorManagementPage() {
|
||||
});
|
||||
const allItems = res.data?.data?.data || res.data?.data?.rows || [];
|
||||
const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number));
|
||||
const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T";
|
||||
const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code;
|
||||
setItemSearchResults(allItems.filter((item: any) => {
|
||||
if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false;
|
||||
if (!outsourcingCode) return true; // 카테고리 미로드 시 전체 표시
|
||||
const div = item.division || "";
|
||||
return div.includes(OUTSOURCING_CODE) || div.includes("외주");
|
||||
return div.includes(outsourcingCode);
|
||||
}));
|
||||
} catch { /* skip */ } finally { setItemSearchLoading(false); }
|
||||
};
|
||||
|
||||
@@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [
|
||||
{ key: "item_name", label: "품명" },
|
||||
{ key: "size", label: "규격" },
|
||||
{ key: "unit", label: "단위" },
|
||||
{ key: "standard_price", label: "기준단가" },
|
||||
{ key: "standard_price", label: "구매단가" },
|
||||
{ key: "standard_price", label: "기준단가/구매단가" },
|
||||
{ key: "currency_code", label: "통화" },
|
||||
{ key: "status", label: "상태" },
|
||||
];
|
||||
@@ -150,8 +149,11 @@ export default function PurchaseItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "s" });
|
||||
// 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링
|
||||
const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code;
|
||||
if (purchaseCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: purchaseCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -811,9 +811,10 @@ export default function CustomerManagementPage() {
|
||||
const searchItems = async () => {
|
||||
setItemSearchLoading(true);
|
||||
try {
|
||||
const filters: any[] = [
|
||||
{ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" },
|
||||
];
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
const filters: any[] = salesCode
|
||||
? [{ columnName: "division", operator: "contains", value: salesCode }]
|
||||
: [];
|
||||
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,
|
||||
|
||||
@@ -150,8 +150,11 @@ export default function SalesItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" });
|
||||
// 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
if (salesCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: salesCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -142,7 +142,7 @@ export default function SubcontractorItemPage() {
|
||||
try {
|
||||
const filters: any[] = [];
|
||||
if (outsourcingDivisionCode) {
|
||||
filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode });
|
||||
filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode });
|
||||
}
|
||||
if (searchKeyword) {
|
||||
filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword });
|
||||
|
||||
@@ -141,6 +141,11 @@ export default function SubcontractorManagementPage() {
|
||||
if (res.data?.success) optMap[col] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
}
|
||||
// item_info의 division 카테고리도 로드 (품목 검색 시 외주관리 코드 조회용)
|
||||
try {
|
||||
const res = await apiClient.get(`/table-categories/item_info/division/values`);
|
||||
if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
setCategoryOptions(optMap);
|
||||
|
||||
const priceOpts: Record<string, { code: string; label: string }[]> = {};
|
||||
@@ -413,11 +418,12 @@ export default function SubcontractorManagementPage() {
|
||||
});
|
||||
const allItems = res.data?.data?.data || res.data?.data?.rows || [];
|
||||
const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number));
|
||||
const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T";
|
||||
const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code;
|
||||
setItemSearchResults(allItems.filter((item: any) => {
|
||||
if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false;
|
||||
if (!outsourcingCode) return true;
|
||||
const div = item.division || "";
|
||||
return div.includes(OUTSOURCING_CODE) || div.includes("외주");
|
||||
return div.includes(outsourcingCode);
|
||||
}));
|
||||
} catch { /* skip */ } finally { setItemSearchLoading(false); }
|
||||
};
|
||||
|
||||
@@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [
|
||||
{ key: "item_name", label: "품명" },
|
||||
{ key: "size", label: "규격" },
|
||||
{ key: "unit", label: "단위" },
|
||||
{ key: "standard_price", label: "기준단가" },
|
||||
{ key: "standard_price", label: "구매단가" },
|
||||
{ key: "standard_price", label: "기준단가/구매단가" },
|
||||
{ key: "currency_code", label: "통화" },
|
||||
{ key: "status", label: "상태" },
|
||||
];
|
||||
@@ -150,8 +149,11 @@ export default function PurchaseItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "s" });
|
||||
// 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링
|
||||
const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code;
|
||||
if (purchaseCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: purchaseCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -811,9 +811,10 @@ export default function CustomerManagementPage() {
|
||||
const searchItems = async () => {
|
||||
setItemSearchLoading(true);
|
||||
try {
|
||||
const filters: any[] = [
|
||||
{ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" },
|
||||
];
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
const filters: any[] = salesCode
|
||||
? [{ columnName: "division", operator: "contains", value: salesCode }]
|
||||
: [];
|
||||
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,
|
||||
|
||||
@@ -150,8 +150,11 @@ export default function SalesItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" });
|
||||
// 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
if (salesCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: salesCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -142,7 +142,7 @@ export default function SubcontractorItemPage() {
|
||||
try {
|
||||
const filters: any[] = [];
|
||||
if (outsourcingDivisionCode) {
|
||||
filters.push({ columnName: "division", operator: "equals", value: outsourcingDivisionCode });
|
||||
filters.push({ columnName: "division", operator: "contains", value: outsourcingDivisionCode });
|
||||
}
|
||||
if (searchKeyword) {
|
||||
filters.push({ columnName: "item_name", operator: "contains", value: searchKeyword });
|
||||
|
||||
@@ -141,6 +141,10 @@ export default function SubcontractorManagementPage() {
|
||||
if (res.data?.success) optMap[col] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
}
|
||||
try {
|
||||
const res = await apiClient.get(`/table-categories/item_info/division/values`);
|
||||
if (res.data?.success) optMap["item_division"] = flatten(res.data.data || []);
|
||||
} catch { /* skip */ }
|
||||
setCategoryOptions(optMap);
|
||||
|
||||
const priceOpts: Record<string, { code: string; label: string }[]> = {};
|
||||
@@ -413,11 +417,12 @@ export default function SubcontractorManagementPage() {
|
||||
});
|
||||
const allItems = res.data?.data?.data || res.data?.data?.rows || [];
|
||||
const existingItemIds = new Set(priceItems.map((p: any) => p.item_id || p.item_number));
|
||||
const OUTSOURCING_CODE = "CAT_MMDJB7R4_TO3T";
|
||||
const outsourcingCode = categoryOptions["item_division"]?.find((o) => o.label === "외주관리")?.code;
|
||||
setItemSearchResults(allItems.filter((item: any) => {
|
||||
if (existingItemIds.has(item.item_number) || existingItemIds.has(item.id)) return false;
|
||||
if (!outsourcingCode) return true;
|
||||
const div = item.division || "";
|
||||
return div.includes(OUTSOURCING_CODE) || div.includes("외주");
|
||||
return div.includes(outsourcingCode);
|
||||
}));
|
||||
} catch { /* skip */ } finally { setItemSearchLoading(false); }
|
||||
};
|
||||
|
||||
@@ -48,8 +48,7 @@ const ITEM_GRID_COLUMNS = [
|
||||
{ key: "item_name", label: "품명" },
|
||||
{ key: "size", label: "규격" },
|
||||
{ key: "unit", label: "단위" },
|
||||
{ key: "standard_price", label: "기준단가" },
|
||||
{ key: "standard_price", label: "구매단가" },
|
||||
{ key: "standard_price", label: "기준단가/구매단가" },
|
||||
{ key: "currency_code", label: "통화" },
|
||||
{ key: "status", label: "상태" },
|
||||
];
|
||||
@@ -150,8 +149,11 @@ export default function PurchaseItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 구매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "s" });
|
||||
// 구매관리 division 필터: 카테고리에서 "구매관리" 라벨의 코드를 찾아서 필터링
|
||||
const purchaseCode = categoryOptions["division"]?.find((o) => o.label === "구매관리")?.code;
|
||||
if (purchaseCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: purchaseCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
@@ -811,9 +811,10 @@ export default function CustomerManagementPage() {
|
||||
const searchItems = async () => {
|
||||
setItemSearchLoading(true);
|
||||
try {
|
||||
const filters: any[] = [
|
||||
{ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" },
|
||||
];
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
const filters: any[] = salesCode
|
||||
? [{ columnName: "division", operator: "contains", value: salesCode }]
|
||||
: [];
|
||||
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,
|
||||
|
||||
@@ -150,8 +150,11 @@ export default function SalesItemPage() {
|
||||
try {
|
||||
const filters: { columnName: string; operator: string; value: any }[] = [];
|
||||
|
||||
// 판매품목/영업관리 division 필터 (다중값 컬럼이므로 contains로 매칭)
|
||||
filters.push({ columnName: "division", operator: "contains", value: "CAT_ML8ZFVEL_1TOR" });
|
||||
// 영업관리 division 필터: 카테고리에서 "영업관리" 라벨의 코드를 찾아서 필터링
|
||||
const salesCode = categoryOptions["division"]?.find((o) => o.label === "영업관리")?.code;
|
||||
if (salesCode) {
|
||||
filters.push({ columnName: "division", operator: "contains", value: salesCode });
|
||||
}
|
||||
|
||||
// DynamicSearchFilter에서 전달된 필터 추가
|
||||
for (const f of searchFilters) {
|
||||
|
||||
Reference in New Issue
Block a user