테이블 추가기능 수정사항

This commit is contained in:
kjs
2025-09-23 10:40:21 +09:00
parent 474cc33aee
commit e653effac0
19 changed files with 1931 additions and 201 deletions

View File

@@ -329,7 +329,7 @@ export class TableManagementService {
},
update: {
column_label: settings.columnLabel,
web_type: settings.webType,
input_type: settings.inputType,
detail_settings: settings.detailSettings,
code_category: settings.codeCategory,
code_value: settings.codeValue,
@@ -345,7 +345,7 @@ export class TableManagementService {
table_name: tableName,
column_name: columnName,
column_label: settings.columnLabel,
web_type: settings.webType,
input_type: settings.inputType,
detail_settings: settings.detailSettings,
code_category: settings.codeCategory,
code_value: settings.codeValue,
@@ -626,7 +626,123 @@ export class TableManagementService {
}
/**
* 웹 타입별 기본 상세 설정 생성
* 컬럼 입력 타입 설정 (새로운 시스템)
*/
async updateColumnInputType(
tableName: string,
columnName: string,
inputType: string,
detailSettings?: Record<string, any>
): Promise<void> {
try {
logger.info(
`컬럼 입력 타입 설정 시작: ${tableName}.${columnName} = ${inputType}`
);
// 입력 타입별 기본 상세 설정 생성
const defaultDetailSettings =
this.generateDefaultInputTypeSettings(inputType);
// 사용자 정의 설정과 기본 설정 병합
const finalDetailSettings = {
...defaultDetailSettings,
...detailSettings,
};
// table_type_columns 테이블에서 업데이트
await prisma.$executeRaw`
INSERT INTO table_type_columns (
table_name, column_name, input_type, detail_settings,
is_nullable, display_order, created_date, updated_date
) VALUES (
${tableName}, ${columnName}, ${inputType}, ${JSON.stringify(finalDetailSettings)},
'Y', 0, now(), now()
)
ON CONFLICT (table_name, column_name)
DO UPDATE SET
input_type = ${inputType},
detail_settings = ${JSON.stringify(finalDetailSettings)},
updated_date = now();
`;
logger.info(
`컬럼 입력 타입 설정 완료: ${tableName}.${columnName} = ${inputType}`
);
} catch (error) {
logger.error(
`컬럼 입력 타입 설정 실패: ${tableName}.${columnName}`,
error
);
throw new Error(
`컬럼 입력 타입 설정 실패: ${error instanceof Error ? error.message : "Unknown error"}`
);
}
}
/**
* 입력 타입별 기본 상세 설정 생성
*/
private generateDefaultInputTypeSettings(
inputType: string
): Record<string, any> {
switch (inputType) {
case "text":
return {
maxLength: 500,
placeholder: "텍스트를 입력하세요",
};
case "number":
return {
min: 0,
step: 1,
placeholder: "숫자를 입력하세요",
};
case "date":
return {
format: "YYYY-MM-DD",
placeholder: "날짜를 선택하세요",
};
case "code":
return {
placeholder: "코드를 선택하세요",
searchable: true,
};
case "entity":
return {
placeholder: "항목을 선택하세요",
searchable: true,
};
case "select":
return {
placeholder: "선택하세요",
searchable: false,
};
case "checkbox":
return {
defaultChecked: false,
trueValue: "Y",
falseValue: "N",
};
case "radio":
return {
inline: false,
};
default:
return {};
}
}
/**
* 웹 타입별 기본 상세 설정 생성 (레거시 지원)
* @deprecated generateDefaultInputTypeSettings 사용 권장
*/
private generateDefaultDetailSettings(webType: string): Record<string, any> {
switch (webType) {
@@ -2363,22 +2479,21 @@ export class TableManagementService {
}
/**
* 컬럼 타입 정보 조회 (화면관리 연동용)
* 컬럼 입력타입 정보 조회 (화면관리 연동용)
*/
async getColumnWebTypes(tableName: string): Promise<ColumnTypeInfo[]> {
async getColumnInputTypes(tableName: string): Promise<ColumnTypeInfo[]> {
try {
logger.info(`컬럼 타입 정보 조회: ${tableName}`);
logger.info(`컬럼 입력타입 정보 조회: ${tableName}`);
// table_type_columns에서 타입 정보 조회
const rawWebTypes = await prisma.$queryRaw<any[]>`
// table_type_columns에서 입력타입 정보 조회
const rawInputTypes = await prisma.$queryRaw<any[]>`
SELECT
ttc.column_name as "columnName",
ttc.column_name as "displayName",
COALESCE(ttc.web_type, 'text') as "webType",
COALESCE(ttc.input_type, 'text') as "inputType",
COALESCE(ttc.detail_settings, '{}') as "detailSettings",
ttc.is_nullable as "isNullable",
ic.data_type as "dataType",
ic.udt_name as "dbType"
ic.data_type as "dataType"
FROM table_type_columns ttc
LEFT JOIN information_schema.columns ic
ON ttc.table_name = ic.table_name AND ttc.column_name = ic.column_name
@@ -2386,14 +2501,12 @@ export class TableManagementService {
ORDER BY ttc.display_order, ttc.column_name
`;
const webTypes: ColumnTypeInfo[] = rawWebTypes.map((col) => ({
const inputTypes: ColumnTypeInfo[] = rawInputTypes.map((col) => ({
tableName: tableName,
columnName: col.columnName,
displayName: col.displayName,
dataType: col.dataType || "text",
dbType: col.dbType || "text",
webType: col.webType,
inputType: "direct",
dataType: col.dataType || "varchar",
inputType: col.inputType,
detailSettings: col.detailSettings,
description: "", // 필수 필드 추가
isNullable: col.isNullable,
@@ -2403,15 +2516,26 @@ export class TableManagementService {
}));
logger.info(
`컬럼 타입 정보 조회 완료: ${tableName}, ${webTypes.length}개 컬럼`
`컬럼 입력타입 정보 조회 완료: ${tableName}, ${inputTypes.length}개 컬럼`
);
return webTypes;
return inputTypes;
} catch (error) {
logger.error(`컬럼 타입 정보 조회 실패: ${tableName}`, error);
logger.error(`컬럼 입력타입 정보 조회 실패: ${tableName}`, error);
throw error;
}
}
/**
* 레거시 지원: 컬럼 웹타입 정보 조회
* @deprecated getColumnInputTypes 사용 권장
*/
async getColumnWebTypes(tableName: string): Promise<ColumnTypeInfo[]> {
logger.warn(
`레거시 메서드 사용: getColumnWebTypes → getColumnInputTypes 사용 권장`
);
return this.getColumnInputTypes(tableName);
}
/**
* 데이터베이스 연결 상태 확인
*/