Merge pull request 'feature/screen-management' (#312) from feature/screen-management into main
Reviewed-on: http://39.117.244.52:3000/kjs/ERP-node/pulls/312
This commit is contained in:
commit
a7edd74574
|
|
@ -279,11 +279,90 @@ export class MenuCopyService {
|
|||
logger.debug(` 📐 분할 패널 우측 화면 참조 발견: ${numId}`);
|
||||
}
|
||||
}
|
||||
|
||||
// 5) 모달 화면 ID (addModalScreenId, editModalScreenId, modalScreenId)
|
||||
if (props?.componentConfig?.addModalScreenId) {
|
||||
const addModalScreenId = props.componentConfig.addModalScreenId;
|
||||
const numId =
|
||||
typeof addModalScreenId === "number"
|
||||
? addModalScreenId
|
||||
: parseInt(addModalScreenId);
|
||||
if (!isNaN(numId) && numId > 0) {
|
||||
referenced.push(numId);
|
||||
logger.debug(` 📋 추가 모달 화면 참조 발견: ${numId}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (props?.componentConfig?.editModalScreenId) {
|
||||
const editModalScreenId = props.componentConfig.editModalScreenId;
|
||||
const numId =
|
||||
typeof editModalScreenId === "number"
|
||||
? editModalScreenId
|
||||
: parseInt(editModalScreenId);
|
||||
if (!isNaN(numId) && numId > 0) {
|
||||
referenced.push(numId);
|
||||
logger.debug(` 📝 수정 모달 화면 참조 발견: ${numId}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (props?.componentConfig?.modalScreenId) {
|
||||
const modalScreenId = props.componentConfig.modalScreenId;
|
||||
const numId =
|
||||
typeof modalScreenId === "number"
|
||||
? modalScreenId
|
||||
: parseInt(modalScreenId);
|
||||
if (!isNaN(numId) && numId > 0) {
|
||||
referenced.push(numId);
|
||||
logger.debug(` 🔲 모달 화면 참조 발견: ${numId}`);
|
||||
}
|
||||
}
|
||||
|
||||
// 6) 재귀적으로 모든 properties에서 화면 ID 추출 (깊은 탐색)
|
||||
this.extractScreenIdsFromObject(props, referenced);
|
||||
}
|
||||
|
||||
return referenced;
|
||||
}
|
||||
|
||||
/**
|
||||
* 객체 내부에서 화면 ID를 재귀적으로 추출
|
||||
*/
|
||||
private extractScreenIdsFromObject(obj: any, referenced: number[]): void {
|
||||
if (!obj || typeof obj !== "object") return;
|
||||
|
||||
if (Array.isArray(obj)) {
|
||||
for (const item of obj) {
|
||||
this.extractScreenIdsFromObject(item, referenced);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
for (const key of Object.keys(obj)) {
|
||||
const value = obj[key];
|
||||
|
||||
// 화면 ID 키 패턴 확인
|
||||
if (
|
||||
key === "screenId" ||
|
||||
key === "targetScreenId" ||
|
||||
key === "leftScreenId" ||
|
||||
key === "rightScreenId" ||
|
||||
key === "addModalScreenId" ||
|
||||
key === "editModalScreenId" ||
|
||||
key === "modalScreenId"
|
||||
) {
|
||||
const numId = typeof value === "number" ? value : parseInt(value);
|
||||
if (!isNaN(numId) && numId > 0 && !referenced.includes(numId)) {
|
||||
referenced.push(numId);
|
||||
}
|
||||
}
|
||||
|
||||
// 재귀 탐색
|
||||
if (typeof value === "object" && value !== null) {
|
||||
this.extractScreenIdsFromObject(value, referenced);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 화면 수집 (중복 제거, 재귀적 참조 추적)
|
||||
*/
|
||||
|
|
@ -483,7 +562,8 @@ export class MenuCopyService {
|
|||
properties: any,
|
||||
screenIdMap: Map<number, number>,
|
||||
flowIdMap: Map<number, number>,
|
||||
numberingRuleIdMap?: Map<string, string>
|
||||
numberingRuleIdMap?: Map<string, string>,
|
||||
menuIdMap?: Map<number, number>
|
||||
): any {
|
||||
if (!properties) return properties;
|
||||
|
||||
|
|
@ -496,7 +576,8 @@ export class MenuCopyService {
|
|||
screenIdMap,
|
||||
flowIdMap,
|
||||
"",
|
||||
numberingRuleIdMap
|
||||
numberingRuleIdMap,
|
||||
menuIdMap
|
||||
);
|
||||
|
||||
return updated;
|
||||
|
|
@ -510,7 +591,8 @@ export class MenuCopyService {
|
|||
screenIdMap: Map<number, number>,
|
||||
flowIdMap: Map<number, number>,
|
||||
path: string = "",
|
||||
numberingRuleIdMap?: Map<string, string>
|
||||
numberingRuleIdMap?: Map<string, string>,
|
||||
menuIdMap?: Map<number, number>
|
||||
): void {
|
||||
if (!obj || typeof obj !== "object") return;
|
||||
|
||||
|
|
@ -522,7 +604,8 @@ export class MenuCopyService {
|
|||
screenIdMap,
|
||||
flowIdMap,
|
||||
`${path}[${index}]`,
|
||||
numberingRuleIdMap
|
||||
numberingRuleIdMap,
|
||||
menuIdMap
|
||||
);
|
||||
});
|
||||
return;
|
||||
|
|
@ -533,13 +616,16 @@ export class MenuCopyService {
|
|||
const value = obj[key];
|
||||
const currentPath = path ? `${path}.${key}` : key;
|
||||
|
||||
// screen_id, screenId, targetScreenId, leftScreenId, rightScreenId 매핑 (숫자 또는 숫자 문자열)
|
||||
// screen_id, screenId, targetScreenId, leftScreenId, rightScreenId, addModalScreenId, editModalScreenId, modalScreenId 매핑 (숫자 또는 숫자 문자열)
|
||||
if (
|
||||
key === "screen_id" ||
|
||||
key === "screenId" ||
|
||||
key === "targetScreenId" ||
|
||||
key === "leftScreenId" ||
|
||||
key === "rightScreenId"
|
||||
key === "rightScreenId" ||
|
||||
key === "addModalScreenId" ||
|
||||
key === "editModalScreenId" ||
|
||||
key === "modalScreenId"
|
||||
) {
|
||||
const numValue = typeof value === "number" ? value : parseInt(value);
|
||||
if (!isNaN(numValue) && numValue > 0) {
|
||||
|
|
@ -549,6 +635,11 @@ export class MenuCopyService {
|
|||
logger.info(
|
||||
` 🔗 화면 참조 업데이트 (${currentPath}): ${value} → ${newId}`
|
||||
);
|
||||
} else {
|
||||
// 매핑이 없으면 경고 로그 (복사되지 않은 화면 참조)
|
||||
logger.warn(
|
||||
` ⚠️ 화면 매핑 없음 (${currentPath}): ${value} - 원본 화면이 복사되지 않았을 수 있음`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -573,9 +664,9 @@ export class MenuCopyService {
|
|||
}
|
||||
}
|
||||
|
||||
// numberingRuleId 매핑 (문자열)
|
||||
// numberingRuleId, ruleId 매핑 (문자열) - 채번규칙 참조
|
||||
if (
|
||||
key === "numberingRuleId" &&
|
||||
(key === "numberingRuleId" || key === "ruleId") &&
|
||||
numberingRuleIdMap &&
|
||||
typeof value === "string" &&
|
||||
value
|
||||
|
|
@ -595,6 +686,25 @@ export class MenuCopyService {
|
|||
}
|
||||
}
|
||||
|
||||
// selectedMenuObjid 매핑 (메뉴 objid 참조)
|
||||
if (key === "selectedMenuObjid" && menuIdMap) {
|
||||
const numValue = typeof value === "number" ? value : parseInt(value);
|
||||
if (!isNaN(numValue) && numValue > 0) {
|
||||
const newId = menuIdMap.get(numValue);
|
||||
if (newId) {
|
||||
obj[key] = typeof value === "number" ? newId : String(newId);
|
||||
logger.info(
|
||||
` 🔗 메뉴 참조 업데이트 (${currentPath}): ${value} → ${newId}`
|
||||
);
|
||||
} else {
|
||||
// 매핑이 없으면 경고 로그 (복사되지 않은 메뉴 참조)
|
||||
logger.warn(
|
||||
` ⚠️ 메뉴 매핑 없음 (${currentPath}): ${value} - 원본 메뉴가 복사되지 않았을 수 있음`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 재귀 호출
|
||||
if (typeof value === "object" && value !== null) {
|
||||
this.recursiveUpdateReferences(
|
||||
|
|
@ -602,7 +712,8 @@ export class MenuCopyService {
|
|||
screenIdMap,
|
||||
flowIdMap,
|
||||
currentPath,
|
||||
numberingRuleIdMap
|
||||
numberingRuleIdMap,
|
||||
menuIdMap
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -981,7 +1092,8 @@ export class MenuCopyService {
|
|||
userId,
|
||||
client,
|
||||
screenNameConfig,
|
||||
numberingRuleIdMap
|
||||
numberingRuleIdMap,
|
||||
menuIdMap
|
||||
);
|
||||
|
||||
// === 6단계: 화면-메뉴 할당 ===
|
||||
|
|
@ -1315,7 +1427,8 @@ export class MenuCopyService {
|
|||
removeText?: string;
|
||||
addPrefix?: string;
|
||||
},
|
||||
numberingRuleIdMap?: Map<string, string>
|
||||
numberingRuleIdMap?: Map<string, string>,
|
||||
menuIdMap?: Map<number, number>
|
||||
): Promise<Map<number, number>> {
|
||||
const screenIdMap = new Map<number, number>();
|
||||
|
||||
|
|
@ -1601,7 +1714,8 @@ export class MenuCopyService {
|
|||
layout.properties,
|
||||
screenIdMap,
|
||||
flowIdMap,
|
||||
numberingRuleIdMap
|
||||
numberingRuleIdMap,
|
||||
menuIdMap
|
||||
);
|
||||
|
||||
layoutValues.push(
|
||||
|
|
|
|||
Loading…
Reference in New Issue