Selaa lähdekoodia

新增APP 切换用户相关接口和字段, 新增根据用户获取 用户待办信息接口

zhulu 1 vuosi sitten
vanhempi
commit
1a0912fc1b
35 muutettua tiedostoa jossa 642 lisäystä ja 35 poistoa
  1. 14 0
      project_data/sql/0.0.8/soc/soc.sql
  2. 46 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/model/LoginUser.java
  3. 57 0
      soc-auth/src/main/java/com/xunmei/auth/controller/TokenController.java
  4. 5 0
      soc-auth/src/main/java/com/xunmei/auth/service/FJNXLoginService.java
  5. 48 0
      soc-auth/src/main/java/com/xunmei/auth/service/SysLoginService.java
  6. 11 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/SecurityConstants.java
  7. 20 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/context/SecurityContextHolder.java
  8. 22 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/utils/JwtUtils.java
  9. 10 0
      soc-common/soc-common-security/src/main/java/com/xunmei/common/security/feign/FeignRequestInterceptor.java
  10. 2 0
      soc-common/soc-common-security/src/main/java/com/xunmei/common/security/interceptor/HeaderInterceptor.java
  11. 2 0
      soc-common/soc-common-security/src/main/java/com/xunmei/common/security/service/TokenService.java
  12. 41 0
      soc-common/soc-common-security/src/main/java/com/xunmei/common/security/utils/SecurityUtils.java
  13. 6 0
      soc-gateway/src/main/java/com/xunmei/gateway/filter/AuthFilter.java
  14. 11 3
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/controller/PanelController.java
  15. 9 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/dto/UserUnDoTaskRequestDto.java
  16. 4 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/service/PanelService.java
  17. 38 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/service/impl/PanelServiceImpl.java
  18. 17 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/vo/UserUnDoVo.java
  19. 2 2
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/question/service/impl/QuestionReformServiceImpl.java
  20. 4 4
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/question/service/impl/QuestionServiceImpl.java
  21. 2 2
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/reportForms/resumption/controller/ResumptionReportController.java
  22. 2 2
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/gx/service/ResumptionServiceImpl.java
  23. 3 3
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/AppPlanServiceImpl.java
  24. 4 4
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/ProtectionServiceImpl.java
  25. 5 5
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/controller/CoreSafetyWorkSummaryController.java
  26. 40 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysUserController.java
  27. 26 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/domain/SysUserMapperDomain.java
  28. 22 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/domain/vo/SysMasterSubUserVO.java
  29. 16 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/dto/SysUserMapperDTO.java
  30. 29 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysUserAccountMapper.java
  31. 3 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysUserMapper.java
  32. 17 0
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysUserService.java
  33. 60 9
      soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysUserServiceImpl.java
  34. 17 0
      soc-modules/soc-modules-system/src/main/resources/mapper/system/SysUserAccountMapper.xml
  35. 27 0
      soc-modules/soc-modules-system/src/main/resources/mapper/system/SysUserMapper.xml

+ 14 - 0
project_data/sql/0.0.8/soc/soc.sql

@@ -90,6 +90,18 @@ CREATE TABLE `core_safety_work_summary` (
                                             PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='安全保卫部年度工作总结';
 
+DROP TABLE IF EXISTS `sys_user_account_mapper`;
+CREATE TABLE `sys_user_account_mapper` (
+                                           `master_user_id` bigint NOT NULL COMMENT '主账号用户Id',
+                                           `sub_user_id` bigint NOT NULL COMMENT '可切换子账号用户Id',
+                                           `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+                                           `modified_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人名称',
+                                           `update_time` datetime DEFAULT NULL COMMENT '修改时间',
+                                           `modified_by` bigint DEFAULT NULL COMMENT '修改人id',
+                                           PRIMARY KEY (`master_user_id`,`sub_user_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='主账号与子账号对应关系表';
+
+
 DELIMITER ??
 DROP PROCEDURE IF EXISTS schema_change ??
 CREATE PROCEDURE schema_change () BEGIN
@@ -107,3 +119,5 @@ INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `order_num`, `path`, `co
 INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (01774691126533050369, '编辑', 1774689203604049922, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'core:worksummary:edit', '1', NULL, NULL, '超级管理员', '2024-04-01 14:51:51', '', NULL, '');
 INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (01774691223434055681, '删除', 1774689203604049922, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'core:worksummary:delete', '1', NULL, NULL, '超级管理员', '2024-04-01 14:52:14', '', NULL, '');
 
+DELETE from `sys_menu` where id in(01780130457928527874);
+INSERT INTO `sys_menu` (`id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (01780130457928527874, '关联账号', 100, 124, '', NULL, NULL, 1, 0, 'F', '0', '0', 'system:user:mapperUser', '1', NULL, NULL, '超级管理员', '2024-04-16 15:06:56', '', NULL, '');

+ 46 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/model/LoginUser.java

@@ -25,6 +25,11 @@ public class LoginUser implements Serializable
     private Long userid;
 
     /**
+     * 主用户id,  监管多个机构时,用户可以切换到子账号,切换后登记人还需要保存为主账号
+     */
+    private Long masterUserId;
+
+    /**
      * 机构
      */
     private Long orgId;
@@ -34,6 +39,12 @@ public class LoginUser implements Serializable
      */
     private String username;
 
+
+    /**
+     * 主用户用户名,  监管多个机构时,用户可以切换到子账号,切换后登记人还需要保存为主账号
+     */
+    private String masterUserName;
+
     /**
      * 用户姓名
      */
@@ -75,6 +86,11 @@ public class LoginUser implements Serializable
     private SysUser sysUser;
 
     /**
+     * 用户信息
+     */
+    private SysUser masterSysUser;
+
+    /**
      * 来源 0:系统添加.1:fjnx同步
      */
     private Integer source;
@@ -208,4 +224,34 @@ public class LoginUser implements Serializable
     {
         this.source = source;
     }
+
+    public Long getMasterUserId()
+    {
+        return masterUserId;
+    }
+
+    public void setMasterUserId(Long masterUserId)
+    {
+        this.masterUserId = masterUserId;
+    }
+
+    public String getMasterUserName()
+    {
+        return masterUserName;
+    }
+
+    public void setMasterUserName(String masterUserName)
+    {
+        this.masterUserName = masterUserName;
+    }
+
+    public SysUser getMasterSysUser()
+    {
+        return masterSysUser;
+    }
+
+    public void setMasterSysUser(SysUser masterSysUser)
+    {
+        this.masterSysUser = masterSysUser;
+    }
 }

+ 57 - 0
soc-auth/src/main/java/com/xunmei/auth/controller/TokenController.java

@@ -1,5 +1,6 @@
 package com.xunmei.auth.controller;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.xunmei.auth.form.LoginBody;
 import com.xunmei.auth.service.FJNXLoginService;
 import com.xunmei.auth.service.SysLoginService;
@@ -70,6 +71,62 @@ public class TokenController {
     }
 
     /**
+     * APP 端切换用户
+     * @param subUserId
+     * @return
+     */
+    @GetMapping("switchUser")
+    public R<?> switchUser(@RequestParam @NotEmpty Long subUserId,HttpServletRequest request) {
+
+        try {
+            if (!SecurityUtils.isApp()) {
+                //登录重放问题处理,待前端完成放开
+                //loginService.checkLogin(form.getAuthCode());
+            }
+            // 获取到切换后的用户信息
+            LoginUser userInfo = loginService.switchUser(subUserId, Constants.LOGIN_TYPE_0);
+            // 子账号切换回 主账号
+            if(ObjectUtil.equal(SecurityUtils.getMasterUserId(),subUserId))
+            {
+                userInfo.setMasterUserId(null);
+                userInfo.setMasterUserName(null);
+            }
+            else
+            {
+                // 设置切换后 主账号信息,如当是主账号 切换到子账号 再次切换到子账号 则设置当前登录账号已附带的 主账号信息
+                if(ObjectUtil.isNotEmpty(SecurityUtils.getMasterUserId()) &&  ObjectUtil.isNotEmpty(SecurityUtils.getMasterUsername()))
+                {
+                    userInfo.setMasterUserId(SecurityUtils.getMasterUserId());
+                    userInfo.setMasterUserName(SecurityUtils.getMasterUsername());
+                }
+                else
+                {
+                    userInfo.setMasterUserId(SecurityUtils.getUserId());
+                    userInfo.setMasterUserName(SecurityUtils.getUsername());
+                }
+            }
+
+            // 清除主用户的登录缓存数据
+            String token = SecurityUtils.getToken(request);
+            if (StringUtils.isNotEmpty(token)) {
+                String username = JwtUtils.getUserName(token);
+                // 删除用户缓存记录
+                AuthUtil.logoutByToken(token);
+                // 记录用户退出日志
+                loginService.logout(username, Constants.LOGIN_TYPE_0);
+            }
+
+            // 获取登录token
+            return R.ok(tokenService.createToken(userInfo));
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+        // 用户登录
+    }
+
+
+
+    /**
      * token登录方式
      * @param token token
      * @param loginType 登录类型 0 H5 1 web

+ 5 - 0
soc-auth/src/main/java/com/xunmei/auth/service/FJNXLoginService.java

@@ -199,6 +199,11 @@ public class FJNXLoginService{
         List<String> ipList = new ArrayList<>();
         List<Integer> portList = new ArrayList<>();
 
+        if(StringUtil.isNullOrEmpty(passIp))
+        {
+            logger.error("密码加密失败!{}","请配置密管系统地址");
+            return null;
+        }
         ipList.add(passIp);
         portList.add(passPort);
 

+ 48 - 0
soc-auth/src/main/java/com/xunmei/auth/service/SysLoginService.java

@@ -119,6 +119,54 @@ public class SysLoginService{
         return userInfo;
     }
 
+    public LoginUser switchUser(Long subUserId,String platformType) {
+
+        SysUser swichUser = remoteUserService.getUserById(subUserId, SecurityConstants.INNER);
+        if(ObjectUtil.isEmpty(swichUser))
+        {
+            throw new ServiceException("切换用户:" + subUserId + " 不存在");
+        }
+        String username=swichUser.getUsername();
+        // 用户名不在指定范围内 错误
+        if (username.length() < UserConstants.USERNAME_MIN_LENGTH
+                || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
+            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户名不在指定范围", platformType);
+            throw new ServiceException("用户名不在指定范围");
+        }
+        // IP黑名单校验
+        String blackStr = Convert.toStr(RedisUtils.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST));
+        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) {
+            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "很遗憾,访问IP已被列入系统黑名单", platformType);
+            throw new ServiceException("很遗憾,访问IP已被列入系统黑名单");
+        }
+        // 查询用户信息
+        R<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
+
+        if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) {
+            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "切换用户不存在", platformType);
+            throw new ServiceException("切换用户:" + username + " 不存在");
+        }
+
+        if (R.FAIL == userResult.getCode()) {
+            throw new ServiceException(userResult.getMsg());
+        }
+
+        LoginUser userInfo = userResult.getData();
+        userInfo.setPlatformType(platformType);
+        SysUser user = userResult.getData().getSysUser();
+        if (UserStatus.DELETED.getCode().equals(user.getDeleted())) {
+            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除", platformType);
+            throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
+        }
+        if (UserStatus.DISABLE.getCode().equals(Integer.parseInt(user.getIsLock()))) {
+            recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员", platformType);
+            throw new ServiceException("对不起,您的账号:" + username + " 已停用");
+        }
+
+        recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "切换成功", platformType);
+        return userInfo;
+    }
+
     public void logout(String loginName, String platformType) {
         recordLogService.recordLogininfor(loginName, Constants.LOGOUT, "退出成功", platformType);
     }

+ 11 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/SecurityConstants.java

@@ -18,6 +18,17 @@ public class SecurityConstants
     public static final String DETAILS_USERNAME = "username";
 
     /**
+     * 主用户名字段(切换机构后)
+     */
+    public static final String DETAILS_MASTERUSERNAME = "masterusername";
+
+    /**
+     * 主用户名id
+     */
+    public static final String DETAILS_MASTER_USER_ID = "masterid";
+
+
+    /**
      * 授权信息字段
      */
     public static final String AUTHORIZATION_HEADER = "authorization";

+ 20 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/context/SecurityContextHolder.java

@@ -62,6 +62,16 @@ public class SecurityContextHolder
         set(SecurityConstants.DETAILS_USER_ID, account);
     }
 
+    public static Long getMasterUserId()
+    {
+        return Convert.toLong(get(SecurityConstants.DETAILS_MASTER_USER_ID), null);
+    }
+
+    public static void setMasterUserId(String account)
+    {
+        set(SecurityConstants.DETAILS_MASTER_USER_ID, account);
+    }
+
     public static String getUserName()
     {
         return get(SecurityConstants.DETAILS_USERNAME);
@@ -72,6 +82,16 @@ public class SecurityContextHolder
         set(SecurityConstants.DETAILS_USERNAME, username);
     }
 
+    public static String getMasterUserName()
+    {
+        return get(SecurityConstants.DETAILS_MASTERUSERNAME);
+    }
+
+    public static void setMasterUserName(String masterUserName)
+    {
+        set(SecurityConstants.DETAILS_MASTERUSERNAME, masterUserName);
+    }
+
     public static String getUserKey()
     {
         return get(SecurityConstants.USER_KEY);

+ 22 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/utils/JwtUtils.java

@@ -112,6 +112,17 @@ public class JwtUtils
     }
 
     /**
+     * 根据身份信息获取主用户ID
+     *
+     * @param claims 身份信息
+     * @return 用户ID
+     */
+    public static String getMasterUserId(Claims claims)
+    {
+        return getValue(claims, SecurityConstants.DETAILS_MASTER_USER_ID);
+    }
+
+    /**
      * 根据令牌获取用户名
      * 
      * @param token 令牌
@@ -135,6 +146,17 @@ public class JwtUtils
     }
 
     /**
+     * 根据身份信息获取主用户名
+     *
+     * @param claims 身份信息
+     * @return 用户名
+     */
+    public static String getMasterUserName(Claims claims)
+    {
+        return getValue(claims, SecurityConstants.DETAILS_MASTERUSERNAME);
+    }
+
+    /**
      * 根据身份信息获取键值
      * 
      * @param claims 身份信息

+ 10 - 0
soc-common/soc-common-security/src/main/java/com/xunmei/common/security/feign/FeignRequestInterceptor.java

@@ -48,6 +48,16 @@ public class FeignRequestInterceptor implements RequestInterceptor {
                 requestTemplate.header(SecurityConstants.AUTHORIZATION_HEADER, authentication);
             }
 
+            String masterUserId = headers.get(SecurityConstants.DETAILS_MASTER_USER_ID);
+            if (StringUtils.isNotEmpty(masterUserId)) {
+                requestTemplate.header(SecurityConstants.DETAILS_MASTER_USER_ID, masterUserId);
+            }
+
+            String masterUserName = headers.get(SecurityConstants.DETAILS_MASTERUSERNAME);
+            if (StringUtils.isNotEmpty(masterUserName)) {
+                requestTemplate.header(SecurityConstants.DETAILS_MASTERUSERNAME, masterUserName);
+            }
+
             // 配置客户端IP
             requestTemplate.header("X-Forwarded-For" , IpUtils.getIpAddr());
         }

+ 2 - 0
soc-common/soc-common-security/src/main/java/com/xunmei/common/security/interceptor/HeaderInterceptor.java

@@ -31,6 +31,8 @@ public class HeaderInterceptor implements AsyncHandlerInterceptor
 
         SecurityContextHolder.setUserId(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USER_ID));
         SecurityContextHolder.setUserName(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USERNAME));
+        SecurityContextHolder.setMasterUserId(ServletUtils.getHeader(request, SecurityConstants.DETAILS_MASTER_USER_ID));
+        SecurityContextHolder.setMasterUserName(ServletUtils.getHeader(request, SecurityConstants.DETAILS_MASTERUSERNAME));
         SecurityContextHolder.setUserKey(ServletUtils.getHeader(request, SecurityConstants.USER_KEY));
 
         String token = SecurityUtils.getToken();

+ 2 - 0
soc-common/soc-common-security/src/main/java/com/xunmei/common/security/service/TokenService.java

@@ -67,6 +67,8 @@ public class TokenService {
         claimsMap.put(SecurityConstants.USER_KEY, loginUser.getToken());
         claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
         claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
+        claimsMap.put(SecurityConstants.DETAILS_MASTER_USER_ID, loginUser.getMasterUserId());
+        claimsMap.put(SecurityConstants.DETAILS_MASTERUSERNAME, loginUser.getMasterUserName());
 
         // 接口返回信息
         Map<String, Object> rspMap = new HashMap<String, Object>();

+ 41 - 0
soc-common/soc-common-security/src/main/java/com/xunmei/common/security/utils/SecurityUtils.java

@@ -2,6 +2,7 @@ package com.xunmei.common.security.utils;
 
 import cn.hutool.core.io.resource.ClassPathResource;
 import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.crypto.Mode;
 import cn.hutool.crypto.Padding;
 import cn.hutool.crypto.symmetric.SM4;
@@ -67,6 +68,46 @@ public class SecurityUtils {
     }
 
     /**
+     * 获取主账号用户ID
+     */
+    public static Long getMasterUserId() {
+        return SecurityContextHolder.getMasterUserId();
+    }
+
+    /**
+     * 获取主账号用户名称
+     */
+    public static String getMasterUsername() {
+        return SecurityContextHolder.getMasterUserName();
+    }
+
+    /**
+     * 离行等任务,兼管账号切换到子账号后,登记的数据需要 记录为实际操作人
+     * @return
+     */
+    public static Long getActualSubmitUserId()
+    {
+        if(ObjectUtil.isNotEmpty(SecurityContextHolder.getMasterUserId()))
+        {
+            return SecurityContextHolder.getMasterUserId();
+        }
+        return  SecurityContextHolder.getUserId();
+    }
+
+    /**
+     * 离行等任务,兼管账号切换到子账号后,登记的数据需要 记录为实际操作人
+     * @return
+     */
+    public static String  getActualSubmitUserName()
+    {
+        if(ObjectUtil.isNotEmpty(SecurityContextHolder.getMasterUserName()))
+        {
+            return SecurityContextHolder.getMasterUserName();
+        }
+        return  SecurityContextHolder.getUserName();
+    }
+
+    /**
      * 获取用户key
      */
     public static String getUserKey() {

+ 6 - 0
soc-gateway/src/main/java/com/xunmei/gateway/filter/AuthFilter.java

@@ -73,10 +73,16 @@ public class AuthFilter implements GlobalFilter, Ordered
             return unauthorizedResponse(exchange, "令牌验证失败");
         }
 
+        String masterUserId = JwtUtils.getMasterUserId(claims);
+        String masterUserName = JwtUtils.getMasterUserName(claims);
+
+
         // 设置用户信息到请求
         addHeader(mutate, SecurityConstants.USER_KEY, userkey);
         addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
         addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
+        addHeader(mutate, SecurityConstants.DETAILS_MASTER_USER_ID, masterUserId);
+        addHeader(mutate, SecurityConstants.DETAILS_MASTERUSERNAME, masterUserName);
         // 内部请求来源参数清除
         removeHeader(mutate, SecurityConstants.FROM_SOURCE);
         return chain.filter(exchange.mutate().request(mutate.build()).build());

+ 11 - 3
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/controller/PanelController.java

@@ -8,13 +8,12 @@ import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.common.security.annotation.RequiresPermissions;
 import com.xunmei.core.edu.service.ICoreEduTrainingPlanService;
+import com.xunmei.core.panel.dto.UserUnDoTaskRequestDto;
 import com.xunmei.core.panel.service.PanelService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 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.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 import java.util.concurrent.ExecutionException;
@@ -39,6 +38,15 @@ public class PanelController {
         return AjaxResult.success(panelService.selectPage());
     }
 
+    /**
+     * 根据用户ID获取 该用户是否存在待办任务
+     */
+    @ApiOperation(value = "切换用户根据用户ID获取用户是否存在待办")
+    //@RequiresPermissions("core:panel:list")
+    @PostMapping("/userUndoList")
+    public AjaxResult userUndoList(@RequestBody List<UserUnDoTaskRequestDto> requestDtoList) throws ExecutionException, InterruptedException, TimeoutException {
+        return AjaxResult.success(panelService.selectUserUnDoList(requestDtoList));
+    }
 
     /**
      * App面板接口

+ 9 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/dto/UserUnDoTaskRequestDto.java

@@ -0,0 +1,9 @@
+package com.xunmei.core.panel.dto;
+
+import lombok.Data;
+
+@Data
+public class UserUnDoTaskRequestDto {
+    public Long userId;
+    public Long orgId;
+}

+ 4 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/service/PanelService.java

@@ -3,6 +3,8 @@ package com.xunmei.core.panel.service;
 import com.xunmei.common.core.domain.panel.vo.PanelListVo;
 import com.xunmei.common.core.domain.panel.vo.PanelResultVo;
 import com.xunmei.common.core.domain.panel.vo.WebPanelResult;
+import com.xunmei.core.panel.dto.UserUnDoTaskRequestDto;
+import com.xunmei.core.panel.vo.UserUnDoVo;
 
 import java.util.List;
 import java.util.Map;
@@ -12,6 +14,8 @@ import java.util.concurrent.TimeoutException;
 public interface PanelService {
     List<PanelResultVo> selectPage() throws ExecutionException, InterruptedException, TimeoutException;
 
+    List<UserUnDoVo> selectUserUnDoList(List<UserUnDoTaskRequestDto> userList) throws ExecutionException, InterruptedException, TimeoutException;
+
     List<WebPanelResult> selectWebData() throws ExecutionException, InterruptedException, TimeoutException;
 
     Map<String,Object> selectWebOtherData();

+ 38 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/service/impl/PanelServiceImpl.java

@@ -24,7 +24,9 @@ import com.xunmei.core.edu.service.ISysLearningMaterialsService;
 import com.xunmei.core.evaluate.service.ICoreEvaluateTaskService;
 import com.xunmei.core.letter.service.ICoreIntroduceLetterService;
 import com.xunmei.core.message.service.ICoreAnnouncementNotificationService;
+import com.xunmei.core.panel.dto.UserUnDoTaskRequestDto;
 import com.xunmei.core.panel.service.PanelService;
+import com.xunmei.core.panel.vo.UserUnDoVo;
 import com.xunmei.core.question.service.IQuestionService;
 import com.xunmei.core.resumption.service.IProtectionService;
 import com.xunmei.core.resumption.service.ResumptionService;
@@ -95,11 +97,17 @@ public class PanelServiceImpl implements PanelService {
     @Override
     public List<PanelResultVo> selectPage() throws ExecutionException, InterruptedException, TimeoutException {
         Long userId = SecurityUtils.getUserId();
+        Long orgId =SecurityUtils.getLoginUser().getOrgId();
+        return getListByUserId(userId,orgId);
+    }
+
+    private List<PanelResultVo> getListByUserId(Long userId,Long orgId) throws ExecutionException, InterruptedException, TimeoutException
+    {
         List<Long> roles = RemoteCallHandlerExecutor.executeRemoteCall(
                 () -> roleService.getUserRoleId(userId, SecurityConstants.FROM_SOURCE),
                 ErrorMsgConstants.QUERY_USER_ROLE_ERROR);
 
-        PanelListDto panelListDto = PanelAdapter.getMapperSelectParam(SecurityUtils.getLoginUser().getOrgId(),
+        PanelListDto panelListDto = PanelAdapter.getMapperSelectParam(orgId,
                 roles, userId);
         if (ObjectUtil.isEmpty(panelListDto.getRoleIdList())) {
             return new ArrayList<>();
@@ -206,9 +214,38 @@ public class PanelServiceImpl implements PanelService {
         }
 
         return list;
+    }
+
+    @Override
+    public List<UserUnDoVo> selectUserUnDoList(List<UserUnDoTaskRequestDto> userList) throws ExecutionException, InterruptedException, TimeoutException {
+        List<UserUnDoVo> result=new ArrayList<>();
+        if(ObjectUtil.isNotEmpty(userList))
+        {
+            userList.forEach(user->{
+                try {
+                    UserUnDoVo tempVo= getUserUnDo(user.getUserId(),user.getOrgId());
+                    result.add(tempVo);
+                }
+                catch (Exception ex)
+                {
 
+                }
+            });
+        }
+        return result;
     }
 
+    private UserUnDoVo getUserUnDo(Long userId,Long orgId) throws ExecutionException, InterruptedException, TimeoutException
+    {
+        UserUnDoVo vo =new UserUnDoVo();
+        List<PanelResultVo> unDoTaskList = getListByUserId(userId,orgId);
+        vo.setUserId(userId);
+        vo.setHaveUnDoTask(unDoTaskList.size()>0);
+//        vo.setUnDoTaskList(unDoTaskList);
+        return  vo;
+    }
+
+
     @Override
     public List<WebPanelResult> selectWebData() throws ExecutionException, InterruptedException, TimeoutException {
         List<Long> roles = RemoteCallHandlerExecutor.executeRemoteCall(

+ 17 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/panel/vo/UserUnDoVo.java

@@ -0,0 +1,17 @@
+package com.xunmei.core.panel.vo;
+
+import com.xunmei.common.core.domain.panel.vo.PanelResultVo;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UserUnDoVo {
+
+    public Long userId;
+
+    public Boolean haveUnDoTask;
+
+    public List<PanelResultVo> unDoTaskList;
+
+}

+ 2 - 2
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/question/service/impl/QuestionReformServiceImpl.java

@@ -175,8 +175,8 @@ public class QuestionReformServiceImpl extends ServiceImpl<QuestionMapper, Quest
         flow.setQuestionId(reformDto.getId());
         flow.setDescription(reformDto.getDescription());
         flow.setExecuteTime(new Date());
-        flow.setExecutorId(SecurityUtils.getUserId());
-        flow.setExecutorName(SecurityUtils.getLoginUser().getName());
+        flow.setExecutorId(SecurityUtils.getActualSubmitUserId());
+        flow.setExecutorName(SecurityUtils.getActualSubmitUserName());
         flow.setImages(reformDto.getImages());
         flow.setReformDate(reformDto.getReformDate());
         flow.setExecuteStatus(0);

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

@@ -229,8 +229,8 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         flow.setQuestionId(confirmDto.getId());
         flow.setDescription(confirmDto.getDescription());
         flow.setExecuteTime(new Date());
-        flow.setExecutorId(SecurityUtils.getUserId());
-        flow.setExecutorName(SecurityUtils.getLoginUser().getName());
+        flow.setExecutorId(SecurityUtils.getActualSubmitUserId());
+        flow.setExecutorName(SecurityUtils.getActualSubmitUserName());
         flow.setExecuteStatus(confirmDto.getStatus());
         flow.setExecuteStep(QuestionStepEnum.confirm.getValue());
 
@@ -269,8 +269,8 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         flow.setQuestionId(confirmDto.getId());
         flow.setDescription(confirmDto.getDescription());
         flow.setExecuteTime(new Date());
-        flow.setExecutorId(SecurityUtils.getUserId());
-        flow.setExecutorName(SecurityUtils.getLoginUser().getName());
+        flow.setExecutorId(SecurityUtils.getActualSubmitUserId());
+        flow.setExecutorName(SecurityUtils.getActualSubmitUserName());
         flow.setExecuteStatus(confirmDto.getStatus());
         flow.setExecuteStep(QuestionStepEnum.confirmDissent.getValue());
 

+ 2 - 2
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/reportForms/resumption/controller/ResumptionReportController.java

@@ -137,7 +137,7 @@ public class ResumptionReportController {
         resumptionReportService.standbyPowerExport(request, response);
     }
 
-    @ApiOperation(value = "备用电源维护表")
+    @ApiOperation(value = "备用电源维护情况表")
     @RequiresPermissions("core:resumptionReport:list")
     @GetMapping("/standbyPower")
     public AjaxResult standbyPower(ResumptionDTO resumptionDTO) {
@@ -145,7 +145,7 @@ public class ResumptionReportController {
         AjaxResult ajaxResult = AjaxResult.success();
         List<IntrusionTestReportVO> intrusionTestReportVOList = resumptionReportService.standbyPower(resumptionDTO);
         ajaxResult.put(AjaxResult.DATA_TAG, intrusionTestReportVOList);
-        ajaxResult.put(TITLE, "备用电源维护表(" + time + ")");
+        ajaxResult.put(TITLE, "备用电源维护情况表(" + time + ")");
         SysOrg sysOrg = remoteOrgService.selectSysOrgById(resumptionDTO.getOrgId(), SecurityConstants.INNER);
         ajaxResult.put("orgName", sysOrg.getShortName());
         return ajaxResult;

+ 2 - 2
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/gx/service/ResumptionServiceImpl.java

@@ -132,8 +132,8 @@ public class ResumptionServiceImpl implements ResumptionService {
 
 
         AppPlan appPlan = appPlanMapper.getById(sysResumption.getPlanId());
-        sysResumption.setUpdateBy(SecurityUtils.getUsername());
-        sysResumption.setSubmitorId(SecurityUtils.getUserId());
+        sysResumption.setUpdateBy(SecurityUtils.getActualSubmitUserName());
+        sysResumption.setSubmitorId(SecurityUtils.getActualSubmitUserId());
         sysResumption.setSubmitorName(SecurityUtils.getLoginUser().getName());
         sysResumption.setUpdateTime(new Date());
         sysResumption.setSubmitTime(new Date());

+ 3 - 3
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/AppPlanServiceImpl.java

@@ -630,7 +630,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
                 child.setPlanCycle(plan.getPlanCycle());
                 child.setExecOrgType(plan.getExecOrgType());
                 child.setPlanExec(plan.getPlanExec());
-                child.setModifiedBy(SecurityUtils.getUserId());
+                child.setModifiedBy(SecurityUtils.getActualSubmitUserId());
                 child.setPlanName(plan.getPlanName());
                 child.setCount(plan.getCount());
                 child.setStartDate(plan.getStartDate());
@@ -772,7 +772,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
 
             //最后处理本计划
             plan.setUpdateTime(new Date());
-            plan.setModifiedBy(SecurityUtils.getUserId());
+            plan.setModifiedBy(SecurityUtils.getActualSubmitUserId());
 
             //前端总是会传递计划创建id,修改时需要排除
             plan.setPlanStatus(null);
@@ -1031,7 +1031,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
         }
         plan.setUpdateTime(time);
         plan.setModifiedName(SecurityUtils.getUsername());
-        plan.setModifiedBy(SecurityUtils.getUserId());
+        plan.setModifiedBy(SecurityUtils.getActualSubmitUserId());
         plan.setExecOrgType(app.getExecOrgType());
         plan.setExecType(app.getExecType());
         plan.setPlanType(app.getPlanType());

+ 4 - 4
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/ProtectionServiceImpl.java

@@ -198,8 +198,8 @@ public class ProtectionServiceImpl extends ServiceImpl<ProtectionMapper, IotAlar
                 .set(IotAlarmSubsystem::getStatus, updateDto.getState())
                 .set(IotAlarmSubsystem::getStatusChangeTime, updateDto.getChangeTime())
                 .set(IotAlarmSubsystem::getStatusUpdateTime, now)
-                .set(IotAlarmSubsystem::getStatusUpdatorId, SecurityUtils.getUserId())
-                .set(IotAlarmSubsystem::getStatusUpdatorName, SecurityUtils.getLoginUser().getName()));
+                .set(IotAlarmSubsystem::getStatusUpdatorId, SecurityUtils.getActualSubmitUserId())
+                .set(IotAlarmSubsystem::getStatusUpdatorName, SecurityUtils.getActualSubmitUserName()));
         if (count > 0) {
             IotAlarmSubsystem p = getById(updateDto.getId());
             IotAlarmSubsystemLog log = new IotAlarmSubsystemLog();
@@ -209,8 +209,8 @@ public class ProtectionServiceImpl extends ServiceImpl<ProtectionMapper, IotAlar
             log.setStatus(updateDto.getState());
             log.setStatusUpdateTime(now);
             log.setStatusChangeTime(updateDto.getChangeTime());
-            log.setStatusUpdatorId(SecurityUtils.getLoginUser().getUserid());
-            log.setStatusUpdatorName(SecurityUtils.getLoginUser().getName());
+            log.setStatusUpdatorId(SecurityUtils.getActualSubmitUserId());
+            log.setStatusUpdatorName(SecurityUtils.getActualSubmitUserName());
             protectionLogMapper.insert(log);
         }
 

+ 5 - 5
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetybook/controller/CoreSafetyWorkSummaryController.java

@@ -32,7 +32,7 @@ public class CoreSafetyWorkSummaryController extends BaseController {
      * 查询安全保卫部年度工作总结列表
      */
     @ApiOperation(value = "查询CoreSafetyWorkSummary列表")
-    @RequiresPermissions("core:aqbwbndjh:list")
+    @RequiresPermissions("core:worksummary:query")
     @PostMapping("/list")
     public TableDataInfo<CoreSafetyWorkSummaryVo> list(@RequestBody CoreSafetyWorkSummaryRequestDto requestDto) {
         return CoreSafetyWorkSummaryService.selectPage(requestDto);
@@ -43,7 +43,7 @@ public class CoreSafetyWorkSummaryController extends BaseController {
      * 获取安全保卫部年度工作总结详细信息
      */
     @ApiOperation(value = "获取CoreSafetyWorkSummary详细信息")
-    @RequiresPermissions("core:aqbwbndjh:query")
+    @RequiresPermissions("core:worksummary:query")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") Long id) {
         return success(CoreSafetyWorkSummaryService.selectCoreSafetyWorkSummaryById(id));
@@ -53,7 +53,7 @@ public class CoreSafetyWorkSummaryController extends BaseController {
      * 新增安全保卫部年度工作总结
      */
     @ApiOperation(value = "新增CoreSafetyWorkSummary")
-    @RequiresPermissions("core:aqbwbndjh:add")
+    @RequiresPermissions("core:worksummary:add")
     @Log(title = "安全保卫部年度工作总结", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public AjaxResult add(@RequestBody CoreSafetyWorkSummaryRequestDto requestDto) {
@@ -64,7 +64,7 @@ public class CoreSafetyWorkSummaryController extends BaseController {
      * 修改安全保卫部年度工作总结
      */
     @ApiOperation(value = "修改CoreSafetyWorkSummary")
-    @RequiresPermissions("core:aqbwbndjh:edit")
+    @RequiresPermissions("core:worksummary:edit")
     @Log(title = "安全保卫部年度工作总结", businessType = BusinessType.UPDATE)
     @PostMapping("/edit")
     public AjaxResult edit(@RequestBody CoreSafetyWorkSummaryRequestDto requestDto) {
@@ -75,7 +75,7 @@ public class CoreSafetyWorkSummaryController extends BaseController {
      * 删除安全保卫部年度工作总结
      */
     @ApiOperation(value = "删除CoreSafetyWorkSummary")
-    @RequiresPermissions("core:aqbwbndjh:remove")
+    @RequiresPermissions("core:worksummary:delete")
     @Log(title = "安全保卫部年度工作总结", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids) {

+ 40 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysUserController.java

@@ -27,8 +27,10 @@ import com.xunmei.system.api.domain.SysUserInformation;
 import com.xunmei.system.api.dto.SysPlanOrgDTO;
 import com.xunmei.system.api.model.LoginUser;
 import com.xunmei.system.domain.SysUserRole;
+import com.xunmei.system.domain.vo.SysMasterSubUserVO;
 import com.xunmei.system.domain.vo.SysUserListVo;
 import com.xunmei.system.domain.vo.UserRoleVo;
+import com.xunmei.system.dto.SysUserMapperDTO;
 import com.xunmei.system.mapper.SysOrgMapper;
 import com.xunmei.system.service.*;
 import com.xunmei.system.util.SecurityUserExport;
@@ -206,9 +208,47 @@ public class SysUserController extends BaseController {
         //用户角色信息
         ajax.put("roleList", userRoleVos);
         ajax.put("permissions", permissions);
+
+        // 获取当前登录账号是否存在 关联子账号
+        List<SysMasterSubUserVO> subUser =new ArrayList<>();
+        if(ObjectUtil.isNotEmpty(SecurityUtils.getMasterUserId()))
+        {
+            subUser =userService.selectSwitchUserList(SecurityUtils.getMasterUserId(),user.getId());
+        }
+        else {
+            subUser =userService.selectSwitchUserList(user.getId(),null);
+        }
+
+        ajax.put("subUserList",subUser);
+        ajax.put("masterUserId",SecurityUtils.getMasterUserId());
+        ajax.put("masterUserName",SecurityUtils.getMasterUsername());
         return ajax;
     }
 
+
+
+    /**
+     * 用户关联子用户
+     */
+    @RequiresPermissions("system:user:mapperUser")
+    @Log(title = "关联子用户", businessType = BusinessType.OTHER)
+    @PutMapping("/mapperuser")
+    public AjaxResult mapperUser(@RequestBody SysUserMapperDTO userMapperDTO) {
+        userService.insertUserMapper(userMapperDTO.getMasterUserId(), userMapperDTO.getMapperUserIds().toArray(new Long[0]));
+        return success();
+    }
+
+    /**
+     * 用户关联子用户
+     */
+//    @RequiresPermissions("system:user:mapperUser")
+    @Log(title = "关联子用户", businessType = BusinessType.OTHER)
+    @GetMapping("/mapperlist/{userId}")
+    public  R<List<SysMasterSubUserVO>> mapperUser(@PathVariable(value = "userId") Long userId) {
+        return R.ok(userService.selectSwitchUserList(userId,null));
+    }
+
+
     /**
      * 根据用户编号获取详细信息
      */

+ 26 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/domain/SysUserMapperDomain.java

@@ -0,0 +1,26 @@
+package com.xunmei.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xunmei.common.core.web.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * 主账号与子账号对应关系表 sys_user_account_mapper
+ * 
+ * @author xunmei
+ */
+@Data
+@Accessors(chain = true)
+@TableName("sys_menu")
+@ApiModel(value = "SysMenu对象", description = "菜单权限")
+public class SysUserMapperDomain extends BaseEntity
+{
+    /** 主账号ID */
+    private Long masterUserId;
+    
+    /** 子账号ID */
+    private Long subUserId;
+
+}

+ 22 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/domain/vo/SysMasterSubUserVO.java

@@ -0,0 +1,22 @@
+package com.xunmei.system.domain.vo;
+
+import com.xunmei.system.api.domain.SysUser;
+import lombok.Data;
+
+/**
+ * @author :LuoWei
+ * @date : 2023/8/14
+ */
+@Data
+public class SysMasterSubUserVO {
+    private Long masterUserId;
+//    private Long masterUserOrgId;
+//    private String masterUserName;
+//    private String masterUserOrgName;
+
+    private Long subUserId;
+    private Long subUserOrgId;
+    private String subUserName;
+    private String subUserAccount;
+    private String subUserOrgName;
+}

+ 16 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/dto/SysUserMapperDTO.java

@@ -0,0 +1,16 @@
+package com.xunmei.system.dto;
+
+import com.xunmei.system.api.domain.SysUserInformation;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author :LuoWei
+ * @date : 2023/11/2
+ */
+@Data
+public class SysUserMapperDTO {
+    private Long masterUserId;
+    private List<Long> mapperUserIds;
+}

+ 29 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysUserAccountMapper.java

@@ -0,0 +1,29 @@
+package com.xunmei.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.system.domain.SysUserMapperDomain;
+
+import java.util.List;
+
+/**
+ * 用户表 数据层
+ *
+ * @author xunmei
+ */
+public interface SysUserAccountMapper extends BaseMapper<SysUserMapperDomain> {
+    /**
+     * 通过用户ID删除用户和用户关联
+     *
+     * @param masterUserId 用户ID
+     * @return 结果
+     */
+    int deleteMapperByMasterUserId(Long masterUserId);
+
+    /**
+     * 批量新增用户和用户关联
+     *
+     * @param list 关系列表
+     * @return 结果
+     */
+    int batchInsertMapperUser(List<SysUserMapperDomain> list);
+}

+ 3 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/mapper/SysUserMapper.java

@@ -6,6 +6,7 @@ import com.xunmei.common.core.domain.message.domain.CoreAnnouncementNotification
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.SysRole;
 import com.xunmei.system.api.domain.SysUser;
+import com.xunmei.system.domain.vo.SysMasterSubUserVO;
 import com.xunmei.system.domain.vo.SysUserVO;
 import com.xunmei.system.api.dto.SysPlanOrgDTO;
 import com.xunmei.system.util.SecurityUserExport;
@@ -166,4 +167,6 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
     List<String> selectCountByNames(@Param("names") List<String> names);
 
     List<Long> checkUserPermission(@Param("menuIds") List<Long> menuIds,@Param("userId")  Long userId);
+
+    List<SysMasterSubUserVO> selectSwitchUserList(@Param("masterUserId") Long masterUserId);
 }

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

@@ -5,6 +5,7 @@ import com.xunmei.common.core.domain.message.domain.CoreAnnouncementNotification
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.system.api.domain.SysRole;
 import com.xunmei.system.api.domain.SysUser;
+import com.xunmei.system.domain.vo.SysMasterSubUserVO;
 import com.xunmei.system.domain.vo.SysUserListVo;
 import com.xunmei.system.domain.vo.SysUserVO;
 import com.xunmei.system.api.dto.SysPlanOrgDTO;
@@ -247,4 +248,20 @@ public interface ISysUserService extends IService<SysUser> {
     List<Long> checkUserPermission(@RequestParam List<Long> menuIds,Long userId);
 
     List<Long> selectUserRoleMenu(Long userId);
+
+    /**
+     * 通过用户ID查询用户可切换子账号
+     *
+     * @param masterUserId 用户ID
+     * @return 用户对象信息
+     */
+    List<SysMasterSubUserVO> selectSwitchUserList(Long masterUserId,Long subUserId);
+
+    /**
+     * 保存用户关系
+     *
+     * @param masterUserId  用户ID
+     * @param mapperUserIds 角色组
+     */
+    void insertUserMapper(Long masterUserId, Long[] mapperUserIds);
 }

+ 60 - 9
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysUserServiceImpl.java

@@ -6,11 +6,9 @@ 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.constant.SecurityConstants;
 import com.xunmei.common.core.constant.UserConstants;
 import com.xunmei.common.core.domain.OrgTreeReq;
 import com.xunmei.common.core.domain.OrgTreeResp;
-import com.xunmei.common.core.domain.R;
 import com.xunmei.common.core.domain.message.domain.CoreAnnouncementNotificationToRole;
 import com.xunmei.common.core.exception.ServiceException;
 import com.xunmei.common.core.util.BeanHelper;
@@ -22,10 +20,8 @@ import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.SysRole;
 import com.xunmei.system.api.domain.SysUser;
-import com.xunmei.system.domain.SysPost;
-import com.xunmei.system.domain.SysRoleMenu;
-import com.xunmei.system.domain.SysUserPost;
-import com.xunmei.system.domain.SysUserRole;
+import com.xunmei.system.domain.*;
+import com.xunmei.system.domain.vo.SysMasterSubUserVO;
 import com.xunmei.system.domain.vo.SysUserListVo;
 import com.xunmei.system.domain.vo.SysUserVO;
 import com.xunmei.system.api.dto.SysPlanOrgDTO;
@@ -36,7 +32,6 @@ import com.xunmei.system.service.ISysOrgService;
 import com.xunmei.system.service.ISysUserService;
 import com.xunmei.system.util.SecurityUserExport;
 import com.xunmei.system.util.UserExport;
-import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,10 +39,8 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.validation.Validator;
-import java.security.Security;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -85,6 +78,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Autowired
     SysRoleMenuMapper roleMenuMapper;
 
+    @Autowired
+    SysUserAccountMapper userAccountMapper;
+
     /**
      * 根据条件分页查询用户列表
      *
@@ -786,4 +782,59 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 .distinct()
                 .collect(Collectors.toList());
     }
+
+    @Override
+    public List<SysMasterSubUserVO> selectSwitchUserList(Long masterUserId,Long subUserId) {
+        List<SysMasterSubUserVO> result=new ArrayList<>();
+        if(ObjectUtil.isNotNull(masterUserId))
+        {
+            result = baseMapper.selectSwitchUserList(masterUserId);
+        }
+        // 子账号 可以切回 主账号
+        if(ObjectUtil.isNotEmpty(subUserId) && !result.isEmpty())
+        {
+            Optional<SysMasterSubUserVO> first = result.stream().filter(x -> ObjectUtil.equal(x.getSubUserId(), subUserId)).findFirst();
+            if(first.isPresent())
+            {
+                result.remove(first.get());
+            }
+
+            // 手动将主账号加入
+            SysMasterSubUserVO temp =new SysMasterSubUserVO();
+            temp.setMasterUserId(masterUserId);
+            SysUser masterSysUser = selectUserById(masterUserId);
+            temp.setSubUserId(masterUserId);
+            temp.setSubUserName(masterSysUser.getName());
+            temp.setSubUserAccount(masterSysUser.getUsername());
+            temp.setSubUserOrgId(masterSysUser.getOrgId());
+
+            SysOrg org = sysOrgMapper.selectOne(new LambdaQueryWrapper<SysOrg>()
+                    .eq(SysOrg::getId, masterSysUser.getOrgId())
+                    .select(SysOrg::getType, SysOrg::getShortName,SysOrg::getPath));
+            if (ObjectUtil.isNotEmpty(org)) {
+                temp.setSubUserOrgName(org.getShortName());
+            }
+            result.add(temp);
+        }
+        return result;
+    }
+
+    @Override
+    public void insertUserMapper(Long masterUserId, Long[] mapperUserIds) {
+        userAccountMapper.deleteMapperByMasterUserId(masterUserId);
+        if (StringUtils.isNotEmpty(mapperUserIds)) {
+            List<SysUserMapperDomain> list = new ArrayList<SysUserMapperDomain>();
+            for (Long userId : mapperUserIds) {
+                SysUserMapperDomain ur = new SysUserMapperDomain();
+                ur.setMasterUserId(masterUserId);
+                ur.setSubUserId(userId);
+                ur.setCreateBy(SecurityUtils.getUsername());
+                ur.setCreateTime(new Date());
+                ur.setUpdateBy(SecurityUtils.getUsername());
+                ur.setUpdateTime(new Date());
+                list.add(ur);
+            }
+            userAccountMapper.batchInsertMapperUser(list);
+        }
+    }
 }

+ 17 - 0
soc-modules/soc-modules-system/src/main/resources/mapper/system/SysUserAccountMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xunmei.system.mapper.SysUserAccountMapper">
+
+    <delete id="deleteMapperByMasterUserId" parameterType="Long">
+        delete from sys_user_account_mapper where master_user_id=#{masterUserId}
+    </delete>
+
+    <insert id="batchInsertMapperUser">
+        insert into sys_user_account_mapper(master_user_id, sub_user_id,create_by,create_time) values
+        <foreach item="item" index="index" collection="list" separator=",">
+            (#{item.masterUserId},#{item.subUserId},#{item.createBy},#{item.createTime})
+        </foreach>
+    </insert>
+</mapper>

+ 27 - 0
soc-modules/soc-modules-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -508,6 +508,10 @@
         <if test="info.onlyManager ==true">
             AND t.is_manage ='Y'
         </if>
+        <if test="info.source !=null">
+            AND t.source =0
+        </if>
+
         <!--        <if test="info.onlyManager ==false or info.onlyManager==null">-->
         <!--            AND (t.is_manage is NULL OR t.is_manage ='N')-->
         <!--        </if>-->
@@ -750,4 +754,27 @@
             #{menuId}
         </foreach>
     </select>
+
+    <select id="selectSwitchUserList" resultType="com.xunmei.system.domain.vo.SysMasterSubUserVO">
+        select
+        um.master_user_id as masterUserId,
+        u.id as subUserId,
+        u.org_id as subUserOrgId,
+        u.username as subUserAccount,
+        u.`name` as subUserName,
+        o.short_name as subUserOrgName
+        FROM
+        sys_user_account_mapper um
+        INNER JOIN sys_user u ON u.id = um.sub_user_id
+        INNER JOIN sys_org o ON o.id=u.org_id
+        WHERE um.master_user_id=#{masterUserId}
+
+<!--        select rm.menu_id from sys_user_role ur-->
+<!--        INNER JOIN sys_role_menu rm on ur.role_id=rm.role_id-->
+<!--        WHERE ur.user_id=#{userId} and rm.menu_id in-->
+<!--        <foreach collection="menuIds" item="menuId" separator="," close=")" open="(">-->
+<!--            #{menuId}-->
+<!--        </foreach>-->
+    </select>
+
 </mapper>