Merge branch 'main' of https://g.wace.me/jskim/vexplor_dev
Some checks failed
Build and Push Images / build-and-push (push) Failing after 1m35s

This commit is contained in:
SeongHyun Kim
2026-04-10 18:49:34 +09:00
35 changed files with 163 additions and 84 deletions

View File

@@ -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 });

View File

@@ -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); }
};

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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 });

View File

@@ -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); }
};

View File

@@ -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) {

View File

@@ -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 },

View File

@@ -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) {

View File

@@ -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 });

View File

@@ -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); }
};

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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 });

View File

@@ -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); }
};

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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 });

View File

@@ -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); }
};

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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 });

View File

@@ -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); }
};

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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 });

View File

@@ -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); }
};

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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) {