From 42435193cfa8eb73293660710f96224ce1a56765 Mon Sep 17 00:00:00 2001 From: kjs Date: Fri, 21 Nov 2025 15:59:55 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=8D=AE=EC=96=B4=EC=93=B0=EA=B8=B0=20?= =?UTF-8?q?=EC=8B=9C=20=EC=99=B8=EB=9E=98=ED=82=A4=20=EC=A0=9C=EC=95=BD?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EC=9C=84=EB=B0=98=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 문제: - 기존 메뉴 삭제 시 numbering_rules.fk_numbering_rules_menu 외래키 제약조건 위반 - category_column_mapping.fk_mapping_menu 외래키 제약조건도 위반 가능 원인: - 채번 규칙과 카테고리 설정이 menu_objid를 참조하는데, 메뉴를 먼저 삭제하려고 함 해결: deleteExistingCopy 함수의 삭제 순서 변경: 1. 화면 레이아웃 2. 화면-메뉴 할당 3. 화면 정의 4. 메뉴 권한 5. 채번 규칙 파트 (추가) 6. 채번 규칙 (추가) 7. 테이블 컬럼 카테고리 값 (추가) 8. 카테고리 컬럼 매핑 (추가) 9. 메뉴 (역순) 관련 파일: - backend-node/src/services/menuCopyService.ts 테스트: - 메뉴 덮어쓰기 재복사 시 외래키 제약조건 위반 없이 정상 동작 --- backend-node/src/services/menuCopyService.ts | 41 ++++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/backend-node/src/services/menuCopyService.ts b/backend-node/src/services/menuCopyService.ts index 3471cdad..19b2d96f 100644 --- a/backend-node/src/services/menuCopyService.ts +++ b/backend-node/src/services/menuCopyService.ts @@ -709,7 +709,42 @@ export class MenuCopyService { ]); logger.info(` ✅ 메뉴 권한 삭제 완료`); - // 5-5. 메뉴 삭제 (역순: 하위 메뉴부터) + // 5-5. 채번 규칙 파트 삭제 + await client.query( + `DELETE FROM numbering_rule_parts + WHERE rule_id IN ( + SELECT rule_id FROM numbering_rules + WHERE menu_objid = ANY($1) AND company_code = $2 + )`, + [existingMenuIds, targetCompanyCode] + ); + logger.info(` ✅ 채번 규칙 파트 삭제 완료`); + + // 5-6. 채번 규칙 삭제 + await client.query( + `DELETE FROM numbering_rules + WHERE menu_objid = ANY($1) AND company_code = $2`, + [existingMenuIds, targetCompanyCode] + ); + logger.info(` ✅ 채번 규칙 삭제 완료`); + + // 5-7. 테이블 컬럼 카테고리 값 삭제 + await client.query( + `DELETE FROM table_column_category_values + WHERE menu_objid = ANY($1) AND company_code = $2`, + [existingMenuIds, targetCompanyCode] + ); + logger.info(` ✅ 카테고리 값 삭제 완료`); + + // 5-8. 카테고리 컬럼 매핑 삭제 + await client.query( + `DELETE FROM category_column_mapping + WHERE menu_objid = ANY($1) AND company_code = $2`, + [existingMenuIds, targetCompanyCode] + ); + logger.info(` ✅ 카테고리 매핑 삭제 완료`); + + // 5-9. 메뉴 삭제 (역순: 하위 메뉴부터) for (let i = existingMenus.length - 1; i >= 0; i--) { await client.query(`DELETE FROM menu_info WHERE objid = $1`, [ existingMenus[i].objid, @@ -1660,9 +1695,7 @@ export class MenuCopyService { WHERE table_name = $1 AND column_name = $2 AND company_code = $3`, [tableName, columnName, targetCompanyCode] ); - logger.debug( - ` 🗑️ 기존 카테고리 값 삭제: ${tableName}.${columnName}` - ); + logger.debug(` 🗑️ 기존 카테고리 값 삭제: ${tableName}.${columnName}`); } // 새 값 추가