소스 검색

添加用户时增加角色对应数据权限相关科室、医疗组校验;角色权限加载改为异步;已关联未关联字符改为0,1

songxinlu 3 년 전
부모
커밋
846454af03
20개의 변경된 파일155개의 추가작업 그리고 35개의 파일을 삭제
  1. 2 2
      common/src/main/java/com/lantone/common/dto/DeptDTO.java
  2. 1 1
      common/src/main/java/com/lantone/common/dto/GetDeptTreeDTO.java
  3. 1 1
      common/src/main/java/com/lantone/common/dto/GetHospitalTreeDTO.java
  4. 2 2
      common/src/main/java/com/lantone/common/dto/HospitalDTO.java
  5. 1 1
      common/src/main/java/com/lantone/common/vo/AddUserVO.java
  6. 1 1
      common/src/main/java/com/lantone/common/vo/UpdateUserVO.java
  7. 1 1
      dblayer-mbg/src/main/java/com/lantone/dblayermbg/entity/User.java
  8. 2 1
      dblayer-mbg/src/main/java/com/lantone/dblayermbg/facade/ResourceFacade.java
  9. 3 0
      dblayer-mbg/src/main/java/com/lantone/dblayermbg/mapper/RoleMapper.java
  10. 0 1
      dblayer-mbg/src/main/java/com/lantone/dblayermbg/mapper/SoftwareMenuMapper.java
  11. 3 3
      dblayer-mbg/src/main/resources/mapper/DoctorMapper.xml
  12. 32 0
      dblayer-mbg/src/main/resources/mapper/RoleMapper.xml
  13. 2 2
      dblayer-mbg/src/main/resources/mapper/RoleSoftwareMenuMapper.xml
  14. 2 2
      security-center/src/main/java/com/lantone/security/enums/RelationEnum.java
  15. 0 3
      security-center/src/main/java/com/lantone/security/facade/DataAuthManagementFacade.java
  16. 0 1
      security-center/src/main/java/com/lantone/security/facade/RoleManagementFacade.java
  17. 96 12
      security-center/src/main/java/com/lantone/security/facade/UserManagementFacade.java
  18. 2 1
      security-center/src/main/java/com/lantone/security/web/FuncManagementController.java
  19. 2 0
      security-center/src/main/java/com/lantone/security/web/HospitalManagementController.java
  20. 2 0
      security-center/src/main/java/com/lantone/security/web/RoleManagementController.java

+ 2 - 2
common/src/main/java/com/lantone/common/dto/DeptDTO.java

@@ -46,6 +46,6 @@ public class DeptDTO implements Serializable {
 
     @ApiModelProperty(value = "是否删除,N:未删除,Y:删除")
     private String isDeleted;
-    @ApiModelProperty(value = "关联标志位 true 关联")
-    private String relation = "未关联";
+    @ApiModelProperty(value = "关联标志位 1 关联")
+    private String relation = "0";
 }

+ 1 - 1
common/src/main/java/com/lantone/common/dto/GetDeptTreeDTO.java

@@ -16,5 +16,5 @@ public class GetDeptTreeDTO implements Serializable {
     @ApiModelProperty(value = "科室名称")
     private String deptName;
     @ApiModelProperty(value = "是否关联")
-    private String relation = "未关联";
+    private String relation = "0";
 }

+ 1 - 1
common/src/main/java/com/lantone/common/dto/GetHospitalTreeDTO.java

@@ -36,5 +36,5 @@ public class GetHospitalTreeDTO implements Serializable {
     private List<GetHospitalTreeDTO> children;
 
     @ApiModelProperty(value = "是否关联")
-    private String relation = "未关联";
+    private String relation = "0";
 }

+ 2 - 2
common/src/main/java/com/lantone/common/dto/HospitalDTO.java

@@ -59,6 +59,6 @@ public class HospitalDTO implements Serializable {
 
     @ApiModelProperty(value = "该虚拟医院的医院列表")
     private List<HospitalDTO> hospitalDTOS;
-    @ApiModelProperty(value = "关联标志位 true 关联")
-    private String relation = "未关联";
+    @ApiModelProperty(value = "关联标志位 1 关联")
+    private String relation = "0";
 }

+ 1 - 1
common/src/main/java/com/lantone/common/vo/AddUserVO.java

@@ -51,7 +51,7 @@ public class AddUserVO implements Serializable {
     private String titleId;
 
     @ApiModelProperty(value = "工号")
-    private Integer jobNo;
+    private Long jobNo;
 
     @ApiModelProperty(value = "排序")
     private Integer orderNo;

+ 1 - 1
common/src/main/java/com/lantone/common/vo/UpdateUserVO.java

@@ -51,7 +51,7 @@ public class UpdateUserVO implements Serializable {
     private String titleId;
 
     @ApiModelProperty(value = "工号")
-    private Integer jobNo;
+    private Long jobNo;
 
     @ApiModelProperty(value = "排序")
     private Integer orderNo;

+ 1 - 1
dblayer-mbg/src/main/java/com/lantone/dblayermbg/entity/User.java

@@ -80,7 +80,7 @@ public class User implements Serializable {
      * 工号
      */
     @TableField("job_no")
-    private Integer jobNo;
+    private Long jobNo;
 
     /**
      * 排序

+ 2 - 1
dblayer-mbg/src/main/java/com/lantone/dblayermbg/facade/ResourceFacade.java

@@ -7,6 +7,7 @@ import com.lantone.common.enums.StatusEnum;
 import com.lantone.common.service.RedisService;
 import com.lantone.dblayermbg.service.impl.ResourceServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
 import java.util.Arrays;
@@ -23,7 +24,7 @@ public class ResourceFacade extends ResourceServiceImpl {
 
     @Autowired
     private RedisService redisService;
-
+    @Async
     public Map<String, List<String>> initResourceRolesMap() {
         Map<String, List<String>> resourceRolesMap = Maps.newHashMap();
         List<String> resourceRolesList = baseMapper.getResourceRolesMap(IsDeleteEnum.N.getKey(), StatusEnum.Enable.getKey());

+ 3 - 0
dblayer-mbg/src/main/java/com/lantone/dblayermbg/mapper/RoleMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.lantone.common.dto.GetCreateRoleDTO;
 import com.lantone.common.dto.GetRolePageDTO;
+import com.lantone.common.dto.UserRoleDTO;
 import com.lantone.common.vo.GetRolePageVO;
 import com.lantone.dblayermbg.entity.Role;
 import org.apache.ibatis.annotations.Param;
@@ -25,4 +26,6 @@ public interface RoleMapper extends BaseMapper<Role> {
     IPage<GetRolePageDTO> getRolePage(@Param("getRolePageVO") GetRolePageVO getRolePageVO);
 
     List<GetCreateRoleDTO> getCreateRoles(@Param("creator") Long creator,@Param("softwareId") Long softwareId);
+
+    List<UserRoleDTO> getDataAuthRole(@Param("creator") Long creator,@Param("roles")List<Long> roles,@Param("dataTypes")List<Long> dataTypes);
 }

+ 0 - 1
dblayer-mbg/src/main/java/com/lantone/dblayermbg/mapper/SoftwareMenuMapper.java

@@ -1,7 +1,6 @@
 package com.lantone.dblayermbg.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.lantone.common.dto.SoftwareMenuRelationDTO;
 import com.lantone.dblayermbg.entity.SoftwareMenu;
 import org.apache.ibatis.annotations.Param;
 

+ 3 - 3
dblayer-mbg/src/main/resources/mapper/DoctorMapper.xml

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.lantone.dblayermbg.mapper.DoctorMapper">
     <select id="getDoctorPage" resultType="com.lantone.common.dto.GetDoctorPageDTO">
-        SELECT
+        SELECT DISTINCT
         *
         FROM
         (
@@ -16,8 +16,8 @@
         doc.mobilePhone,
         IF (
         detail.detail_id IS NULL,
-        '未关联',
-        '已关联'
+        '0',
+        '1'
         ) relation
         FROM
         sys_hospital h,

+ 32 - 0
dblayer-mbg/src/main/resources/mapper/RoleMapper.xml

@@ -43,4 +43,36 @@
         AND r.creator = #{creator}
         AND r.remark != 'ManagementRole'
     </select>
+    <select id="getDataAuthRole" resultType="com.lantone.common.dto.UserRoleDTO">
+        SELECT DISTINCT
+            r.id roleId,
+            r.`name` roleName
+        FROM
+            sys_role r,
+            sys_role_software_data_auth rsda,
+            sys_software_data_auth sda,
+            sys_data_auth_detail detail
+        WHERE
+            r.is_deleted = 'N'
+        AND rsda.is_deleted = 'N'
+        AND sda.is_deleted = 'N'
+        AND detail.is_deleted = 'N'
+        AND r.`status` = 1
+        AND r.id = rsda.role_id
+        AND rsda.software_data_auth_id = sda.id
+        AND sda.id = detail.software_data_auth_id
+        AND r.creator = #{creator}
+        <if test="dataTypes !=null and dataTypes.size!=0">
+            AND detail.data_type IN
+            <foreach collection="dataTypes" item="id" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
+        <if test="roles !=null and roles.size!=0">
+            AND r.id IN
+            <foreach collection="roles" item="id" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
+    </select>
 </mapper>

+ 2 - 2
dblayer-mbg/src/main/resources/mapper/RoleSoftwareMenuMapper.xml

@@ -121,8 +121,8 @@
             t1.*,
         IF (
             t2.menuId IS NULL,
-            "未关联",
-            "已关联"
+            "0",
+            "1"
         ) relation
         FROM
             (

+ 2 - 2
security-center/src/main/java/com/lantone/security/enums/RelationEnum.java

@@ -10,8 +10,8 @@ import lombok.Setter;
  */
 public enum RelationEnum {
 
-    Y("Y", "已关联"),
-    N("N", "未关联");
+    Y("Y", "1"),
+    N("N", "0");
 
     @Getter
     @Setter

+ 0 - 3
security-center/src/main/java/com/lantone/security/facade/DataAuthManagementFacade.java

@@ -40,9 +40,7 @@ import com.lantone.dblayermbg.service.impl.DataAuthDetailServiceImpl;
 import com.lantone.dblayermbg.service.impl.RoleSoftwareDataAuthServiceImpl;
 import com.lantone.security.enums.DataAuthDataTypeEnum;
 import com.lantone.security.enums.DataAuthDetailTypeEnum;
-import com.lantone.security.enums.HospitalTypeEnum;
 import com.lantone.common.enums.IsDeleteEnum;
-import com.lantone.security.enums.RelationEnum;
 import com.lantone.security.enums.ServiceEnum;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,7 +49,6 @@ import org.springframework.stereotype.Component;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 

+ 0 - 1
security-center/src/main/java/com/lantone/security/facade/RoleManagementFacade.java

@@ -50,7 +50,6 @@ import com.lantone.dblayermbg.service.impl.RoleSoftwareResourceServiceImpl;
 import com.lantone.common.enums.IsDeleteEnum;
 import com.lantone.security.enums.DictionaryEnum;
 import com.lantone.security.enums.RelationEnum;
-import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;

+ 96 - 12
security-center/src/main/java/com/lantone/security/facade/UserManagementFacade.java

@@ -13,6 +13,7 @@ import com.lantone.common.dto.GetUserDTO;
 import com.lantone.common.dto.GetUserHospitalsDTO;
 import com.lantone.common.dto.GetUserPageDTO;
 import com.lantone.common.dto.SoftwareDTO;
+import com.lantone.common.dto.UserRoleDTO;
 import com.lantone.common.dto.UserSoftwareHospitalDTO;
 import com.lantone.common.enums.IsDeleteEnum;
 import com.lantone.common.enums.StatusEnum;
@@ -29,6 +30,7 @@ import com.lantone.common.vo.UpdateUserVO;
 import com.lantone.dblayermbg.entity.DeptUser;
 import com.lantone.dblayermbg.entity.Hospital;
 import com.lantone.dblayermbg.entity.HospitalUser;
+import com.lantone.dblayermbg.entity.MedoupDoctor;
 import com.lantone.dblayermbg.entity.Role;
 import com.lantone.dblayermbg.entity.User;
 import com.lantone.dblayermbg.entity.UserRole;
@@ -36,9 +38,12 @@ import com.lantone.dblayermbg.facade.DeptFacade;
 import com.lantone.dblayermbg.facade.DeptUserFacade;
 import com.lantone.dblayermbg.facade.HospitalFacade;
 import com.lantone.dblayermbg.facade.HospitalUserFacade;
+import com.lantone.dblayermbg.facade.MedoupDoctorFacade;
 import com.lantone.dblayermbg.facade.RoleFacade;
 import com.lantone.dblayermbg.facade.UserFacade;
 import com.lantone.dblayermbg.facade.UserRoleFacade;
+import com.lantone.security.enums.DataAuthDataTypeEnum;
+import com.lantone.security.enums.DataAuthDetailTypeEnum;
 import com.lantone.security.enums.HospitalTypeEnum;
 import com.lantone.security.enums.RelationEnum;
 import com.lantone.security.service.AuthService;
@@ -81,6 +86,8 @@ public class UserManagementFacade {
     private UserRoleFacade userRoleFacade;
     @Autowired
     private RoleFacade roleFacade;
+    @Autowired
+    private MedoupDoctorFacade medoupDoctorFacade;
 
     public CommonResult login(LoginVO loginVO) {
         Map<String, String> params = new HashMap<>();
@@ -139,8 +146,15 @@ public class UserManagementFacade {
         user.setCreator(SysUserUtils.getCurrentPrincipleId() + "");
         user.setGmtCreate(DateUtil.now());
         user.setPassword(BCrypt.hashpw(user.getPassword()));
+        if (addUserVO.getJobNo() != null) {
+            addUserVO.setDoctorId(addUserVO.getJobNo());
+        }
         //1.1校验用户
-        checkUser(user.getUsername(),null, addUserVO.getAddHospitalTreeVO().getHospitals(), addUserVO.getRoles());
+        boolean deptFlag = false;
+        if (ListUtil.isNotEmpty(addUserVO.getAddHospitalTreeVO().getDepts())) {
+            deptFlag = true;
+        }
+        checkUser(user, deptFlag, addUserVO.getAddHospitalTreeVO().getHospitals(), addUserVO.getRoles());
         try {
             if (userFacade.save(user)) {
                 //2.插入用户所属组织
@@ -155,32 +169,32 @@ public class UserManagementFacade {
     }
 
     /**
-     * @param usreName
+     * @param user
      * @param hospitals 插入用户组织id
      * @param roles     插入用户角色id
      * @Description用户校验
      * @Return void
      */
-    private void checkUser(String usreName, Long userId, List<Long> hospitals, List<Long> roles) {
+    private void checkUser(User user, boolean deptFlag, List<Long> hospitals, List<Long> roles) {
 
         //1.当前登录用户、组织是否还存在、能用
         loginCheck();
         //2.当前用户是否已存在
         //添加时判断
-        if (userId == null) {
+        if (user.getId() == null) {
             if (userFacade.list(new QueryWrapper<User>()
-                    .eq("username", usreName)
+                    .eq("username", user.getUsername())
                     .eq("is_deleted", IsDeleteEnum.N.getKey())).size() > 0) {
                 Asserts.fail("该用户已存在,请更换用户名");
             }
             //修改时判断
         } else {
-            User user = userFacade.getById(userId);
+            User userTemp = userFacade.getById(user.getId());
             //用户名没有变动
-            if (!usreName.equals(user.getName())) {
-                if(userFacade.list(new QueryWrapper<User>()
-                        .eq("username", usreName)
-                        .eq("is_deleted", IsDeleteEnum.N.getKey())).size()>0){
+            if (!user.getUsername().equals(userTemp.getName())) {
+                if (userFacade.list(new QueryWrapper<User>()
+                        .eq("username", user.getUsername())
+                        .eq("is_deleted", IsDeleteEnum.N.getKey())).size() > 0) {
                     Asserts.fail("该用户已存在,请更换用户名");
                 }
             }
@@ -189,6 +203,68 @@ public class UserManagementFacade {
         checkHospitals(hospitals);
         //4.校验插入用户角色是否正常
         checkRoles(roles);
+        //5.用户如果没有医疗组、科室 绑定角色不能选择本医疗组、全部科室除本科室外、本科室数据权限角色
+        //科室
+        if (!deptFlag) {
+            userDeptCheck(roles);
+        }
+        //医疗组(无医生信息,就不会有医疗组;有医生信息无医疗组)
+        boolean groupFlag = false;
+        if (user.getDoctorId() == null) {
+            groupFlag = true;
+        } else {
+            List<MedoupDoctor> medoupDoctors = medoupDoctorFacade.list(new QueryWrapper<MedoupDoctor>()
+                    .eq("dcotor_id", user.getDoctorId())
+                    .eq("is_deleted", IsDeleteEnum.N.getKey()));
+            if (ListUtil.isEmpty(medoupDoctors)) {
+                groupFlag = true;
+            }
+        }
+        if (!groupFlag) {
+            usermedoupCheck();
+        }
+    }
+
+    /**
+     * @param
+     * @Description医疗组校验
+     * @Return void
+     */
+    private void usermedoupCheck() {
+
+        //获取当前用户的角色
+        List<Long> dataTypes = new ArrayList<>();
+        dataTypes.add(DataAuthDataTypeEnum.SELF_MEDOUP.getKey() * 1l);
+        List<UserRoleDTO> checkRoles = roleFacade.getBaseMapper()
+                .getDataAuthRole(SysUserUtils.getCurrentPrincipleId(), null, dataTypes);
+        StringBuffer errStr = new StringBuffer();
+        if (ListUtil.isNotEmpty(checkRoles)) {
+            checkRoles.stream().forEach(userRoleDTO -> {
+                errStr.append(userRoleDTO.getRoleName() + ";");
+            });
+            Asserts.fail(errStr.toString() + "角色需要用户填写医生工号并且该医生存在医疗组信息");
+        }
+    }
+
+    /**
+     * @param roles
+     * @Description校验用户如果没有科室信息时,是否分配科室数据权限相关的角色
+     * @Return void
+     */
+    private void userDeptCheck(List<Long> roles) {
+        //获取当前用户的角色
+        List<Long> dataTypes = new ArrayList<>();
+        dataTypes.add(DataAuthDataTypeEnum.ALL_DEPT_NOT_SELF.getKey() * 1l);
+        dataTypes.add(DataAuthDataTypeEnum.ALL_SELF_DEPT.getKey() * 1l);
+        List<UserRoleDTO> checkRoles = roleFacade.getBaseMapper()
+                .getDataAuthRole(SysUserUtils.getCurrentPrincipleId(), roles, dataTypes);
+        StringBuffer errStr = new StringBuffer();
+        if (ListUtil.isNotEmpty(checkRoles)) {
+            checkRoles.stream().forEach(userRoleDTO -> {
+                errStr.append(userRoleDTO.getRoleName() + ";");
+            });
+            Asserts.fail(errStr.toString() + "角色需要用户具备科室信息");
+        }
     }
 
     /**
@@ -327,12 +403,20 @@ public class UserManagementFacade {
      */
     public boolean updateUser(UpdateUserVO updateUserVO) {
         //1.删除该用户关联的科室、医院
-        //1.1校验用户
-        checkUser(updateUserVO.getUsername(),updateUserVO.getId(), updateUserVO.getAddHospitalTreeVO().getHospitals(), updateUserVO.getRoles());
         if (delUserHospitalORDept(updateUserVO.getId())) {
+            //工号为医生号
+            if (updateUserVO.getJobNo() != null) {
+                updateUserVO.setDoctorId(updateUserVO.getJobNo());
+            }
             User user = new User();
             BeanUtils.copyProperties(updateUserVO, user);
             user.setPassword(BCrypt.hashpw(user.getPassword()));
+            //1.1校验用户
+            boolean deptFlag = false;
+            if (ListUtil.isNotEmpty(updateUserVO.getAddHospitalTreeVO().getDepts())) {
+                deptFlag = true;
+            }
+            checkUser(user, deptFlag, updateUserVO.getAddHospitalTreeVO().getHospitals(), updateUserVO.getRoles());
             if (userFacade.updateById(user)) {
                 //2.插入用户新关联的医院、科室
                 return saveUserHospital(updateUserVO.getAddHospitalTreeVO(), updateUserVO.getId(), updateUserVO.getRoles());

+ 2 - 1
security-center/src/main/java/com/lantone/security/web/FuncManagementController.java

@@ -4,12 +4,12 @@ import com.lantone.common.api.CommonResult;
 import com.lantone.common.dto.GetMenuByIdDTO;
 import com.lantone.common.dto.GetMenusTreeDTO;
 import com.lantone.common.vo.AddMenuVO;
-import com.lantone.common.vo.GetMenusTreeVo;
 import com.lantone.common.vo.UpdateMenuVO;
 import com.lantone.security.facade.FuncManagementFacade;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -30,6 +30,7 @@ import java.util.List;
 @RestController
 @Api(value = "功能管理API", tags = { "功能管理API" })
 @RequestMapping("/funcManage")
+@EnableAsync
 public class FuncManagementController {
     @Autowired
     private FuncManagementFacade funcManagementFacade;

+ 2 - 0
security-center/src/main/java/com/lantone/security/web/HospitalManagementController.java

@@ -11,6 +11,7 @@ import com.lantone.security.facade.HospitalManagementFacade;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -30,6 +31,7 @@ import java.util.Map;
 @RestController
 @Api(value = "组织管理API", tags = "组织管理API")
 @RequestMapping("/hospitalManage")
+@EnableAsync
 public class HospitalManagementController {
     @Autowired
     private HospitalManagementFacade hospitalManagementFacade;

+ 2 - 0
security-center/src/main/java/com/lantone/security/web/RoleManagementController.java

@@ -14,6 +14,7 @@ import com.lantone.security.facade.RoleManagementFacade;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -35,6 +36,7 @@ import java.util.Map;
 @RestController
 @Api(value = "角色管理API", tags = { "角色管理API" })
 @RequestMapping("/roleManage")
+@EnableAsync
 public class RoleManagementController {
     @Autowired
     private RoleManagementFacade roleManagementFacade;