diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java index 49fbbf1..2b0b10c 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ICoreMemTreeService.java @@ -1,5 +1,6 @@ package cn.estsh.i3plus.core.api.iservice.busi; +import cn.estsh.i3plus.core.api.iservice.dto.SysMenuDTO; import cn.estsh.i3plus.pojo.model.platform.CommonTreeModel; import cn.estsh.i3plus.pojo.platform.bean.*; import io.swagger.annotations.ApiOperation; @@ -160,7 +161,8 @@ public interface ICoreMemTreeService { @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 查询功能树") List packTreeSysMenuByUserId(Long userId); - + @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 查询功能树") + public List packTreeDingSysMenuByUserId(Long userId); /** * 根据用户ID 和 节点ID 查询功能树 * @param userId @@ -170,12 +172,19 @@ public interface ICoreMemTreeService { @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 和 节点ID 查询功能树") List packTreeSysMenuByUserIdAndParentId(Long userId,Long parentId); + @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 和 节点ID 查询功能树") + List packTreeDingSysMenuByUserIdAndParentId(Long userId,Long parentId); + @ApiOperation(value = "查询功能子节点",notes = "根据父节点ID 和 菜单类型 查询功能树") List packTreeSysMenuByParentIdAndMenuType(List list,Long parentId,Integer menuType); @ApiOperation(value = "查询功能子节点",notes = "根据用户ID 查询功能树") List packTreeSysMenu(); + @ApiOperation(value = "查询功能子节点",notes = "根据父节点ID 和 菜单类型 查询功能树") + List packTreeToDto(List list); + + /********************************************* End SysMenu Tree *********************************************/ } diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/dto/SysMenuDTO.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/dto/SysMenuDTO.java new file mode 100644 index 0000000..1b7068f --- /dev/null +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/dto/SysMenuDTO.java @@ -0,0 +1,55 @@ +package cn.estsh.i3plus.core.api.iservice.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @Description : 对外菜单dto + * @Reference : + * @Author : zhangxw + * @CreateDate :2022/7/23 0023 + **/ +@Data +public class SysMenuDTO implements Serializable { + + private static final long serialVersionUID = -4365785452541938586L; + /** + * 菜单id + */ + private long id; + /** + * 父菜单id + */ + private long parentId; + /** + * 组织编码 + */ + private String organizeCode; + /** + * 菜单code + */ + private String menuCode; + /** + * 菜单名称 + */ + private String name; + /** + * 父类菜单名称 + */ + private String parentNameRdd; + /** + * 菜单排序id + */ + private Integer menuSort; + /** + * url路径 + */ + private String menuUrl; + /** + * 子菜单 + */ + private List childList; + +} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java index dc17295..a6d33b7 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java @@ -4,6 +4,7 @@ import cn.estsh.i3plus.core.api.iservice.base.ISynchronizedService; import cn.estsh.i3plus.core.api.iservice.base.ISystemInitService; import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginStrategyService; import cn.estsh.i3plus.core.api.iservice.busi.*; +import cn.estsh.i3plus.core.api.iservice.dto.SysMenuDTO; import cn.estsh.i3plus.core.apiservice.controller.busi.*; import cn.estsh.i3plus.core.apiservice.util.MailUtil; import cn.estsh.i3plus.core.apiservice.util.SysUserPasswordUtil; @@ -62,13 +63,15 @@ import com.google.common.cache.CacheBuilder; import com.taobao.api.ApiException; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jodd.util.StringUtil; +import lombok.val; +import org.apache.commons.collections.map.HashedMap; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; @@ -79,6 +82,7 @@ import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.BiFunction; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @Description : @@ -169,6 +173,13 @@ public class WhiteController extends CoreBaseController { @Autowired private SysFileController sysFileController; + @Autowired + private ICoreMemTreeService memTreeService; + + + @Value(value = "${filter.ding.menu.parent.id}") + private Long filterDingPmcParentMenuId; + private Cache unsavedLocaleResSwitch = CacheBuilder.newBuilder() .maximumSize(1) .expireAfterWrite(1, TimeUnit.MINUTES) @@ -191,6 +202,7 @@ public class WhiteController extends CoreBaseController { @ApiOperation(value = "查询可用语言", notes = "查询可用语言") public ResultBean getSystemInfo() { try { + LOGGER.info("调用了/system-info"); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(configService.findSystemInfoConfig()); } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); @@ -1328,6 +1340,7 @@ public class WhiteController extends CoreBaseController { } } + /** * 获取accessToken * @@ -1373,7 +1386,6 @@ public class WhiteController extends CoreBaseController { return ""; } - private OapiV2UserGetResponse getDingTalkUserInfo(String dingTalkTmpAuthCode) { String dingTalkUrl = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_URL); String dingTalkAppKey = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_APP_KEY); @@ -1407,4 +1419,111 @@ public class WhiteController extends CoreBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + /** + * 获取登录用户功能权限信息 + * + * @param dingTalkTmpAuthCode + * @return + */ + @GetMapping(value = "/find-menu-list") + @ApiOperation(value = "获取登录用户功能权限信息", notes = "获取首页权限信息") + public ResultBean findHomeList(HttpServletRequest request,@RequestParam String dingTalkTmpAuthCode, @RequestParam(required = false)String mobile) { + try { + if (Objects.isNull(dingTalkTmpAuthCode)) { + return ResultBean.fail("操作失败").setCode(ResourceEnumUtil.MESSAGE.FAIL.getCode()).setErrorMsg("授权码不能为空"); + } + // 根据dingTalkTmpAuthCode 获取 平台的用户信息 + SysUser sysUser = getUserInfo(dingTalkTmpAuthCode); + if (sysUser == null && !Objects.isNull(mobile)) { + LOGGER.info("code未查询到用默认"); + sysUser = userService.getSysUserByPhone(mobile); + } + + if(sysUser == null) { + return ResultBean.fail("操作失败").setCode(ResourceEnumUtil.MESSAGE.FAIL.getCode()).setErrorMsg("用户信息不存在"); + } + Long startTime = System.currentTimeMillis(); + List menuList = memTreeService.packTreeDingSysMenuByUserId(sysUser.getId()); + Long menuSelectTime = System.currentTimeMillis(); + LOGGER.info("第一段耗时:{}", menuSelectTime - startTime); + List syslist = memTreeService.packTreeSysMenuByParentIdAndMenuType(menuList, filterDingPmcParentMenuId , CommonEnumUtil.METHOD_LEVEL.PLUGIN.getValue()); + LOGGER.info("第二段耗时:{}", System.currentTimeMillis() - menuSelectTime); + + List resList = memTreeService.packTreeToDto(syslist); + + if (resList != null && resList.size() > 0) { + // 翻译第一级 + resList.forEach(menu -> menu.setName(LocaleUtils.getLocaleRes("MENU_" + menu.getName()))); + // 内存排序 Sort 降序 code 升序 + resList.sort(Comparator.comparing(SysMenuDTO::getMenuSort).reversed().thenComparing(SysMenuDTO::getMenuCode)); + } + // 获取工厂信息 + List sysUserOrganizeList = personnelService.findSysUserOrganize(sysUser.getId()); + + // 遍历工厂信息,并且把主工厂放在首位 + for (int i = 0; i < sysUserOrganizeList.size(); i++) { + if (Objects.equals(sysUserOrganizeList.get(i).getId(), sysUser.getOrganizeId())) { + Collections.swap(sysUserOrganizeList, i, 0); + break; + } + } + Map map = new HashedMap(); + map.put("sysUserOrganizeList", sysUserOrganizeList); + + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(resList).setResultMap(map); + + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + /** + * 获取用户信息 + * getUserInfo + * @param dingTalkTmpAuthCode + * @return + */ + private SysUser getUserInfo(String dingTalkTmpAuthCode) { + + SysUser sysUser = null; + + String dingtalk_url = "DINGTALK_MENU_URL"; + String dingtalk_app_key = "DINGTALK_MENU_APP_KEY"; + String dingtalk_app_secret = "DINGTALK_MENU_APP_SECRET"; + String dingtalk_white_list = "DINGTALK_MENU_WHITE_LIST"; + + String dingTalkUrl = RedisCacheTool.getSysConfigStrVal(dingtalk_url); + String dingTalkAppKey = RedisCacheTool.getSysConfigStrVal(dingtalk_app_key); + String dingTalkAppSecret = RedisCacheTool.getSysConfigStrVal(dingtalk_app_secret); + String dingTalkWhiteList = RedisCacheTool.getSysConfigStrVal(dingtalk_white_list); + + + + if (StringUtils.isEmpty(dingTalkUrl) || + StringUtils.isEmpty(dingTalkAppKey) || + StringUtils.isEmpty(dingTalkAppSecret) || + StringUtils.isEmpty(dingTalkWhiteList)) { + //todo errorcode 需要修改 + ImppExceptionBuilder.newInstance().setErrorCode("0000431").setErrorDetail("访问钉钉的系统参数缺失,请在平台的系统参数中进行配置"); + + } + Optional userInfo = + dingTalkService.getUserInfo(dingTalkUrl, dingTalkAppKey, dingTalkAppSecret, dingTalkTmpAuthCode); + if (userInfo.isPresent()) { + String mobile = userInfo.get().getResult().getMobile(); + if (StringUtils.isEmpty(mobile)) { + ImppExceptionBuilder.newInstance().setErrorCode("0000431").setErrorDetail("用户并未在钉钉中设置手机号 或 钉钉接口权限不足无法获取到手机号"); + } + if (!Arrays.asList(dingTalkWhiteList.split(",")).contains(mobile)) { + ImppExceptionBuilder.newInstance().setErrorCode("0000431").setErrorDetail("对指定手机号允许,权限不足,请联系管理员"); + } + sysUser = userService.getSysUserByPhone(mobile); + if (sysUser == null) { + ImppExceptionBuilder.newInstance().setErrorCode("0000431").setErrorDetail("未根据用户手机在平台中找到相应记录 钉钉获取的手机号为\" + mobile"); + } + } + return sysUser; + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java index 096912b..2d999d8 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/CoreMemTreeService.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; import cn.estsh.i3plus.core.api.iservice.busi.*; +import cn.estsh.i3plus.core.api.iservice.dto.SysMenuDTO; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ModelEnumUtil; import cn.estsh.i3plus.pojo.model.platform.CommonTreeModel; @@ -8,10 +9,13 @@ import cn.estsh.i3plus.pojo.platform.bean.*; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -40,6 +44,16 @@ public class CoreMemTreeService implements ICoreMemTreeService { private ISysOrganizeService organizeService; @Autowired private ISysDepartmentService departmentService; + /** + * PMC 菜单id列表 + */ + @Value(value = "${filter.ding.menu.id}") + private String filterDingPmcMenuIds; + /** + * PMC 最大父类id + */ + @Value(value = "${filter.ding.menu.parent.id}") + private String filterDingPmcParentMenuId; @Override public List packTreeSysPosition(List list, Long parentId) { @@ -627,6 +641,11 @@ public class CoreMemTreeService implements ICoreMemTreeService { return packTreeSysMenuByUserIdAndParentId(userId, CommonEnumUtil.PARENT.DEFAULT.getValue()); } + @Override + public List packTreeDingSysMenuByUserId(Long userId) { + return packTreeDingSysMenuByUserIdAndParentId(userId, Long.parseLong(filterDingPmcParentMenuId)); + } + /** * 根据用户ID 和 节点ID 查询功能树 * @param userId @@ -648,7 +667,37 @@ public class CoreMemTreeService implements ICoreMemTreeService { LOGGER.info("查询角色关联菜单:{}",refRoleMenuTime - roleTime); if (refRoleMenuList != null && refRoleMenuList.size() > 0) { List menuList = menuService.findAll(); + // 构建菜单树 + List menuRootTree = packTreeSysMenu(menuList, parentId); + // + return packTreeSysMenuBySysRefRoleMenu(menuRootTree, refRoleMenuList); + } + } + return Collections.emptyList(); + } + @Override + public List packTreeDingSysMenuByUserIdAndParentId(Long userId, Long parentId) { + // 查询用户关联角色 + long startTime = System.currentTimeMillis(); + List roleList = personnelService.findSysRefUserRole(userId); + long roleTime = System.currentTimeMillis(); + LOGGER.info("查询用户所关联的角色信息耗时:{}",roleTime - startTime); + + if (roleList != null && roleList.size() > 0) { + // 查询角色关联菜单 + List refRoleMenuList = personnelService.findSysRefRoleMenuByRefUserRole(roleList); + // pdc 菜单 + List includeMenuId = Arrays.asList(filterDingPmcMenuIds.split(",")).stream().map(Long :: parseLong).collect(Collectors.toList()); + + + long refRoleMenuTime = System.currentTimeMillis(); + LOGGER.info("查询角色关联菜单:{}",refRoleMenuTime - roleTime); + List menuIdList = refRoleMenuList.stream().map(SysRefRoleMenu::getMenuId).collect(Collectors.toList()); + + includeMenuId.retainAll(menuIdList); + if (refRoleMenuList != null && refRoleMenuList.size() > 0) { + List menuList = menuService.findByIdList(includeMenuId); // 构建菜单树 List menuRootTree = packTreeSysMenu(menuList, parentId); // @@ -682,6 +731,22 @@ public class CoreMemTreeService implements ICoreMemTreeService { return packTreeSysMenu(menuList, CommonEnumUtil.PARENT.DEFAULT.getValue()); } + @Override + public List packTreeToDto(List list) { + + List sysMenuDTOList = new ArrayList<>(); + + list.stream().forEach(sysMenu -> { + SysMenuDTO sysMenuDTO = new SysMenuDTO(); + BeanUtils.copyProperties(sysMenu, sysMenuDTO); + if (CollectionUtils.isNotEmpty(sysMenu.getChildList())) { + sysMenuDTO.setChildList(packTreeToDto(sysMenu.getChildList())); + } + sysMenuDTOList.add(sysMenuDTO); + }); + return sysMenuDTOList; + } + /********************************************* End SysMenu Tree *********************************************/ } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java index b6b3bfd..dabcf6c 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java @@ -15,6 +15,7 @@ import cn.estsh.impp.framework.boot.util.*; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authc.IncorrectCredentialsException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties b/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties index 0398aab..81cd07f 100644 --- a/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties +++ b/modules/i3plus-core-apiservice/src/main/resources/application-dev.properties @@ -60,14 +60,14 @@ spring.datasource.hikari.connection-timeout=30000 ##\u4E3B\u6570\u636E\u6E90\uFF0C\u8BFB\u5199 #impp.write.datasource.type=com.zaxxer.hikari.HikariDataSource impp.write.datasource.driver-class-name=com.mysql.jdbc.Driver -impp.write.datasource.jdbc-url=jdbc:mysql://192.168.1.55:3306/impp_i3_core?autoReconnect=true&useSSL=false&characterEncoding=utf-8 +impp.write.datasource.jdbc-url=jdbc:mysql://192.168.1.240:3306/impp_i3_core?autoReconnect=true&useSSL=false&characterEncoding=utf-8 impp.write.datasource.username=impp_i3_core_user impp.write.datasource.password=impp_i3_core_pwd ##\u8F85\u6570\u636E\u6E90\uFF0C\u53EA\u8BFB #impp.read.datasource.type=com.zaxxer.hikari.HikariDataSource impp.read.datasource.driver-class-name=com.mysql.jdbc.Driver -impp.read.datasource.jdbc-url=jdbc:mysql://192.168.1.55:3306/impp_i3_core?autoReconnect=true&useSSL=false&characterEncoding=utf-8 +impp.read.datasource.jdbc-url=jdbc:mysql://192.168.1.240:3306/impp_i3_core?autoReconnect=true&useSSL=false&characterEncoding=utf-8 impp.read.datasource.username=impp_i3_core_user impp.read.datasource.password=impp_i3_core_pwd @@ -92,7 +92,7 @@ spring.jpa.properties.hibernate.hbm2ddl.auto=update ##############\u5B9A\u65F6\u4EFB\u52A1\u6301\u4E45\u5316############## impp.schedule.open=true impp.schedule.datasource.driver-class-name=com.mysql.jdbc.Driver -impp.schedule.datasource.jdbc-url=jdbc:mysql://192.168.1.55:3306/impp_i3_schedule?autoReconnect=true&useSSL=false&characterEncoding=utf-8 +impp.schedule.datasource.jdbc-url=jdbc:mysql://192.168.1.240:3306/impp_i3_schedule?autoReconnect=true&useSSL=false&characterEncoding=utf-8 impp.schedule.datasource.username=impp_i3_schedule_user impp.schedule.datasource.password=impp_i3_schedule_pwd impp.schedule.datasource.max-connections=20 diff --git a/modules/i3plus-core-apiservice/src/main/resources/application.properties b/modules/i3plus-core-apiservice/src/main/resources/application.properties index 0ffe4f2..7ed4297 100644 --- a/modules/i3plus-core-apiservice/src/main/resources/application.properties +++ b/modules/i3plus-core-apiservice/src/main/resources/application.properties @@ -1,5 +1,5 @@ #\u4F7F\u7528\u914D\u7F6E -spring.profiles.active=test +spring.profiles.active=docker #\u9879\u76EE\u63CF\u8FF0\u4FE1\u606F\uFF08swagger\u4E2D\u663E\u5F0F\uFF09\uFF0C\u4E2D\u6587\u4F7F\u7528uncode\u8F6C\u7801 desc.application.name=\u6838\u5FC3\u7BA1\u7406\u540E\u53F0 @@ -77,3 +77,6 @@ redis.session.db=1 #\u7CFB\u7EDF\u5168\u5C40\u7F13\u5B58\u5E93\uFF0C\u5B58\u653E\u5E73\u53F0\u6838\u5FC3\u6570\u636E\u7F13\u5B58 redis.core.db=2 wms.redis.open=true + +filter.ding.menu.id = 112000000,102081502,112000100,112000200,112000300,112000400,112000500,112000501,112000520,112000600,112000700,112000701,112000702,112000800,112000900,112001000,112001100 +filter.ding.menu.parent.id = 100000000