Преглед на файлове

完善用户登录后获取用户信息、显示菜单接口;新增用户登录后获取数据权限功能

songxinlu преди 3 години
родител
ревизия
54c8fd2a76
променени са 20 файла, в които са добавени 358 реда и са изтрити 51 реда
  1. 23 0
      common/src/main/java/com/lantone/common/dto/GetDataAuthDetailDTO.java
  2. 2 0
      common/src/main/java/com/lantone/common/dto/GetUserShowTreeDTO.java
  3. 54 0
      common/src/main/java/com/lantone/common/dto/UserInfoDTO.java
  4. 2 1
      common/src/main/java/com/lantone/common/vo/GetDoctorPageVO.java
  5. 2 2
      dblayer-mbg/src/main/java/com/lantone/dblayermbg/entity/MedoupDoctor.java
  6. 2 0
      dblayer-mbg/src/main/java/com/lantone/dblayermbg/mapper/DataAuthMapper.java
  7. 5 0
      dblayer-mbg/src/main/java/com/lantone/dblayermbg/mapper/MedoupDoctorMapper.java
  8. 1 1
      dblayer-mbg/src/main/java/com/lantone/dblayermbg/mapper/RoleSoftwareMenuMapper.java
  9. 30 0
      dblayer-mbg/src/main/resources/mapper/DataAuthMapper.xml
  10. 4 2
      dblayer-mbg/src/main/resources/mapper/DoctorMapper.xml
  11. 0 3
      dblayer-mbg/src/main/resources/mapper/HospitalUserMapper.xml
  12. 27 0
      dblayer-mbg/src/main/resources/mapper/MedoupDoctorMapper.xml
  13. 9 5
      dblayer-mbg/src/main/resources/mapper/RoleSoftwareMenuMapper.xml
  14. 1 1
      dblayer-mbg/src/main/resources/mapper/base/BaseMedoupDoctorMapper.xml
  15. 14 6
      security-center/src/main/java/com/lantone/security/annotation/DataAuthFilter.java
  16. 34 18
      security-center/src/main/java/com/lantone/security/aop/DataAuthFilterAspect.java
  17. 122 4
      security-center/src/main/java/com/lantone/security/facade/DataAuthManagementFacade.java
  18. 22 5
      security-center/src/main/java/com/lantone/security/facade/RoleManagementFacade.java
  19. 1 1
      security-center/src/main/java/com/lantone/security/web/RoleManagementController.java
  20. 3 2
      security-center/src/main/java/com/lantone/security/web/UserManagementController.java

+ 23 - 0
common/src/main/java/com/lantone/common/dto/GetDataAuthDetailDTO.java

@@ -0,0 +1,23 @@
+package com.lantone.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author songxl
+ * @Date 2021/7/22
+ */
+@Data
+public class GetDataAuthDetailDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "数据范围类型::1:全部组织,2:全部科室,3:全部科室除本科室外,4:本科室,5:本医疗组,6:本人,7:自定义")
+    private Integer dataType;
+    @ApiModelProperty(value = "选择数据权限的类型 1:为医院  2:科室 3:为医生")
+    private Integer detailType;
+    @ApiModelProperty(value = "数据编号")
+    private Long detailId;
+}

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

@@ -26,6 +26,8 @@ public class GetUserShowTreeDTO implements Serializable {
     private String menuName;
     @ApiModelProperty(value = "类型:0:目录,1菜单,2按钮,3:功能")
     private String menuType ;
+    @ApiModelProperty(value = "权限标识")
+    private String url ;
     @ApiModelProperty(value = "子集")
     private List<GetUserShowTreeDTO> children;
 }

+ 54 - 0
common/src/main/java/com/lantone/common/dto/UserInfoDTO.java

@@ -0,0 +1,54 @@
+package com.lantone.common.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * <p>
+ * 用户实体类
+ * </p>
+ */
+@Data
+public class UserInfoDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "编号")
+    private Long id;
+    @ApiModelProperty(value = "医生id")
+    private Long doctorId;
+
+    @ApiModelProperty(value = "用户名" )
+    private String username;
+
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "性别")
+    private Integer sex;
+
+    @ApiModelProperty(value = "手机号")
+    private String mobilePhone;
+
+    @ApiModelProperty(value = "身份证号")
+    private String idcard;
+
+    @ApiModelProperty(value = "职称编号")
+    private String titleId;
+    @ApiModelProperty(value = "职称名称")
+    private String titleName;
+
+    @ApiModelProperty(value = "工号")
+    private Integer jobNo;
+
+    @ApiModelProperty(value = "排序")
+    private Integer orderNo;
+
+    @ApiModelProperty(value = "状态 0:禁用,1:启用")
+    private String status;
+
+}

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

@@ -1,6 +1,7 @@
 package com.lantone.common.vo;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.lantone.common.vo.base.BasePageVo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -15,7 +16,7 @@ import java.util.List;
  * </p>
  */
 @Data
-public class GetDoctorPageVO extends Page implements Serializable {
+public class GetDoctorPageVO extends BasePageVo implements Serializable {
 
     private static final long serialVersionUID = 1L;
 

+ 2 - 2
dblayer-mbg/src/main/java/com/lantone/dblayermbg/entity/MedoupDoctor.java

@@ -37,8 +37,8 @@ public class MedoupDoctor implements Serializable {
     /**
      * 医生ID
      */
-    @TableField("dcotor_id")
-    private Long dcotorId;
+    @TableField("doctor_id")
+    private Long doctorId;
 
     /**
      * 是否删除,N:未删除,Y:删除

+ 2 - 0
dblayer-mbg/src/main/java/com/lantone/dblayermbg/mapper/DataAuthMapper.java

@@ -2,6 +2,7 @@ package com.lantone.dblayermbg.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.lantone.common.dto.GetDataAuthDetailDTO;
 import com.lantone.common.dto.GetDataAuthPageDTO;
 import com.lantone.common.dto.SoftwareDataAuthDetail;
 import com.lantone.common.vo.GetDataAuthPageVO;
@@ -41,4 +42,5 @@ public interface DataAuthMapper extends BaseMapper<DataAuth> {
     IPage<GetDataAuthPageDTO> getDataAuthPage(@Param("dataAuthVO") GetDataAuthPageVO getDataAuthPageVO);
 
 
+    List<GetDataAuthDetailDTO> getDataAuth(@Param("userID") Long userID,@Param("softwareId") String softwareId);
 }

+ 5 - 0
dblayer-mbg/src/main/java/com/lantone/dblayermbg/mapper/MedoupDoctorMapper.java

@@ -2,6 +2,10 @@ package com.lantone.dblayermbg.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.lantone.dblayermbg.entity.MedoupDoctor;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Collection;
+import java.util.List;
 
 /**
  * <p>
@@ -10,4 +14,5 @@ import com.lantone.dblayermbg.entity.MedoupDoctor;
  */
 public interface MedoupDoctorMapper extends BaseMapper<MedoupDoctor> {
 
+    List<Long> getDoctorIdByMedoup(@Param("userId") Long userId);
 }

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

@@ -27,5 +27,5 @@ public interface RoleSoftwareMenuMapper extends BaseMapper<RoleSoftwareMenu> {
 
     List<UserMenuResourceTreeDTO> getMenuResourceRelation(@Param("loginRoles")List<Long> loginRoles,@Param("selectRoles") List<Long> selectRoles,@Param("menuIds") List menuIds);
 
-    List<GetUserShowTreeDTO> getUserShowMemuTree(@Param("roleIds") List<Long> roleIds,@Param("menuIds") List menuIds);
+    List<GetUserShowTreeDTO> getUserShowMemuTree(@Param("roleIds") List<Long> roleIds,@Param("menuIds") List menuIds,@Param("softwareId") Long softwareId);
 }

+ 30 - 0
dblayer-mbg/src/main/resources/mapper/DataAuthMapper.xml

@@ -114,4 +114,34 @@
             AND auth.name LIKE concat('%',#{dataAuthVO.name},'%')
         </if>
     </select>
+    <select id="getDataAuth" resultType="com.lantone.common.dto.GetDataAuthDetailDTO">
+        SELECT DISTINCT
+            u.id userID,
+            dad.data_type dataType,
+            dad.detail_id detailId,
+            dad.detail_type detailType
+        FROM
+            sys_user u,
+            sys_role r,
+            sys_user_role ur,
+            sys_hospital_user hu,
+            sys_software_data_auth sda,
+            sys_role_software_data_auth rsda
+        LEFT JOIN sys_data_auth_detail dad ON rsda.software_data_auth_id = dad.software_data_auth_id
+        WHERE
+            u.is_deleted = 'N'
+        AND r.is_deleted = 'N'
+        AND ur.is_deleted = 'N'
+        AND hu.is_deleted = 'N'
+        AND rsda.is_deleted = 'N'
+        AND dad.is_deleted = 'N'
+        AND sda.is_deleted = 'N'
+        AND u.id = hu.user_id
+        AND sda.id = rsda.software_data_auth_id
+        AND r.id = ur.role_id
+        AND ur.user_id = u.id
+        AND rsda.role_id = r.id
+        AND sda.software_id = #{softwareId}
+        AND u.id = #{userID}
+    </select>
 </mapper>

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

@@ -29,7 +29,7 @@
         AND detail.detail_id = doc.id
         AND detail.is_deleted = 'N'
         WHERE
-            dept.id = dd.dept_id
+        dept.id = dd.dept_id
         AND h.id = dept.hospital_id
         AND doc.id = dd.doctor_id
         AND h.is_deleted = 'N'
@@ -65,6 +65,8 @@
                 #{id}
             </foreach>
         </if>
-
+        <if test="doctorVO.map!=null and doctorVO.map.dataAuthFilter!=null and doctorVO.map.dataAuthFilter!=''">
+            AND ${doctorVO.map.dataAuthFilter}
+        </if>
     </select>
 </mapper>

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

@@ -38,9 +38,6 @@
         <if test="getUserPageVO.name !=null and getUserPageVO.name !=''">
             AND u.`name` LIKE concat('%',#{getUserPageVO.name},'%')
         </if>
-        <if test="getUserPageVO.map.dataAuthFilter != null ">
-            and ${getUserPageVO.map.dataAuthFilter}
-        </if>
     </select>
     <select id="getHospitalUserById" resultType="java.lang.Long">
         SELECT

+ 27 - 0
dblayer-mbg/src/main/resources/mapper/MedoupDoctorMapper.xml

@@ -2,4 +2,31 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.lantone.dblayermbg.mapper.MedoupDoctorMapper">
 
+    <select id="getDoctorIdByMedoup" resultType="java.lang.Long">
+        SELECT DISTINCT
+            d.id
+        FROM
+            sys_doctor d,
+            sys_medoup_doctor md
+        WHERE
+            d.id = md.doctor_id
+            AND d.is_deleted = 'N'
+            AND md.is_deleted = 'N'
+        AND md.medoup_id IN (
+            SELECT DISTINCT
+                md.medoup_id
+            FROM
+                sys_user u,
+                sys_doctor d,
+                sys_medoup_doctor md
+            WHERE
+                u.is_deleted = 'N'
+            AND d.is_deleted = 'N'
+            AND md.is_deleted = 'N'
+            AND u.`status` = '1'
+            AND u.job_no = d.`code`
+            AND md.doctor_id = d.id
+          AND u.id = #{userId}
+        )
+    </select>
 </mapper>

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

@@ -269,20 +269,24 @@
             sm.software_id softwareId,
             sm.id softwareMenuId,
             m.type menuType,
-            m.`name` menuName
+            m.`name` menuName,
+            res.url
         FROM
-            sys_role r
+        sys_role r
         JOIN sys_role_software_menu rsm ON r.id = rsm.role_id
         JOIN sys_software_menu sm ON rsm.software_menu_id = sm.id
-        JOIN sys_menu m ON sm.menu_id = m.id AND m.type !=3
+        JOIN sys_menu m ON sm.menu_id = m.id AND m.type != 3
+        LEFT JOIN sys_menu_resource mr ON mr.menu_id = m.id
+        LEFT JOIN sys_resource res ON res.id = mr.resource_id AND res.is_deleted = 'N'
         WHERE
-            r.is_deleted = 'N'
+        r.is_deleted = 'N'
         AND rsm.is_deleted = 'N'
         AND sm.is_deleted = 'N'
         AND m.is_deleted = 'N'
         AND r.`status` = '1'
         AND m.`status` = '1'
-    <if test="roleIds !=null and roleIds.size!=0">
+        AND sm.software_id = #{softwareId}
+        <if test="roleIds !=null and roleIds.size!=0">
         AND r.id IN
         <foreach collection="roleIds" item="id" open="(" close=")" separator=",">
             #{id}

+ 1 - 1
dblayer-mbg/src/main/resources/mapper/base/BaseMedoupDoctorMapper.xml

@@ -6,7 +6,7 @@
     <resultMap id="BaseResultMap" type="com.lantone.dblayermbg.entity.MedoupDoctor">
         <id column="id" property="id"/>
         <result column="medoup_id" property="medoupId"/>
-        <result column="dcotor_id" property="dcotorId"/>
+        <result column="doctor_id" property="doctorId"/>
         <result column="is_deleted" property="isDeleted"/>
         <result column="gmt_create" property="gmtCreate"/>
         <result column="gmt_modified" property="gmtModified"/>

+ 14 - 6
security-center/src/main/java/com/lantone/security/annotation/DataAuthFilter.java

@@ -16,16 +16,24 @@ import java.lang.annotation.Target;
 @Documented
 public @interface DataAuthFilter {
     /**
-     * 用户表的别名
+     * 自身数据范围的别名(in)
      */
-    String userAlias() default "";
+    String self() default "";
+
     /**
-     * 科室表的别名
+     * 用户表数据范围的别名(in)
      */
-    String deptAlias() default "";
+    String usersAlias() default "";
+
+    /**
+     * 科室表数据范围的别名(in)
+     */
+    String deptsAlias() default "";
+
     /**
-     * 组织表的别名
+     * /**
+     * 组织表数据范围的别名(in)
      */
-    String hospitalAlias() default "";
+    String hospitalsAlias() default "";
 
 }

+ 34 - 18
security-center/src/main/java/com/lantone/security/aop/DataAuthFilterAspect.java

@@ -5,6 +5,7 @@ import com.google.common.collect.Lists;
 import com.lantone.common.constant.AuthConstant;
 import com.lantone.common.enums.IsDeleteEnum;
 import com.lantone.common.exception.Asserts;
+import com.lantone.common.service.RedisService;
 import com.lantone.common.util.ListUtil;
 import com.lantone.common.util.SysUserUtils;
 import com.lantone.common.vo.base.BasePageVo;
@@ -22,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -34,7 +36,8 @@ import java.util.stream.Collectors;
 public class DataAuthFilterAspect {
     @Autowired
     private UserRoleFacade userRoleFacade;
-
+    @Autowired
+    private RedisService redisService;
     //切入点
     @Pointcut("@annotation(com.lantone.security.annotation.DataAuthFilter)")
     public void dataFilterCut() {
@@ -50,18 +53,18 @@ public class DataAuthFilterAspect {
                     .eq("user_id", SysUserUtils.getCurrentPrincipleId())
                     .eq("is_deleted", IsDeleteEnum.N.getKey())).stream().map(UserRole::getRoleId).collect(Collectors.toList());
             if (!roleIds.contains(AuthConstant.SUPPER_ADMIN)) {
-                if (params instanceof BaseVo){
+                if (params instanceof BaseVo) {
                     BaseVo vo = (BaseVo) params;
                     vo.getMap().put(AuthConstant.DATAAUTH_FILTER_SQL, getSQLFilter(point));
                 }
-                if (params instanceof BasePageVo){
+                if (params instanceof BasePageVo) {
                     BasePageVo vo = (BasePageVo) params;
                     vo.getMap().put(AuthConstant.DATAAUTH_FILTER_SQL, getSQLFilter(point));
                 }
             }
             return;
         } else {
-            Asserts.fail("数据权限接口,只能是Map类型参数,且不能为NULL");
+            Asserts.fail("数据权限接口入参对象要继承BaseVo或BasePageVo,且不能为NULL");
         }
     }
 
@@ -74,29 +77,36 @@ public class DataAuthFilterAspect {
 
         MethodSignature signature = (MethodSignature) point.getSignature();
         DataAuthFilter dataAuthFilter = signature.getMethod().getAnnotation(DataAuthFilter.class);
-        //###模拟数据
-        List<String> users = Lists.newArrayList("1", "2");
-        List<String> depts = Lists.newArrayList("16", "34");
-        List<String> hopitals = Lists.newArrayList("1", "2");
-
+        //获取该用户数据权限
+        Map<String,List> dataAuthMap = redisService.hGetAll(SysUserUtils.getCurrentHospitalId()+"_"+SysUserUtils.getCurrentPrincipleId()+"_"+SysUserUtils.getCurrentSoftwareId());
 
         StringBuilder sqlFilter = new StringBuilder();
         sqlFilter.append(" (");
 
         //sql拼接
-        //1.用户
-        if (StringUtils.isNotEmpty(dataAuthFilter.userAlias()) && ListUtil.isNotEmpty(users)) {
-            sqlFilter.append(dataAuthFilter.userAlias()).append(" in(").append(StringUtils.join(depts, ",")).append(")");
+        //1.筛选用户组
+        if (StringUtils.isNotEmpty(dataAuthFilter.usersAlias()) && ListUtil.isNotEmpty(dataAuthMap.get("users"))) {
+            sqlAppend(sqlFilter);
+            sqlFilter.append(dataAuthFilter.usersAlias()).append(" in(").append(StringUtils.join(dataAuthMap.get("users"), ",")).append(")");
         }
-        //2.科室
-        if (StringUtils.isNotEmpty(dataAuthFilter.deptAlias()) && ListUtil.isNotEmpty(depts)) {
-            sqlFilter.append(dataAuthFilter.deptAlias()).append(" in(").append(StringUtils.join(depts, ",")).append(")");
+
+        //2.筛选科室组
+        if (StringUtils.isNotEmpty(dataAuthFilter.deptsAlias()) && ListUtil.isNotEmpty(dataAuthMap.get("depts"))) {
+            sqlAppend(sqlFilter);
+            sqlFilter.append(dataAuthFilter.deptsAlias()).append(" in(").append(StringUtils.join(dataAuthMap.get("depts"), ",")).append(")");
         }
-        //3.组织
-        if (StringUtils.isNotEmpty(dataAuthFilter.hospitalAlias()) && ListUtil.isNotEmpty(hopitals)) {
-            sqlFilter.append(dataAuthFilter.hospitalAlias()).append(" in(").append(StringUtils.join(depts, ",")).append(")");
+
+        //3.筛选组织组
+        if (StringUtils.isNotEmpty(dataAuthFilter.hospitalsAlias()) && ListUtil.isNotEmpty(dataAuthMap.get("hospitals"))) {
+            sqlAppend(sqlFilter);
+            sqlFilter.append(dataAuthFilter.hospitalsAlias()).append(" in(").append(StringUtils.join(dataAuthMap.get("hospitals"), ",")).append(")");
         }
 
+        //4.自身
+        if (StringUtils.isNotEmpty(dataAuthFilter.self())) {
+            sqlAppend(sqlFilter);
+            sqlFilter.append(dataAuthFilter.self()).append(" =").append(SysUserUtils.getCurrentPrincipleId());
+        }
         sqlFilter.append(") ");
 
         if (sqlFilter.toString().trim().equals("()")) {
@@ -105,4 +115,10 @@ public class DataAuthFilterAspect {
 
         return sqlFilter.toString();
     }
+
+    private void sqlAppend(StringBuilder sqlFilter) {
+        if (sqlFilter.toString().trim().length() > 1) {
+            sqlFilter.append(" or ");
+        }
+    }
 }

+ 122 - 4
security-center/src/main/java/com/lantone/security/facade/DataAuthManagementFacade.java

@@ -4,15 +4,19 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.lantone.common.dto.DataAuthDetailDTO;
-import com.lantone.common.dto.DeptDTO;
 import com.lantone.common.dto.GetDataAuthByIdDTO;
+import com.lantone.common.dto.GetDataAuthDeptDTO;
+import com.lantone.common.dto.GetDataAuthDetailDTO;
+import com.lantone.common.dto.GetDataAuthDoctorDTO;
+import com.lantone.common.dto.GetDataAuthHospitalDTO;
 import com.lantone.common.dto.GetDataAuthPageDTO;
 import com.lantone.common.dto.GetDataAuthRoleDTO;
 import com.lantone.common.dto.GetDataAuthSoftwareDTO;
 import com.lantone.common.dto.GetDoctorPageDTO;
-import com.lantone.common.dto.HospitalDTO;
 import com.lantone.common.dto.SoftwareDataAuthDetail;
+import com.lantone.common.enums.StatusEnum;
 import com.lantone.common.exception.Asserts;
+import com.lantone.common.service.RedisService;
 import com.lantone.common.util.DateUtil;
 import com.lantone.common.util.EntityUtil;
 import com.lantone.common.util.ListUtil;
@@ -25,28 +29,36 @@ import com.lantone.common.vo.UpdateAuthVO;
 import com.lantone.dblayermbg.entity.DataAuth;
 import com.lantone.dblayermbg.entity.DataAuthDetail;
 import com.lantone.dblayermbg.entity.Dept;
-import com.lantone.dblayermbg.entity.Hospital;
+import com.lantone.dblayermbg.entity.DeptUser;
 import com.lantone.dblayermbg.entity.RoleSoftwareDataAuth;
 import com.lantone.dblayermbg.entity.SoftwareDataAuth;
+import com.lantone.dblayermbg.entity.User;
 import com.lantone.dblayermbg.facade.DataAuthDetailFacade;
 import com.lantone.dblayermbg.facade.DataAuthFacade;
 import com.lantone.dblayermbg.facade.DeptFacade;
+import com.lantone.dblayermbg.facade.DeptUserFacade;
 import com.lantone.dblayermbg.facade.DoctorFacade;
 import com.lantone.dblayermbg.facade.HospitalFacade;
 import com.lantone.dblayermbg.facade.HospitalUserFacade;
+import com.lantone.dblayermbg.facade.MedoupDoctorFacade;
 import com.lantone.dblayermbg.facade.RoleSoftwareDataAuthFacade;
 import com.lantone.dblayermbg.facade.SoftwareDataAuthFacade;
+import com.lantone.dblayermbg.facade.UserFacade;
 import com.lantone.dblayermbg.service.impl.DataAuthDetailServiceImpl;
 import com.lantone.dblayermbg.service.impl.RoleSoftwareDataAuthServiceImpl;
+import com.lantone.security.annotation.DataAuthFilter;
 import com.lantone.security.enums.DataAuthDataTypeEnum;
 import com.lantone.security.enums.DataAuthDetailTypeEnum;
 import com.lantone.common.enums.IsDeleteEnum;
 import com.lantone.security.enums.ServiceEnum;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -76,6 +88,14 @@ public class DataAuthManagementFacade {
     private DoctorFacade doctorFacade;
     @Autowired
     private HospitalUserFacade hospitalUserFacade;
+    @Autowired
+    private RedisService redisService;
+    @Autowired
+    private DeptUserFacade deptUserFacade;
+    @Autowired
+    private UserFacade userFacade;
+    @Autowired
+    private MedoupDoctorFacade medoupDoctorFacade;
 
 
     /**
@@ -307,7 +327,7 @@ public class DataAuthManagementFacade {
                         dataAuthDetail.setDepts(deptFacade.getBaseMapper().getDepts(ids));
                     }
                     //医生
-                    if(DataAuthDetailTypeEnum.DOCTOR.getKey() == detailType){
+                    if (DataAuthDetailTypeEnum.DOCTOR.getKey() == detailType) {
                         dataAuthDetail.setDoctors(deptFacade.getBaseMapper().getDoctors(ids));
                     }
                 });
@@ -339,4 +359,102 @@ public class DataAuthManagementFacade {
         getDataAuthPageVO.setCreator(SysUserUtils.getCurrentPrincipleId());
         return dataAuthFacade.getBaseMapper().getDataAuthPage(getDataAuthPageVO);
     }
+
+    /**
+     * @param
+     * @Description获取用户数据权限
+     * @Return void
+     */
+    @Async
+    public void initUserDataAuth(Long userId, Long hospitalId,String softwareId) {
+        //获取当前用户的数据权限
+        List<GetDataAuthDetailDTO> dataAuthDetails = dataAuthFacade.getBaseMapper()
+                .getDataAuth(userId, softwareId);
+        Map<String, List<Long>> localDataAuthMap = new HashMap<>();
+        List<Long> users = new ArrayList<>();
+        List<Long> notUsers = new ArrayList<>();
+
+        List<Long> doctors = new ArrayList<>();
+
+        List<Long> depts = new ArrayList<>();
+        List<Long> notDepts = new ArrayList<>();
+
+        List<Long> hospitals = new ArrayList<>();
+        List<Long> notHospitals = new ArrayList<>();
+
+        if (ListUtil.isNotEmpty(dataAuthDetails)) {
+            Map<Integer, List<GetDataAuthDetailDTO>> dataAuthDetailMap = dataAuthDetails.stream()
+                    .collect(Collectors.groupingBy(GetDataAuthDetailDTO::getDataType));
+            dataAuthDetailMap.keySet().stream().forEach(dataType -> {
+                //1:全部组织,2:全部科室,3:全部科室除本科室外,4:本科室,5:本医疗组,6:本人,7:自定义
+                //全部组织
+                if (DataAuthDataTypeEnum.ALL_HOSPITAL.getKey() == dataType) {
+                    //获取当前登录用户的医院id
+                    hospitals.add(hospitalId);
+                }
+                //全部科室
+                if (DataAuthDataTypeEnum.ALL_DEPT.getKey() == dataType) {
+                    hospitals.add(hospitalId);
+                    //获取所有科室
+//                    depts.addAll(deptFacade.list(new QueryWrapper<Dept>()
+//                            .in("hospital_id",hospitalId)
+//                            .eq("is_deleted",IsDeleteEnum.N.getKey())).stream().map(Dept::getId).collect(Collectors.toList()));
+                }
+                //除了本科室外
+                if (DataAuthDataTypeEnum.ALL_DEPT_NOT_SELF.getKey() == dataType) {
+                    notDepts.addAll(deptUserFacade.list(new QueryWrapper<DeptUser>()
+                            .eq("user_id", userId)
+                            .eq("is_deleted", IsDeleteEnum.N.getKey())).stream()
+                                .map(DeptUser::getDeptId).collect(Collectors.toList()));
+                }
+                //本科室
+                if (DataAuthDataTypeEnum.ALL_SELF_DEPT.getKey() == dataType) {
+                    depts.addAll(deptUserFacade.list(new QueryWrapper<DeptUser>()
+                            .eq("user_id", userId)
+                            .eq("is_deleted", IsDeleteEnum.N.getKey())).stream()
+                            .map(DeptUser::getDeptId).collect(Collectors.toList()));
+                }
+                //本医疗组
+                if (DataAuthDataTypeEnum.SELF_MEDOUP.getKey() == dataType) {
+                    doctors.addAll(medoupDoctorFacade.getBaseMapper().getDoctorIdByMedoup(userId));
+                }
+                //本人
+                if (DataAuthDataTypeEnum.SELF_MEDOUP.getKey() == dataType) {
+                    users.add(userId);
+                }
+                //自定义
+                if (DataAuthDataTypeEnum.CUSTOMIZE.getKey() == dataType) {
+                    Map<Integer, List<GetDataAuthDetailDTO>> dataAuthDetailTypeMap = dataAuthDetailMap.get(dataType).stream()
+                            .collect(Collectors.groupingBy(GetDataAuthDetailDTO::getDetailType));
+                    dataAuthDetailTypeMap.keySet().stream().forEach(detailType -> {
+                        List<Long> ids = dataAuthDetailTypeMap
+                                .get(detailType).stream().map(GetDataAuthDetailDTO::getDetailId).collect(Collectors.toList());
+                        //医院
+                        if (DataAuthDetailTypeEnum.HOSPITAL.getKey() == detailType) {
+                            hospitals.addAll(hospitalFacade.getBaseMapper().getHospitals(ids).stream()
+                                    .map(GetDataAuthHospitalDTO::getId).collect(Collectors.toList()));
+                        }
+                        //科室
+                        if (DataAuthDetailTypeEnum.DEPT.getKey() == detailType) {
+                            depts.addAll(deptFacade.getBaseMapper().getDepts(ids).stream()
+                                    .map(GetDataAuthDeptDTO::getId).collect(Collectors.toList()));
+                        }
+                        //医生
+                        if (DataAuthDetailTypeEnum.DOCTOR.getKey() == detailType) {
+                            doctors.addAll(deptFacade.getBaseMapper().getDoctors(ids).stream()
+                                    .map(GetDataAuthDoctorDTO::getId).collect(Collectors.toList()));
+                        }
+                    });
+                }
+            });
+            localDataAuthMap.put("users", users);
+            localDataAuthMap.put("notUsers", notUsers);
+            localDataAuthMap.put("doctors", doctors);
+            localDataAuthMap.put("depts", depts);
+            localDataAuthMap.put("notDepts", notDepts);
+            localDataAuthMap.put("hospitals", hospitals);
+            localDataAuthMap.put("notHospitals", notHospitals);
+            redisService.hSetAll(hospitalId + "_" + userId + "_" + softwareId, localDataAuthMap);
+        }
+    }
 }

+ 22 - 5
security-center/src/main/java/com/lantone/security/facade/RoleManagementFacade.java

@@ -11,7 +11,7 @@ import com.lantone.common.dto.GetRoleDTO;
 import com.lantone.common.dto.GetRolePageDTO;
 import com.lantone.common.dto.GetUserShowTreeDTO;
 import com.lantone.common.dto.SoftwareDTO;
-import com.lantone.common.dto.SoftwareMenuRelationDTO;
+import com.lantone.common.dto.UserInfoDTO;
 import com.lantone.common.dto.UserMenuResourceTreeDTO;
 import com.lantone.common.dto.UserRoleDTO;
 import com.lantone.common.enums.StatusEnum;
@@ -44,6 +44,7 @@ import com.lantone.dblayermbg.facade.RoleSoftwareResourceFacade;
 import com.lantone.dblayermbg.facade.SoftwareFacade;
 import com.lantone.dblayermbg.facade.SoftwareMenuFacade;
 import com.lantone.dblayermbg.facade.SoftwareResourceFacade;
+import com.lantone.dblayermbg.facade.UserFacade;
 import com.lantone.dblayermbg.facade.UserRoleFacade;
 import com.lantone.dblayermbg.service.impl.RoleSoftwareMenuServiceImpl;
 import com.lantone.dblayermbg.service.impl.RoleSoftwareResourceServiceImpl;
@@ -74,6 +75,8 @@ public class RoleManagementFacade {
     @Autowired
     private RoleFacade roleFacade;
     @Autowired
+    private UserFacade userFacade;
+    @Autowired
     private UserRoleFacade userRoleFacade;
     @Autowired
     private RoleSoftwareMenuFacade roleSoftwareMenuFacade;
@@ -93,6 +96,8 @@ public class RoleManagementFacade {
     private SoftwareMenuFacade softwareMenuFacade;
     @Autowired
     private SoftwareResourceFacade softwareResourceFacade;
+    @Autowired
+    private DataAuthManagementFacade dataAuthManagementFacade;
 
 
     /**
@@ -478,7 +483,13 @@ public class RoleManagementFacade {
      * @Description获取当前登录用户的显示的菜单列表
      * @Return java.util.Map<java.lang.Long, java.util.List < com.lantone.common.dto.GetUserShowTreeDTO>>
      */
-    public Map<Long, List<GetUserShowTreeDTO>> getUserShowMemuTree() {
+    public Map<String, Object> getUserShowMemuTree() {
+        if(StringUtil.isEmpty(SysUserUtils.getCurrentSoftwareId())){
+            Asserts.fail("请求头服务id为空");
+        }
+        Long softwareId = Long.parseLong(SysUserUtils.getCurrentSoftwareId());
+        Map<String, Object> out = new HashMap<>();
+        dataAuthManagementFacade.initUserDataAuth(SysUserUtils.getCurrentPrincipleId(),SysUserUtils.getCurrentHospitalId(),SysUserUtils.getCurrentSoftwareId());
         AtomicReference<List> notShowSoftwareMenuIds = new AtomicReference<>();
         //1.1获取当前用户的角色列表
         List<Role> roles = roleFacade.list(new QueryWrapper<Role>().
@@ -499,12 +510,15 @@ public class RoleManagementFacade {
             }
         }
         List<GetUserShowTreeDTO> getUserShowTreeDTOS = roleSoftwareMenuFacade.getBaseMapper()
-                .getUserShowMemuTree(roles.stream().map(Role::getId).collect(Collectors.toList()),notShowSoftwareMenuIds.get());
+                .getUserShowMemuTree(roles.stream().map(Role::getId).collect(Collectors.toList()),notShowSoftwareMenuIds.get(),softwareId);
         //菜单转成树状结构
         if(ListUtil.isNotEmpty(getUserShowTreeDTOS)){
-            return getShowTree(getUserShowTreeDTOS);
+            out.put("showMenuInfo",getShowTree(getUserShowTreeDTOS).get(softwareId));
         }
-        return null;
+        UserInfoDTO userInfo = new UserInfoDTO();
+        BeanUtils.copyProperties(userFacade.getById(SysUserUtils.getCurrentPrincipleId()),userInfo);
+        out.put("userInfo",userInfo);
+        return out;
     }
 
 
@@ -519,6 +533,9 @@ public class RoleManagementFacade {
                 Map<Long, List<GetUserShowTreeDTO>> menuResourceMap = EntityUtil
                         .makeEntityListMap(userMenuResourceMap.get(softwareId), "parentId");
                 List<GetUserShowTreeDTO> menuRes = menuResourceMap.get(0L);
+                if(ListUtil.isEmpty(menuRes)){
+                    Asserts.fail("菜单目录为空");
+                }
                 for (GetUserShowTreeDTO bean : menuRes) {
                     getSonMenu(bean, menuResourceMap);
                 }

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

@@ -100,7 +100,7 @@ public class RoleManagementController {
 
     @ApiOperation(value = "获取当前登录用户的显示的菜单列表 [by:songxl]")
     @PostMapping("/getUserShowMemuTree")
-    public CommonResult<Map<Long, List<GetUserShowTreeDTO>>> getUserShowMemuTree() {
+    public CommonResult<Map<String, Object>> getUserShowMemuTree() {
         return CommonResult.success(roleManagementFacade.getUserShowMemuTree());
     }
 }

+ 3 - 2
security-center/src/main/java/com/lantone/security/web/UserManagementController.java

@@ -34,7 +34,7 @@ import java.util.Map;
  * @time: 2021/7/20 12:39
  */
 @RestController
-@Api(value = "用户管理API", tags = { "用户管理API" })
+@Api(value = "用户管理API", tags = {"用户管理API"})
 @RequestMapping("/userManage")
 public class UserManagementController {
 
@@ -99,9 +99,10 @@ public class UserManagementController {
     public CommonResult<IPage<GetUserPageDTO>> getUserPage(@RequestBody @Valid GetUserPageVO getUserPageVO) {
         return CommonResult.success(userManagementFacade.getUserPage(getUserPageVO));
     }
+
     @ApiOperation(value = "登录成功获取用户的系统医院信息 [by:songxl]")
     @PostMapping("/getUserHospitals")
-    public CommonResult<Map<String,Object>> getUserHospitals() {
+    public CommonResult<Map<String, Object>> getUserHospitals() {
         return CommonResult.success(userManagementFacade.getUserHospitals());
     }
 }