diff --git a/backend-spring/src/main/java/com/erp/controller/AdminController.java b/backend-spring/src/main/java/com/erp/controller/AdminController.java index 4413e94d..978ad236 100644 --- a/backend-spring/src/main/java/com/erp/controller/AdminController.java +++ b/backend-spring/src/main/java/com/erp/controller/AdminController.java @@ -131,13 +131,24 @@ public class AdminController { * 메뉴 일괄 삭제 */ @DeleteMapping("/menus/batch") - public ResponseEntity> deleteMenusBatch(@RequestBody Map body) { - @SuppressWarnings("unchecked") - List menuIds = (List) body.get("menu_ids"); + public ResponseEntity>> deleteMenusBatch(@RequestBody List menuIds) { + int deletedCount = 0; + int failedCount = 0; if (menuIds != null) { - menuIds.forEach(adminService::deleteMenu); + for (String menuId : menuIds) { + try { + adminService.deleteMenu(menuId); + deletedCount++; + } catch (Exception e) { + failedCount++; + log.warn("메뉴 삭제 실패 menuId={} : {}", menuId, e.getMessage()); + } + } } - return ResponseEntity.ok(ApiResponse.success(null, "메뉴 일괄 삭제 성공")); + Map result = new HashMap<>(); + result.put("deletedCount", deletedCount); + result.put("failedCount", failedCount); + return ResponseEntity.ok(ApiResponse.success(result, "메뉴 일괄 삭제 성공")); } // ── 사용자 관리 ──────────────────────────────────────────────────────── diff --git a/backend-spring/src/main/java/com/erp/service/AdminService.java b/backend-spring/src/main/java/com/erp/service/AdminService.java index 803c15f3..d114c911 100644 --- a/backend-spring/src/main/java/com/erp/service/AdminService.java +++ b/backend-spring/src/main/java/com/erp/service/AdminService.java @@ -80,6 +80,8 @@ public class AdminService extends BaseService { long objid = System.currentTimeMillis(); params.put("objid", objid); + normalizeMenuParams(params); + // Map frontend field names to DB column names if (params.get("menu_name_kor") == null && params.get("menu_name") != null) { params.put("menu_name_kor", params.get("menu_name")); @@ -91,10 +93,32 @@ public class AdminService extends BaseService { public Map updateMenu(String menuId, Map params) { params.put("menu_id", menuId); + normalizeMenuParams(params); sqlSession.update("admin.updateMenu", params); return params; } + // 프론트가 보내는 camelCase 키를 XML이 기대하는 snake_case 키로 복사한다. + // (XML #{menu_name_kor} 등 snake_case 파라미터로 바인딩하기 위함) + private void normalizeMenuParams(Map params) { + copyIfAbsent(params, "menuNameKor", "menu_name_kor"); + copyIfAbsent(params, "menuUrl", "menu_url"); + copyIfAbsent(params, "menuDesc", "menu_desc"); + copyIfAbsent(params, "parentObjId", "parent_obj_id"); + copyIfAbsent(params, "langKey", "lang_key"); + copyIfAbsent(params, "langKeyDesc", "lang_key_desc"); + copyIfAbsent(params, "menuIcon", "menu_icon"); + copyIfAbsent(params, "screenCode", "screen_code"); + copyIfAbsent(params, "menuType", "menu_type"); + copyIfAbsent(params, "companyCode", "company_code"); + } + + private void copyIfAbsent(Map params, String camelKey, String snakeKey) { + if (params.get(snakeKey) == null && params.get(camelKey) != null) { + params.put(snakeKey, params.get(camelKey)); + } + } + public void deleteMenu(String menuId) { Map params = new HashMap<>(); params.put("menu_id", menuId); diff --git a/backend-spring/src/main/resources/application.yml b/backend-spring/src/main/resources/application.yml index d58fdd04..85101ee2 100644 --- a/backend-spring/src/main/resources/application.yml +++ b/backend-spring/src/main/resources/application.yml @@ -14,7 +14,7 @@ spring: jackson: default-property-inclusion: always datasource: - url: jdbc:postgresql://211.115.91.141:11134/test_dev + url: jdbc:postgresql://183.99.177.40:5432/vexplor username: postgres password: "vexplor0909!!" driver-class-name: org.postgresql.Driver diff --git a/backend-spring/src/main/resources/mapper/admin.xml b/backend-spring/src/main/resources/mapper/admin.xml index a58d7ca5..d03428b5 100644 --- a/backend-spring/src/main/resources/mapper/admin.xml +++ b/backend-spring/src/main/resources/mapper/admin.xml @@ -313,7 +313,7 @@ FROM MENU_INFO M LEFT JOIN COMPANY_MNG C ON M.COMPANY_CODE = C.COMPANY_CODE - WHERE M.OBJID = #{menu_id}::NUMERIC + WHERE M.OBJID = #{menu_id} @@ -363,20 +363,23 @@ , LANG_KEY = #{lang_key} , LANG_KEY_DESC = #{lang_key_desc} , MENU_ICON = #{menu_icon} - WHERE OBJID = #{menu_id}::NUMERIC + , PARENT_OBJ_ID = #{parent_obj_id} + , MENU_TYPE = #{menu_type} + , COMPANY_CODE = #{company_code} + WHERE OBJID = #{menu_id} DELETE FROM MENU_INFO - WHERE OBJID = #{menu_id}::NUMERIC + WHERE OBJID = #{menu_id} UPDATE MENU_INFO SET STATUS = #{status} - WHERE OBJID = #{menu_id}::NUMERIC + WHERE OBJID = #{menu_id} +
+ + +
+ + +
+
+ + +
+
T
+
USER_INFO
+
30
+
+ + +
+ + +
+ + +
+ + +
+ +
+ +
+ + +
+
+ + 컴포넌트 +
+
+
+
+ 데이터 조회/선택 + +
+
+
+ 버튼 + +
+
+
+ 제목/텍스트 + +
+
+
+ 테이블 + +
+
+
+ 통계 카드 + +
+
+
+ 구분선 + +
+
+
+ 영역 + +
+
+
+ 입력 필드 + +
+
+
+ 검색 + +
+
+ +
+ 더보기 + 9 +
+
+
+ +
280px
+
+ + +
+ 캔버스 — 패널 경계를 드래그해서 리사이즈 +
+ + + + diff --git a/notes/gbpark/2026-04-14-builder-header-mockup.html b/notes/gbpark/2026-04-14-builder-header-mockup.html new file mode 100644 index 00000000..c2e7f9a5 --- /dev/null +++ b/notes/gbpark/2026-04-14-builder-header-mockup.html @@ -0,0 +1,380 @@ + + + + + +Builder Header v3 — 인비온 직각 + 구역 분리 + 구조 변경 + + + + +
+ + +
+ + +
+ + +
+
+ + STUDIO +
+
+ + +
+
+
+ +
+
+ +
+
+
+ + +
+
+ +
+
+ + +
+ 하이큐마그 기준정보 부서관리 사원 추가 모달 + + + user_info + +
+ + +
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+ + + +
+
+
+ + +
+ +
+
+ + Full HD + 1920×1080 + +
+
+ + +
+
+ +
캔버스 영역
+
+ +
+ 탭은 동적: 처음엔 "목록 화면"만. 등록/수정 버튼 배치 시 탭 자동 추가
+ + + +
+ + + + diff --git a/notes/gbpark/2026-04-15-menu-mng-v5-mockup-b.html b/notes/gbpark/2026-04-15-menu-mng-v5-mockup-b.html new file mode 100644 index 00000000..11cd1c6e --- /dev/null +++ b/notes/gbpark/2026-04-15-menu-mng-v5-mockup-b.html @@ -0,0 +1,677 @@ + + + + + +INVYONE — 메뉴 관리 (B · Soft Studio) + + + + +
+ +
+
+
+
+ +
+
+ 관리자/시스템/메뉴 관리 +
+
+
+
검색⌘K
+
+ + +
+
GP
+
+
+ +
+ + + +
+ +
+
+ 관리자 + + 시스템 + + 메뉴 관리 +
+
+
+

메뉴 관리

+ Active + 공용 * + L2 +
+
+ + + +
+
+
+ +
+ +
+
+ + 기본 정보 +
+
메뉴 이름과 다국어 키, 설명을 입력합니다.
+
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+
+ + 연결 +
+
메뉴 클릭 시 어떤 콘텐츠로 이동할지 결정합니다.
+
+ +
+
+ + + + +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+ + 스코프 & 표시 +
+
어느 회사에 보이고, 어느 위치에 나타날지 설정합니다.
+
+ +
+ +
하위 메뉴는 상위 스코프를 상속합니다.
+
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + 메타 +
+
+ +
mnu_00231
+
+
+ +
2026-04-12 14:23 · gbpark
+
+
+ +
+ +
+
+ + +
+
+ 저장되지 않음 + + +
+
+ +
+ +
+
+ + + + diff --git a/notes/gbpark/2026-04-15-menu-mng-v5-mockup-c.html b/notes/gbpark/2026-04-15-menu-mng-v5-mockup-c.html new file mode 100644 index 00000000..28343514 --- /dev/null +++ b/notes/gbpark/2026-04-15-menu-mng-v5-mockup-c.html @@ -0,0 +1,990 @@ + + + + + +INVYONE — 메뉴 관리 (C · Cascade, 심플 v3) + + + + +
+ +
+
+ +
+ 01스코프 + / + 02관리자 + / + 03시스템 · 요약 +
+
+
+ +
+ + +
+
GP
+
+
+ +
+ + +
+
+
01Scope
+

스코프

+

메뉴 타입을 선택하세요

+
+
+
+
+
+ +
+
37
+
+
+
관리자
+
시스템·업무·리포트 관리 화면
+
+
+
+
+
+ +
+
18
+
+
+
사용자
+
최종 사용자 대시보드·업무
+
+
+
+
+ + +
+
+
+
02Tree
+

관리자 메뉴

+

5개 · 37개 항목 · depth 3

+
+ +
+ +
+ + +
+ +
+ + +
+ + +
시스템
+ 10 +
+
+
+ + +
메뉴 관리
/admin/menu
+
+
+ + +
사용자 관리
/admin/userMng
+
+
+ + +
화면 관리
/admin/screenMng
+
+
+ + +
공통 코드
/admin/code
+ 3 +
+
+
+ + +
코드 그룹
/admin/code/groups
+
+
+ + +
코드 값
/admin/code/values
+
+
+ + +
다국어
/admin/i18n
+
+
+
+ + +
권한
/admin/roles
+
+
+ + +
+ + +
업무
+ 12 +
+
+
+ +
수주
/biz/orders
+
+
+ +
생산
/biz/production
+
+
+ + +
+ + +
AI Assistant
+ 5 +
+
+
+ +
대시보드
/ai/dashboard
+
+
+ +
채팅
/ai/chat
+
+
+ + +
+ + +
리포트
+ 7 +
+
+ + +
+ + +
자동화
+ 3 +
+
+ +
+
+ + +
+ +
+
+ + + +
+
+ +
+
+ +
+ + + +
+ +
+
03Overview
+
+

시스템

+ 10개 항목 +
+
+ 경로 관리자 / 시스템 + 스코프 공용 * + 최근 수정 2일 전 +
+
+ + +
+
+
전체
+
10items
+
+
+
활성
+
8/ 10
+
+
+
비활성
+
2disabled
+
+
+
화면 연결
+
7screens
+
+
+ + +
+
+ Sidebar Preview +
+
+
+
+
시스템
+
+ + 메뉴 관리 +
+
+ + 사용자 관리 +
+
+ + 화면 관리 +
+
+ + 공통 코드 +
+
+ + 권한 +
+
+
PREVIEW AREA
+
+
+ +
+ + +
+
+
+
+ +
+
+
관리자 · 시스템 · 메뉴 관리
+

+ 메뉴 관리 + + Active + 공용 * + L2 + +

+
+
+
+ OBJID mnu_00231 + 최근 수정 2026-04-12 14:23 · gbpark +
+
+ +
+
+

기본 정보

+

메뉴 이름, 다국어 키, 사용자에게 표시되는 설명을 설정합니다.

+
+
+
+ + +
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ +
+
+

연결

+

메뉴 클릭 시 어떤 콘텐츠로 이동할지 결정합니다.

+
+
+
+ +
+ + + + +
+
+
+ + +
화면 검색 또는 직접 URL 입력. 유형이 URL일 때만 외부 링크로 동작합니다.
+
+
+
+ +
+
+

스코프 & 표시

+

어느 회사에서 보이고 트리 상 어디에 위치할지 결정합니다.

+
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ +
+
+ + +
+
+ 저장되지 않음 + + +
+
+
+ + +
+
+

활동 로그 · 최근 4건

+
이 카테고리에서 최근 발생한 변경 이력입니다.
+
+
+
+
+
+
gbpark 메뉴명 수정 · 메뉴 관리
+
mnu_00231 · 메뉴관리 → 메뉴 관리
+
+ 2일 전 +
+
+
+
+
gbpark 하위 메뉴 추가 · 공통 코드 / 다국어
+
mnu_00248 · /admin/i18n
+
+ 4일 전 +
+
+
+
+
park URL 변경 · 화면 관리
+
/admin/screen → /admin/screenMng
+
+ 6일 전 +
+
+
+
+
gbpark 메뉴 비활성화 · 테스트
+
mnu_00197 · status: inactive
+
+ 1주 전 +
+
+
+ +
+
+ +
+
+ + + + diff --git a/notes/gbpark/2026-04-15-menu-mng-v5-mockup.html b/notes/gbpark/2026-04-15-menu-mng-v5-mockup.html new file mode 100644 index 00000000..0799ad18 --- /dev/null +++ b/notes/gbpark/2026-04-15-menu-mng-v5-mockup.html @@ -0,0 +1,588 @@ + + + + + +INVYONE — 메뉴 관리 + + + + +
+ +
+
+ +
+ 관리자/시스템/메뉴 관리 +
+
+
+
+ + +
+
GP
+
+
+ +
+
+

메뉴 관리

+
트리에서 선택하면 우측에서 편집합니다.
+
+
+ +
+ + + +
+ +
+
+ 관리자 + + 시스템 + + 메뉴 관리 +
+
+

메뉴 관리

+ Active + 공용 * + L2 +
+
+ +
+ +
+
기본 정보
+
메뉴 이름과 다국어 키를 관리합니다.
+
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+
연결
+
메뉴 클릭 시 어떤 콘텐츠로 이동할지 결정합니다.
+
+ +
+
+ + + + +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
스코프 & 표시
+
어느 회사에서 보이고, 어느 위치에 나타날지 설정합니다.
+
+ +
+ +
하위 메뉴는 상위 스코프를 상속합니다.
+
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+
+
+ +
+
메타
+
+ +
mnu_00231
+
+
+ +
2026-04-12 14:23 · gbpark
+
+
+ +
+ +
+
+ + +
+
+ ● 저장되지 않음 + + +
+
+ +
+ +
+
+ + + +