다국어 생성후 매핑 자동저장
This commit is contained in:
@@ -1475,14 +1475,115 @@ export class MultiLangService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 화면 그룹 경로 조회 (screen_groups에서 계층 구조 조회)
|
||||
* @param screenId 화면 ID
|
||||
* @returns 그룹 경로 배열 (최상위 → 현재 그룹 순서)
|
||||
*/
|
||||
async getScreenGroupPath(screenId: number): Promise<string[]> {
|
||||
try {
|
||||
// 화면이 속한 그룹 조회
|
||||
const screenGroup = await queryOne<{ group_id: number }>(
|
||||
`SELECT group_id FROM screen_group_screens WHERE screen_id = $1 LIMIT 1`,
|
||||
[screenId]
|
||||
);
|
||||
|
||||
if (!screenGroup) {
|
||||
logger.info("화면이 그룹에 속하지 않음", { screenId });
|
||||
return [];
|
||||
}
|
||||
|
||||
// 그룹의 계층 구조 경로 조회 (최상위 → 현재 그룹 순서)
|
||||
const groups = await query<{ group_name: string; group_level: number }>(
|
||||
`WITH RECURSIVE group_path AS (
|
||||
SELECT id, parent_group_id, group_name, group_level, 1 as depth
|
||||
FROM screen_groups
|
||||
WHERE id = $1
|
||||
UNION ALL
|
||||
SELECT g.id, g.parent_group_id, g.group_name, g.group_level, gp.depth + 1
|
||||
FROM screen_groups g
|
||||
INNER JOIN group_path gp ON g.id = gp.parent_group_id
|
||||
WHERE g.parent_group_id IS NOT NULL
|
||||
)
|
||||
SELECT group_name, group_level FROM group_path
|
||||
ORDER BY depth DESC`,
|
||||
[screenGroup.group_id]
|
||||
);
|
||||
|
||||
return groups.map((g) => g.group_name);
|
||||
} catch (error) {
|
||||
logger.error("화면 그룹 경로 조회 실패:", error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 화면 그룹 기반 카테고리 확인 또는 생성
|
||||
* @param companyCode 회사 코드
|
||||
* @param companyName 회사 이름
|
||||
* @param groupPath 그룹 경로 (상위 → 하위 순서)
|
||||
* @returns 최종 카테고리 ID
|
||||
*/
|
||||
async ensureScreenGroupCategory(
|
||||
companyCode: string,
|
||||
companyName: string,
|
||||
groupPath: string[]
|
||||
): Promise<number> {
|
||||
try {
|
||||
if (groupPath.length === 0) {
|
||||
// 그룹이 없으면 회사 카테고리만 반환
|
||||
return await this.ensureCompanyCategory(companyCode, companyName);
|
||||
}
|
||||
|
||||
let parentId = await this.ensureCompanyCategory(companyCode, companyName);
|
||||
let currentLevel = 3; // SCREEN(1) > Company(2) > Group(3)
|
||||
|
||||
for (const groupName of groupPath) {
|
||||
// 현재 그룹 카테고리 확인
|
||||
const existing = await queryOne<{ category_id: number }>(
|
||||
`SELECT category_id FROM multi_lang_category
|
||||
WHERE category_name = $1 AND parent_id = $2`,
|
||||
[groupName, parentId]
|
||||
);
|
||||
|
||||
if (existing) {
|
||||
parentId = existing.category_id;
|
||||
} else {
|
||||
// 그룹 카테고리 생성
|
||||
const groupCode = `${companyCode}_GROUP_${groupName}`.replace(/\s+/g, "_");
|
||||
const keyPrefix = groupName.toLowerCase().replace(/\s+/g, "_");
|
||||
|
||||
const result = await queryOne<{ category_id: number }>(
|
||||
`INSERT INTO multi_lang_category
|
||||
(category_code, category_name, parent_id, level, key_prefix, description, sort_order, is_active, created_date)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, 0, 'Y', NOW())
|
||||
RETURNING category_id`,
|
||||
[groupCode, groupName, parentId, currentLevel, keyPrefix, `${groupName} 화면 그룹의 다국어`]
|
||||
);
|
||||
|
||||
logger.info("화면 그룹 카테고리 생성", { groupName, categoryId: result?.category_id });
|
||||
parentId = result!.category_id;
|
||||
}
|
||||
|
||||
currentLevel++;
|
||||
}
|
||||
|
||||
return parentId;
|
||||
} catch (error) {
|
||||
logger.error("화면 그룹 카테고리 생성 실패:", error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 화면 라벨 다국어 키 자동 생성
|
||||
* 화면 그룹 기반으로 카테고리 생성 (기존 메뉴 기반에서 변경)
|
||||
*/
|
||||
async generateScreenLabelKeys(params: {
|
||||
screenId: number;
|
||||
companyCode: string;
|
||||
companyName: string;
|
||||
menuObjId?: string;
|
||||
menuObjId?: string; // 하위 호환성 유지 (미사용, 화면 그룹 기반으로 변경)
|
||||
labels: Array<{ componentId: string; label: string; type?: string }>;
|
||||
}): Promise<Array<{ componentId: string; keyId: number; langKey: string }>> {
|
||||
try {
|
||||
@@ -1492,16 +1593,15 @@ export class MultiLangService {
|
||||
labelCount: params.labels.length,
|
||||
});
|
||||
|
||||
// 메뉴 경로 조회
|
||||
const menuPath = params.menuObjId
|
||||
? await this.getMenuPath(params.menuObjId)
|
||||
: [];
|
||||
// 화면 그룹 경로 조회 (화면이 속한 그룹의 계층 구조)
|
||||
const groupPath = await this.getScreenGroupPath(params.screenId);
|
||||
logger.info("화면 그룹 경로 조회 완료", { screenId: params.screenId, groupPath });
|
||||
|
||||
// 메뉴 카테고리 확보
|
||||
const categoryId = await this.ensureMenuCategory(
|
||||
// 화면 그룹 기반 카테고리 확보
|
||||
const categoryId = await this.ensureScreenGroupCategory(
|
||||
params.companyCode,
|
||||
params.companyName,
|
||||
menuPath
|
||||
groupPath
|
||||
);
|
||||
|
||||
// 카테고리 경로 조회 (키 생성용)
|
||||
|
||||
Reference in New Issue
Block a user