Przeglądaj źródła

性能优化,新增部分方法从缓存获取逻辑

zhulu 11 miesięcy temu
rodzic
commit
0a2fe241c5
21 zmienionych plików z 493 dodań i 38 usunięć
  1. 2 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteUserService.java
  2. 57 2
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/CacheConstants.java
  3. 23 4
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillTaskServiceImpl.java
  4. 13 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/impl/CoreIntroduceLetterServiceImpl.java
  5. 15 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/question/service/impl/QuestionServiceImpl.java
  6. 11 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/weather/service/impl/WeatherWarningServiceImpl.java
  7. 93 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/CacheController.java
  8. 20 2
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysDeptController.java
  9. 1 1
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysMenuController.java
  10. 4 1
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysOrgController.java
  11. 31 8
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysUserController.java
  12. 11 4
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysUserRoleController.java
  13. 3 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysMenuService.java
  14. 5 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysUserService.java
  15. 59 5
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysDeptServiceImpl.java
  16. 22 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysMenuServiceImpl.java
  17. 9 2
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysOrgExtendServiceImpl.java
  18. 16 1
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysOrgServiceImpl.java
  19. 11 1
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysRoleServiceImpl.java
  20. 22 1
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysUserRoleServiceImpl.java
  21. 65 3
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysUserServiceImpl.java

+ 2 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteUserService.java

@@ -11,6 +11,7 @@ import com.xunmei.system.api.domain.SysUser;
 import com.xunmei.system.api.factory.RemoteUserFallbackFactory;
 import com.xunmei.system.api.model.LoginUser;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
@@ -64,6 +65,7 @@ public interface RemoteUserService {
      * @return
      */
     @PostMapping("/user/userLoginInfo")
+    @Async
     R<Boolean> userLoginInfo(@RequestParam("id") Long id,@RequestParam("loginTime") Date loginTime,@RequestParam("loginIp") String loginIp,@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 
     @GetMapping("/user/allUserList")

+ 57 - 2
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/CacheConstants.java

@@ -8,9 +8,9 @@ package com.xunmei.common.core.constant;
 public class CacheConstants
 {
     /**
-     * 缓存有效期,默认720(分钟)
+     * 缓存有效期,默认480(分钟) ,8小时
      */
-    public final static long EXPIRATION = 1500;
+    public final static long EXPIRATION = 480;
 
     /**
      * 缓存刷新时间,默认120(分钟)
@@ -107,4 +107,59 @@ public class CacheConstants
      */
     public static final String CHANNEL_KEY = "channel_base_info_uid";
 
+    /**
+     * 内部调用获取 单机构、用户信息 缓存过期时间 (单位秒)
+     */
+    public static final int ORG_USER_EXPIRATION_TIME = 120*60;
+
+    /**
+     * 单机构缓存
+     */
+    public static final String ORG_CACHE_SINGLE_KEY = "sys_single_org:";
+
+    /**
+     * 机构树
+     */
+    public static final String DEPT_TREE_CACHE_SINGLE_KEY = "sys_dept_org_tree:";
+
+    /**
+     * 行社机构数据
+     */
+    public static final String DEPT_HANGSHE_TREE_CACHE_SINGLE_KEY = "sys_dept_hs_org_tree:";
+
+    /**
+     * 地区+行社+机构名称 的机构名称缓存
+     */
+    public static final String ORG_CACHE_CONCAT_NAME = "sys_concat_org_name:";
+
+    public static final String ORG_EXTEND_CACHE_CONCAT_INFO = "sys_org_extend_info:";
+
+    /**
+     * 用户角色ID缓存
+     */
+    public static final String USER_CACHE_ROLE_ID_KEY = "sys_single_user_roleId:";
+
+    /**
+     * 用户角色对象缓存
+     */
+    public static final String USER_CACHE_ROLE_OBJECT_KEY = "sys_single_user_role:";
+
+    /**
+     * 单用户信息缓存
+     */
+    public static final String USER_CACHE_SINGLE_KEY = "sys_single_user:";
+
+    /**
+     * user角色权限字段缓存
+     */
+    public static final String USER_ROLE_PERMISSION_CACHE_KEY = "sys_user_role_permission:";
+
+    /**
+     * 角色权限字段缓存
+     */
+    public static final String ROLE_PERMISSION_CACHE_KEY = "sys_role_permission:";
+
+//    public static final String CONFIG_CACHE_KEY = "sys_config:";
+
+
 }

+ 23 - 4
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillTaskServiceImpl.java

@@ -1362,8 +1362,17 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
 
     @Override
     public List<PanelListVo> selectCurUserTaskList(PanelListDto panelListDto) {
-        SysOrg sysOrg = RemoteCallHandlerExecutor.executeRemoteCall(() ->
-                orgService.selectSysOrgById(panelListDto.getOrgId(), SecurityConstants.FROM_SOURCE), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        SysOrg sysOrg =null;
+        String cacheKey=CacheConstants.ORG_CACHE_SINGLE_KEY+panelListDto.getOrgId().toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            sysOrg= RedisUtils.getCacheObject(cacheKey);
+        }
+        else {
+             sysOrg = RemoteCallHandlerExecutor.executeRemoteCall(() ->
+                    orgService.selectSysOrgById(panelListDto.getOrgId(), SecurityConstants.FROM_SOURCE), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        }
+
         panelListDto.setOrgType(sysOrg.getType());
         panelListDto.setOrgPath(sysOrg.getPath());
         List<Integer> statusList = new ArrayList<>();
@@ -1402,8 +1411,18 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
 
     @Override
     public List<PanelListVo> selectRecList(PanelListDto panelListDto) {
-        SysOrg sysOrg = RemoteCallHandlerExecutor.executeRemoteCall(() ->
-                orgService.selectSysOrgById(panelListDto.getOrgId(), SecurityConstants.FROM_SOURCE), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        SysOrg sysOrg =null;
+        String cacheKey=CacheConstants.ORG_CACHE_SINGLE_KEY+panelListDto.getOrgId().toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            sysOrg= RedisUtils.getCacheObject(cacheKey);
+        }
+        else {
+            sysOrg = RemoteCallHandlerExecutor.executeRemoteCall(() ->
+                    orgService.selectSysOrgById(panelListDto.getOrgId(), SecurityConstants.FROM_SOURCE), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        }
+//        SysOrg sysOrg = RemoteCallHandlerExecutor.executeRemoteCall(() ->
+//                orgService.selectSysOrgById(panelListDto.getOrgId(), SecurityConstants.FROM_SOURCE), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
         panelListDto.setOrgType(sysOrg.getType());
         panelListDto.setOrgPath(sysOrg.getPath());
         List<PanelListVo> waitRecTaskList = new ArrayList<>();

+ 13 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/impl/CoreIntroduceLetterServiceImpl.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.CacheConstants;
 import com.xunmei.common.core.constant.DictConstants;
 import com.xunmei.common.core.constant.ErrorMsgConstants;
 import com.xunmei.common.core.constant.SecurityConstants;
@@ -22,6 +23,7 @@ import com.xunmei.common.core.domain.panel.vo.WebPanelResult;
 import com.xunmei.common.core.util.BeanHelper;
 import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.DictUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.core.letter.mapper.CoreIntroduceLetterOutInRequestMapper;
@@ -345,7 +347,17 @@ public class CoreIntroduceLetterServiceImpl extends ServiceImpl<CoreIntroduceLet
     @Override
     public List<PanelListVo> selectToDoApproveListForAPP(PanelListDto panelListDto) {
         List<PanelListVo> resultList = new ArrayList<>();
-        SysRole role = roleService.getRoleByName("网点负责人", SecurityConstants.INNER);
+        SysRole tempRole =null;
+        List<SysRole> cacheRoleList = RedisUtils.getCacheList(CacheConstants.ROLE_CACHE_LIST_KEY);
+        if(ObjectUtil.isNotEmpty(cacheRoleList) && cacheRoleList.stream().anyMatch(x->"网点负责人".equals(x.getRoleName())))
+        {
+            tempRole= cacheRoleList.stream().filter(x->"网点负责人".equals(x.getRoleName())).findFirst().get();
+        }
+        else {
+            tempRole = roleService.getRoleByName("网点负责人", SecurityConstants.INNER);
+        }
+
+        SysRole role =tempRole;
         // 没有角色
         if (ObjectUtil.isEmpty(panelListDto.getRoleIdList())) {
             return resultList;

+ 15 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/question/service/impl/QuestionServiceImpl.java

@@ -12,7 +12,9 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.CacheConstants;
 import com.xunmei.common.core.constant.DictConstants;
+import com.xunmei.common.core.constant.ErrorMsgConstants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.panel.dto.PanelListDto;
 import com.xunmei.common.core.domain.panel.enums.PanelTypeEnums;
@@ -21,6 +23,7 @@ import com.xunmei.common.core.domain.panel.vo.WebPanelResult;
 import com.xunmei.common.core.exception.ServiceException;
 import com.xunmei.common.core.utils.EasyExcelStyleUtils;
 import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.DictUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.core.question.QuestionConfirmEnum;
@@ -42,6 +45,8 @@ import com.xunmei.core.safetyCheck.domain.CoreSafetyTaskDataRemarkimg;
 import com.xunmei.core.safetyCheck.service.ICoreSafetyTaskDataRemarkimgService;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.RemoteUserService;
+import com.xunmei.system.api.domain.SysOrg;
+import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
 import io.netty.util.internal.StringUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.BorderStyle;
@@ -465,7 +470,16 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
             List<PanelListVo> vos = list.stream().map(item -> {
                 PanelListVo vo = new PanelListVo();
                 vo.setId(item.getId());
-                vo.setOrgName( orgService.concatOrgName(item.getOrgId(),SecurityConstants.INNER));
+                String concatOrgName =null;
+                String cacheKey=CacheConstants.ORG_CACHE_CONCAT_NAME+item.getOrgId().toString();
+                if(RedisUtils.hasKey(cacheKey))
+                {
+                    concatOrgName= RedisUtils.getCacheObject(cacheKey);
+                }
+                else {
+                    concatOrgName =  orgService.concatOrgName(item.getOrgId(),SecurityConstants.INNER);
+                }
+                vo.setOrgName(concatOrgName);
                 vo.setEndTime(item.getReformDeadline());
                 vo.setTaskName(item.getQuestionDesc());
                 vo.setStartTime(item.getSubmitTime());

+ 11 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/weather/service/impl/WeatherWarningServiceImpl.java

@@ -11,6 +11,7 @@ import com.alibaba.fastjson.TypeReference;
 import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.CacheConstants;
 import com.xunmei.common.core.constant.ErrorMsgConstants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.constant.SystemParameterConstant;
@@ -21,6 +22,7 @@ import com.xunmei.common.core.domain.weather.vo.CityInfoVo;
 import com.xunmei.common.core.domain.weather.vo.SelectCityInfoVo;
 import com.xunmei.common.core.utils.KeyValue;
 import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.core.weather.mapper.WeatherWarningMapper;
 import com.xunmei.core.weather.service.IWeatherWarningService;
 import com.xunmei.core.weather.utils.HttpUtils;
@@ -177,7 +179,15 @@ public class WeatherWarningServiceImpl extends ServiceImpl<WeatherWarningMapper,
 
     @Override
     public List<WeatherWarning> getTheAreaWeather(Long orgId) {
-        SysOrgExtend orgExtend = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.selectSysOrgExtendById(orgId, SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        SysOrgExtend orgExtend =null;
+        String cacheKey= CacheConstants.ORG_EXTEND_CACHE_CONCAT_INFO+orgId.toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            orgExtend= RedisUtils.getCacheObject(cacheKey);
+        }
+        else {
+            orgExtend = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.selectSysOrgExtendById(orgId, SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        }
         List<WeatherWarning> list = null;
         if(ObjectUtil.isNotEmpty(orgExtend)){
             String key = "wearth_areaid_"+orgExtend.getWeatherAreaCode();

+ 93 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/CacheController.java

@@ -0,0 +1,93 @@
+package com.xunmei.system.controller;
+
+import com.xunmei.common.core.constant.CacheConstants;
+import com.xunmei.common.redis.utils.RedisUtils;
+import com.xunmei.system.service.ExportSqlService;
+import com.xunmei.system.service.ISysOrgService;
+import com.xunmei.system.service.ISysUserService;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+@Slf4j
+@Api(description = "中台", tags = {"清理缓存工具"})
+@RestController
+@RequestMapping("/cache")
+public class CacheController {
+
+    @Autowired
+    private ISysOrgService sysOrgService;
+
+    @Autowired
+    private ISysUserService userService;
+
+    @GetMapping("/clean/org")
+    public Object cleanOrgCache(){
+        try {
+            sysOrgService.clearOrgCache();
+            return "清理成功";
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @GetMapping("/clean/user")
+    public Object cleanUserCache(){
+        try {
+            userService.clearUserCache();
+            return "清理成功";
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @GetMapping("/clean/role")
+    public Object cleanRoleCache(){
+        try {
+            RedisUtils.deleteByPrefix(CacheConstants.ROLE_PERMISSION_CACHE_KEY);
+            RedisUtils.deleteByPrefix(CacheConstants.USER_ROLE_PERMISSION_CACHE_KEY);
+            return "清理成功";
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 清楚新增的所有缓存 (清除为优化性能 新增的缓存)
+     */
+    @GetMapping("/clean/all")
+    public Object cleanAllCache(){
+        try {
+            //用户
+            RedisUtils.deleteByPrefix(CacheConstants.USER_CACHE_SINGLE_KEY);
+            RedisUtils.deleteByPrefix(CacheConstants.USER_CACHE_ROLE_ID_KEY);
+            RedisUtils.deleteByPrefix(CacheConstants.USER_CACHE_ROLE_OBJECT_KEY);
+            RedisUtils.deleteByPrefix(CacheConstants.USER_ROLE_PERMISSION_CACHE_KEY);
+            //机构
+            RedisUtils.deleteByPrefix(CacheConstants.ORG_CACHE_SINGLE_KEY);
+            RedisUtils.deleteByPrefix(CacheConstants.ORG_CACHE_CONCAT_NAME);
+            RedisUtils.deleteByPrefix(CacheConstants.ORG_EXTEND_CACHE_CONCAT_INFO);
+            RedisUtils.deleteByPrefix(CacheConstants.DEPT_TREE_CACHE_SINGLE_KEY);
+            RedisUtils.deleteByPrefix(CacheConstants.DEPT_HANGSHE_TREE_CACHE_SINGLE_KEY);
+            //角色对应的权限字段
+            RedisUtils.deleteByPrefix(CacheConstants.ROLE_PERMISSION_CACHE_KEY);
+            return "清理成功";
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+
+
+
+
+
+}

+ 20 - 2
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysDeptController.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xunmei.common.core.constant.CacheConstants;
 import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.domain.OrgTreeReq;
 import com.xunmei.common.core.domain.OrgTreeResp;
@@ -14,6 +15,7 @@ import com.xunmei.common.core.web.controller.BaseController;
 import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.log.annotation.Log;
 import com.xunmei.common.log.enums.BusinessType;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.annotation.InnerAuth;
 import com.xunmei.common.security.annotation.RequiresPermissions;
 import com.xunmei.common.security.utils.SecurityUtils;
@@ -40,6 +42,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.net.URLEncoder;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Date;
@@ -334,7 +337,15 @@ public class SysDeptController extends BaseController {
 
     @GetMapping("/selectSysOrgById")
     public SysOrg selectSysOrgById(Long id) {
-        return orgService.getById(id);
+        String cacheKey=CacheConstants.ORG_CACHE_SINGLE_KEY+id.toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
+        SysOrg org =  orgService.getById(id);
+        RedisUtils.setCacheObject(cacheKey,org,Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
+        return org;
+
     }
 
     @GetMapping("/listByIds")
@@ -552,7 +563,14 @@ public class SysDeptController extends BaseController {
     @InnerAuth
     @GetMapping("/concatOrgName/{orgId}")
     String concatOrgName(@PathVariable("orgId") Long orgId){
-        return orgService.concatOrgName(orgId);
+        String cacheKey=CacheConstants.ORG_CACHE_CONCAT_NAME+orgId.toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
+        String concatOrgName =  orgService.concatOrgName(orgId);
+        RedisUtils.setCacheObject(cacheKey,concatOrgName,Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
+        return concatOrgName;
     }
 
     @GetMapping("/findDisableOrgAndClearData")

+ 1 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysMenuController.java

@@ -103,7 +103,7 @@ public class SysMenuController extends BaseController {
             return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
         }
         menu.setUpdateBy(SecurityUtils.getUsername());
-        //menuService.clearCacheMenu();
+        menuService.clearCacheMenu();
         return toAjax(menuService.updateMenu(menu));
     }
 

+ 4 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysOrgController.java

@@ -3,6 +3,7 @@ package com.xunmei.system.controller;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xunmei.common.core.constant.CacheConstants;
 import com.xunmei.common.core.domain.R;
 import com.xunmei.common.core.vo.IdNameVo;
 import com.xunmei.common.core.web.controller.BaseController;
@@ -10,6 +11,7 @@ import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.common.log.annotation.Log;
 import com.xunmei.common.log.enums.BusinessType;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.annotation.InnerAuth;
 import com.xunmei.common.security.annotation.RequiresPermissions;
 import com.xunmei.system.api.domain.SysOrg;
@@ -20,6 +22,7 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -131,7 +134,7 @@ public class SysOrgController extends BaseController {
     @InnerAuth
     @GetMapping("/{orgId}")
     public SysOrg selectSysOrgById(@PathVariable("orgId") Long orgId) {
-        return sysOrgService.getById(orgId);
+        return sysOrgService.selectSysOrgById(orgId);
     }
 
     /**

+ 31 - 8
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysUserController.java

@@ -7,6 +7,7 @@ import com.alibaba.excel.event.AnalysisEventListener;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.xunmei.common.core.domain.R;
 import com.xunmei.common.core.domain.message.domain.CoreAnnouncementNotificationToRole;
 import com.xunmei.common.core.domain.reminder.dto.CoreReminderUserQueryDto;
@@ -80,6 +81,9 @@ public class SysUserController extends BaseController {
     @Autowired
     private SysOrgMapper orgMapper;
 
+    @Autowired
+    private ISysOrgService sysOrgService;
+
     /**
      * 获取用户列表
      */
@@ -191,9 +195,11 @@ public class SysUserController extends BaseController {
     @GetMapping("getInfo")
     public AjaxResult getInfo() {
         SysUser user = userService.selectUserById(SecurityUtils.getUserId());
-        SysOrg org = orgMapper.selectOne(new LambdaQueryWrapper<SysOrg>()
-                .eq(SysOrg::getId, user.getOrgId())
-                .select(SysOrg::getType, SysOrg::getShortName, SysOrg::getPath));
+
+        SysOrg org = sysOrgService.selectSysOrgById(user.getOrgId());
+//        SysOrg org = orgMapper.selectOne(new LambdaQueryWrapper<SysOrg>()
+//                .eq(SysOrg::getId, user.getOrgId())
+//                .select(SysOrg::getType, SysOrg::getShortName, SysOrg::getPath));
         if (ObjectUtil.isNotEmpty(org)) {
             user.setOrgType(org.getType());
             user.setOrgShortName(org.getShortName());
@@ -364,6 +370,8 @@ public class SysUserController extends BaseController {
         }
 //        user.setOriginalOrgId(user.getOrgId());
         user.setUpdateBy(SecurityUtils.getUsername());
+        userService.clearUserCacheByUserId(user.getId());
+        userService.clearUserCacheByUserName(user.getUsername());
         return toAjax(userService.updateUser(user));
     }
 
@@ -393,6 +401,8 @@ public class SysUserController extends BaseController {
         user.setSalt(salt);
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword(), salt));
         user.setUpdateBy(SecurityUtils.getUsername());
+        userService.clearUserCacheByUserId(user.getId());
+        userService.clearUserCacheByUserName(user.getUsername());
         return toAjax(userService.resetPwd(user));
     }
 
@@ -406,6 +416,8 @@ public class SysUserController extends BaseController {
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getId());
         user.setUpdateBy(SecurityUtils.getUsername());
+        userService.clearUserCacheByUserId(user.getId());
+        userService.clearUserCacheByUserName(user.getUsername());
         return toAjax(userService.updateUserStatus(user));
     }
 
@@ -473,14 +485,23 @@ public class SysUserController extends BaseController {
     @ApiOperation(value = "记录用户最后一次登录")
     @InnerAuth
     @PostMapping("/userLoginInfo")
-    public R<Boolean> userLoginInfo(Long id, Date loginTime, String loginIp) {
-        SysUser sysUser = userService.selectUserById(id);
-        sysUser.setLastIp(loginIp);
+    public R<Boolean> userLoginInfo(Long id, Date loginTime, String loginIp) throws InterruptedException {
+        // 为减少查询,直接更新
+//        SysUser sysUser = userService.selectUserById(id);
+//        sysUser.setLastIp(loginIp);
+//        if (null == loginTime) {
+//            loginTime = DateUtils.getNowDate();
+//        }
+//        sysUser.setLastTime(loginTime);
+
         if (null == loginTime) {
             loginTime = DateUtils.getNowDate();
         }
-        sysUser.setLastTime(loginTime);
-        userService.saveOrUpdate(sysUser);
+        LambdaUpdateWrapper<SysUser> wrapper =new LambdaUpdateWrapper<>();
+        wrapper.eq(SysUser::getId,id);
+        wrapper.set(SysUser::getLastTime,loginTime);
+        wrapper.set(SysUser::getLastIp,loginIp);
+        userService.update(wrapper);
         return R.ok(true);
     }
 
@@ -784,6 +805,8 @@ public class SysUserController extends BaseController {
         SysUser updateUser = new SysUser();
         updateUser.setId(SecurityUtils.getUserId());
         updateUser.setSignatureSeal(user.getSignatureSeal());
+        userService.clearUserCacheByUserId(SecurityUtils.getUserId());
+        userService.clearUserCacheByUserName(SecurityUtils.getUsername());
         return toAjax(userService.updateById(updateUser));
     }
 

+ 11 - 4
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysUserRoleController.java

@@ -1,9 +1,10 @@
 package com.xunmei.system.controller;
 
+import java.time.Duration;
 import java.util.List;
-import java.io.IOException;
-import javax.servlet.http.HttpServletResponse;
 
+import com.xunmei.common.core.constant.CacheConstants;
+import com.xunmei.common.redis.utils.RedisUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import com.xunmei.common.log.annotation.Log;
@@ -15,7 +16,6 @@ import com.xunmei.common.core.web.controller.BaseController;
 import com.xunmei.common.core.web.domain.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xunmei.common.core.web.page.TableDataInfo;
 
 /**
@@ -89,6 +89,13 @@ public class SysUserRoleController extends BaseController {
 
     @GetMapping("/getUserRoleId")
     List<Long> getUserRoleId(@RequestParam(value = "userId") Long userId) {
-        return sysUserRoleService.getUserRoleId(userId);
+        String cacheKey= CacheConstants.USER_CACHE_ROLE_ID_KEY +userId.toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
+        List<Long> roleIds= sysUserRoleService.getUserRoleId(userId);
+        RedisUtils.setCacheObject(cacheKey,roleIds, Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
+        return roleIds;
     }
 }

+ 3 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysMenuService.java

@@ -144,4 +144,7 @@ public interface ISysMenuService extends IService<SysMenu>
      * @return 结果
      */
     boolean checkMenuNameUnique(SysMenu menu);
+
+    void clearCacheMenu();
+
 }

+ 5 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysUserService.java

@@ -273,4 +273,9 @@ public interface ISysUserService extends IService<SysUser> {
     void insertUserMapper(Long masterUserId, Long[] mapperUserIds,Integer userSource);
 
     void importRole(MultipartFile file, HttpServletResponse response);
+
+    void clearUserCache();
+    void clearUserCacheByUserId(Long userId);
+
+    void clearUserCacheByUserName(String userName);
 }

+ 59 - 5
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysDeptServiceImpl.java

@@ -34,6 +34,7 @@ import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.Duration;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -117,9 +118,43 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
      */
     @Override
     public List<SysOrgVO> selectDeptTreeList(SysOrg dept) {
-        Long s = System.currentTimeMillis();
-        SysOrg sysOrg = null;
-        sysOrg = getLoginUserOrg();
+        SysOrg sysOrg = getLoginUserOrg();
+        String removeId="";
+        if(ObjectUtil.isNotNull(dept.getRemoveId()) ){
+            removeId="_"+dept.getRemoveId().toString();
+        }
+        String cacheKey=CacheConstants.DEPT_TREE_CACHE_SINGLE_KEY+sysOrg.getId().toString()+removeId;
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
+        List<SysOrgVO> orgs = buildDeptTreeList(sysOrg,dept);
+        RedisUtils.setCacheObject(cacheKey,orgs, Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
+        return orgs;
+
+//        List<SysOrgVO> cacheList = getOrgCache();
+//        List<SysOrgVO> orgs = new ArrayList<>();
+//        for (SysOrgVO org : cacheList) {
+//            String path = org.getPath();
+//            if (StringUtils.isEmpty(path) || !path.startsWith(sysOrg.getPath())) {
+//                continue;
+//            }
+//
+//            if (StringUtils.isEmpty(org.getShortName())) {
+//                org.setShortName(org.getName());
+//            }
+//            if (org.getSort() == null) {
+//                org.setSort(100000);
+//            }
+//            orgs.add(org);
+//        }
+//        if (dept.getRemoveId() != null) {
+//            orgs.removeIf(d -> d.getTreeShowPath().endsWith(dept.getId() + "-"));
+//        }
+//        return generateTree(orgs, sysOrg);
+    }
+
+    private List<SysOrgVO> buildDeptTreeList(SysOrg sysOrg,SysOrg dept){
         List<SysOrgVO> cacheList = getOrgCache();
         List<SysOrgVO> orgs = new ArrayList<>();
         for (SysOrgVO org : cacheList) {
@@ -150,12 +185,20 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
      */
     @Override
     public List<SysOrgVO> selectTreeByOrgType(Boolean includeUp, Boolean includeBangshichu, OrgTypeEnum orgType) {
+
+
         String path = "";
         SysOrg sysOrg = getLoginUserOrg();
         path = sysOrg.getPath();
+        Long orgId=sysOrg.getId();
         if (includeUp) {
             sysOrg = null;
         }
+        String cacheKey=CacheConstants.DEPT_HANGSHE_TREE_CACHE_SINGLE_KEY+orgId.toString()+"_"+includeUp.toString()+"_"+includeBangshichu.toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
 
         List<SysOrgVO> orglist = getWholePathInCache(includeUp, path, orgType);
         if (!includeBangshichu) {
@@ -163,6 +206,7 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
                     .collect(Collectors.toList());
         }
         List<SysOrgVO> r = generateTree(orglist, sysOrg);
+        RedisUtils.setCacheObject(cacheKey,r, Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
         return r;
     }
 
@@ -384,8 +428,18 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
     }
 
     private SysOrg getLoginUserOrg() {
-        Long userId = SecurityUtils.getUserId();
-        SysOrg sysOrg = orgMapper.selectSysOrgByUserId(userId);
+        Long orgId= SecurityUtils.getLoginUser().getOrgId();
+        SysOrg sysOrg =null;
+        if(ObjectUtil.isNotNull(orgId))
+        {
+            // 有缓存
+            sysOrg=orgService.selectSysOrgById(orgId);
+        }
+        else{
+            Long userId = SecurityUtils.getUserId();
+            sysOrg = orgMapper.selectSysOrgByUserId(userId);
+        }
+
         if (ObjectUtil.isNull(sysOrg)) {
             throw new ServiceException("当前用户没有机构信息");
         }

+ 22 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysMenuServiceImpl.java

@@ -3,10 +3,12 @@ package com.xunmei.system.service.impl;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.CacheConstants;
 import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.UserConstants;
 import com.xunmei.common.core.utils.IDHelper;
 import com.xunmei.common.core.utils.StringUtils;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.system.api.domain.SysRole;
 import com.xunmei.system.api.domain.SysUser;
 import com.xunmei.system.domain.SysMenu;
@@ -21,6 +23,7 @@ import com.xunmei.system.service.ISysMenuService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.Duration;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -82,6 +85,11 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
      */
     @Override
     public Set<String> selectMenuPermsByUserId(Long userId) {
+        String cacheKey= CacheConstants.USER_ROLE_PERMISSION_CACHE_KEY +userId.toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
         List<String> perms = menuMapper.selectMenuPermsByUserId(userId);
         Set<String> permsSet = new HashSet<>();
         for (String perm : perms) {
@@ -89,6 +97,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
                 permsSet.addAll(Arrays.asList(perm.trim().split(",")));
             }
         }
+        RedisUtils.setCacheObject(cacheKey,permsSet, Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
         return permsSet;
     }
 
@@ -100,6 +109,11 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
      */
     @Override
     public Set<String> selectMenuPermsByRoleId(Long roleId) {
+        String cacheKey= CacheConstants.ROLE_PERMISSION_CACHE_KEY +roleId.toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
         List<String> perms = menuMapper.selectMenuPermsByRoleId(roleId);
         Set<String> permsSet = new HashSet<>();
         for (String perm : perms) {
@@ -107,6 +121,8 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
                 permsSet.addAll(Arrays.asList(perm.trim().split(",")));
             }
         }
+        RedisUtils.setCacheObject(cacheKey,permsSet, Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
+
         return permsSet;
     }
 
@@ -318,6 +334,12 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
         return UserConstants.UNIQUE;
     }
 
+    @Override
+    public void clearCacheMenu() {
+        RedisUtils.deleteByPrefix(CacheConstants.ROLE_PERMISSION_CACHE_KEY);
+        RedisUtils.deleteByPrefix(CacheConstants.USER_ROLE_PERMISSION_CACHE_KEY);
+    }
+
     /**
      * 获取路由名称
      *

+ 9 - 2
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysOrgExtendServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xunmei.system.service.impl;
 
+import java.time.Duration;
 import java.util.List;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -9,7 +10,6 @@ import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.utils.StringUtils;
 import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.system.api.domain.SysOrg;
-import com.xunmei.system.api.vo.SysOrgVO;
 import com.xunmei.system.domain.SysPhysicalDefenseConstruction;
 import com.xunmei.system.dto.SysOrgExtendDto;
 import com.xunmei.system.mapper.SysOrgMapper;
@@ -93,7 +93,14 @@ public class SysOrgExtendServiceImpl extends ServiceImpl<SysOrgExtendMapper, Sys
 
     @Override
     public SysOrgExtend selectSysOrgExtendByOrgId(Long id) {
-        return sysOrgExtendMapper.selectOne(new QueryWrapper<SysOrgExtend>().eq("org_id", id));
+        String cacheKey=CacheConstants.ORG_EXTEND_CACHE_CONCAT_INFO+id.toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
+        SysOrgExtend sysOrgExtend = sysOrgExtendMapper.selectOne(new QueryWrapper<SysOrgExtend>().eq("org_id", id));
+        RedisUtils.setCacheObject(cacheKey, sysOrgExtend, Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
+        return sysOrgExtend;
     }
 
     /**

+ 16 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysOrgServiceImpl.java

@@ -56,6 +56,7 @@ import javax.annotation.PostConstruct;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.net.URLEncoder;
+import java.time.Duration;
 import java.time.LocalDate;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
@@ -623,7 +624,14 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
      */
     @Override
     public SysOrg selectSysOrgById(Long id) {
-        return sysOrgMapper.selectById(id);
+        String cacheKey=CacheConstants.ORG_CACHE_SINGLE_KEY+id.toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
+        SysOrg org =sysOrgMapper.selectById(id);
+        RedisUtils.setCacheObject(cacheKey,org, Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
+        return org;
     }
 
     @Override
@@ -839,6 +847,13 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
         RedisUtils.deleteObject(CacheConstants.ORG_CACHE_LIST_KEY);
         RedisUtils.deleteObject(CacheConstants.HS_ORG_CACHE_LIST_KEY);
         //redisService.deleteObject(CacheConstants.ORG_CACHE_LIST_KEY);
+        RedisUtils.deleteByPrefix(CacheConstants.ORG_CACHE_SINGLE_KEY);
+        RedisUtils.deleteByPrefix(CacheConstants.ORG_CACHE_CONCAT_NAME);
+        RedisUtils.deleteByPrefix(CacheConstants.ORG_EXTEND_CACHE_CONCAT_INFO);
+        RedisUtils.deleteByPrefix(CacheConstants.DEPT_TREE_CACHE_SINGLE_KEY);
+        RedisUtils.deleteByPrefix(CacheConstants.DEPT_HANGSHE_TREE_CACHE_SINGLE_KEY);
+
+
     }
 
     @Override

+ 11 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysRoleServiceImpl.java

@@ -30,6 +30,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.PostConstruct;
+import java.time.Duration;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -100,7 +101,13 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
      */
     @Override
     public List<SysRole> selectRolesByUserId(Long userId) {
+        String cacheKey= CacheConstants.USER_CACHE_ROLE_OBJECT_KEY+userId.toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
         List<SysRole> userRoles = roleMapper.selectRolePermissionByUserId(userId);
+        RedisUtils.setCacheObject(cacheKey,userRoles, Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
         return userRoles;
     }
 
@@ -112,7 +119,8 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
      */
     @Override
     public Set<String> selectRolePermissionByUserId(Long userId) {
-        List<SysRole> perms = roleMapper.selectRolePermissionByUserId(userId);
+//        List<SysRole> perms = roleMapper.selectRolePermissionByUserId(userId);
+        List<SysRole> perms =this.selectRolesByUserId(userId);
         Set<String> permsSet = new HashSet<>();
         for (SysRole perm : perms) {
             if (StringUtils.isNotNull(perm)) {
@@ -519,6 +527,8 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
     @Override
     public void clearRoleCache() {
         RedisUtils.deleteObject(CacheConstants.ROLE_CACHE_LIST_KEY);
+        RedisUtils.deleteByPrefix(CacheConstants.ROLE_PERMISSION_CACHE_KEY);
+        RedisUtils.deleteByPrefix(CacheConstants.USER_ROLE_PERMISSION_CACHE_KEY);
     }
 
     @Override

+ 22 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysUserRoleServiceImpl.java

@@ -1,17 +1,21 @@
 package com.xunmei.system.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.system.api.domain.SysRole;
 import com.xunmei.system.domain.SysUserRole;
 import com.xunmei.system.domain.vo.UserRoleVo;
 import com.xunmei.system.mapper.SysUserRoleMapper;
+import com.xunmei.system.service.ISysRoleService;
 import com.xunmei.system.service.ISysUserRoleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -25,6 +29,11 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
     @Autowired
     private SysUserRoleMapper sysUserRoleMapper;
 
+    @Autowired
+    private ISysRoleService sysRoleService;
+
+
+
     @Override
     public TableDataInfo<SysUserRole> selectPage(SysUserRole sysUserRole) {
         Page<SysUserRole> page;
@@ -41,8 +50,20 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
 
     @Override
     public List<UserRoleVo> selectUserRoleVoList(Long userId) {
+        List<UserRoleVo> resultList=new ArrayList<>();
+        final List<SysRole> sysRoles = sysRoleService.selectRolesByUserId(userId);
+        if(ObjectUtil.isEmpty(sysRoles))
+            return resultList;
 
-        return sysUserRoleMapper.selectUserRoleVoList(userId);
+        for (SysRole role:sysRoles) {
+            UserRoleVo userRoleVo =new UserRoleVo();
+            userRoleVo.setRoleId(role.getId());
+            userRoleVo.setUserId(userId);
+            userRoleVo.setRoleName(role.getRoleName());
+            resultList.add(userRoleVo);
+        }
+        return resultList;
+//        return sysUserRoleMapper.selectUserRoleVoList(userId);
     }
 
     /**

+ 65 - 3
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysUserServiceImpl.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
+import com.xunmei.common.core.constant.CacheConstants;
 import com.xunmei.common.core.constant.UserConstants;
 import com.xunmei.common.core.domain.OrgTreeReq;
 import com.xunmei.common.core.domain.OrgTreeResp;
@@ -22,6 +23,7 @@ import com.xunmei.common.core.utils.StringUtils;
 import com.xunmei.common.core.utils.bean.BeanValidators;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.common.datascope.annotation.DataScope;
+import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.SysRole;
@@ -40,6 +42,7 @@ import com.xunmei.system.util.SecurityUserExport;
 import com.xunmei.system.util.UserExport;
 import com.xunmei.system.util.UserImport;
 import com.xunmei.system.util.UserImportErrorMsg;
+import org.redisson.api.redisnode.RedisSingle;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -52,6 +55,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Validator;
 import java.net.URLEncoder;
+import java.time.Duration;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.time.temporal.ChronoUnit;
@@ -256,7 +260,14 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
      */
     @Override
     public SysUser selectUserByUserName(String userName) {
-        return userMapper.selectOne(new QueryWrapper<SysUser>().eq("username", userName).eq("deleted", 0));
+        String cacheKey= CacheConstants.USER_CACHE_SINGLE_KEY+userName;
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
+        SysUser user = userMapper.selectOne(new QueryWrapper<SysUser>().eq("username", userName).eq("deleted", 0));
+        RedisUtils.setCacheObject(cacheKey,user, Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
+        return user;
     }
 
     /**
@@ -267,7 +278,14 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
      */
     @Override
     public SysUser selectUserById(Long userId) {
-        return userMapper.selectById(userId);
+        String cacheKey= CacheConstants.USER_CACHE_SINGLE_KEY+userId.toString();
+        if(RedisUtils.hasKey(cacheKey))
+        {
+            return RedisUtils.getCacheObject(cacheKey);
+        }
+        SysUser user = userMapper.selectById(userId);
+        RedisUtils.setCacheObject(cacheKey,user, Duration.ofSeconds(CacheConstants.ORG_USER_EXPIRATION_TIME));
+        return user;
     }
 
     /**
@@ -666,7 +684,24 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Override
     @Async
     public void batchSaveOrUpdate(List<SysUser> sysUserList) {
-        saveOrUpdateBatch(sysUserList);
+        if(ObjectUtil.isEmpty(sysUserList))
+        {
+            return;
+        }
+        // 同步人员数据较多25000条左右,直接一次保存事务和持锁时间较长容易锁表;改为500条一次
+        int batchSize = 500;
+        for (int i = 0; i < sysUserList.size(); i += batchSize) {
+            try{
+                int toIndex = Math.min(i + batchSize, sysUserList.size());
+                List<SysUser> subList = sysUserList.subList(i, toIndex);
+                saveOrUpdateBatch(subList);
+            }
+            catch (Exception ex)
+            {
+                log.error("同步人员批量保存 batchSaveOrUpdate ,失败原因:{}", ex.getMessage()+ex.getStackTrace());
+            }
+        }
+        this.clearUserCache();
     }
 
 
@@ -1020,6 +1055,33 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     }
 
+    @Override
+    public void clearUserCache() {
+        RedisUtils.deleteByPrefix(CacheConstants.USER_CACHE_SINGLE_KEY);
+        RedisUtils.deleteByPrefix(CacheConstants.USER_CACHE_ROLE_ID_KEY);
+        RedisUtils.deleteByPrefix(CacheConstants.USER_CACHE_ROLE_OBJECT_KEY);
+        RedisUtils.deleteByPrefix(CacheConstants.USER_ROLE_PERMISSION_CACHE_KEY);
+    }
+
+    @Override
+    public void clearUserCacheByUserId(Long userId) {
+        RedisUtils.deleteObject(CacheConstants.USER_CACHE_SINGLE_KEY+userId.toString());
+        RedisUtils.deleteObject(CacheConstants.USER_CACHE_ROLE_ID_KEY+userId.toString());
+        RedisUtils.deleteObject(CacheConstants.USER_CACHE_ROLE_OBJECT_KEY+userId.toString());
+        RedisUtils.deleteObject(CacheConstants.USER_ROLE_PERMISSION_CACHE_KEY+userId.toString());
+    }
+
+    @Override
+    public void clearUserCacheByUserName(String userName) {
+        if(StringUtils.isEmpty(userName))
+        {
+            RedisUtils.deleteByPrefix(CacheConstants.USER_CACHE_SINGLE_KEY);
+        }
+        else {
+            RedisUtils.deleteObject(CacheConstants.USER_CACHE_SINGLE_KEY+userName);
+        }
+    }
+
     private void saveUserRole(Long userId, List<Long> roleIdList) {
         List<SysUserRole> list = new ArrayList<>();
         for (Long roleId : roleIdList) {