From 7323a4b0d5f7567c1156a5aa507ad4c898ed410f Mon Sep 17 00:00:00 2001 From: 田源 <lastanimals@163.com> Date: 星期日, 04 二月 2024 12:23:41 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 103 insertions(+), 16 deletions(-) diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java index f5682d4..764c61d 100644 --- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java +++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java @@ -21,18 +21,17 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.vci.ubcs.code.feign.ICodeClassifyClient; import com.vci.ubcs.starter.util.MybatisParameterUtil; import com.vci.ubcs.starter.web.util.VciBaseUtil; import com.vci.ubcs.system.cache.NacosConfigCache; import com.vci.ubcs.system.cache.SysCache; import com.vci.ubcs.system.dto.MenuDTO; import com.vci.ubcs.system.entity.*; +import com.vci.ubcs.system.mapper.ClassifyAuthMapper; +import com.vci.ubcs.system.service.*; import com.vci.ubcs.system.vo.MenuVO; import com.vci.ubcs.system.mapper.MenuMapper; -import com.vci.ubcs.system.service.IMenuService; -import com.vci.ubcs.system.service.IRoleMenuService; -import com.vci.ubcs.system.service.IRoleScopeService; -import com.vci.ubcs.system.service.ITopMenuSettingService; import com.vci.ubcs.system.wrapper.MenuWrapper; import lombok.AllArgsConstructor; import org.springblade.core.log.exception.ServiceException; @@ -70,6 +69,8 @@ private final IRoleScopeService roleScopeService; private final MenuMapper menuMapper; private final ITopMenuSettingService topMenuSettingService; + private final ICodeClassifyClient codeClassifyClient; + private final ClassifyAuthMapper classifyAuthMapper; private final static String PARENT_ID = "parentId"; private final static Integer MENU_CATEGORY = 1; @@ -98,12 +99,11 @@ List<Menu> allMenus = baseMapper.allMenu(); List<Menu> roleMenus; // 瓒呯骇绠$悊鍛樺苟涓斾笉鏄《閮ㄨ彍鍗曡姹傚垯杩斿洖鍏ㄩ儴鑿滃崟 - // if (AuthUtil.isAdministrator() && Func.isEmpty(topMenuId)) { if (VciBaseUtil.checkAdminTenant() && Func.isEmpty(topMenuId)) { roleMenus = allMenus; } // 闈炶秴绾х鐞嗗憳骞朵笖涓嶆槸椤堕儴鑿滃崟璇锋眰鍒欒繑鍥炲搴旇鑹叉潈闄愯彍鍗� - else if (!AuthUtil.isAdministrator() && Func.isEmpty(topMenuId)) { + else if (!VciBaseUtil.checkAdminTenant() && Func.isEmpty(topMenuId)) { roleMenus = tenantPackageMenu(baseMapper.roleMenuByRoleId(Func.toLongList(roleId))); } // 椤堕儴鑿滃崟璇锋眰杩斿洖瀵瑰簲瑙掕壊鏉冮檺鑿滃崟 @@ -228,6 +228,7 @@ * 绉熸埛鑿滃崟鏉冮檺鑷畾涔夌瓫閫� */ private List<Menu> tenantPackageMenu(List<Menu> menu) { + // 绉熸埛鍖呴厤缃煡璇� TenantPackage tenantPackage = SysCache.getTenantPackage(AuthUtil.getTenantId()); if (Func.isNotEmpty(tenantPackage) && tenantPackage.getId() > 0L) { List<Long> menuIds = Func.toLongList(tenantPackage.getMenuId()); @@ -324,18 +325,75 @@ } /** - * 鑾峰彇鑿滃崟涓嬮潰鐨勬寜閽� + * 鑾峰彇鑿滃崟涓嬮潰鐨勬寜閽紝鍒贡璋冪敤锛岃繖涓柟娉曟槸閽堝涓绘暟鎹鐞嗘寜閽煡璇㈢殑 + * @param classifyId * @param btmType 涓氬姟绫诲瀷 - * @return List<Menu> + * @param authType + * @return */ @Override //@Cacheable(cacheNames = MENU_CACHE, key = "'auth:menuButton:'+ #btmType +':'+ #userId ") - public List<Menu> getMenuButtonByType(String btmType,Long userId) { - List<String> roleIds = null; - if(!VciBaseUtil.checkAdminTenant()){ - roleIds = Arrays.asList(AuthUtil.getUser().getRoleId().split(",")); + public List<Menu> getMenuButtonByType(String classifyId,String btmType,String authType) { + // baseMapper.selectMenuChildByBtnType(btmType,roleIds); + if(Func.isBlank(classifyId)){ + throw new ServiceException("蹇呬紶鍙傛暟鍒嗙被oid涓嶈兘涓虹┖锛�"); } - return baseMapper.selectMenuChildByBtnType(btmType,roleIds); + //鏌ヨ鍒嗙被鑺傜偣鐨勬墍鏈夌埗绾ц妭鐐� + R<List<String>> listR = codeClassifyClient.selectAllParentOid(classifyId); + if (!listR.isSuccess() && !listR.getData().isEmpty()) { + throw new ServiceException("鑾峰彇鍒嗙被淇℃伅澶辫触锛�"); + } + // 杩斿洖鐨勫垎绫籵id鏄綋鍓嶈妭鐐逛负绗竴涓紝鍚庨潰渚濇鏄粬鐨勪笂灞傝妭鐐� + List<String> classifyOidList = listR.getData(); + final List<String> roleIds = Func.toStrList(",",AuthUtil.getUser().getRoleId()); + // 鍏堟煡璇㈡寜閽甶d鍒楄〃 + LambdaQueryWrapper<ClassifyAuth> wrapper = Wrappers.<ClassifyAuth>query() + .lambda().eq(ClassifyAuth::getClassifyId, classifyId) + .eq(ClassifyAuth::getAuthType,authType) + .in(ClassifyAuth::getRoleId, roleIds); + List<ClassifyAuth> classifyAuths = classifyAuthMapper.selectList(wrapper); + //濡傛灉褰撳墠鍒嗙被娌℃湁鎵惧埌鎺堟潈閰嶇疆锛屽氨渚濇浠庡綋鍓嶈妭鐐瑰線涓婂眰鑺傜偣鎵炬巿鏉冮厤缃紝鎵惧埌浜嗗氨鍋滄锛屾病鎵惧埌灏变竴鐩存壘鍒版渶鍚� + if(classifyAuths.isEmpty()){ + // 涓嬫爣浠�1寮�濮嬪洜涓哄綋鍓嶈妭鐐�0宸茬粡鏌ヨ杩� + for (int i = 1; i < classifyOidList.size(); i++) { + classifyAuths = classifyAuthMapper.selectList( + Wrappers.<ClassifyAuth>query() + .lambda().eq(ClassifyAuth::getClassifyId, classifyOidList.get(i)) + .eq(ClassifyAuth::getAuthType,authType) + .in(ClassifyAuth::getRoleId, roleIds) + ); + if(!classifyAuths.isEmpty()){ + break; + } + } + } + //鍑虹幇浜嗗鏉℃暟鎹� + if(classifyAuths.size()>1){ + // 鏍¢獙鏄惁瀛樺湪閿欒鏁版嵁锛屽悓涓�涓鑹插拰鍚屼竴涓垎绫籭d瀛樺湪澶氭潯鎺堟潈璁板綍 + List<ClassifyAuth> finalClassifyAuths = classifyAuths; + boolean hasDuplicate = classifyAuths.stream() + .anyMatch(auth1 -> finalClassifyAuths.stream() + .filter(auth2 -> auth1 != auth2) + .anyMatch(auth2 -> auth1.getRoleId().equals(auth2.getRoleId()) && auth1.getClassifyId().equals(auth2.getClassifyId()))); + if (hasDuplicate) { + throw new ServiceException("瑙掕壊鍜屽垎绫婚厤缃瓨鍦ㄥ鏉¤褰曪紝璇疯仈绯荤鐞嗕汉鍛樻竻鐞嗛敊璇厤缃紒"); + } + } + // 鏄惁涓鸿秴绠� + Boolean isAdmin = VciBaseUtil.checkAdminTenant(); + // 鏈厤缃寜閽潈闄� + if(!isAdmin && (classifyAuths.isEmpty() || Func.isBlank(classifyAuths.get(0).getButtonIds()))){ + return new ArrayList<>(); + } + List<String> ids = new ArrayList<>(); + // 濡傛灉涓嶆槸瓒呯鐢ㄦ埛 + if(!isAdmin){ + String concatenatedButtonIds = classifyAuths.stream() + .map(ClassifyAuth::getButtonIds) // 鑾峰彇姣忎釜classifyAuths瀵硅薄鐨刡uttonIds + .collect(Collectors.joining(",")); // 鐢ㄩ�楀彿鍒嗛殧鎷兼帴鎴愪竴涓瓧绗︿覆 + ids.addAll(Arrays.asList(concatenatedButtonIds.split(","))); + } + return this.getMenuListByCode(ids,btmType,roleIds); } /** @@ -353,7 +411,7 @@ LambdaQueryWrapper<Menu> wrapper = Wrappers.<Menu>query() .lambda() .in(Menu::getCode, codes) - .eq(Menu::getIsDeleted,0) /*鏈鍒犻櫎*/ + .eq(Menu::getIsDeleted,BladeConstant.DB_NOT_DELETED) /*鏈鍒犻櫎*/ .eq(Menu::getCategory,1) /*鑿滃崟绫诲瀷涓嶈兘涓烘寜閽�*/ .orderByAsc(Menu::getCode); /*鏍规嵁code鎺掑簭涓巆lassify鐨刡tmtypeid瀵瑰簲*/ // 瓒呯涓嶇敤鏍规嵁瑙掕壊鏉ユ煡璇� @@ -381,8 +439,7 @@ */ @Override public List<Menu> getButtonByParentCode(String code) { - List<Menu> buttonList = menuMapper.getButtonByParentCode(code); - return buttonList; + return menuMapper.getButtonsByRoleIdAndCode(null,code); } /** @@ -441,4 +498,34 @@ return this.saveBatch(newButtons) ? R.success("鎸夐挳鍏嬮殕鎴愬姛锛�"):R.fail("鎸夐挳鍏嬮殕澶辫触锛�"); } + /** + * 鏍规嵁涓婚敭鑾峰彇鑿滃崟淇℃伅 + * @param ids + * @param menuCode + * @param roleIds + * @return + */ + @Override + public List<Menu> getMenuListByCode(List<String> ids,String menuCode,List<String> roleIds){ + List<Menu> menuButtonList = null; + if(VciBaseUtil.checkAdminTenant()){ + // 姝e父鎯呭喌涓嬫潵璇磋繖涓笉瀛樺湪涓虹┖鐨勬儏鍐� + // 鏌ヨ璇ヨ彍鍗曚笅鐨勬墍鏈夋寜閽� + menuButtonList = menuMapper.getButtonByIdsOrByParentCode(null, menuCode, null); + }else { + menuButtonList = menuMapper.getButtonByIdsOrByParentCode(roleIds,null,ids); + } + return menuButtonList; + } + + /** + * 鏍规嵁瑙掕壊id鑾峰彇宸叉巿鏉冪殑鎸夐挳淇℃伅 + * @param roleId + * @return + */ + @Override + public List<Menu> getButtonsByRoleId(String roleId, String menuCode) { + return menuMapper.getButtonsByRoleIdAndCode(roleId,menuCode); + } + } -- Gitblit v1.9.3