diff --git a/backend-node/src/services/menuCopyService.ts b/backend-node/src/services/menuCopyService.ts index 19b2d96f..37ef1a64 100644 --- a/backend-node/src/services/menuCopyService.ts +++ b/backend-node/src/services/menuCopyService.ts @@ -410,26 +410,26 @@ export class MenuCopyService { const columnMappings: any[] = []; const categoryValues: any[] = []; - for (const menuObjid of menuObjids) { - // 카테고리 컬럼 매핑 - const mappingsResult = await client.query( - `SELECT * FROM category_column_mapping - WHERE menu_objid = $1 AND company_code = $2`, - [menuObjid, sourceCompanyCode] - ); - columnMappings.push(...mappingsResult.rows); + // 카테고리 컬럼 매핑 (메뉴별 + 공통) + const mappingsResult = await client.query( + `SELECT * FROM category_column_mapping + WHERE (menu_objid = ANY($1) OR menu_objid = 0) + AND company_code = $2`, + [menuObjids, sourceCompanyCode] + ); + columnMappings.push(...mappingsResult.rows); - // 테이블 컬럼 카테고리 값 - const valuesResult = await client.query( - `SELECT * FROM table_column_category_values - WHERE menu_objid = $1 AND company_code = $2`, - [menuObjid, sourceCompanyCode] - ); - categoryValues.push(...valuesResult.rows); - } + // 테이블 컬럼 카테고리 값 (메뉴별 + 공통) + const valuesResult = await client.query( + `SELECT * FROM table_column_category_values + WHERE (menu_objid = ANY($1) OR menu_objid = 0) + AND company_code = $2`, + [menuObjids, sourceCompanyCode] + ); + categoryValues.push(...valuesResult.rows); logger.info( - `✅ 카테고리 설정 수집 완료: 컬럼 매핑 ${columnMappings.length}개, 카테고리 값 ${categoryValues.length}개` + `✅ 카테고리 설정 수집 완료: 컬럼 매핑 ${columnMappings.length}개 (공통 포함), 카테고리 값 ${categoryValues.length}개 (공통 포함)` ); return { columnMappings, categoryValues }; } @@ -1647,8 +1647,15 @@ export class MenuCopyService { // 1) 카테고리 컬럼 매핑 복사 (덮어쓰기 모드) for (const mapping of settings.columnMappings) { - const newMenuObjid = menuIdMap.get(mapping.menu_objid); - if (!newMenuObjid) continue; + // menu_objid = 0인 공통 설정은 그대로 0으로 유지 + const newMenuObjid = mapping.menu_objid === 0 + ? 0 + : menuIdMap.get(mapping.menu_objid); + + if (newMenuObjid === undefined) { + logger.debug(` ⏭️ 매핑할 메뉴가 없음: menu_objid=${mapping.menu_objid}`); + continue; + } // 기존 매핑 삭제 (덮어쓰기) await client.query( @@ -1700,8 +1707,15 @@ export class MenuCopyService { // 새 값 추가 for (const value of sortedValues) { - const newMenuObjid = menuIdMap.get(value.menu_objid); - if (!newMenuObjid) continue; + // menu_objid = 0인 공통 설정은 그대로 0으로 유지 + const newMenuObjid = value.menu_objid === 0 + ? 0 + : menuIdMap.get(value.menu_objid); + + if (newMenuObjid === undefined) { + logger.debug(` ⏭️ 매핑할 메뉴가 없음: menu_objid=${value.menu_objid}`); + continue; + } // 부모 ID 재매핑 let newParentValueId = null;