浏览代码

Merge branch 'mazq-subobj-1025' into 'release-2.4.2'

feature(方法说明): 方法说明

See merge request dcuc-tjdsj/auth-service!146
马志强 3 年之前
父节点
当前提交
ff5c639c06
共有 42 个文件被更改,包括 1174 次插入471 次删除
  1. 42 25
      dcuc-auth-api/src/main/java/com/dragoninfo/dcuc/auth/sub/facade/IAttrFacade.java
  2. 0 65
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/dto/AttrInfoTreeDTO.java
  3. 0 37
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/dto/AttrRelAcceptDTO.java
  4. 3 8
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/dto/RelSearchDTO.java
  5. 21 0
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/dto/ServiceRelSearchDTO.java
  6. 41 41
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/enumresource/AttrBelongTypeEnum.java
  7. 2 2
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/enumresource/AttrSubTypeEnum.java
  8. 19 0
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/ApplyInfoRelVo.java
  9. 40 0
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/ApplyInfoVo.java
  10. 23 0
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/AttrInfoAddBaseVo.java
  11. 28 0
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/AttrInfoAddVo.java
  12. 52 0
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/AttrInfoTreeVo.java
  13. 23 0
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/AttrRelAcceptVo.java
  14. 22 0
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/RelAcceptVo.java
  15. 25 0
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/ServiceRelVo.java
  16. 47 0
      dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/ServiceResourceVo.java
  17. 28 1
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/admin/repo/ManageInfoRepository.java
  18. 63 47
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/admin/service/impl/ManageInfoService.java
  19. 3 4
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/auth/service/impl/OrgQuotaAuthService.java
  20. 34 16
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/business/IAttrBusiness.java
  21. 318 102
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/business/impl/AttrBusinessImpl.java
  22. 76 30
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/business/impl/AuthUserBusinessImpl.java
  23. 10 7
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/entity/AttrInfo.java
  24. 9 9
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/entity/AttrRelInfo.java
  25. 29 14
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/facade/AttrFacade.java
  26. 12 0
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/repo/AttrInfoRepository.java
  27. 24 1
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/repo/AuthUserInfoRepository.java
  28. 13 0
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/repo/AuthUserOrgRelRepository.java
  29. 3 3
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/repo/UserIdAndOrgDO.java
  30. 2 6
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/IAttrRelService.java
  31. 5 7
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/IAttrService.java
  32. 15 0
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/IAuthUserInfoService.java
  33. 9 0
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/IAuthUserOrgRelService.java
  34. 22 20
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AttrServiceImpl.java
  35. 1 1
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AuthOrgTreeServiceImpl.java
  36. 13 2
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AuthUserInfoService.java
  37. 6 0
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AuthUserOrgRelServiceImpl.java
  38. 21 17
      dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/IAttrRelServiceImpl.java
  39. 1 1
      dcuc-auth-service/src/main/resources/config/mysql/V4_3_0019__Add_ServiceAuthContent.sql
  40. 31 0
      dcuc-auth-service/src/main/resources/config/mysql/V4_3_0022__AttrModify.sql
  41. 37 0
      dcuc-auth-service/src/main/resources/config/sql/V4_3_0022__AttrModify.sql
  42. 1 5
      dcuc-auth-service/src/test/java/com/dragoninfo/dcuc/auth/auth/service/IAuthSyncTest.java

+ 42 - 25
dcuc-auth-api/src/main/java/com/dragoninfo/dcuc/auth/sub/facade/IAttrFacade.java

@@ -1,8 +1,8 @@
 package com.dragoninfo.dcuc.auth.sub.facade;
 
-import com.dragoninfo.dcuc.auth.sub.dto.AttrInfoTreeDTO;
-import com.dragoninfo.dcuc.auth.sub.dto.AttrRelAcceptDTO;
 import com.dragoninfo.dcuc.auth.sub.dto.RelSearchDTO;
+import com.dragoninfo.dcuc.auth.sub.dto.ServiceRelSearchDTO;
+import com.dragoninfo.dcuc.auth.sub.vo.*;
 import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.data.domain.Page;
@@ -23,57 +23,74 @@ public interface IAttrFacade {
 
     /**
      * 主客体属性添加
-     * @param dto
+     * @param addVo
      * @return
      */
     @PostMapping("attrAdd")
-    ResponseStatus attrSave(@RequestBody AttrInfoTreeDTO dto);
+    ResponseStatus attrSave(@RequestBody AttrInfoAddVo addVo);
 
     /**
      * 根据id,删除本级下的所有主客体属性,包括本级
-     * @param id 父级id
-     * @param attrType SUB:主体属性 OBJ:客体属性
-     * @param attrBelongType 属性所属的主客体类别  USER:人员 ORG:机构 APP:应用
+     * @param id
      * @return
      */
     @GetMapping("deleteAllById")
-    Boolean deleteAllById(@RequestParam("id") String id,
-                             @RequestParam("attrBelongType") String attrBelongType,
-                             @RequestParam("attrType") String attrType);
+    Boolean deleteAllById(@RequestParam("id") String id);
 
     /**
      * 根据属性所属类别获取属性列表,返回树结构
+     * @param attrSubType
      * @return
      */
     @GetMapping("getAttrTreeList")
-    List<AttrInfoTreeDTO> getAttrTreeList(@RequestParam("attrType") String attrType);
+    List<AttrInfoTreeVo> getAttrTreeList(@RequestParam("attrSubType") String attrSubType);
 
     /**
      * 主客体和属性关联关系添加
-     * @param dto
+     * @param vo
      * @return
      */
     @PostMapping("relAdd")
-    Boolean relAdd(@RequestBody AttrRelAcceptDTO dto);
+    Boolean relAdd(@RequestBody AttrRelAcceptVo vo);
 
     /**
-     * 查询属性关联的主客体id
-     * @param attrId 属性id
-     * @param attrType 属性类型
-     * @param attrBelongType 属性所属主客体类型
+     * 返回applyInfo对象
+     * 查询属性关联的应用列表
+     * @param dto
      * @return
      */
-    @GetMapping("attrRelToIds")
-    List<String> attrRelToIds(@RequestParam("attrId") String attrId,
-                              @RequestParam("attrType") String attrType,
-                              @RequestParam("attrBelongType") String attrBelongType);
+    @PostMapping(value = "relAppPage")
+    Page<ApplyInfoRelVo> relAppPage(@RequestBody RelSearchDTO dto);
 
     /**
-     * 返回applyInfo对象
-     * 查询属性关联的应用列表
+     * 查询属性未关联的应用列表
      * @param dto
      * @return
      */
-    @PostMapping(value = "relAppPage")
-    Page relAppPage(@RequestBody RelSearchDTO dto);
+    @PostMapping(value = "notRelAppPage")
+    Page<ApplyInfoVo> notRelAppPage(@RequestBody RelSearchDTO dto);
+
+    /**
+     * 查询属性关联的服务列表
+     * @param dto
+     * @return
+     */
+    @PostMapping(value = "relServicePage")
+    Page<ServiceRelVo> relServicePage(@RequestBody ServiceRelSearchDTO dto);
+
+    /**
+     * 查询属性未关联的服务列表
+     * @param dto
+     * @return
+     */
+    @PostMapping(value = "notRelServicePage")
+    Page<ServiceResourceVo> notRelServicePage(@RequestBody ServiceRelSearchDTO dto);
+
+    /**
+     * 删除单条关联记录
+     * @param attrRelId
+     * @return
+     */
+    @GetMapping(value = "delAttrRelResource")
+    Boolean delAttrRelResource(@RequestParam("attrRelId") String attrRelId);
 }

+ 0 - 65
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/dto/AttrInfoTreeDTO.java

@@ -1,65 +0,0 @@
-package com.dragoninfo.dcuc.auth.sub.dto;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * 主客体属性添加DTO
- * @author mazq
- * @date 2021/5/20
- */
-@Data
-public class AttrInfoTreeDTO {
-
-    /**
-     * 主键id
-     */
-    private String id;
-
-    /**
-     * 父级id
-     */
-    private String pid;
-
-    /**
-     * 父节点名称
-     */
-    private String pName;
-
-    /**
-     * 属性类别  SUB:主体属性 OBJ:客体属性
-     */
-    private String attrType;
-
-    /**
-     * 属性所属的主客体类别  USER:人员 ORG:机构 APP:应用 FUN:功能  SER:服务
-     */
-    private String attrBelongType;
-
-    /**
-     * 属性名称
-     */
-    private String name;
-
-    /**
-     * 属性值
-     */
-    private String code;
-
-    /**
-     * 说明
-     */
-    private String remark;
-
-    /**
-     * 是否删除
-     */
-    private String deleted;
-
-    /**
-     * 字类集合
-     */
-    private List<AttrInfoTreeDTO> child;
-
-}

+ 0 - 37
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/dto/AttrRelAcceptDTO.java

@@ -1,37 +0,0 @@
-package com.dragoninfo.dcuc.auth.sub.dto;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * 客体属性关联新增DTO
- * @author mazq
- * @date 2021/5/24
- */
-@Data
-public class AttrRelAcceptDTO {
-
-    /**
-     * 属性id
-     */
-    private String attrId;
-
-    /**
-     * 属性类别  SUB:主体属性 OBJ:客体属性
-     */
-    private String attrType;
-
-    /**
-     * 属性所属的主客体类别  USER:人员 ORG:机构 APP:应用 FUN:功能  SER:服务
-     */
-    private String attrBelongType;
-
-    /**
-     * 主客体id集合
-     */
-    private List<String> relIds;
-
-
-
-}

+ 3 - 8
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/dto/RelSearchDTO.java

@@ -28,12 +28,12 @@ public class RelSearchDTO {
     /**
      * 属性类别  SUB:主体属性 OBJ:客体属性
      */
-    private String attrType;
+    private String attrSubType;
 
     /**
-     * 属性所属的主客体类别  USER:人员 ORG:机构 APP:应用 FUN:功能  SER:服务
+     * 主体id
      */
-    private String attrBelongType;
+    private String id;
 
     /**
      * 主客体名称
@@ -53,9 +53,4 @@ public class RelSearchDTO {
     public RelSearchDTO() {
     }
 
-    public RelSearchDTO(String attrId, String attrType, String attrBelongType) {
-        this.attrId = attrId;
-        this.attrType = attrType;
-        this.attrBelongType = attrBelongType;
-    }
 }

+ 21 - 0
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/dto/ServiceRelSearchDTO.java

@@ -0,0 +1,21 @@
+package com.dragoninfo.dcuc.auth.sub.dto;
+
+import lombok.Data;
+
+/**
+ * 主客体属性关联列表查询DTO
+ * @author mazq
+ * @date 2021/5/24
+ */
+@Data
+public class ServiceRelSearchDTO extends RelSearchDTO{
+
+    /**
+     * 应用code
+     */
+    private String appCode;
+
+    public ServiceRelSearchDTO() {
+    }
+
+}

+ 41 - 41
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/enumresource/AttrBelongTypeEnum.java

@@ -1,41 +1,41 @@
-package com.dragoninfo.dcuc.auth.sub.enumresource;
-
-/**
- * 属性所属主客体类型枚举类
- * @author mazq
- * @date 2021/5/26
- */
-public enum  AttrBelongTypeEnum {
-    /**
-     * 属性所属主客体类型枚举类
-     */
-    USER("人员","USER"),
-    ORG("机构","ORG"),
-    APP("应用","APP"),
-    FUN("功能","FUN"),
-    SER("服务","SER");
-
-    private String label;
-    private String code;
-
-    AttrBelongTypeEnum(String label, String code) {
-        this.label = label;
-        this.code = code;
-    }
-
-    public String getLabel() {
-        return label;
-    }
-
-    public void setLabel(String label) {
-        this.label = label;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-}
+//package com.dragoninfo.dcuc.auth.sub.enumresource;
+//
+///**
+// * 属性所属主客体类型枚举类
+// * @author mazq
+// * @date 2021/5/26
+// */
+//public enum  AttrBelongTypeEnum {
+//    /**
+//     * 属性所属主客体类型枚举类
+//     */
+//    USER("人员","USER"),
+//    ORG("机构","ORG"),
+//    APP("应用","APP"),
+//    FUN("功能","FUN"),
+//    SER("服务","SER");
+//
+//    private String label;
+//    private String code;
+//
+//    AttrBelongTypeEnum(String label, String code) {
+//        this.label = label;
+//        this.code = code;
+//    }
+//
+//    public String getLabel() {
+//        return label;
+//    }
+//
+//    public void setLabel(String label) {
+//        this.label = label;
+//    }
+//
+//    public String getCode() {
+//        return code;
+//    }
+//
+//    public void setCode(String code) {
+//        this.code = code;
+//    }
+//}

+ 2 - 2
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/enumresource/AttrTypeEnum.java → dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/enumresource/AttrSubTypeEnum.java

@@ -5,7 +5,7 @@ package com.dragoninfo.dcuc.auth.sub.enumresource;
  * @author mazq
  * @date 2021/5/26
  */
-public enum AttrTypeEnum {
+public enum AttrSubTypeEnum {
     /**
      * 属性类型枚举类
      */
@@ -15,7 +15,7 @@ public enum AttrTypeEnum {
     private String label;
     private String code;
 
-    AttrTypeEnum(String label, String code) {
+    AttrSubTypeEnum(String label, String code) {
         this.label = label;
         this.code = code;
     }

+ 19 - 0
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/ApplyInfoRelVo.java

@@ -0,0 +1,19 @@
+package com.dragoninfo.dcuc.auth.sub.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * @author mazq
+ * @date 2021/10/29
+ */
+@Data
+@ApiModel(value = "关联应用Vo")
+public class ApplyInfoRelVo extends ApplyInfoVo{
+
+    @ApiModelProperty(value = "关联记录id")
+    private String attrRelId;
+
+}

+ 40 - 0
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/ApplyInfoVo.java

@@ -0,0 +1,40 @@
+package com.dragoninfo.dcuc.auth.sub.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * @author mazq
+ * @date 2021/10/29
+ */
+@Data
+@ApiModel(value = "应用Vo")
+public class ApplyInfoVo {
+
+    @ApiModelProperty(value = "应用id")
+    private String id;
+
+    @ApiModelProperty(value = "应用名称")
+    private String applyName;
+
+    @ApiModelProperty(value = "应用代码")
+    private String applyCode;
+
+    @ApiModelProperty(value = "所属单位名称")
+    private String orgName;
+
+    @ApiModelProperty(value = "事权单位代码")
+    private String orgCode;
+
+    @ApiModelProperty(value = "管理单位代码")
+    private String managerOrgCode;
+
+    @ApiModelProperty(value = "管理单位名称")
+    private String managerOrgName;
+
+    @ApiModelProperty(value = "应用状态 0:启用 1:禁用")
+    private String applyStatus;
+
+}

+ 23 - 0
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/AttrInfoAddBaseVo.java

@@ -0,0 +1,23 @@
+package com.dragoninfo.dcuc.auth.sub.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author mazq
+ * @date 2021/5/20
+ */
+@Data
+@ApiModel(value = "主客体属性新增Vo")
+public class AttrInfoAddBaseVo {
+
+    @ApiModelProperty(value = "id 主键id")
+    private String id;
+
+    @ApiModelProperty(value = "属性名称")
+    private String name;
+
+    @ApiModelProperty(value = "属性值")
+    private String code;
+}

+ 28 - 0
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/AttrInfoAddVo.java

@@ -0,0 +1,28 @@
+package com.dragoninfo.dcuc.auth.sub.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author mazq
+ * @date 2021/5/20
+ */
+@Data
+@ApiModel(value = "主客体属性新增Vo")
+public class AttrInfoAddVo extends AttrInfoAddBaseVo{
+
+    @ApiModelProperty(value = "父级id")
+    private String pid;
+
+    @ApiModelProperty(value = "父类类型")
+    private String ptype;
+
+    @ApiModelProperty(value = "属性主客体类别  SUB:主体属性 OBJ:客体属性")
+    private String attrSubType;
+
+    @ApiModelProperty(value = "属性值集合")
+    private List<AttrInfoAddBaseVo> child;
+}

+ 52 - 0
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/AttrInfoTreeVo.java

@@ -0,0 +1,52 @@
+package com.dragoninfo.dcuc.auth.sub.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author mazq
+ * @date 2021/5/20
+ */
+@Data
+@ApiModel(value = "主客体属性Vo")
+public class AttrInfoTreeVo {
+
+    @ApiModelProperty(value = "父级id")
+    private String pid;
+
+    @ApiModelProperty(value = "父节点名称")
+    private String pName;
+
+    @ApiModelProperty(value = "父类类型")
+    private String ptype;
+
+    @ApiModelProperty(value = "属性主客体类别  SUB:主体属性 OBJ:客体属性")
+    private String attrSubType;
+
+    @ApiModelProperty(value = "id 主键id")
+    private String id;
+
+    @ApiModelProperty(value = "属性类型")
+    private String type;
+
+    @ApiModelProperty(value = "属性名称")
+    private String name;
+
+    @ApiModelProperty(value = "属性值")
+    private String code;
+
+    @ApiModelProperty(value = "是否内置")
+    private String builtIn;
+
+    @ApiModelProperty(value = "说明")
+    private String remark;
+
+    @ApiModelProperty(value = "是否删除")
+    private String deleted;
+
+    @ApiModelProperty(value = "子类集合")
+    private List<AttrInfoTreeVo> child;
+}

+ 23 - 0
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/AttrRelAcceptVo.java

@@ -0,0 +1,23 @@
+package com.dragoninfo.dcuc.auth.sub.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author mazq
+ * @date 2021/5/24
+ */
+@Data
+@ApiModel(value = "主客体和属性关联关系添加Vo")
+public class AttrRelAcceptVo {
+
+    @ApiModelProperty(value = "属性id")
+    private String attrId;
+
+    @ApiModelProperty(value = "主客体id、code集合")
+    private List<RelAcceptVo> relList;
+
+}

+ 22 - 0
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/RelAcceptVo.java

@@ -0,0 +1,22 @@
+package com.dragoninfo.dcuc.auth.sub.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author mazq
+ * @date 2021/5/24
+ */
+@Data
+@ApiModel(value = "属性关联的主客体Vo")
+public class RelAcceptVo {
+
+    @ApiModelProperty(value = "主客体id")
+    private String id;
+
+    @ApiModelProperty(value = "主客体的code")
+    private String code;
+}

+ 25 - 0
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/ServiceRelVo.java

@@ -0,0 +1,25 @@
+package com.dragoninfo.dcuc.auth.sub.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/4/28 11:38
+ */
+@Data
+@ApiModel(value = "关联服务资源VO")
+public class ServiceRelVo extends ServiceResourceVo {
+
+    @ApiModelProperty(value = "关联记录id")
+    private String attrRelId;
+
+}

+ 47 - 0
dcuc-auth-model/src/main/java/com/dragoninfo/dcuc/auth/sub/vo/ServiceResourceVo.java

@@ -0,0 +1,47 @@
+package com.dragoninfo.dcuc.auth.sub.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 代码千万行,注释第一行,编码不规范,同事两行泪
+ *
+ * @author huang(jy)
+ * @version 1.0
+ * @date 2021/4/28 11:38
+ */
+@Data
+@ApiModel(value = "服务资源VO")
+public class ServiceResourceVo implements Serializable {
+
+    @ApiModelProperty(value = "服务资源id")
+    private String id;
+
+    @ApiModelProperty(value = "服务资源标识符")
+    private String serviceCode;
+
+    @ApiModelProperty(value = "服务名称")
+    private String serviceName;
+
+    @ApiModelProperty(value = "服务资源状态代码 0:未激活;1:启用;2:停止;3:撤销;")
+    private String serviceStatus;
+
+    @ApiModelProperty(value = "服务访问地址")
+    private String serviceUrl;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "服务提供应用系统code")
+    private String appCode;
+
+    @ApiModelProperty(value = "服务提供应用系统名称")
+    private String appName;
+
+
+}

+ 28 - 1
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/admin/repo/ManageInfoRepository.java

@@ -3,6 +3,7 @@ package com.dragoninfo.dcuc.auth.admin.repo;
 import com.dragoninfo.dcuc.auth.admin.entity.ManageInfo;
 import com.dragoninfo.dcuc.auth.admin.vo.AdminAuditVO;
 import com.dragoninfo.dcuc.auth.sub.entity.AuthUserInfo;
+import com.dragoninfo.dcuc.auth.sub.repo.UserIdAndOrgDO;
 import com.dragonsoft.duceap.base.annotations.query.NativeQuery;
 import com.dragonsoft.duceap.core.persistent.repository.BaseRepository;
 import com.dragonsoft.duceap.core.search.Searchable;
@@ -12,6 +13,8 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * @author mazq
  * @date 2021/9/2
@@ -23,13 +26,37 @@ public interface ManageInfoRepository extends BaseRepository<ManageInfo, String>
     @Query("delete from ManageInfo t where userId =  :userId ")
     void delByUserId(@Param("userId") String userId);
 
+    /**
+     * 根据查询条件查询非管理员列表
+     * 返回值只有id和orgId字段
+     * @param searchable
+     * @return
+     */
+    @NativeQuery("SELECT u.ID, u.ORG_ID," +
+            " u.IDCARD, u.NAME, u.POLICE_NUMBER as policeNumber" +
+            " FROM T_AUTH_USER_INFO u LEFT JOIN T_AUTH_ADMIN_MANAGE_INFO m ON u.ID = m.USER_ID" +
+            " WHERE u.DELETED = '0' AND u.USER_TYPE = '10' AND m.ID IS NULL")
+    List<UserIdAndOrgDO> getNotManageUserId(Searchable searchable);
+
+    /**
+     * 根据查询条件查询管理员列表
+     * 返回值只有id和orgId字段
+     * @param searchable
+     * @return
+     */
+    @NativeQuery("SELECT u.ID, u.ORG_ID," +
+            " u.IDCARD, u.NAME, u.POLICE_NUMBER as policeNumber" +
+            " FROM T_AUTH_USER_INFO u INNER JOIN T_AUTH_ADMIN_MANAGE_INFO m ON u.ID = m.USER_ID" +
+            " WHERE u.DELETED = '0' AND m.DELETED = '0'")
+    List<UserIdAndOrgDO> getManageUserId(Searchable searchable);
+
     @NativeQuery("SELECT u.ID,u.IDCARD, u.NAME, u.USER_TYPE, u.POLICE_NUMBER, u.ORG_ID, u.ORG_NAME,u.POLICE_CATEGORY," +
             " u.ORG_ID as orgId, u.POLICE_NUMBER as policeNumber" +
             " FROM T_AUTH_USER_INFO u INNER JOIN T_AUTH_ADMIN_MANAGE_INFO m ON u.ID = m.USER_ID" +
             " WHERE u.DELETED = '0' AND m.DELETED = '0'")
     Page<AuthUserInfo> getManageUserInfo(Searchable searchable);
 
-    @NativeQuery("SELECT u.ID,u.IDCARD, u.NAME, u.USER_TYPE, u.POLICE_NUMBER, u.ORG_ID, u.ORG_NAME,u.POLICE_CATEGORY," +
+    @NativeQuery("SELECT u.ID,u.IDCARD, u.NAME, u.USER_TYPE, u.POLICE_NUMBER, u.ORG_ID, u.ORG_NAME, u.POLICE_CATEGORY," +
             " u.ORG_ID as orgId, u.POLICE_NUMBER as policeNumber" +
             " FROM T_AUTH_USER_INFO u LEFT JOIN T_AUTH_ADMIN_MANAGE_INFO m ON u.ID = m.USER_ID" +
             " WHERE u.DELETED = '0' AND u.USER_TYPE = '10' AND m.ID IS NULL")

+ 63 - 47
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/admin/service/impl/ManageInfoService.java

@@ -16,6 +16,7 @@ import com.dragoninfo.dcuc.auth.config.DcucAuthConfig;
 import com.dragoninfo.dcuc.auth.sub.dto.AuthUserDTO;
 import com.dragoninfo.dcuc.auth.sub.dto.OrgTreeNodeDTO;
 import com.dragoninfo.dcuc.auth.sub.entity.AuthUserInfo;
+import com.dragoninfo.dcuc.auth.sub.repo.UserIdAndOrgDO;
 import com.dragoninfo.dcuc.auth.sub.service.IAuthOrgTreeService;
 import com.dragoninfo.dcuc.auth.sub.service.IAuthUserInfoService;
 import com.dragoninfo.dcuc.duceap.facade.ICodeListResourceFacade;
@@ -39,6 +40,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Example;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -77,23 +79,17 @@ public class ManageInfoService implements IManageInfoService {
     @Autowired
     private DcucAuthConfig authConfig;
 
-    private volatile boolean isEmpty = true;
-
     private final Map<String, String> POLICE_CATEGORY_MAP = new HashMap<>();
 
-    private void checkPoliceTypeMap(){
-        if (!this.isEmpty){
+    private void checkPoliceTypeMap() {
+        if (0 == this.POLICE_CATEGORY_MAP.size()) {
             return;
         }
-        synchronized (this.POLICE_CATEGORY_MAP){
-            if (this.isEmpty){
-                this.POLICE_CATEGORY_MAP.putAll(codeListResourceFacade.listCode("code", "T_MD_POLICE_TYPE").stream()
-                        .collect(Collectors.toMap(CodeRecord::getValue,CodeRecord::getLabel)));
-                this.isEmpty = true;
-            }
-        }
+        this.POLICE_CATEGORY_MAP.putAll(codeListResourceFacade.listCode("code", "T_MD_POLICE_TYPE").stream()
+                .collect(Collectors.toMap(CodeRecord::getValue, CodeRecord::getLabel)));
     }
 
+
     /**
      * 根据机构获取非管理员用户
      *
@@ -104,24 +100,34 @@ public class ManageInfoService implements IManageInfoService {
     public Page<AuthUserDTO> getUserNotInManage(SearchDTO searchDTO) {
         checkPoliceTypeMap();
         Searchable searchable = Searchable.toSearchable(searchDTO);
-        Condition orgIdEq = searchable.getSearchFilter("orgId", SearchOperator.eq);
+        Pageable pageable = searchable.getPage();
         //机构id不为空,从带有管理范围的机构树选择某一个机构查询
         //无需再过滤管理范围的机构
         //机构id为空,从搜索框查询,带有人员的查询条件
         //需要过滤当前登录人的管理范围
-        if(null == orgIdEq) {
-            BaseSecurityUser currentUser = UserContextUtils.getCurrentUser();
-            boolean rootUser = authUserInfoService.isRootUser(currentUser.getId());
-            if(!rootUser) {
-                List<AppMtAuth> mtAuths = appMtAuthService.getByUserId(currentUser.getId());
-                if(CollectionUtils.isEmpty(mtAuths)) {
-                    return new PageImpl<>(new ArrayList(), searchable.getPage(), 0L);
-                }
-                Set<String> allMtOrgIds = authOrgTreeService.getAllMtOrgIds(mtAuths.get(0).getOrgId());
-                searchable.addSearchFilter("orgId", SearchOperator.in, allMtOrgIds);
+        Page<AuthUserInfo> userInfoPage;
+        Condition orgIdEq = searchable.getSearchFilter("orgId", SearchOperator.eq);
+        if (null == orgIdEq) {
+            SecurityUser currentUser = UserContextUtils.getCurrentUser();
+            String mtAuths = appMtAuthService.mgeAppRightRangeStr(currentUser.getId());
+            if (StringUtils.isBlank(mtAuths)) {
+                return new PageImpl<>(new ArrayList(), pageable, 0L);
             }
+            Set<String> allMtOrgIds = authOrgTreeService.getAllMtOrgIds(mtAuths);
+            searchable.removePageable();
+            List<UserIdAndOrgDO> notManageUserId = manageInfoRepository.getNotManageUserId(searchable);
+            List<String> userIds = notManageUserId.stream()
+                    .filter(e -> allMtOrgIds.contains(e.getOrgId()))
+                    .map(UserIdAndOrgDO::getId)
+                    .collect(Collectors.toList());
+            int pageNum = pageable.getPageNumber();
+            int pageSize = pageable.getPageSize();
+            List<String> pageUserIds = userIds.stream().skip(pageNum * pageSize).limit(pageSize).collect(Collectors.toList());
+            List<AuthUserInfo> authUserInfos = authUserInfoService.findByIds(pageUserIds);
+            userInfoPage = new PageImpl<>(authUserInfos, pageable, userIds.size());
+        } else {
+            userInfoPage = manageInfoRepository.getNotManagePolice(searchable);
         }
-        Page<AuthUserInfo> userInfoPage = manageInfoRepository.getNotManagePolice(searchable);
         List<AuthUserInfo> userInfos = userInfoPage.getContent();
         List<AuthUserDTO> collect = userInfos.stream().map(e -> {
             AuthUserDTO dto = new AuthUserDTO();
@@ -134,7 +140,7 @@ public class ManageInfoService implements IManageInfoService {
             dto.setPoliceCategory(value);
             return dto;
         }).collect(Collectors.toList());
-        return new PageImpl<>(collect, searchable.getPage(), userInfoPage.getTotalElements());
+        return new PageImpl<>(collect, pageable, userInfoPage.getTotalElements());
     }
 
     @Override
@@ -174,7 +180,7 @@ public class ManageInfoService implements IManageInfoService {
         appMtAuthService.delByUserId(userId);
         //查询下用户管理是否有该用户如果没有删除
         manageInfoRepository.delByUserId(userId);
-        saveMgeLog(AdminOperateTypeEnum.QXGLY.getValue(),AdminObjectTypeEnum.SQGL.getValue(), userId, userId);
+        saveMgeLog(AdminOperateTypeEnum.QXGLY.getValue(), AdminObjectTypeEnum.SQGL.getValue(), userId, userId);
         return ResponseStatus.success();
     }
 
@@ -187,14 +193,14 @@ public class ManageInfoService implements IManageInfoService {
         List<AuthUserInfo> createUsers = authUserInfoService.findByIds(createUserIds);
         Map<String, AuthUserInfo> userDTOMap = createUsers.stream().collect(Collectors.toMap(AuthUserInfo::getId, e -> e));
         SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
-        content.forEach(e->{
+        content.forEach(e -> {
             String createUser = e.getCreateUser();
             AuthUserInfo authUserInfo = userDTOMap.get(createUser);
-            if(null != authUserInfo) {
+            if (null != authUserInfo) {
                 e.setCreateUserName(authUserInfo.getName());
             }
             Date createTime = e.getCreateTime();
-            if(null != createTime) {
+            if (null != createTime) {
                 e.setCreateTimeString(format.format(createTime));
             }
         });
@@ -214,8 +220,8 @@ public class ManageInfoService implements IManageInfoService {
     /**
      * 广东地区管理员导入——新增管理员,新增理范围
      *
-     * @param list           新增的管理员
-     * @param orgIdAuthMap   新的管理范围userId:orgIdAuth
+     * @param list         新增的管理员
+     * @param orgIdAuthMap 新的管理范围userId:orgIdAuth
      */
     private void setMgeAuth(Collection<ManageInfo> list, Map<String, String> orgIdAuthMap) {
         List<AppMtAuth> appMtAuthList = new ArrayList<>();
@@ -251,7 +257,7 @@ public class ManageInfoService implements IManageInfoService {
      * @param userId 用户id
      * @param ids    操作对象id
      */
-    private void saveMgeLog(String type,String objectType, String userId, String ids) {
+    private void saveMgeLog(String type, String objectType, String userId, String ids) {
         String objIds = ids.replace("[", "").replace("]", "");
         if (StringUtils.isEmpty(objIds)) {
             return;
@@ -276,7 +282,7 @@ public class ManageInfoService implements IManageInfoService {
     }
 
 
-//
+    //
     @Override
     public boolean haveAuthWithManage(String userId) {
         SecurityUser curUser = UserContextUtils.getCurrentUser();
@@ -297,36 +303,46 @@ public class ManageInfoService implements IManageInfoService {
     public Page<AuthUserDTO> rightRangeManagerList(SearchDTO searchDTO) {
         checkPoliceTypeMap();
         Searchable searchable = Searchable.toSearchable(searchDTO);
-        Condition orgIdEq = searchable.getSearchFilter("orgId", SearchOperator.eq);
+        Pageable pageable = searchable.getPage();
+        searchable.addSearchFilter("id", SearchOperator.ne, authConfig.getRootUserId());
         //机构id不为空,从带有管理范围的机构树选择某一个机构查询
         //无需再过滤管理范围的机构
         //机构id为空,从搜索框查询,带有人员的查询条件
         //需要过滤当前登录人的管理范围
-        if(null == orgIdEq) {
-            BaseSecurityUser currentUser = UserContextUtils.getCurrentUser();
-            boolean rootUser = authUserInfoService.isRootUser(currentUser.getId());
-            if(!rootUser) {
-                List<AppMtAuth> mtAuths = appMtAuthService.getByUserId(currentUser.getId());
-                if(CollectionUtils.isEmpty(mtAuths)) {
-                    return new PageImpl<>(new ArrayList(), searchable.getPage(), 0L);
-                }
-                Set<String> allMtOrgIds = authOrgTreeService.getAllMtOrgIds(mtAuths.get(0).getOrgId());
-                searchable.addSearchFilter("orgId", SearchOperator.in, allMtOrgIds);
+        Page<AuthUserInfo> userInfoPage;
+        Condition orgIdEq = searchable.getSearchFilter("orgId", SearchOperator.eq);
+        if (null == orgIdEq) {
+            SecurityUser currentUser = UserContextUtils.getCurrentUser();
+            String mtAuths = appMtAuthService.mgeAppRightRangeStr(currentUser.getId());
+            if (StringUtils.isBlank(mtAuths)) {
+                return new PageImpl<>(new ArrayList(), pageable, 0L);
             }
+            searchable.removePageable();
+            Set<String> allMtOrgIds = authOrgTreeService.getAllMtOrgIds(mtAuths);
+            List<UserIdAndOrgDO> manageUserIds = manageInfoRepository.getManageUserId(searchable);
+            List<String> userIds = manageUserIds.stream()
+                    .filter(e -> allMtOrgIds.contains(e.getOrgId()))
+                    .map(UserIdAndOrgDO::getId)
+                    .collect(Collectors.toList());
+            int pageNum = pageable.getPageNumber();
+            int pageSize = pageable.getPageSize();
+            List<String> pageUserIds = userIds.stream().skip(pageNum * pageSize).limit(pageSize).collect(Collectors.toList());
+            List<AuthUserInfo> authUserInfos = authUserInfoService.findByIds(pageUserIds);
+            userInfoPage = new PageImpl<>(authUserInfos, pageable, userIds.size());
+        } else {
+            userInfoPage = manageInfoRepository.getManageUserInfo(searchable);
         }
-        searchable.addSearchFilter("id", SearchOperator.ne, authConfig.getRootUserId());
-        Page<AuthUserInfo> userInfoPage = manageInfoRepository.getManageUserInfo(searchable);
         List<AuthUserInfo> userInfos = userInfoPage.getContent();
         List<AuthUserDTO> collect = userInfos.stream().map(e -> {
             AuthUserDTO dto = new AuthUserDTO();
             BeanUtils.copyProperties(e, dto);
             String code = e.getPoliceCategory();
-            if(StringUtils.isNotBlank(code)) {
+            if (StringUtils.isNotBlank(code)) {
                 dto.setPoliceCategory(POLICE_CATEGORY_MAP.get(code));
             }
             return dto;
         }).collect(Collectors.toList());
-        return new PageImpl<>(collect, searchable.getPage(), userInfoPage.getTotalElements());
+        return new PageImpl<>(collect, pageable, userInfoPage.getTotalElements());
     }
 
 }

+ 3 - 4
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/auth/service/impl/OrgQuotaAuthService.java

@@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.dragoninfo.dcuc.app.entity.ApplyInfo;
 import com.dragoninfo.dcuc.app.facade.IApplyInfoFacade;
-import com.dragoninfo.dcuc.auth.admin.facade.IAppMtAuthFacade;
+import com.dragoninfo.dcuc.auth.admin.service.IAppMtAuthService;
 import com.dragoninfo.dcuc.auth.auth.dto.OrgQuotaOpeDTO;
 import com.dragoninfo.dcuc.auth.auth.entity.OrgQuotaAuthInfo;
 import com.dragoninfo.dcuc.auth.auth.entity.OrgQuotaAuthLog;
@@ -13,7 +13,6 @@ import com.dragoninfo.dcuc.auth.auth.entity.RoleInfo;
 import com.dragoninfo.dcuc.auth.auth.repo.OrgQuotaRepository;
 import com.dragoninfo.dcuc.auth.auth.service.IOrgQuotaAuthLogService;
 import com.dragoninfo.dcuc.auth.auth.service.IOrgQuotaAuthService;
-import com.dragoninfo.dcuc.auth.auth.service.IStaffAssignAuthInfoService;
 import com.dragoninfo.dcuc.auth.auth.vo.CountVO;
 import com.dragoninfo.dcuc.auth.sub.business.IAuthOrgBusiness;
 import com.dragoninfo.dcuc.auth.sub.dto.OrgQuotaNumDTO;
@@ -72,7 +71,7 @@ public class OrgQuotaAuthService implements IOrgQuotaAuthService {
     private IAuthOrgBusiness authOrgBusiness;
 
     @Autowired
-    private IAppMtAuthFacade appMtAuthFacade;
+    private IAppMtAuthService appMtAuthService;
 
     @Autowired
     private IAuthUserInfoService authUserInfoService;
@@ -215,7 +214,7 @@ public class OrgQuotaAuthService implements IOrgQuotaAuthService {
         }
         List<OrgQuotaAuthInfo> updateList = new ArrayList<OrgQuotaAuthInfo>();
         String userId = UserContextUtils.getCurrentUser().getId();
-        String appMtAuths = appMtAuthFacade.mgeAppRightRangeStr(userId);
+        String appMtAuths = appMtAuthService.mgeAppRightRangeStr(userId);
         long time5 = System.currentTimeMillis();
         logger.info("authCancelChild:mgeAppRightRangeStr 耗时:{} ms", (time5 - time4));
         int cancelNum = 0;

+ 34 - 16
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/business/IAttrBusiness.java

@@ -1,9 +1,9 @@
 package com.dragoninfo.dcuc.auth.sub.business;
 
 import com.dragoninfo.dcuc.app.entity.ApplyInfo;
-import com.dragoninfo.dcuc.auth.sub.dto.AttrInfoTreeDTO;
-import com.dragoninfo.dcuc.auth.sub.dto.AttrRelAcceptDTO;
 import com.dragoninfo.dcuc.auth.sub.dto.RelSearchDTO;
+import com.dragoninfo.dcuc.auth.sub.dto.ServiceRelSearchDTO;
+import com.dragoninfo.dcuc.auth.sub.vo.*;
 import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import org.springframework.data.domain.Page;
 
@@ -21,43 +21,61 @@ public interface IAttrBusiness {
      * @param dto
      * @return
      */
-    ResponseStatus attrSave(AttrInfoTreeDTO dto);
+    ResponseStatus attrSave(AttrInfoAddVo dto);
 
     /**
      * 根据id,删除本级下的所有主客体属性,包括本级
-     * @param parentId
-     * @param attrBelongType
-     * @param attrType
+     * @param id
      * @return
      */
-    Boolean deleteAllById(String parentId, String attrBelongType, String attrType);
+    Boolean deleteAllById(String id);
 
     /**
      * 根据属性所属类别获取属性列表,返回树结构
+     * @param attrSubType
      * @return
      */
-    List<AttrInfoTreeDTO> getAttrTreeList(String attrType);
+    List<AttrInfoTreeVo> getAttrTreeList(String attrSubType);
 
     /**
      * 主客体和属性关联关系添加
+     * @param vo
+     * @return
+     */
+    Boolean relAdd(AttrRelAcceptVo vo);
+
+    /**
+     * 查询属性关联的应用列表
      * @param dto
      * @return
      */
-    Boolean relAdd(AttrRelAcceptDTO dto);
+    Page<ApplyInfoRelVo> relAppPage(RelSearchDTO dto);
 
     /**
-     * 查询属性关联的主客体id
-     * @param attrId
-     * @param attrType
-     * @param attrBelongType
+     * 查询属性未关联的应用列表
+     * @param dto
      * @return
      */
-    List<String> attrRelToIds(String attrId, String attrType, String attrBelongType);
+    Page<ApplyInfoVo> notRelAppPage(RelSearchDTO dto);
 
     /**
-     * 查询属性关联的应用列表
+     * 查询属性关联的服务列表
+     * @param dto
+     * @return
+     */
+    Page<ServiceRelVo> relServicePage(ServiceRelSearchDTO dto);
+
+    /**
+     * 查询属性未关联的服务列表
      * @param dto
      * @return
      */
-    Page<ApplyInfo> relAppPage(RelSearchDTO dto);
+    Page<ServiceResourceVo> notRelServicePage(ServiceRelSearchDTO dto);
+
+    /**
+     * 删除单个被关联的记录
+     * @param attrRelId
+     * @return
+     */
+    Boolean delAttrRelResource(String attrRelId);
 }

+ 318 - 102
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/business/impl/AttrBusinessImpl.java

@@ -2,21 +2,23 @@ package com.dragoninfo.dcuc.auth.sub.business.impl;
 
 import com.dragoninfo.dcuc.app.entity.ApplyInfo;
 import com.dragoninfo.dcuc.app.facade.IApplyInfoFacade;
-import com.dragoninfo.dcuc.auth.sub.business.IAttrBusiness;
+import com.dragoninfo.dcuc.app.facade.IServiceResourceFacade;
 import com.dragoninfo.dcuc.auth.auth.constance.CommonCons;
-import com.dragoninfo.dcuc.auth.sub.dto.AttrInfoTreeDTO;
-import com.dragoninfo.dcuc.auth.sub.dto.AttrRelAcceptDTO;
+import com.dragoninfo.dcuc.auth.sub.business.IAttrBusiness;
 import com.dragoninfo.dcuc.auth.sub.dto.RelSearchDTO;
+import com.dragoninfo.dcuc.auth.sub.dto.ServiceRelSearchDTO;
 import com.dragoninfo.dcuc.auth.sub.entity.AttrInfo;
 import com.dragoninfo.dcuc.auth.sub.entity.AttrRelInfo;
 import com.dragoninfo.dcuc.auth.sub.service.IAttrRelService;
 import com.dragoninfo.dcuc.auth.sub.service.IAttrService;
+import com.dragoninfo.dcuc.auth.sub.vo.*;
 import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.enums.BooleanEnum;
 import com.dragonsoft.duceap.commons.util.collections.CollectionUtils;
 import com.dragonsoft.duceap.commons.util.string.StringUtils;
 import com.dragonsoft.duceap.core.search.Searchable;
 import com.dragonsoft.duceap.core.search.enums.SearchOperator;
+import org.apache.commons.collections.ListUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -25,6 +27,7 @@ import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Component;
 
 import java.util.*;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 /**
@@ -43,76 +46,121 @@ public class AttrBusinessImpl implements IAttrBusiness {
     @Autowired
     private IApplyInfoFacade applyInfoFacade;
 
+    @Autowired
+    private IServiceResourceFacade serviceResourceFacade;
+
 
     @Override
-    public ResponseStatus attrSave(AttrInfoTreeDTO dto) {
-        String name = dto.getName();
-        String id = dto.getId();
-        List<AttrInfoTreeDTO> child = dto.getChild();
-        if(CollectionUtils.isEmpty(child)) {
-            return ResponseStatus.fail("属性值不能为空");
-        }
-        Map<String, List<AttrInfoTreeDTO>> nameMap = child.stream().collect(Collectors.groupingBy(AttrInfoTreeDTO::getName));
-        for (List<AttrInfoTreeDTO> value : nameMap.values()) {
-            if ((value.size()>1)) {
-                return ResponseStatus.fail("属性值重复");
-            }
+    public ResponseStatus attrSave(AttrInfoAddVo addVo) {
+        String id = addVo.getId();
+        String name = addVo.getName();
+        String code = addVo.getCode();
+        String pid = addVo.getPid();
+        String ptype = addVo.getPtype();
+        List<AttrInfoAddBaseVo> child = addVo.getChild();
+
+        //新增或修改的属性提交内容校验和重复性校验
+        ResponseStatus responseStatus = attrSaveRepeatCheck(addVo);
+        if (responseStatus != null){
+            return responseStatus;
         }
 
-        List<AttrInfoTreeDTO> addList;
-        List<AttrInfoTreeDTO> updateList = null;
+        List<AttrInfoAddBaseVo> addList;
+        List<AttrInfoAddBaseVo> updateList = null;
         List<String> deleteIdList = null;
+        List<AttrInfo> existChild = null;
         AttrInfo parent;
-        //新增父级节点
-        AttrInfo exist = attrService.checkExist(dto.getPid(), name);
         if (StringUtils.isBlank(id)) {
-            //查询节点是否存在
-            if(null != exist) {
-                return ResponseStatus.fail(name + "属性名称已存在");
-            }
             AttrInfo attrInfo = new AttrInfo();
             attrInfo.setName(name);
-            attrInfo.setAttrBelongType(dto.getAttrBelongType());
-            attrInfo.setAttrType(dto.getAttrType());
+            attrInfo.setCode(code);
+            attrInfo.setPtype(ptype);
+            attrInfo.setType(ptype + CommonCons.PATH_SEP + code);
+            attrInfo.setAttrSubType(addVo.getAttrSubType());
             //父节点的pid为数据库中初始数据id
-            attrInfo.setPid(dto.getPid());
-            attrInfo.setRemark(dto.getRemark());
+            attrInfo.setPid(pid);
             parent = attrService.save(attrInfo);
-            addList = dto.getChild();
+            addList = addVo.getChild();
         } else {
             parent = attrService.get(id);
-            if(parent == null){
-                return ResponseStatus.fail(dto.getName() + "属性不存在,无法更新");
-            }
-            if(exist !=null && !exist.getId().equals(id)) {
-                return ResponseStatus.fail(name + "属性名称已存在");
-            }
-            List<AttrInfo> existChild = attrService.getByParentId(id);
-            Map<Boolean, List<AttrInfoTreeDTO>> collect = Optional.ofNullable(child).orElse(new ArrayList<>())
+            existChild = attrService.getByChildListById(id);
+            Map<Boolean, List<AttrInfoAddBaseVo>> collect = Optional.ofNullable(child).orElse(new ArrayList<>())
                     .stream()
                     .collect(Collectors.partitioningBy(item -> StringUtils.isNotBlank(item.getId())));
             updateList = collect.get(Boolean.TRUE);
             addList = collect.get(Boolean.FALSE);
-            Set<String> idSet = updateList.stream().map(AttrInfoTreeDTO::getId).collect(Collectors.toSet());
+            Set<String> idSet = updateList.stream().map(AttrInfoAddBaseVo::getId).collect(Collectors.toSet());
             deleteIdList = existChild.stream().map(AttrInfo::getId).filter(item -> !idSet.contains(item)).collect(Collectors.toList());
-            updateList.forEach(item->item.setPid(parent.getId()));
-            updateList.add(dto);
         }
         if(CollectionUtils.isNotEmpty(addList)){
             batchSaveChild(parent,addList);
         }
         if(CollectionUtils.isNotEmpty(updateList)){
-            batchUpdateAttr(updateList);
+            batchUpdateAttr(parent, name, code, updateList, existChild);
         }
         if(CollectionUtils.isNotEmpty(deleteIdList)){
-            batchDeleteAttr(dto.getAttrBelongType(), dto.getAttrType(),deleteIdList);
+            batchDeleteAttr(deleteIdList);
         }
         return ResponseStatus.success();
     }
 
+    private ResponseStatus attrSaveRepeatCheck(AttrInfoAddVo addVo) {
+        String name = addVo.getName();
+        String id = addVo.getId();
+        String code = addVo.getCode();
+        String pid = addVo.getPid();
+        List<AttrInfoAddBaseVo> child = addVo.getChild();
+
+        if(CollectionUtils.isEmpty(child)) {
+            return ResponseStatus.fail("属性值列表不能为空");
+        }
+        Map<String, Long> nameCountMap = child
+                .stream()
+                .collect(Collectors.groupingBy(AttrInfoAddBaseVo::getName, Collectors.counting()));
+        boolean nameRepeat = nameCountMap.values().stream().anyMatch(e -> e > 1);
+        if(nameRepeat) {
+            return ResponseStatus.fail("属性值列表中名称重复");
+        }
+        Map<String, Long> codeCountMap = child
+                .stream()
+                .collect(Collectors.groupingBy(AttrInfoAddBaseVo::getCode, Collectors.counting()));
+        boolean codeRepeat = codeCountMap.values().stream().anyMatch(e -> e > 1);
+        if(codeRepeat) {
+            return ResponseStatus.fail("属性值列表中编码重复");
+        }
+        //已存在的属性重复性校验
+        List<AttrInfo> list = attrService.getByChildListById(pid);
+        Predicate<AttrInfo> attrNamePredicate ;
+        Predicate<AttrInfo> attrCodePredicate ;
+        if(StringUtils.isBlank(id)) {
+            attrNamePredicate = (e) -> e.getName().equals(name);
+            attrCodePredicate = (e) -> e.getCode().equals(code);
+        } else {
+            attrNamePredicate = (e) -> e.getName().equals(name) && !e.getId().equals(id);
+            attrCodePredicate = (e) -> e.getCode().equals(code) && !e.getId().equals(id);
+        }
+        boolean attrNameRepeat = list.stream().anyMatch(attrNamePredicate);
+        boolean attrCodeRepeat = list.stream().anyMatch(attrCodePredicate);
+        if(attrNameRepeat) {
+            return ResponseStatus.fail(name + "属性名称已存在");
+        }
+        if(attrCodeRepeat) {
+            return ResponseStatus.fail(name + "属性编码已存在");
+        }
+        return null;
+    }
+
     @Override
-    public Boolean deleteAllById(String id, String attrBelongType, String attrType) {
-        List<AttrInfo> attrInfos = attrService.getByParentId(id);
+    public Boolean deleteAllById(String id) {
+        //内置属性无法删除
+        AttrInfo attrInfo = attrService.get(id);
+        if(null == attrInfo) {
+            return false;
+        }
+        if(BooleanEnum.TRUE.getValue().equals(attrInfo.getBuiltIn())) {
+            return false;
+        }
+        List<AttrInfo> attrInfos = attrService.getByChildListById(id);
         List<String> ids = attrInfos
                 .stream()
                 .map(AttrInfo::getId)
@@ -120,90 +168,223 @@ public class AttrBusinessImpl implements IAttrBusiness {
         ids.add(id);
         attrService.batchDeleteAttrByIds(ids);
         //删除属性关联关系
-        attrRelService.batchDelRelByAttr(attrBelongType, attrType, ids);
+        attrRelService.batchDelRelByAttr(ids);
         return true;
     }
 
     @Override
-    public List<AttrInfoTreeDTO> getAttrTreeList(String attrType) {
+    public List<AttrInfoTreeVo> getAttrTreeList(String attrSubType) {
         Searchable searchable = Searchable.newSearchable();
-        searchable.addSearchFilter("attrType", SearchOperator.eq, attrType);
+        searchable.addSearchFilter("attrSubType", SearchOperator.eq, attrSubType);
         List<AttrInfo> list = attrService.findList(searchable);
         Map<Boolean, List<AttrInfo>> collect = list.stream().collect(Collectors.partitioningBy(item -> StringUtils.isBlank(item.getPid())));
         List<AttrInfo> parents = collect.get(Boolean.TRUE);
         List<AttrInfo> childes = collect.get(Boolean.FALSE);
-        List<AttrInfoTreeDTO> attrInfoTreeDTOS = convertToTree(parents, childes);
-        appendParent(attrInfoTreeDTOS);
-        return attrInfoTreeDTOS;
+        List<AttrInfoTreeVo> attrInfoTreeVos = convertToTree(parents, childes);
+        appendParent(attrInfoTreeVos);
+        return attrInfoTreeVos;
     }
 
     @Override
-    public Boolean relAdd(AttrRelAcceptDTO dto) {
-        List<AttrRelInfo> relInfos = attrRelService.findRelByAttr(dto.getAttrId(),dto.getAttrBelongType(),dto.getAttrType());
-        List<String> relExtIds = relInfos.stream().map(AttrRelInfo::getRelId).collect(Collectors.toList());
-        List<String> relAddIds = dto.getRelIds();
+    public Boolean relAdd(AttrRelAcceptVo vo) {
+        AttrInfo attrInfo = attrService.get(vo.getAttrId());
+        if(null == attrInfo) {
+            return false;
+        }
+        List<RelAcceptVo> relList = vo.getRelList();
         //判断新增和删除
-        List<String> addList = relAddIds.stream().filter(item -> !relExtIds.contains(item)).distinct().collect(Collectors.toList());
-        List<AttrRelInfo> delList = relInfos.stream().filter(item -> !relAddIds.contains(item.getRelId())).collect(Collectors.toList());
-        List<AttrRelInfo> attrRelInfos = addList.stream().map(item -> {
+        List<AttrRelInfo> attrRelInfos = relList.stream().map(item -> {
             AttrRelInfo attrRelInfo = new AttrRelInfo();
-            attrRelInfo.setAttrBelongType(dto.getAttrBelongType());
-            attrRelInfo.setAttrType(dto.getAttrType());
-            attrRelInfo.setAttrId(dto.getAttrId());
-            attrRelInfo.setRelId(item);
+            attrRelInfo.setAttrType(attrInfo.getType());
+            attrRelInfo.setAttrId(vo.getAttrId());
+            attrRelInfo.setRelId(item.getId());
+            attrRelInfo.setRelCode(item.getCode());
             return attrRelInfo;
         }).collect(Collectors.toList());
         if(CollectionUtils.isNotEmpty(attrRelInfos)){
             attrRelService.batchSave(attrRelInfos);
         }
-        if(CollectionUtils.isNotEmpty(delList)){
-            attrRelService.batchDelete(delList);
-        }
         return true;
     }
 
     @Override
-    public List<String> attrRelToIds(String attrId, String attrType, String attrBelongType) {
-        List<AttrRelInfo> relInfos = attrRelService.findRelByAttr(attrId, attrBelongType, attrType);
-        return relInfos.stream().map(AttrRelInfo::getRelId).distinct().collect(Collectors.toList());
+    public Page<ApplyInfoRelVo> relAppPage(RelSearchDTO dto) {
+        PageImpl<ApplyInfoRelVo> emptyPage = new PageImpl<ApplyInfoRelVo>(ListUtils.EMPTY_LIST, PageRequest.of(dto.getPage(), dto.getSize()), 0L);
+        List<AttrRelInfo> relInfos = attrRelService.findRelByAttr(dto.getAttrId());
+        Map<String, String> map = relInfos.stream().collect(Collectors.toMap(AttrRelInfo::getRelId, AttrRelInfo::getId, (oldOne, lastOne) -> lastOne));
+        List<String> appIds = new ArrayList<>(map.keySet());
+        if(CollectionUtils.isEmpty(appIds)) {
+            return emptyPage;
+        }
+        Searchable searchable = Searchable.newSearchable();
+        String name = dto.getName();
+        String code = dto.getCode();
+        String status = dto.getStatus();
+        String appId = dto.getId();
+        if(StringUtils.isNotBlank(appId)) {
+            if (!appIds.contains(appId)) {
+                return emptyPage;
+            }
+            searchable.addSearchFilter("id", SearchOperator.eq, appId);
+        } else {
+            searchable.addSearchFilter("id", SearchOperator.in, appIds);
+        }
+        if(StringUtils.isNotBlank(name)) {
+            searchable.addSearchFilter("apply_name", SearchOperator.like, name);
+        }
+        if(StringUtils.isNotBlank(code)) {
+            searchable.addSearchFilter("apply_code", SearchOperator.like, code);
+        }
+        if(StringUtils.isNotBlank(status)) {
+            searchable.addSearchFilter("apply_status", SearchOperator.eq, status);
+        }
+        searchable.addSearchFilter("deleted", SearchOperator.eq, BooleanEnum.FALSE.value);
+        searchable.setPage(dto.getPage(),dto.getSize());
+        Page<ApplyInfo> page = applyInfoFacade.findApplyList(searchable.toSearchDTO());
+        List<ApplyInfo> content = page.getContent();
+        List<ApplyInfoRelVo> applyInfoVos = content.stream().map(e -> {
+            ApplyInfoRelVo vo = new ApplyInfoRelVo();
+            BeanUtils.copyProperties(e, vo);
+            String attrRelId = map.get(e.getId());
+            vo.setAttrRelId(attrRelId);
+            return vo;
+        }).collect(Collectors.toList());
+        return new PageImpl<>(applyInfoVos, page.getPageable(), page.getTotalElements());
     }
 
     @Override
-    public Page<ApplyInfo> relAppPage(RelSearchDTO dto) {
-        List<AttrRelInfo> relInfos = attrRelService.findRelByAttr(dto.getAttrId(), dto.getAttrBelongType(), dto.getAttrType());
+    public Page<ApplyInfoVo> notRelAppPage(RelSearchDTO dto) {
+        List<AttrRelInfo> relInfos = attrRelService.findRelByAttr(dto.getAttrId());
         List<String> appIds = relInfos.stream().map(AttrRelInfo::getRelId).distinct().collect(Collectors.toList());
-        if(CollectionUtils.isEmpty(appIds)) {
-            return new PageImpl<>(new ArrayList<>(), PageRequest.of(dto.getPage(),dto.getSize()),0L);
-        }
         Searchable searchable = Searchable.newSearchable();
         String name = dto.getName();
         String code = dto.getCode();
         String status = dto.getStatus();
+        String appId = dto.getId();
+        if(StringUtils.isNotBlank(appId)) {
+            if(appIds.contains(appId)) {
+                return new PageImpl<ApplyInfoVo>(ListUtils.EMPTY_LIST, PageRequest.of(dto.getPage(), dto.getSize()), 0L);
+            }
+            searchable.addSearchFilter("id", SearchOperator.eq, appId);
+        } else {
+            if(CollectionUtils.isNotEmpty(appIds)) {
+                searchable.addSearchFilter("id", SearchOperator.notIn, appIds);
+            }
+        }
         if(StringUtils.isNotBlank(name)) {
             searchable.addSearchFilter("apply_name", SearchOperator.like, name);
         }
         if(StringUtils.isNotBlank(code)) {
-            searchable.addSearchFilter("apply_code", SearchOperator.eq, code);
+            searchable.addSearchFilter("apply_code", SearchOperator.like, code);
         }
         if(StringUtils.isNotBlank(status)) {
             searchable.addSearchFilter("apply_status", SearchOperator.eq, status);
         }
-        searchable.addSearchFilter("id", SearchOperator.in, appIds);
         searchable.addSearchFilter("deleted", SearchOperator.eq, BooleanEnum.FALSE.value);
         searchable.setPage(dto.getPage(),dto.getSize());
-        return applyInfoFacade.findApplyList(searchable.toSearchDTO());
+        Page<ApplyInfo> page = applyInfoFacade.findApplyList(searchable.toSearchDTO());
+        List<ApplyInfo> content = page.getContent();
+        List<ApplyInfoVo> applyInfoVos = content.stream().map(e -> {
+            ApplyInfoVo applyInfoVo = new ApplyInfoVo();
+            BeanUtils.copyProperties(e, applyInfoVo);
+            return applyInfoVo;
+        }).collect(Collectors.toList());
+        return new PageImpl<>(applyInfoVos, page.getPageable(), page.getTotalElements());
+    }
+
+    @Override
+    public Page<ServiceRelVo> relServicePage(ServiceRelSearchDTO dto) {
+        List<AttrRelInfo> relInfos = attrRelService.findRelByAttr(dto.getAttrId());
+        Map<String, String> map = relInfos.stream().collect(Collectors.toMap(AttrRelInfo::getRelId, AttrRelInfo::getId, (oldOne, lastOne) -> lastOne));
+        List<String> serviceIds = new ArrayList<>(map.keySet());
+        if(CollectionUtils.isEmpty(serviceIds)) {
+            return new PageImpl<>(new ArrayList<>(), PageRequest.of(dto.getPage(),dto.getSize()),0L);
+        }
+        Searchable searchable = Searchable.newSearchable();
+        String name = dto.getName();
+        String code = dto.getCode();
+        String status = dto.getStatus();
+        String appCode = dto.getAppCode();
+        if(StringUtils.isNotBlank(name)) {
+            searchable.addSearchFilter("service_name", SearchOperator.like, name);
+        }
+        if(StringUtils.isNotBlank(code)) {
+            searchable.addSearchFilter("service_code", SearchOperator.like, code);
+        }
+        if(StringUtils.isNotBlank(status)) {
+            searchable.addSearchFilter("service_status", SearchOperator.eq, status);
+        }
+        if(StringUtils.isNotBlank(appCode)) {
+            searchable.addSearchFilter("app_code", SearchOperator.eq, appCode);
+        }
+
+        searchable.addSearchFilter("id", SearchOperator.in, serviceIds);
+        searchable.addSearchFilter("deleted", SearchOperator.eq, BooleanEnum.FALSE.value);
+        searchable.setPage(dto.getPage(),dto.getSize());
+        Page<com.dragoninfo.dcuc.app.vo.ServiceResourceVo> page = serviceResourceFacade.page(searchable.toSearchDTO());
+        List<com.dragoninfo.dcuc.app.vo.ServiceResourceVo> content = page.getContent();
+        List<ServiceRelVo> collect = content.stream().map(e -> {
+            ServiceRelVo vo = new ServiceRelVo();
+            BeanUtils.copyProperties(e, vo);
+            String attrRelId = map.get(e.getId());
+            vo.setAttrRelId(attrRelId);
+            return vo;
+        }).collect(Collectors.toList());
+        return new PageImpl<>(collect, page.getPageable(), page.getTotalElements());
+    }
+
+    @Override
+    public Page<ServiceResourceVo> notRelServicePage(ServiceRelSearchDTO dto) {
+        List<AttrRelInfo> relInfos = attrRelService.findRelByAttr(dto.getAttrId());
+        List<String> serviceIds = relInfos.stream().map(AttrRelInfo::getRelId).distinct().collect(Collectors.toList());
+        Searchable searchable = Searchable.newSearchable();
+        String name = dto.getName();
+        String code = dto.getCode();
+        String status = dto.getStatus();
+        String appCode = dto.getAppCode();
+        if(StringUtils.isNotBlank(name)) {
+            searchable.addSearchFilter("service_name", SearchOperator.like, name);
+        }
+        if(StringUtils.isNotBlank(code)) {
+            searchable.addSearchFilter("service_code", SearchOperator.like, code);
+        }
+        if(StringUtils.isNotBlank(status)) {
+            searchable.addSearchFilter("service_status", SearchOperator.eq, status);
+        }
+        if(StringUtils.isNotBlank(appCode)) {
+            searchable.addSearchFilter("app_code", SearchOperator.eq, appCode);
+        }
+        if(CollectionUtils.isNotEmpty(serviceIds)) {
+            searchable.addSearchFilter("id", SearchOperator.notIn, serviceIds);
+        }
+        searchable.addSearchFilter("deleted", SearchOperator.eq, BooleanEnum.FALSE.value);
+        searchable.setPage(dto.getPage(),dto.getSize());
+        Page<com.dragoninfo.dcuc.app.vo.ServiceResourceVo> page = serviceResourceFacade.page(searchable.toSearchDTO());
+        List<com.dragoninfo.dcuc.app.vo.ServiceResourceVo> content = page.getContent();
+        List<ServiceResourceVo> collect = content.stream().map(e -> {
+            ServiceResourceVo vo = new ServiceResourceVo();
+            BeanUtils.copyProperties(e, vo);
+            return vo;
+        }).collect(Collectors.toList());
+        return new PageImpl<>(collect, page.getPageable(), page.getTotalElements());
+    }
+
+    @Override
+    public Boolean delAttrRelResource(String attrRelId) {
+        attrRelService.deleteById(attrRelId);
+        return true;
     }
 
     /**
      * 树结构dto拼接pid和pName
-     * @param attrInfoTreeDTOS
+     * @param attrInfoTrees
      */
-    private void appendParent(List<AttrInfoTreeDTO> attrInfoTreeDTOS) {
-        for (AttrInfoTreeDTO attrInfoTreeDTO : attrInfoTreeDTOS) {
-            String id = attrInfoTreeDTO.getId();
-            String name = attrInfoTreeDTO.getName();
-            String pid = attrInfoTreeDTO.getPid();
-            String pName = attrInfoTreeDTO.getPName();
+    private void appendParent(List<AttrInfoTreeVo> attrInfoTrees) {
+        for (AttrInfoTreeVo treeVo : attrInfoTrees) {
+            String id = treeVo.getId();
+            String name = treeVo.getName();
+            String pid = treeVo.getPid();
+            String pName = treeVo.getPName();
             if(StringUtils.isNotBlank(pid)) {
                 pid = pid + CommonCons.PATH_SEP + id;
             } else {
@@ -215,9 +396,9 @@ public class AttrBusinessImpl implements IAttrBusiness {
             } else {
                 pName = name;
             }
-            List<AttrInfoTreeDTO> childes = attrInfoTreeDTO.getChild();
+            List<AttrInfoTreeVo> childes = treeVo.getChild();
             if(CollectionUtils.isNotEmpty(childes)) {
-                for (AttrInfoTreeDTO child : childes) {
+                for (AttrInfoTreeVo child : childes) {
                     child.setPid(pid);
                     child.setPName(pName);
                 }
@@ -232,50 +413,85 @@ public class AttrBusinessImpl implements IAttrBusiness {
      * @param childes
      * @return
      */
-    private List<AttrInfoTreeDTO> convertToTree(List<AttrInfo> parents, List<AttrInfo> childes) {
+    private List<AttrInfoTreeVo> convertToTree(List<AttrInfo> parents, List<AttrInfo> childes) {
         Map<String, List<AttrInfo>> childMap = Optional.ofNullable(childes).orElse(new ArrayList<>())
                 .stream()
                 .collect(Collectors.groupingBy(AttrInfo::getPid));
-        ArrayList<AttrInfoTreeDTO> dtoParentList = new ArrayList<>();
+        ArrayList<AttrInfoTreeVo> dtoParentList = new ArrayList<>();
         for (AttrInfo parent : parents) {
-            AttrInfoTreeDTO dto = new AttrInfoTreeDTO();
+            AttrInfoTreeVo dto = new AttrInfoTreeVo();
             BeanUtils.copyProperties(parent, dto);
             String parentId = parent.getId();
             List<AttrInfo> list = childMap.get(parentId);
             if(CollectionUtils.isNotEmpty(list)) {
                 //把子类构造成树
-                List<AttrInfoTreeDTO> childDTOs = convertToTree(list, childes);
-                dto.setChild(childDTOs);
+                List<AttrInfoTreeVo> childVos = convertToTree(list, childes);
+                dto.setChild(childVos);
             }
             dtoParentList.add(dto);
         }
         return dtoParentList;
     }
 
-    private void batchDeleteAttr(String attrBelongType, String attrType, List<String> deleteIdList) {
+    private void batchDeleteAttr(List<String> deleteIdList) {
         attrService.batchDeleteAttrByIds(deleteIdList);
         //根据attrId、attrType删除属性关联关系
-        attrRelService.batchDelRelByAttr(attrBelongType, attrType, deleteIdList);
+        attrRelService.batchDelRelByAttr(deleteIdList);
     }
 
-    private void batchUpdateAttr(List<AttrInfoTreeDTO> updateList) {
-        List<AttrInfo> infoList = new ArrayList<>();
-        for (AttrInfoTreeDTO dto : updateList) {
-            AttrInfo attrInfo = new AttrInfo();
-            BeanUtils.copyProperties(dto,attrInfo);
-            infoList.add(attrInfo);
+    /**
+     * 主客体属性提交后更新name、code、type和ptype
+     * @param parent
+     * @param lastName
+     * @param lastCode
+     * @param updateList
+     * @param existChild
+     */
+    private void batchUpdateAttr(AttrInfo parent, String lastName, String lastCode,
+                                 List<AttrInfoAddBaseVo> updateList, List<AttrInfo> existChild) {
+        String ptype = parent.getPtype() + CommonCons.PATH_SEP + lastCode;
+        Map<String, AttrInfoAddBaseVo> idMap = updateList
+                .stream()
+                .collect(Collectors.toMap(AttrInfoAddBaseVo::getId, e -> e));
+        List<AttrInfo> collect = existChild.stream().filter(e -> {
+            AttrInfoAddBaseVo vo = idMap.get(e.getId());
+            if(null == vo) {
+                return false;
+            }
+            if (!e.getPtype().equals(ptype)) {
+                return true;
+            }
+            return !vo.getCode().equals(e.getCode()) || !vo.getName().equals(e.getName());
+        }).collect(Collectors.toList());
+        collect.forEach(e->{
+            AttrInfoAddBaseVo vo = idMap.get(e.getId());
+            String code = vo.getCode();
+            String type = ptype + CommonCons.PATH_SEP + code;
+            e.setName(vo.getName());
+            e.setCode(code);
+            e.setType(type);
+            e.setPtype(ptype);
+        });
+        if(!lastCode.equals(parent.getCode()) || !lastName.equals(parent.getName())) {
+            parent.setName(lastName);
+            parent.setCode(lastCode);
+            parent.setType(ptype);
+            collect.add(parent);
         }
-        attrService.batchUpdate(infoList);
+        attrService.batchUpdateNameCode(collect);
     }
 
-    private void batchSaveChild(AttrInfo parent, List<AttrInfoTreeDTO> addList) {
+    private void batchSaveChild(AttrInfo parent, List<AttrInfoAddBaseVo> addList) {
+        String ptype = parent.getType() + CommonCons.PATH_SEP;
         List<AttrInfo> infoList = new ArrayList<>();
-        for (AttrInfoTreeDTO dto : addList) {
+        for (AttrInfoAddBaseVo dto : addList) {
             AttrInfo attrInfo = new AttrInfo();
-            BeanUtils.copyProperties(dto,attrInfo);
-            attrInfo.setAttrType(parent.getAttrType());
-            attrInfo.setAttrBelongType(parent.getAttrBelongType());
+            attrInfo.setType(ptype + dto.getCode());
+            attrInfo.setAttrSubType(parent.getAttrSubType());
+            attrInfo.setPtype(parent.getType());
             attrInfo.setPid(parent.getId());
+            attrInfo.setName(dto.getName());
+            attrInfo.setCode(dto.getCode());
             infoList.add(attrInfo);
         }
         attrService.batchSave(infoList);

+ 76 - 30
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/business/impl/AuthUserBusinessImpl.java

@@ -1,6 +1,5 @@
 package com.dragoninfo.dcuc.auth.sub.business.impl;
 
-import com.dragoninfo.dcuc.auth.admin.entity.AppMtAuth;
 import com.dragoninfo.dcuc.auth.admin.service.IAppMtAuthService;
 import com.dragoninfo.dcuc.auth.auth.constance.CommonCons;
 import com.dragoninfo.dcuc.auth.auth.entity.RoleInfo;
@@ -15,6 +14,7 @@ import com.dragoninfo.dcuc.auth.sub.entity.AuthUserContact;
 import com.dragoninfo.dcuc.auth.sub.entity.AuthUserInfo;
 import com.dragoninfo.dcuc.auth.sub.entity.AuthUserOrgRel;
 import com.dragoninfo.dcuc.auth.sub.enumresource.JobTypeEnum;
+import com.dragoninfo.dcuc.auth.sub.repo.UserIdAndOrgDO;
 import com.dragoninfo.dcuc.auth.sub.service.*;
 import com.dragoninfo.dcuc.auth.sub.service.impl.AuthUserInfoService;
 import com.dragoninfo.dcuc.auth.util.ImportUtil;
@@ -28,13 +28,16 @@ import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import com.dragonsoft.duceap.base.entity.metadata.CodeRecord;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
 import com.dragonsoft.duceap.base.entity.security.BaseSecurityUser;
+import com.dragonsoft.duceap.base.entity.security.SecurityUser;
 import com.dragonsoft.duceap.base.utils.UserContextUtils;
 import com.dragonsoft.duceap.commons.util.collections.CollectionUtils;
 import com.dragonsoft.duceap.commons.util.string.StringUtils;
 import com.dragonsoft.duceap.core.search.Searchable;
 import com.dragonsoft.duceap.core.search.enums.SearchOperator;
 import com.dragonsoft.duceap.core.search.filter.Condition;
+import com.dragonsoft.duceap.core.search.filter.SearchFilter;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.ListUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
@@ -129,26 +132,44 @@ public class AuthUserBusinessImpl implements IAuthUserBusiness {
     @Override
     public Page<AuthUserDTO> page(SearchDTO searchDTO) {
         Searchable searchable = Searchable.toSearchable(searchDTO);
+        Pageable pageable = searchable.getPage();
+        PageImpl<AuthUserDTO> emptyPage = new PageImpl<AuthUserDTO>(ListUtils.EMPTY_LIST, pageable, 0L);
+        Collection<SearchFilter> searchFilters = searchable.getSearchFilters();
+        if(CollectionUtils.isEmpty(searchFilters)) {
+            return emptyPage;
+        }
         searchable.addSearchFilter("id", SearchOperator.ne, authConfig.getRootUserId());
-        //不通过权限控制人员列表
-        //拥有菜单就能查询全部
+        //权限控制人员列表
+        //查询条件带有机构id,该机构id是从权限范围控制内获取的机构id
+        //查询条件不带机构id,则通过searchable查询后需要进一步过滤有权限的数据
+        //orgId in条件,如果管理范围过大带有的机构id太多,影响性能。
+        Page<AuthUserInfo> page;
         Condition orgIdEq = searchable.getSearchFilter("orgId", SearchOperator.eq);
         if(null == orgIdEq) {
             BaseSecurityUser currentUser = UserContextUtils.getCurrentUser();
-            boolean rootUser = authUserInfoService.isRootUser(currentUser.getId());
-            if(!rootUser) {
-                String mtAuths = appMtAuthService.mgeAppRightRangeStr(currentUser.getId());
-                if(StringUtils.isBlank(mtAuths)) {
-                    return new PageImpl<>(new ArrayList(), searchable.getPage(), 0L);
-                }
-                Set<String> allMtOrgIds = authOrgTreeService.getAllMtOrgIds(mtAuths);
-                searchable.addSearchFilter("orgId", SearchOperator.in, allMtOrgIds);
+            String mtAuths = appMtAuthService.mgeAppRightRangeStr(currentUser.getId());
+            if(StringUtils.isBlank(mtAuths)) {
+                return emptyPage;
             }
+            searchable.removePageable();
+            List<UserIdAndOrgDO> idAndOrgId = authUserInfoService.getIdAndOrgId(searchable);
+            Set<String> allMtOrgIds = authOrgTreeService.getAllMtOrgIds(mtAuths);
+            List<String> userIds = idAndOrgId
+                    .stream()
+                    .filter(e->allMtOrgIds.contains(e.getOrgId()))
+                    .map(UserIdAndOrgDO::getId)
+                    .collect(Collectors.toList());
+            int pageNum = pageable.getPageNumber();
+            int pageSize = pageable.getPageSize();
+            List<String> pageUserIds = userIds.stream().skip(pageNum * pageSize).limit(pageSize).collect(Collectors.toList());
+            List<AuthUserInfo> pageUserInfos = authUserInfoService.findByIds(pageUserIds);
+            //过滤有权限的机构
+            page = new PageImpl<>(pageUserInfos, pageable, userIds.size());
+        } else {
+            page = authUserInfoService.page(searchable);
         }
-
-        Page<AuthUserInfo> page = authUserInfoService.page(searchable);
         List<AuthUserDTO> userDTOS = convertToUserDTO(page.getContent());
-        return new PageImpl<>(userDTOS, page.getPageable() , page.getTotalElements());
+        return new PageImpl<>(userDTOS, pageable , page.getTotalElements());
     }
 
     @Override
@@ -262,27 +283,52 @@ public class AuthUserBusinessImpl implements IAuthUserBusiness {
 
     @Override
     public Page<AuthUserDTO> roleAuthUserViewPage(SearchDTO searchDTO) {
-        Map<String, AuthOrgInfo> orgInfoMap = null;
         Searchable searchable = Searchable.toSearchable(searchDTO);
+        Pageable pageable = searchable.getPage();
+        PageImpl<AuthUserDTO> emptyPage = new PageImpl<AuthUserDTO>(ListUtils.EMPTY_LIST, pageable, 0L);
+        Collection<SearchFilter> searchFilters = searchable.getSearchFilters();
+        //默认有一个查询条件
+        if(CollectionUtils.isEmpty(searchFilters)) {
+            return emptyPage;
+        }
         //权限控制人员列表
+        //查询条件带有机构id,该机构id是从权限范围控制内获取的机构id
+        //查询条件不带机构id,则通过searchable查询后需要进一步过滤有权限的数据
+        //orgId in条件,如果管理范围过大带有的机构id太多,影响性能。
+        Page<AuthUserInfo> userInfoPage;
         Condition orgIdEq = searchable.getSearchFilter("orgId", SearchOperator.eq);
         if(null == orgIdEq) {
-            BaseSecurityUser currentUser = UserContextUtils.getCurrentUser();
-            boolean rootUser = authUserInfoService.isRootUser(currentUser.getId());
-            if(!rootUser) {
-                String mtAuths = appMtAuthService.mgeAppRightRangeStr(currentUser.getId());
-                if(StringUtils.isBlank(mtAuths)) {
-                    return new PageImpl<>(new ArrayList(), searchable.getPage(), 0L);
-                }
-                Set<String> allMtOrgIds = authOrgTreeService.getAllMtOrgIds(mtAuths);
-                searchable.addSearchFilter("orgId", SearchOperator.in, allMtOrgIds);
+            SecurityUser currentUser = UserContextUtils.getCurrentUser();
+            String mtAuths = appMtAuthService.mgeAppRightRangeStr(currentUser.getId());
+            if(StringUtils.isBlank(mtAuths)) {
+                return emptyPage;
             }
-        }
-        Page<AuthUserInfo> userInfoPage = authUserInfoService.roleAuthUserViewPage(searchable);
+            searchable.removePageable();
+            List<AuthUserOrgRel> userOrgRels = userOrgRelService.getRoleAuthUserRels(searchable);
+            Set<String> allMtOrgIds = authOrgTreeService.getAllMtOrgIds(mtAuths);
+            //权限范围过滤后查询列表
+            List<String> allRelIds = userOrgRels.stream()
+                    .filter(e -> allMtOrgIds.contains(e.getOrgId()))
+                    .map(AuthUserOrgRel::getId)
+                    .collect(Collectors.toList());
+            if(allRelIds.size() == 0) {
+                return emptyPage;
+            }
+            int pageNumber = pageable.getPageNumber();
+            int pageSize = pageable.getPageSize();
+            List<String> relIds = allRelIds.stream()
+                    .skip(pageNumber * pageSize)
+                    .limit(pageSize)
+                    .collect(Collectors.toList());
+            List<AuthUserInfo> list = authUserInfoService.roleAuthUserViewListInRelIds(relIds);
+            userInfoPage = new PageImpl<>(list, pageable, allRelIds.size());
+        } else {
+            userInfoPage = authUserInfoService.roleAuthUserViewPage(searchable);
 
+        }
         //填充机构数据
-        List<AuthUserInfo> content = userInfoPage.getContent();
-        List<String> orgIds = Optional.ofNullable(content).orElse(new ArrayList<>()).stream()
+        Map<String, AuthOrgInfo> orgInfoMap = null;
+        List<String> orgIds = userInfoPage.getContent().stream()
                 .map(AuthUserInfo::getOrgId).distinct()
                 .collect(Collectors.toList());
         if(CollectionUtils.isNotEmpty(orgIds)) {
@@ -291,7 +337,7 @@ public class AuthUserBusinessImpl implements IAuthUserBusiness {
                     .collect(Collectors.toMap(AuthOrgInfo::getId, e -> e));
         }
         Map<String, AuthOrgInfo> finalOrgInfoMap = orgInfoMap;
-        List<AuthUserDTO> collect = content.stream().map(e -> {
+        List<AuthUserDTO> collect = userInfoPage.stream().map(e -> {
             AuthUserDTO authUserDTO = new AuthUserDTO();
             BeanUtils.copyProperties(e, authUserDTO);
             if(null != finalOrgInfoMap) {
@@ -302,7 +348,7 @@ public class AuthUserBusinessImpl implements IAuthUserBusiness {
             }
             return authUserDTO;
         }).collect(Collectors.toList());
-        return new PageImpl<>(collect, userInfoPage.getPageable(), userInfoPage.getTotalElements());
+        return new PageImpl<>(collect, pageable, userInfoPage.getTotalElements());
     }
 
     @Override

+ 10 - 7
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/entity/AttrInfo.java

@@ -39,17 +39,20 @@ public class AttrInfo implements LogicDeleteable, IdEntity<String> {
     @Column(name = "PID")
     private String pid;
 
+    @Column(name = "PTYPE")
+    private String ptype;
+
     /**
      * 属性类别  SUB:主体属性 OBJ:客体属性
      */
-    @Column(name = "ATTR_TYPE")
-    private String attrType;
+    @Column(name = "ATTR_SUB_TYPE")
+    private String attrSubType;
 
     /**
      * 属性所属的主客体类别  USER:人员 ORG:机构 APP:应用 FUN:功能  SER:服务
      */
-    @Column(name = "ATTR_BELONG_TYPE")
-    private String attrBelongType;
+    @Column(name = "TYPE")
+    private String type;
 
     /**
      * 属性名称
@@ -64,10 +67,10 @@ public class AttrInfo implements LogicDeleteable, IdEntity<String> {
     private String code;
 
     /**
-     * 说明
+     * 是否是内置属性
      */
-    @Column(name = "REMARK")
-    private String remark;
+    @Column(name = "BUILT_IN")
+    private String builtIn;
 
     /**
      * 是否删除

+ 9 - 9
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/entity/AttrRelInfo.java

@@ -43,22 +43,22 @@ public class AttrRelInfo implements LogicDeleteable, IdEntity<String> {
     private String attrId;
 
     /**
-     * 关联的主客体id
+     * 属性类型
      */
-    @Column(name = "REL_ID")
-    private String relId;
+    @Column(name = "ATTR_TYPE")
+    private String attrType;
 
     /**
-     * 属性类别  SUB:主体属性 OBJ:客体属性
+     * 关联的主客体id
      */
-    @Column(name = "ATTR_TYPE")
-    private String attrType;
+    @Column(name = "REL_ID")
+    private String relId;
 
     /**
-     * 属性所属的主客体类别  USER:人员 ORG:机构 APP:应用 FUN:功能  SER:服务
+     * 关联的主客体code
      */
-    @Column(name = "ATTR_BELONG_TYPE")
-    private String attrBelongType;
+    @Column(name = "REL_CODE")
+    private String relCode;
 
     /**
      * 是否删除

+ 29 - 14
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/facade/AttrFacade.java

@@ -2,9 +2,9 @@ package com.dragoninfo.dcuc.auth.sub.facade;
 
 import com.dragoninfo.dcuc.app.entity.ApplyInfo;
 import com.dragoninfo.dcuc.auth.sub.business.IAttrBusiness;
-import com.dragoninfo.dcuc.auth.sub.dto.AttrInfoTreeDTO;
-import com.dragoninfo.dcuc.auth.sub.dto.AttrRelAcceptDTO;
 import com.dragoninfo.dcuc.auth.sub.dto.RelSearchDTO;
+import com.dragoninfo.dcuc.auth.sub.dto.ServiceRelSearchDTO;
+import com.dragoninfo.dcuc.auth.sub.vo.*;
 import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -27,32 +27,47 @@ public class AttrFacade implements IAttrFacade {
     private IAttrBusiness attrBusiness;
 
     @Override
-    public ResponseStatus attrSave(AttrInfoTreeDTO dto) {
-        return attrBusiness.attrSave(dto);
+    public ResponseStatus attrSave(AttrInfoAddVo addVo) {
+        return attrBusiness.attrSave(addVo);
     }
 
     @Override
-    public Boolean deleteAllById(String id, String attrBelongType, String attrType) {
-        return attrBusiness.deleteAllById(id, attrBelongType, attrType);
+    public Boolean deleteAllById(String id) {
+        return attrBusiness.deleteAllById(id);
     }
 
     @Override
-    public List<AttrInfoTreeDTO> getAttrTreeList(String attrType) {
-        return attrBusiness.getAttrTreeList(attrType);
+    public List<AttrInfoTreeVo> getAttrTreeList(String attrSubType) {
+        return attrBusiness.getAttrTreeList(attrSubType);
     }
 
     @Override
-    public Boolean relAdd(AttrRelAcceptDTO dto) {
-        return attrBusiness.relAdd(dto);
+    public Boolean relAdd(AttrRelAcceptVo vo) {
+        return attrBusiness.relAdd(vo);
     }
 
     @Override
-    public List<String> attrRelToIds(String attrId, String attrType, String attrBelongType) {
-        return attrBusiness.attrRelToIds(attrId, attrType, attrBelongType);
+    public Page<ApplyInfoRelVo> relAppPage(RelSearchDTO dto) {
+        return attrBusiness.relAppPage(dto);
     }
 
     @Override
-    public Page<ApplyInfo> relAppPage(RelSearchDTO dto) {
-        return attrBusiness.relAppPage(dto);
+    public Page<ApplyInfoVo> notRelAppPage(RelSearchDTO dto) {
+        return attrBusiness.notRelAppPage(dto);
+    }
+
+    @Override
+    public Page<ServiceRelVo> relServicePage(ServiceRelSearchDTO dto) {
+        return attrBusiness.relServicePage(dto);
+    }
+
+    @Override
+    public Page<ServiceResourceVo> notRelServicePage(ServiceRelSearchDTO dto) {
+        return attrBusiness.notRelServicePage(dto);
+    }
+
+    @Override
+    public Boolean delAttrRelResource(String attrRelId) {
+        return attrBusiness.delAttrRelResource(attrRelId);
     }
 }

+ 12 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/repo/AttrInfoRepository.java

@@ -2,6 +2,9 @@ package com.dragoninfo.dcuc.auth.sub.repo;
 
 import com.dragoninfo.dcuc.auth.sub.entity.AttrInfo;
 import com.dragonsoft.duceap.core.persistent.repository.BaseRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 /**
@@ -11,4 +14,13 @@ import org.springframework.stereotype.Repository;
  */
 @Repository
 public interface AttrInfoRepository extends BaseRepository<AttrInfo,String> {
+
+    /**
+     * 更新部分字段
+     * @param attrInfo
+     */
+    @Modifying
+    @Query("update AttrInfo set name = :#{#attrInfo.getName()}, code = :#{#attrInfo.getCode()}, " +
+            "type = :#{#attrInfo.getType()}, ptype = :#{#attrInfo.getPtype()} where id = :#{#attrInfo.getId()}")
+    void updateNameCode(@Param("attrInfo") AttrInfo attrInfo);
 }

+ 24 - 1
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/repo/AuthUserInfoRepository.java

@@ -6,6 +6,7 @@ import com.dragonsoft.duceap.core.persistent.repository.BaseRepository;
 import com.dragonsoft.duceap.core.search.Searchable;
 import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -24,6 +25,18 @@ public interface AuthUserInfoRepository extends BaseRepository<AuthUserInfo, Str
     @Query(value = "select distinct new com.dragoninfo.dcuc.auth.sub.entity.AuthUserInfo(id,idcard) from AuthUserInfo")
     List<AuthUserInfo> getIdAndIdcards();
 
+    /**
+     * 根据查询条件查询列表
+     * 返回值只有id和orgId字段
+     * @param searchable
+     * @return
+     */
+    @NativeQuery("SELECT u.ID, u.ORG_ID," +
+            " u.NAME, u.USER_TYPE, u.IDCARD," +
+            " u.USER_TYPE as userType, r.REL_STATUS as relStatus" +
+            " FROM T_AUTH_USER_INFO WHERE u.deleted = '0'")
+    List<UserIdAndOrgDO> getIdAndOrgId(Searchable searchable);
+
     /**
      * 角色授权模块
      * 人员视图-人员列表查询
@@ -38,6 +51,17 @@ public interface AuthUserInfoRepository extends BaseRepository<AuthUserInfo, Str
             " FROM T_AUTH_USER_INFO u INNER JOIN T_AUTH_USER_ORG_REL r ON u.ID = r.USER_ID WHERE u.deleted = '0'")
     Page<AuthUserInfo> roleAuthUserViewPage(Searchable searchable);
 
+    /**
+     * 通过人员与机构的关系查询人员列表
+     * @param relIds
+     * @return
+     */
+    @NativeQuery("SELECT u.ID, u.NAME, u.USER_TYPE, u.IDCARD," +
+            " u.POLICE_CATEGORY, u.POLICE_BUSINESS, u.MAN_TYPE, u.AUXILIARY_TYPE," +
+            " r.ORG_ID, r.ORG_CODE" +
+            " FROM T_AUTH_USER_INFO u INNER JOIN T_AUTH_USER_ORG_REL r ON u.ID = r.USER_ID WHERE u.DELETED = '0' and r.ID in :relIds")
+    List<AuthUserInfo> roleAuthUserViewListInRelIds(@Param("relIds") List<String> relIds);
+
     /**
      * 角色授权模块
      * 角色视图-人员列表查询
@@ -63,5 +87,4 @@ public interface AuthUserInfoRepository extends BaseRepository<AuthUserInfo, Str
             " u.USER_TYPE as userType, u.POLICE_CATEGORY as policeCategory, r.ORG_ID as orgId, r.REL_STATUS as relStatus" +
             " FROM T_AUTH_USER_INFO u INNER JOIN T_AUTH_USER_ORG_REL r ON u.ID = r.USER_ID WHERE u.deleted = '0'")
     List<AuthUserInfo> roleAuthRoleViewList(Searchable searchable);
-
 }

+ 13 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/repo/AuthUserOrgRelRepository.java

@@ -1,9 +1,13 @@
 package com.dragoninfo.dcuc.auth.sub.repo;
 
 import com.dragoninfo.dcuc.auth.sub.entity.AuthUserOrgRel;
+import com.dragonsoft.duceap.base.annotations.query.NativeQuery;
 import com.dragonsoft.duceap.core.persistent.repository.BaseRepository;
+import com.dragonsoft.duceap.core.search.Searchable;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * 人员机构关系持久类
  * @author mazq
@@ -12,4 +16,13 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface AuthUserOrgRelRepository extends BaseRepository<AuthUserOrgRel, String> {
 
+    /**
+     * 根据查询条件获取人员和机构关系的id
+     * @param searchable
+     * @return
+     */
+    @NativeQuery("SELECT r.ID, r.ORG_ID, r.ORG_CODE," +
+            " u.USER_TYPE as userType, r.ORG_ID as orgId, r.REL_STATUS as relStatus, u.NAME, u.IDCARD, u.DELETED" +
+            " FROM T_AUTH_USER_ORG_REL r INNER JOIN T_AUTH_USER_INFO u ON r.USER_ID = u.ID WHERE u.deleted = '0'")
+    List<AuthUserOrgRel> getRoleAuthUserRels(Searchable searchable);
 }

+ 3 - 3
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/repo/ChildCountDO.java → dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/repo/UserIdAndOrgDO.java

@@ -11,10 +11,10 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 @AllArgsConstructor
 @Data
-public class ChildCountDO {
+public class UserIdAndOrgDO {
 
-    private String upGovId;
+    private String id;
 
-    private Long num;
+    private String orgId;
 
 }

+ 2 - 6
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/IAttrRelService.java

@@ -14,11 +14,9 @@ public interface IAttrRelService {
     /**
      * 根据属性查询关联关系
      * @param attrId 属性id
-     * @param attrBelongType 属性所属主客体类型 USER:用户  ORG:机构 APP:应用
-     * @param attrType 属性类型 SUB主体 OBJ客体
      * @return
      */
-    List<AttrRelInfo> findRelByAttr(String attrId, String attrBelongType, String attrType);
+    List<AttrRelInfo> findRelByAttr(String attrId);
 
     /**
      * 保存关联关系
@@ -53,10 +51,8 @@ public interface IAttrRelService {
 
     /**
      * 批量删除属性的关联关系
-     * @param attrType
-     * @param attrBelongType
      * @param attrIds
      */
-    void batchDelRelByAttr(String attrBelongType, String attrType, List<String> attrIds);
+    void batchDelRelByAttr(List<String> attrIds);
 
 }

+ 5 - 7
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/IAttrService.java

@@ -20,11 +20,11 @@ public interface IAttrService {
     AttrInfo get(String id);
 
     /**
-     * 根据父级id查询字
+     * 根据id查询子
      * @param pid
      * @return
      */
-    List<AttrInfo> getByParentId(String pid);
+    List<AttrInfo> getByChildListById(String pid);
 
     /**
      * 更新
@@ -72,10 +72,8 @@ public interface IAttrService {
     List<AttrInfo> findList(Searchable searchable);
 
     /**
-     * 查询属性是否存在
-     * @param pid
-     * @param name
-     * @return
+     * 批量更新部分字段name、code、type和ptype
+     * @param collect
      */
-    AttrInfo checkExist(String pid, String name);
+    void batchUpdateNameCode(List<AttrInfo> collect);
 }

+ 15 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/IAuthUserInfoService.java

@@ -1,6 +1,7 @@
 package com.dragoninfo.dcuc.auth.sub.service;
 
 import com.dragoninfo.dcuc.auth.sub.entity.AuthUserInfo;
+import com.dragoninfo.dcuc.auth.sub.repo.UserIdAndOrgDO;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
 import com.dragonsoft.duceap.core.search.Searchable;
 import org.springframework.data.domain.Page;
@@ -121,6 +122,13 @@ public interface IAuthUserInfoService {
      */
     Page<AuthUserInfo> roleAuthUserViewPage(Searchable searchable);
 
+    /**
+     * 通过人员与机构的关系查询人员列表
+     * @param relIds
+     * @return
+     */
+    List<AuthUserInfo> roleAuthUserViewListInRelIds(List<String> relIds);
+
     /**
      * 角色授权模块
      * 角色视图-人员列表查询
@@ -138,4 +146,11 @@ public interface IAuthUserInfoService {
      */
     void saveAll(List<AuthUserInfo> authUserInfos);
 
+    /**
+     * 根据查询条件查询列表
+     * 返回值只有id和orgId字段
+     * @param searchable
+     * @return
+     */
+    List<UserIdAndOrgDO> getIdAndOrgId(Searchable searchable);
 }

+ 9 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/IAuthUserOrgRelService.java

@@ -1,6 +1,7 @@
 package com.dragoninfo.dcuc.auth.sub.service;
 
 import com.dragoninfo.dcuc.auth.sub.entity.AuthUserOrgRel;
+import com.dragonsoft.duceap.core.search.Searchable;
 
 import java.util.List;
 
@@ -54,4 +55,12 @@ public interface IAuthUserOrgRelService {
     void saveOneRelByOrgId(List<AuthUserOrgRel> relations);
 
     void batchUpdate(List<AuthUserOrgRel> updateList);
+
+    /**
+     * 根据查询条件获取人员和机构关系的id
+     * 因查询条件带有人员表相关的字段,需要连接查询
+     * @param searchable
+     * @return
+     */
+    List<AuthUserOrgRel> getRoleAuthUserRels(Searchable searchable);
 }

+ 22 - 20
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AttrServiceImpl.java

@@ -5,10 +5,12 @@ import com.dragoninfo.dcuc.auth.sub.entity.AttrInfo;
 import com.dragoninfo.dcuc.auth.sub.service.IAttrService;
 import com.dragonsoft.duceap.base.enums.BooleanEnum;
 import com.dragonsoft.duceap.commons.util.collections.CollectionUtils;
+import com.dragonsoft.duceap.commons.util.string.StringUtils;
 import com.dragonsoft.duceap.core.search.Searchable;
 import com.dragonsoft.duceap.core.search.enums.SearchOperator;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -42,11 +44,12 @@ public class AttrServiceImpl implements IAttrService {
     }
 
     @Override
-    public List<AttrInfo> getByParentId(String pid) {
-        Searchable searchable = Searchable.newSearchable();
-        searchable.addSearchFilter("pid", SearchOperator.eq, pid);
-        searchable.addSearchFilter("deleted", SearchOperator.eq, BooleanEnum.FALSE.value);
-        return attrInfoRepository.findAll(searchable);
+    public List<AttrInfo> getByChildListById(String id) {
+        AttrInfo attrInfo = new AttrInfo();
+        attrInfo.setPid(id);
+        attrInfo.setDeleted(BooleanEnum.FALSE.value);
+        Example<AttrInfo> example = Example.of(attrInfo);
+        return attrInfoRepository.findAll(example);
     }
 
     @Override
@@ -63,17 +66,17 @@ public class AttrServiceImpl implements IAttrService {
     }
 
     @Override
-    public AttrInfo checkExist(String pid, String name) {
-        Searchable searchable = Searchable.newSearchable();
-        searchable.addSearchFilter("pid", SearchOperator.eq, pid);
-        searchable.addSearchFilter("name", SearchOperator.eq, name);
-        searchable.addSearchFilter("deleted", SearchOperator.eq, BooleanEnum.FALSE.value);
-        List<AttrInfo> attrInfos = attrInfoRepository.findAll(searchable);
-        if(CollectionUtils.isNotEmpty(attrInfos)) {
-            return attrInfos.get(0);
-        } else  {
-            return null;
+    public void batchUpdateNameCode(List<AttrInfo> collect) {
+        for (AttrInfo attrInfo : collect) {
+            updateNameCode(attrInfo);
+        }
+    }
+
+    private void updateNameCode(AttrInfo attrInfo) {
+        if(StringUtils.isBlank(attrInfo.getId())) {
+            return ;
         }
+        attrInfoRepository.updateNameCode(attrInfo);
     }
 
     @Override
@@ -90,13 +93,12 @@ public class AttrServiceImpl implements IAttrService {
 
     @Override
     public void update(AttrInfo attrInfo) {
-        AttrInfo exist = get(attrInfo.getId());
-        if (null == exist) {
-            return;
+        String id = attrInfo.getId();
+        if(StringUtils.isBlank(id)) {
+            return ;
         }
         attrInfo.setUpdateTime(new Date());
-        BeanUtils.copyProperties(attrInfo,exist,"createTime");
-        attrInfoRepository.update(exist);
+        attrInfoRepository.update(attrInfo);
     }
 
     @Override

+ 1 - 1
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AuthOrgTreeServiceImpl.java

@@ -149,7 +149,7 @@ public class AuthOrgTreeServiceImpl implements IAuthOrgTreeService {
      * 获取机构下的子机构节点id
      * @param orgId 机构id
      * @param treeNodeMap 机构树map
-     * @param level 深度(从该机构节点算起)
+     * @param level 深度(从该机构节点算起)。需要所有子节点id,传入null
      * @return
      */
     private Set<String> getAllChildIds(String orgId, Map<String, OrgTreeNodeDTO> treeNodeMap, Integer level) {

+ 13 - 2
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AuthUserInfoService.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil;
 import com.dragoninfo.dcuc.auth.config.DcucAuthConfig;
 import com.dragoninfo.dcuc.auth.sub.entity.AuthUserInfo;
 import com.dragoninfo.dcuc.auth.sub.repo.AuthUserInfoRepository;
+import com.dragoninfo.dcuc.auth.sub.repo.UserIdAndOrgDO;
 import com.dragoninfo.dcuc.auth.sub.service.IAuthUserInfoService;
 import com.dragonsoft.duceap.base.entity.search.SearchDTO;
 import com.dragonsoft.duceap.base.enums.BooleanEnum;
@@ -166,6 +167,11 @@ public class AuthUserInfoService implements IAuthUserInfoService {
         return userInfoRepository.roleAuthUserViewPage(searchable);
     }
 
+    @Override
+    public List<AuthUserInfo> roleAuthUserViewListInRelIds(List<String> relIds) {
+        return userInfoRepository.roleAuthUserViewListInRelIds(relIds);
+    }
+
     @Override
     public Page<AuthUserInfo> roleAuthRoleViewPage(Searchable searchable, String roleBusiness) {
         if (StringUtils.isNotBlank(roleBusiness)) {
@@ -173,8 +179,8 @@ public class AuthUserInfoService implements IAuthUserInfoService {
             int pageNumber = searchable.getPageNumber();
             Pageable page = searchable.getPage();
             List<AuthUserInfo> list = getBusCodeFilterUsers(searchable, roleBusiness);
-            list = getPageContent(pageSize, pageNumber, list);
-            return new PageImpl<>(list, page, list.size());
+            List<AuthUserInfo> pageContent = getPageContent(pageSize, pageNumber, list);
+            return new PageImpl<>(pageContent, page, list.size());
         }else {
             return userInfoRepository.roleAuthRoleViewPage(searchable);
         }
@@ -193,6 +199,11 @@ public class AuthUserInfoService implements IAuthUserInfoService {
         userInfoRepository.saveAll(authUserInfos);
     }
 
+    @Override
+    public List<UserIdAndOrgDO> getIdAndOrgId(Searchable searchable) {
+        return userInfoRepository.getIdAndOrgId(searchable);
+    }
+
     private List<AuthUserInfo> getPageContent(int pageSize, int pageNumber, List<AuthUserInfo> list) {
         return list.stream().skip(pageNumber * pageSize).limit(pageSize).collect(Collectors.toList());
     }

+ 6 - 0
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/AuthUserOrgRelServiceImpl.java

@@ -5,6 +5,7 @@ import com.dragoninfo.dcuc.auth.sub.entity.AuthUserOrgRel;
 import com.dragoninfo.dcuc.auth.sub.repo.AuthUserOrgRelRepository;
 import com.dragoninfo.dcuc.auth.sub.service.IAuthUserOrgRelService;
 import com.dragonsoft.duceap.base.utils.UserContextUtils;
+import com.dragonsoft.duceap.core.search.Searchable;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -155,4 +156,9 @@ public class AuthUserOrgRelServiceImpl implements IAuthUserOrgRelService {
             userOrgRelRepository.update(authUserOrgRel);
         }
     }
+
+    @Override
+    public List<AuthUserOrgRel> getRoleAuthUserRels(Searchable searchable) {
+        return userOrgRelRepository.getRoleAuthUserRels(searchable);
+    }
 }

+ 21 - 17
dcuc-auth-service/src/main/java/com/dragoninfo/dcuc/auth/sub/service/impl/IAttrRelServiceImpl.java

@@ -1,16 +1,17 @@
 package com.dragoninfo.dcuc.auth.sub.service.impl;
 
 
-import com.dragoninfo.dcuc.auth.sub.repo.AttrRelInfoRepository;
 import com.dragoninfo.dcuc.auth.sub.entity.AttrRelInfo;
+import com.dragoninfo.dcuc.auth.sub.repo.AttrRelInfoRepository;
 import com.dragoninfo.dcuc.auth.sub.service.IAttrRelService;
 import com.dragonsoft.duceap.base.enums.BooleanEnum;
-import com.dragonsoft.duceap.core.search.Searchable;
-import com.dragonsoft.duceap.core.search.enums.SearchOperator;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.persistence.criteria.Predicate;
 import java.util.Date;
 import java.util.List;
 
@@ -26,13 +27,12 @@ public class IAttrRelServiceImpl implements IAttrRelService {
     private AttrRelInfoRepository relInfoRepository;
 
     @Override
-    public List<AttrRelInfo> findRelByAttr(String attrId, String attrBelongType, String attrType) {
-        Searchable searchable = Searchable.newSearchable();
-        searchable.addSearchFilter("attrId", SearchOperator.eq,attrId);
-        searchable.addSearchFilter("attrBelongType", SearchOperator.eq,attrBelongType);
-        searchable.addSearchFilter("attrType", SearchOperator.eq,attrType);
-        searchable.addSearchFilter("deleted", SearchOperator.eq,BooleanEnum.FALSE.value);
-        return relInfoRepository.findAll(searchable);
+    public List<AttrRelInfo> findRelByAttr(String attrId) {
+        AttrRelInfo attrRelInfo = new AttrRelInfo();
+        attrRelInfo.setAttrId(attrId);
+        attrRelInfo.setDeleted(BooleanEnum.FALSE.value);
+        Example<AttrRelInfo> example = Example.of(attrRelInfo);
+        return relInfoRepository.findAll(example);
     }
 
     @Override
@@ -68,13 +68,17 @@ public class IAttrRelServiceImpl implements IAttrRelService {
     }
 
     @Override
-    public void batchDelRelByAttr(String attrBelongType, String attrType, List<String> attrIds) {
-        Searchable searchable = Searchable.newSearchable();
-        searchable.addSearchFilter("attrId",SearchOperator.in,attrIds);
-        searchable.addSearchFilter("attrType",SearchOperator.eq,attrType);
-        searchable.addSearchFilter("attrBelongType",SearchOperator.eq,attrBelongType);
-        searchable.addSearchFilter("deleted",SearchOperator.eq,BooleanEnum.FALSE.value);
-        List<AttrRelInfo> relInfos = relInfoRepository.findAll(searchable);
+    public void batchDelRelByAttr(List<String> attrIds) {
+        List<AttrRelInfo> relInfos =  findRelByAttrIds(attrIds);
         batchDelete(relInfos);
     }
+
+    private List<AttrRelInfo> findRelByAttrIds(List<String> attrIds) {
+        Specification<AttrRelInfo> specification = (root, query, cb) -> {
+            Predicate attrIdIn = root.get("attrId").in(attrIds);
+            Predicate deletedEq = cb.equal(root.get("deleted"), BooleanEnum.FALSE.value);
+            return cb.and(attrIdIn, deletedEq);
+        };
+        return relInfoRepository.findAll(specification);
+    }
 }

+ 1 - 1
dcuc-auth-service/src/main/resources/config/mysql/V4_3_0019__Add_ServiceAuthContent.sql

@@ -1,5 +1,5 @@
 CREATE TABLE `t_service_auth_content` (
-  `ID` varchar(255) CHARACTER SET utf32 NOT NULL COMMENT 'ID',
+  `ID` varchar(32) CHARACTER SET utf32 NOT NULL COMMENT 'ID',
   `AUTH_APPLY_ID` varchar(32) DEFAULT NULL COMMENT ' 权限申请表记录id',
   `APP_CODE` varchar(100) DEFAULT NULL COMMENT '应用代码',
   `APP_NAME` varchar(100) DEFAULT NULL COMMENT '应用名称',

+ 31 - 0
dcuc-auth-service/src/main/resources/config/mysql/V4_3_0022__AttrModify.sql

@@ -0,0 +1,31 @@
+ALTER TABLE `t_auth_attr_info` ADD COLUMN PTYPE VARCHAR(128) COMMENT '父类类型' AFTER PID;
+ALTER TABLE `t_auth_attr_info` ADD COLUMN BUILT_IN VARCHAR(2) DEFAULT '0' COMMENT '是否内置' AFTER CODE;
+ALTER TABLE `t_auth_attr_info` CHANGE ATTR_TYPE ATTR_SUB_TYPE VARCHAR(10) COMMENT '主客体类型SUB:主体 OBJ:客体';
+ALTER TABLE `t_auth_attr_info` CHANGE ATTR_BELONG_TYPE TYPE VARCHAR(128) COMMENT '类型' AFTER PTYPE;
+ALTER TABLE `t_auth_attr_rel_info` ADD COLUMN REL_CODE VARCHAR(128) COMMENT '关联对象的code值' AFTER REL_ID;
+ALTER TABLE `t_auth_attr_rel_info` DROP COLUMN ATTR_BELONG_TYPE;
+
+DELETE
+FROM
+	t_auth_attr_info
+WHERE
+	id IN (
+		'37f1ff7bbc7811ebabb7005056bd458f',
+		'41157d22bc7811ebabb7005056bd458f',
+		'45eb820fbc7811ebabb7005056bd458f',
+		'57f2d485bc7811ebabb7005056bd458f',
+		'57f2d48abc7811ebabb7005056bd458f',
+		'57f2d48cbc7811ebabb7005056bd458f',
+		'57f2d48ebc7811ebabb7005056bd458f',
+		'8a8b80bb7c62e4ea017c62e50b9d0000'
+	);
+
+INSERT INTO `t_auth_attr_info` VALUES ('37f1ff7bbc7811ebabb7005056bd458f', NULL, NULL, 'ORG', 'SUB', '机构相关属性', 'ORG', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_auth_attr_info` VALUES ('41157d22bc7811ebabb7005056bd458f', NULL, NULL, 'USER', 'SUB', '用户相关属性', 'USER', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_auth_attr_info` VALUES ('45eb820fbc7811ebabb7005056bd458f', NULL, NULL, 'APP', 'SUB', '应用资源相关属性', 'APP', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_auth_attr_info` VALUES ('57f2d485bc7811ebabb7005056bd458f', NULL, NULL, 'APP', 'OBJ', '应用资源相关属性', 'APP', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_auth_attr_info` VALUES ('57f2d48abc7811ebabb7005056bd458f', NULL, NULL, 'FUN', 'OBJ', '功能资源相关属性', 'FUN', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_auth_attr_info` VALUES ('57f2d48ebc7811ebabb7005056bd458f', NULL, NULL, 'SER', 'OBJ', '服务资源相关属性', 'SER', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+-- 历史数据处理(只适用于属性管理模块还未使用的场景)
+-- DELETE from t_auth_attr_info where pid is not null AND built_in = '0';
+-- DELETE FROM t_auth_attr_rel_info;

+ 37 - 0
dcuc-auth-service/src/main/resources/config/sql/V4_3_0022__AttrModify.sql

@@ -0,0 +1,37 @@
+ALTER TABLE T_AUTH_ATTR_INFO ADD COLUMN PTYPE VARCHAR2(128);
+ALTER TABLE T_AUTH_ATTR_INFO ADD COLUMN BUILT_IN VARCHAR2(2) DEFAULT '0';
+ALTER TABLE T_AUTH_ATTR_INFO CHANGE ATTR_TYPE ATTR_SUB_TYPE VARCHAR2(10);
+ALTER TABLE T_AUTH_ATTR_INFO CHANGE ATTR_BELONG_TYPE TYPE VARCHAR2(128);
+ALTER TABLE T_AUTH_ATTR_REL_INFO ADD COLUMN REL_CODE VARCHAR2(128);
+ALTER TABLE T_AUTH_ATTR_REL_INFO DROP COLUMN ATTR_BELONG_TYPE;
+
+COMMENT ON COLUMN T_AUTH_ATTR_INFO.PTYPE IS '父类类型';
+COMMENT ON COLUMN T_AUTH_ATTR_INFO.BUILT_IN IS '是否内置';
+COMMENT ON COLUMN T_AUTH_ATTR_INFO.ATTR_SUB_TYPE IS '主客体类型SUB:主体 OBJ:客体';
+COMMENT ON COLUMN T_AUTH_ATTR_INFO.TYPE IS '类型';
+COMMENT ON COLUMN T_AUTH_ATTR_REL_INFO.REL_CODE IS '关联对象的code值';
+
+DELETE
+FROM
+	t_auth_attr_info
+WHERE
+	id IN (
+		'37f1ff7bbc7811ebabb7005056bd458f',
+		'41157d22bc7811ebabb7005056bd458f',
+		'45eb820fbc7811ebabb7005056bd458f',
+		'57f2d485bc7811ebabb7005056bd458f',
+		'57f2d48abc7811ebabb7005056bd458f',
+		'57f2d48cbc7811ebabb7005056bd458f',
+		'57f2d48ebc7811ebabb7005056bd458f',
+		'8a8b80bb7c62e4ea017c62e50b9d0000'
+	);
+
+INSERT INTO `t_auth_attr_info` VALUES ('37f1ff7bbc7811ebabb7005056bd458f', NULL, NULL, 'ORG', 'SUB', '机构相关属性', 'ORG', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_auth_attr_info` VALUES ('41157d22bc7811ebabb7005056bd458f', NULL, NULL, 'USER', 'SUB', '用户相关属性', 'USER', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_auth_attr_info` VALUES ('45eb820fbc7811ebabb7005056bd458f', NULL, NULL, 'APP', 'SUB', '应用资源相关属性', 'APP', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_auth_attr_info` VALUES ('57f2d485bc7811ebabb7005056bd458f', NULL, NULL, 'APP', 'OBJ', '应用资源相关属性', 'APP', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_auth_attr_info` VALUES ('57f2d48abc7811ebabb7005056bd458f', NULL, NULL, 'FUN', 'OBJ', '功能资源相关属性', 'FUN', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_auth_attr_info` VALUES ('57f2d48ebc7811ebabb7005056bd458f', NULL, NULL, 'SER', 'OBJ', '服务资源相关属性', 'SER', '1', '0', '2021-5-24 18:13:35', NULL, NULL, NULL, NULL, NULL, NULL);
+-- 历史数据处理(只适用于属性管理模块还未使用的场景)
+-- DELETE from t_auth_attr_info where pid is not null AND built_in = '0';
+-- DELETE FROM t_auth_attr_rel_info;

+ 1 - 5
dcuc-auth-service/src/test/java/com/dragoninfo/dcuc/auth/auth/service/IAuthSyncTest.java

@@ -1,20 +1,16 @@
 package com.dragoninfo.dcuc.auth.auth.service;
 
 import com.dragoninfo.dcuc.auth.DcucAuthApplication;
+import com.dragoninfo.dcuc.auth.sub.business.impl.SubSyncBusiness;
 import com.dragoninfo.dcuc.auth.sub.repo.AttrInfoRepository;
 import com.dragoninfo.dcuc.auth.sub.repo.AuthOrgInfoRepository;
 import com.dragoninfo.dcuc.auth.sub.repo.AuthUserInfoRepository;
-import com.dragoninfo.dcuc.auth.sub.repo.ChildCountDO;
-import com.dragoninfo.dcuc.auth.sub.business.impl.SubSyncBusiness;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
  * @author huangzqa
  * @date 2021/2/28