ERP-node/frontend/lib/api/codeManagement.ts

176 lines
5.4 KiB
TypeScript

/**
* 코드 관리 API
*/
import { apiClient } from "./client";
export interface CodeItem {
code: string;
name: string;
description?: string;
orderNo?: number;
useYn: string;
}
export interface CodeCategory {
categoryCode: string;
categoryName: string;
description?: string;
useYn: string;
}
/**
* 코드 카테고리 목록 조회
*/
export const getCodeCategories = async (): Promise<CodeCategory[]> => {
try {
// 올바른 API 엔드포인트 사용 (apiClient 사용)
const response = await apiClient.get("/common-codes/categories");
const data = response.data;
// 응답 데이터 구조에 맞게 변환
const categories = data.data || [];
return categories.map((category: any) => ({
categoryCode: category.categoryCode,
categoryName: category.categoryName,
description: category.description,
useYn: category.isActive ? "Y" : "N",
}));
} catch (error) {
console.error("코드 카테고리 조회 실패:", error);
// API 호출 실패 시 빈 배열 반환
console.warn("코드 카테고리 API 호출 실패 - 빈 배열 반환");
return [];
}
};
/**
* 특정 카테고리의 코드 목록 조회
*/
export const getCodesByCategory = async (categoryCode: string): Promise<CodeItem[]> => {
try {
// API URL 디버깅
const apiUrl = `/common-codes/categories/${encodeURIComponent(categoryCode)}/codes`;
console.log("🔗 코드 API 호출 URL:", {
categoryCode,
apiUrl,
currentURL: typeof window !== "undefined" ? window.location.href : "서버사이드",
baseURL: typeof window !== "undefined" ? `${window.location.protocol}//${window.location.host}` : "서버사이드",
apiClientBaseURL: apiClient.defaults.baseURL,
});
console.log("📡 실제 요청 URL:", `${apiClient.defaults.baseURL}${apiUrl}`);
// 올바른 API 엔드포인트 사용 (apiClient 사용)
const response = await apiClient.get(apiUrl);
const data = response.data;
console.log("🔍 백엔드 응답 데이터:", {
fullResponse: data,
dataArray: data.data,
firstItem: data.data && data.data[0] ? data.data[0] : "없음",
dataType: typeof data.data,
isArray: Array.isArray(data.data),
});
// 응답 데이터 구조에 맞게 변환
const codes = data.data || [];
const mappedCodes = codes.map((code: any) => {
console.log("🔄 코드 매핑:", {
original: code,
mapped: {
code: code.codeValue || code.code || code.id || code.value,
name: code.codeName || code.name || code.label || code.description,
description: code.description || code.codeName || code.name,
orderNo: code.sortOrder || code.orderNo || code.order,
useYn: code.isActive ? "Y" : code.useYn || "Y",
},
});
return {
code: code.codeValue || code.code || code.id || code.value,
name: code.codeName || code.name || code.label || code.description,
description: code.description || code.codeName || code.name,
orderNo: code.sortOrder || code.orderNo || code.order,
useYn: code.isActive ? "Y" : code.useYn || "Y",
};
});
console.log("📋 최종 매핑된 코드들:", mappedCodes);
return mappedCodes;
} catch (error: any) {
console.error("코드 목록 조회 실패:", error);
// 인증 오류인 경우 명시적으로 알림
if (error.response?.status === 401) {
console.warn("🔐 인증이 필요합니다. 로그인 후 다시 시도하세요.");
} else if (error.response?.status === 404) {
console.warn(`📭 코드 카테고리 '${categoryCode}'가 존재하지 않습니다.`);
} else {
console.warn(`❌ 코드 카테고리 '${categoryCode}'에 대한 API 호출 실패:`, error.message);
}
return [];
}
};
/**
* 컬럼의 웹타입과 코드 카테고리 정보 기반으로 코드 조회
*/
export const getCodesForColumn = async (
columnName: string,
webType?: string,
codeCategory?: string,
): Promise<CodeItem[]> => {
// 코드 타입이 아니면 빈 배열 반환
if (webType !== "code" && !codeCategory) {
return [];
}
// 코드 카테고리가 있으면 해당 카테고리의 코드 조회
if (codeCategory) {
return await getCodesByCategory(codeCategory);
}
// 컬럼명에서 코드 카테고리 추론 (예: status_code -> STATUS)
const inferredCategory = inferCodeCategoryFromColumnName(columnName);
if (inferredCategory) {
return await getCodesByCategory(inferredCategory);
}
return [];
};
/**
* 컬럼명에서 코드 카테고리 추론
*/
const inferCodeCategoryFromColumnName = (columnName: string): string | null => {
const lowerName = columnName.toLowerCase();
// 일반적인 패턴들
const patterns = [
{ pattern: /status/i, category: "STATUS" },
{ pattern: /state/i, category: "STATE" },
{ pattern: /type/i, category: "TYPE" },
{ pattern: /category/i, category: "CATEGORY" },
{ pattern: /grade/i, category: "GRADE" },
{ pattern: /level/i, category: "LEVEL" },
{ pattern: /priority/i, category: "PRIORITY" },
{ pattern: /role/i, category: "ROLE" },
];
for (const { pattern, category } of patterns) {
if (pattern.test(lowerName)) {
return category;
}
}
return null;
};
/**
* 실제 데이터베이스에 있는 코드 카테고리만 사용
* Mock 데이터는 더 이상 사용하지 않음
*/