From d54fbc9d4f8981fa0f7f613b33a28a8cd4f764ea Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期日, 25 十月 2026 16:29:53 +0800
Subject: [PATCH] feat(system): 优化用户搜索功能并完善ERP和MES模块验证逻辑

---
 yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java |   65 ++++++++++++++++++++++++++++++++
 1 files changed, 65 insertions(+), 0 deletions(-)

diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java
index b3b2177..9854815 100644
--- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java
+++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java
@@ -4,7 +4,11 @@
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuImportExcelVO;
+import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuImportReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuImportRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuSaveVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
@@ -27,6 +31,7 @@
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
 import static cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO.ID_ROOT;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
 
@@ -208,6 +213,66 @@
         return menuMapper.selectByIds(ids);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, allEntries = true)
+    public MenuImportRespVO importMenuList(List<MenuImportExcelVO> importMenus, MenuImportReqVO importReqVO) {
+        importMenus = filterList(importMenus, item -> StrUtil.isNotBlank(item.getName()));
+        if (CollUtil.isEmpty(importMenus)) {
+            throw exception(MENU_IMPORT_LIST_IS_EMPTY);
+        }
+        MenuImportRespVO respVO = MenuImportRespVO.builder()
+                .createMenuNames(new ArrayList<>())
+                .updateMenuNames(new ArrayList<>())
+                .failureMenuNames(new LinkedHashMap<>())
+                .build();
+        importMenus.forEach(importMenu -> {
+            try {
+                // 1. 瑙f瀽鐖惰彍鍗�
+                Long parentId = ID_ROOT;
+                if (StrUtil.isNotBlank(importMenu.getParentName())) {
+                    MenuDO parent = menuMapper.selectByName(importMenu.getParentName());
+                    if (parent == null) {
+                        throw exception(MENU_PARENT_NOT_EXISTS);
+                    }
+                    parentId = parent.getId();
+                }
+                // 2. 鏍¢獙鐖惰彍鍗曞悎娉曪紙瀛樺湪 + 鐩綍/鑿滃崟锛�
+                validateParentMenu(parentId, null);
+                // 3. 鑿滃崟绫诲瀷蹇呭~
+                if (importMenu.getType() == null) {
+                    throw exception(MENU_TYPE_NOT_EXISTS);
+                }
+                // 4. 鍒ゆ柇鏄惁瀛樺湪锛堢浉鍚岀埗鑿滃崟 + 鍚嶇О锛�
+                MenuDO existMenu = menuMapper.selectByParentIdAndName(parentId, importMenu.getName());
+                if (existMenu == null) {
+                    // 4.1 鏂板
+                    validateMenuComponentName(importMenu.getComponentName(), null);
+                    MenuDO menu = BeanUtils.toBean(importMenu, MenuDO.class).setParentId(parentId);
+                    initMenuProperty(menu);
+                    menuMapper.insert(menu);
+                    respVO.getCreateMenuNames().add(importMenu.getName());
+                    return;
+                }
+                // 4.2 宸插瓨鍦紝鍒ゆ柇鏄惁鍏佽鏇存柊
+                if (!importReqVO.getUpdateSupport()) {
+                    respVO.getFailureMenuNames().put(importMenu.getName(),
+                            StrUtil.format(MENU_NAME_DUPLICATE.getMsg(), importMenu.getName()));
+                    return;
+                }
+                validateMenuComponentName(importMenu.getComponentName(), existMenu.getId());
+                MenuDO updateMenu = BeanUtils.toBean(importMenu, MenuDO.class)
+                        .setId(existMenu.getId()).setParentId(parentId);
+                initMenuProperty(updateMenu);
+                menuMapper.updateById(updateMenu);
+                respVO.getUpdateMenuNames().add(importMenu.getName());
+            } catch (ServiceException ex) {
+                respVO.getFailureMenuNames().put(importMenu.getName(), ex.getMessage());
+            }
+        });
+        return respVO;
+    }
+
     /**
      * 鏍¢獙鐖惰彍鍗曟槸鍚﹀悎娉�
      * <p>

--
Gitblit v1.9.3