From 961e7e9a1409100b2fb829288e0b5aee16eacd2f Mon Sep 17 00:00:00 2001 From: kjs Date: Fri, 19 Dec 2025 17:41:14 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B1=84=EB=B2=88=20=EB=B3=B5=EC=82=AC=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend-node/src/services/menuCopyService.ts | 54 ++++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/backend-node/src/services/menuCopyService.ts b/backend-node/src/services/menuCopyService.ts index 26c8b779..c0fda30c 100644 --- a/backend-node/src/services/menuCopyService.ts +++ b/backend-node/src/services/menuCopyService.ts @@ -756,9 +756,10 @@ export class MenuCopyService { [menuScopedRuleIds] ); // 채번 규칙 삭제 - await client.query(`DELETE FROM numbering_rules WHERE rule_id = ANY($1)`, [ - menuScopedRuleIds, - ]); + await client.query( + `DELETE FROM numbering_rules WHERE rule_id = ANY($1)`, + [menuScopedRuleIds] + ); logger.info( ` ✅ 메뉴 전용 채번 규칙 삭제: ${menuScopedRuleIds.length}개` ); @@ -2370,12 +2371,10 @@ export class MenuCopyService { return { copiedCount, ruleIdMap }; } - // 2. 대상 회사에 이미 존재하는 채번 규칙 한 번에 조회 - const ruleIds = allRulesResult.rows.map((r) => r.rule_id); + // 2. 대상 회사에 이미 존재하는 모든 채번 규칙 조회 (원본 ID + 새로 생성될 ID 모두 체크 필요) const existingRulesResult = await client.query( - `SELECT rule_id FROM numbering_rules - WHERE rule_id = ANY($1) AND company_code = $2`, - [ruleIds, targetCompanyCode] + `SELECT rule_id FROM numbering_rules WHERE company_code = $1`, + [targetCompanyCode] ); const existingRuleIds = new Set( existingRulesResult.rows.map((r) => r.rule_id) @@ -2389,28 +2388,49 @@ export class MenuCopyService { const rulesToUpdate: Array<{ ruleId: string; newMenuObjid: number }> = []; 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)) { - // 기존 규칙은 동일한 ID로 매핑 + // 원본 ID가 이미 존재 (동일한 ID로 매핑) ruleIdMap.set(rule.rule_id, rule.rule_id); - // 새 메뉴 ID로 연결 업데이트 필요 const newMenuObjid = menuIdMap.get(rule.menu_objid); if (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( - ` ♻️ 채번규칙 이미 존재 (메뉴 연결 갱신): ${rule.rule_id}` + ` ♻️ 채번규칙 이미 존재 (대상 ID): ${rule.rule_id} -> ${newRuleId}` ); } 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); originalToNewRuleMap.push({ original: rule.rule_id, new: newRuleId }); rulesToCopy.push({ ...rule, newRuleId }); + logger.info(` 📋 채번규칙 복사 예정: ${rule.rule_id} -> ${newRuleId}`); } }