- Modified the addCategoryValue function to allow menuObjid to be optional, accommodating scenarios where it may not be provided, such as in global management screens. - Adjusted related service and controller logic to handle the absence of menuObjid gracefully, ensuring that the application remains robust and user-friendly. - Enhanced the frontend components to reflect these changes, improving the overall user experience when adding category values across multiple companies.
332 lines
9.1 KiB
TypeScript
332 lines
9.1 KiB
TypeScript
import { apiClient } from "./client";
|
|
import {
|
|
TableCategoryValue,
|
|
CategoryColumn,
|
|
} from "@/types/tableCategoryValue";
|
|
|
|
/**
|
|
* 테이블의 카테고리 컬럼 목록 조회
|
|
*/
|
|
export async function getCategoryColumns(tableName: string) {
|
|
try {
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: CategoryColumn[];
|
|
}>(`/table-categories/${tableName}/columns`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 컬럼 조회 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 메뉴별 카테고리 컬럼 목록 조회
|
|
*
|
|
* @param menuObjid 메뉴 OBJID
|
|
* @returns 해당 메뉴와 상위 메뉴들이 설정한 모든 카테고리 컬럼
|
|
*/
|
|
export async function getCategoryColumnsByMenu(menuObjid: number) {
|
|
try {
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: CategoryColumn[];
|
|
}>(`/table-management/menu/${menuObjid}/category-columns`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("메뉴별 카테고리 컬럼 조회 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 목록 조회 (메뉴 스코프)
|
|
*
|
|
* @param tableName 테이블명
|
|
* @param columnName 컬럼명
|
|
* @param includeInactive 비활성 값 포함 여부
|
|
* @param menuObjid 메뉴 OBJID (선택사항, 제공 시 형제 메뉴의 카테고리 값 포함)
|
|
*/
|
|
export async function getCategoryValues(
|
|
tableName: string,
|
|
columnName: string,
|
|
includeInactive: boolean = false,
|
|
menuObjid?: number
|
|
) {
|
|
try {
|
|
const params: any = { includeInactive };
|
|
if (menuObjid) {
|
|
params.menuObjid = menuObjid;
|
|
}
|
|
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: TableCategoryValue[];
|
|
}>(`/table-categories/${tableName}/${columnName}/values`, {
|
|
params,
|
|
});
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 조회 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 추가 (메뉴 스코프)
|
|
*
|
|
* @param value 카테고리 값 정보
|
|
* @param menuObjid 메뉴 OBJID (필수)
|
|
*/
|
|
export async function addCategoryValue(
|
|
value: TableCategoryValue,
|
|
menuObjid?: number
|
|
) {
|
|
try {
|
|
const response = await apiClient.post<{
|
|
success: boolean;
|
|
data: TableCategoryValue;
|
|
}>("/table-categories/values", {
|
|
...value,
|
|
menuObjid: menuObjid || undefined,
|
|
});
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 추가 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 수정
|
|
*/
|
|
export async function updateCategoryValue(
|
|
valueId: number,
|
|
updates: Partial<TableCategoryValue>
|
|
) {
|
|
try {
|
|
const response = await apiClient.put<{
|
|
success: boolean;
|
|
data: TableCategoryValue;
|
|
}>(`/table-categories/values/${valueId}`, updates);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 수정 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 삭제
|
|
*/
|
|
export async function deleteCategoryValue(valueId: number) {
|
|
try {
|
|
const response = await apiClient.delete<{
|
|
success: boolean;
|
|
message: string;
|
|
}>(`/table-categories/values/${valueId}`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 삭제 실패:", error);
|
|
|
|
// 백엔드에서 반환한 에러 메시지 전달
|
|
const errorMessage = error.response?.data?.message || error.message;
|
|
return { success: false, error: errorMessage, message: errorMessage };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 일괄 삭제
|
|
*/
|
|
export async function bulkDeleteCategoryValues(valueIds: number[]) {
|
|
try {
|
|
const response = await apiClient.post<{
|
|
success: boolean;
|
|
message: string;
|
|
}>("/table-categories/values/bulk-delete", { valueIds });
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 일괄 삭제 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 순서 변경
|
|
*/
|
|
export async function reorderCategoryValues(orderedValueIds: number[]) {
|
|
try {
|
|
const response = await apiClient.post<{
|
|
success: boolean;
|
|
message: string;
|
|
}>("/table-categories/values/reorder", { orderedValueIds });
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 순서 변경 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 코드로 라벨 조회
|
|
*
|
|
* @param valueCodes - 카테고리 코드 배열 (예: ["CATEGORY_767659DCUF", "CATEGORY_8292565608"])
|
|
* @returns { [code]: label } 형태의 매핑 객체
|
|
*/
|
|
export async function getCategoryLabelsByCodes(valueCodes: string[]) {
|
|
try {
|
|
if (!valueCodes || valueCodes.length === 0) {
|
|
return { success: true, data: {} };
|
|
}
|
|
|
|
const response = await apiClient.post<{
|
|
success: boolean;
|
|
data: Record<string, string>;
|
|
}>("/table-categories/labels-by-codes", { valueCodes });
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 라벨 조회 실패:", error);
|
|
return { success: false, error: error.message, data: {} };
|
|
}
|
|
}
|
|
|
|
// ================================================
|
|
// 컬럼 매핑 관련 API (논리명 ↔ 물리명)
|
|
// ================================================
|
|
|
|
/**
|
|
* 컬럼 매핑 조회
|
|
*
|
|
* @param tableName - 테이블명
|
|
* @param menuObjid - 메뉴 OBJID
|
|
* @returns { logical_column: physical_column } 형태의 매핑 객체
|
|
*/
|
|
export async function getColumnMapping(tableName: string, menuObjid: number) {
|
|
try {
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: Record<string, string>;
|
|
}>(`/table-categories/column-mapping/${tableName}/${menuObjid}`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("컬럼 매핑 조회 실패:", error);
|
|
return { success: false, error: error.message, data: {} };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 논리적 컬럼 목록 조회
|
|
*
|
|
* @param tableName - 테이블명
|
|
* @param menuObjid - 메뉴 OBJID
|
|
* @returns 논리적 컬럼 목록
|
|
*/
|
|
export async function getLogicalColumns(tableName: string, menuObjid: number) {
|
|
try {
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: Array<{
|
|
mappingId: number;
|
|
logicalColumnName: string;
|
|
physicalColumnName: string;
|
|
description?: string;
|
|
}>;
|
|
}>(`/table-categories/logical-columns/${tableName}/${menuObjid}`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("논리적 컬럼 목록 조회 실패:", error);
|
|
return { success: false, error: error.message, data: [] };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 컬럼 매핑 생성/수정
|
|
*
|
|
* @param data - 컬럼 매핑 정보
|
|
*/
|
|
export async function createColumnMapping(data: {
|
|
tableName: string;
|
|
logicalColumnName: string;
|
|
physicalColumnName: string;
|
|
menuObjid: number;
|
|
description?: string;
|
|
}) {
|
|
try {
|
|
const response = await apiClient.post<{
|
|
success: boolean;
|
|
data: any;
|
|
message: string;
|
|
}>("/table-categories/column-mapping", data);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("컬럼 매핑 생성 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 컬럼 매핑 삭제
|
|
*
|
|
* @param mappingId - 매핑 ID
|
|
*/
|
|
export async function deleteColumnMapping(mappingId: number) {
|
|
try {
|
|
const response = await apiClient.delete<{
|
|
success: boolean;
|
|
message: string;
|
|
}>(`/table-categories/column-mapping/${mappingId}`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("컬럼 매핑 삭제 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 테이블+컬럼 기준으로 모든 매핑 삭제
|
|
*
|
|
* 메뉴 선택 변경 시 기존 매핑을 모두 삭제하고 새로운 매핑만 추가하기 위해 사용
|
|
*
|
|
* @param tableName - 테이블명
|
|
* @param columnName - 컬럼명
|
|
*/
|
|
export async function deleteColumnMappingsByColumn(tableName: string, columnName: string) {
|
|
try {
|
|
const response = await apiClient.delete<{
|
|
success: boolean;
|
|
message: string;
|
|
deletedCount: number;
|
|
}>(`/table-categories/column-mapping/${tableName}/${columnName}/all`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("테이블+컬럼 기준 매핑 삭제 실패:", error);
|
|
return { success: false, error: error.message, deletedCount: 0 };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 2레벨 메뉴 목록 조회
|
|
*
|
|
* 카테고리 컬럼 매핑 생성 시 메뉴 선택용
|
|
*
|
|
* @returns 2레벨 메뉴 목록
|
|
*/
|
|
export async function getSecondLevelMenus() {
|
|
try {
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: Array<{
|
|
menuObjid: number;
|
|
menuName: string;
|
|
parentMenuName: string;
|
|
screenCode?: string;
|
|
}>;
|
|
}>("/table-categories/second-level-menus");
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("2레벨 메뉴 목록 조회 실패:", error);
|
|
return { success: false, error: error.message, data: [] };
|
|
}
|
|
}
|
|
|