채번 복사 오류 수정

This commit is contained in:
kjs 2025-12-19 17:41:14 +09:00
parent 09f477172c
commit 961e7e9a14
1 changed files with 37 additions and 17 deletions

View File

@ -756,9 +756,10 @@ export class MenuCopyService {
[menuScopedRuleIds] [menuScopedRuleIds]
); );
// 채번 규칙 삭제 // 채번 규칙 삭제
await client.query(`DELETE FROM numbering_rules WHERE rule_id = ANY($1)`, [ await client.query(
menuScopedRuleIds, `DELETE FROM numbering_rules WHERE rule_id = ANY($1)`,
]); [menuScopedRuleIds]
);
logger.info( logger.info(
` ✅ 메뉴 전용 채번 규칙 삭제: ${menuScopedRuleIds.length}` ` ✅ 메뉴 전용 채번 규칙 삭제: ${menuScopedRuleIds.length}`
); );
@ -2370,12 +2371,10 @@ export class MenuCopyService {
return { copiedCount, ruleIdMap }; return { copiedCount, ruleIdMap };
} }
// 2. 대상 회사에 이미 존재하는 채번 규칙 한 번에 조회 // 2. 대상 회사에 이미 존재하는 모든 채번 규칙 조회 (원본 ID + 새로 생성될 ID 모두 체크 필요)
const ruleIds = allRulesResult.rows.map((r) => r.rule_id);
const existingRulesResult = await client.query( const existingRulesResult = await client.query(
`SELECT rule_id FROM numbering_rules `SELECT rule_id FROM numbering_rules WHERE company_code = $1`,
WHERE rule_id = ANY($1) AND company_code = $2`, [targetCompanyCode]
[ruleIds, targetCompanyCode]
); );
const existingRuleIds = new Set( const existingRuleIds = new Set(
existingRulesResult.rows.map((r) => r.rule_id) existingRulesResult.rows.map((r) => r.rule_id)
@ -2389,28 +2388,49 @@ export class MenuCopyService {
const rulesToUpdate: Array<{ ruleId: string; newMenuObjid: number }> = []; const rulesToUpdate: Array<{ ruleId: string; newMenuObjid: number }> = [];
for (const rule of allRulesResult.rows) { for (const rule of allRulesResult.rows) {
// 새 rule_id 계산: 회사코드 접두사 제거 후 대상 회사코드 추가
// 예: COMPANY_10_rule-123 -> rule-123 -> COMPANY_16_rule-123
// 예: rule-123 -> rule-123 -> COMPANY_16_rule-123
// 예: WACE_품목코드 -> 품목코드 -> COMPANY_16_품목코드
let baseName = rule.rule_id;
// 회사코드 접두사 패턴들을 순서대로 제거 시도
// 1. COMPANY_숫자_ 패턴 (예: COMPANY_10_)
// 2. 일반 접두사_ 패턴 (예: WACE_)
if (baseName.match(/^COMPANY_\d+_/)) {
baseName = baseName.replace(/^COMPANY_\d+_/, "");
} else if (baseName.includes("_")) {
baseName = baseName.replace(/^[^_]+_/, "");
}
const newRuleId = `${targetCompanyCode}_${baseName}`;
if (existingRuleIds.has(rule.rule_id)) { if (existingRuleIds.has(rule.rule_id)) {
// 기존 규칙은 동일한 ID로 매핑 // 원본 ID가 이미 존재 (동일한 ID로 매핑)
ruleIdMap.set(rule.rule_id, rule.rule_id); ruleIdMap.set(rule.rule_id, rule.rule_id);
// 새 메뉴 ID로 연결 업데이트 필요
const newMenuObjid = menuIdMap.get(rule.menu_objid); const newMenuObjid = menuIdMap.get(rule.menu_objid);
if (newMenuObjid) { if (newMenuObjid) {
rulesToUpdate.push({ ruleId: rule.rule_id, newMenuObjid }); rulesToUpdate.push({ ruleId: rule.rule_id, newMenuObjid });
} }
logger.info(` ♻️ 채번규칙 이미 존재 (원본 ID): ${rule.rule_id}`);
} else if (existingRuleIds.has(newRuleId)) {
// 새로 생성될 ID가 이미 존재 (기존 규칙으로 매핑)
ruleIdMap.set(rule.rule_id, newRuleId);
const newMenuObjid = menuIdMap.get(rule.menu_objid);
if (newMenuObjid) {
rulesToUpdate.push({ ruleId: newRuleId, newMenuObjid });
}
logger.info( logger.info(
` ♻️ 채번규칙 이미 존재 (메뉴 연결 갱신): ${rule.rule_id}` ` ♻️ 채번규칙 이미 존재 (대상 ID): ${rule.rule_id} -> ${newRuleId}`
); );
} else { } else {
// 새 rule_id 생성 // 새로 복사 필요
const originalSuffix = rule.rule_id.includes("_")
? rule.rule_id.replace(/^[^_]*_/, "")
: rule.rule_id;
const newRuleId = `${targetCompanyCode}_${originalSuffix}`;
ruleIdMap.set(rule.rule_id, newRuleId); ruleIdMap.set(rule.rule_id, newRuleId);
originalToNewRuleMap.push({ original: rule.rule_id, new: newRuleId }); originalToNewRuleMap.push({ original: rule.rule_id, new: newRuleId });
rulesToCopy.push({ ...rule, newRuleId }); rulesToCopy.push({ ...rule, newRuleId });
logger.info(` 📋 채번규칙 복사 예정: ${rule.rule_id} -> ${newRuleId}`);
} }
} }