Merge branch 'feature/v2-renewal' of http://39.117.244.52:3000/kjs/ERP-node into feature/v2-unified-renewal

This commit is contained in:
kjs
2026-01-22 10:04:49 +09:00
15 changed files with 2588 additions and 171 deletions

View File

@@ -243,6 +243,28 @@ export async function syncScreenGroupsToMenu(
[groupId, menuObjid]
);
// 해당 그룹에 연결된 기본 화면으로 URL 항상 업데이트 (화면 재생성 시에도 반영)
const defaultScreenQuery = `
SELECT sd.screen_id, sd.screen_code, sd.screen_name
FROM screen_group_screens sgs
JOIN screen_definitions sd ON sgs.screen_id = sd.screen_id
WHERE sgs.group_id = $1 AND sgs.company_code = $2
ORDER BY
CASE WHEN sgs.is_default = 'Y' THEN 0 ELSE 1 END,
sgs.display_order ASC
LIMIT 1
`;
const defaultScreenResult = await client.query(defaultScreenQuery, [groupId, companyCode]);
if (defaultScreenResult.rows.length > 0) {
const defaultScreen = defaultScreenResult.rows[0];
const newMenuUrl = `/screens/${defaultScreen.screen_id}`;
await client.query(
`UPDATE menu_info SET menu_url = $1, screen_code = $2 WHERE objid = $3`,
[newMenuUrl, defaultScreen.screen_code, menuObjid]
);
logger.info("메뉴 URL 업데이트", { groupName, screenId: defaultScreen.screen_id, menuUrl: newMenuUrl });
}
groupToMenuMap.set(groupId, menuObjid);
result.linked++;
result.details.push({
@@ -286,12 +308,34 @@ export async function syncScreenGroupsToMenu(
nextSeq = parseInt(maxSeqResult.rows[0].next_seq) || 1;
}
// 해당 그룹에 연결된 기본 화면 조회 (is_default = 'Y' 우선, 없으면 첫 번째 화면)
let menuUrl: string | null = null;
let screenCode: string | null = null;
const defaultScreenQuery2 = `
SELECT sd.screen_id, sd.screen_code, sd.screen_name
FROM screen_group_screens sgs
JOIN screen_definitions sd ON sgs.screen_id = sd.screen_id
WHERE sgs.group_id = $1 AND sgs.company_code = $2
ORDER BY
CASE WHEN sgs.is_default = 'Y' THEN 0 ELSE 1 END,
sgs.display_order ASC
LIMIT 1
`;
const defaultScreenResult2 = await client.query(defaultScreenQuery2, [groupId, companyCode]);
if (defaultScreenResult2.rows.length > 0) {
const defaultScreen = defaultScreenResult2.rows[0];
screenCode = defaultScreen.screen_code;
menuUrl = `/screens/${defaultScreen.screen_id}`;
logger.info("기본 화면 URL 설정", { groupName, screenId: defaultScreen.screen_id, menuUrl });
}
// menu_info에 삽입
const insertMenuQuery = `
INSERT INTO menu_info (
objid, parent_obj_id, menu_name_kor, menu_name_eng,
seq, menu_type, company_code, writer, regdate, status, screen_group_id, menu_desc
) VALUES ($1, $2, $3, $4, $5, 1, $6, $7, NOW(), 'active', $8, $9)
seq, menu_type, company_code, writer, regdate, status, screen_group_id, menu_desc,
menu_url, screen_code
) VALUES ($1, $2, $3, $4, $5, 1, $6, $7, NOW(), 'active', $8, $9, $10, $11)
RETURNING objid
`;
await client.query(insertMenuQuery, [
@@ -304,6 +348,8 @@ export async function syncScreenGroupsToMenu(
userId,
groupId,
group.description || null,
menuUrl,
screenCode,
]);
// screen_groups에 menu_objid 업데이트
@@ -336,7 +382,13 @@ export async function syncScreenGroupsToMenu(
} catch (error: any) {
await client.query('ROLLBACK');
logger.error("화면관리 → 메뉴 동기화 실패", { companyCode, error: error.message });
logger.error("화면관리 → 메뉴 동기화 실패", {
companyCode,
error: error.message,
stack: error.stack,
code: error.code,
detail: error.detail,
});
result.success = false;
result.errors.push(error.message);
return result;