:Qrge branch 'jskim-node' of http://39.117.244.52:3000/kjs/ERP-node into jskim-node

This commit is contained in:
kmh
2026-03-10 16:16:52 +09:00
parent 5abce62d89
commit 6d2cdc1782
8 changed files with 267 additions and 143 deletions

View File

@@ -1341,56 +1341,79 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
const getLeftColumnUniqueValues = useCallback(
async (columnName: string) => {
const leftTableName = componentConfig.leftPanel?.tableName;
if (!leftTableName || leftData.length === 0) return [];
if (!leftTableName) return [];
// 현재 로드된 데이터에서 고유값 추출
const uniqueValues = new Set<string>();
// 1단계: 카테고리 API 시도 (DB에서 라벨 조회)
try {
const { apiClient } = await import("@/lib/api/client");
const response = await apiClient.get(`/table-categories/${leftTableName}/${columnName}/values`);
if (response.data.success && response.data.data && response.data.data.length > 0) {
return response.data.data.map((item: any) => ({
value: item.valueCode,
label: item.valueLabel,
}));
}
} catch {
// 카테고리 API 실패 시 다음 단계로
}
// 2단계: DISTINCT API (백엔드 라벨 변환 포함)
try {
const { apiClient } = await import("@/lib/api/client");
const response = await apiClient.get(`/entity/${leftTableName}/distinct/${columnName}`);
if (response.data.success && response.data.data && response.data.data.length > 0) {
return response.data.data.map((item: any) => ({
value: String(item.value),
label: String(item.label),
}));
}
} catch {
// DISTINCT API 실패 시 다음 단계로
}
// 3단계: 로컬 데이터에서 고유값 추출 (최종 fallback)
if (leftData.length === 0) return [];
const uniqueValuesMap = new Map<string, string>();
leftData.forEach((item) => {
// 🆕 조인 컬럼 처리 (item_info.standard → item_code_standard 또는 item_id_standard)
let value: any;
if (columnName.includes(".")) {
// 조인 컬럼: getEntityJoinValue와 동일한 로직 적용
const [refTable, fieldName] = columnName.split(".");
const inferredSourceColumn = refTable.replace("_info", "_code").replace("_mng", "_id");
// 정확한 키로 먼저 시도
const exactKey = `${inferredSourceColumn}_${fieldName}`;
value = item[exactKey];
// 🆕 item_id 패턴 시도
if (value === undefined) {
const idPatternKey = `${refTable.replace("_info", "_id").replace("_mng", "_id")}_${fieldName}`;
value = item[idPatternKey];
}
// 기본 별칭 패턴 시도 (item_code_name 또는 item_id_name)
if (value === undefined && (fieldName === "item_name" || fieldName === "name")) {
const aliasKey = `${inferredSourceColumn}_name`;
value = item[aliasKey];
// item_id_name 패턴도 시도
if (value === undefined) {
const idAliasKey = `${refTable.replace("_info", "_id").replace("_mng", "_id")}_name`;
value = item[idAliasKey];
}
}
} else {
// 일반 컬럼
value = item[columnName];
}
if (value !== null && value !== undefined && value !== "") {
// _name 필드 우선 사용 (category/entity type)
const displayValue = item[`${columnName}_name`] || value;
uniqueValues.add(String(displayValue));
const strValue = String(value);
const nameField = item[`${columnName}_name`];
const label = nameField || strValue;
uniqueValuesMap.set(strValue, label);
}
});
return Array.from(uniqueValues).map((value) => ({
value: value,
label: value,
}));
return Array.from(uniqueValuesMap.entries())
.map(([value, label]) => ({ value, label }))
.sort((a, b) => a.label.localeCompare(b.label));
},
[componentConfig.leftPanel?.tableName, leftData],
);