From 1a0768c084740d5567eaa71ca005fe5d0c376cbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Thu, 5 Dec 2024 16:00:26 +0800 Subject: [PATCH 01/25] =?UTF-8?q?feat:(REQ-3282)=20=20=E5=A2=9E=E5=8A=A0ty?= =?UTF-8?q?r-client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + tyr-client/pom.xml | 28 ++++ .../java/cn/axzo/tyr/feign/api/RoleApi.java | 17 ++ .../feign/enums/FeatureResourceTypeEnum.java | 31 ++++ .../feign/enums/RolePermissionTagEnum.java | 16 ++ .../cn/axzo/tyr/feign/enums/RoleTypeEnum.java | 24 +++ .../cn/axzo/tyr/feign/req/ListRoleReq.java | 146 ++++++++++++++++++ .../cn/axzo/tyr/feign/resp/RoleGroupResp.java | 15 ++ .../tyr/feign/resp/RolePermissionResp.java | 15 ++ .../java/cn/axzo/tyr/feign/resp/RoleResp.java | 107 +++++++++++++ .../cn/axzo/tyr/feign/resp/RoleUserResp.java | 15 ++ .../main/resources/META-INF/spring.factories | 2 + tyr-server/pom.xml | 5 + .../server/controller/v2/RoleController.java | 35 +++++ 14 files changed, 457 insertions(+) create mode 100644 tyr-client/pom.xml create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/enums/FeatureResourceTypeEnum.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RolePermissionTagEnum.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RoleTypeEnum.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListRoleReq.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RolePermissionResp.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java create mode 100644 tyr-client/src/main/resources/META-INF/spring.factories create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java diff --git a/pom.xml b/pom.xml index 3e03bd2f..b49a1d6c 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,7 @@ tyr-api tyr-server + tyr-client diff --git a/tyr-client/pom.xml b/tyr-client/pom.xml new file mode 100644 index 00000000..3af6d9e1 --- /dev/null +++ b/tyr-client/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + + tyr + cn.axzo.tyr + ${revision} + ../pom.xml + + + tyr-client + jar + tyr-client + + + + cn.axzo.framework + axzo-consumer-spring-cloud-starter + + + + cn.axzo.foundation + common-lib + 2.0.0-SNAPSHOT + + + diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java new file mode 100644 index 00000000..866e97cc --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java @@ -0,0 +1,17 @@ +package cn.axzo.tyr.feign.api; + +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.feign.req.ListRoleReq; +import cn.axzo.tyr.feign.resp.RoleResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface RoleApi { + + @PostMapping("/api/role/list") + ApiResult> list(@RequestBody ListRoleReq req); +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/FeatureResourceTypeEnum.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/FeatureResourceTypeEnum.java new file mode 100644 index 00000000..c273676b --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/FeatureResourceTypeEnum.java @@ -0,0 +1,31 @@ +package cn.axzo.tyr.feign.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * 功能资源类型 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2024/4/3 11:35 + */ +@Getter +@AllArgsConstructor +public enum FeatureResourceTypeEnum { + + MENU(1, "菜单"), + PAGE(2, "页面"), + APP_ENTRY(3, "应用入口"), + COMPONENT(4, "组件"), + ROOT(5, "ROOT"), + GROUP(6, "分组"), + // 用户pc端菜单直接的分割分组线 + MENU_PARTITION_GROUP(7, "菜单分割分组"), + ; + + private final Integer code; + + private final String desc; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RolePermissionTagEnum.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RolePermissionTagEnum.java new file mode 100644 index 00000000..9e16c19c --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RolePermissionTagEnum.java @@ -0,0 +1,16 @@ +package cn.axzo.tyr.feign.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +public enum RolePermissionTagEnum { + + JOINED("在职"), + LEAVE("离场"), + ; + + private final String desc; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RoleTypeEnum.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RoleTypeEnum.java new file mode 100644 index 00000000..ab94b5de --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RoleTypeEnum.java @@ -0,0 +1,24 @@ +package cn.axzo.tyr.feign.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author tanjie@axzo.cn + * @date 2023/9/13 16:35 + */ +@Getter +@AllArgsConstructor +public enum RoleTypeEnum { + + //角色类型:common 自定义角色 super_admin超级管理员(禁止删除) admin子管理员(禁止删除) init初始化内置角色 auto_own自定义角色(禁止删除)<承载向用户单独分配的自定义权限> + COMMON("common", "自定义角色",false), + SUPER_ADMIN("super_admin", "超级管理员",true), + ADMIN("admin", "子管理员",true), + INIT("init", "初始化内置角色-标准角色",false), + AUTO_OWN("auto_own", "虚拟角色(自定义权限使用)",false); + + private final String value; + private final String desc; + private final boolean isAdmin; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListRoleReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListRoleReq.java new file mode 100644 index 00000000..c678e149 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListRoleReq.java @@ -0,0 +1,146 @@ +package cn.axzo.tyr.feign.req; + +import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; +import cn.axzo.tyr.feign.enums.RoleTypeEnum; +import cn.axzo.tyr.feign.enums.FeatureResourceTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ListRoleReq { + + /** + * 角色id + */ + private Set roleIds; + + /** + * 租户类型 + */ + private Integer workspaceType; + + /** + * 是否显示 + */ + private Boolean isDisplay; + + /** + * 角色权限码 + */ + private String roleCode; + + /** + * 租户id + */ + private Set workspaceIds; + + /** + * 单位id + */ + private Set ouIds; + + /** + * 是否启用 + */ + private Boolean enabled; + + /** + * 角色类型:RoleTypeEnum + * super_admin:超级管理员 + * admin:管理员 + * init:初始化内置角色-标准角色 + * auto_own:虚拟角色(自定义权限使用) + * common:自定义角色 + */ + private Set roleTypes; + + /** + * 是否需要角色下的权限信息 + */ + private Boolean needPermission; + + /** + * 根据权限标签去过滤角色对应的权限, + * 只有在needPermission = true时才生效 + */ + private Set permissionTags; + + /** + * 是否需要角色对应的角色分组信息 + */ + private Boolean needRoleGroup; + + /** + * 是否需要角色对应的用户信息 + */ + private Boolean needRoleUser; + + + private Boolean needPermissionRelation; + + /** + * 是否需要预设角色,因为预设角色的workspaceId和ouId为-1 + */ + private Boolean needPresetRole; + + /** + * 查询菜单树节点类型 + */ + private List featureResourceTypes; + + /** + * 新旧权限点,needPermissionRelation = true时最好带上,因为新旧权限点会有冲突的情况发生 + */ + private Integer type; + + /** + * 端,查询权限点时,会根据端过滤,增加效率,目前只有CMS端的新版本才冗余了端 + */ + private String terminal; + + /** + * workspaceId和ouId配对查询 + * 例如:((workspaceId = ## and ouId = ##) or (workspaceId = ## and ouId = ##)) + */ + private List workspaceOuPairs; + + /** + * 角色权限码 + */ + private Set roleCodes; + + /** + * 角色分组code + */ + private Set roleGroupCodes; + + /** + * 协同关系类型 + * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组 + */ + private Set cooperateShipTypes; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class WorkspaceOuPair { + /** + * 租户id + */ + private Long workspaceId; + + /** + * 单位id + */ + private Long ouId; + } +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java new file mode 100644 index 00000000..597ee1ce --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java @@ -0,0 +1,15 @@ +package cn.axzo.tyr.feign.resp; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RoleGroupResp { + + private Long id; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RolePermissionResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RolePermissionResp.java new file mode 100644 index 00000000..f1619fb9 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RolePermissionResp.java @@ -0,0 +1,15 @@ +package cn.axzo.tyr.feign.resp; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RolePermissionResp { + + private Long id; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java new file mode 100644 index 00000000..ee4b9842 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java @@ -0,0 +1,107 @@ +package cn.axzo.tyr.feign.resp; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RoleResp { + + /** + * 角色id + */ + private Long roleId; + + /** + * 角色编码 + */ + private String roleCode; + + /** + * 角色名称 + */ + private String name; + + /** + * 角色描述 + */ + private String description; + + /** + * 角色类型:common 普通角色 super_admin超级管理员(禁止删除) admin子管理员(禁止删除) init初始化内置角色 + * @See cn.axzo.tyr.model.enums.RoleTypeEnum + */ + private String roleType; + + /** + * 角色所属租户id,预设角色的workspaceId <= 0 + */ + private Long workspaceId; + + /** + * 角色所属单位id,预设角色的ouId <= 0 + */ + private Long ouId; + + /** + * 协同关系类型 + * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组 + */ + private Integer cooperateShipType; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 是否显示 + */ + private Boolean isDisplay; + /** + * 是否启用 + */ + private Boolean enabled; + + /** + * 排序 + */ + private Integer sort; + + /** + * 添加时间 + */ + private Date createAt; + + /** + * 更新时间 + */ + private Date updateAt; + + /** + * 角色所属分组 + */ + private RoleGroupResp roleGroup; + + /** + * 角色权限 + */ + private List rolePermissions; + + /** + * 角色对应的人员信息 + */ + private List roleUsers; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java new file mode 100644 index 00000000..fcc92ebb --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java @@ -0,0 +1,15 @@ +package cn.axzo.tyr.feign.resp; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RoleUserResp { + + private Long id; +} diff --git a/tyr-client/src/main/resources/META-INF/spring.factories b/tyr-client/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..902097fe --- /dev/null +++ b/tyr-client/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +cn.axzo.tyr.client.config.TyrClientAutoConfiguration \ No newline at end of file diff --git a/tyr-server/pom.xml b/tyr-server/pom.xml index 4b79e636..926c1779 100644 --- a/tyr-server/pom.xml +++ b/tyr-server/pom.xml @@ -156,6 +156,11 @@ braum-api 1.0.0-SNAPSHOT + + cn.axzo.tyr + tyr-client + 2.0.0-SNAPSHOT + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java new file mode 100644 index 00000000..0e2d8728 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java @@ -0,0 +1,35 @@ +package cn.axzo.tyr.server.controller.v2; + +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.feign.api.RoleApi; +import cn.axzo.tyr.feign.req.ListRoleReq; +import cn.axzo.tyr.feign.resp.RoleResp; +import cn.axzo.tyr.server.service.RoleService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@RestController +public class RoleController implements RoleApi { + + @Autowired + private RoleService roleService; + + @Override + public ApiResult> list(ListRoleReq req) { + List list = roleService.list(cn.axzo.tyr.client.model.req.ListRoleReq.builder().build()); + return ApiResult.success(list.stream() + .map(e -> { + RoleResp result = RoleResp.builder().build(); + BeanUtils.copyProperties(e, result); + return result; + }) + .collect(Collectors.toList())); + } +} From 6e3e5b7342f124417a4b79e55edecff84f2fb651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Sat, 7 Dec 2024 17:08:21 +0800 Subject: [PATCH 02/25] =?UTF-8?q?feat:(REQ-3282)=20=20=E6=94=B6=E5=8F=A3?= =?UTF-8?q?=E8=A7=92=E8=89=B2page=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../req/PagePgroupPermissionRelationReq.java | 12 + .../client/model/res/SaasPermissionRes.java | 2 + .../java/cn/axzo/tyr/feign/api/RoleApi.java | 9 +- .../config/TyrFeignAutoConfiguration.java | 15 ++ .../{ListRoleReq.java => PageRoleReq.java} | 58 +++-- .../feign/resp/RoleFeatureResourceResp.java | 35 +++ .../tyr/feign/resp/RolePermissionResp.java | 15 -- .../java/cn/axzo/tyr/feign/resp/RoleResp.java | 4 +- .../main/resources/META-INF/spring.factories | 2 +- .../config/exception/BizResultCode.java | 3 +- .../server/controller/PrivateController.java | 14 +- .../server/controller/v2/RoleController.java | 91 ++++++- .../SaasPgroupPermissionRelationService.java | 68 +++++- .../SaasPgroupRoleRelationService.java | 141 +++++++++++ .../server/service/impl/RoleServiceImpl.java | 226 ++++++------------ .../impl/SaasFeatureResourceServiceImpl.java | 8 +- ...asPgroupPermissionRelationServiceImpl.java | 42 +++- .../SaasPgroupRoleRelationServiceImpl.java | 116 +++++++++ .../controller/v2/RoleControllerTest.java | 116 +++++++++ .../tyr/server/service/RoleServiceTest.java | 200 ++++++++++++++++ .../resources/mysql/RoleControllerTest.sql | 93 +++++++ .../test/resources/mysql/RoleServiceTest.sql | 36 +++ .../src/test/resources/mysql/schema.sql | 4 + 23 files changed, 1075 insertions(+), 235 deletions(-) create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/config/TyrFeignAutoConfiguration.java rename tyr-client/src/main/java/cn/axzo/tyr/feign/req/{ListRoleReq.java => PageRoleReq.java} (89%) create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleFeatureResourceResp.java delete mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RolePermissionResp.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupRoleRelationService.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupRoleRelationServiceImpl.java create mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java create mode 100644 tyr-server/src/test/resources/mysql/RoleControllerTest.sql diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePgroupPermissionRelationReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePgroupPermissionRelationReq.java index a3d554af..ece828e7 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePgroupPermissionRelationReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PagePgroupPermissionRelationReq.java @@ -63,4 +63,16 @@ public class PagePgroupPermissionRelationReq implements IPageReq { @CriteriaField(ignore = true) private Set tags; + + /** + * 是否需要菜单组件信息 + */ + @CriteriaField(ignore = true) + private Boolean needFeatureResource; + + /** + * 是否需要角色信息 + */ + @CriteriaField(ignore = true) + private Boolean needRole; } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasPermissionRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasPermissionRes.java index c43a5415..6754f481 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasPermissionRes.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasPermissionRes.java @@ -21,6 +21,8 @@ public class SaasPermissionRes { */ private String featureCode; + private String uniCode; + /** * 资源所属端 */ diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java index 866e97cc..afbd17d9 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java @@ -1,17 +1,16 @@ package cn.axzo.tyr.feign.api; +import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.result.ApiResult; -import cn.axzo.tyr.feign.req.ListRoleReq; +import cn.axzo.tyr.feign.req.PageRoleReq; import cn.axzo.tyr.feign.resp.RoleResp; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import java.util.List; - @FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") public interface RoleApi { - @PostMapping("/api/role/list") - ApiResult> list(@RequestBody ListRoleReq req); + @PostMapping("/api/role/page") + ApiResult> page(@RequestBody PageRoleReq req); } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/config/TyrFeignAutoConfiguration.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/config/TyrFeignAutoConfiguration.java new file mode 100644 index 00000000..dbc794a1 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/config/TyrFeignAutoConfiguration.java @@ -0,0 +1,15 @@ +package cn.axzo.tyr.feign.config; + +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Configuration; + +/** + * @Author: liyong.tian + * @Date: 2022/9/17 + * @Description: + */ +@EnableFeignClients(basePackages = {"cn.axzo.tyr.feign"}) +@Configuration +public class TyrFeignAutoConfiguration { + +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListRoleReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java similarity index 89% rename from tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListRoleReq.java rename to tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java index c678e149..2cd59c8a 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListRoleReq.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java @@ -1,5 +1,6 @@ package cn.axzo.tyr.feign.req; +import cn.axzo.foundation.page.PageReq; import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; import cn.axzo.tyr.feign.enums.FeatureResourceTypeEnum; @@ -15,7 +16,7 @@ import java.util.Set; @Builder @NoArgsConstructor @AllArgsConstructor -public class ListRoleReq { +public class PageRoleReq extends PageReq { /** * 角色id @@ -63,13 +64,35 @@ public class ListRoleReq { private Set roleTypes; /** - * 是否需要角色下的权限信息 + * workspaceId和ouId配对查询 + * 例如:((workspaceId = ## and ouId = ##) or (workspaceId = ## and ouId = ##)) */ - private Boolean needPermission; + private List workspaceOuPairs; + + /** + * 角色权限码 + */ + private Set roleCodes; + + /** + * 角色分组code + */ + private Set roleGroupCodes; + + /** + * 协同关系类型 + * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组 + */ + private Set cooperateShipTypes; + + /** + * 是否需要角色关联的菜单组件信息,saas_feature_recource的记录 + */ + private Boolean needFeatureResources; /** * 根据权限标签去过滤角色对应的权限, - * 只有在needPermission = true时才生效 + * 只有在needFeatureResources = true时才生效 */ private Set permissionTags; @@ -96,38 +119,11 @@ public class ListRoleReq { */ private List featureResourceTypes; - /** - * 新旧权限点,needPermissionRelation = true时最好带上,因为新旧权限点会有冲突的情况发生 - */ - private Integer type; - /** * 端,查询权限点时,会根据端过滤,增加效率,目前只有CMS端的新版本才冗余了端 */ private String terminal; - /** - * workspaceId和ouId配对查询 - * 例如:((workspaceId = ## and ouId = ##) or (workspaceId = ## and ouId = ##)) - */ - private List workspaceOuPairs; - - /** - * 角色权限码 - */ - private Set roleCodes; - - /** - * 角色分组code - */ - private Set roleGroupCodes; - - /** - * 协同关系类型 - * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组 - */ - private Set cooperateShipTypes; - @Data @Builder @NoArgsConstructor diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleFeatureResourceResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleFeatureResourceResp.java new file mode 100644 index 00000000..0d11e862 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleFeatureResourceResp.java @@ -0,0 +1,35 @@ +package cn.axzo.tyr.feign.resp; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RoleFeatureResourceResp { + + /** + * 菜单组件id + */ + private Long id; + + /** + * 菜单组件编码(全局唯一) + */ + private String uniCode; + + /** + * 菜单组件所属端 + */ + private String terminal; + + /** + * 菜单组件的权限标签 + */ + private Set tags; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RolePermissionResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RolePermissionResp.java deleted file mode 100644 index f1619fb9..00000000 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RolePermissionResp.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.axzo.tyr.feign.resp; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class RolePermissionResp { - - private Long id; -} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java index ee4b9842..3c98599b 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java @@ -96,9 +96,9 @@ public class RoleResp { private RoleGroupResp roleGroup; /** - * 角色权限 + * 角色关联的菜单组件信息 */ - private List rolePermissions; + private List roleFeatureResources; /** * 角色对应的人员信息 diff --git a/tyr-client/src/main/resources/META-INF/spring.factories b/tyr-client/src/main/resources/META-INF/spring.factories index 902097fe..9daeb510 100644 --- a/tyr-client/src/main/resources/META-INF/spring.factories +++ b/tyr-client/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -cn.axzo.tyr.client.config.TyrClientAutoConfiguration \ No newline at end of file +cn.axzo.tyr.feign.config.TyrFeignAutoConfiguration \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java index a735c4c9..f0364423 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java @@ -30,7 +30,8 @@ public enum BizResultCode implements IResultCode { FEATURE_NAME_EXIST("100020", "菜单组件名字已经存在:{}"), TERMINAL_EXIST("100021", "新端已经存在:{}"), TERMINAL_NOT_FOUND("100022", "原端不存在:{}"), - FEATURE_CODE_OVER_LENGTH("100023", "组件code不能超过100个字符:{}"); + FEATURE_CODE_OVER_LENGTH("100023", "组件code不能超过100个字符:{}"), + MAX_PAGE_SIZE_ERROR("100024", "最大查询"); private String errorCode; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java index ab3066a2..9588870e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java @@ -437,7 +437,7 @@ public class PrivateController { .pageSize(DEFAULT_PAGE_SIZE) .build(); - PageResp page = saasPgroupPermissionRelationService.page(req); + PageResp page = saasPgroupPermissionRelationService.page(req); if (CollectionUtils.isNotEmpty(page.getData())) { updateOldRoleFeature(page.getData()); @@ -451,8 +451,8 @@ public class PrivateController { return "ok"; } - private void updateNewRoleFeature(List saasPgroupPermissionRelations) { - List newFeatureRelations = saasPgroupPermissionRelations.stream() + private void updateNewRoleFeature(List saasPgroupPermissionRelations) { + List newFeatureRelations = saasPgroupPermissionRelations.stream() .filter(e -> Objects.equals(e.getType(), NEW_FEATURE)) .collect(Collectors.toList()); @@ -460,7 +460,7 @@ public class PrivateController { return; } - Map saasFeatureResourceMap = saasFeatureResourceDao.listByIds(Lists.transform(newFeatureRelations, SaasPgroupPermissionRelation::getFeatureId)) + Map saasFeatureResourceMap = saasFeatureResourceDao.listByIds(Lists.transform(newFeatureRelations, SaasPgroupPermissionRelationService.SaasPgroupPermissionRelationDTO::getFeatureId)) .stream() .collect(Collectors.toMap(SaasFeatureResource::getId, Function.identity())); @@ -485,8 +485,8 @@ public class PrivateController { saasPgroupPermissionRelationService.updateBatchById(update); } - private void updateOldRoleFeature(List saasPgroupPermissionRelations) { - List oldFeatureRelations = saasPgroupPermissionRelations.stream() + private void updateOldRoleFeature(List saasPgroupPermissionRelations) { + List oldFeatureRelations = saasPgroupPermissionRelations.stream() .filter(e -> Objects.equals(e.getType(), OLD_FEATURE)) .collect(Collectors.toList()); @@ -494,7 +494,7 @@ public class PrivateController { return; } - Map saasFeatureMap = saasFeatureDao.listByIds(Lists.transform(oldFeatureRelations, SaasPgroupPermissionRelation::getFeatureId)) + Map saasFeatureMap = saasFeatureDao.listByIds(Lists.transform(oldFeatureRelations, SaasPgroupPermissionRelationService.SaasPgroupPermissionRelationDTO::getFeatureId)) .stream() .collect(Collectors.toMap(SaasFeature::getId, Function.identity())); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java index 0e2d8728..65b9ad87 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java @@ -1,17 +1,23 @@ package cn.axzo.tyr.server.controller.v2; +import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.feign.api.RoleApi; -import cn.axzo.tyr.feign.req.ListRoleReq; +import cn.axzo.tyr.feign.enums.RoleTypeEnum; +import cn.axzo.tyr.feign.req.PageRoleReq; +import cn.axzo.tyr.feign.resp.RoleFeatureResourceResp; import cn.axzo.tyr.feign.resp.RoleResp; import cn.axzo.tyr.server.service.RoleService; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; -import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @Slf4j @@ -22,14 +28,81 @@ public class RoleController implements RoleApi { private RoleService roleService; @Override - public ApiResult> list(ListRoleReq req) { - List list = roleService.list(cn.axzo.tyr.client.model.req.ListRoleReq.builder().build()); - return ApiResult.success(list.stream() - .map(e -> { - RoleResp result = RoleResp.builder().build(); - BeanUtils.copyProperties(e, result); - return result; + public ApiResult> page(PageRoleReq req) { + check(req); + + PageResp page = roleService.page(from(req)); + + return ApiResult.success(PageResp.builder() + .total(page.getTotal()) + .size(page.getSize()) + .current(page.getCurrent()) + .data(page.getData().stream() + .map(this::from) + .collect(Collectors.toList())) + .build()); + } + + private cn.axzo.tyr.client.model.req.PageRoleReq from(PageRoleReq req) { + cn.axzo.tyr.client.model.req.PageRoleReq result = cn.axzo.tyr.client.model.req.PageRoleReq.builder().build(); + BeanUtils.copyProperties(req, result); + result.setRoleIds(Optional.ofNullable(req.getRoleIds()) + .map(Lists::newArrayList) + .orElse(null)); + + result.setWorkspaceIds(Optional.ofNullable(req.getWorkspaceIds()) + .map(Lists::newArrayList) + .orElse(null)); + + result.setOuIds(Optional.ofNullable(req.getOuIds()) + .map(Lists::newArrayList) + .orElse(null)); + + result.setRoleTypes(Optional.ofNullable(req.getRoleTypes()) + .map(e -> e.stream() + .map(RoleTypeEnum::getValue) + .collect(Collectors.toList())) + .orElse(null)); + + result.setWorkspaceOuPairs(Optional.ofNullable(req.getWorkspaceOuPairs()) + .map(e -> e.stream() + .map(pair -> { + ListRoleUserRelationParam.WorkspaceOuPair workspaceOuPair = ListRoleUserRelationParam.WorkspaceOuPair.builder() + .build(); + BeanUtils.copyProperties(pair, workspaceOuPair); + return workspaceOuPair; + }) + .collect(Collectors.toList())) + .orElse(null)); + + result.setProductUnitTypes(req.getCooperateShipTypes()); + + result.setNeedPermission(req.getNeedFeatureResources()); + return result; + } + + private RoleResp from(SaasRoleRes saasRoleRes) { + RoleResp result = RoleResp.builder().build(); + BeanUtils.copyProperties(saasRoleRes, result); + + result.setRoleFeatureResources(saasRoleRes.getSaasPermissions().stream() + .map(permission -> { + RoleFeatureResourceResp roleFeatureResourceResp = RoleFeatureResourceResp.builder().build(); + BeanUtils.copyProperties(permission, roleFeatureResourceResp); +// roleFeatureResourceResp.setUniCode(); + roleFeatureResourceResp.setTags(Optional.ofNullable(permission.getTags()) + .map(tags -> tags.stream() + .map(RolePermissionTagEnum::getDesc) + .collect(Collectors.toSet()) + ) + .orElse(null)); + return roleFeatureResourceResp; }) .collect(Collectors.toList())); + return result; + } + + private void check(PageRoleReq req) { + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java index 4927926f..8801c2a4 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java @@ -1,7 +1,9 @@ package cn.axzo.tyr.server.service; import cn.axzo.foundation.page.PageResp; +import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq; +import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp; import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; import com.baomidou.mybatisplus.extension.service.IService; @@ -10,14 +12,16 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; import java.util.List; +import java.util.Set; public interface SaasPgroupPermissionRelationService extends IService { void saveOrUpdate(UpsertPermissionRelationParam param); - PageResp page(PagePgroupPermissionRelationReq param); + PageResp page(PagePgroupPermissionRelationReq param); - List list(PagePgroupPermissionRelationReq param); + List list(PagePgroupPermissionRelationReq param); void delete(DeleteParam param); @@ -61,4 +65,64 @@ public interface SaasPgroupPermissionRelationService extends IService ids; } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + class SaasPgroupPermissionRelationDTO { + + private Long id; + + private Date createAt; + + private Date updateAt; + + /** + * 权限集id + */ + private Long groupId; + /** + * 功能id + */ + private Long featureId; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 关联类型(0:saas_feature,1:saas_feature_resource) + * 暂时的,因为cms端会有灰度,数据从saas_feature和saas_feature_resource出 + */ + private Integer type; + + /** + * 菜单资源类型1-菜单 2-页面 3-应用入口 4-组件 + * 冗余菜单资源类型,是在cms端查询菜单和页面时,方便快速查询 + * type = 0时,featureType是saas_feature表的featureType + * type = 1时,featureType是saas_feature_resource表的featureType + * 后面会全部切换到saas_feature_resource + * FeatureResourceType + */ + private Integer featureType; + + /** + * featureId所在端 + */ + private String terminal; + + /** + * 标签 + */ + private Set tags; + + private SaasFeatureResourceResp saasFeatureResource; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupRoleRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupRoleRelationService.java new file mode 100644 index 00000000..8973ca91 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupRoleRelationService.java @@ -0,0 +1,141 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.foundation.dao.support.wrapper.CriteriaField; +import cn.axzo.foundation.dao.support.wrapper.Operator; +import cn.axzo.foundation.page.IPageReq; +import cn.axzo.foundation.page.PageResp; +import cn.axzo.tyr.client.common.enums.FeatureResourceType; +import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; +import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation; +import com.baomidou.mybatisplus.extension.service.IService; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.Date; +import java.util.List; +import java.util.Set; + +public interface SaasPgroupRoleRelationService extends IService { + + List list(ListSaasPgroupRoleRelationParam param); + + PageResp page(PageSaasPgroupRoleRelationParam param); + + @Data + @SuperBuilder + @NoArgsConstructor + @AllArgsConstructor + class ListSaasPgroupRoleRelationParam { + + @CriteriaField(field = "roleId", operator = Operator.IN) + private Set roleIds; + + @CriteriaField(field = "groupId", operator = Operator.IN) + private Set groupIds; + + @CriteriaField(ignore = true) + private Boolean needRole; + + /** + * 查询featureResource,需要 + * 组装在pgroupPermissionRelations.SaasFeatureResourceResp + */ + @CriteriaField(ignore = true) + private Boolean needFeatureResource; + + /** + * 只查询featureId跟pgroupId的关联关系记录 + * 组装在pgroupPermissionRelations + */ + @CriteriaField(ignore = true) + private Boolean needFeatureResourceRelation; + + /** + * 根据权限标签去过滤角色对应的权限, + * 只有在needPermission = true时才生效 + */ + @CriteriaField(ignore = true) + private Set permissionTags; + + /** + * 端,查询权限点时,会根据端过滤,增加效率,目前只有CMS端的新版本才冗余了端 + */ + @CriteriaField(ignore = true) + private String terminal; + + @CriteriaField(ignore = true) + private List featureIds; + + /** + * 查询菜单树节点类型 + */ + @CriteriaField(ignore = true) + private List featureResourceTypes; + + /** + * 新旧feature + */ + @CriteriaField(ignore = true) + private Integer type; + } + + @SuperBuilder + @Data + @NoArgsConstructor + @AllArgsConstructor + class PageSaasPgroupRoleRelationParam extends ListSaasPgroupRoleRelationParam implements IPageReq { + + @CriteriaField(ignore = true) + Integer page; + + @CriteriaField(ignore = true) + Integer pageSize; + + /** + * 排序:使用示例,createTime__DESC + */ + @CriteriaField(ignore = true) + List sort; + } + + @Builder + @Data + @NoArgsConstructor + @AllArgsConstructor + class SaasPgroupRoleRelationDTO { + + private Long id; + + private Date createAt; + + private Date updateAt; + + /** + * 角色id + */ + private Long roleId; + + /** + * 权限集id + */ + private Long groupId; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + private SaasRoleRes saasRoleRes; + + private List pgroupPermissionRelations; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index fd25853f..5494e4ab 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -87,12 +87,14 @@ import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; +import cn.axzo.tyr.server.service.SaasPgroupRoleRelationService; import cn.axzo.tyr.server.service.SaasRoleGroupRelationService; import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import cn.axzo.tyr.server.util.RpcInternalUtil; import cn.axzo.tyr.server.utils.RpcExternalUtil; import cn.azxo.framework.common.constatns.Constants; +import cn.azxo.framework.common.utils.LogUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; @@ -100,6 +102,7 @@ import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Pair; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -212,6 +215,8 @@ public class RoleServiceImpl extends ServiceImpl private MqProducer mqProducer; @Autowired private WorkspaceApi workspaceApi; + @Autowired + private SaasPgroupRoleRelationService saasPgroupRoleRelationService; private static final String TARGET_TYPE = "saasFeatureResourceId"; @@ -1391,13 +1396,18 @@ public class RoleServiceImpl extends ServiceImpl @Override public List list(ListRoleReq param) { - return PageConverter.drainAll(pageNumber -> { - PageRoleReq pageParam = PageRoleReq.builder().build(); - BeanUtils.copyProperties(param, pageParam); - pageParam.setPage(pageNumber); - pageParam.setPageSize(10000); - return page(pageParam); - }); + PageRoleReq pageParam = PageRoleReq.builder().build(); + BeanUtils.copyProperties(param, pageParam); + pageParam.setPage(1); + pageParam.setPageSize(5000); + List data = page(pageParam).getData(); + + // XXX:list接口返回数据太大,为了不影响业务,先返回。同时输出error日志以便告警,研发排查请求来源和业务是否正确 + if (data.size() > 5000) { + LogUtil.error(LogUtil.ErrorLevel.P1, LogUtil.ErrorType.ERROR_BUSINESS, + "单次请求role的条数过多,只返回5000条信息,请确认场景, param = {}", JSON.toJSONString(param)); + } + return data; } @Override @@ -1445,7 +1455,7 @@ public class RoleServiceImpl extends ServiceImpl Map> saasRoleUsers = listSaasRoleUser(param, page.getRecords()); Map> permissionRelations = listRolePermissionRelations(param, page.getRecords()); - +ºº return PageConverter.toResp(page, (record) -> from(record, saasRoleGroups, BooleanUtils.isTrue(param.getNeedPermissionOld()) ? saasPermissionsOld : saasPermissions, @@ -1539,58 +1549,29 @@ public class RoleServiceImpl extends ServiceImpl return Collections.emptyMap(); } - List saasPgroupRoleRelations = saasPgroupRoleRelationDao.findByRoleIds(Lists.transform(saasRoles, SaasRole::getId)); - - if (CollectionUtils.isEmpty(saasPgroupRoleRelations)) { - return Collections.emptyMap(); - } - - List saasPgroupPermissionRelations = saasPgroupPermissionRelationService.list(PagePgroupPermissionRelationReq.builder() - .groupIds(Lists.transform(saasPgroupRoleRelations, SaasPgroupRoleRelation::getGroupId)) - .featureIds(param.getFeatureIds()) - .type(NEW_FEATURE) - .tags(param.getPermissionTags()) - .terminal(param.getTerminal()) - .build()); - if (CollectionUtils.isEmpty(saasPgroupPermissionRelations)) { - return Collections.emptyMap(); - } - - Map resourcePermissions = saasFeatureResourceService.permissionQuery(ResourcePermissionQueryDTO.builder() - .ids(Lists.transform(saasPgroupPermissionRelations, SaasPgroupPermissionRelation::getFeatureId)) - .build()) + return saasPgroupRoleRelationService.list(SaasPgroupRoleRelationService.ListSaasPgroupRoleRelationParam.builder() + .roleIds(saasRoles.stream() + .map(SaasRole::getId) + .collect(Collectors.toSet())) + .needFeatureResource(true) + .permissionTags(param.getPermissionTags()) + .featureIds(param.getFeatureIds()) + .terminal(param.getTerminal()) + .type(NEW_FEATURE) + .build()) .stream() - .collect(Collectors.toMap(ResourcePermission::getId, Function.identity())); - - Map> pgroupPermissions = saasPgroupPermissionRelations.stream() - .collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getGroupId)); - - return saasPgroupRoleRelations.stream() - .map(e -> { - List permissions = pgroupPermissions.get(e.getGroupId()); - if (CollectionUtils.isEmpty(permissions)) { - return null; - } - - return permissions.stream() - .map(permission -> { - ResourcePermission saasPermissionRes = resourcePermissions.get(permission.getFeatureId()); - return SaasPermissionWrapper.from(e, saasPermissionRes, permission); - }) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - }) - .filter(Objects::nonNull) - .flatMap(Collection::stream) - .collect(Collectors.groupingBy(SaasPermissionWrapper::getRoleId, - Collectors.mapping(e -> SaasPermissionRes.builder() - .id(e.getId()) - .featureCode(e.getFeatureCode()) - .tags(e.getTags()) - .terminal(e.getTerminal()) - .build(), - Collectors.toList()))); - + .filter(e -> CollectionUtils.isNotEmpty(e.getPgroupPermissionRelations())) + .collect(Collectors.toMap(SaasPgroupRoleRelationService.SaasPgroupRoleRelationDTO::getRoleId, + e -> e.getPgroupPermissionRelations().stream() + .filter(relation -> Objects.nonNull(relation.getSaasFeatureResource())) + .map(relation -> SaasPermissionRes.builder() + .id(relation.getSaasFeatureResource().getId()) + .featureCode(relation.getSaasFeatureResource().getUniCode()) + .uniCode(relation.getSaasFeatureResource().getUniCode()) + .tags(relation.getTags()) + .terminal(relation.getSaasFeatureResource().getTerminal()) + .build()) + .collect(Collectors.toList()))); } @Data @@ -1606,6 +1587,8 @@ public class RoleServiceImpl extends ServiceImpl */ private String featureCode; + private String uniCode; + private Long roleId; private Set tags; @@ -1617,7 +1600,7 @@ public class RoleServiceImpl extends ServiceImpl public static SaasPermissionWrapper from(SaasPgroupRoleRelation saasPgroupRoleRelation, ResourcePermission saasPermissionRes, - SaasPgroupPermissionRelation saasPgroupPermissionRelation) { + SaasPgroupPermissionRelationService.SaasPgroupPermissionRelationDTO saasPgroupPermissionRelation) { if (saasPermissionRes == null) { return null; } @@ -1627,6 +1610,7 @@ public class RoleServiceImpl extends ServiceImpl .roleId(saasPgroupRoleRelation.getRoleId()) .tags(saasPgroupPermissionRelation.getTags()) .terminal(saasPermissionRes.getTerminal()) + .uniCode(saasPermissionRes.getFeatureCode()) .build(); } } @@ -1688,9 +1672,10 @@ public class RoleServiceImpl extends ServiceImpl .collect(Collectors.toList()); PagePgroupPermissionRelationReq pagePgroupPermissionRelationReq = PagePgroupPermissionRelationReq.builder() .featureIds(featureIds) + .needRole(true) .build(); List groupIds = saasPgroupPermissionRelationService.list(pagePgroupPermissionRelationReq).stream() - .map(SaasPgroupPermissionRelation::getGroupId) + .map(SaasPgroupPermissionRelationService.SaasPgroupPermissionRelationDTO::getGroupId) .collect(Collectors.toList()); if (CollectionUtils.isEmpty(groupIds)) { @@ -1927,7 +1912,7 @@ public class RoleServiceImpl extends ServiceImpl return Collections.emptyMap(); } - List saasPgroupPermissionRelations = saasPgroupPermissionRelationService.list(PagePgroupPermissionRelationReq.builder() + List saasPgroupPermissionRelations = saasPgroupPermissionRelationService.list(PagePgroupPermissionRelationReq.builder() .groupIds(Lists.transform(saasPgroupRoleRelations, SaasPgroupRoleRelation::getGroupId)) .featureIds(param.getFeatureIds()) .type(OLD_FEATURE) @@ -1937,17 +1922,17 @@ public class RoleServiceImpl extends ServiceImpl return Collections.emptyMap(); } - List featureIds = Lists.transform(saasPgroupPermissionRelations, SaasPgroupPermissionRelation::getFeatureId); + List featureIds = Lists.transform(saasPgroupPermissionRelations, SaasPgroupPermissionRelationService.SaasPgroupPermissionRelationDTO::getFeatureId); Map resourcePermissions = saasFeatureDao.listByIds(featureIds).stream() .collect(Collectors.toMap(SaasFeature::getId, Function.identity())); - Map> pgroupPermissions = saasPgroupPermissionRelations.stream() - .collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getGroupId)); + Map> pgroupPermissions = saasPgroupPermissionRelations.stream() + .collect(Collectors.groupingBy(SaasPgroupPermissionRelationService.SaasPgroupPermissionRelationDTO::getGroupId)); return saasPgroupRoleRelations.stream() .map(e -> { - List permissions = pgroupPermissions.get(e.getGroupId()); + List permissions = pgroupPermissions.get(e.getGroupId()); if (CollectionUtils.isEmpty(permissions)) { return null; } @@ -1983,46 +1968,27 @@ public class RoleServiceImpl extends ServiceImpl return Collections.emptyMap(); } - List saasPgroupRoleRelations = saasPgroupRoleRelationDao.findByRoleIds(Lists.transform(saasRoles, SaasRole::getId)); - - if (CollectionUtils.isEmpty(saasPgroupRoleRelations)) { - return Collections.emptyMap(); - } - - PagePgroupPermissionRelationReq pagePgroupPermissionRelationReq = PagePgroupPermissionRelationReq.builder() - .groupIds(Lists.transform(saasPgroupRoleRelations, SaasPgroupRoleRelation::getGroupId)) - .featureIds(param.getFeatureIds()) - .featureResourceTypes(param.getFeatureResourceTypes()) - .type(param.getType()) - .terminal(param.getTerminal()) - .build(); - List saasPgroupPermissionRelations = saasPgroupPermissionRelationService.list(pagePgroupPermissionRelationReq); - - Map> pgroupPermissions = saasPgroupPermissionRelations.stream() - .collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getGroupId)); - - return saasPgroupRoleRelations.stream() - .map(e -> { - List permissionRelations = pgroupPermissions.get(e.getGroupId()); - if (CollectionUtils.isEmpty(permissionRelations)) { - return null; - } - - return permissionRelations.stream() - .map(permissionRelation -> SaasPermissionRelationWrapper.from(e, permissionRelation)) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - }) - .filter(Objects::nonNull) - .flatMap(Collection::stream) - .collect(Collectors.groupingBy(SaasPermissionRelationWrapper::getRoleId, - Collectors.mapping(e -> SaasPermissionRelationRes.builder() - .featureId(e.getFeatureId()) - .type(e.getType()) - .featureType(e.getFeatureType()) - .tags(e.getTags()) - .build(), - Collectors.toList()))); + return saasPgroupRoleRelationService.list(SaasPgroupRoleRelationService.ListSaasPgroupRoleRelationParam.builder() + .roleIds(saasRoles.stream() + .map(SaasRole::getId) + .collect(Collectors.toSet())) + .needFeatureResourceRelation(true) + .featureIds(param.getFeatureIds()) + .featureResourceTypes(param.getFeatureResourceTypes()) + .type(param.getType()) + .terminal(param.getTerminal()) + .build()) + .stream() + .filter(e -> CollectionUtils.isNotEmpty(e.getPgroupPermissionRelations())) + .collect(Collectors.toMap(SaasPgroupRoleRelationService.SaasPgroupRoleRelationDTO::getRoleId, + e -> e.getPgroupPermissionRelations().stream() + .map(relation -> SaasPermissionRelationRes.builder() + .featureId(relation.getFeatureId()) + .type(relation.getType()) + .featureType(relation.getFeatureType()) + .tags(relation.getTags()) + .build()) + .collect(Collectors.toList()))); } private void saveOperateLog(Long featureId, Long operatorId, List req) { @@ -2110,52 +2076,4 @@ public class RoleServiceImpl extends ServiceImpl saasPgroupPermissionRelationOperateLogService.batchSave(Lists.newArrayList(operateLog)); } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - static class SaasPermissionRelationWrapper { - - /** - * 角色id - */ - private Long roleId; - - /** - * 菜单资源树节点id - */ - private Long featureId; - - /** - * 新旧菜单资源数标识 - */ - private Integer type; - - /** - * 菜单资源树节点类型 - */ - private Integer featureType; - - /** - * 权限点标签: - * 在职:JOINED - * 离场:LEAVE - */ - private Set tags; - - public static SaasPermissionRelationWrapper from(SaasPgroupRoleRelation saasPgroupRoleRelation, - SaasPgroupPermissionRelation permissionRelation) { - if (permissionRelation == null) { - return null; - } - return SaasPermissionRelationWrapper.builder() - .roleId(saasPgroupRoleRelation.getRoleId()) - .featureId(permissionRelation.getFeatureId()) - .type(permissionRelation.getType()) - .featureType(permissionRelation.getFeatureType()) - .tags(permissionRelation.getTags()) - .build(); - } - } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 67edc937..43507f43 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -304,7 +304,7 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl relations = saasPgroupPermissionRelationService.list(PagePgroupPermissionRelationReq.builder() + List relations = saasPgroupPermissionRelationService.list(PagePgroupPermissionRelationReq.builder() .featureIds(Lists.transform(descendants, SaasFeatureResource::getId)) .tags(detailFeatureResourceReq.getTags()) .build()); @@ -312,7 +312,7 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl groupIds = Lists.transform(relations, SaasPgroupPermissionRelation::getGroupId); + List groupIds = Lists.transform(relations, SaasPgroupPermissionRelationService.SaasPgroupPermissionRelationDTO::getGroupId); List saasPgroupRoleRelations = saasPgroupRoleRelationDao.listByGroupIds(groupIds); if (CollectionUtils.isEmpty(saasPgroupRoleRelations)) { @@ -1000,13 +1000,13 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl permissionRelations = saasPgroupPermissionRelationService.list(pagePgroupPermissionRelationReq); + List permissionRelations = saasPgroupPermissionRelationService.list(pagePgroupPermissionRelationReq); if (CollectionUtils.isEmpty(permissionRelations)) { return; } SaasPgroupPermissionRelationService.DeleteParam deleteParam = SaasPgroupPermissionRelationService.DeleteParam.builder() - .ids(Lists.transform(permissionRelations, SaasPgroupPermissionRelation::getId)) + .ids(Lists.transform(permissionRelations, SaasPgroupPermissionRelationService.SaasPgroupPermissionRelationDTO::getId)) .build(); saasPgroupPermissionRelationService.delete(deleteParam); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java index dd979ced..3a143164 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java @@ -7,9 +7,12 @@ import cn.axzo.foundation.page.PageResp; import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq; +import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq; +import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp; import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao; import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; import cn.axzo.tyr.server.repository.mapper.SaasPgroupPermissionRelationMapper; +import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,16 +22,18 @@ import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -42,6 +47,8 @@ public class SaasPgroupPermissionRelationServiceImpl implements SaasPgroupPermissionRelationService { private final SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao; + private final SaasFeatureResourceService saasFeatureResourceService; + @Override @Transactional(rollbackFor = Exception.class) public void saveOrUpdate(UpsertPermissionRelationParam param) { @@ -94,7 +101,7 @@ public class SaasPgroupPermissionRelationServiceImpl } @Override - public PageResp page(PagePgroupPermissionRelationReq param) { + public PageResp page(PagePgroupPermissionRelationReq param) { QueryWrapper wrapper = QueryWrapperHelper.fromBean(param, SaasPgroupPermissionRelation.class); wrapper.eq("is_delete", 0); @@ -117,11 +124,13 @@ public class SaasPgroupPermissionRelationServiceImpl IPage page = this.page(PageConverter.toMybatis(param, SaasPgroupPermissionRelation.class), wrapper); - return PageConverter.toResp(page, Function.identity()); + Map saasFeatureResources = listSaasFeatureResource(page.getRecords(), param); + + return PageConverter.toResp(page, (record) -> from(record, saasFeatureResources)); } @Override - public List list(PagePgroupPermissionRelationReq param) { + public List list(PagePgroupPermissionRelationReq param) { return PageConverter.drainAll(pageNumber -> { param.setPage(pageNumber); // 减少io,后续优化 @@ -138,4 +147,29 @@ public class SaasPgroupPermissionRelationServiceImpl } this.removeByIds(param.getIds()); } + + private SaasPgroupPermissionRelationDTO from(SaasPgroupPermissionRelation saasPgroupPermissionRelation, + Map saasFeatureResources) { + SaasPgroupPermissionRelationDTO result = SaasPgroupPermissionRelationDTO.builder().build(); + BeanUtils.copyProperties(saasPgroupPermissionRelation, result); + + result.setSaasFeatureResource(saasFeatureResources.get(result.getFeatureId())); + return result; + } + + private Map listSaasFeatureResource(List saasPgroupPermissionRelations, + PagePgroupPermissionRelationReq param) { + if (CollectionUtils.isEmpty(saasPgroupPermissionRelations) || BooleanUtils.isNotTrue(param.getNeedFeatureResource())) { + return Collections.emptyMap(); + } + + return saasFeatureResourceService.list(PageSaasFeatureResourceReq.builder() + .ids(saasPgroupPermissionRelations.stream() + .map(SaasPgroupPermissionRelation::getFeatureId) + .distinct() + .collect(Collectors.toList())) + .build()) + .stream() + .collect(Collectors.toMap(SaasFeatureResourceResp::getId, Function.identity())); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupRoleRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupRoleRelationServiceImpl.java new file mode 100644 index 00000000..67eb7cf8 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupRoleRelationServiceImpl.java @@ -0,0 +1,116 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.foundation.dao.support.converter.PageConverter; +import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper; +import cn.axzo.foundation.page.PageResp; +import cn.axzo.tyr.client.model.req.ListRoleReq; +import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq; +import cn.axzo.tyr.client.model.res.SaasRoleRes; +import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation; +import cn.axzo.tyr.server.repository.mapper.SaasPgroupRoleRelationMapper; +import cn.axzo.tyr.server.service.RoleService; +import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; +import cn.axzo.tyr.server.service.SaasPgroupRoleRelationService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.BooleanUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE; + +@Slf4j +@Service +public class SaasPgroupRoleRelationServiceImpl extends ServiceImpl + implements SaasPgroupRoleRelationService { + + @Autowired + private RoleService roleService; + @Autowired + private SaasPgroupPermissionRelationService saasPgroupPermissionRelationService; + + @Override + public List list(ListSaasPgroupRoleRelationParam param) { + PageSaasPgroupRoleRelationParam pageParam = PageSaasPgroupRoleRelationParam.builder().build(); + BeanUtils.copyProperties(param, pageParam); + return PageConverter.drainAll(pageNumber -> { + pageParam.setPage(pageNumber); + pageParam.setPageSize(1000); + return page(pageParam); + }); + } + + @Override + public PageResp page(PageSaasPgroupRoleRelationParam param) { + QueryWrapper wrapper = QueryWrapperHelper.fromBean(param, SaasPgroupRoleRelation.class); + wrapper.eq("is_delete", 0); + + IPage page = this.page(PageConverter.toMybatis(param, SaasPgroupRoleRelation.class), wrapper); + + Map saasRoleRes = listRole(page.getRecords(), param); + + Map> pgrouupPermissionRelations = listFeatureResource(page.getRecords(), param); + + return PageConverter.toResp(page, (record) -> from(record, saasRoleRes, pgrouupPermissionRelations)); + } + + private SaasPgroupRoleRelationDTO from(SaasPgroupRoleRelation saasPgroupRoleRelation, + Map saasRoleRes, + Map> pgrouupPermissionRelations) { + SaasPgroupRoleRelationDTO result = SaasPgroupRoleRelationDTO.builder().build(); + BeanUtils.copyProperties(saasPgroupRoleRelation, result); + + result.setSaasRoleRes(saasRoleRes.get(result.getRoleId())); + + result.setPgroupPermissionRelations(pgrouupPermissionRelations.get(result.getGroupId())); + return result; + } + + private Map listRole(List saasPgroupRoleRelations, + PageSaasPgroupRoleRelationParam param) { + + if (CollectionUtils.isEmpty(saasPgroupRoleRelations) || BooleanUtils.isNotTrue(param.getNeedRole())) { + return Collections.emptyMap(); + } + + return roleService.list(ListRoleReq.builder() + .roleIds(Lists.transform(saasPgroupRoleRelations, SaasPgroupRoleRelation::getRoleId)) + .build()) + .stream() + .collect(Collectors.toMap(SaasRoleRes::getId, Function.identity())); + } + + private Map> listFeatureResource(List saasPgroupRoleRelations, + PageSaasPgroupRoleRelationParam param) { + if (CollectionUtils.isEmpty(saasPgroupRoleRelations) || + (BooleanUtils.isNotTrue(param.getNeedFeatureResource()) && BooleanUtils.isNotTrue(param.getNeedFeatureResourceRelation()))) { + return Collections.emptyMap(); + } + + return saasPgroupPermissionRelationService.list(PagePgroupPermissionRelationReq.builder() + .groupIds(saasPgroupRoleRelations.stream() + .map(SaasPgroupRoleRelation::getGroupId) + .distinct() + .collect(Collectors.toList())) + .needFeatureResource(param.getNeedFeatureResource()) + .featureIds(param.getFeatureIds()) + .tags(param.getPermissionTags()) + .type(param.getType()) + .terminal(param.getTerminal()) + .featureResourceTypes(param.getFeatureResourceTypes()) + .build()) + .stream() + .collect(Collectors.groupingBy(SaasPgroupPermissionRelationService.SaasPgroupPermissionRelationDTO::getGroupId)); + } +} diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java new file mode 100644 index 00000000..617f5a81 --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java @@ -0,0 +1,116 @@ +package cn.axzo.tyr.server.controller.v2; + +import cn.axzo.tyr.base.BaseTest; +import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.feign.enums.RoleTypeEnum; +import cn.axzo.tyr.feign.req.PageRoleReq; +import cn.axzo.tyr.feign.resp.RoleResp; +import com.google.common.collect.Sets; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +class RoleControllerTest extends BaseTest { + @Autowired + private MysqlDataLoader mysqlDataLoader; + @Autowired + private RoleController roleController; + + @BeforeEach + @Override + public void setup() { + super.setup(); + mysqlDataLoader.loadFromClassName(getClass().getSimpleName()); + MockitoAnnotations.initMocks(this); + } + @Test + void list() { + List roleResps = roleController.list(PageRoleReq.builder() + .roleIds(Sets.newHashSet(24425L)) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 1); + + roleResps = roleController.list(PageRoleReq.builder() + .workspaceType(6) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 2); + + roleResps = roleController.list(PageRoleReq.builder() + .isDisplay(true) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 9); + + roleResps = roleController.list(PageRoleReq.builder() + .roleCode("oms:project_manager") + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 1); + + roleResps = roleController.list(PageRoleReq.builder() + .workspaceIds(Sets.newHashSet(3L, 0L)) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 5); + + roleResps = roleController.list(PageRoleReq.builder() + .ouIds(Sets.newHashSet(4L, 0L)) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 5); + + roleResps = roleController.list(PageRoleReq.builder() + .enabled(true) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 9); + + roleResps = roleController.list(PageRoleReq.builder() + .roleTypes(Sets.newHashSet(RoleTypeEnum.SUPER_ADMIN)) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 4); + + roleResps = roleController.list(PageRoleReq.builder() + .workspaceOuPairs(Lists.newArrayList(PageRoleReq.WorkspaceOuPair.builder() + .workspaceId(3L) + .ouId(4L) + .build())) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 1); + + roleResps = roleController.list(PageRoleReq.builder() + .roleCodes(Sets.newHashSet("ou_superadmin")) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 1); + + roleResps = roleController.list(PageRoleReq.builder() + .roleGroupCodes(Sets.newHashSet("omsSuperAdminGroup")) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 1); + + roleResps = roleController.list(PageRoleReq.builder() + .cooperateShipTypes(Sets.newHashSet(1)) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 2); + + roleResps = roleController.list(PageRoleReq.builder() + .roleIds(Sets.newHashSet(24425L)) + .needFeatureResources(true) + .build()) + .getData(); + Assertions.assertEquals(roleResps.size(), 1); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().size(), 10); + } +} \ No newline at end of file diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/service/RoleServiceTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/service/RoleServiceTest.java index b3cb0a42..6c734d50 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/service/RoleServiceTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/service/RoleServiceTest.java @@ -7,7 +7,9 @@ import cn.axzo.apollo.workspace.api.workspace.res.SimpleWorkspaceRes; import cn.axzo.basics.profiles.api.UserProfileServiceApi; import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; +import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; import cn.axzo.tyr.client.model.req.ListRoleReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; @@ -30,6 +32,9 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE; +import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.OLD_FEATURE; + class RoleServiceTest extends BaseTest { @Autowired @@ -88,6 +93,201 @@ class RoleServiceTest extends BaseTest { .roleIds(Lists.newArrayList(24425L, 25324L)) .build()); Assertions.assertEquals(roles.size(), 2); + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(24425L)) + .needPermission(true) + .build()); + Assertions.assertEquals(roles.size(), 1); + Assertions.assertEquals(roles.get(0).getSaasPermissions().size(), 5); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getId(), 153L); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getFeatureCode(), "oms:menu_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getUniCode(), "oms:menu_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getSaasPermissions().get(0).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getTerminal(), "NT_OMS_WEB"); + + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(1).getId(), 466L); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(1).getFeatureCode(), "oms:imConfig_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(1).getUniCode(), "oms:imConfig_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(1).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getSaasPermissions().get(1).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(1).getTerminal(), "NT_OMS_WEB"); + + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(2).getId(), 467L); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(2).getFeatureCode(), "oms:im_robot_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(2).getUniCode(), "oms:im_robot_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(2).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getSaasPermissions().get(2).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(2).getTerminal(), "NT_OMS_WEB"); + + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(3).getId(), 469L); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(3).getFeatureCode(), "oms:msgPush_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(3).getUniCode(), "oms:msgPush_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(3).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getSaasPermissions().get(3).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(3).getTerminal(), "NT_OMS_WEB"); + + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(4).getId(), 693L); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(4).getFeatureCode(), "oms:detail_backPay_btn"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(4).getUniCode(), "oms:detail_backPay_btn"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(4).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getSaasPermissions().get(4).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(4).getTerminal(), "NT_OMS_WEB"); + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(24425L)) + .featureIds(Lists.newArrayList(153L)) + .needPermission(true) + .build()); + Assertions.assertEquals(roles.size(), 1); + Assertions.assertEquals(roles.get(0).getSaasPermissions().size(), 1); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getId(), 153L); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getFeatureCode(), "oms:menu_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getUniCode(), "oms:menu_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getSaasPermissions().get(0).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getTerminal(), "NT_OMS_WEB"); + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(24425L)) + .terminal("NT_OMS_WEB") + .needPermission(true) + .build()); + Assertions.assertEquals(roles.size(), 1); + Assertions.assertEquals(roles.get(0).getSaasPermissions().size(), 1); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getId(), 153L); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getFeatureCode(), "oms:menu_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getUniCode(), "oms:menu_page"); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getSaasPermissions().get(0).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roles.get(0).getSaasPermissions().get(0).getTerminal(), "NT_OMS_WEB"); + + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(24425L)) + .needPermissionRelation(true) + .build()); + Assertions.assertEquals(roles.size(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().size(), 10); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getFeatureId(), 153L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getFeatureType(), 2); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(0).getTags().contains(RolePermissionTagEnum.JOINED)); + + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(1).getFeatureId(), 466L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(1).getFeatureType(), 2); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(1).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(1).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(1).getTags().contains(RolePermissionTagEnum.JOINED)); + + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(2).getFeatureId(), 467L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(2).getFeatureType(), 2); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(2).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(2).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(2).getTags().contains(RolePermissionTagEnum.JOINED)); + + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(3).getFeatureId(), 469L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(3).getFeatureType(), 2); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(3).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(3).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(3).getTags().contains(RolePermissionTagEnum.JOINED)); + + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(4).getFeatureId(), 693L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(4).getFeatureType(), 4); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(4).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(4).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(4).getTags().contains(RolePermissionTagEnum.JOINED)); + + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(5).getFeatureId(), 694L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(5).getFeatureType(), 0); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(5).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(5).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(5).getTags().contains(RolePermissionTagEnum.JOINED)); + + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(6).getFeatureId(), 695L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(6).getFeatureType(), 0); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(6).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(6).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(6).getTags().contains(RolePermissionTagEnum.JOINED)); + + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(7).getFeatureId(), 101996L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(7).getFeatureType(), 2); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(7).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(7).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(7).getTags().contains(RolePermissionTagEnum.JOINED)); + + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(8).getFeatureId(), 102055L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(8).getFeatureType(), 2); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(8).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(8).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(8).getTags().contains(RolePermissionTagEnum.JOINED)); + + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(9).getFeatureId(), 102056L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(9).getFeatureType(), 2); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(9).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(9).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(9).getTags().contains(RolePermissionTagEnum.JOINED)); + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(24425L)) + .needPermissionRelation(true) + .featureIds(Lists.newArrayList(153L)) + .build()); + Assertions.assertEquals(roles.size(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().size(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getFeatureId(), 153L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getFeatureType(), 2); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(0).getTags().contains(RolePermissionTagEnum.JOINED)); + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(24425L)) + .needPermissionRelation(true) + .type(OLD_FEATURE) + .build()); + Assertions.assertEquals(roles.size(), 1); + Assertions.assertNull(roles.get(0).getPermissionRelations()); + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(24425L)) + .needPermissionRelation(true) + .type(NEW_FEATURE) + .build()); + Assertions.assertEquals(roles.size(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().size(), 10); + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(24425L)) + .needPermissionRelation(true) + .type(NEW_FEATURE) + .featureResourceTypes(Lists.newArrayList(FeatureResourceType.COMPONENT)) + .build()); + Assertions.assertEquals(roles.size(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().size(), 1); + + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getFeatureId(), 693L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getFeatureType(), 4); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(0).getTags().contains(RolePermissionTagEnum.JOINED)); + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(24425L)) + .needPermissionRelation(true) + .type(NEW_FEATURE) + .terminal("NT_OMS_WEB") + .build()); + Assertions.assertEquals(roles.size(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().size(), 4); + + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getFeatureId(), 153L); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getFeatureType(), 2); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getType(), 1); + Assertions.assertEquals(roles.get(0).getPermissionRelations().get(0).getTags().size(), 1); + Assertions.assertTrue(roles.get(0).getPermissionRelations().get(0).getTags().contains(RolePermissionTagEnum.JOINED)); } @Test diff --git a/tyr-server/src/test/resources/mysql/RoleControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleControllerTest.sql new file mode 100644 index 00000000..b7300130 --- /dev/null +++ b/tyr-server/src/test/resources/mysql/RoleControllerTest.sql @@ -0,0 +1,93 @@ +#-->DEFAULT +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (24425, '项目经理', '', 'init', 'oms:project_manager', -1, -1, 6, 6, 0, '2023-09-19 15:22:55', '2024-08-13 10:25:25', 2003043, 2003028, 1, 65535, 0, null, 0, '', 1, 2, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (25324, '项目负责人', '', 'init', 'cms:mafb_project_commissioner', -1, -1, 5, 2, 0, '2023-10-23 17:49:59', '2024-08-13 10:25:40', -1, 9000399985, 1, 65535, 0, null, 0, '', 1, 1, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (25326, '商务副经理', '', 'init', 'cms:mafb_business_vice_officer', -1, -1, 5, 2, 0, '2023-10-23 17:50:00', '2024-08-13 10:25:41', -1, 2006333, 1, 65535, 0, null, 0, '', 1, 2, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (25327, '生产副经理', '', 'init', 'cms:mafb_productivity_vice_officer', -1, -1, 5, 2, 0, '2023-10-23 17:50:00', '2024-08-13 10:25:41', -1, 2006333, 1, 65535, 0, null, 0, '', 1, 3, 1); + + +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (12, 24425, 6, 0, '2023-09-19 15:22:55', '2023-09-19 15:22:55'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (23, 25324, 13, 0, '2023-10-23 17:49:59', '2023-10-23 17:49:58'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (25, 25326, 13, 0, '2023-10-23 17:50:00', '2023-10-23 17:49:59'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (26, 25327, 13, 0, '2023-10-23 17:50:00', '2023-10-23 17:49:59'); + +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at) +VALUES (6, '6', '6', '研发中心', -1, -1, 0, 3, 'A1', '', 0, '2023-09-19 14:31:19', '2024-05-29 09:33:24'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at) +VALUES (13, '2', '5', '专业分包', -1, -1, 0, 1, 'A2', '', 0, '2023-10-23 17:49:59', '2024-08-15 18:39:13'); + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101100, '超级管理员', '超级管理员', 'super_admin', 'ou_superadmin', 0, 0, 7, 1, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101101, '超级管理员', '超级管理员', 'super_admin', 'pro_superadmin', 0, 0, 1, 2, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101102, '超级管理员', '超级管理员', 'super_admin', 'oms_superadmin', 0, 0, 6, 6, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101103, '超级管理员', '超级管理员', 'super_admin', 'zw_superadmin', 0, 0, 3, 3, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (3416, '自定义', '', 'common', '', 3, 4, 1, 2, 0, '2022-10-19 15:52:33', '2024-09-29 17:16:27', 0, 0, 65535, 65535, 0, 0, 0, '', 1, 0, 1); + +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) +VALUES (549, 101100, 18, 0, '2024-09-25 21:47:42', '2024-09-25 21:47:42'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) +VALUES (550, 101101, 14, 0, '2024-09-25 21:47:42', '2024-09-25 21:47:42'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) +VALUES (551, 101102, 57, 0, '2024-09-25 21:47:42', '2024-09-25 21:47:42'); + +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (14, '2', '1', '总包单位', -1, -1, 0, 1, '', '', 0, '2023-10-23 17:50:04', '2024-09-10 10:18:44', '14,'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (18, '1', '7', '企业通用', -1, -1, 0, 4, '', '', 0, '2023-10-23 17:50:15', '2024-09-10 10:18:44', '18,'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (57, '6', '6', 'OMS超管组', -1, -1, 0, 9, 'omsSuperAdminGroup', '', 0, '2024-04-17 11:38:28', '2024-09-10 10:18:45', '57,'); + +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (197519, 28801, 3414, 3, 24510, 3, 4, 0, 0, 0, '2024-01-18 16:36:16', '2024-09-29 17:16:39', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (183677, 40, 3415, 3, 2232, 8, 1, 0, 0, 0, '2023-10-06 15:13:35', '2024-09-29 17:16:39', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (1158315, 28801, 101100, 3, 24510, 3, 4, 0, 0, 0, '2024-09-29 16:33:31', '2024-09-29 16:33:31', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (1157571, 40, 101101, 3, 2232, 8, 1, 0, 0, 0, '2024-09-27 09:39:49', '2024-09-27 09:39:48', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (197520, 28802, 24425, 3, 24511, 3, 4, 0, 0, 0, '2024-01-18 16:36:16', '2024-09-29 17:16:39', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (1157572, 40, 101101, 3, 2232, 3, 4, 0, 0, 0, '2024-09-27 09:39:49', '2024-09-27 09:39:48', 0, 0, 2); + +INSERT INTO saas_pgroup_role_relation (id, role_id, group_id, is_delete, create_at, update_at, create_by, update_by) +VALUES (2193533, 24425, 862, 0, '2023-09-19 15:22:55', '2024-04-16 18:48:04', 2003043, 2003043); + +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (60976, 862, 466, 0, '2024-05-08 11:00:16', '2024-11-09 08:51:59', 9000243, 0, 1, 2, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (60987, 862, 467, 0, '2024-05-08 11:01:06', '2024-11-09 08:51:59', 9000243, 0, 1, 2, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (61155, 862, 469, 0, '2024-05-09 10:45:38', '2024-11-09 08:51:59', 9000243, 0, 1, 2, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (67190, 862, 693, 0, '2024-06-07 14:34:38', '2024-11-09 08:51:59', 25923, 0, 1, 4, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (67198, 862, 694, 0, '2024-06-07 14:34:42', '2024-11-09 08:51:59', 25923, 0, 1, 0, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (67206, 862, 695, 0, '2024-06-07 14:34:47', '2024-11-09 08:51:59', 25923, 0, 1, 0, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5202137, 862, 153, 0, '2024-09-15 00:08:51', '2024-12-03 11:43:43', 9000404098, 9000400021, 1, 2, 'NT_OMS_WEB', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5212591, 862, 101996, 0, '2024-09-29 14:58:57', '2024-11-09 08:51:59', 89601, 0, 1, 2, 'NT_OMS_WEB', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5213026, 862, 102055, 0, '2024-09-30 16:32:35', '2024-11-09 08:51:59', 25923, 0, 1, 2, 'NT_OMS_WEB', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5213035, 862, 102056, 0, '2024-09-30 16:32:35', '2024-11-09 08:51:59', 25923, 0, 1, 2, 'NT_OMS_WEB', '["JOINED"]'); + +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (153, 'oms:menu_page', '菜单管理', 2, 'NT_OMS_WEB', 0, 72, '528,72,153,', 0, '0', 0, 'oms:menu_page', 0, 1, '', 1, '/home/menuManage', 1, '', 1, 0, '{"moreIcon": "", "activeIcon": "", "terminalType": "", "terminalBizType": ""}', 1, 0, '2024-04-24 17:09:38', '2024-12-05 17:45:21', 59926, 9000400021, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (466, 'oms:imConfig_page', 'IM配置(新版)', 2, 'NT_OMS_WEB', 0, 80, '528,80,466,', 0, '0', 0, 'oms:imConfig_page', 6, 0, '', 1, '/msgCenter/IMConfig', 1, ' ', 1, 0, '{"moreIcon": "", "activeIcon": ""}', 1, 0, '2024-05-08 11:00:11', '2024-12-05 17:45:22', 9000243, 9000399676, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (467, 'oms:im_robot_page', 'IM机器人(新版)', 2, 'NT_OMS_WEB', 0, 80, '528,80,467,', 0, '0', 0, 'oms:im_robot_page', 7, 0, '', 1, '/msgCenter/IMRobot', 1, ' ', 1, 0, '{"moreIcon": "", "activeIcon": ""}', 1, 0, '2024-05-08 11:01:03', '2024-12-05 17:45:22', 9000243, 9000399676, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (469, 'oms:msgPush_page', '消息推送(新版)', 2, 'NT_OMS_WEB', 0, 76, '528,76,469,', 0, '', 0, 'oms:msgPush_page', 10, 1, '', 1, '/operationsManagement/msgPush', 1, ' ', 1, 0, null, 1, 0, '2024-05-09 10:45:35', '2024-12-05 17:45:22', 9000243, 9000243, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (693, 'oms:detail_backPay_btn', '查看投诉详情', 4, 'NT_OMS_WEB', 1, 612, '528,611,612,693,', 0, '', 0, 'oms:detail_backPay_btn', 0, 1, '', 1, '/home/complain-manage/backPayDetail', 1, ' ', 1, 0, null, 1, 1, '2024-06-07 10:55:16', '2024-12-05 17:45:22', 9000399478, 9000398292, 0); + + +#-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleServiceTest.sql b/tyr-server/src/test/resources/mysql/RoleServiceTest.sql index d8fcff43..ca2014f1 100644 --- a/tyr-server/src/test/resources/mysql/RoleServiceTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleServiceTest.sql @@ -58,4 +58,40 @@ VALUES (197520, 28802, 24425, 3, 24511, 3, 4, 0, 0, 0, '2024-01-18 16:36:16', '2 INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) VALUES (1157572, 40, 101101, 3, 2232, 3, 4, 0, 0, 0, '2024-09-27 09:39:49', '2024-09-27 09:39:48', 0, 0, 2); + +INSERT INTO saas_pgroup_role_relation (id, role_id, group_id, is_delete, create_at, update_at, create_by, update_by) +VALUES (2193533, 24425, 862, 0, '2023-09-19 15:22:55', '2024-04-16 18:48:04', 2003043, 2003043); + +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (60976, 862, 466, 0, '2024-05-08 11:00:16', '2024-11-09 08:51:59', 9000243, 0, 1, 2, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (60987, 862, 467, 0, '2024-05-08 11:01:06', '2024-11-09 08:51:59', 9000243, 0, 1, 2, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (61155, 862, 469, 0, '2024-05-09 10:45:38', '2024-11-09 08:51:59', 9000243, 0, 1, 2, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (67190, 862, 693, 0, '2024-06-07 14:34:38', '2024-11-09 08:51:59', 25923, 0, 1, 4, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (67198, 862, 694, 0, '2024-06-07 14:34:42', '2024-11-09 08:51:59', 25923, 0, 1, 0, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (67206, 862, 695, 0, '2024-06-07 14:34:47', '2024-11-09 08:51:59', 25923, 0, 1, 0, '', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5202137, 862, 153, 0, '2024-09-15 00:08:51', '2024-12-03 11:43:43', 9000404098, 9000400021, 1, 2, 'NT_OMS_WEB', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5212591, 862, 101996, 0, '2024-09-29 14:58:57', '2024-11-09 08:51:59', 89601, 0, 1, 2, 'NT_OMS_WEB', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5213026, 862, 102055, 0, '2024-09-30 16:32:35', '2024-11-09 08:51:59', 25923, 0, 1, 2, 'NT_OMS_WEB', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5213035, 862, 102056, 0, '2024-09-30 16:32:35', '2024-11-09 08:51:59', 25923, 0, 1, 2, 'NT_OMS_WEB', '["JOINED"]'); + +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (153, 'oms:menu_page', '菜单管理', 2, 'NT_OMS_WEB', 0, 72, '528,72,153,', 0, '0', 0, 'oms:menu_page', 0, 1, '', 1, '/home/menuManage', 1, '', 1, 0, '{"moreIcon": "", "activeIcon": "", "terminalType": "", "terminalBizType": ""}', 1, 0, '2024-04-24 17:09:38', '2024-12-05 17:45:21', 59926, 9000400021, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (466, 'oms:imConfig_page', 'IM配置(新版)', 2, 'NT_OMS_WEB', 0, 80, '528,80,466,', 0, '0', 0, 'oms:imConfig_page', 6, 0, '', 1, '/msgCenter/IMConfig', 1, ' ', 1, 0, '{"moreIcon": "", "activeIcon": ""}', 1, 0, '2024-05-08 11:00:11', '2024-12-05 17:45:22', 9000243, 9000399676, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (467, 'oms:im_robot_page', 'IM机器人(新版)', 2, 'NT_OMS_WEB', 0, 80, '528,80,467,', 0, '0', 0, 'oms:im_robot_page', 7, 0, '', 1, '/msgCenter/IMRobot', 1, ' ', 1, 0, '{"moreIcon": "", "activeIcon": ""}', 1, 0, '2024-05-08 11:01:03', '2024-12-05 17:45:22', 9000243, 9000399676, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (469, 'oms:msgPush_page', '消息推送(新版)', 2, 'NT_OMS_WEB', 0, 76, '528,76,469,', 0, '', 0, 'oms:msgPush_page', 10, 1, '', 1, '/operationsManagement/msgPush', 1, ' ', 1, 0, null, 1, 0, '2024-05-09 10:45:35', '2024-12-05 17:45:22', 9000243, 9000243, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (693, 'oms:detail_backPay_btn', '查看投诉详情', 4, 'NT_OMS_WEB', 1, 612, '528,611,612,693,', 0, '', 0, 'oms:detail_backPay_btn', 0, 1, '', 1, '/home/complain-manage/backPayDetail', 1, ' ', 1, 0, null, 1, 1, '2024-06-07 10:55:16', '2024-12-05 17:45:22', 9000399478, 9000398292, 0); + #-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/schema.sql b/tyr-server/src/test/resources/mysql/schema.sql index 0fb0388c..08089ce3 100644 --- a/tyr-server/src/test/resources/mysql/schema.sql +++ b/tyr-server/src/test/resources/mysql/schema.sql @@ -347,3 +347,7 @@ alter table saas_page_element add column `update_by` bigint DEFAULT NULL COMMENT alter table saas_feature_resource modify column feature_code varchar(100) not null comment '资源编码-权限码'; alter table saas_feature_resource modify column uni_code varchar(100) default '' not null comment '唯一编码,用于pre环境菜单同步'; + + +-- alter table saas_pgroup_permission_relation add column `tags` json DEFAULT null COMMENT '标签'; +alter table saas_pgroup_permission_relation add column `tags` VARCHAR(2048) NOT NULL DEFAULT '{}' COMMENT '标签'; From d31cfc503ddbf9f9cfac5f65d0ee2b87cab3e56f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Mon, 9 Dec 2024 10:35:18 +0800 Subject: [PATCH 03/25] =?UTF-8?q?feat:(REQ-3282)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/feign/req/PageRoleReq.java | 14 +++- .../server/controller/v2/RoleController.java | 30 ++++---- .../server/service/impl/RoleServiceImpl.java | 2 +- .../controller/v2/RoleControllerTest.java | 72 +++++++++++++++---- 4 files changed, 87 insertions(+), 31 deletions(-) diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java index 2cd59c8a..6cfd6478 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java @@ -1,9 +1,8 @@ package cn.axzo.tyr.feign.req; -import cn.axzo.foundation.page.PageReq; +import cn.axzo.tyr.feign.enums.FeatureResourceTypeEnum; import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; -import cn.axzo.tyr.feign.enums.FeatureResourceTypeEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -16,7 +15,16 @@ import java.util.Set; @Builder @NoArgsConstructor @AllArgsConstructor -public class PageRoleReq extends PageReq { +public class PageRoleReq { + + private Integer page; + + private Integer pageSize; + + /** + * 排序:使用示例,createTime__DESC + */ + private List sort; /** * 角色id diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java index 65b9ad87..9b114598 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java @@ -17,6 +17,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -85,20 +86,23 @@ public class RoleController implements RoleApi { RoleResp result = RoleResp.builder().build(); BeanUtils.copyProperties(saasRoleRes, result); - result.setRoleFeatureResources(saasRoleRes.getSaasPermissions().stream() - .map(permission -> { - RoleFeatureResourceResp roleFeatureResourceResp = RoleFeatureResourceResp.builder().build(); - BeanUtils.copyProperties(permission, roleFeatureResourceResp); + if (Objects.nonNull(saasRoleRes.getSaasPermissions())) { + result.setRoleFeatureResources(saasRoleRes.getSaasPermissions().stream() + .map(permission -> { + RoleFeatureResourceResp roleFeatureResourceResp = RoleFeatureResourceResp.builder().build(); + BeanUtils.copyProperties(permission, roleFeatureResourceResp); // roleFeatureResourceResp.setUniCode(); - roleFeatureResourceResp.setTags(Optional.ofNullable(permission.getTags()) - .map(tags -> tags.stream() - .map(RolePermissionTagEnum::getDesc) - .collect(Collectors.toSet()) - ) - .orElse(null)); - return roleFeatureResourceResp; - }) - .collect(Collectors.toList())); + roleFeatureResourceResp.setTags(Optional.ofNullable(permission.getTags()) + .map(tags -> tags.stream() + .map(RolePermissionTagEnum::getDesc) + .collect(Collectors.toSet()) + ) + .orElse(null)); + return roleFeatureResourceResp; + }) + .collect(Collectors.toList())); + } + return result; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 5494e4ab..2a1f3d28 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -1455,7 +1455,7 @@ public class RoleServiceImpl extends ServiceImpl Map> saasRoleUsers = listSaasRoleUser(param, page.getRecords()); Map> permissionRelations = listRolePermissionRelations(param, page.getRecords()); -ºº + return PageConverter.toResp(page, (record) -> from(record, saasRoleGroups, BooleanUtils.isTrue(param.getNeedPermissionOld()) ? saasPermissionsOld : saasPermissions, diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java index 617f5a81..4ff715d5 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java @@ -2,6 +2,7 @@ package cn.axzo.tyr.server.controller.v2; import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; import cn.axzo.tyr.feign.req.PageRoleReq; import cn.axzo.tyr.feign.resp.RoleResp; @@ -30,87 +31,130 @@ class RoleControllerTest extends BaseTest { } @Test void list() { - List roleResps = roleController.list(PageRoleReq.builder() + List roleResps = roleController.page(PageRoleReq.builder() .roleIds(Sets.newHashSet(24425L)) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 1); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .workspaceType(6) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 2); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .isDisplay(true) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 9); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .roleCode("oms:project_manager") .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 1); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .workspaceIds(Sets.newHashSet(3L, 0L)) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 5); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .ouIds(Sets.newHashSet(4L, 0L)) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 5); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .enabled(true) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 9); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .roleTypes(Sets.newHashSet(RoleTypeEnum.SUPER_ADMIN)) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 4); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .workspaceOuPairs(Lists.newArrayList(PageRoleReq.WorkspaceOuPair.builder() .workspaceId(3L) .ouId(4L) .build())) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 1); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .roleCodes(Sets.newHashSet("ou_superadmin")) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 1); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .roleGroupCodes(Sets.newHashSet("omsSuperAdminGroup")) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 1); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .cooperateShipTypes(Sets.newHashSet(1)) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 2); - roleResps = roleController.list(PageRoleReq.builder() + roleResps = roleController.page(PageRoleReq.builder() .roleIds(Sets.newHashSet(24425L)) .needFeatureResources(true) .build()) + .getData() .getData(); Assertions.assertEquals(roleResps.size(), 1); - Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().size(), 10); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().size(), 5); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getId(), 153L); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getUniCode(), "oms:menu_page"); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getTags().size(), 1); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(0).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getTerminal(), "NT_OMS_WEB"); + + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getId(), 466L); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getUniCode(), "oms:imConfig_page"); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getTags().size(), 1); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(1).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getTerminal(), "NT_OMS_WEB"); + + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getId(), 467L); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getUniCode(), "oms:im_robot_page"); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getTags().size(), 1); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(2).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getTerminal(), "NT_OMS_WEB"); + + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getId(), 469L); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getUniCode(), "oms:msgPush_page"); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getTags().size(), 1); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(3).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getTerminal(), "NT_OMS_WEB"); + + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getId(), 693L); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getUniCode(), "oms:detail_backPay_btn"); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getTags().size(), 1); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(4).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getTerminal(), "NT_OMS_WEB"); + } } \ No newline at end of file From 07256a629f24e72b31c63876a5b08411cbf62651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Tue, 10 Dec 2024 14:42:11 +0800 Subject: [PATCH 04/25] =?UTF-8?q?feat:(REQ-3282)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=A7=92=E8=89=B2page=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/model/res/SaasRoleGroupDTO.java | 5 + .../client/model/res/SaasRoleGroupRes.java | 17 ++ .../cn/axzo/tyr/feign/req/PageRoleReq.java | 6 +- .../resp/FeatureResourceRelationResp.java | 38 +++++ .../feign/resp/RoleFeatureResourceResp.java | 1 + .../cn/axzo/tyr/feign/resp/RoleGroupResp.java | 66 ++++++++ .../java/cn/axzo/tyr/feign/resp/RoleResp.java | 9 +- .../cn/axzo/tyr/feign/resp/RoleUserResp.java | 30 +++- .../common/constants/PermissionConstant.java | 5 + .../config/exception/BizResultCode.java | 2 +- .../server/controller/v2/RoleController.java | 126 +++++++++++++-- .../server/service/SaasRoleGroupService.java | 4 + .../server/service/impl/RoleServiceImpl.java | 22 +-- .../controller/v2/RoleControllerTest.java | 150 +++++++++++++++++- .../resources/mysql/RoleControllerTest.sql | 8 +- 15 files changed, 445 insertions(+), 44 deletions(-) create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/resp/FeatureResourceRelationResp.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupDTO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupDTO.java index a92902ac..79c50c0c 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupDTO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupDTO.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; import java.util.List; @Data @@ -65,6 +66,10 @@ public class SaasRoleGroupDTO { */ private String path; + private Date createAt; + + private Date updateAt; + /** * 角色信息 */ diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupRes.java index e3d616de..2c774e94 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupRes.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/SaasRoleGroupRes.java @@ -5,6 +5,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; + @Data @Builder @NoArgsConstructor @@ -57,4 +59,19 @@ public class SaasRoleGroupRes { * 上级分组id */ private Long parentId; + + /** + * 层级path + */ + private String path; + + /** + * 添加时间 + */ + private Date createAt; + + /** + * 更新时间 + */ + private Date updateAt; } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java index 6cfd6478..6cbcd57a 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java @@ -114,8 +114,10 @@ public class PageRoleReq { */ private Boolean needRoleUser; - - private Boolean needPermissionRelation; + /** + * 是否需要角色跟菜单组件的关联关系,不查询具体的菜单组件信息 + */ + private Boolean needFeatureResourceRelation; /** * 是否需要预设角色,因为预设角色的workspaceId和ouId为-1 diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/FeatureResourceRelationResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/FeatureResourceRelationResp.java new file mode 100644 index 00000000..8c6fe6cb --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/FeatureResourceRelationResp.java @@ -0,0 +1,38 @@ +package cn.axzo.tyr.feign.resp; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FeatureResourceRelationResp { + + /** + * 菜单资源树节点id + */ + private Long featureId; + + /** + * 新旧菜单资源数标识 + */ + private Integer type; + + /** + * 菜单资源树节点类型 + */ + private Integer featureType; + + /** + * 权限点标签: + * 在职:JOINED + * 离场:LEAVE + * @see cn.axzo.tyr.feign.enums.RolePermissionTagEnum + */ + private Set tags; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleFeatureResourceResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleFeatureResourceResp.java index 0d11e862..c1d07259 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleFeatureResourceResp.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleFeatureResourceResp.java @@ -30,6 +30,7 @@ public class RoleFeatureResourceResp { /** * 菜单组件的权限标签 + * @see cn.axzo.tyr.feign.enums.RolePermissionTagEnum */ private Set tags; } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java index 597ee1ce..d39b20de 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java @@ -5,6 +5,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; + @Data @Builder @NoArgsConstructor @@ -12,4 +14,68 @@ import lombok.NoArgsConstructor; public class RoleGroupResp { private Long id; + + /** + * 租户类型: + * @see cn.axzo.apollo.workspace.common.enums.WorkspaceTypeEnum + */ + private Integer workspaceType; + + /** + * 协同关系类型 + * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组 + * 政务的就是-1 + * @see cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum + */ + private Integer cooperateShipType; + + /** + * 名称 + */ + private String name; + + /** + * 所属工作台id + */ + private Long workspaceId; + + /** + * 所属单位id + */ + private Long ouId; + + /** + * 上级分组id + */ + private Long parentId; + + /** + * 层级path + */ + private String path; + + /** + * 排序 + */ + private Integer sort; + + /** + * 分组CODE + */ + private String code; + + /** + * 分类CODE, 用于代班长,小组长的权限分类。 + */ + private String categoryCode; + + /** + * 添加时间 + */ + private Date createAt; + + /** + * 更新时间 + */ + private Date updateAt; } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java index 3c98599b..a00fe311 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleResp.java @@ -1,5 +1,6 @@ package cn.axzo.tyr.feign.resp; +import cn.axzo.tyr.feign.enums.RoleTypeEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -36,7 +37,7 @@ public class RoleResp { /** * 角色类型:common 普通角色 super_admin超级管理员(禁止删除) admin子管理员(禁止删除) init初始化内置角色 - * @See cn.axzo.tyr.model.enums.RoleTypeEnum + * @see cn.axzo.tyr.feign.enums.RoleTypeEnum */ private String roleType; @@ -53,6 +54,7 @@ public class RoleResp { /** * 协同关系类型 * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组 + * @see cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum */ private Integer cooperateShipType; @@ -104,4 +106,9 @@ public class RoleResp { * 角色对应的人员信息 */ private List roleUsers; + + /** + * 角色关联的菜单组件信息:只有相关的关联信息,比roleFeatureResources少很多信息 + */ + private List featureResourceRelations; } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java index fcc92ebb..68064a29 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java @@ -11,5 +11,33 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class RoleUserResp { - private Long id; + /** + * 身份Id + */ + private Long identityId; + + /** + * 身份类型 1:工人 2:从业人员 3:班组长 4:运营人员 5:政务人员 + */ + private Integer identityType; + + /** + * 用户personId + */ + private Long personId; + + /** + * 用户名字 + */ + private String realName; + + /** + * 所属单位Id 用户在当前工作台的所属单位 + */ + private Long ouId; + + /** + * 工作台Id + */ + private Long workspaceId; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/common/constants/PermissionConstant.java b/tyr-server/src/main/java/cn/axzo/tyr/server/common/constants/PermissionConstant.java index 077c006a..f3c6be81 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/common/constants/PermissionConstant.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/common/constants/PermissionConstant.java @@ -18,4 +18,9 @@ public class PermissionConstant { public static final String FEATURE_TOP_PATH = "/0/"; /** 权限点business_no前缀 **/ public static final String FEATURE_BIZ_NO_PREFIX = "feature"; + + /** + * 分页查询最大PAGE_SIZE + */ + public static final Integer MAX_PAGE_SIZE = 1000; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java index f0364423..f88146c4 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java @@ -31,7 +31,7 @@ public enum BizResultCode implements IResultCode { TERMINAL_EXIST("100021", "新端已经存在:{}"), TERMINAL_NOT_FOUND("100022", "原端不存在:{}"), FEATURE_CODE_OVER_LENGTH("100023", "组件code不能超过100个字符:{}"), - MAX_PAGE_SIZE_ERROR("100024", "最大查询"); + MAX_PAGE_SIZE_ERROR("100024", "最大PAGE_SIZE不能超过1000"); private String errorCode; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java index 9b114598..695b9c10 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java @@ -1,18 +1,25 @@ package cn.axzo.tyr.server.controller.v2; +import cn.axzo.foundation.exception.Axssert; import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; import cn.axzo.tyr.client.model.res.SaasRoleRes; import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.feign.api.RoleApi; import cn.axzo.tyr.feign.enums.RoleTypeEnum; import cn.axzo.tyr.feign.req.PageRoleReq; +import cn.axzo.tyr.feign.resp.FeatureResourceRelationResp; import cn.axzo.tyr.feign.resp.RoleFeatureResourceResp; +import cn.axzo.tyr.feign.resp.RoleGroupResp; import cn.axzo.tyr.feign.resp.RoleResp; +import cn.axzo.tyr.feign.resp.RoleUserResp; import cn.axzo.tyr.server.service.RoleService; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; @@ -21,6 +28,9 @@ import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; +import static cn.axzo.tyr.server.common.constants.PermissionConstant.MAX_PAGE_SIZE; +import static cn.axzo.tyr.server.config.exception.BizResultCode.MAX_PAGE_SIZE_ERROR; + @Slf4j @RestController public class RoleController implements RoleApi { @@ -79,34 +89,118 @@ public class RoleController implements RoleApi { result.setProductUnitTypes(req.getCooperateShipTypes()); result.setNeedPermission(req.getNeedFeatureResources()); + + result.setNeedPermissionRelation(req.getNeedFeatureResourceRelation()); + + result.setFeatureResourceTypes(Optional.ofNullable(req.getFeatureResourceTypes()) + .map(e -> e.stream() + .map(f -> FeatureResourceType.valueOf(f.name())) + .collect(Collectors.toList())) + .orElse(null)); return result; } + private void assembleRoleFeatureResource(SaasRoleRes saasRoleRes, RoleResp roleResp) { + if (CollectionUtils.isEmpty(saasRoleRes.getSaasPermissions())) { + return; + } + + roleResp.setRoleFeatureResources(saasRoleRes.getSaasPermissions().stream() + .map(permission -> { + RoleFeatureResourceResp roleFeatureResourceResp = RoleFeatureResourceResp.builder().build(); + BeanUtils.copyProperties(permission, roleFeatureResourceResp); + roleFeatureResourceResp.setTags(Optional.ofNullable(permission.getTags()) + .map(tags -> tags.stream() + .map(RolePermissionTagEnum::getDesc) + .collect(Collectors.toSet()) + ) + .orElse(null)); + return roleFeatureResourceResp; + }) + .collect(Collectors.toList())); + } + + private void assembleRoleGroup(SaasRoleRes saasRoleRes, RoleResp roleResp) { + if (CollectionUtils.isEmpty(saasRoleRes.getSaasRoleGroups())) { + return; + } + roleResp.setRoleGroup(saasRoleRes.getSaasRoleGroups().stream() + .map(roleGroup -> { + RoleGroupResp roleGroupResp = RoleGroupResp.builder().build(); + BeanUtils.copyProperties(roleGroup, roleGroupResp); + + if (StringUtils.isNotBlank(roleGroup.getWorkspaceTypeCode())) { + roleGroupResp.setWorkspaceType(Integer.valueOf(roleGroup.getWorkspaceTypeCode())); + } + + // 因为角色分组页面可以选择多个,会逗号隔开,但是是不允许这样的数据出现的,为了兼容不报错,如果有逗号就取第一个返回 + if (StringUtils.isNotBlank(roleGroup.getOuTypeCode())) { + if (roleGroup.getOuTypeCode().contains(",")) { + roleGroupResp.setCooperateShipType(Integer.valueOf(roleGroup.getOuTypeCode().split(",")[0])); + } else { + roleGroupResp.setCooperateShipType(Integer.valueOf(roleGroup.getOuTypeCode())); + } + } + return roleGroupResp; + }) + .findFirst() + .orElse(null)); + } + + private void assembleRoleUser(SaasRoleRes saasRoleRes, RoleResp roleResp) { + + if (CollectionUtils.isEmpty(saasRoleRes.getSaasRoleUsers())) { + return; + } + + roleResp.setRoleUsers(saasRoleRes.getSaasRoleUsers().stream() + .map(saasRoleUser -> { + RoleUserResp roleUserResp = RoleUserResp.builder().build(); + BeanUtils.copyProperties(saasRoleUser, roleUserResp); + return roleUserResp; + }) + .collect(Collectors.toList())); + } + + private void assembleFeatureResourceRelation(SaasRoleRes saasRoleRes, RoleResp roleResp) { + + if (CollectionUtils.isEmpty(saasRoleRes.getPermissionRelations())) { + return; + } + + roleResp.setFeatureResourceRelations(saasRoleRes.getPermissionRelations().stream() + .map(saasPermissionRelationRes -> { + FeatureResourceRelationResp featureResourceRelationResp = FeatureResourceRelationResp.builder().build(); + BeanUtils.copyProperties(saasPermissionRelationRes, featureResourceRelationResp); + featureResourceRelationResp.setTags(Optional.ofNullable(saasPermissionRelationRes.getTags()) + .map(tags -> tags.stream() + .map(RolePermissionTagEnum::getDesc) + .collect(Collectors.toSet()) + ) + .orElse(null)); + return featureResourceRelationResp; + }) + .collect(Collectors.toList())); + } + private RoleResp from(SaasRoleRes saasRoleRes) { RoleResp result = RoleResp.builder().build(); BeanUtils.copyProperties(saasRoleRes, result); - if (Objects.nonNull(saasRoleRes.getSaasPermissions())) { - result.setRoleFeatureResources(saasRoleRes.getSaasPermissions().stream() - .map(permission -> { - RoleFeatureResourceResp roleFeatureResourceResp = RoleFeatureResourceResp.builder().build(); - BeanUtils.copyProperties(permission, roleFeatureResourceResp); -// roleFeatureResourceResp.setUniCode(); - roleFeatureResourceResp.setTags(Optional.ofNullable(permission.getTags()) - .map(tags -> tags.stream() - .map(RolePermissionTagEnum::getDesc) - .collect(Collectors.toSet()) - ) - .orElse(null)); - return roleFeatureResourceResp; - }) - .collect(Collectors.toList())); - } + assembleRoleFeatureResource(saasRoleRes, result); + assembleRoleGroup(saasRoleRes, result); + + assembleRoleUser(saasRoleRes, result); + + assembleFeatureResourceRelation(saasRoleRes, result); return result; } private void check(PageRoleReq req) { + if (Objects.nonNull(req.getPageSize())) { + Axssert.check(MAX_PAGE_SIZE >= req.getPageSize() , MAX_PAGE_SIZE_ERROR); + } } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java index 36958eb8..4523cdbc 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java @@ -19,6 +19,7 @@ import java.util.List; */ public interface SaasRoleGroupService extends IService { + @Deprecated List getList(QuerySaasRoleGroupReq req); /** @@ -26,6 +27,7 @@ public interface SaasRoleGroupService extends IService { * @param req 角色分组参数 * @return 角色分组列表 */ + @Deprecated List getRoleGroupList(QuerySaasRoleGroupReq req); @@ -40,6 +42,7 @@ public interface SaasRoleGroupService extends IService { * @param categoryCode * @return */ + @Deprecated List listByCategoryCode(List categoryCode); /** @@ -47,6 +50,7 @@ public interface SaasRoleGroupService extends IService { * @param codes 角色组编码 * @param type 1-仅查当前code 2-对应code角色组及子级角色组 3-仅对应code角色组的子级 * **/ + @Deprecated List listByCodes(List codes, int type); List list(ListSaasRoleGroupParam param); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 2a1f3d28..3631331c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -1621,31 +1621,31 @@ public class RoleServiceImpl extends ServiceImpl return Collections.emptyMap(); } - List roleGroupRelations = saasRoleGroupRelationDao.lambdaQuery() - .in(SaasRoleGroupRelation::getRoleId, Lists.transform(saasRoles, SaasRole::getId)) - .eq(SaasRoleGroupRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value) - .list(); + List roleGroupRelations = saasRoleGroupRelationService.list(SaasRoleGroupRelationService.ListSaasRoleGroupRelationParam.builder() + .roleIds(Lists.transform(saasRoles, SaasRole::getId)) + .build()); if (CollectionUtils.isEmpty(roleGroupRelations)) { return Collections.emptyMap(); } - - Map saasRoleGroups = saasRoleGroupDao.query(QuerySaasRoleGroupReq.builder() - .ids(Lists.transform(roleGroupRelations, SaasRoleGroupRelation::getSaasRoleGroupId)) - .build()) + Map saasRoleGroups = saasRoleGroupService.list(ListSaasRoleGroupParam.builder() + .ids(roleGroupRelations.stream() + .map(SaasRoleGroupRelation::getSaasRoleGroupId) + .collect(Collectors.toSet())) + .build()) .stream() - .collect(Collectors.toMap(SaasRoleGroup::getId, Function.identity())); + .collect(Collectors.toMap(SaasRoleGroupDTO::getId, Function.identity())); return roleGroupRelations.stream() .filter(e -> saasRoleGroups.get(e.getSaasRoleGroupId()) != null) .collect(Collectors.groupingBy(SaasRoleGroupRelation::getRoleId, Collectors.mapping(e -> { - SaasRoleGroup saasRoleGroup = saasRoleGroups.get(e.getSaasRoleGroupId()); + SaasRoleGroupDTO saasRoleGroup = saasRoleGroups.get(e.getSaasRoleGroupId()); return toRoleGroupRes(saasRoleGroup); }, Collectors.toList()))); } - private SaasRoleGroupRes toRoleGroupRes(SaasRoleGroup saasRoleGroup) { + private SaasRoleGroupRes toRoleGroupRes(SaasRoleGroupDTO saasRoleGroup) { if (saasRoleGroup == null) { return null; } diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java index 4ff715d5..3f040b39 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java @@ -1,26 +1,44 @@ package cn.axzo.tyr.server.controller.v2; +import cn.axzo.apollo.core.web.Results; +import cn.axzo.apollo.workspace.api.workspace.req.GetSimpleWorkspaceReqV2; +import cn.axzo.apollo.workspace.api.workspace.res.SimpleWorkspaceRes; +import cn.axzo.basics.profiles.api.UserProfileServiceApi; +import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; +import cn.axzo.foundation.exception.BusinessException; import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; +import cn.axzo.tyr.feign.enums.FeatureResourceTypeEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; import cn.axzo.tyr.feign.req.PageRoleReq; import cn.axzo.tyr.feign.resp.RoleResp; +import cn.azxo.framework.common.model.CommonResponse; import com.google.common.collect.Sets; import org.assertj.core.util.Lists; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.List; +import static cn.axzo.tyr.server.config.exception.BizResultCode.MAX_PAGE_SIZE_ERROR; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + class RoleControllerTest extends BaseTest { + @Autowired private MysqlDataLoader mysqlDataLoader; @Autowired private RoleController roleController; + @Autowired + private UserProfileServiceApi userProfileServiceApi; @BeforeEach @Override @@ -29,11 +47,23 @@ class RoleControllerTest extends BaseTest { mysqlDataLoader.loadFromClassName(getClass().getSimpleName()); MockitoAnnotations.initMocks(this); } + @Test - void list() { + void page() { + + BusinessException businessException = assertThrows(BusinessException.class, ()->{ + roleController.page(PageRoleReq.builder() + .pageSize(1001) + .build()) + .getData() + .getData(); + }); + assertEquals(businessException.getErrorCode(), MAX_PAGE_SIZE_ERROR.getErrorCode()); + List roleResps = roleController.page(PageRoleReq.builder() - .roleIds(Sets.newHashSet(24425L)) - .build()) + .roleIds(Sets.newHashSet(24425L)) + .pageSize(1000) + .build()) .getData() .getData(); Assertions.assertEquals(roleResps.size(), 1); @@ -129,32 +159,136 @@ class RoleControllerTest extends BaseTest { Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getId(), 153L); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getUniCode(), "oms:menu_page"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getTags().size(), 1); - Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(0).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(0).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getTerminal(), "NT_OMS_WEB"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getId(), 466L); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getUniCode(), "oms:imConfig_page"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getTags().size(), 1); - Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(1).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(1).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getTerminal(), "NT_OMS_WEB"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getId(), 467L); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getUniCode(), "oms:im_robot_page"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getTags().size(), 1); - Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(2).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(2).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getTerminal(), "NT_OMS_WEB"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getId(), 469L); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getUniCode(), "oms:msgPush_page"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getTags().size(), 1); - Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(3).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(3).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getTerminal(), "NT_OMS_WEB"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getId(), 693L); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getUniCode(), "oms:detail_backPay_btn"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getTags().size(), 1); - Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(4).getTags().contains(RolePermissionTagEnum.JOINED)); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(4).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getTerminal(), "NT_OMS_WEB"); + + roleResps = roleController.page(PageRoleReq.builder() + .roleIds(Sets.newHashSet(24425L)) + .needRoleGroup(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(roleResps.size(), 1); + Assertions.assertNotNull(roleResps.get(0).getRoleGroup()); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getId(), 6); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getWorkspaceType(), 6); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getCooperateShipType(), 6); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getName(), "研发中心"); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getWorkspaceId(), -1); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getOuId(), -1); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getParentId(), 0); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getPath(), "6,"); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getSort(), 3); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getCode(), "A1"); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getCategoryCode(), "FF"); + Assertions.assertEquals(LocalDateTime.ofInstant(roleResps.get(0).getRoleGroup().getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2023, 9, 19, 14, 31, 19)); + Assertions.assertEquals(LocalDateTime.ofInstant(roleResps.get(0).getRoleGroup().getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 5, 29, 9, 33, 24)); + + roleResps = roleController.page(PageRoleReq.builder() + .roleIds(Sets.newHashSet(25324L)) + .needRoleGroup(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(roleResps.size(), 1); + Assertions.assertNotNull(roleResps.get(0).getRoleGroup()); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getId(), 13); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getWorkspaceType(), 2); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getCooperateShipType(), 5); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getName(), "专业分包"); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getWorkspaceId(), -1); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getOuId(), -1); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getParentId(), 0); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getPath(), "13,"); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getSort(), 1); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getCode(), "A2"); + Assertions.assertEquals(roleResps.get(0).getRoleGroup().getCategoryCode(), ""); + Assertions.assertEquals(LocalDateTime.ofInstant(roleResps.get(0).getRoleGroup().getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2023, 10, 23, 17, 49, 59)); + Assertions.assertEquals(LocalDateTime.ofInstant(roleResps.get(0).getRoleGroup().getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 8, 15, 18, 39, 13)); + + List personProfileDtos = Lists.newArrayList(); + PersonProfileDto personProfileDto = new PersonProfileDto(); + personProfileDto.setId(24511L); + personProfileDto.setRealName("测试名字"); + personProfileDtos.add(personProfileDto); + Mockito.when(userProfileServiceApi.postPersonProfiles(Mockito.any())) + .thenReturn(CommonResponse.success(personProfileDtos)); + + roleResps = roleController.page(PageRoleReq.builder() + .roleIds(Sets.newHashSet(24425L)) + .needRoleUser(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(roleResps.size(), 1); + Assertions.assertEquals(roleResps.get(0).getRoleUsers().size(), 1); + Assertions.assertEquals(roleResps.get(0).getRoleUsers().get(0).getPersonId(), 24511L); + Assertions.assertEquals(roleResps.get(0).getRoleUsers().get(0).getIdentityId(), 28802L); + Assertions.assertEquals(roleResps.get(0).getRoleUsers().get(0).getIdentityType(), 3); + Assertions.assertEquals(roleResps.get(0).getRoleUsers().get(0).getOuId(), 4L); + Assertions.assertEquals(roleResps.get(0).getRoleUsers().get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(roleResps.get(0).getRoleUsers().get(0).getRealName(), "测试名字"); + + roleResps = roleController.page(PageRoleReq.builder() + .roleIds(Sets.newHashSet(24425L)) + .needFeatureResourceRelation(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(roleResps.size(), 1); + Assertions.assertEquals(roleResps.get(0).getFeatureResourceRelations().size(), 10); + Assertions.assertEquals(roleResps.get(0).getFeatureResourceRelations().get(0).getFeatureId(), 153L); + Assertions.assertEquals(roleResps.get(0).getFeatureResourceRelations().get(0).getType(), 1); + Assertions.assertEquals(roleResps.get(0).getFeatureResourceRelations().get(0).getFeatureType(), 2); + Assertions.assertEquals(roleResps.get(0).getFeatureResourceRelations().get(0).getTags().size(), 1); + Assertions.assertTrue(roleResps.get(0).getFeatureResourceRelations().get(0).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); + + + roleResps = roleController.page(PageRoleReq.builder() + .roleIds(Sets.newHashSet(24425L)) + .needFeatureResourceRelation(true) + .featureResourceTypes(Lists.newArrayList(FeatureResourceTypeEnum.PAGE)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(roleResps.size(), 1); + Assertions.assertEquals(roleResps.get(0).getFeatureResourceRelations().size(), 7); + + roleResps = roleController.page(PageRoleReq.builder() + .needPresetRole(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(roleResps.size(), 4); + } } \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleControllerTest.sql index b7300130..6b635f28 100644 --- a/tyr-server/src/test/resources/mysql/RoleControllerTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleControllerTest.sql @@ -10,10 +10,10 @@ INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (25, 25326, 13, 0, '2023-10-23 17:50:00', '2023-10-23 17:49:59'); INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (26, 25327, 13, 0, '2023-10-23 17:50:00', '2023-10-23 17:49:59'); -INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at) -VALUES (6, '6', '6', '研发中心', -1, -1, 0, 3, 'A1', '', 0, '2023-09-19 14:31:19', '2024-05-29 09:33:24'); -INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at) -VALUES (13, '2', '5', '专业分包', -1, -1, 0, 1, 'A2', '', 0, '2023-10-23 17:49:59', '2024-08-15 18:39:13'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (6, '6', '6', '研发中心', -1, -1, 0, 3, 'A1', 'FF', 0, '2023-09-19 14:31:19', '2024-05-29 09:33:24', '6,'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (13, '2', '5,3,4', '专业分包', -1, -1, 0, 1, 'A2', '', 0, '2023-10-23 17:49:59', '2024-08-15 18:39:13', '13,'); INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (101100, '超级管理员', '超级管理员', 'super_admin', 'ou_superadmin', 0, 0, 7, 1, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); From 0a6670666aea6173b2cb3a5e9c5c30bd950b99f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Tue, 10 Dec 2024 15:49:40 +0800 Subject: [PATCH 05/25] =?UTF-8?q?feat:(REQ-3282)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E5=88=86=E7=BB=84=E7=9A=84page=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/req/ListSaasRoleGroupParam.java | 7 + .../java/cn/axzo/tyr/feign/api/RoleApi.java | 8 +- .../cn/axzo/tyr/feign/api/RoleGroupApi.java | 22 ++ .../axzo/tyr/feign/req/PageRoleGroupReq.java | 53 ++++ .../cn/axzo/tyr/feign/req/PageRoleReq.java | 5 + .../cn/axzo/tyr/feign/resp/RoleGroupResp.java | 6 + .../config/exception/BizResultCode.java | 3 +- .../server/controller/v2/RoleController.java | 17 +- .../controller/v2/RoleGroupController.java | 79 ++++++ .../impl/SaasRoleGroupServiceImpl.java | 12 +- .../controller/v2/RoleControllerTest.java | 36 +-- .../v2/RoleGroupControllerTest.java | 229 ++++++++++++++++++ .../resources/mysql/RoleControllerTest.sql | 12 +- .../mysql/RoleGroupControllerTest.sql | 49 ++++ 14 files changed, 497 insertions(+), 41 deletions(-) create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleGroupApi.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleGroupReq.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java create mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleGroupControllerTest.java create mode 100644 tyr-server/src/test/resources/mysql/RoleGroupControllerTest.sql diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListSaasRoleGroupParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListSaasRoleGroupParam.java index 05117cb0..1a381dd1 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListSaasRoleGroupParam.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListSaasRoleGroupParam.java @@ -2,6 +2,7 @@ package cn.axzo.tyr.client.model.req; import cn.axzo.foundation.dao.support.wrapper.CriteriaField; import cn.axzo.foundation.dao.support.wrapper.Operator; +import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -62,4 +63,10 @@ public class ListSaasRoleGroupParam { @CriteriaField(field = "parentId", operator = Operator.IN) private Set parentIds; + + /** + * needRole = true才生效 + */ + @CriteriaField(ignore = true) + private Set roleTypes; } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java index afbd17d9..6f2697a2 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleApi.java @@ -5,12 +5,18 @@ import cn.axzo.foundation.result.ApiResult; import cn.axzo.tyr.feign.req.PageRoleReq; import cn.axzo.tyr.feign.resp.RoleResp; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") public interface RoleApi { + /** + * 角色分页接口 + * @param req + * @return + */ @PostMapping("/api/role/page") - ApiResult> page(@RequestBody PageRoleReq req); + ApiResult> page(@RequestBody @Validated PageRoleReq req); } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleGroupApi.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleGroupApi.java new file mode 100644 index 00000000..26cfbac1 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleGroupApi.java @@ -0,0 +1,22 @@ +package cn.axzo.tyr.feign.api; + +import cn.axzo.foundation.page.PageResp; +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.feign.req.PageRoleGroupReq; +import cn.axzo.tyr.feign.resp.RoleGroupResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface RoleGroupApi { + + /** + * 角色分组接口 + * @param req + * @return + */ + @PostMapping("/api/roleGroup/page") + ApiResult> page(@RequestBody @Validated PageRoleGroupReq req); +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleGroupReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleGroupReq.java new file mode 100644 index 00000000..8750965d --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleGroupReq.java @@ -0,0 +1,53 @@ +package cn.axzo.tyr.feign.req; + +import cn.axzo.tyr.feign.enums.RoleTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.Max; +import java.util.List; +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PageRoleGroupReq { + + private Integer page; + + /** + * 最大值1000 + */ + @Max(value = 1000, message = "pageSize最大值为1000") + private Integer pageSize; + + /** + * 排序:使用示例,createTime__DESC + */ + private List sort; + + /** + * 角色分组code + */ + private Set roleGroupCodes; + + /** + * 角色类型:RoleTypeEnum + * super_admin:超级管理员 + * admin:管理员 + * init:初始化内置角色-标准角色 + * auto_own:虚拟角色(自定义权限使用) + * common:自定义角色 + * + * needRole = true时才生效 + */ + private Set roleTypes; + + /** + * 是否需要角色信息 + */ + private Boolean needRole; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java index 6cbcd57a..56f4e293 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java @@ -8,6 +8,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.Max; import java.util.List; import java.util.Set; @@ -19,6 +20,10 @@ public class PageRoleReq { private Integer page; + /** + * 最大值1000 + */ + @Max(value = 1000, message = "pageSize最大值为1000") private Integer pageSize; /** diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java index d39b20de..bfc2b20e 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleGroupResp.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; +import java.util.List; @Data @Builder @@ -78,4 +79,9 @@ public class RoleGroupResp { * 更新时间 */ private Date updateAt; + + /** + * 角色信息 + */ + private List roles; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java index f88146c4..a735c4c9 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java @@ -30,8 +30,7 @@ public enum BizResultCode implements IResultCode { FEATURE_NAME_EXIST("100020", "菜单组件名字已经存在:{}"), TERMINAL_EXIST("100021", "新端已经存在:{}"), TERMINAL_NOT_FOUND("100022", "原端不存在:{}"), - FEATURE_CODE_OVER_LENGTH("100023", "组件code不能超过100个字符:{}"), - MAX_PAGE_SIZE_ERROR("100024", "最大PAGE_SIZE不能超过1000"); + FEATURE_CODE_OVER_LENGTH("100023", "组件code不能超过100个字符:{}"); private String errorCode; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java index 695b9c10..5b981587 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java @@ -1,6 +1,5 @@ package cn.axzo.tyr.server.controller.v2; -import cn.axzo.foundation.exception.Axssert; import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.result.ApiResult; import cn.axzo.tyr.client.common.enums.FeatureResourceType; @@ -24,13 +23,9 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; -import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; -import static cn.axzo.tyr.server.common.constants.PermissionConstant.MAX_PAGE_SIZE; -import static cn.axzo.tyr.server.config.exception.BizResultCode.MAX_PAGE_SIZE_ERROR; - @Slf4j @RestController public class RoleController implements RoleApi { @@ -40,8 +35,6 @@ public class RoleController implements RoleApi { @Override public ApiResult> page(PageRoleReq req) { - check(req); - PageResp page = roleService.page(from(req)); return ApiResult.success(PageResp.builder() @@ -186,6 +179,9 @@ public class RoleController implements RoleApi { private RoleResp from(SaasRoleRes saasRoleRes) { RoleResp result = RoleResp.builder().build(); BeanUtils.copyProperties(saasRoleRes, result); + result.setRoleId(saasRoleRes.getId()); + result.setCooperateShipType(saasRoleRes.getProductUnitType()); + result.setOuId(saasRoleRes.getOwnerOuId()); assembleRoleFeatureResource(saasRoleRes, result); @@ -196,11 +192,4 @@ public class RoleController implements RoleApi { assembleFeatureResourceRelation(saasRoleRes, result); return result; } - - private void check(PageRoleReq req) { - if (Objects.nonNull(req.getPageSize())) { - Axssert.check(MAX_PAGE_SIZE >= req.getPageSize() , MAX_PAGE_SIZE_ERROR); - } - - } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java new file mode 100644 index 00000000..ad1cd12e --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java @@ -0,0 +1,79 @@ +package cn.axzo.tyr.server.controller.v2; + +import cn.axzo.foundation.page.PageResp; +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.client.common.enums.RoleTypeEnum; +import cn.axzo.tyr.client.model.req.PageSaasRoleGroupParam; +import cn.axzo.tyr.client.model.res.SaasRoleGroupDTO; +import cn.axzo.tyr.feign.api.RoleGroupApi; +import cn.axzo.tyr.feign.req.PageRoleGroupReq; +import cn.axzo.tyr.feign.resp.RoleGroupResp; +import cn.axzo.tyr.feign.resp.RoleResp; +import cn.axzo.tyr.server.service.SaasRoleGroupService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Optional; +import java.util.stream.Collectors; + +@Slf4j +@RestController +public class RoleGroupController implements RoleGroupApi { + + @Autowired + private SaasRoleGroupService saasRoleGroupService; + + @Override + public ApiResult> page(PageRoleGroupReq req) { + + PageResp page = saasRoleGroupService.page(from(req)); + + return ApiResult.success(PageResp.builder() + .total(page.getTotal()) + .size(page.getSize()) + .current(page.getCurrent()) + .data(page.getData().stream() + .map(this::from) + .collect(Collectors.toList())) + .build()); + } + + private PageSaasRoleGroupParam from(PageRoleGroupReq req) { + PageSaasRoleGroupParam result = PageSaasRoleGroupParam.builder().build(); + BeanUtils.copyProperties(req, result); + result.setRoleTypes(Optional.ofNullable(req.getRoleTypes()) + .map(e -> e.stream() + .map(roleType -> RoleTypeEnum.valueOf(roleType.name())) + .collect(Collectors.toSet())) + .orElse(null)); + return result; + } + + private RoleGroupResp from(SaasRoleGroupDTO saasRoleGroupDTO) { + RoleGroupResp result = RoleGroupResp.builder().build(); + + assembleRole(saasRoleGroupDTO, result); + return result; + } + + private void assembleRole(SaasRoleGroupDTO saasRoleGroupDTO, RoleGroupResp roleGroupResp) { + if (CollectionUtils.isEmpty(saasRoleGroupDTO.getSaasRoles())) { + return; + } + + roleGroupResp.setRoles(saasRoleGroupDTO.getSaasRoles().stream() + .map(saasRole -> { + RoleResp roleResp = RoleResp.builder().build(); + BeanUtils.copyProperties(saasRole, roleResp); + + roleResp.setRoleId(saasRole.getId()); + roleResp.setCooperateShipType(saasRole.getProductUnitType()); + roleResp.setOuId(saasRole.getOwnerOuId()); + return roleResp; + }) + .collect(Collectors.toList())); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index c8d32cd2..e51f7a9d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -8,6 +8,7 @@ import cn.axzo.foundation.exception.Axssert; import cn.axzo.foundation.page.PageResp; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum; +import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.req.ListRoleReq; import cn.axzo.tyr.client.model.req.ListSaasRoleGroupParam; import cn.axzo.tyr.client.model.req.PageSaasRoleGroupParam; @@ -438,12 +439,19 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl e.stream() + .map(RoleTypeEnum::getValue) + .collect(Collectors.toList())) + .orElse(null)) + .build(); Map roles = roleService.list(listSaasRoleParam).stream() .collect(Collectors.toMap(SaasRoleRes::getId, Function.identity())); return saasRoleGroupRelations.stream() + .filter(e -> Objects.nonNull(roles.get(e.getRoleId()))) .collect(Collectors.groupingBy(SaasRoleGroupRelation::getSaasRoleGroupId, LinkedHashMap::new, Collectors.mapping(e -> roles.get(e.getRoleId()), Collectors.toList()))); diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java index 3f040b39..d6710be3 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java @@ -1,11 +1,7 @@ package cn.axzo.tyr.server.controller.v2; -import cn.axzo.apollo.core.web.Results; -import cn.axzo.apollo.workspace.api.workspace.req.GetSimpleWorkspaceReqV2; -import cn.axzo.apollo.workspace.api.workspace.res.SimpleWorkspaceRes; import cn.axzo.basics.profiles.api.UserProfileServiceApi; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; -import cn.axzo.foundation.exception.BusinessException; import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; @@ -27,10 +23,6 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.util.List; -import static cn.axzo.tyr.server.config.exception.BizResultCode.MAX_PAGE_SIZE_ERROR; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - class RoleControllerTest extends BaseTest { @Autowired @@ -50,16 +42,6 @@ class RoleControllerTest extends BaseTest { @Test void page() { - - BusinessException businessException = assertThrows(BusinessException.class, ()->{ - roleController.page(PageRoleReq.builder() - .pageSize(1001) - .build()) - .getData() - .getData(); - }); - assertEquals(businessException.getErrorCode(), MAX_PAGE_SIZE_ERROR.getErrorCode()); - List roleResps = roleController.page(PageRoleReq.builder() .roleIds(Sets.newHashSet(24425L)) .pageSize(1000) @@ -68,6 +50,24 @@ class RoleControllerTest extends BaseTest { .getData(); Assertions.assertEquals(roleResps.size(), 1); + Assertions.assertEquals(roleResps.get(0).getRoleId(), 24425L); + Assertions.assertEquals(roleResps.get(0).getRoleCode(), "oms:project_manager"); + Assertions.assertEquals(roleResps.get(0).getName(), "项目经理"); + Assertions.assertEquals(roleResps.get(0).getDescription(), "描述"); + Assertions.assertEquals(roleResps.get(0).getRoleType(), "init"); + Assertions.assertEquals(roleResps.get(0).getWorkspaceId(), -1L); + Assertions.assertEquals(roleResps.get(0).getOuId(), -1L); + Assertions.assertEquals(roleResps.get(0).getCooperateShipType(), 6); + Assertions.assertEquals(roleResps.get(0).getCreateBy(), 2003043L); + Assertions.assertEquals(roleResps.get(0).getUpdateBy(), 2003028L); + Assertions.assertTrue(roleResps.get(0).getIsDisplay()); + Assertions.assertTrue(roleResps.get(0).getEnabled()); + Assertions.assertEquals(roleResps.get(0).getSort(), 2); + Assertions.assertEquals(LocalDateTime.ofInstant(roleResps.get(0).getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2023, 9, 19, 15, 22, 55)); + Assertions.assertEquals(LocalDateTime.ofInstant(roleResps.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 8, 13, 10, 25, 25)); + roleResps = roleController.page(PageRoleReq.builder() .workspaceType(6) .build()) diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleGroupControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleGroupControllerTest.java new file mode 100644 index 00000000..b42f337e --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleGroupControllerTest.java @@ -0,0 +1,229 @@ +package cn.axzo.tyr.server.controller.v2; + +import cn.axzo.tyr.base.BaseTest; +import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.feign.enums.RoleTypeEnum; +import cn.axzo.tyr.feign.req.PageRoleGroupReq; +import cn.axzo.tyr.feign.resp.RoleGroupResp; +import com.google.common.collect.Sets; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.List; + +class RoleGroupControllerTest extends BaseTest { + + @Autowired + private MysqlDataLoader mysqlDataLoader; + @Autowired + private RoleGroupController roleGroupController; + + @BeforeEach + @Override + public void setup() { + super.setup(); + mysqlDataLoader.loadFromClassName(getClass().getSimpleName()); + MockitoAnnotations.initMocks(this); + } + + @Test + void page() { + + List page = roleGroupController.page(PageRoleGroupReq.builder() + .build()) + .getData() + .getData(); + + Assertions.assertEquals(page.size(), 5); + + page = roleGroupController.page(PageRoleGroupReq.builder() + .roleGroupCodes(Sets.newHashSet("A1", "A2")) + .build()) + .getData() + .getData(); + + Assertions.assertEquals(page.size(), 2); + + page = roleGroupController.page(PageRoleGroupReq.builder() + .roleGroupCodes(Sets.newHashSet("A1", "A2")) + .needRole(true) + .build()) + .getData() + .getData(); + + Assertions.assertEquals(page.size(), 2); + Assertions.assertEquals(page.get(0).getRoles().size(), 1); + Assertions.assertEquals(page.get(0).getRoles().get(0).getRoleId(), 24425L); + Assertions.assertEquals(page.get(0).getRoles().get(0).getRoleCode(), "oms:project_manager"); + Assertions.assertEquals(page.get(0).getRoles().get(0).getName(), "项目经理"); + Assertions.assertEquals(page.get(0).getRoles().get(0).getDescription(), "描述"); + Assertions.assertEquals(page.get(0).getRoles().get(0).getRoleType(), "init"); + Assertions.assertEquals(page.get(0).getRoles().get(0).getWorkspaceId(), -1L); + Assertions.assertEquals(page.get(0).getRoles().get(0).getOuId(), -1L); + Assertions.assertEquals(page.get(0).getRoles().get(0).getCooperateShipType(), 6); + Assertions.assertEquals(page.get(0).getRoles().get(0).getCreateBy(), 2003043L); + Assertions.assertEquals(page.get(0).getRoles().get(0).getUpdateBy(), 2003028L); + Assertions.assertTrue(page.get(0).getRoles().get(0).getIsDisplay()); + Assertions.assertTrue(page.get(0).getRoles().get(0).getEnabled()); + Assertions.assertEquals(page.get(0).getRoles().get(0).getSort(), 2); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(0).getRoles().get(0).getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2023, 9, 19, 15, 22, 55)); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(0).getRoles().get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 8, 13, 10, 25, 25)); + + Assertions.assertEquals(page.get(1).getRoles().size(), 3); + Assertions.assertEquals(page.get(1).getRoles().get(0).getRoleId(), 25324L); + Assertions.assertEquals(page.get(1).getRoles().get(0).getRoleCode(), "cms:mafb_project_commissioner"); + Assertions.assertEquals(page.get(1).getRoles().get(0).getName(), "项目负责人"); + Assertions.assertEquals(page.get(1).getRoles().get(0).getDescription(), ""); + Assertions.assertEquals(page.get(1).getRoles().get(0).getRoleType(), "init"); + Assertions.assertEquals(page.get(1).getRoles().get(0).getWorkspaceId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(0).getOuId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(0).getCooperateShipType(), 5); + Assertions.assertEquals(page.get(1).getRoles().get(0).getCreateBy(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(0).getUpdateBy(), 9000399985L); + Assertions.assertTrue(page.get(1).getRoles().get(0).getIsDisplay()); + Assertions.assertTrue(page.get(1).getRoles().get(0).getEnabled()); + Assertions.assertEquals(page.get(1).getRoles().get(0).getSort(), 1); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(0).getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2023, 10, 23, 17, 49, 59)); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 8, 13, 10, 25, 40)); + + Assertions.assertEquals(page.get(1).getRoles().get(1).getRoleId(), 25326L); + Assertions.assertEquals(page.get(1).getRoles().get(1).getRoleCode(), "cms:mafb_business_vice_officer"); + Assertions.assertEquals(page.get(1).getRoles().get(1).getName(), "商务副经理"); + Assertions.assertEquals(page.get(1).getRoles().get(1).getDescription(), ""); + Assertions.assertEquals(page.get(1).getRoles().get(1).getRoleType(), "init"); + Assertions.assertEquals(page.get(1).getRoles().get(1).getWorkspaceId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(1).getOuId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(1).getCooperateShipType(), 5); + Assertions.assertEquals(page.get(1).getRoles().get(1).getCreateBy(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(1).getUpdateBy(), 2006333L); + Assertions.assertTrue(page.get(1).getRoles().get(1).getIsDisplay()); + Assertions.assertTrue(page.get(1).getRoles().get(1).getEnabled()); + Assertions.assertEquals(page.get(1).getRoles().get(1).getSort(), 2); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(1).getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2023, 10, 23, 17, 50, 0)); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(1).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 8, 13, 10, 25, 41)); + + Assertions.assertEquals(page.get(1).getRoles().get(2).getRoleId(), 25327L); + Assertions.assertEquals(page.get(1).getRoles().get(2).getRoleCode(), "cms:mafb_productivity_vice_officer"); + Assertions.assertEquals(page.get(1).getRoles().get(2).getName(), "生产副经理"); + Assertions.assertEquals(page.get(1).getRoles().get(2).getDescription(), ""); + Assertions.assertEquals(page.get(1).getRoles().get(2).getRoleType(), "init"); + Assertions.assertEquals(page.get(1).getRoles().get(2).getWorkspaceId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(2).getOuId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(2).getCooperateShipType(), 5); + Assertions.assertEquals(page.get(1).getRoles().get(2).getCreateBy(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(2).getUpdateBy(), 2006333L); + Assertions.assertTrue(page.get(1).getRoles().get(2).getIsDisplay()); + Assertions.assertTrue(page.get(1).getRoles().get(2).getEnabled()); + Assertions.assertEquals(page.get(1).getRoles().get(2).getSort(), 3); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(2).getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2023, 10, 23, 17, 50, 0)); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(2).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 8, 13, 10, 25, 41)); + + page = roleGroupController.page(PageRoleGroupReq.builder() + .roleGroupCodes(Sets.newHashSet("A1", "A2")) + .needRole(true) + .roleTypes(Sets.newHashSet(RoleTypeEnum.SUPER_ADMIN)) + .build()) + .getData() + .getData(); + + Assertions.assertEquals(page.size(), 2); + Assertions.assertNull(page.get(0).getRoles()); + Assertions.assertNull(page.get(1).getRoles()); + + page = roleGroupController.page(PageRoleGroupReq.builder() + .roleGroupCodes(Sets.newHashSet("A1", "A2")) + .needRole(true) + .roleTypes(Sets.newHashSet(RoleTypeEnum.INIT)) + .build()) + .getData() + .getData(); + + Assertions.assertEquals(page.size(), 2); + Assertions.assertEquals(page.get(0).getRoles().size(), 1); + Assertions.assertEquals(page.get(0).getRoles().get(0).getRoleId(), 24425L); + Assertions.assertEquals(page.get(0).getRoles().get(0).getRoleCode(), "oms:project_manager"); + Assertions.assertEquals(page.get(0).getRoles().get(0).getName(), "项目经理"); + Assertions.assertEquals(page.get(0).getRoles().get(0).getDescription(), "描述"); + Assertions.assertEquals(page.get(0).getRoles().get(0).getRoleType(), "init"); + Assertions.assertEquals(page.get(0).getRoles().get(0).getWorkspaceId(), -1L); + Assertions.assertEquals(page.get(0).getRoles().get(0).getOuId(), -1L); + Assertions.assertEquals(page.get(0).getRoles().get(0).getCooperateShipType(), 6); + Assertions.assertEquals(page.get(0).getRoles().get(0).getCreateBy(), 2003043L); + Assertions.assertEquals(page.get(0).getRoles().get(0).getUpdateBy(), 2003028L); + Assertions.assertTrue(page.get(0).getRoles().get(0).getIsDisplay()); + Assertions.assertTrue(page.get(0).getRoles().get(0).getEnabled()); + Assertions.assertEquals(page.get(0).getRoles().get(0).getSort(), 2); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(0).getRoles().get(0).getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2023, 9, 19, 15, 22, 55)); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(0).getRoles().get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 8, 13, 10, 25, 25)); + + Assertions.assertEquals(page.get(1).getRoles().size(), 3); + Assertions.assertEquals(page.get(1).getRoles().get(0).getRoleId(), 25324L); + Assertions.assertEquals(page.get(1).getRoles().get(0).getRoleCode(), "cms:mafb_project_commissioner"); + Assertions.assertEquals(page.get(1).getRoles().get(0).getName(), "项目负责人"); + Assertions.assertEquals(page.get(1).getRoles().get(0).getDescription(), ""); + Assertions.assertEquals(page.get(1).getRoles().get(0).getRoleType(), "init"); + Assertions.assertEquals(page.get(1).getRoles().get(0).getWorkspaceId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(0).getOuId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(0).getCooperateShipType(), 5); + Assertions.assertEquals(page.get(1).getRoles().get(0).getCreateBy(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(0).getUpdateBy(), 9000399985L); + Assertions.assertTrue(page.get(1).getRoles().get(0).getIsDisplay()); + Assertions.assertTrue(page.get(1).getRoles().get(0).getEnabled()); + Assertions.assertEquals(page.get(1).getRoles().get(0).getSort(), 1); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(0).getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2023, 10, 23, 17, 49, 59)); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 8, 13, 10, 25, 40)); + + Assertions.assertEquals(page.get(1).getRoles().get(1).getRoleId(), 25326L); + Assertions.assertEquals(page.get(1).getRoles().get(1).getRoleCode(), "cms:mafb_business_vice_officer"); + Assertions.assertEquals(page.get(1).getRoles().get(1).getName(), "商务副经理"); + Assertions.assertEquals(page.get(1).getRoles().get(1).getDescription(), ""); + Assertions.assertEquals(page.get(1).getRoles().get(1).getRoleType(), "init"); + Assertions.assertEquals(page.get(1).getRoles().get(1).getWorkspaceId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(1).getOuId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(1).getCooperateShipType(), 5); + Assertions.assertEquals(page.get(1).getRoles().get(1).getCreateBy(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(1).getUpdateBy(), 2006333L); + Assertions.assertTrue(page.get(1).getRoles().get(1).getIsDisplay()); + Assertions.assertTrue(page.get(1).getRoles().get(1).getEnabled()); + Assertions.assertEquals(page.get(1).getRoles().get(1).getSort(), 2); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(1).getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2023, 10, 23, 17, 50, 0)); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(1).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 8, 13, 10, 25, 41)); + + Assertions.assertEquals(page.get(1).getRoles().get(2).getRoleId(), 25327L); + Assertions.assertEquals(page.get(1).getRoles().get(2).getRoleCode(), "cms:mafb_productivity_vice_officer"); + Assertions.assertEquals(page.get(1).getRoles().get(2).getName(), "生产副经理"); + Assertions.assertEquals(page.get(1).getRoles().get(2).getDescription(), ""); + Assertions.assertEquals(page.get(1).getRoles().get(2).getRoleType(), "init"); + Assertions.assertEquals(page.get(1).getRoles().get(2).getWorkspaceId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(2).getOuId(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(2).getCooperateShipType(), 5); + Assertions.assertEquals(page.get(1).getRoles().get(2).getCreateBy(), -1L); + Assertions.assertEquals(page.get(1).getRoles().get(2).getUpdateBy(), 2006333L); + Assertions.assertTrue(page.get(1).getRoles().get(2).getIsDisplay()); + Assertions.assertTrue(page.get(1).getRoles().get(2).getEnabled()); + Assertions.assertEquals(page.get(1).getRoles().get(2).getSort(), 3); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(2).getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2023, 10, 23, 17, 50, 0)); + Assertions.assertEquals(LocalDateTime.ofInstant(page.get(1).getRoles().get(2).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 8, 13, 10, 25, 41)); + } +} \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleControllerTest.sql index 6b635f28..e67f566c 100644 --- a/tyr-server/src/test/resources/mysql/RoleControllerTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleControllerTest.sql @@ -1,8 +1,12 @@ #-->DEFAULT -INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (24425, '项目经理', '', 'init', 'oms:project_manager', -1, -1, 6, 6, 0, '2023-09-19 15:22:55', '2024-08-13 10:25:25', 2003043, 2003028, 1, 65535, 0, null, 0, '', 1, 2, 1); -INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (25324, '项目负责人', '', 'init', 'cms:mafb_project_commissioner', -1, -1, 5, 2, 0, '2023-10-23 17:49:59', '2024-08-13 10:25:40', -1, 9000399985, 1, 65535, 0, null, 0, '', 1, 1, 1); -INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (25326, '商务副经理', '', 'init', 'cms:mafb_business_vice_officer', -1, -1, 5, 2, 0, '2023-10-23 17:50:00', '2024-08-13 10:25:41', -1, 2006333, 1, 65535, 0, null, 0, '', 1, 2, 1); -INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (25327, '生产副经理', '', 'init', 'cms:mafb_productivity_vice_officer', -1, -1, 5, 2, 0, '2023-10-23 17:50:00', '2024-08-13 10:25:41', -1, 2006333, 1, 65535, 0, null, 0, '', 1, 3, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (24425, '项目经理', '描述', 'init', 'oms:project_manager', -1, -1, 6, 6, 0, '2023-09-19 15:22:55', '2024-08-13 10:25:25', 2003043, 2003028, 1, 65535, 0, null, 0, '', 1, 2, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (25324, '项目负责人', '', 'init', 'cms:mafb_project_commissioner', -1, -1, 5, 2, 0, '2023-10-23 17:49:59', '2024-08-13 10:25:40', -1, 9000399985, 1, 65535, 0, null, 0, '', 1, 1, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (25326, '商务副经理', '', 'init', 'cms:mafb_business_vice_officer', -1, -1, 5, 2, 0, '2023-10-23 17:50:00', '2024-08-13 10:25:41', -1, 2006333, 1, 65535, 0, null, 0, '', 1, 2, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (25327, '生产副经理', '', 'init', 'cms:mafb_productivity_vice_officer', -1, -1, 5, 2, 0, '2023-10-23 17:50:00', '2024-08-13 10:25:41', -1, 2006333, 1, 65535, 0, null, 0, '', 1, 3, 1); INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (12, 24425, 6, 0, '2023-09-19 15:22:55', '2023-09-19 15:22:55'); diff --git a/tyr-server/src/test/resources/mysql/RoleGroupControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleGroupControllerTest.sql new file mode 100644 index 00000000..b4376ffa --- /dev/null +++ b/tyr-server/src/test/resources/mysql/RoleGroupControllerTest.sql @@ -0,0 +1,49 @@ +#-->DEFAULT +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (24425, '项目经理', '描述', 'init', 'oms:project_manager', -1, -1, 6, 6, 0, '2023-09-19 15:22:55', '2024-08-13 10:25:25', 2003043, 2003028, 1, 65535, 0, null, 0, '', 1, 2, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (25324, '项目负责人', '', 'init', 'cms:mafb_project_commissioner', -1, -1, 5, 2, 0, '2023-10-23 17:49:59', '2024-08-13 10:25:40', -1, 9000399985, 1, 65535, 0, null, 0, '', 1, 1, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (25326, '商务副经理', '', 'init', 'cms:mafb_business_vice_officer', -1, -1, 5, 2, 0, '2023-10-23 17:50:00', '2024-08-13 10:25:41', -1, 2006333, 1, 65535, 0, null, 0, '', 1, 2, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (25327, '生产副经理', '', 'init', 'cms:mafb_productivity_vice_officer', -1, -1, 5, 2, 0, '2023-10-23 17:50:00', '2024-08-13 10:25:41', -1, 2006333, 1, 65535, 0, null, 0, '', 1, 3, 1); + + +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (12, 24425, 6, 0, '2023-09-19 15:22:55', '2023-09-19 15:22:55'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (23, 25324, 13, 0, '2023-10-23 17:49:59', '2023-10-23 17:49:58'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (25, 25326, 13, 0, '2023-10-23 17:50:00', '2023-10-23 17:49:59'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (26, 25327, 13, 0, '2023-10-23 17:50:00', '2023-10-23 17:49:59'); + +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (6, '6', '6', '研发中心', -1, -1, 0, 3, 'A1', 'FF', 0, '2023-09-19 14:31:19', '2024-05-29 09:33:24', '6,'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (13, '2', '5,3,4', '专业分包', -1, -1, 0, 1, 'A2', '', 0, '2023-10-23 17:49:59', '2024-08-15 18:39:13', '13,'); + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101100, '超级管理员', '超级管理员', 'super_admin', 'ou_superadmin', 0, 0, 7, 1, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101101, '超级管理员', '超级管理员', 'super_admin', 'pro_superadmin', 0, 0, 1, 2, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101102, '超级管理员', '超级管理员', 'super_admin', 'oms_superadmin', 0, 0, 6, 6, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101103, '超级管理员', '超级管理员', 'super_admin', 'zw_superadmin', 0, 0, 3, 3, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (3416, '自定义', '', 'common', '', 3, 4, 1, 2, 0, '2022-10-19 15:52:33', '2024-09-29 17:16:27', 0, 0, 65535, 65535, 0, 0, 0, '', 1, 0, 1); + +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) +VALUES (549, 101100, 18, 0, '2024-09-25 21:47:42', '2024-09-25 21:47:42'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) +VALUES (550, 101101, 14, 0, '2024-09-25 21:47:42', '2024-09-25 21:47:42'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) +VALUES (551, 101102, 57, 0, '2024-09-25 21:47:42', '2024-09-25 21:47:42'); + +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (14, '2', '1', '总包单位', -1, -1, 0, 1, '', '', 0, '2023-10-23 17:50:04', '2024-09-10 10:18:44', '14,'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (18, '1', '7', '企业通用', -1, -1, 0, 4, '', '', 0, '2023-10-23 17:50:15', '2024-09-10 10:18:44', '18,'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (57, '6', '6', 'OMS超管组', -1, -1, 0, 9, 'omsSuperAdminGroup', '', 0, '2024-04-17 11:38:28', '2024-09-10 10:18:45', '57,'); + + +#-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file From cdcf121570188a4b61bae66142fe228f14f71554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Wed, 11 Dec 2024 10:52:40 +0800 Subject: [PATCH 06/25] =?UTF-8?q?feat:(REQ-3282)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=94=A8=E6=88=B7=E7=9A=84page=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../req/ListRoleUserRelationParam.java | 4 + .../req/PageRoleUserRelationParam.java | 12 +- .../cn/axzo/tyr/feign/api/RoleUserApi.java | 22 ++ .../axzo/tyr/feign/req/PageRoleUserReq.java | 83 ++++++++ .../controller/v2/RoleUserV2Controller.java | 81 ++++++++ .../impl/SaasRoleUserRelationServiceImpl.java | 46 +++-- .../v2/RoleUserV2ControllerTest.java | 191 ++++++++++++++++++ .../mysql/RoleUserV2ControllerTest.sql | 54 +++++ 8 files changed, 472 insertions(+), 21 deletions(-) create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java create mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java create mode 100644 tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java index d3bd2776..8175fcb8 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java @@ -3,6 +3,7 @@ package cn.axzo.tyr.client.model.roleuser.req; import cn.axzo.foundation.dao.support.wrapper.CriteriaField; import cn.axzo.foundation.dao.support.wrapper.Operator; import cn.axzo.tyr.client.common.enums.FeatureResourceType; +import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.enums.IdentityType; import lombok.AllArgsConstructor; import lombok.Builder; @@ -137,6 +138,9 @@ public class ListRoleUserRelationParam { @CriteriaField(ignore = true) private List batchPersons; + @CriteriaField(ignore = true) + private Set roleTypes; + @Data @Builder @NoArgsConstructor diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/PageRoleUserRelationParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/PageRoleUserRelationParam.java index 4949d781..c2dee9f4 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/PageRoleUserRelationParam.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/PageRoleUserRelationParam.java @@ -3,6 +3,7 @@ package cn.axzo.tyr.client.model.roleuser.req; import cn.axzo.foundation.dao.support.wrapper.CriteriaField; import cn.axzo.foundation.page.IPageReq; import cn.axzo.foundation.page.PageResp; +import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -10,6 +11,7 @@ import lombok.experimental.SuperBuilder; import java.util.Collections; import java.util.List; +import java.util.Optional; @SuperBuilder @Data @@ -29,10 +31,12 @@ public class PageRoleUserRelationParam extends ListRoleUserRelationParam impleme @CriteriaField(ignore = true) List sort; - public PageResp toEmpty() { - return PageResp.builder() - .current(this.getPage()) - .size(this.getPageSize()) + public PageResp toEmpty() { + return PageResp.builder() + .current(Optional.ofNullable(this.getPage()) + .orElse(DEFAULT_PAGE_NUMBER)) + .size(Optional.ofNullable(this.getPageSize()) + .orElse(DEFAULT_PAGE_SIZE)) .total(0) .data(Collections.emptyList()) .build(); diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java new file mode 100644 index 00000000..208de511 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java @@ -0,0 +1,22 @@ +package cn.axzo.tyr.feign.api; + +import cn.axzo.foundation.page.PageResp; +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.feign.req.PageRoleUserReq; +import cn.axzo.tyr.feign.resp.RoleUserResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface RoleUserApi { + + /** + * 角色用户page接口 + * @param req + * @return + */ + @PostMapping("/api/roleUser/page") + ApiResult> page(@RequestBody @Validated PageRoleUserReq req); +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java new file mode 100644 index 00000000..495a8e76 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java @@ -0,0 +1,83 @@ +package cn.axzo.tyr.feign.req; + +import cn.axzo.tyr.feign.enums.RoleTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.Max; +import java.util.List; +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PageRoleUserReq { + + private Integer page; + + /** + * 最大值1000 + */ + @Max(value = 1000, message = "pageSize最大值为1000") + private Integer pageSize; + + /** + * 排序:使用示例,createTime__DESC + */ + private List sort; + + /** + * 企业id + */ + private Long ouId; + + /** + * 项目id + */ + private Long workspaceId; + + /** + * 角色code + */ + private Set roleCodes; + + /** + * 角色id + */ + private Set roleIds; + + /** + * 角色类型:RoleTypeEnum + * super_admin:超级管理员 + * admin:管理员 + * init:初始化内置角色-标准角色 + * auto_own:虚拟角色(自定义权限使用) + * common:自定义角色 + */ + private Set roleTypes; + + /** + * workspaceId和ouId配对查询 + * 例如:((workspaceId = ## and ouId = ##) or (workspaceId = ## and ouId = ##)) + */ + private List workspaceOuPairs; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class WorkspaceOuPair { + /** + * 租户id + */ + private Long workspaceId; + + /** + * 单位id + */ + private Long ouId; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java new file mode 100644 index 00000000..629d9afe --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java @@ -0,0 +1,81 @@ +package cn.axzo.tyr.server.controller.v2; + + +import cn.axzo.foundation.page.PageResp; +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.client.common.enums.RoleTypeEnum; +import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; +import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; +import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationParam; +import cn.axzo.tyr.feign.api.RoleUserApi; +import cn.axzo.tyr.feign.req.PageRoleUserReq; +import cn.axzo.tyr.feign.resp.RoleUserResp; +import cn.axzo.tyr.server.service.SaasRoleUserRelationService; +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Optional; +import java.util.stream.Collectors; + +@Slf4j +@RestController +public class RoleUserV2Controller implements RoleUserApi { + + @Autowired + private SaasRoleUserRelationService saasRoleUserRelationService; + + @Override + public ApiResult> page(PageRoleUserReq req) { + + PageResp page = saasRoleUserRelationService.page(from(req)); + + return ApiResult.success(PageResp.builder() + .total(page.getTotal()) + .size(page.getSize()) + .current(page.getCurrent()) + .data(page.getData().stream() + .map(this::from) + .collect(Collectors.toList())) + .build()); + } + + private PageRoleUserRelationParam from(PageRoleUserReq req) { + PageRoleUserRelationParam result = PageRoleUserRelationParam.builder().build(); + + BeanUtils.copyProperties(req, result); + + result.setNeedUsers(true); + + result.setRoleTypes(Optional.ofNullable(req.getRoleTypes()) + .map(e -> e.stream() + .map(roleType -> RoleTypeEnum.valueOf(roleType.name())) + .collect(Collectors.toSet())) + .orElse(null)); + + result.setRoleIds(Optional.ofNullable(req.getRoleIds()) + .map(Lists::newArrayList) + .orElse(null)); + + result.setWorkspaceOuPairs(Optional.ofNullable(req.getWorkspaceOuPairs()) + .map(e -> e.stream() + .map(f -> ListRoleUserRelationParam.WorkspaceOuPair.builder() + .workspaceId(f.getWorkspaceId()) + .ouId(f.getOuId()) + .build()) + .collect(Collectors.toList())) + .orElse(null)); + return result; + } + + private RoleUserResp from(SaasRoleUserV2DTO saasRoleUserV2DTO) { + RoleUserResp result = RoleUserResp.builder().build(); + + BeanUtils.copyProperties(saasRoleUserV2DTO, result); + + result.setPersonId(saasRoleUserV2DTO.getSaasRoleUser().getPersonId()); + return result; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index d2effa39..4c2c8806 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -51,7 +51,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; -import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.BooleanUtils; import org.springframework.beans.BeanUtils; @@ -128,11 +127,19 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl roleIds = resolveRoleIds(param); - if (!CollectionUtils.isEmpty(param.getRoleCodes()) && CollectionUtils.isEmpty(roleIds)) { + Set roleIdsByRoleCodes = resolveRoleIdsByRoleCodes(param); + if (!CollectionUtils.isEmpty(param.getRoleCodes()) && CollectionUtils.isEmpty(roleIdsByRoleCodes)) { return param.toEmpty(); } - wrapper.in(!CollectionUtils.isEmpty(roleIds), "role_id", roleIds); + + Set roleIdsByRoleTypes = resolveRoleIdsByRoleTypes(param); + if (!CollectionUtils.isEmpty(param.getRoleTypes()) && CollectionUtils.isEmpty(roleIdsByRoleTypes)) { + return param.toEmpty(); + } + + wrapper.in(!CollectionUtils.isEmpty(roleIdsByRoleCodes), "role_id", roleIdsByRoleCodes); + + wrapper.in(!CollectionUtils.isEmpty(roleIdsByRoleTypes), "role_id", roleIdsByRoleTypes); assembleBatchPersonWrapper(param, wrapper); @@ -201,26 +208,16 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl resolveRoleIds(PageRoleUserRelationParam param) { + private Set resolveRoleIdsByRoleCodes(PageRoleUserRelationParam param) { if (CollectionUtils.isEmpty(param.getRoleCodes())) { - return Optional.ofNullable(param.getRoleIds()) - .map(Sets::newHashSet) - .orElseGet(Sets::newHashSet); + return Collections.emptySet(); } ListRoleReq listSaasRoleParam = ListRoleReq.builder() .roleCodes(param.getRoleCodes()) .build(); - Set roleIds = roleService.list(listSaasRoleParam).stream() + return roleService.list(listSaasRoleParam).stream() .map(SaasRoleRes::getId) .collect(Collectors.toSet()); - - if (CollectionUtils.isEmpty(param.getRoleIds())) { - return roleIds; - } - - return param.getRoleIds().stream() - .filter(roleIds::contains) - .collect(Collectors.toSet()); } private Map listSaasRoleUser(PageRoleUserRelationParam param, @@ -607,4 +604,19 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl resolveRoleIdsByRoleTypes(PageRoleUserRelationParam param) { + if (CollectionUtils.isEmpty(param.getRoleTypes())) { + return Collections.emptySet(); + } + + ListRoleReq listSaasRoleParam = ListRoleReq.builder() + .roleTypes(param.getRoleTypes().stream() + .map(RoleTypeEnum::getValue) + .collect(Collectors.toList())) + .build(); + return roleService.list(listSaasRoleParam).stream() + .map(SaasRoleRes::getId) + .collect(Collectors.toSet()); + } } diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java new file mode 100644 index 00000000..bf8d75e8 --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java @@ -0,0 +1,191 @@ +package cn.axzo.tyr.server.controller.v2; + +import cn.axzo.apollo.core.web.Result; +import cn.axzo.apollo.workspace.api.workspace.WorkspaceApi; +import cn.axzo.apollo.workspace.api.workspace.res.SimpleWorkspaceRes; +import cn.axzo.basics.profiles.api.UserProfileServiceApi; +import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; +import cn.axzo.tyr.base.BaseTest; +import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.client.model.roleuser.dto.SuperAminInfoResp; +import cn.axzo.tyr.client.model.roleuser.req.SuperAdminParam; +import cn.axzo.tyr.feign.enums.RoleTypeEnum; +import cn.axzo.tyr.feign.req.PageRoleUserReq; +import cn.axzo.tyr.feign.resp.RoleUserResp; +import cn.axzo.tyr.server.service.SaasRoleUserService; +import cn.azxo.framework.common.model.CommonResponse; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +class RoleUserV2ControllerTest extends BaseTest { + @Autowired + private MysqlDataLoader mysqlDataLoader; + @Autowired + private RoleUserV2Controller roleUserV2Controller; + @Autowired + private SaasRoleUserService saasRoleUserService; + @Autowired + private WorkspaceApi workspaceApi; + @Autowired + private UserProfileServiceApi userProfileServiceApi; + + @BeforeEach + @Override + public void setup() { + super.setup(); + mysqlDataLoader.loadFromClassName(getClass().getSimpleName()); + MockitoAnnotations.initMocks(this); + } + + @Test + void page() { + List simpleWorkspaceRes = Lists.newArrayList(SimpleWorkspaceRes.builder() + .type(2) + .build()); + Mockito.when(workspaceApi.getListV2(Mockito.any())) + .thenReturn(new Result(200, "sucess", simpleWorkspaceRes)); + + List personProfileDtos = org.assertj.core.util.Lists.newArrayList(); + PersonProfileDto personProfileDto = new PersonProfileDto(); + personProfileDto.setId(24510L); + personProfileDto.setRealName("测试名字"); + personProfileDtos.add(personProfileDto); + Mockito.when(userProfileServiceApi.postPersonProfiles(Mockito.any())) + .thenReturn(CommonResponse.success(personProfileDtos)); + + // old + List superAminInfoResps = saasRoleUserService.superAdminList(SuperAdminParam.builder() + .workspaceId(3L) + .ouId(4L) + .build()); + Assertions.assertEquals(superAminInfoResps.size(), 1); + Assertions.assertEquals(superAminInfoResps.get(0).getIdentityId(), 40L); + Assertions.assertEquals(superAminInfoResps.get(0).getIdentityType(), 3); + Assertions.assertEquals(superAminInfoResps.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(superAminInfoResps.get(0).getOuId(), 4L); + Assertions.assertEquals(superAminInfoResps.get(0).getPersonId(), 2232L); + // old + + List data = roleUserV2Controller.page(PageRoleUserReq.builder() + .workspaceId(3L) + .ouId(4L) + .roleTypes(Sets.newHashSet(RoleTypeEnum.SUPER_ADMIN)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertEquals(data.get(0).getIdentityId(), 40L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getPersonId(), 2232L); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleIds(Sets.newHashSet(101100L)) + .workspaceId(3L) + .ouId(4L) + .roleTypes(Sets.newHashSet(RoleTypeEnum.SUPER_ADMIN)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 0); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleIds(Sets.newHashSet(101101L)) + .workspaceId(3L) + .ouId(4L) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertEquals(data.get(0).getIdentityId(), 40L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getPersonId(), 2232L); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleIds(Sets.newHashSet(101100L)) + .roleCodes(Sets.newHashSet("sdf")) + .workspaceId(3L) + .ouId(4L) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 0); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleIds(Sets.newHashSet(101101L)) + .roleCodes(Sets.newHashSet("sdf")) + .workspaceId(3L) + .ouId(4L) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 0); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleIds(Sets.newHashSet(101101L)) + .roleCodes(Sets.newHashSet("pro_superadmin")) + .workspaceId(3L) + .ouId(4L) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertEquals(data.get(0).getIdentityId(), 40L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getPersonId(), 2232L); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleTypes(Sets.newHashSet(RoleTypeEnum.SUPER_ADMIN)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 2); + Assertions.assertEquals(data.get(0).getIdentityId(), 40L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 8L); + Assertions.assertEquals(data.get(0).getOuId(), 1L); + Assertions.assertEquals(data.get(0).getPersonId(), 2232L); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleTypes(Sets.newHashSet(RoleTypeEnum.SUPER_ADMIN)) + .workspaceOuPairs(Lists.newArrayList(PageRoleUserReq.WorkspaceOuPair.builder().workspaceId(3L).ouId(4L).build(), + PageRoleUserReq.WorkspaceOuPair.builder().workspaceId(8L).ouId(1L).build())) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 2); + Assertions.assertEquals(data.get(0).getIdentityId(), 40L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 8L); + Assertions.assertEquals(data.get(0).getOuId(), 1L); + Assertions.assertEquals(data.get(0).getPersonId(), 2232L); + + Assertions.assertEquals(data.get(1).getIdentityId(), 40L); + Assertions.assertEquals(data.get(1).getIdentityType(), 3); + Assertions.assertEquals(data.get(1).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(1).getOuId(), 4L); + Assertions.assertEquals(data.get(1).getPersonId(), 2232L); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleTypes(Sets.newHashSet(RoleTypeEnum.INIT)) + .workspaceOuPairs(Lists.newArrayList(PageRoleUserReq.WorkspaceOuPair.builder().workspaceId(3L).ouId(4L).build(), + PageRoleUserReq.WorkspaceOuPair.builder().workspaceId(8L).ouId(1L).build())) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 10); + } +} \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql new file mode 100644 index 00000000..940e40b1 --- /dev/null +++ b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql @@ -0,0 +1,54 @@ +#-->DEFAULT + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101100, '超级管理员', '超级管理员', 'super_admin', 'ou_superadmin', 0, 0, 7, 1, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101101, '超级管理员', '超级管理员', 'super_admin', 'pro_superadmin', 0, 0, 1, 2, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101102, '超级管理员', '超级管理员', 'super_admin', 'oms_superadmin', 0, 0, 6, 6, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101103, '超级管理员', '超级管理员', 'super_admin', 'zw_superadmin', 0, 0, 3, 3, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100920, '工人管理', '', 'init', 'cms:zb_worker——management', -1, -1, 1, 2, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 4, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100921, '查看组织架构', '', 'init', 'cms:zb_org_view', -1, -1, 1, 2, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 5, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100923, '查看合约', '', 'init', 'cms:zb_contact_view', -1, -1, 1, 2, 0, '2024-09-25 11:51:58', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 2, 1); + + +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (197519, 28801, 3414, 3, 24510, 3, 4, 0, 0, 0, '2024-01-18 16:36:16', '2024-09-29 17:16:39', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (183677, 40, 3415, 3, 2232, 8, 1, 0, 0, 0, '2023-10-06 15:13:35', '2024-09-29 17:16:39', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (1157571, 40, 101101, 3, 2232, 8, 1, 0, 0, 0, '2024-09-27 09:39:49', '2024-09-27 09:39:48', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (197520, 28802, 24425, 3, 24511, 3, 4, 0, 0, 0, '2024-01-18 16:36:16', '2024-09-29 17:16:39', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (1157572, 40, 101101, 3, 2232, 3, 4, 0, 0, 0, '2024-09-27 09:39:49', '2024-09-27 09:39:48', 0, 0, 2); + +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (545048, 6, 100921, 3, 1827, 3, 4, 0, 0, 0, '2024-09-26 11:31:34', '2024-09-26 11:31:33', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (545301, 8, 100921, 3, 2107, 3, 4, 0, 0, 0, '2024-09-26 11:31:35', '2024-09-26 11:31:34', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544214, 14, 100921, 3, 0, 3, 4, 0, 0, 0, '2024-09-26 11:31:32', '2024-09-26 11:31:32', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (545447, 17, 100921, 3, 3135, 3, 4, 0, 0, 0, '2024-09-26 11:31:35', '2024-09-26 11:31:34', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (545448, 17, 100920, 3, 3135, 3, 4, 0, 0, 0, '2024-09-26 11:31:35', '2024-09-26 11:31:34', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544216, 18, 100921, 3, 0, 3, 4, 0, 0, 0, '2024-09-26 11:31:32', '2024-09-26 11:31:32', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544451, 36, 100921, 3, 3470, 3, 4, 0, 0, 0, '2024-09-26 11:31:33', '2024-09-26 11:31:32', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544452, 36, 100920, 3, 3470, 3, 4, 0, 0, 0, '2024-09-26 11:31:33', '2024-09-26 11:31:32', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544453, 36, 100923, 3, 3470, 3, 4, 0, 0, 0, '2024-09-26 11:31:33', '2024-09-26 11:31:32', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544687, 429, 100921, 3, 5267, 3, 4, 0, 0, 0, '2024-09-26 11:31:33', '2024-09-26 11:31:33', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544688, 429, 100921, 3, 5267, 5, 6, 0, 0, 0, '2024-09-26 11:31:33', '2024-09-26 11:31:33', 0, 0, 2); + +#-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file From 4fd6d2caf0b7fd833505dad71da4eb309a5fb9fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Wed, 11 Dec 2024 13:52:18 +0800 Subject: [PATCH 07/25] =?UTF-8?q?feat:(REQ-3282)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2/RoleUserV2ControllerTest.java | 219 ++++++++++++++++++ .../mysql/RoleUserV2ControllerTest.sql | 4 +- 2 files changed, 221 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java index bf8d75e8..d2f0fcd4 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java @@ -5,13 +5,18 @@ import cn.axzo.apollo.workspace.api.workspace.WorkspaceApi; import cn.axzo.apollo.workspace.api.workspace.res.SimpleWorkspaceRes; import cn.axzo.basics.profiles.api.UserProfileServiceApi; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; +import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserDTO; import cn.axzo.tyr.client.model.roleuser.dto.SuperAminInfoResp; +import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; import cn.axzo.tyr.client.model.roleuser.req.SuperAdminParam; import cn.axzo.tyr.feign.enums.RoleTypeEnum; import cn.axzo.tyr.feign.req.PageRoleUserReq; import cn.axzo.tyr.feign.resp.RoleUserResp; +import cn.axzo.tyr.server.controller.roleuser.RoleUserController; import cn.axzo.tyr.server.service.SaasRoleUserService; import cn.azxo.framework.common.model.CommonResponse; import com.google.common.collect.Lists; @@ -23,6 +28,8 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.List; class RoleUserV2ControllerTest extends BaseTest { @@ -36,6 +43,8 @@ class RoleUserV2ControllerTest extends BaseTest { private WorkspaceApi workspaceApi; @Autowired private UserProfileServiceApi userProfileServiceApi; + @Autowired + private RoleUserController roleUserController; @BeforeEach @Override @@ -187,5 +196,215 @@ class RoleUserV2ControllerTest extends BaseTest { .getData() .getData(); Assertions.assertEquals(data.size(), 10); + + // old + RoleUserParam roleUserParam = RoleUserParam.builder() + .build(); + List listApiResult = roleUserController.roleUserList(roleUserParam).getData(); + Assertions.assertEquals(listApiResult.size(), 13); + Assertions.assertEquals(listApiResult.get(0).getId(), 544214L); + Assertions.assertEquals(listApiResult.get(0).getIdentityId(), 14L); + Assertions.assertEquals(listApiResult.get(0).getIdentityType(), 3); + Assertions.assertEquals(listApiResult.get(0).getRoleId(), 100921L); + Assertions.assertEquals(listApiResult.get(0).getNaturalPersonId(), 0L); + Assertions.assertEquals(listApiResult.get(0).getRoleName(), "查看组织架构"); + Assertions.assertEquals(listApiResult.get(0).getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT); + Assertions.assertEquals(listApiResult.get(0).getDescription(), "ff"); + Assertions.assertEquals(listApiResult.get(0).getCreateBy(), 1L); + Assertions.assertEquals(listApiResult.get(0).getUpdateBy(), 2L); + Assertions.assertEquals(listApiResult.get(0).getOuId(), 4L); + Assertions.assertEquals(listApiResult.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(listApiResult.get(0).getResourceId(), 0L); + Assertions.assertEquals(listApiResult.get(0).getResourceType(), 0); + Assertions.assertTrue(listApiResult.get(0).getDisplayRole()); + Assertions.assertTrue(listApiResult.get(0).getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 32)); + + listApiResult = roleUserController.roleUserList(RoleUserParam.builder() + .workspaceId(5L) + .build()).getData(); + Assertions.assertEquals(listApiResult.size(), 1); + Assertions.assertEquals(listApiResult.get(0).getId(), 544688L); + Assertions.assertEquals(listApiResult.get(0).getIdentityId(), 429L); + Assertions.assertEquals(listApiResult.get(0).getIdentityType(), 3); + Assertions.assertEquals(listApiResult.get(0).getRoleId(), 100921L); + Assertions.assertEquals(listApiResult.get(0).getNaturalPersonId(), 5267L); + Assertions.assertEquals(listApiResult.get(0).getRoleName(), "查看组织架构"); + Assertions.assertEquals(listApiResult.get(0).getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT); + Assertions.assertEquals(listApiResult.get(0).getDescription(), "ff"); + Assertions.assertEquals(listApiResult.get(0).getCreateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getOuId(), 6L); + Assertions.assertEquals(listApiResult.get(0).getWorkspaceId(), 5L); + Assertions.assertEquals(listApiResult.get(0).getResourceId(), 0L); + Assertions.assertEquals(listApiResult.get(0).getResourceType(), 0); + Assertions.assertTrue(listApiResult.get(0).getDisplayRole()); + Assertions.assertTrue(listApiResult.get(0).getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + listApiResult = roleUserController.roleUserList(RoleUserParam.builder() + .workspaceIds(Lists.newArrayList(5L)) + .build()).getData(); + Assertions.assertEquals(listApiResult.size(), 1); + Assertions.assertEquals(listApiResult.get(0).getId(), 544688L); + Assertions.assertEquals(listApiResult.get(0).getIdentityId(), 429L); + Assertions.assertEquals(listApiResult.get(0).getIdentityType(), 3); + Assertions.assertEquals(listApiResult.get(0).getRoleId(), 100921L); + Assertions.assertEquals(listApiResult.get(0).getNaturalPersonId(), 5267L); + Assertions.assertEquals(listApiResult.get(0).getRoleName(), "查看组织架构"); + Assertions.assertEquals(listApiResult.get(0).getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT); + Assertions.assertEquals(listApiResult.get(0).getDescription(), "ff"); + Assertions.assertEquals(listApiResult.get(0).getCreateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getOuId(), 6L); + Assertions.assertEquals(listApiResult.get(0).getWorkspaceId(), 5L); + Assertions.assertEquals(listApiResult.get(0).getResourceId(), 0L); + Assertions.assertEquals(listApiResult.get(0).getResourceType(), 0); + Assertions.assertTrue(listApiResult.get(0).getDisplayRole()); + Assertions.assertTrue(listApiResult.get(0).getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + listApiResult = roleUserController.roleUserList(RoleUserParam.builder() + .ouId(6L) + .build()).getData(); + Assertions.assertEquals(listApiResult.size(), 1); + Assertions.assertEquals(listApiResult.get(0).getId(), 544688L); + Assertions.assertEquals(listApiResult.get(0).getIdentityId(), 429L); + Assertions.assertEquals(listApiResult.get(0).getIdentityType(), 3); + Assertions.assertEquals(listApiResult.get(0).getRoleId(), 100921L); + Assertions.assertEquals(listApiResult.get(0).getNaturalPersonId(), 5267L); + Assertions.assertEquals(listApiResult.get(0).getRoleName(), "查看组织架构"); + Assertions.assertEquals(listApiResult.get(0).getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT); + Assertions.assertEquals(listApiResult.get(0).getDescription(), "ff"); + Assertions.assertEquals(listApiResult.get(0).getCreateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getOuId(), 6L); + Assertions.assertEquals(listApiResult.get(0).getWorkspaceId(), 5L); + Assertions.assertEquals(listApiResult.get(0).getResourceId(), 0L); + Assertions.assertEquals(listApiResult.get(0).getResourceType(), 0); + Assertions.assertTrue(listApiResult.get(0).getDisplayRole()); + Assertions.assertTrue(listApiResult.get(0).getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + listApiResult = roleUserController.roleUserList(RoleUserParam.builder() + .ouIds(Lists.newArrayList(6L)) + .build()).getData(); + Assertions.assertEquals(listApiResult.size(), 1); + Assertions.assertEquals(listApiResult.get(0).getId(), 544688L); + Assertions.assertEquals(listApiResult.get(0).getIdentityId(), 429L); + Assertions.assertEquals(listApiResult.get(0).getIdentityType(), 3); + Assertions.assertEquals(listApiResult.get(0).getRoleId(), 100921L); + Assertions.assertEquals(listApiResult.get(0).getNaturalPersonId(), 5267L); + Assertions.assertEquals(listApiResult.get(0).getRoleName(), "查看组织架构"); + Assertions.assertEquals(listApiResult.get(0).getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT); + Assertions.assertEquals(listApiResult.get(0).getDescription(), "ff"); + Assertions.assertEquals(listApiResult.get(0).getCreateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getOuId(), 6L); + Assertions.assertEquals(listApiResult.get(0).getWorkspaceId(), 5L); + Assertions.assertEquals(listApiResult.get(0).getResourceId(), 0L); + Assertions.assertEquals(listApiResult.get(0).getResourceType(), 0); + Assertions.assertTrue(listApiResult.get(0).getDisplayRole()); + Assertions.assertTrue(listApiResult.get(0).getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + listApiResult = roleUserController.roleUserList(RoleUserParam.builder() + .personId(5267L) + .build()).getData(); + Assertions.assertEquals(listApiResult.size(), 2); + Assertions.assertEquals(listApiResult.get(0).getId(), 544687L); + Assertions.assertEquals(listApiResult.get(0).getIdentityId(), 429L); + Assertions.assertEquals(listApiResult.get(0).getIdentityType(), 3); + Assertions.assertEquals(listApiResult.get(0).getRoleId(), 100921L); + Assertions.assertEquals(listApiResult.get(0).getNaturalPersonId(), 5267L); + Assertions.assertEquals(listApiResult.get(0).getRoleName(), "查看组织架构"); + Assertions.assertEquals(listApiResult.get(0).getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT); + Assertions.assertEquals(listApiResult.get(0).getDescription(), "ff"); + Assertions.assertEquals(listApiResult.get(0).getCreateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getOuId(), 4L); + Assertions.assertEquals(listApiResult.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(listApiResult.get(0).getResourceId(), 0L); + Assertions.assertEquals(listApiResult.get(0).getResourceType(), 0); + Assertions.assertTrue(listApiResult.get(0).getDisplayRole()); + Assertions.assertTrue(listApiResult.get(0).getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + listApiResult = roleUserController.roleUserList(RoleUserParam.builder() + .identityId(429L) + .build()).getData(); + Assertions.assertEquals(listApiResult.size(), 2); + Assertions.assertEquals(listApiResult.get(0).getId(), 544687L); + Assertions.assertEquals(listApiResult.get(0).getIdentityId(), 429L); + Assertions.assertEquals(listApiResult.get(0).getIdentityType(), 3); + Assertions.assertEquals(listApiResult.get(0).getRoleId(), 100921L); + Assertions.assertEquals(listApiResult.get(0).getNaturalPersonId(), 5267L); + Assertions.assertEquals(listApiResult.get(0).getRoleName(), "查看组织架构"); + Assertions.assertEquals(listApiResult.get(0).getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT); + Assertions.assertEquals(listApiResult.get(0).getDescription(), "ff"); + Assertions.assertEquals(listApiResult.get(0).getCreateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getOuId(), 4L); + Assertions.assertEquals(listApiResult.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(listApiResult.get(0).getResourceId(), 0L); + Assertions.assertEquals(listApiResult.get(0).getResourceType(), 0); + Assertions.assertTrue(listApiResult.get(0).getDisplayRole()); + Assertions.assertTrue(listApiResult.get(0).getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + listApiResult = roleUserController.roleUserList(RoleUserParam.builder() + .identityId(429L) + .identityType(IdentityType.PRACTITIONER) + .build()).getData(); + Assertions.assertEquals(listApiResult.size(), 2); + Assertions.assertEquals(listApiResult.get(0).getId(), 544687L); + Assertions.assertEquals(listApiResult.get(0).getIdentityId(), 429L); + Assertions.assertEquals(listApiResult.get(0).getIdentityType(), 3); + Assertions.assertEquals(listApiResult.get(0).getRoleId(), 100921L); + Assertions.assertEquals(listApiResult.get(0).getNaturalPersonId(), 5267L); + Assertions.assertEquals(listApiResult.get(0).getRoleName(), "查看组织架构"); + Assertions.assertEquals(listApiResult.get(0).getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT); + Assertions.assertEquals(listApiResult.get(0).getDescription(), "ff"); + Assertions.assertEquals(listApiResult.get(0).getCreateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getOuId(), 4L); + Assertions.assertEquals(listApiResult.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(listApiResult.get(0).getResourceId(), 0L); + Assertions.assertEquals(listApiResult.get(0).getResourceType(), 0); + Assertions.assertTrue(listApiResult.get(0).getDisplayRole()); + Assertions.assertTrue(listApiResult.get(0).getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + listApiResult = roleUserController.roleUserList(RoleUserParam.builder() + .identityIds(Sets.newHashSet(429L)) + .identityType(IdentityType.PRACTITIONER) + .build()).getData(); + Assertions.assertEquals(listApiResult.size(), 2); + Assertions.assertEquals(listApiResult.get(0).getId(), 544687L); + Assertions.assertEquals(listApiResult.get(0).getIdentityId(), 429L); + Assertions.assertEquals(listApiResult.get(0).getIdentityType(), 3); + Assertions.assertEquals(listApiResult.get(0).getRoleId(), 100921L); + Assertions.assertEquals(listApiResult.get(0).getNaturalPersonId(), 5267L); + Assertions.assertEquals(listApiResult.get(0).getRoleName(), "查看组织架构"); + Assertions.assertEquals(listApiResult.get(0).getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT); + Assertions.assertEquals(listApiResult.get(0).getDescription(), "ff"); + Assertions.assertEquals(listApiResult.get(0).getCreateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getOuId(), 4L); + Assertions.assertEquals(listApiResult.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(listApiResult.get(0).getResourceId(), 0L); + Assertions.assertEquals(listApiResult.get(0).getResourceType(), 0); + Assertions.assertTrue(listApiResult.get(0).getDisplayRole()); + Assertions.assertTrue(listApiResult.get(0).getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + // old } } \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql index 940e40b1..de4d91a3 100644 --- a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql @@ -12,7 +12,7 @@ VALUES (101103, '超级管理员', '超级管理员', 'super_admin', 'zw_superad INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (100920, '工人管理', '', 'init', 'cms:zb_worker——management', -1, -1, 1, 2, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 4, 1); INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) -VALUES (100921, '查看组织架构', '', 'init', 'cms:zb_org_view', -1, -1, 1, 2, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 5, 1); +VALUES (100921, '查看组织架构', 'ff', 'init', 'cms:zb_org_view', -1, -1, 1, 2, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 5, 1); INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (100923, '查看合约', '', 'init', 'cms:zb_contact_view', -1, -1, 1, 2, 0, '2024-09-25 11:51:58', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 2, 1); @@ -33,7 +33,7 @@ VALUES (545048, 6, 100921, 3, 1827, 3, 4, 0, 0, 0, '2024-09-26 11:31:34', '2024- INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) VALUES (545301, 8, 100921, 3, 2107, 3, 4, 0, 0, 0, '2024-09-26 11:31:35', '2024-09-26 11:31:34', 0, 0, 2); INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) -VALUES (544214, 14, 100921, 3, 0, 3, 4, 0, 0, 0, '2024-09-26 11:31:32', '2024-09-26 11:31:32', 0, 0, 2); +VALUES (544214, 14, 100921, 3, 0, 3, 4, 0, 0, 0, '2024-09-26 11:31:32', '2024-09-26 11:31:32', 1, 2, 2); INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) VALUES (545447, 17, 100921, 3, 3135, 3, 4, 0, 0, 0, '2024-09-26 11:31:35', '2024-09-26 11:31:34', 0, 0, 2); INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) From 15ad4c99bef41b38d74b1cc79f72731e0823da92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Wed, 11 Dec 2024 14:51:07 +0800 Subject: [PATCH 08/25] =?UTF-8?q?feat:(REQ-3282)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2/RoleUserV2ControllerTest.java | 23 +++++++++++++++++++ .../mysql/RoleUserV2ControllerTest.sql | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java index d2f0fcd4..bb8e0ca6 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java @@ -405,6 +405,29 @@ class RoleUserV2ControllerTest extends BaseTest { Assertions.assertTrue(listApiResult.get(0).getEnabled()); Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + listApiResult = roleUserController.roleUserList(RoleUserParam.builder() + .roleIds(Sets.newHashSet(100923L)) + .build()).getData(); + Assertions.assertEquals(listApiResult.size(), 1); + Assertions.assertEquals(listApiResult.get(0).getId(), 544453L); + Assertions.assertEquals(listApiResult.get(0).getIdentityId(), 36L); + Assertions.assertEquals(listApiResult.get(0).getIdentityType(), 3); + Assertions.assertEquals(listApiResult.get(0).getRoleId(), 100923L); + Assertions.assertEquals(listApiResult.get(0).getNaturalPersonId(), 3470L); + Assertions.assertEquals(listApiResult.get(0).getRoleName(), "查看合约"); + Assertions.assertEquals(listApiResult.get(0).getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT); + Assertions.assertEquals(listApiResult.get(0).getDescription(), "dd"); + Assertions.assertEquals(listApiResult.get(0).getCreateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(listApiResult.get(0).getOuId(), 4L); + Assertions.assertEquals(listApiResult.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(listApiResult.get(0).getResourceId(), 0L); + Assertions.assertEquals(listApiResult.get(0).getResourceType(), 0); + Assertions.assertTrue(listApiResult.get(0).getDisplayRole()); + Assertions.assertTrue(listApiResult.get(0).getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 32)); // old } } \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql index de4d91a3..0c0771cc 100644 --- a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql @@ -14,7 +14,7 @@ VALUES (100920, '工人管理', '', 'init', 'cms:zb_worker——management', -1, INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (100921, '查看组织架构', 'ff', 'init', 'cms:zb_org_view', -1, -1, 1, 2, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 5, 1); INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) -VALUES (100923, '查看合约', '', 'init', 'cms:zb_contact_view', -1, -1, 1, 2, 0, '2024-09-25 11:51:58', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 2, 1); +VALUES (100923, '查看合约', 'dd', 'init', 'cms:zb_contact_view', -1, -1, 1, 2, 0, '2024-09-25 11:51:58', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 2, 1); INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) From c8d81b444f4bb6e6d71ebfbb330ed5a62296e26e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Wed, 11 Dec 2024 20:55:38 +0800 Subject: [PATCH 09/25] =?UTF-8?q?feat:(REQ-3282)=20=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E6=94=AF=E6=8C=81roleUserList=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/feign/enums/IdentityTypeEnum.java | 27 +++ .../axzo/tyr/feign/req/PageRoleUserReq.java | 25 ++- .../cn/axzo/tyr/feign/resp/RoleUserResp.java | 42 ++++ .../controller/v2/RoleUserV2Controller.java | 15 ++ .../v2/RoleUserV2ControllerTest.java | 208 +++++++++++++++++- .../mysql/RoleUserV2ControllerTest.sql | 6 - 6 files changed, 303 insertions(+), 20 deletions(-) create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/enums/IdentityTypeEnum.java diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/IdentityTypeEnum.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/IdentityTypeEnum.java new file mode 100644 index 00000000..ccbf816d --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/IdentityTypeEnum.java @@ -0,0 +1,27 @@ +package cn.axzo.tyr.feign.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 人员身份类型枚举 + * + * @author xuyaozuo + * @since 2022/5/9 21:59 + */ +@Getter +@AllArgsConstructor +public enum IdentityTypeEnum { + + /*人员身份类型*/ + NOT_SUPPORT(0, "NOT_SUPPORT", "无效类型"), + WORKER(1, "WORKER", "工人"), + WORKER_LEADER(2, "WORKER_LEADER", "班组长"), + PRACTITIONER(3, "PRACTITIONER", "从业人员"), + REGULATOR(4, "REGULATOR", "监管人员"), + OPERATOR(5, "OPERATOR", "运营人员"), + ; + private final Integer code; + private final String message; + private final String desc; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java index 495a8e76..c30e96b3 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java @@ -1,5 +1,6 @@ package cn.axzo.tyr.feign.req; +import cn.axzo.tyr.feign.enums.IdentityTypeEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; import lombok.AllArgsConstructor; import lombok.Builder; @@ -32,12 +33,12 @@ public class PageRoleUserReq { /** * 企业id */ - private Long ouId; + private Set ouIds; /** * 项目id */ - private Long workspaceId; + private Set workspaceIds; /** * 角色code @@ -65,6 +66,26 @@ public class PageRoleUserReq { */ private List workspaceOuPairs; + /** + * 是否需要角色信息 + */ + private Boolean needRole; + + /** + * 用户id + */ + private Set personIds; + + /** + * 身份id + */ + private Set identityIds; + + /** + * 身份类型 + */ + private IdentityTypeEnum identityType; + @Data @Builder @NoArgsConstructor diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java index 68064a29..3cb22ade 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java @@ -5,12 +5,25 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.Date; +import java.util.List; + @Data @Builder @NoArgsConstructor @AllArgsConstructor public class RoleUserResp { + /** + * 主键ID + */ + private Long id; + + /** + * 角色Id + */ + private Long roleId; + /** * 身份Id */ @@ -40,4 +53,33 @@ public class RoleUserResp { * 工作台Id */ private Long workspaceId; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + protected Date createAt; + + protected Date updateAt; + + /** + * 资源类型 + */ + private Integer resourceType; + + /** + * 资源Id + */ + private Long resourceId; + + /** + * 角色信息 + */ + private RoleResp role; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java index 629d9afe..21b1782e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java @@ -9,6 +9,7 @@ import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationParam; import cn.axzo.tyr.feign.api.RoleUserApi; import cn.axzo.tyr.feign.req.PageRoleUserReq; +import cn.axzo.tyr.feign.resp.RoleResp; import cn.axzo.tyr.feign.resp.RoleUserResp; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import com.google.common.collect.Lists; @@ -67,6 +68,9 @@ public class RoleUserV2Controller implements RoleUserApi { .build()) .collect(Collectors.toList())) .orElse(null)); + result.setPersonIds(Optional.ofNullable(req.getPersonIds()) + .map(Lists::newArrayList) + .orElse(null)); return result; } @@ -76,6 +80,17 @@ public class RoleUserV2Controller implements RoleUserApi { BeanUtils.copyProperties(saasRoleUserV2DTO, result); result.setPersonId(saasRoleUserV2DTO.getSaasRoleUser().getPersonId()); + + result.setRole(Optional.ofNullable(saasRoleUserV2DTO.getSaasRole()) + .map(e -> { + RoleResp role = RoleResp.builder().build(); + BeanUtils.copyProperties(e, role); + role.setRoleId(e.getId()); + role.setCooperateShipType(e.getProductUnitType()); + role.setOuId(e.getOwnerOuId()); + return role; + }) + .orElse(null)); return result; } } diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java index bb8e0ca6..3c24775b 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java @@ -13,6 +13,7 @@ import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserDTO; import cn.axzo.tyr.client.model.roleuser.dto.SuperAminInfoResp; import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; import cn.axzo.tyr.client.model.roleuser.req.SuperAdminParam; +import cn.axzo.tyr.feign.enums.IdentityTypeEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; import cn.axzo.tyr.feign.req.PageRoleUserReq; import cn.axzo.tyr.feign.resp.RoleUserResp; @@ -84,8 +85,8 @@ class RoleUserV2ControllerTest extends BaseTest { // old List data = roleUserV2Controller.page(PageRoleUserReq.builder() - .workspaceId(3L) - .ouId(4L) + .workspaceIds(Sets.newHashSet(3L)) + .ouIds(Sets.newHashSet(4L)) .roleTypes(Sets.newHashSet(RoleTypeEnum.SUPER_ADMIN)) .build()) .getData() @@ -99,8 +100,8 @@ class RoleUserV2ControllerTest extends BaseTest { data = roleUserV2Controller.page(PageRoleUserReq.builder() .roleIds(Sets.newHashSet(101100L)) - .workspaceId(3L) - .ouId(4L) + .workspaceIds(Sets.newHashSet(3L)) + .ouIds(Sets.newHashSet(4L)) .roleTypes(Sets.newHashSet(RoleTypeEnum.SUPER_ADMIN)) .build()) .getData() @@ -109,8 +110,8 @@ class RoleUserV2ControllerTest extends BaseTest { data = roleUserV2Controller.page(PageRoleUserReq.builder() .roleIds(Sets.newHashSet(101101L)) - .workspaceId(3L) - .ouId(4L) + .workspaceIds(Sets.newHashSet(3L)) + .ouIds(Sets.newHashSet(4L)) .build()) .getData() .getData(); @@ -124,8 +125,8 @@ class RoleUserV2ControllerTest extends BaseTest { data = roleUserV2Controller.page(PageRoleUserReq.builder() .roleIds(Sets.newHashSet(101100L)) .roleCodes(Sets.newHashSet("sdf")) - .workspaceId(3L) - .ouId(4L) + .workspaceIds(Sets.newHashSet(3L)) + .ouIds(Sets.newHashSet(4L)) .build()) .getData() .getData(); @@ -134,8 +135,8 @@ class RoleUserV2ControllerTest extends BaseTest { data = roleUserV2Controller.page(PageRoleUserReq.builder() .roleIds(Sets.newHashSet(101101L)) .roleCodes(Sets.newHashSet("sdf")) - .workspaceId(3L) - .ouId(4L) + .workspaceIds(Sets.newHashSet(3L)) + .ouIds(Sets.newHashSet(4L)) .build()) .getData() .getData(); @@ -144,8 +145,8 @@ class RoleUserV2ControllerTest extends BaseTest { data = roleUserV2Controller.page(PageRoleUserReq.builder() .roleIds(Sets.newHashSet(101101L)) .roleCodes(Sets.newHashSet("pro_superadmin")) - .workspaceId(3L) - .ouId(4L) + .workspaceIds(Sets.newHashSet(3L)) + .ouIds(Sets.newHashSet(4L)) .build()) .getData() .getData(); @@ -429,5 +430,188 @@ class RoleUserV2ControllerTest extends BaseTest { Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), LocalDateTime.of(2024, 9, 26, 11, 31, 32)); // old + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .needRole(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 13); + Assertions.assertEquals(data.get(0).getId(), 544214L); + Assertions.assertEquals(data.get(0).getIdentityId(), 14L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getPersonId(), 0L); + Assertions.assertEquals(data.get(0).getRole().getName(), "查看组织架构"); + Assertions.assertEquals(data.get(0).getRole().getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT.getValue()); + Assertions.assertEquals(data.get(0).getRole().getDescription(), "ff"); + Assertions.assertEquals(data.get(0).getCreateBy(), 1L); + Assertions.assertEquals(data.get(0).getUpdateBy(), 2L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getResourceId(), 0L); + Assertions.assertEquals(data.get(0).getResourceType(), 0); + Assertions.assertTrue(data.get(0).getRole().getIsDisplay()); + Assertions.assertTrue(data.get(0).getRole().getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 32)); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .needRole(true) + .workspaceIds(Sets.newHashSet(5L)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertEquals(data.get(0).getId(), 544688L); + Assertions.assertEquals(data.get(0).getIdentityId(), 429L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getPersonId(), 5267L); + Assertions.assertEquals(data.get(0).getRole().getName(), "查看组织架构"); + Assertions.assertEquals(data.get(0).getRole().getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT.getValue()); + Assertions.assertEquals(data.get(0).getRole().getDescription(), "ff"); + Assertions.assertEquals(data.get(0).getCreateBy(), 0L); + Assertions.assertEquals(data.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(data.get(0).getOuId(), 6L); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 5L); + Assertions.assertEquals(data.get(0).getResourceId(), 0L); + Assertions.assertEquals(data.get(0).getResourceType(), 0); + Assertions.assertTrue(data.get(0).getRole().getIsDisplay()); + Assertions.assertTrue(data.get(0).getRole().getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .needRole(true) + .workspaceIds(Sets.newHashSet(5L)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertEquals(data.get(0).getId(), 544688L); + Assertions.assertEquals(data.get(0).getIdentityId(), 429L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getPersonId(), 5267L); + Assertions.assertEquals(data.get(0).getRole().getName(), "查看组织架构"); + Assertions.assertEquals(data.get(0).getRole().getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT.getValue()); + Assertions.assertEquals(data.get(0).getRole().getDescription(), "ff"); + Assertions.assertEquals(data.get(0).getCreateBy(), 0L); + Assertions.assertEquals(data.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(data.get(0).getOuId(), 6L); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 5L); + Assertions.assertEquals(data.get(0).getResourceId(), 0L); + Assertions.assertEquals(data.get(0).getResourceType(), 0); + Assertions.assertTrue(data.get(0).getRole().getIsDisplay()); + Assertions.assertTrue(data.get(0).getRole().getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .needRole(true) + .ouIds(Sets.newHashSet(6L)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertEquals(data.get(0).getId(), 544688L); + Assertions.assertEquals(data.get(0).getIdentityId(), 429L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getPersonId(), 5267L); + Assertions.assertEquals(data.get(0).getRole().getName(), "查看组织架构"); + Assertions.assertEquals(data.get(0).getRole().getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT.getValue()); + Assertions.assertEquals(data.get(0).getRole().getDescription(), "ff"); + Assertions.assertEquals(data.get(0).getCreateBy(), 0L); + Assertions.assertEquals(data.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(data.get(0).getOuId(), 6L); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 5L); + Assertions.assertEquals(data.get(0).getResourceId(), 0L); + Assertions.assertEquals(data.get(0).getResourceType(), 0); + Assertions.assertTrue(data.get(0).getRole().getIsDisplay()); + Assertions.assertTrue(data.get(0).getRole().getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .needRole(true) + .personIds(Sets.newHashSet(5267L)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 2); + Assertions.assertEquals(data.get(0).getId(), 544687L); + Assertions.assertEquals(data.get(0).getIdentityId(), 429L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getPersonId(), 5267L); + Assertions.assertEquals(data.get(0).getRole().getName(), "查看组织架构"); + Assertions.assertEquals(data.get(0).getRole().getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT.getValue()); + Assertions.assertEquals(data.get(0).getRole().getDescription(), "ff"); + Assertions.assertEquals(data.get(0).getCreateBy(), 0L); + Assertions.assertEquals(data.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getResourceId(), 0L); + Assertions.assertEquals(data.get(0).getResourceType(), 0); + Assertions.assertTrue(data.get(0).getRole().getIsDisplay()); + Assertions.assertTrue(data.get(0).getRole().getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .needRole(true) + .identityIds(Sets.newHashSet(429L)) + .identityType(IdentityTypeEnum.PRACTITIONER) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 2); + Assertions.assertEquals(data.get(0).getId(), 544687L); + Assertions.assertEquals(data.get(0).getIdentityId(), 429L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getPersonId(), 5267L); + Assertions.assertEquals(data.get(0).getRole().getName(), "查看组织架构"); + Assertions.assertEquals(data.get(0).getRole().getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT.getValue()); + Assertions.assertEquals(data.get(0).getRole().getDescription(), "ff"); + Assertions.assertEquals(data.get(0).getCreateBy(), 0L); + Assertions.assertEquals(data.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getResourceId(), 0L); + Assertions.assertEquals(data.get(0).getResourceType(), 0); + Assertions.assertTrue(data.get(0).getRole().getIsDisplay()); + Assertions.assertTrue(data.get(0).getRole().getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 33)); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .needRole(true) + .roleIds(Sets.newHashSet(100923L)) + .build()) + .getData() + .getData(); + + Assertions.assertEquals(data.size(), 1); + Assertions.assertEquals(data.get(0).getId(), 544453L); + Assertions.assertEquals(data.get(0).getIdentityId(), 36L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getRoleId(), 100923L); + Assertions.assertEquals(data.get(0).getPersonId(), 3470L); + Assertions.assertEquals(data.get(0).getRole().getName(), "查看合约"); + Assertions.assertEquals(data.get(0).getRole().getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT.getValue()); + Assertions.assertEquals(data.get(0).getRole().getDescription(), "dd"); + Assertions.assertEquals(data.get(0).getCreateBy(), 0L); + Assertions.assertEquals(data.get(0).getUpdateBy(), 0L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getResourceId(), 0L); + Assertions.assertEquals(data.get(0).getResourceType(), 0); + Assertions.assertTrue(data.get(0).getRole().getIsDisplay()); + Assertions.assertTrue(data.get(0).getRole().getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 32)); } } \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql index 0c0771cc..c8c4a429 100644 --- a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql @@ -17,15 +17,9 @@ INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id VALUES (100923, '查看合约', 'dd', 'init', 'cms:zb_contact_view', -1, -1, 1, 2, 0, '2024-09-25 11:51:58', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 2, 1); -INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) -VALUES (197519, 28801, 3414, 3, 24510, 3, 4, 0, 0, 0, '2024-01-18 16:36:16', '2024-09-29 17:16:39', 0, 0, 2); -INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) -VALUES (183677, 40, 3415, 3, 2232, 8, 1, 0, 0, 0, '2023-10-06 15:13:35', '2024-09-29 17:16:39', 0, 0, 2); INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) VALUES (1157571, 40, 101101, 3, 2232, 8, 1, 0, 0, 0, '2024-09-27 09:39:49', '2024-09-27 09:39:48', 0, 0, 2); INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) -VALUES (197520, 28802, 24425, 3, 24511, 3, 4, 0, 0, 0, '2024-01-18 16:36:16', '2024-09-29 17:16:39', 0, 0, 2); -INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) VALUES (1157572, 40, 101101, 3, 2232, 3, 4, 0, 0, 0, '2024-09-27 09:39:49', '2024-09-27 09:39:48', 0, 0, 2); INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) From 21be080fb3d3944cf922db630087fdedf47ace0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Thu, 12 Dec 2024 16:30:49 +0800 Subject: [PATCH 10/25] =?UTF-8?q?feat:(feature/REQ-3282)=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=A4=9A=E4=BD=99=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=89=A9?= =?UTF-8?q?=E5=B1=95=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=94=AF=E6=8C=81roleUserListV2=E7=9B=B8=E5=85=B3=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/roleuser/dto/SaasRoleUserV2DTO.java | 19 + .../req/ListRoleUserRelationParam.java | 6 + .../axzo/tyr/feign/req/PageRoleUserReq.java | 87 ++++ .../server/controller/v2/RoleController.java | 70 +-- .../controller/v2/RoleGroupController.java | 12 +- .../controller/v2/RoleUserV2Controller.java | 68 ++- .../server/repository/dao/SaasFeatureDao.java | 3 - ...PageElementFeatureResourceRelationDao.java | 9 - .../dao/SaasRoleUserRelationDao.java | 17 - .../dao/impl/SaasFeatureDaoImpl.java | 10 - .../mapper/SaasFeatureResourceMapper.java | 6 - .../repository/mapper/SaasRoleMapper.java | 2 - .../service/PermissionPointService.java | 8 - .../server/service/SaasRoleUserService.java | 2 - .../service/WorkspaceProductService.java | 3 - .../impl/PermissionPointServiceImpl.java | 12 - .../server/service/impl/RoleServiceImpl.java | 1 + .../server/service/impl/RoleUserService.java | 34 -- .../impl/WorkspaceProductServiceImpl.java | 69 --- .../cn/axzo/tyr/server/util/IdPathUtil.java | 33 -- .../server/utils/mapper/DataObjectMapper.java | 8 - .../controller/v2/RoleControllerTest.java | 12 +- .../v2/RoleUserV2ControllerTest.java | 479 +++++++++++++++++- .../mysql/RoleUserV2ControllerTest.sql | 45 ++ 24 files changed, 696 insertions(+), 319 deletions(-) delete mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/util/IdPathUtil.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserV2DTO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserV2DTO.java index 50d5ed0b..f5462755 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserV2DTO.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserV2DTO.java @@ -157,6 +157,25 @@ public class SaasRoleUserV2DTO { private String roleCode; + private Date createAt; + + private Date updateAt; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 排序 + */ + private Integer sort; + /** * 角色权限 */ diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java index 8175fcb8..cf08c79c 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java @@ -41,12 +41,18 @@ public class ListRoleUserRelationParam { @CriteriaField(field = "resourceType", operator = Operator.EQ) private Integer resourceType; + @CriteriaField(field = "resourceType", operator = Operator.IN) + private Set resourceTypes; + /** * 资源Id */ @CriteriaField(field = "resourceId", operator = Operator.EQ) private Long resourceId; + @CriteriaField(field = "resourceId", operator = Operator.IN) + private Set resourceIds; + /** * 是否显示 */ diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java index c30e96b3..a6c0c637 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java @@ -1,5 +1,6 @@ package cn.axzo.tyr.feign.req; +import cn.axzo.tyr.feign.enums.FeatureResourceTypeEnum; import cn.axzo.tyr.feign.enums.IdentityTypeEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; import lombok.AllArgsConstructor; @@ -42,11 +43,13 @@ public class PageRoleUserReq { /** * 角色code + * 查询指定角色code对应的用户 */ private Set roleCodes; /** * 角色id + * 查询指定角色id对应的用户 */ private Set roleIds; @@ -57,6 +60,8 @@ public class PageRoleUserReq { * init:初始化内置角色-标准角色 * auto_own:虚拟角色(自定义权限使用) * common:自定义角色 + * + * 查询指定角色类型的用户 */ private Set roleTypes; @@ -86,6 +91,69 @@ public class PageRoleUserReq { */ private IdentityTypeEnum identityType; + /** + * 历史字段,资源类型 + */ + private Set resourceTypes; + + /** + * 历史字段,资源id + */ + private Set resourceIds; + + /** + * 是否显示 + * needRole = true时才有效,指定isDisplay值去查询对应的角色 + */ + private Boolean isDisplay; + + /** + * 是否启用 + * needRole = true时才有效,指定enabled值去查询对应的角色 + */ + private Boolean enabled; + + /** + * 是否需要用户信息:当前系统没有冗余名字,需要实时查询用户信息,比如名字 + */ + private Boolean needUsers; + + /** + * 菜单组件id + * needRole = true时才有效,根据指定featureResourceIds去查询角色关联的菜单组件等信息 + */ + private Set featureResourceIds; + + /** + * 是否需要角色跟菜单组件的关联关系,不查询具体的菜单组件信息 + * needRole = true时才有效 + */ + private Boolean needFeatureResourceRelation; + + /** + * 是否需要角色关联的菜单组件信息,saas_feature_recource的记录 + * needRole = true时才有效 + */ + private Boolean needFeatureResources; + + /** + * needFeatureResourceRelation 或者 needFeatureResources = true时,根据指定的featureResourceTypes去过滤数据 + * 需要 needRole = true 且 needFeatureResourceRelation 或者 needFeatureResources = true时,才有效才会生效 + */ + private Set featureResourceTypes; + + /** + * needFeatureResourceRelation 或者 needFeatureResources = true时,根据指定的featureResourceTypes去过滤数据 + * 目前只有CMS端的新版本才冗余了端 + * 需要 needRole = true 且 needFeatureResourceRelation 或者 needFeatureResources = true时,才有效才会生效 + */ + private String terminal; + + /** + * 批量配对的查询用户 + */ + private Set batchPersons; + @Data @Builder @NoArgsConstructor @@ -101,4 +169,23 @@ public class PageRoleUserReq { */ private Long ouId; } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class BatchPerson { + private Long identityId; + + /** + * 身份类型 1:工人 2:班组长 3:从业人员 4:监管人员 5:运营人员 + */ + private Integer identityType; + + private Long workspaceId; + + private Long ouId; + + private Long personId; + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java index 5b981587..63ff3f1b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleController.java @@ -2,10 +2,7 @@ package cn.axzo.tyr.server.controller.v2; import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.result.ApiResult; -import cn.axzo.tyr.client.common.enums.FeatureResourceType; -import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; import cn.axzo.tyr.client.model.res.SaasRoleRes; -import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.feign.api.RoleApi; import cn.axzo.tyr.feign.enums.RoleTypeEnum; import cn.axzo.tyr.feign.req.PageRoleReq; @@ -15,7 +12,8 @@ import cn.axzo.tyr.feign.resp.RoleGroupResp; import cn.axzo.tyr.feign.resp.RoleResp; import cn.axzo.tyr.feign.resp.RoleUserResp; import cn.axzo.tyr.server.service.RoleService; -import com.google.common.collect.Lists; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -23,6 +21,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; +import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -48,19 +47,9 @@ public class RoleController implements RoleApi { } private cn.axzo.tyr.client.model.req.PageRoleReq from(PageRoleReq req) { - cn.axzo.tyr.client.model.req.PageRoleReq result = cn.axzo.tyr.client.model.req.PageRoleReq.builder().build(); - BeanUtils.copyProperties(req, result); - result.setRoleIds(Optional.ofNullable(req.getRoleIds()) - .map(Lists::newArrayList) - .orElse(null)); - result.setWorkspaceIds(Optional.ofNullable(req.getWorkspaceIds()) - .map(Lists::newArrayList) - .orElse(null)); - - result.setOuIds(Optional.ofNullable(req.getOuIds()) - .map(Lists::newArrayList) - .orElse(null)); + cn.axzo.tyr.client.model.req.PageRoleReq result = JSON.parseObject(JSON.toJSONString(req), + cn.axzo.tyr.client.model.req.PageRoleReq.class); result.setRoleTypes(Optional.ofNullable(req.getRoleTypes()) .map(e -> e.stream() @@ -68,28 +57,11 @@ public class RoleController implements RoleApi { .collect(Collectors.toList())) .orElse(null)); - result.setWorkspaceOuPairs(Optional.ofNullable(req.getWorkspaceOuPairs()) - .map(e -> e.stream() - .map(pair -> { - ListRoleUserRelationParam.WorkspaceOuPair workspaceOuPair = ListRoleUserRelationParam.WorkspaceOuPair.builder() - .build(); - BeanUtils.copyProperties(pair, workspaceOuPair); - return workspaceOuPair; - }) - .collect(Collectors.toList())) - .orElse(null)); - result.setProductUnitTypes(req.getCooperateShipTypes()); result.setNeedPermission(req.getNeedFeatureResources()); result.setNeedPermissionRelation(req.getNeedFeatureResourceRelation()); - - result.setFeatureResourceTypes(Optional.ofNullable(req.getFeatureResourceTypes()) - .map(e -> e.stream() - .map(f -> FeatureResourceType.valueOf(f.name())) - .collect(Collectors.toList())) - .orElse(null)); return result; } @@ -98,19 +70,9 @@ public class RoleController implements RoleApi { return; } - roleResp.setRoleFeatureResources(saasRoleRes.getSaasPermissions().stream() - .map(permission -> { - RoleFeatureResourceResp roleFeatureResourceResp = RoleFeatureResourceResp.builder().build(); - BeanUtils.copyProperties(permission, roleFeatureResourceResp); - roleFeatureResourceResp.setTags(Optional.ofNullable(permission.getTags()) - .map(tags -> tags.stream() - .map(RolePermissionTagEnum::getDesc) - .collect(Collectors.toSet()) - ) - .orElse(null)); - return roleFeatureResourceResp; - }) - .collect(Collectors.toList())); + List roleFeatureResources = JSONArray.parseArray(JSON.toJSONString(saasRoleRes.getSaasPermissions()), + RoleFeatureResourceResp.class); + roleResp.setRoleFeatureResources(roleFeatureResources); } private void assembleRoleGroup(SaasRoleRes saasRoleRes, RoleResp roleResp) { @@ -161,19 +123,9 @@ public class RoleController implements RoleApi { return; } - roleResp.setFeatureResourceRelations(saasRoleRes.getPermissionRelations().stream() - .map(saasPermissionRelationRes -> { - FeatureResourceRelationResp featureResourceRelationResp = FeatureResourceRelationResp.builder().build(); - BeanUtils.copyProperties(saasPermissionRelationRes, featureResourceRelationResp); - featureResourceRelationResp.setTags(Optional.ofNullable(saasPermissionRelationRes.getTags()) - .map(tags -> tags.stream() - .map(RolePermissionTagEnum::getDesc) - .collect(Collectors.toSet()) - ) - .orElse(null)); - return featureResourceRelationResp; - }) - .collect(Collectors.toList())); + List resourceRelationResps = JSONArray.parseArray(JSON.toJSONString(saasRoleRes.getPermissionRelations()), + FeatureResourceRelationResp.class); + roleResp.setFeatureResourceRelations(resourceRelationResps); } private RoleResp from(SaasRoleRes saasRoleRes) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java index ad1cd12e..e245410e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java @@ -2,7 +2,6 @@ package cn.axzo.tyr.server.controller.v2; import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.result.ApiResult; -import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.req.PageSaasRoleGroupParam; import cn.axzo.tyr.client.model.res.SaasRoleGroupDTO; import cn.axzo.tyr.feign.api.RoleGroupApi; @@ -10,13 +9,13 @@ import cn.axzo.tyr.feign.req.PageRoleGroupReq; import cn.axzo.tyr.feign.resp.RoleGroupResp; import cn.axzo.tyr.feign.resp.RoleResp; import cn.axzo.tyr.server.service.SaasRoleGroupService; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; -import java.util.Optional; import java.util.stream.Collectors; @Slf4j @@ -42,14 +41,7 @@ public class RoleGroupController implements RoleGroupApi { } private PageSaasRoleGroupParam from(PageRoleGroupReq req) { - PageSaasRoleGroupParam result = PageSaasRoleGroupParam.builder().build(); - BeanUtils.copyProperties(req, result); - result.setRoleTypes(Optional.ofNullable(req.getRoleTypes()) - .map(e -> e.stream() - .map(roleType -> RoleTypeEnum.valueOf(roleType.name())) - .collect(Collectors.toSet())) - .orElse(null)); - return result; + return JSON.parseObject(JSON.toJSONString(req), PageSaasRoleGroupParam.class); } private RoleGroupResp from(SaasRoleGroupDTO saasRoleGroupDTO) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java index 21b1782e..1f88aec4 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java @@ -3,17 +3,21 @@ package cn.axzo.tyr.server.controller.v2; import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.result.ApiResult; -import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; -import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationParam; import cn.axzo.tyr.feign.api.RoleUserApi; import cn.axzo.tyr.feign.req.PageRoleUserReq; +import cn.axzo.tyr.feign.resp.FeatureResourceRelationResp; +import cn.axzo.tyr.feign.resp.RoleFeatureResourceResp; import cn.axzo.tyr.feign.resp.RoleResp; import cn.axzo.tyr.feign.resp.RoleUserResp; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; @@ -21,6 +25,8 @@ import org.springframework.web.bind.annotation.RestController; import java.util.Optional; import java.util.stream.Collectors; +import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE; + @Slf4j @RestController public class RoleUserV2Controller implements RoleUserApi { @@ -44,33 +50,22 @@ public class RoleUserV2Controller implements RoleUserApi { } private PageRoleUserRelationParam from(PageRoleUserReq req) { - PageRoleUserRelationParam result = PageRoleUserRelationParam.builder().build(); + PageRoleUserRelationParam result = JSON.parseObject(JSON.toJSONString(req), + PageRoleUserRelationParam.class); - BeanUtils.copyProperties(req, result); - - result.setNeedUsers(true); - - result.setRoleTypes(Optional.ofNullable(req.getRoleTypes()) - .map(e -> e.stream() - .map(roleType -> RoleTypeEnum.valueOf(roleType.name())) - .collect(Collectors.toSet())) - .orElse(null)); - - result.setRoleIds(Optional.ofNullable(req.getRoleIds()) + result.setFeatureIds(Optional.ofNullable(req.getFeatureResourceIds()) .map(Lists::newArrayList) .orElse(null)); - result.setWorkspaceOuPairs(Optional.ofNullable(req.getWorkspaceOuPairs()) - .map(e -> e.stream() - .map(f -> ListRoleUserRelationParam.WorkspaceOuPair.builder() - .workspaceId(f.getWorkspaceId()) - .ouId(f.getOuId()) - .build()) - .collect(Collectors.toList())) - .orElse(null)); - result.setPersonIds(Optional.ofNullable(req.getPersonIds()) - .map(Lists::newArrayList) - .orElse(null)); + result.setNeedPermission(req.getNeedFeatureResources()); + + result.setNeedPermissionRelation(req.getNeedFeatureResourceRelation()); + + // 因为关联关系存在关联featureResource和feature两个表,且有冲突,用type区分的,只有type = NEW_FEATURE的数据补了端 + // 这个type对外不可知,也是临时的,后续只能关联featureResource,所以这里如果有terminal,则自动补上type = NEW_FEATURE + if (StringUtils.isNotBlank(req.getTerminal())) { + result.setType(NEW_FEATURE); + } return result; } @@ -80,6 +75,7 @@ public class RoleUserV2Controller implements RoleUserApi { BeanUtils.copyProperties(saasRoleUserV2DTO, result); result.setPersonId(saasRoleUserV2DTO.getSaasRoleUser().getPersonId()); + result.setRealName(saasRoleUserV2DTO.getSaasRoleUser().getRealName()); result.setRole(Optional.ofNullable(saasRoleUserV2DTO.getSaasRole()) .map(e -> { @@ -88,9 +84,31 @@ public class RoleUserV2Controller implements RoleUserApi { role.setRoleId(e.getId()); role.setCooperateShipType(e.getProductUnitType()); role.setOuId(e.getOwnerOuId()); + + assembleRoleFeatureResource(e, role); + + assembleFeatureResourceRelation(e, role); return role; }) .orElse(null)); return result; } + + private void assembleRoleFeatureResource(SaasRoleUserV2DTO.SaasRole fromSaasRole, RoleResp roleResp) { + if (CollectionUtils.isEmpty(fromSaasRole.getSaasPermissions())) { + return; + } + roleResp.setRoleFeatureResources(JSONArray.parseArray(JSON.toJSONString(fromSaasRole.getSaasPermissions()), + RoleFeatureResourceResp.class)); + } + + private void assembleFeatureResourceRelation(SaasRoleUserV2DTO.SaasRole saasRoleRes, RoleResp roleResp) { + + if (CollectionUtils.isEmpty(saasRoleRes.getPermissionRelations())) { + return; + } + + roleResp.setFeatureResourceRelations(JSONArray.parseArray(JSON.toJSONString(saasRoleRes.getPermissionRelations()), + FeatureResourceRelationResp.class)); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureDao.java index 7e0f92bc..b07ba585 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureDao.java @@ -18,7 +18,6 @@ public interface SaasFeatureDao extends IService { void updateChildrenPath(Long updater, String pathPrefix, String newPathPrefix); - List listByParentId(Long parentId); void updateSort(Long permissionId, int switchIndex); @@ -31,7 +30,5 @@ public interface SaasFeatureDao extends IService { List getChildByParentId(Long parentId); - List listAllFeature(); - List listAllFeatureByTerminal(String terminal); } \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPageElementFeatureResourceRelationDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPageElementFeatureResourceRelationDao.java index a1b0cacc..4f22a81e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPageElementFeatureResourceRelationDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPageElementFeatureResourceRelationDao.java @@ -58,13 +58,4 @@ public class SaasPageElementFeatureResourceRelationDao extends ServiceImpl queryByPersonId(Long personId, Long workspaceId, Long ouId) { - return this.lambdaQuery() - .eq(SaasRoleUserRelation::getNaturalPersonId, personId) - .eq(null != workspaceId, SaasRoleUserRelation::getWorkspaceId, workspaceId) - .eq(null != ouId, SaasRoleUserRelation::getOuId, ouId) - .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) - .list(); - } - - - public void deleteByRoleId(List roleId) { - lambdaUpdate() - .in(SaasRoleUserRelation::getRoleId,roleId) - .set(BaseEntity::getIsDelete,TableIsDeleteEnum.DELETE.value) - .update(); - } - public void deleteById(List ids) { if (CollUtil.isEmpty(ids)) { return; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/impl/SaasFeatureDaoImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/impl/SaasFeatureDaoImpl.java index a87b1875..32223bda 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/impl/SaasFeatureDaoImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/impl/SaasFeatureDaoImpl.java @@ -28,11 +28,6 @@ public class SaasFeatureDaoImpl extends ServiceImpl listByParentId(Long parentId) { - return this.baseMapper.selectList(new LambdaQueryWrapper().eq(SaasFeature::getParentId, parentId)); - } - @Override public void updateSort(Long permissionId, int sort) { this.update(new LambdaUpdateWrapper().set(SaasFeature::getSort, sort).eq(SaasFeature::getId, permissionId)); @@ -61,11 +56,6 @@ public class SaasFeatureDaoImpl extends ServiceImpl listAllFeature() { - return lambdaQuery().eq(BaseEntity::getIsDelete, 0).list(); - } - @Override public List listAllFeatureByTerminal(String terminal) { return lambdaQuery() diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java index 37c03d23..cae6288d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java @@ -2,8 +2,6 @@ package cn.axzo.tyr.server.repository.mapper; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Update; /** *

@@ -15,8 +13,4 @@ import org.apache.ibatis.annotations.Update; */ public interface SaasFeatureResourceMapper extends BaseMapper { - @Update("UPDATE saas_feature_resource" + - " SET path = REPLACE(path, #{oldPath}, #{newPath})" + - " WHERE is_delete = 0 AND path LIKE CONCAT(#{oldPath}, '%')") - void replacePath(@Param("oldPath") String oldPath, @Param("newPath") String newPath); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java index eb4a7aff..8b7380ad 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java @@ -25,8 +25,6 @@ public interface SaasRoleMapper extends BaseMapper { Page pageQueryForOUWorkspace(IPage page, Long ouId, Long workspaceId, Integer workspaceJoinType, Integer superAdminWorkspaceType); - List listForOUWorkspace(Long ouId, Long workspaceId, Integer workspaceJoinType); - List listFeatureByIds(@Param("roleIds") Set roleIds, @Param("featureIds") Set featureIds); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionPointService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionPointService.java index 1a543d3f..b95fdab2 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionPointService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionPointService.java @@ -51,14 +51,6 @@ public interface PermissionPointService { List queryList(PermissionPointListQueryRequest request); - /** - * 指定条件查询出子级的所以父级 - * 并将父级平铺返回 - * @param request - * @return - */ - List listTreeNodesFlatChild(PermissionPointTreeQueryReq request); - /** 根据code查询权限点, terminal可为空 **/ List listNodeWithChildrenByCode(String featureCode, String terminal); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java index cb2965a8..1847e30b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java @@ -42,8 +42,6 @@ public interface SaasRoleUserService { */ List batchSuperAdminList(List param); - List listByRoleIds(List roleIds, Long ouId, Long workspaceId); - /** * 删除单位参与的工作台的所有的人员与角色。 目前主要是用于移除参与单位的地方 */ diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java index b84067c0..fa7d2df5 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java @@ -14,9 +14,6 @@ import java.util.Set; public interface WorkspaceProductService { - - List listWorkspaceProduct(WorkspaceProductParam param); - /** * 从缓存中查询项目的产品 * @param param diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionPointServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionPointServiceImpl.java index ac20abdb..7806bd86 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionPointServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionPointServiceImpl.java @@ -659,18 +659,6 @@ public class PermissionPointServiceImpl implements PermissionPointService { return node; } - - @Override - public List listTreeNodesFlatChild(PermissionPointTreeQueryReq request) { - List permissionPointTreeNodes = listTreeNodes(request); - //将树型结构打平 - return permissionPointTreeNodes.stream().map(e -> { - e.flatChildren(); - return e.getChildren(); - }).flatMap(List::stream).collect(Collectors.toList()); - - } - @Override public List listNodeWithChildrenByCode(String featureCode, String terminal) { return listNodeWithChildrenByCodes(Collections.singletonList(featureCode), terminal); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 5c0f7d66..de446f10 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -1558,6 +1558,7 @@ public class RoleServiceImpl extends ServiceImpl .featureIds(param.getFeatureIds()) .terminal(param.getTerminal()) .type(NEW_FEATURE) + .featureResourceTypes(param.getFeatureResourceTypes()) .build()) .stream() .filter(e -> CollectionUtils.isNotEmpty(e.getPgroupPermissionRelations())) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java index be98ed25..242476ef 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java @@ -367,29 +367,6 @@ public class RoleUserService implements SaasRoleUserService { .eq(SaasRoleUserRelation::getOuId, ouId)); } - private SaasRole findSuperAdmin(Long workspaceId, Long ouId, Integer workspaceType) { - //优先取租户超管 没有再取标准角色超管 - //租户超管 - return saasRoleDao - .findRoleByTypeAndWorkspaceIdAndOuId(RoleTypeEnum.SUPER_ADMIN.getValue(), - workspaceId, ouId); -// if (superAdmin != null) { -// return superAdmin; -// } - //标准角超管 -// String superAdminCode = superAdminCodes.get(workspaceType); -// if (StrUtil.isBlank(superAdminCode)) { -// throw new ServiceException("租户类型[" + workspaceType + "]未配置超管编码"); -// } -// return saasRoleDao.lambdaQuery().eq(SaasRole::getRoleCode, superAdminCode).one(); - } - - private void checkRoleName(String name, Long workspaceId, Long ouId) { - List saasRoles = saasRoleDao.listCommonRoleByNameAndWorkspaceIdAndOuId(name, - workspaceId, ouId); - AssertUtil.isEmpty(saasRoles, "已存在相同的角色名称,请更换角色名称"); - } - @Override public List batchSuperAdminList(List param) { // 兼容上线历史数据还没清洗的间隙,查询超管角色需要根据workspaceId和预设的超管一起 @@ -467,17 +444,6 @@ public class RoleUserService implements SaasRoleUserService { }).collect(Collectors.toList()); } - @Override - public List listByRoleIds(List roleIds, Long ouId, Long workspaceId) { - if (CollectionUtil.isEmpty(roleIds)) { - return new ArrayList<>(); - } - return roleUserRelationDao.list(new LambdaQueryWrapper() - .eq(Objects.nonNull(ouId), SaasRoleUserRelation::getOuId, ouId) - .eq(Objects.nonNull(workspaceId), SaasRoleUserRelation::getWorkspaceId, workspaceId) - .in(SaasRoleUserRelation::getRoleId, roleIds)); - } - @Override @Transactional(rollbackFor = Exception.class) public void removeWorkspaceOuAllUserRole(Long workspaceId, Long ouId) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java index 0c3b6463..5ba05c20 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java @@ -66,75 +66,6 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService { private static final String WORKSPACE_PRODUCT_KEY = "workspace:product"; - @Override - public List listWorkspaceProduct(WorkspaceProductParam param) { - - if (CollectionUtils.isEmpty(param.getWorkspaceIds())) { - return Collections.emptyList(); - } - - List servicePkgDetailRes = RpcInternalUtil.rpcListProcessor(() -> servicePkgClient.getServicePkgDetailBySpaceId(param.getWorkspaceIds()), - "查询项目的产品", param.getWorkspaceIds()).getData(); - if (CollectionUtil.isEmpty(servicePkgDetailRes)) { - return Collections.emptyList(); - } - - Set productIds = servicePkgDetailRes.stream() - .map(ServicePkgDetailRes::getProducts) - .filter(CollectionUtil::isNotEmpty) - .flatMap(List::stream) - .map(ServicePkgProduct::getProductId) - .collect(Collectors.toSet()); - if (CollectionUtil.isEmpty(productIds)) { - log.warn("no product found for workspace :{}", param.getWorkspaceIds()); - return Collections.emptyList(); - } - - // 已被删除产品过滤一层 - productIds = productModuleDao.listByIds(productIds) - .stream() - .filter(productModule -> Objects.equals(productModule.getIsDelete(),0L)) - .map(BaseEntity::getId) - .collect(Collectors.toSet()); - if (CollectionUtil.isEmpty(productIds)) { - log.warn("all product is deleted for workspace :{}", param.getWorkspaceIds()); - return Collections.emptyList(); - } - - ProductFeatureQuery productFeatureQuery = ProductFeatureQuery.builder() - .productIds(productIds) - .featureResourceTypes(param.getFeatureResourceTypes()) - .terminal(param.getTerminal()) - .type(param.getType()) - .featureIdPairs(param.getFeatureIdPairs()) - .build(); - Map> saasProductModuleFeatureRelations = productFeatureRelationService.queryOnCondition(productFeatureQuery).stream() - .collect(Collectors.groupingBy(SaasProductModuleFeatureRelation::getProductModuleId)); - - return servicePkgDetailRes.stream() - .filter(e -> CollectionUtils.isNotEmpty(e.getProducts())) - .map(e -> { - List features = e.getProducts().stream() - .map(product -> saasProductModuleFeatureRelations.get(product.getProductId())) - .filter(Objects::nonNull) - .flatMap(Collection::stream) - .collect(Collectors.toList()); - return Pair.of(e.getSpaceId(), features); - }) - // 考虑一个项目有多个服务包的情况 - .collect(Collectors.toMap(Pair::getKey, Pair::getValue, (f, s) -> { - f.addAll(s); - return f; - })) - .entrySet() - .stream() - .map(e -> WorkspaceProduct.builder() - .workspaceId(e.getKey()) - .saasProductModuleFeatureRelations(e.getValue()) - .build()) - .collect(Collectors.toList()); - } - @Override public List listWorkspaceProductCached(WorkspaceProductParam param) { if (CollectionUtils.isEmpty(param.getWorkspaceIds())) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/util/IdPathUtil.java b/tyr-server/src/main/java/cn/axzo/tyr/server/util/IdPathUtil.java deleted file mode 100644 index 249b733d..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/util/IdPathUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.axzo.tyr.server.util; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collectors; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class IdPathUtil { - - private static final String PATH_SPLIT = "/"; - - public static Set featurePathsToIds(Set paths) { - if (CollectionUtils.isEmpty(paths)) { - return Collections.emptySet(); - } - return paths.stream().map(e -> { - String[] split = e.split(PATH_SPLIT); - return Arrays.stream(split).filter(StringUtils::hasText).map(Long::parseLong) - .collect(Collectors.toSet()); - }).reduce(new HashSet<>(), (a, b) -> { - a.addAll(b); - return a; - }); - } - -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/utils/mapper/DataObjectMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/utils/mapper/DataObjectMapper.java index 491de5d4..aa97f4fb 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/utils/mapper/DataObjectMapper.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/utils/mapper/DataObjectMapper.java @@ -5,7 +5,6 @@ import cn.axzo.tyr.client.model.data.object.AttributePermissionBO; import cn.axzo.tyr.client.model.data.object.DataObjectRuleBO; import cn.axzo.tyr.client.model.data.object.DefaultDataObjectRuleBO; import cn.axzo.tyr.client.model.req.CreateDataObjectReq; -import cn.axzo.tyr.client.model.req.EditDataObjectReq; import cn.axzo.tyr.client.model.res.DataObjectRes; import cn.axzo.tyr.server.repository.entity.DataObject; import cn.axzo.tyr.server.repository.entity.DataObjectAttr; @@ -20,7 +19,6 @@ import org.mapstruct.Named; import org.mapstruct.factory.Mappers; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; @Mapper @@ -30,8 +28,6 @@ public interface DataObjectMapper { DataObject createReq2DataObject(CreateDataObjectReq req); - DataObject editReq2DataObject(EditDataObjectReq req); - DataObjectRes dataObject2DataObjectRes(DataObject req); DataObjectAttr attributeBO2DataObjectAttr(AttributeBO bo); @@ -67,12 +63,8 @@ public interface DataObjectMapper { List defaultRuleBOs2Rules(List bo); - List rules2defaultRuleBOs(List bo); - List ruleBOs2Rules(List bo); - List rules2RuleBOs(List bo); - List ruleAttrs2AttrPermissionBOs(List bo); @Named("mapRelationId2RuleScope") diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java index d6710be3..1e4b68d9 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleControllerTest.java @@ -159,31 +159,31 @@ class RoleControllerTest extends BaseTest { Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getId(), 153L); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getUniCode(), "oms:menu_page"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getTags().size(), 1); - Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(0).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(0).getTags().contains(RolePermissionTagEnum.JOINED.name())); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(0).getTerminal(), "NT_OMS_WEB"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getId(), 466L); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getUniCode(), "oms:imConfig_page"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getTags().size(), 1); - Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(1).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(1).getTags().contains(RolePermissionTagEnum.JOINED.name())); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(1).getTerminal(), "NT_OMS_WEB"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getId(), 467L); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getUniCode(), "oms:im_robot_page"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getTags().size(), 1); - Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(2).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(2).getTags().contains(RolePermissionTagEnum.JOINED.name())); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(2).getTerminal(), "NT_OMS_WEB"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getId(), 469L); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getUniCode(), "oms:msgPush_page"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getTags().size(), 1); - Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(3).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(3).getTags().contains(RolePermissionTagEnum.JOINED.name())); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(3).getTerminal(), "NT_OMS_WEB"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getId(), 693L); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getUniCode(), "oms:detail_backPay_btn"); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getTags().size(), 1); - Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(4).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); + Assertions.assertTrue(roleResps.get(0).getRoleFeatureResources().get(4).getTags().contains(RolePermissionTagEnum.JOINED.name())); Assertions.assertEquals(roleResps.get(0).getRoleFeatureResources().get(4).getTerminal(), "NT_OMS_WEB"); @@ -270,7 +270,7 @@ class RoleControllerTest extends BaseTest { Assertions.assertEquals(roleResps.get(0).getFeatureResourceRelations().get(0).getType(), 1); Assertions.assertEquals(roleResps.get(0).getFeatureResourceRelations().get(0).getFeatureType(), 2); Assertions.assertEquals(roleResps.get(0).getFeatureResourceRelations().get(0).getTags().size(), 1); - Assertions.assertTrue(roleResps.get(0).getFeatureResourceRelations().get(0).getTags().contains(RolePermissionTagEnum.JOINED.getDesc())); + Assertions.assertTrue(roleResps.get(0).getFeatureResourceRelations().get(0).getTags().contains(RolePermissionTagEnum.JOINED.name())); roleResps = roleController.page(PageRoleReq.builder() diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java index 3c24775b..2610370d 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java @@ -5,19 +5,24 @@ import cn.axzo.apollo.workspace.api.workspace.WorkspaceApi; import cn.axzo.apollo.workspace.api.workspace.res.SimpleWorkspaceRes; import cn.axzo.basics.profiles.api.UserProfileServiceApi; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; -import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserDTO; +import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import cn.axzo.tyr.client.model.roleuser.dto.SuperAminInfoResp; +import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; import cn.axzo.tyr.client.model.roleuser.req.SuperAdminParam; +import cn.axzo.tyr.feign.enums.FeatureResourceTypeEnum; import cn.axzo.tyr.feign.enums.IdentityTypeEnum; +import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; import cn.axzo.tyr.feign.req.PageRoleUserReq; import cn.axzo.tyr.feign.resp.RoleUserResp; import cn.axzo.tyr.server.controller.roleuser.RoleUserController; +import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import cn.axzo.tyr.server.service.SaasRoleUserService; import cn.azxo.framework.common.model.CommonResponse; import com.google.common.collect.Lists; @@ -33,6 +38,8 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.util.List; +import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE; + class RoleUserV2ControllerTest extends BaseTest { @Autowired private MysqlDataLoader mysqlDataLoader; @@ -46,6 +53,8 @@ class RoleUserV2ControllerTest extends BaseTest { private UserProfileServiceApi userProfileServiceApi; @Autowired private RoleUserController roleUserController; + @Autowired + private SaasRoleUserRelationService saasRoleUserRelationService; @BeforeEach @Override @@ -65,7 +74,7 @@ class RoleUserV2ControllerTest extends BaseTest { List personProfileDtos = org.assertj.core.util.Lists.newArrayList(); PersonProfileDto personProfileDto = new PersonProfileDto(); - personProfileDto.setId(24510L); + personProfileDto.setId(2232L); personProfileDto.setRealName("测试名字"); personProfileDtos.add(personProfileDto); Mockito.when(userProfileServiceApi.postPersonProfiles(Mockito.any())) @@ -97,6 +106,23 @@ class RoleUserV2ControllerTest extends BaseTest { Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); Assertions.assertEquals(data.get(0).getOuId(), 4L); Assertions.assertEquals(data.get(0).getPersonId(), 2232L); + Assertions.assertNull(data.get(0).getRealName()); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .workspaceIds(Sets.newHashSet(3L)) + .ouIds(Sets.newHashSet(4L)) + .roleTypes(Sets.newHashSet(RoleTypeEnum.SUPER_ADMIN)) + .needUsers(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertEquals(data.get(0).getIdentityId(), 40L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getPersonId(), 2232L); + Assertions.assertEquals(data.get(0).getRealName(), "测试名字"); data = roleUserV2Controller.page(PageRoleUserReq.builder() .roleIds(Sets.newHashSet(101100L)) @@ -453,7 +479,7 @@ class RoleUserV2ControllerTest extends BaseTest { Assertions.assertEquals(data.get(0).getResourceType(), 0); Assertions.assertTrue(data.get(0).getRole().getIsDisplay()); Assertions.assertTrue(data.get(0).getRole().getEnabled()); - Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), LocalDateTime.of(2024, 9, 26, 11, 31, 32)); data = roleUserV2Controller.page(PageRoleUserReq.builder() @@ -613,5 +639,452 @@ class RoleUserV2ControllerTest extends BaseTest { Assertions.assertTrue(data.get(0).getRole().getEnabled()); Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), LocalDateTime.of(2024, 9, 26, 11, 31, 32)); + + // old + + List saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .resourceType(1) + .build()); + Assertions.assertTrue(saasRoleUsers.isEmpty()); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .resourceType(0) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 13); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .resourceId(1L) + .build()); + Assertions.assertTrue(saasRoleUsers.isEmpty()); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .resourceId(0L) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 13); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .isDisplay(true) + .needRole(true) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 13); + Assertions.assertNotNull(saasRoleUsers.get(0).getSaasRole()); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .isDisplay(false) + .needRole(true) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 13); + Assertions.assertNull(saasRoleUsers.get(0).getSaasRole()); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .enabled(true) + .needRole(true) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 13); + Assertions.assertNotNull(saasRoleUsers.get(0).getSaasRole()); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .enabled(false) + .needRole(true) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 13); + Assertions.assertNull(saasRoleUsers.get(0).getSaasRole()); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityId(17L) + .needRole(true) + .needPermissionRelation(true) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 1); + Assertions.assertNotNull(saasRoleUsers.get(0).getSaasRole()); + Assertions.assertEquals(saasRoleUsers.get(0).getSaasRole().getPermissionRelations().size(), 3); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .featureIds(Lists.newArrayList(101744L)) + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityId(17L) + .needRole(true) + .needPermissionRelation(true) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 1); + Assertions.assertNotNull(saasRoleUsers.get(0).getSaasRole()); + Assertions.assertEquals(saasRoleUsers.get(0).getSaasRole().getPermissionRelations().size(), 1); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityId(17L) + .needRole(true) + .needPermissionRelation(true) + .featureResourceTypes(Lists.newArrayList(FeatureResourceType.PAGE)) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 1); + Assertions.assertNotNull(saasRoleUsers.get(0).getSaasRole()); + Assertions.assertNull(saasRoleUsers.get(0).getSaasRole().getPermissionRelations()); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityId(17L) + .needRole(true) + .needPermissionRelation(true) + .featureResourceTypes(Lists.newArrayList(FeatureResourceType.COMPONENT)) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 1); + Assertions.assertNotNull(saasRoleUsers.get(0).getSaasRole()); + Assertions.assertEquals(saasRoleUsers.get(0).getSaasRole().getPermissionRelations().size(), 3); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityId(17L) + .needRole(true) + .needPermissionRelation(true) + .terminal("NT_CMS_WEB_GENERAL") + .type(NEW_FEATURE) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 1); + Assertions.assertNotNull(saasRoleUsers.get(0).getSaasRole()); + Assertions.assertNull(saasRoleUsers.get(0).getSaasRole().getPermissionRelations()); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityId(17L) + .needRole(true) + .needPermissionRelation(true) + .terminal("NT_CMP_APP_GENERAL") + .type(NEW_FEATURE) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 1); + Assertions.assertNotNull(saasRoleUsers.get(0).getSaasRole()); + Assertions.assertEquals(saasRoleUsers.get(0).getSaasRole().getPermissionRelations().size(), 3); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityId(17L) + .needRole(true) + .needPermission(true) + .terminal("NT_CMP_APP_GENERAL") + .type(NEW_FEATURE) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 1); + Assertions.assertNotNull(saasRoleUsers.get(0).getSaasRole()); + Assertions.assertNull(saasRoleUsers.get(0).getSaasRole().getPermissionRelations()); + Assertions.assertEquals(saasRoleUsers.get(0).getSaasRole().getSaasPermissions().size(), 3); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .batchPersons(Lists.newArrayList(ListRoleUserRelationParam.BatchPerson.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build())) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 1); + + saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder() + .batchPersons(Lists.newArrayList(ListRoleUserRelationParam.BatchPerson.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build(), + ListRoleUserRelationParam.BatchPerson.builder() + .personId(2107L) + .ouId(4L) + .workspaceId(3L) + .build())) + .build()); + Assertions.assertEquals(saasRoleUsers.size(), 2); + // old + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .resourceTypes(Sets.newHashSet(1)) + .build()) + .getData() + .getData(); + Assertions.assertTrue(data.isEmpty()); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .resourceTypes(Sets.newHashSet(0)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 13); + Assertions.assertEquals(data.get(0).getId(), 544214L); + Assertions.assertEquals(data.get(0).getIdentityId(), 14L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getPersonId(), 0L); + Assertions.assertEquals(data.get(0).getCreateBy(), 1L); + Assertions.assertEquals(data.get(0).getUpdateBy(), 2L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getResourceId(), 0L); + Assertions.assertEquals(data.get(0).getResourceType(), 0); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 32)); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .resourceIds(Sets.newHashSet(1L)) + .build()) + .getData() + .getData(); + Assertions.assertTrue(data.isEmpty()); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .resourceIds(Sets.newHashSet(0L)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 13); + Assertions.assertEquals(data.get(0).getId(), 544214L); + Assertions.assertEquals(data.get(0).getIdentityId(), 14L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getPersonId(), 0L); + Assertions.assertEquals(data.get(0).getCreateBy(), 1L); + Assertions.assertEquals(data.get(0).getUpdateBy(), 2L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getResourceId(), 0L); + Assertions.assertEquals(data.get(0).getResourceType(), 0); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 32)); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .isDisplay(true) + .needRole(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 13); + Assertions.assertNotNull(data.get(0).getRole()); + Assertions.assertEquals(data.get(0).getId(), 544214L); + Assertions.assertEquals(data.get(0).getIdentityId(), 14L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getPersonId(), 0L); + Assertions.assertEquals(data.get(0).getRole().getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getRole().getRoleCode(), "cms:zb_org_view"); + Assertions.assertEquals(data.get(0).getRole().getName(), "查看组织架构"); + Assertions.assertEquals(data.get(0).getRole().getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT.getValue()); + Assertions.assertEquals(data.get(0).getRole().getDescription(), "ff"); + Assertions.assertEquals(data.get(0).getRole().getWorkspaceId(), -1L); + Assertions.assertEquals(data.get(0).getRole().getOuId(), -1L); + Assertions.assertEquals(data.get(0).getRole().getCooperateShipType(), 1); + Assertions.assertEquals(data.get(0).getRole().getCreateBy(), 154587L); + Assertions.assertEquals(data.get(0).getRole().getUpdateBy(), 154587L); + Assertions.assertEquals(data.get(0).getRole().getSort(), 5); + Assertions.assertTrue(data.get(0).getRole().getIsDisplay()); + Assertions.assertTrue(data.get(0).getRole().getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getRole().getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 10, 43, 6)); + Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getRole().getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 25, 11, 51, 57)); + Assertions.assertEquals(data.get(0).getCreateBy(), 1L); + Assertions.assertEquals(data.get(0).getUpdateBy(), 2L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getResourceId(), 0L); + Assertions.assertEquals(data.get(0).getResourceType(), 0); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 32)); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .isDisplay(false) + .needRole(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 13); + Assertions.assertNull(data.get(0).getRole()); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .enabled(true) + .needRole(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 13); + Assertions.assertNotNull(data.get(0).getRole()); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .enabled(false) + .needRole(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 13); + Assertions.assertNull(data.get(0).getRole()); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityIds(Sets.newHashSet(17L)) + .needRole(true) + .needFeatureResourceRelation(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertNotNull(data.get(0).getRole()); + Assertions.assertEquals(data.get(0).getRole().getFeatureResourceRelations().size(), 3); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .featureResourceIds(Sets.newHashSet(101744L)) + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityIds(Sets.newHashSet(17L)) + .needRole(true) + .needFeatureResourceRelation(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertNotNull(data.get(0).getRole()); + Assertions.assertEquals(data.get(0).getRole().getFeatureResourceRelations().size(), 1); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityIds(Sets.newHashSet(17L)) + .needRole(true) + .needFeatureResourceRelation(true) + .featureResourceTypes(Sets.newHashSet(FeatureResourceTypeEnum.PAGE)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertNotNull(data.get(0).getRole()); + Assertions.assertNull(data.get(0).getRole().getFeatureResourceRelations()); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityIds(Sets.newHashSet(17L)) + .needRole(true) + .needFeatureResourceRelation(true) + .featureResourceTypes(Sets.newHashSet(FeatureResourceTypeEnum.COMPONENT)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertNotNull(data.get(0).getRole()); + Assertions.assertEquals(data.get(0).getRole().getFeatureResourceRelations().size(), 3); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityIds(Sets.newHashSet(17L)) + .needRole(true) + .needFeatureResourceRelation(true) + .featureResourceTypes(Sets.newHashSet(FeatureResourceTypeEnum.COMPONENT)) + .terminal("NT_CMS_WEB_GENERAL") + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertNotNull(data.get(0).getRole()); + Assertions.assertNull(data.get(0).getRole().getFeatureResourceRelations()); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityIds(Sets.newHashSet(17L)) + .needRole(true) + .needFeatureResourceRelation(true) + .featureResourceTypes(Sets.newHashSet(FeatureResourceTypeEnum.COMPONENT)) + .terminal("NT_CMP_APP_GENERAL") + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertNotNull(data.get(0).getRole()); + Assertions.assertEquals(data.get(0).getRole().getFeatureResourceRelations().size(), 3); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .roleCodes(Sets.newHashSet("cms:zb_worker——management")) + .identityIds(Sets.newHashSet(17L)) + .needRole(true) + .needFeatureResources(true) + .featureResourceTypes(Sets.newHashSet(FeatureResourceTypeEnum.COMPONENT)) + .terminal("NT_CMP_APP_GENERAL") + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + Assertions.assertNotNull(data.get(0).getRole()); + Assertions.assertNull(data.get(0).getRole().getFeatureResourceRelations()); + Assertions.assertEquals(data.get(0).getRole().getRoleFeatureResources().size(), 3); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .personIds(Sets.newHashSet(1827L)) + .ouIds(Sets.newHashSet(4L)) + .workspaceIds(Sets.newHashSet(3L)) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 1); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .batchPersons(Sets.newHashSet(PageRoleUserReq.BatchPerson.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build(), + PageRoleUserReq.BatchPerson.builder() + .personId(2107L) + .ouId(4L) + .workspaceId(3L) + .build())) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 2); + + data = roleUserV2Controller.page(PageRoleUserReq.builder() + .isDisplay(true) + .needRole(true) + .needFeatureResources(true) + .needFeatureResourceRelation(true) + .build()) + .getData() + .getData(); + Assertions.assertEquals(data.size(), 13); + Assertions.assertNotNull(data.get(0).getRole()); + Assertions.assertEquals(data.get(0).getId(), 544214L); + Assertions.assertEquals(data.get(0).getIdentityId(), 14L); + Assertions.assertEquals(data.get(0).getIdentityType(), 3); + Assertions.assertEquals(data.get(0).getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getPersonId(), 0L); + Assertions.assertEquals(data.get(0).getRole().getRoleId(), 100921L); + Assertions.assertEquals(data.get(0).getRole().getRoleCode(), "cms:zb_org_view"); + Assertions.assertEquals(data.get(0).getRole().getName(), "查看组织架构"); + Assertions.assertEquals(data.get(0).getRole().getRoleType(), cn.axzo.tyr.client.common.enums.RoleTypeEnum.INIT.getValue()); + Assertions.assertEquals(data.get(0).getRole().getDescription(), "ff"); + Assertions.assertEquals(data.get(0).getRole().getWorkspaceId(), -1L); + Assertions.assertEquals(data.get(0).getRole().getOuId(), -1L); + Assertions.assertEquals(data.get(0).getRole().getCooperateShipType(), 1); + Assertions.assertEquals(data.get(0).getRole().getCreateBy(), 154587L); + Assertions.assertEquals(data.get(0).getRole().getUpdateBy(), 154587L); + Assertions.assertEquals(data.get(0).getRole().getSort(), 5); + Assertions.assertTrue(data.get(0).getRole().getIsDisplay()); + Assertions.assertTrue(data.get(0).getRole().getEnabled()); + Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getRole().getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 10, 43, 6)); + Assertions.assertEquals(LocalDateTime.ofInstant(data.get(0).getRole().getCreateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 25, 11, 51, 57)); + Assertions.assertEquals(data.get(0).getCreateBy(), 1L); + Assertions.assertEquals(data.get(0).getUpdateBy(), 2L); + Assertions.assertEquals(data.get(0).getOuId(), 4L); + Assertions.assertEquals(data.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(data.get(0).getResourceId(), 0L); + Assertions.assertEquals(data.get(0).getResourceType(), 0); + Assertions.assertEquals(LocalDateTime.ofInstant(listApiResult.get(0).getUpdateAt().toInstant(), ZoneId.systemDefault()), + LocalDateTime.of(2024, 9, 26, 11, 31, 32)); + + Assertions.assertEquals(data.get(0).getRole().getFeatureResourceRelations().size(), 3); + Assertions.assertEquals(data.get(0).getRole().getFeatureResourceRelations().get(0).getFeatureId(), 100835L); + Assertions.assertEquals(data.get(0).getRole().getFeatureResourceRelations().get(0).getTags().size(), 1); + Assertions.assertTrue(data.get(0).getRole().getFeatureResourceRelations().get(0).getTags().contains(RolePermissionTagEnum.JOINED.name())); + Assertions.assertEquals(data.get(0).getRole().getFeatureResourceRelations().get(0).getType(), 1); + Assertions.assertEquals(data.get(0).getRole().getFeatureResourceRelations().get(0).getFeatureType(), FeatureResourceTypeEnum.MENU.getCode()); + + Assertions.assertEquals(data.get(0).getRole().getRoleFeatureResources().size(), 3); + Assertions.assertEquals(data.get(0).getRole().getRoleFeatureResources().get(0).getId(), 100835L); + Assertions.assertEquals(data.get(0).getRole().getRoleFeatureResources().get(0).getUniCode(), "cms:project_9103"); + Assertions.assertTrue(data.get(0).getRole().getRoleFeatureResources().get(0).getTags().contains(RolePermissionTagEnum.JOINED.name())); + Assertions.assertEquals(data.get(0).getRole().getRoleFeatureResources().get(0).getTerminal(), "NT_CMS_WEB_GENERAL"); } } \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql index c8c4a429..351bc932 100644 --- a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql @@ -45,4 +45,49 @@ VALUES (544687, 429, 100921, 3, 5267, 3, 4, 0, 0, 0, '2024-09-26 11:31:33', '202 INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) VALUES (544688, 429, 100921, 3, 5267, 5, 6, 0, 0, 0, '2024-09-26 11:31:33', '2024-09-26 11:31:33', 0, 0, 2); +INSERT INTO saas_pgroup_role_relation (id, role_id, group_id, is_delete, create_at, update_at, create_by, update_by) +VALUES (2290971, 100920, 1211, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:27', 154587, 154587); +INSERT INTO saas_pgroup_role_relation (id, role_id, group_id, is_delete, create_at, update_at, create_by, update_by) +VALUES (2290972, 100921, 1212, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:27', 154587, 154587); +INSERT INTO saas_pgroup_role_relation (id, role_id, group_id, is_delete, create_at, update_at, create_by, update_by) +VALUES (2290974, 100923, 1214, 0, '2024-09-25 11:51:58', '2024-09-26 10:43:27', 154587, 154587); + +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5208030, 1211, 101744, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 2051297, 1, 4, 'NT_CMP_APP_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5208040, 1211, 101745, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 2051297, 1, 4, 'NT_CMP_APP_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5208043, 1211, 101746, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 2051297, 1, 4, 'NT_CMP_APP_GENERAL', '["JOINED"]'); + +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5208031, 1212, 101744, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 2051297, 1, 4, 'NT_CMP_APP_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5208055, 1212, 101749, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 2051297, 1, 4, 'NT_CMP_APP_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5205310, 1212, 100835, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 9000404386, 1, 1, 'NT_CMS_WEB_GENERAL', '["JOINED"]'); + +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5206538, 1214, 101048, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 9000404204, 1, 2, 'NT_CMS_WEB_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5206556, 1214, 101053, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 9000404204, 1, 4, 'NT_CMS_WEB_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5206562, 1214, 101054, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 9000404204, 1, 4, 'NT_CMS_WEB_GENERAL', '["JOINED"]'); + +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (100835, 'cms:project_9103', '项目', 1, 'NT_CMS_WEB_GENERAL', 0, 100000, '100000,100835,', 0, '', 0, 'cms:project_9103', 1, 1, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/d4137963b9f54c7787afa7ef52d95540.svg', 1, '/', 0, '', 0, 0, '{"moreIcon": "https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cc474a2dc1884b6081f33d470a2e03e6.svg", "activeIcon": "https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/3e69eb003de64682a2e88c4d9da5ed1d.svg"}', 0, 0, '2024-06-01 14:50:52', '2024-10-29 11:29:10', 59926, 9000404098, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101048, 'cms:pro_contract_management_7701', '合约管理', 2, 'NT_CMS_WEB_GENERAL', 0, 100883, '100000,100835,100883,101048,', 2, '2', 0, 'cms:pro_contract_management_7701', 0, 1, '', 1, '/netConstruction/construction/contract-manage', 0, '', 0, 0, null, 1, 0, '2024-06-18 16:35:35', '2024-10-21 11:24:41', 59926, 9000404204, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101053, 'cms:pro_contract_price_authority_7706', '查看合约价格信息', 4, 'NT_CMS_WEB_GENERAL', 5, 101054, '100000,100835,100883,101048,101054,101053,', 0, '', 0, 'cms:pro_contract_price_authority_7706', 4, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-07-12 14:02:46', '2024-10-21 11:24:43', 59926, 9000404204, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101054, 'cms:pro_contract_detail_7707', '合约详情', 4, 'NT_CMS_WEB_GENERAL', 1, 101048, '100000,100835,100883,101048,101054,', 0, '', 0, 'cms:pro_contract_detail_7707', 3, 1, '', 1, '/', 0, '', 0, 0, null, 1, 1, '2024-07-04 16:27:16', '2024-10-21 11:24:42', 185732, 9000404204, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101744, 'cmp:pro_team_list_0443', '查看班组列表', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101744,', 0, '', 0, 'cmp:pro_team_list_0443', 2, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:39:22', '2024-08-28 10:53:36', 86256, 25923, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101745, 'cmp:pro_worker_invite_recorder_0445', '查看工人入场申请', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101745,', 0, '', 0, 'cmp:pro_worker_invite_recorder_0445', 3, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:40:29', '2024-08-28 10:53:36', 86256, 25923, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101746, 'cmp:pro_team_leader_invite_recorder_0446', '班组长入场申请记录', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101746,', 0, '', 0, 'cmp:pro_team_leader_invite_recorder_0446', 4, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:40:50', '2024-08-28 10:53:36', 86256, 25923, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101749, 'cmp:pro_team_index_0449', '查看班组详情', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101749,', 0, '', 0, 'cmp:pro_team_index_0449', 7, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:41:28', '2024-08-28 10:53:37', 86256, 25923, 0); + #-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file From 4930176eb21c2f39df10fe86c6345451d0f9bc57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Fri, 13 Dec 2024 09:16:53 +0800 Subject: [PATCH 11/25] =?UTF-8?q?feat:(feature/REQ-3282)=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=A4=9A=E4=BD=99=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=89=A9?= =?UTF-8?q?=E5=B1=95=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=94=AF=E6=8C=81listAuthByResourceAndRoleGroup=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/ListPermissionFromRoleGroupResp.java | 4 --- .../axzo/tyr/feign/req/PageRoleUserReq.java | 10 ++++++ .../service/impl/TyrSaasAuthServiceImpl.java | 28 ---------------- .../v2/RoleUserV2ControllerTest.java | 33 +++++++++++++++++++ .../mysql/RoleUserV2ControllerTest.sql | 13 ++++++++ 5 files changed, 56 insertions(+), 32 deletions(-) diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/ListPermissionFromRoleGroupResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/ListPermissionFromRoleGroupResp.java index 50db400c..34c1ff2a 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/ListPermissionFromRoleGroupResp.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/ListPermissionFromRoleGroupResp.java @@ -92,10 +92,6 @@ public class ListPermissionFromRoleGroupResp { private Set tags; } - - public String buildOuWorkspaceKey() { - return this.getOuId() + "_" + this.getWorkspaceId(); - } } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java index a6c0c637..17bf56cf 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java @@ -154,6 +154,16 @@ public class PageRoleUserReq { */ private Set batchPersons; + /** + * 查找指定角色分组code层级下角色的用户 + */ + private String roleGroupCode; + + /** + * 查找指定角色分组code层级及以下所有层级角色的用户 + */ + private String ancestorRoleGroupCode; + @Data @Builder @NoArgsConstructor diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index fe42f7a1..a22aa374 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -7,7 +7,6 @@ import cn.axzo.thrones.client.saas.ServicePkgClient; import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct; import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; -import cn.axzo.tyr.client.common.enums.WorkspaceJoinType; import cn.axzo.tyr.client.model.enums.DelegatedType; import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; @@ -1043,20 +1042,6 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { return featureMap; } - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class OUWRoleInfo { - - Long workspaceId; - Integer workspaceType; - Long ouId; - WorkspaceJoinType workspaceJoinType; - Set roles = new HashSet<>(); - - } - @Override public List listWorkspacePermissionIdentity(WorkspacePermissionIdentityReq req) { @@ -1531,17 +1516,4 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { .build(); return rolePermissionCacheService.list(listRolePermissionParam); } - - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - static class FeatureWrapper { - private Long featureId; - - /** - * 关联类型(0:saas_feature,1:saas_feature_resource) - */ - private Integer type; - } } diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java index 2610370d..ef492eef 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java @@ -9,6 +9,8 @@ import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.req.ListPermissionFromRoleGroupReq; +import cn.axzo.tyr.client.model.res.ListPermissionFromRoleGroupResp; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserDTO; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import cn.axzo.tyr.client.model.roleuser.dto.SuperAminInfoResp; @@ -24,6 +26,7 @@ import cn.axzo.tyr.feign.resp.RoleUserResp; import cn.axzo.tyr.server.controller.roleuser.RoleUserController; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import cn.axzo.tyr.server.service.SaasRoleUserService; +import cn.axzo.tyr.server.service.TyrSaasAuthService; import cn.azxo.framework.common.model.CommonResponse; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -55,6 +58,8 @@ class RoleUserV2ControllerTest extends BaseTest { private RoleUserController roleUserController; @Autowired private SaasRoleUserRelationService saasRoleUserRelationService; + @Autowired + private TyrSaasAuthService tyrSaasAuthService; @BeforeEach @Override @@ -1087,4 +1092,32 @@ class RoleUserV2ControllerTest extends BaseTest { Assertions.assertTrue(data.get(0).getRole().getRoleFeatureResources().get(0).getTags().contains(RolePermissionTagEnum.JOINED.name())); Assertions.assertEquals(data.get(0).getRole().getRoleFeatureResources().get(0).getTerminal(), "NT_CMS_WEB_GENERAL"); } + + /** + * 替换listAuthByResourceAndRoleGroup方法 + */ + @Test + void pageV2() { + // old + List listPermissionFromRoleGroupResps = tyrSaasAuthService.listAuthByResourceAndRoleGroup(ListPermissionFromRoleGroupReq.builder() + .categoryCode("cms:zb_org_group") + .categoryType(1) + .build()); + Assertions.assertEquals(listPermissionFromRoleGroupResps.size(), 2); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getIdentityId(), 17L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getIdentityType(), 3); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getPersonId(), 3135L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getOuId(), 4L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getTeamOuId(), 0L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getResourceId(), 0L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getResourceType(), 0); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleGroupName(), "组织架构"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleGroupCode(), "cms:zb_org_group"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleId(), 100920L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleName(), "工人管理"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleCode(), 2); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getPermissionGroupId(), 2); + // old + } } \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql index 351bc932..7369b1b5 100644 --- a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql @@ -90,4 +90,17 @@ VALUES (101746, 'cmp:pro_team_leader_invite_recorder_0446', '班组长入场申 INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) VALUES (101749, 'cmp:pro_team_index_0449', '查看班组详情', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101749,', 0, '', 0, 'cmp:pro_team_index_0449', 7, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:41:28', '2024-08-28 10:53:37', 86256, 25923, 0); + +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (369, 100920, 104, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:27'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (370, 100921, 106, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:27'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (372, 100923, 105, 0, '2024-09-25 11:51:58', '2024-09-26 10:43:27'); + +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (104, '2', '1', '组织架构', -1, -1, 14, 4, 'cms:zb_org_group', '', 0, '2024-09-25 11:51:55', '2024-09-25 11:51:55', '14,104,'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (105, '2', '1', '成本管理', -1, -1, 14, 5, 'cms:zb_cost_group', '', 0, '2024-09-25 11:51:55', '2024-09-25 11:51:55', '14,105,'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (106, '2', '1', '工人管理', -1, -1, 105, 5, 'cms:zb_cost_group', '', 0, '2024-09-25 11:51:55', '2024-09-25 11:51:55', '14,105,106,'); + + #-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file From 0e33a0a1dc97d55b455ed3ea1855f5e1309dc7b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Mon, 16 Dec 2024 15:57:32 +0800 Subject: [PATCH 12/25] =?UTF-8?q?feat:(REQ-3282)=20=E6=94=B6=E5=8F=A3?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BA=BA=E5=91=98=E6=9D=83=E9=99=90=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/req/ListSaasRoleGroupParam.java | 6 + .../model/req/PageSaasRoleGroupParam.java | 14 + .../req/ListRoleUserRelationParam.java | 20 ++ .../cn/axzo/tyr/feign/api/RoleGroupApi.java | 2 +- .../cn/axzo/tyr/feign/api/RoleUserApi.java | 2 +- .../axzo/tyr/feign/api/UserPermissionApi.java | 18 ++ .../tyr/feign/req/ListUserPermissionReq.java | 85 +++++ .../cn/axzo/tyr/feign/req/PageRoleReq.java | 1 + .../axzo/tyr/feign/req/PageRoleUserReq.java | 5 + .../axzo/tyr/feign/resp/PermissionResp.java | 43 +++ .../cn/axzo/tyr/feign/resp/RoleUserResp.java | 7 +- .../tyr/feign/resp/UserPermissionResp.java | 54 ++++ .../config/exception/BizResultCode.java | 2 +- .../server/controller/PrivateController.java | 98 ++---- .../v2/UserPermissionController.java | 76 +++++ .../tyr/server/service/PermissionService.java | 78 +++++ .../ProductPermissionCacheService.java | 16 + .../service/WorkspaceProductService.java | 16 + .../service/impl/PermissionServiceImpl.java | 290 ++++++++++++++++++ .../ProductPermissionCacheServiceImpl.java | 15 +- ...rmissionRelationOperateLogServiceImpl.java | 15 +- .../SaasRoleGroupRelationServiceImpl.java | 5 +- .../impl/SaasRoleGroupServiceImpl.java | 48 ++- .../impl/SaasRoleUserRelationServiceImpl.java | 66 +++- .../service/impl/TyrSaasAuthServiceImpl.java | 46 +-- .../impl/WorkspaceProductServiceImpl.java | 3 + .../java/cn/axzo/tyr/base/TestConfig.java | 3 + .../v2/RoleUserV2ControllerTest.java | 111 ++++++- .../mysql/RoleUserV2ControllerTest.sql | 71 ++++- .../src/test/resources/mysql/schema.sql | 1 + 30 files changed, 1096 insertions(+), 121 deletions(-) create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/api/UserPermissionApi.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListUserPermissionReq.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionResp.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/resp/UserPermissionResp.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListSaasRoleGroupParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListSaasRoleGroupParam.java index 1a381dd1..e62f0dd2 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListSaasRoleGroupParam.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListSaasRoleGroupParam.java @@ -69,4 +69,10 @@ public class ListSaasRoleGroupParam { */ @CriteriaField(ignore = true) private Set roleTypes; + + /** + * 查找指定角色分组code层级及以下所有层级角色的用户 + */ + @CriteriaField(ignore = true) + private String ancestorRoleGroupCode; } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasRoleGroupParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasRoleGroupParam.java index 96936ea6..3121ed2a 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasRoleGroupParam.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PageSaasRoleGroupParam.java @@ -2,12 +2,16 @@ package cn.axzo.tyr.client.model.req; import cn.axzo.foundation.dao.support.wrapper.CriteriaField; import cn.axzo.foundation.page.IPageReq; +import cn.axzo.foundation.page.PageResp; +import cn.axzo.tyr.client.model.res.SaasRoleGroupDTO; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.util.Collections; import java.util.List; +import java.util.Optional; @SuperBuilder @@ -28,4 +32,14 @@ public class PageSaasRoleGroupParam extends ListSaasRoleGroupParam implements IP @CriteriaField(ignore = true) List sort; + public PageResp toEmpty() { + return PageResp.builder() + .current(Optional.ofNullable(this.getPage()) + .orElse(DEFAULT_PAGE_NUMBER)) + .size(Optional.ofNullable(this.getPageSize()) + .orElse(DEFAULT_PAGE_SIZE)) + .total(0) + .data(Collections.emptyList()) + .build(); + } } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java index cf08c79c..44c836c7 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java @@ -147,6 +147,26 @@ public class ListRoleUserRelationParam { @CriteriaField(ignore = true) private Set roleTypes; + /** + * 查找指定角色分组code层级下角色的用户 + */ + @CriteriaField(ignore = true) + private String roleGroupCode; + + /** + * 查找指定角色分组code层级及以下所有层级角色的用户 + */ + @CriteriaField(ignore = true) + private String ancestorRoleGroupCode; + + /** + * 查询用户拥有的权限 + * 跟needPermission的区别是:needPermission是查询角色关联的菜单组件 + * needUserPermission是查询这个用户拥有的权限,要根据产品去匹配, + */ + @CriteriaField(ignore = true) + private Boolean needUserPermission; + @Data @Builder @NoArgsConstructor diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleGroupApi.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleGroupApi.java index 26cfbac1..88c46b1f 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleGroupApi.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleGroupApi.java @@ -17,6 +17,6 @@ public interface RoleGroupApi { * @param req * @return */ - @PostMapping("/api/roleGroup/page") + @PostMapping("/api/role-group/page") ApiResult> page(@RequestBody @Validated PageRoleGroupReq req); } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java index 208de511..5fba10f1 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java @@ -17,6 +17,6 @@ public interface RoleUserApi { * @param req * @return */ - @PostMapping("/api/roleUser/page") + @PostMapping("/api/role-user/page") ApiResult> page(@RequestBody @Validated PageRoleUserReq req); } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/UserPermissionApi.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/UserPermissionApi.java new file mode 100644 index 00000000..55182d70 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/UserPermissionApi.java @@ -0,0 +1,18 @@ +package cn.axzo.tyr.feign.api; + +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.feign.req.ListUserPermissionReq; +import cn.axzo.tyr.feign.resp.UserPermissionResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface UserPermissionApi { + + @PostMapping("/api/user-permission/list") + ApiResult> list(@RequestBody @Validated ListUserPermissionReq req); +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListUserPermissionReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListUserPermissionReq.java new file mode 100644 index 00000000..f41b2b8e --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListUserPermissionReq.java @@ -0,0 +1,85 @@ +package cn.axzo.tyr.feign.req; + +import cn.axzo.tyr.feign.enums.IdentityTypeEnum; +import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import java.util.List; +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ListUserPermissionReq { + + /** + * 人员id + * 根据personId查询权限或者根据identityId、identityType查询权限,不能同时都为空 + */ + private Long personId; + + /** + * 身份id + */ + private Long identityId; + + /** + * 身份类型 + */ + private IdentityTypeEnum identityType; + + /** + * 权限code + * 没有指定就查询所有的权限,指定了就查询指定code的权限 + */ + private Set featureCodes; + + /** + * 端信息 + */ + private String terminal; + + /** + * 项目信息 + */ + @NotEmpty(message = "workspaceOuPairs不能为空") + private List workspaceOuPairs; + + /** + * app类型(APP:原生,H5:h5页面) + */ + private String appType; + + /** + * 项目code(H5会拉取项目下所有的元素) + * APP上每个应用的code,数据库叫itemCode,保持一致 + */ + private String itemCode; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class WorkspaceOuPair { + /** + * 租户id + */ + private Long workspaceId; + + /** + * 单位id + */ + private Long ouId; + + /** + * 根据权限标签去过滤角色对应的权限 + * 如果没有指定值,则会根据用户在当前workspaceId和ouId在人岗架的状态来解析 + */ + private Set permissionTags; + } +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java index 56f4e293..a59bb0b2 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleReq.java @@ -95,6 +95,7 @@ public class PageRoleReq { /** * 协同关系类型 * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组 + * @see cn.axzo.maokai.common.enums.SaasCooperateShipCooperateTypeEnum */ private Set cooperateShipTypes; diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java index 17bf56cf..0dd69537 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageRoleUserReq.java @@ -164,6 +164,11 @@ public class PageRoleUserReq { */ private String ancestorRoleGroupCode; + /** + * 查询用户拥有的权限 + */ + private Boolean needUserPermission; + @Data @Builder @NoArgsConstructor diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionResp.java new file mode 100644 index 00000000..a835969e --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionResp.java @@ -0,0 +1,43 @@ +package cn.axzo.tyr.feign.resp; + +import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PermissionResp { + + /** + * 权限点id + */ + private Long featureId; + + /** + * 权限code + */ + private String featureCode; + + /** + * 新旧权限 + * 0:表示id是saas_feature的id + * 1:表示id是saas_feature_resource的id + */ + private Integer featureType; + + /** + * 端信息 + */ + private String terminal; + + /** + * 权限的标签 + */ + private Set tags; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java index 3cb22ade..9eae4912 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/RoleUserResp.java @@ -6,7 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; -import java.util.List; +import java.util.Set; @Data @Builder @@ -82,4 +82,9 @@ public class RoleUserResp { * 角色信息 */ private RoleResp role; + + /** + * 用户当前角色拥有的权限 + */ + private Set permissions; } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/UserPermissionResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/UserPermissionResp.java new file mode 100644 index 00000000..43099be6 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/UserPermissionResp.java @@ -0,0 +1,54 @@ +package cn.axzo.tyr.feign.resp; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserPermissionResp { + + + /** + * 人员id + */ + private Long personId; + + /** + * 身份id + */ + private Long identityId; + + /** + * 身份类型 + */ + private String identityType; + + /** + * 用户在项目的权限 + */ + private List workspacePermissions; + + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class WorkspacePermission { + + private Long workspaceId; + + private Long ouId; + + /** + * 是否是超管 + */ + private Boolean isSuperAdmin; + + private List permissions; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java index 1cfd394d..492cb309 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java @@ -26,7 +26,7 @@ public enum BizResultCode implements IResultCode { PAGE_ELEMENT_CATEGORY_NOT_FOUND("100016", "资源分组数据不存在"), PAGE_ELEMENT_ERROR("100017", "资源分组错误:{}"), PAGE_CODE_DUPLICATE("100018", "资源元素code重复,重复的code:{}"), - PARAM_ERROR("100019", "参数错误"), + PARAM_ERROR("100019", "参数错误:{}"), FEATURE_NAME_EXIST("100020", "菜单组件名字已经存在:{}"), TERMINAL_CODE_EXIST("100021", "端code已经存在,请修改"), TERMINAL_NOT_FOUND("100022", "原端不存在:{}"), diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java index 9588870e..692be370 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java @@ -115,72 +115,38 @@ import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation. @RequiredArgsConstructor public class PrivateController { - @Autowired - private SaasCommonDictService saasCommonDictService; - @Autowired - private SaasRoleGroupService saasRoleGroupService; - @Autowired - private SaasRoleGroupRelationDao saasRoleGroupRelationDao; - @Autowired - private RoleService roleService; - @Autowired - private SaasFeatureResourceDao saasFeatureResourceDao; - @Autowired - private SaasFeatureResourceCacheService saasFeatureResourceCacheService; - @Autowired - private ProductPermissionCacheService productPermissionCacheService; - @Autowired - private TyrSaasAuthService tyrSaasAuthService; - @Autowired - private SaasFeatureDao saasFeatureDao; - @Autowired - private SaasPgroupPermissionRelationService saasPgroupPermissionRelationService; - @Autowired - private SaasRoleDao saasRoleDao; - @Autowired - private SaasPgroupRoleRelationDao saasPgroupRoleRelationDao; - @Autowired - private SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao; - @Autowired - private ProductFeatureRelationService productFeatureRelationService; - @Autowired - private FeatureCodeUtil featureCodeUtil; - @Autowired - private WorkspaceProductService workspaceProductService; - @Autowired - private CacheWorkspaceProductHandler cacheWorkspaceProductHandler; - @Autowired - private SaasRoleGroupDao saasRoleGroupDao; - @Autowired - private CacheProductPermissionJob cacheProductPermissionJob; - @Autowired - private CacheRolePermissionJob cacheRolePermissionJob; - @Autowired - private CacheSaasFeatureJob cacheSaasFeatureJob; - @Autowired - private CacheProductFeatureResourceJob cacheProductFeatureResourceJob; - @Autowired - private CacheRoleFeatureResourceJob cacheRoleFeatureResourceJob; - @Autowired - private SaasFeatureResourceService saasFeatureResourceService; - @Autowired - private RolePermissionCacheService rolePermissionCacheService; - @Autowired - private SaasPageElementDao saasPageElementDao; - @Autowired - private SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao; - @Autowired - private SaasRoleUserRelationService saasRoleUserRelationService; - @Autowired - private ProductModuleDao productModuleDao; - @Autowired - private CacheWorkspaceProductJob cacheWorkspaceProductJob; - @Autowired - private RoleSaasFeatureResourceCacheService roleSaasFeatureResourceCacheService; - @Autowired - private SendDingTalkHandler sendDingTalkHandler; - @Autowired - private ProductSaasFeatureResourceCacheService productSaasFeatureResourceCacheService; + private final SaasCommonDictService saasCommonDictService; + private final SaasRoleGroupService saasRoleGroupService; + private final SaasRoleGroupRelationDao saasRoleGroupRelationDao; + private final RoleService roleService; + private final SaasFeatureResourceDao saasFeatureResourceDao; + private final SaasFeatureResourceCacheService saasFeatureResourceCacheService; + private final ProductPermissionCacheService productPermissionCacheService; + private final SaasFeatureDao saasFeatureDao; + private final SaasPgroupPermissionRelationService saasPgroupPermissionRelationService; + private final SaasRoleDao saasRoleDao; + private final SaasPgroupRoleRelationDao saasPgroupRoleRelationDao; + private final SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao; + private final ProductFeatureRelationService productFeatureRelationService; + private final FeatureCodeUtil featureCodeUtil; + private final WorkspaceProductService workspaceProductService; + private final CacheWorkspaceProductHandler cacheWorkspaceProductHandler; + private final SaasRoleGroupDao saasRoleGroupDao; + private final CacheProductPermissionJob cacheProductPermissionJob; + private final CacheRolePermissionJob cacheRolePermissionJob; + private final CacheSaasFeatureJob cacheSaasFeatureJob; + private final CacheProductFeatureResourceJob cacheProductFeatureResourceJob; + private final CacheRoleFeatureResourceJob cacheRoleFeatureResourceJob; + private final SaasFeatureResourceService saasFeatureResourceService; + private final RolePermissionCacheService rolePermissionCacheService; + private final SaasPageElementDao saasPageElementDao; + private final SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao; + private final SaasRoleUserRelationService saasRoleUserRelationService; + private final ProductModuleDao productModuleDao; + private final CacheWorkspaceProductJob cacheWorkspaceProductJob; + private final RoleSaasFeatureResourceCacheService roleSaasFeatureResourceCacheService; + private final SendDingTalkHandler sendDingTalkHandler; + private final ProductSaasFeatureResourceCacheService productSaasFeatureResourceCacheService; /** * 统一层级的roleGroup按照id升序,sort从1递增 diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java new file mode 100644 index 00000000..d157ff23 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java @@ -0,0 +1,76 @@ +package cn.axzo.tyr.server.controller.v2; + +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; +import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; +import cn.axzo.tyr.feign.api.UserPermissionApi; +import cn.axzo.tyr.feign.req.ListUserPermissionReq; +import cn.axzo.tyr.feign.resp.UserPermissionResp; +import cn.axzo.tyr.server.service.PermissionService; +import cn.axzo.tyr.server.service.SaasRoleUserRelationService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import static cn.axzo.tyr.server.config.exception.BizResultCode.PARAM_ERROR; + +@Slf4j +@RestController +public class UserPermissionController implements UserPermissionApi { + + @Autowired + private PermissionService permissionService; + @Autowired + private SaasRoleUserRelationService saasRoleUserRelationService; + + @Override + public ApiResult> list(ListUserPermissionReq req) { + + check(req); + + List saasRoleUsers = listRoleUserRelation(req); + + + return null; + } + + private void check(ListUserPermissionReq req) { + + Axssert.check(Objects.nonNull(req.getPersonId()) || Objects.nonNull(req.getIdentityId()), + PARAM_ERROR, PARAM_ERROR.getErrorMessage(), "personId 和 identityId不能同时为空"); + + if (Objects.nonNull(req.getIdentityId())) { + Axssert.check(Objects.nonNull(req.getIdentityType()), + PARAM_ERROR, PARAM_ERROR.getErrorMessage(), "identityType不能为空"); + } + } + + private List listRoleUserRelation(ListUserPermissionReq req) { + + ListRoleUserRelationParam listRoleUserRelationParam = ListRoleUserRelationParam.builder() + .personId(req.getPersonId()) + .identityId(req.getIdentityId()) + .identityType(Optional.ofNullable(req.getIdentityType()) + .map(e -> IdentityType.valueOf(e.name())) + .orElse(null)) + .workspaceOuPairs(req.getWorkspaceOuPairs().stream() + .map(e -> ListRoleUserRelationParam.WorkspaceOuPair.builder() + .workspaceId(e.getWorkspaceId()) + .ouId(e.getOuId()) + .build()) + .collect(Collectors.toList())) + .needRole(true) + .build(); + + return saasRoleUserRelationService.listV2(listRoleUserRelationParam).stream() + .filter(e -> e.getSaasRole() != null) + .collect(Collectors.toList()); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java new file mode 100644 index 00000000..4de3f781 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java @@ -0,0 +1,78 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; +import cn.axzo.tyr.feign.enums.RoleTypeEnum; +import cn.axzo.tyr.feign.resp.UserPermissionResp; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public interface PermissionService { + + Map> listUserPermission(ListUserPermissionParam param); + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + class ListUserPermissionParam { + private List users; + + /** + * 权限code + * 没有指定就查询所有的权限,指定了就查询指定code的权限 + */ + private Set featureCodes; + + /** + * 端信息 + */ + private String terminal; + + /** + * app类型(APP:原生,H5:h5页面) + */ + private String appType; + + /** + * 项目code(H5会拉取项目下所有的元素) + * APP上每个应用的code,数据库叫itemCode,保持一致 + */ + private String itemCode; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + class UserParam { + private Long personId; + + private Set tags; + + private Set roles; + + private Long workspaceId; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + class RoleParam { + private Long roleId; + + private RoleTypeEnum roleType; + + /** + * 产品单位类型 + * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组 + */ + private Integer cooperateShipTypes; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java index 1e67c38a..a57ca4dd 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java @@ -62,6 +62,22 @@ public interface ProductPermissionCacheService { private Set productIds; private Set featureCodes; + + /** + * 端信息 + */ + private String terminal; + + /** + * app类型(APP:原生,H5:h5页面) + */ + private String appType; + + /** + * 项目code(H5会拉取项目下所有的元素) + * APP上每个应用的code,数据库叫itemCode,保持一致 + */ + private String itemCode; } @Data diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java index fa7d2df5..600eb8db 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java @@ -67,6 +67,22 @@ public interface WorkspaceProductService { private Set workspaceIds; private Set featureCodes; + + /** + * 端信息 + */ + private String terminal; + + /** + * app类型(APP:原生,H5:h5页面) + */ + private String appType; + + /** + * 项目code(H5会拉取项目下所有的元素) + * APP上每个应用的code,数据库叫itemCode,保持一致 + */ + private String itemCode; } @Data diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java new file mode 100644 index 00000000..10521607 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java @@ -0,0 +1,290 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.tyr.client.model.res.IdentityAuthRes; +import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; +import cn.axzo.tyr.feign.resp.PermissionResp; +import cn.axzo.tyr.feign.resp.UserPermissionResp; +import cn.axzo.tyr.server.service.PermissionService; +import cn.axzo.tyr.server.service.ProductPermissionCacheService; +import cn.axzo.tyr.server.service.RolePermissionCacheService; +import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import cn.axzo.tyr.server.service.WorkspaceProductService; +import cn.hutool.core.collection.CollectionUtil; +import com.google.common.collect.Sets; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class PermissionServiceImpl implements PermissionService { + + @Autowired + private RolePermissionCacheService rolePermissionCacheService; + @Autowired + private WorkspaceProductService workspaceProductService; + @Autowired + private SaasFeatureResourceService saasFeatureResourceService; + + /** + * 1、查询用户的角色 + * 2、查询角色的权限 + * 3、查询项目的权限 + * 4、查找项目权限的端的所有菜单、可能菜单已经被删除,需要需要校验有权限id是否存在 + * 5、解析超管、管理员角色的权限 + * 6、解析普通角色的权限 + * 7、解析免授权的权限 + * 8、合并5、6、7的权限并返回 + * 因为角色的单位类型要跟产品的单位类型去匹配、超管|管理员角色的权限是对应的产品的权限、普通角色的权限需要跟产品匹配 + * 权限点指定是全部角色,则只需要产品勾选了权限即有权限 + * + */ + @Override + public Map> listUserPermission(ListUserPermissionParam param) { + if (CollectionUtils.isEmpty(param.getUsers())) { + return Collections.emptyMap(); + } + + // 查询项目的权限 + Map> workspacePermissionMap = listWorkspacePermission(param); + if (Objects.isNull(workspacePermissionMap) || workspacePermissionMap.isEmpty()) { + return Collections.emptyMap(); + } + + // 查询产品的端的所有菜单信息 + List allFeatureResources = listAllSaasFeature(workspacePermissionMap); + if (CollectionUtils.isEmpty(allFeatureResources)) { + return Collections.emptyMap(); + } + + // 查询角色的权限 + Map> rolePermissions = listRolePermission(param); + + // 按照人去解析每个人的权限,因为每个人的tag可能不一样 + param.getUsers().stream() + .map(user -> { + if (CollectionUtils.isEmpty(user.getRoles())) { + return null; + } + + List workspacePermissions = workspacePermissionMap.get(user.getWorkspaceId()); + if (CollectionUtils.isEmpty(workspacePermissions)) { + return null; + } + + // 用户在场时的管理员角色的权限 + Set adminRolePermission = resolveAdminRolePermission(workspacePermissions, user); + + // 用户普通角色的权限 + + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + + + return null; + } + + /** + * 只有查询在职权限时才能直接根据管理员角色和产品去匹配 + * 因为离场权限,管理员角色会配置管理员角色对应的离场权限 + * @param workspacePermissions + * @param userParam + * @return + */ + private Set resolveAdminRolePermission(List workspacePermissions, + UserParam userParam) { + + if (!CollectionUtils.isEmpty(userParam.getTags()) && !userParam.getTags().contains(RolePermissionTagEnum.JOINED)) { + log.info("admin role permission:tags not null and no joined tag"); + return Collections.emptySet(); + } + + //超管和管理员角色 + List adminRoles = userParam.getRoles().stream() + .filter(role -> Objects.nonNull(role.getRoleType()) && role.getRoleType().isAdmin()) + .collect(Collectors.toList()); + if (CollectionUtil.isEmpty(adminRoles)) { + log.info("no admin roles"); + return Collections.emptySet(); + } + + Set cooperateShipTypes = adminRoles.stream() + .map(RoleParam::getCooperateShipTypes) + .map(String::valueOf) + .collect(Collectors.toSet()); + + return workspacePermissions.stream() + .filter(e -> cooperateShipTypes.contains(e.getCooperateType())) + .map(e -> PermissionResp.builder() + .featureCode(e.getFeatureCode()) + .featureId(e.getFeatureId()) + .terminal(e.getTerminal()) + .featureType(e.getFeatureType()) + .build()) + .collect(Collectors.toSet()); + } + + + private Set buildNoAuthPermission(List productPermissions, + List allFeatures) { + + // 因为有权授权权限的权限点,就需要有所有上层权限点的权限 + Set notAuthFeatureIds = allFeatures.stream() + .filter(SaasFeatureResourceService.SaasFeatureResourceCache::isNotAuth) + .map(e -> Optional.ofNullable(e.getParentIds()) + .map(f -> { + f.add(e.getFeatureId()); + return f; + }) + .orElseGet(() -> Sets.newHashSet(e.getFeatureId()))) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + + if (CollectionUtils.isEmpty(notAuthFeatureIds)) { + return Collections.emptySet(); + } + + + return productPermissions.stream() + .filter(productPermission -> notAuthFeatureIds.contains(productPermission.getFeatureId())) + .map(e -> IdentityAuthRes.PermissionPoint.builder() + .featureCode(e.getFeatureCode()) + .featureId(e.getFeatureId()) + .terminal(e.getTerminal()) + .featureType(e.getFeatureType()) + .build()) + .collect(Collectors.toSet()); + } + + private Set resolveNormalRolePermission(List workspacePermissions, + UserParam userParam) { + + // 普通角色 + List normalRoles = userParam.getRoles().stream() + .filter(role -> Objects.nonNull(role.getRoleType()) && !role.getRoleType().isAdmin()) + .collect(Collectors.toList()); + if (CollectionUtil.isEmpty(normalRoles)) { + log.info("no normal roles"); + return Collections.emptySet(); + } + + return normalRoles.stream() + .map(role -> { + + Set rolePermissionFeatureCodes = Optional.ofNullable(rolePermissionMap.get(role.getId())) + .map(e -> e.stream() + .filter(Objects::nonNull) + .filter(rolePermission -> { + if (CollectionUtils.isEmpty(workspaceOuPair.getTags()) || CollectionUtils.isEmpty(rolePermission.getTags())) { + return true; + } + + if (Sets.intersection(workspaceOuPair.getTags(), rolePermission.getTags()).isEmpty()) { + return false; + } + + return true; + }) + .map(RolePermissionCacheService.PermissionDTO::getFeatureCode) + .collect(Collectors.toSet())) + .orElseGet(Sets::newHashSet); + + if (CollectionUtils.isEmpty(rolePermissionFeatureCodes)) { + return null; + } + + return productPermissions.stream() + .filter(productPermission -> Objects.equals(productPermission.getCooperateType(), String.valueOf(role.getProductUnitType()))) + .filter(productPermission -> rolePermissionFeatureCodes.contains(productPermission.getFeatureCode())) + .map(e -> IdentityAuthRes.PermissionPoint.builder() + .featureCode(e.getFeatureCode()) + .featureId(e.getFeatureId()) + .terminal(e.getTerminal()) + .featureType(e.getFeatureType()) + .build()) + .collect(Collectors.toSet()); + + }) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + } + + private Map> listRolePermission(ListUserPermissionParam param) { + Set roleIds = param.getUsers().stream() + .map(UserParam::getRoles) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .map(RoleParam::getRoleId) + .collect(Collectors.toSet()); + if (CollectionUtils.isEmpty(roleIds)) { + return Collections.emptyMap(); + } + + RolePermissionCacheService.ListRolePermissionParam listRolePermissionParam = RolePermissionCacheService.ListRolePermissionParam.builder() + .roleIds(roleIds) + .featureCodes(param.getFeatureCodes()) + .build(); + return rolePermissionCacheService.list(listRolePermissionParam); + } + + private Map> listWorkspacePermission(ListUserPermissionParam param) { + + Set workspaceIds = param.getUsers().stream() + .map(UserParam::getWorkspaceId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + if (CollectionUtils.isEmpty(workspaceIds)) { + return Collections.emptyMap(); + } + + WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermission = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(workspaceIds) + .featureCodes(param.getFeatureCodes()) + .appType(param.getAppType()) + .itemCode(param.getItemCode()) + .terminal(param.getTerminal()) + .build(); + return workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermission) + .stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, + e -> Optional.ofNullable(e.getProductPermissions()) + .map(productPermissions -> productPermissions.stream() + .map(WorkspaceProductService.ProductPermission::getPermissions) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .collect(Collectors.toList())) + .orElseGet(Lists::newArrayList))); + } + + private List listAllSaasFeature(Map> workspacePermissions) { + + Set terminals = workspacePermissions.values().stream() + .flatMap(Collection::stream) + .map(ProductPermissionCacheService.PermissionDTO::getTerminal) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + SaasFeatureResourceService.ListSaasFeatureResourceCache listSaasFeatureResourceCache = SaasFeatureResourceService.ListSaasFeatureResourceCache.builder() + .terminals(terminals) + .build(); + return saasFeatureResourceService.listCache(listSaasFeatureResourceCache) + .values() + .stream() + .flatMap(Collection::stream) + .collect(Collectors.toList()); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductPermissionCacheServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductPermissionCacheServiceImpl.java index 7a90efe1..ff52a193 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductPermissionCacheServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductPermissionCacheServiceImpl.java @@ -18,6 +18,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Service; @@ -85,18 +86,20 @@ public class ProductPermissionCacheServiceImpl implements ProductPermissionCache .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().orElseGet(Lists::newArrayList))); } catch (ExecutionException ex) { log.error("list product cache permission error:{} error", param.getProductIds(), ex); - // 外面有做降级 throw new ServiceException("查询产品权限缓存异常"); } - if (CollectionUtils.isEmpty(param.getFeatureCodes())) { - return productPermissions; - } - return productPermissions.entrySet() .stream() .map(e -> Pair.of(e.getKey(), e.getValue().stream() - .filter(permission -> param.getFeatureCodes().contains(permission.getFeatureCode())) + .filter(permission -> CollectionUtils.isEmpty(param.getFeatureCodes()) + || param.getFeatureCodes().contains(permission.getFeatureCode())) + .filter(permission -> StringUtils.isBlank(param.getTerminal()) + || Objects.equals(permission.getTerminal(), param.getTerminal())) + .filter(permission -> StringUtils.isBlank(param.getAppType()) + || Objects.equals(permission.getAppType(), param.getAppType())) + .filter(permission -> StringUtils.isBlank(param.getItemCode()) + || Objects.equals(permission.getItemCode(), param.getItemCode())) .collect(Collectors.toList())) ) .filter(e -> !CollectionUtils.isEmpty(e.getValue())) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationOperateLogServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationOperateLogServiceImpl.java index 06ea3f82..0b618b6e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationOperateLogServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationOperateLogServiceImpl.java @@ -18,12 +18,12 @@ import cn.axzo.tyr.server.util.RpcInternalUtil; import cn.azxo.framework.common.constatns.Constants; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; -import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Collections; @@ -39,7 +39,6 @@ import java.util.stream.Collectors; */ @Slf4j @Service -@AllArgsConstructor public class SaasPgroupPermissionRelationOperateLogServiceImpl implements SaasPgroupPermissionRelationOperateLogService { public static final String TABLE_NAME_FEATURE_RESOURCE = "saas_feature_resource"; @@ -50,10 +49,14 @@ public class SaasPgroupPermissionRelationOperateLogServiceImpl implements SaasPg public static final String TABLE_NAME_SAAS_ROLE_GROUP = "saas_role_group"; public static final String TABLE_NAME_SAAS_FEATURE = "saas_feature"; - private final SaasPgroupPermissionRelationOperateLogDao saasPgroupPermissionRelationOperateLogDao; - private final SaasRoleDao saasRoleDao; - private final UserProfileServiceApi userProfileServiceApi; - private final SaasRoleUserRelationService saasRoleUserRelationService; + @Autowired + private SaasPgroupPermissionRelationOperateLogDao saasPgroupPermissionRelationOperateLogDao; + @Autowired + private SaasRoleDao saasRoleDao; + @Autowired + private UserProfileServiceApi userProfileServiceApi; + @Autowired + private SaasRoleUserRelationService saasRoleUserRelationService; @Override public void batchSave(List logs) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java index 9a189b80..0767c5ab 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java @@ -15,6 +15,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,10 +26,10 @@ import java.util.stream.Collectors; @Slf4j @Service -@RequiredArgsConstructor public class SaasRoleGroupRelationServiceImpl extends ServiceImpl implements SaasRoleGroupRelationService { - private final SaasRoleGroupRelationDao saasRoleGroupRelationDao; + @Autowired + private SaasRoleGroupRelationDao saasRoleGroupRelationDao; @Override @Transactional(rollbackFor = Exception.class) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index e51f7a9d..57d0bd49 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -46,6 +46,7 @@ import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.MDC; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -59,23 +60,29 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; import static cn.axzo.tyr.server.config.exception.BizResultCode.CANT_DELETE_ROLE_GROUP; @Slf4j -@RequiredArgsConstructor @Service public class SaasRoleGroupServiceImpl extends ServiceImpl implements SaasRoleGroupService { - private final SaasRoleGroupMapper saasRoleGroupMapper; - private final SaasRoleGroupDao saasRoleGroupDao; - private final SaasRoleGroupRelationDao saasRoleGroupRelationDao; - private final SaasRoleGroupRelationService saasRoleGroupRelationService; - private final RoleService roleService; - private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService; + @Autowired + private SaasRoleGroupMapper saasRoleGroupMapper; + @Autowired + private SaasRoleGroupDao saasRoleGroupDao; + @Autowired + private SaasRoleGroupRelationDao saasRoleGroupRelationDao; + @Autowired + private SaasRoleGroupRelationService saasRoleGroupRelationService; + @Autowired + private RoleService roleService; + @Autowired + private SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService; @Override public List getList(QuerySaasRoleGroupReq req) { @@ -403,6 +410,11 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl idByAncestorRoleGroupCode = resolveIdByAncestorRoleGroupCode(param); + if (Objects.nonNull(param.getAncestorRoleGroupCode()) && CollectionUtils.isEmpty(idByAncestorRoleGroupCode)) { + return param.toEmpty(); + } + IPage page = this.page(PageConverter.toMybatis(param, SaasRoleGroup.class), wrapper); Map> roles = listRoles(param, page.getRecords()); @@ -412,6 +424,28 @@ public class SaasRoleGroupServiceImpl extends ServiceImpl from(record, roles, roleGroupRelations)); } + private Set resolveIdByAncestorRoleGroupCode(PageSaasRoleGroupParam param) { + if (Objects.isNull(param.getAncestorRoleGroupCode())) { + return Collections.emptySet(); + } + List saasRoleGroups = this.lambdaQuery() + .eq(SaasRoleGroup::getCode, param.getAncestorRoleGroupCode()) + .list(); + if (CollectionUtils.isEmpty(saasRoleGroups)) { + return Collections.emptySet(); + } + + return this.list(ListSaasRoleGroupParam.builder() + .paths(saasRoleGroups.stream() + .map(SaasRoleGroup::getPath) + .collect(Collectors.toSet())) + .build()) + .stream() + .map(SaasRoleGroupDTO::getId) + .collect(Collectors.toSet()); + + } + private SaasRoleGroupDTO from(SaasRoleGroup saasRoleGroup, Map> roles, Map> roleGroupRelations) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index 4c2c8806..ed56cda8 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -26,9 +26,12 @@ import cn.axzo.tyr.client.model.permission.IdentityKey; import cn.axzo.tyr.client.model.permission.QueryIdentityByPermissionDTO; import cn.axzo.tyr.client.model.permission.SaasUserRoleExBO; import cn.axzo.tyr.client.model.req.ListRoleReq; +import cn.axzo.tyr.client.model.req.ListSaasRoleGroupParam; import cn.axzo.tyr.client.model.req.QuerySuperAdminReq; import cn.axzo.tyr.client.model.req.UpdateUserJobReq; import cn.axzo.tyr.client.model.req.WorkspaceUpdateUserRoleDTO; +import cn.axzo.tyr.client.model.res.RoleGroupRelationRes; +import cn.axzo.tyr.client.model.res.SaasRoleGroupDTO; import cn.axzo.tyr.client.model.res.SaasRoleRes; import cn.axzo.tyr.client.model.res.SuperAminInfoResp; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; @@ -44,6 +47,7 @@ import cn.axzo.tyr.server.repository.entity.SaasRole; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import cn.axzo.tyr.server.repository.mapper.SaasRoleUserRelationMapper; import cn.axzo.tyr.server.service.RoleService; +import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import cn.axzo.tyr.server.util.RpcInternalUtil; import cn.hutool.core.collection.CollectionUtil; @@ -51,6 +55,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.BooleanUtils; import org.springframework.beans.BeanUtils; @@ -87,7 +92,6 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl roleIdsByRoleGroupCode = resolveRoleIdsByRoleGroupCode(param); + if (Objects.nonNull(param.getRoleGroupCode()) && CollectionUtils.isEmpty(roleIdsByRoleGroupCode)) { + return param.toEmpty(); + } + + Set roleIdsByAncestorRoleGroupCode = resolveRoleIdsByAncestorRoleGroupCode(param); + if (Objects.nonNull(param.getAncestorRoleGroupCode()) && CollectionUtils.isEmpty(roleIdsByAncestorRoleGroupCode)) { + return param.toEmpty(); + } + wrapper.in(!CollectionUtils.isEmpty(roleIdsByRoleCodes), "role_id", roleIdsByRoleCodes); wrapper.in(!CollectionUtils.isEmpty(roleIdsByRoleTypes), "role_id", roleIdsByRoleTypes); + wrapper.in(!CollectionUtils.isEmpty(roleIdsByRoleGroupCode), "role_id", roleIdsByRoleGroupCode); + + wrapper.in(!CollectionUtils.isEmpty(roleIdsByAncestorRoleGroupCode), "role_id", roleIdsByAncestorRoleGroupCode); + assembleBatchPersonWrapper(param, wrapper); IPage page = this.page(PageConverter.toMybatis(param, SaasRoleUserRelation.class), wrapper); @@ -619,4 +640,47 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl resolveRoleIdsByRoleGroupCode(PageRoleUserRelationParam param) { + if (Objects.isNull(param.getRoleGroupCode())) { + return Collections.emptySet(); + } + + return saasRoleGroupService.list(ListSaasRoleGroupParam.builder() + .roleGroupCodes(Sets.newHashSet(param.getRoleGroupCode())) + .needRoleGroupRelation(true) + .build()) + .stream() + .map(SaasRoleGroupDTO::getRoleGroupRelations) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .map(RoleGroupRelationRes::getRoleId) + .collect(Collectors.toSet()); + } + + private Set resolveRoleIdsByAncestorRoleGroupCode(PageRoleUserRelationParam param) { + if (Objects.isNull(param.getAncestorRoleGroupCode())) { + return Collections.emptySet(); + } + + return saasRoleGroupService.list(ListSaasRoleGroupParam.builder() + .ancestorRoleGroupCode(param.getAncestorRoleGroupCode()) + .needRoleGroupRelation(true) + .build()) + .stream() + .map(SaasRoleGroupDTO::getRoleGroupRelations) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .map(RoleGroupRelationRes::getRoleId) + .collect(Collectors.toSet()); + } + + private Map listUserPermission(PageRoleUserRelationParam param, + List saasRoleUserRelations) { + if (CollectionUtils.isEmpty(saasRoleUserRelations) || BooleanUtils.isNotTrue(param.getNeedUserPermission())) { + return Collections.emptyMap(); + } + + + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index a22aa374..a45bbe82 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -925,24 +925,24 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { .build()).collect(Collectors.toList())); return permissionInfo.stream() - .filter(e -> { - PermissionTagService.ResolvePermissionDTO resolvePermission = personPermissionTags.get(e.getPersonId() + "_" + e.getOuId() + "_" + e.getWorkspaceId()); - if (Objects.isNull(resolvePermission)) { - // 未解析到标签兼容历史情况 - return true; - } - - Set featureInfos = authMap.get(NumberUtil.parseLong(e.getRoleId())); - - return featureInfos.stream() - .anyMatch(permission -> permission.getTags() - .stream() - .anyMatch(tag -> !Sets.intersection(permission.getTags(), resolvePermission.getTags()).isEmpty())); - }) .peek(e -> { - e.setFeatureInfos(authMap.get(NumberUtil.parseLong(e.getRoleId()))); - e.setSimpleFeatureInfos(org.apache.commons.collections4.CollectionUtils.emptyIfNull(authMap.get(NumberUtil.parseLong(e.getRoleId()))) - .stream().map(ListPermissionFromRoleGroupResp.FeatureInfo::getFeatureId).collect(Collectors.toSet())); + PermissionTagService.ResolvePermissionDTO resolvePermission = personPermissionTags.get(e.getPersonId() + "_" + e.getOuId() + "_" + e.getWorkspaceId()); + + Set featureInfos = Optional.ofNullable(authMap.get(NumberUtil.parseLong(e.getRoleId()))) + .orElseGet(Sets::newHashSet) + .stream() + .filter(feature -> { + if (Objects.isNull(resolvePermission)) { + // 未解析到标签兼容历史情况 + return true; + } + return !Sets.intersection(feature.getTags(), resolvePermission.getTags()).isEmpty(); + }) + .collect(Collectors.toSet()); + e.setFeatureInfos(featureInfos); + e.setSimpleFeatureInfos(featureInfos.stream() + .map(ListPermissionFromRoleGroupResp.FeatureInfo::getFeatureId) + .collect(Collectors.toSet())); }) .collect(Collectors.toList()); } @@ -1010,15 +1010,23 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { LogUtil.error(" find role info error,role id:{}", roleId); return Collections.emptySet(); } + List permissionDTOS = rolePermissions.get(roleId); + if (CollectionUtils.isEmpty(permissionDTOS)) { + return Collections.emptySet(); + } - Set productPermissionIds = workspaceProductPermissions.get(e.getWorkspaceId()).stream() + List productPermissions = workspaceProductPermissions.get(e.getWorkspaceId()); + if (CollectionUtils.isEmpty(productPermissions)) { + return Collections.emptySet(); + } + Set productPermissionIds = productPermissions.stream() .map(WorkspaceProductService.ProductPermission::getPermissions) .flatMap(Collection::stream) .filter(productPermission -> Objects.equals(productPermission.getCooperateType(), String.valueOf(saasRole.getProductUnitType()))) .map(ProductPermissionCacheService.PermissionDTO::getFeatureId) .collect(Collectors.toSet()); - return rolePermissions.get(roleId).stream() + return permissionDTOS.stream() .filter(rolePermission -> productPermissionIds.contains(rolePermission.getFeatureId())) .collect(Collectors.toSet()); }, (oldFeatureLists, newFeatureLists) -> { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java index 5ba05c20..9d7731f5 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java @@ -218,6 +218,9 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService { ProductPermissionCacheService.ListProductPermissionParam listProductPermissionParam = ProductPermissionCacheService.ListProductPermissionParam.builder() .productIds(productIds) .featureCodes(param.getFeatureCodes()) + .appType(param.getAppType()) + .itemCode(param.getItemCode()) + .terminal(param.getTerminal()) .build(); Map> productPermissionMap = productPermissionCacheService.list(listProductPermissionParam); diff --git a/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java b/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java index 39332068..2a5c4aaa 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java @@ -4,6 +4,7 @@ import cn.axzo.apollo.workspace.api.workspace.WorkspaceApi; import cn.axzo.basics.profiles.api.UserProfileServiceApi; import cn.axzo.framework.rocketmq.Event; import cn.axzo.framework.rocketmq.EventProducer; +import cn.axzo.maokai.api.client.OrgUserApi; import cn.axzo.thrones.client.saas.ServicePkgClient; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; @@ -49,6 +50,8 @@ public class TestConfig { private WorkspaceApi workspaceApi; @MockBean private UserProfileServiceApi userProfileServiceApi; + @MockBean + private OrgUserApi orgUserApi; @Bean @Primary diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java index ef492eef..f69bfe8d 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java @@ -5,6 +5,13 @@ import cn.axzo.apollo.workspace.api.workspace.WorkspaceApi; import cn.axzo.apollo.workspace.api.workspace.res.SimpleWorkspaceRes; import cn.axzo.basics.profiles.api.UserProfileServiceApi; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; +import cn.axzo.framework.domain.web.result.ApiListResult; +import cn.axzo.maokai.api.client.OrgUserApi; +import cn.axzo.maokai.api.vo.response.OrgUserRes; +import cn.axzo.maokai.common.enums.OrgUserStatusEnum; +import cn.axzo.thrones.client.saas.ServicePkgClient; +import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct; +import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes; import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; import cn.axzo.tyr.client.common.enums.FeatureResourceType; @@ -60,6 +67,10 @@ class RoleUserV2ControllerTest extends BaseTest { private SaasRoleUserRelationService saasRoleUserRelationService; @Autowired private TyrSaasAuthService tyrSaasAuthService; + @Autowired + private OrgUserApi orgUserApi; + @Autowired + private ServicePkgClient servicePkgClient; @BeforeEach @Override @@ -1098,26 +1109,108 @@ class RoleUserV2ControllerTest extends BaseTest { */ @Test void pageV2() { + + Mockito.when(orgUserApi.listOrgUser(Mockito.any())) + .thenReturn(ApiListResult.ok(Lists.newArrayList(OrgUserRes.builder() + .workspaceId(3L) + .ouId(4L) + .personId(3135L) + .status(OrgUserStatusEnum.JOINED) + .build(), + OrgUserRes.builder() + .workspaceId(3L) + .ouId(4L) + .personId(3470L) + .status(OrgUserStatusEnum.LEAVE) + .build()))); + ServicePkgDetailRes servicePkgDetail = new ServicePkgDetailRes(); + servicePkgDetail.setSpaceId(3L); + ServicePkgProduct servicePkgProduct = new ServicePkgProduct(); + servicePkgProduct.setProductId(2L); + servicePkgDetail.setProducts(Lists.newArrayList(servicePkgProduct)); + Mockito.when(servicePkgClient.getServicePkgDetailBySpaceId(Mockito.any())) + .thenReturn(CommonResponse.success(Lists.newArrayList(servicePkgDetail))); // old List listPermissionFromRoleGroupResps = tyrSaasAuthService.listAuthByResourceAndRoleGroup(ListPermissionFromRoleGroupReq.builder() .categoryCode("cms:zb_org_group") .categoryType(1) + .findFeatureInfo(true) .build()); Assertions.assertEquals(listPermissionFromRoleGroupResps.size(), 2); - Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getIdentityId(), 17L); - Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getIdentityType(), 3); - Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getPersonId(), 3135L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getIdentityId(), 17L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getIdentityType(), IdentityType.PRACTITIONER); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getPersonId(), 3135L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getOuId(), 4L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getWorkspaceId(), 3L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getTeamOuId(), 0L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getResourceId(), 0L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getResourceType(), 0); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getRoleGroupName(), "组织架构"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getRoleGroupCode(), "cms:zb_org_group"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getRoleId(), "100920"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getRoleName(), "工人管理"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getRoleCode(), "cms:zb_worker——management"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getPermissionGroupId(), 1211L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getSimpleFeatureInfos().size(), 3); + Assertions.assertTrue(listPermissionFromRoleGroupResps.get(1).getSimpleFeatureInfos().containsAll(Sets.newHashSet(101744L, 101745L, 101746L))); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(1).getFeatureInfos().size(), 3); + Assertions.assertEquals(Lists.newArrayList(listPermissionFromRoleGroupResps.get(1).getFeatureInfos()).get(0).getFeatureId(), 101745L); + Assertions.assertEquals(Lists.newArrayList(listPermissionFromRoleGroupResps.get(1).getFeatureInfos()).get(0).getRelationType(), 1); + Assertions.assertEquals(Lists.newArrayList(listPermissionFromRoleGroupResps.get(1).getFeatureInfos()).get(0).getTags().size(), 1); + Assertions.assertTrue(Lists.newArrayList(listPermissionFromRoleGroupResps.get(1).getFeatureInfos()).get(0).getTags() + .containsAll(Sets.newHashSet(cn.axzo.tyr.client.model.enums.RolePermissionTagEnum.JOINED))); + + + listPermissionFromRoleGroupResps = tyrSaasAuthService.listAuthByResourceAndRoleGroup(ListPermissionFromRoleGroupReq.builder() + .categoryCode("cms:zb_cost_group") + .categoryType(2) + .findFeatureInfo(true) + .build()); + Assertions.assertEquals(listPermissionFromRoleGroupResps.size(), 9); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getIdentityId(), 36L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getIdentityType(), IdentityType.PRACTITIONER); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getPersonId(), 3470L); Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getOuId(), 4L); Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getWorkspaceId(), 3L); Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getTeamOuId(), 0L); Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getResourceId(), 0L); Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getResourceType(), 0); - Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleGroupName(), "组织架构"); - Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleGroupCode(), "cms:zb_org_group"); - Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleId(), 100920L); - Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleName(), "工人管理"); - Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleCode(), 2); - Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getPermissionGroupId(), 2); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleGroupName(), "成本管理"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleGroupCode(), "cms:zb_cost_group"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleId(), "100923"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleName(), "查看合约"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleCode(), "cms:zb_contact_view"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getPermissionGroupId(), 1214L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getSimpleFeatureInfos().size(), 0); + + listPermissionFromRoleGroupResps = tyrSaasAuthService.listAuthByResourceAndRoleGroup(ListPermissionFromRoleGroupReq.builder() + .categoryCode("cms:zb_cost_group") + .categoryType(3) + .build()); + Assertions.assertEquals(listPermissionFromRoleGroupResps.size(), 8); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getIdentityId(), 14L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getIdentityType(), IdentityType.PRACTITIONER); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getPersonId(), 0L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getOuId(), 4L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getWorkspaceId(), 3L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getTeamOuId(), 0L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getResourceId(), 0L); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getResourceType(), 0); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleGroupName(), "工人管理"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleGroupCode(), "cms:zb_cost_group2"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleId(), "100921"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleName(), "查看组织架构"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getRoleCode(), "cms:zb_org_view"); + Assertions.assertEquals(listPermissionFromRoleGroupResps.get(0).getPermissionGroupId(), 1212L); + // old + + roleUserV2Controller.page(PageRoleUserReq.builder() + .roleGroupCode("cms:zb_org_group") + .needRole(true) + .needFeatureResources(true) + .build()) + .getData() + .getData(); } } \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql index 7369b1b5..b823e51b 100644 --- a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql @@ -100,7 +100,76 @@ VALUES (104, '2', '1', '组织架构', -1, -1, 14, 4, 'cms:zb_org_group', '', 0, INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) VALUES (105, '2', '1', '成本管理', -1, -1, 14, 5, 'cms:zb_cost_group', '', 0, '2024-09-25 11:51:55', '2024-09-25 11:51:55', '14,105,'); INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) -VALUES (106, '2', '1', '工人管理', -1, -1, 105, 5, 'cms:zb_cost_group', '', 0, '2024-09-25 11:51:55', '2024-09-25 11:51:55', '14,105,106,'); +VALUES (106, '2', '1', '工人管理', -1, -1, 105, 5, 'cms:zb_cost_group2', '', 0, '2024-09-25 11:51:55', '2024-09-25 11:51:55', '14,105,106,'); + +INSERT INTO product_module (id, icon, product_type, product_name, dict_workspace_type_id, dict_workspace_type_code, status, common_product, remark, auth_type, ou_type, is_delete, create_by, create_at, update_at, update_by, category, version, max_person_count, max_workspace_count, price, skus, material) +VALUES (2, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/test/1695286111017-Snipaste_09-13 16-24.png', 2, '项目基础', 2, '2', 1, 1, '', 1, null, 0, 0, '2022-08-17 19:46:11', '2024-12-12 15:37:27', 89601, 'GENERAL_SERVICE', 0, 0, 0, 0, NULL, NULL); + +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257742, 2, 7, '1', 101744, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257743, 2, 7, '1', 101745, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257744, 2, 7, '1', 101746, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257745, 2, 7, '1', 4443, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257746, 2, 7, '1', 4416, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257747, 2, 7, '1', 4417, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257748, 2, 7, '1', 4418, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257749, 2, 7, '1', 4419, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257750, 2, 7, '1', 4420, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257751, 2, 7, '1', 912, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); + +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (14744, 'cms:pro_construction_contract_management', 'cms:pro_contract_management_7701', 1, 'NT_CMS_WEB_GENERAL', '2024-07-10 20:39:15', '2024-07-10 20:39:15', null, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (18070, 'cms:pro_construction_contract_management', 'cms:pro_contract_management_7701', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (18079, 'cms:pro_construction_contract_detail', 'cms:pro_contract_detail_7707', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (18080, 'cms:pro_construction_contract_detail_inventory_submit_audit', 'cms:pro_contract_detail_7707', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24219, 'h5:cmp_user_manage_worker_jump_to_team_btn', 'cmp:pro_team_list_0443', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24220, 'h5:cmp_user_manage_worker_page', 'cmp:pro_team_list_0443', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24221, 'h5:cmp_user_manage_worker_labor_audit_btn', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24222, 'h5:cmp_user_manage_worker_page', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24223, 'h5:cmp_user_manage_labor_audit_page', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24224, 'h5:cmp_user_manage_labor_audit_detail_btn', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24225, 'h5:cmp_user_manage_worker_on_site_audit_btn', 'cmp:pro_team_leader_invite_recorder_0446', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); + + +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (718447, 'cms:pro_construction_contract_management', 'cms:pro_construction_contract_management', '合约管理', 'PAGE', '/netConstruction/construction/contract-manage', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:23', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (718451, 'cms:pro_construction_contract_detail', 'cms:pro_construction_contract_detail', '合约详情', 'PAGE', '/netConstruction/construction/contract-manage/contract-detail', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:23', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (718455, 'cms:pro_construction_contract_detail', 'cms:pro_construction_contract_detail_inventory_submit_audit', '合约详情-提交审批', 'COMPONENT', '', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:25', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369205, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_jump_to_team_btn', '人员管理-施工人员-跳转班组', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369197, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_page', '人员管理-施工人员', 'PAGE', '__UNI__D9B0186#/pages/worker/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:40', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369202, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_labor_audit_btn', '人员管理-施工人员-劳务审核', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369218, 'h5:cmp_user_manage_labor_audit_page', 'h5:cmp_user_manage_labor_audit_page', '人员管理-劳务审核', 'PAGE', '__UNI__D9B0186#/pages/labour/verify/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369219, 'h5:cmp_user_manage_labor_audit_page', 'h5:cmp_user_manage_labor_audit_detail_btn', '人员管理-劳务审核-详情', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369203, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_on_site_audit_btn', '人员管理-施工人员-进场审核', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369216, 'h5:cmp_user_manage_on_site_audit_page', 'h5:cmp_user_manage_on_site_audit_page', '人员管理-进场审核', 'PAGE', '__UNI__D9B0186#/pages/labour/enterAudit/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); #-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/schema.sql b/tyr-server/src/test/resources/mysql/schema.sql index 08089ce3..6a4ff1f4 100644 --- a/tyr-server/src/test/resources/mysql/schema.sql +++ b/tyr-server/src/test/resources/mysql/schema.sql @@ -205,6 +205,7 @@ CREATE TABLE `saas_page_element_feature_resource_relation` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键ID', `page_element_code` varchar(64) NOT NULL COMMENT '页面元素code', `feature_resource_uni_code` varchar(64) NOT NULL COMMENT '菜单组件code', + `type` tinyint default 0 not null comment '绑定类型:0(默认类型) 1(页面默认路由)', `terminal` varchar(32) NOT NULL DEFAULT '' COMMENT '资源所属端', `create_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', From 40aab9756092e82ac081d681669a1f743d567425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Mon, 16 Dec 2024 19:34:12 +0800 Subject: [PATCH 13/25] =?UTF-8?q?feat:(REQ-3282)=20=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=9C=89=E6=9D=83=E9=99=90=E7=9A=84=E7=94=A8=E6=88=B7=E3=80=81?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/feign/api/RoleUserApi.java | 9 ++ .../axzo/tyr/feign/api/UserPermissionApi.java | 18 +++- .../tyr/feign/req/ListPermissionUserReq.java | 59 +++++++++++++ .../axzo/tyr/feign/req/UpsertUserRoleReq.java | 81 ++++++++++++++++++ .../tyr/feign/resp/PermissionUserResp.java | 36 ++++++++ .../controller/v2/RoleUserV2Controller.java | 6 ++ .../v2/UserPermissionController.java | 9 +- .../service/impl/PermissionServiceImpl.java | 82 ++++++++++--------- .../impl/SaasRoleUserRelationServiceImpl.java | 2 +- 9 files changed, 259 insertions(+), 43 deletions(-) create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListPermissionUserReq.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/req/UpsertUserRoleReq.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionUserResp.java diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java index 5fba10f1..dc32bc6e 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/RoleUserApi.java @@ -3,6 +3,7 @@ package cn.axzo.tyr.feign.api; import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.result.ApiResult; import cn.axzo.tyr.feign.req.PageRoleUserReq; +import cn.axzo.tyr.feign.req.UpsertUserRoleReq; import cn.axzo.tyr.feign.resp.RoleUserResp; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.validation.annotation.Validated; @@ -19,4 +20,12 @@ public interface RoleUserApi { */ @PostMapping("/api/role-user/page") ApiResult> page(@RequestBody @Validated PageRoleUserReq req); + + /** + * 更新用户角色 + * @param req + * @return + */ + @PostMapping("/api/user-role/upsert") + ApiResult upsertUserRole(@RequestBody @Validated UpsertUserRoleReq req); } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/UserPermissionApi.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/UserPermissionApi.java index 55182d70..c6f29ebb 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/UserPermissionApi.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/UserPermissionApi.java @@ -1,7 +1,9 @@ package cn.axzo.tyr.feign.api; import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.feign.req.ListPermissionUserReq; import cn.axzo.tyr.feign.req.ListUserPermissionReq; +import cn.axzo.tyr.feign.resp.PermissionUserResp; import cn.axzo.tyr.feign.resp.UserPermissionResp; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.validation.annotation.Validated; @@ -13,6 +15,20 @@ import java.util.List; @FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") public interface UserPermissionApi { + /** + * 查询用户的权限 + * @param req + * @return + */ @PostMapping("/api/user-permission/list") - ApiResult> list(@RequestBody @Validated ListUserPermissionReq req); + ApiResult> listUserPermission(@RequestBody @Validated ListUserPermissionReq req); + + /** + * 查询有权限的用户 + * @param req + * @return + */ + @PostMapping("/api/permission-user/list") + ApiResult> listPermissionUser(@RequestBody @Validated ListPermissionUserReq req); + } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListPermissionUserReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListPermissionUserReq.java new file mode 100644 index 00000000..8ab7a860 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListPermissionUserReq.java @@ -0,0 +1,59 @@ +package cn.axzo.tyr.feign.req; + +import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ListPermissionUserReq { + + @Valid + @NotEmpty(message = "permissionUsers不能为空") + private Set permissionUsers; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class PermissionUserReq { + /** + * 权限码 + */ + + @NotBlank(message = "featureCode不能为空") + private String featureCode; + + /** + * 单位id + */ + @NotNull(message = "ouId不能为空") + private Long ouId; + + /** + * 项目Id + */ + @NotNull(message = "workspaceId不能为空") + private Long workspaceId; + + /** + * 指定端的权限 + */ + private String terminal; + + /** + * 指定权限标签 + */ + private Set tags; + } +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/UpsertUserRoleReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/UpsertUserRoleReq.java new file mode 100644 index 00000000..8cf0aa5a --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/UpsertUserRoleReq.java @@ -0,0 +1,81 @@ +package cn.axzo.tyr.feign.req; + +import cn.axzo.tyr.feign.enums.IdentityTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UpsertUserRoleReq { + + @Valid + @NotEmpty(message = "userRoles不能为空") + private Set userRoles; + + /** + * 操作人personId + */ + @NotNull(message = "operatorId不能为空") + private Long operatorId; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class UserRoleReq { + + @NotNull(message = "workspaceId不能为空") + private Long workspaceId; + + @NotNull(message = "ouId不能为空") + private Long ouId; + + @NotNull(message = "identityId不能为空") + private Long identityId; + + @NotNull(message = "identityType不能为空") + private IdentityTypeEnum identityType; + + @NotNull(message = "personId不能为空") + private Long personId; + + /** + * 增量新增的角色id + */ + private Set insertRoleIds; + + /** + * 增量新增的角色code + */ + private Set insertRoleCodes; + + /** + * 全量新增的角色id + */ + private Set fullRoleIds; + + /** + * 全量新增的角色code + */ + private Set fullRoleCodes; + + /** + * 删除用户的角色id + */ + private Set removeRoleIds; + + /** + * 删除用户的角色code + */ + private Set removeRoleCodes; + } +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionUserResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionUserResp.java new file mode 100644 index 00000000..14e8879e --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionUserResp.java @@ -0,0 +1,36 @@ +package cn.axzo.tyr.feign.resp; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PermissionUserResp { + + private Long ouId; + + private Long workspaceId; + + private Set users; + + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class User { + + private Long identityId; + + private Integer identityType; + + private Long personId; + + private boolean isSuperAdmin; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java index 1f88aec4..f04cad6e 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java @@ -7,6 +7,7 @@ import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationParam; import cn.axzo.tyr.feign.api.RoleUserApi; import cn.axzo.tyr.feign.req.PageRoleUserReq; +import cn.axzo.tyr.feign.req.UpsertUserRoleReq; import cn.axzo.tyr.feign.resp.FeatureResourceRelationResp; import cn.axzo.tyr.feign.resp.RoleFeatureResourceResp; import cn.axzo.tyr.feign.resp.RoleResp; @@ -49,6 +50,11 @@ public class RoleUserV2Controller implements RoleUserApi { .build()); } + @Override + public ApiResult upsertUserRole(UpsertUserRoleReq req) { + return null; + } + private PageRoleUserRelationParam from(PageRoleUserReq req) { PageRoleUserRelationParam result = JSON.parseObject(JSON.toJSONString(req), PageRoleUserRelationParam.class); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java index d157ff23..7ba22e5c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java @@ -6,7 +6,9 @@ import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.feign.api.UserPermissionApi; +import cn.axzo.tyr.feign.req.ListPermissionUserReq; import cn.axzo.tyr.feign.req.ListUserPermissionReq; +import cn.axzo.tyr.feign.resp.PermissionUserResp; import cn.axzo.tyr.feign.resp.UserPermissionResp; import cn.axzo.tyr.server.service.PermissionService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; @@ -31,7 +33,7 @@ public class UserPermissionController implements UserPermissionApi { private SaasRoleUserRelationService saasRoleUserRelationService; @Override - public ApiResult> list(ListUserPermissionReq req) { + public ApiResult> listUserPermission(ListUserPermissionReq req) { check(req); @@ -41,6 +43,11 @@ public class UserPermissionController implements UserPermissionApi { return null; } + @Override + public ApiResult> listPermissionUser(ListPermissionUserReq req) { + return null; + } + private void check(ListUserPermissionReq req) { Axssert.check(Objects.nonNull(req.getPersonId()) || Objects.nonNull(req.getIdentityId()), diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java index 10521607..25db16c3 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java @@ -87,7 +87,7 @@ public class PermissionServiceImpl implements PermissionService { Set adminRolePermission = resolveAdminRolePermission(workspacePermissions, user); // 用户普通角色的权限 - + return null; }) .filter(Objects::nonNull) .collect(Collectors.toList()); @@ -181,46 +181,48 @@ public class PermissionServiceImpl implements PermissionService { return Collections.emptySet(); } - return normalRoles.stream() - .map(role -> { + return Collections.emptySet(); - Set rolePermissionFeatureCodes = Optional.ofNullable(rolePermissionMap.get(role.getId())) - .map(e -> e.stream() - .filter(Objects::nonNull) - .filter(rolePermission -> { - if (CollectionUtils.isEmpty(workspaceOuPair.getTags()) || CollectionUtils.isEmpty(rolePermission.getTags())) { - return true; - } - - if (Sets.intersection(workspaceOuPair.getTags(), rolePermission.getTags()).isEmpty()) { - return false; - } - - return true; - }) - .map(RolePermissionCacheService.PermissionDTO::getFeatureCode) - .collect(Collectors.toSet())) - .orElseGet(Sets::newHashSet); - - if (CollectionUtils.isEmpty(rolePermissionFeatureCodes)) { - return null; - } - - return productPermissions.stream() - .filter(productPermission -> Objects.equals(productPermission.getCooperateType(), String.valueOf(role.getProductUnitType()))) - .filter(productPermission -> rolePermissionFeatureCodes.contains(productPermission.getFeatureCode())) - .map(e -> IdentityAuthRes.PermissionPoint.builder() - .featureCode(e.getFeatureCode()) - .featureId(e.getFeatureId()) - .terminal(e.getTerminal()) - .featureType(e.getFeatureType()) - .build()) - .collect(Collectors.toSet()); - - }) - .filter(Objects::nonNull) - .flatMap(Collection::stream) - .collect(Collectors.toSet()); +// return normalRoles.stream() +// .map(role -> { +// +// Set rolePermissionFeatureCodes = Optional.ofNullable(rolePermissionMap.get(role.getId())) +// .map(e -> e.stream() +// .filter(Objects::nonNull) +// .filter(rolePermission -> { +// if (CollectionUtils.isEmpty(workspaceOuPair.getTags()) || CollectionUtils.isEmpty(rolePermission.getTags())) { +// return true; +// } +// +// if (Sets.intersection(workspaceOuPair.getTags(), rolePermission.getTags()).isEmpty()) { +// return false; +// } +// +// return true; +// }) +// .map(RolePermissionCacheService.PermissionDTO::getFeatureCode) +// .collect(Collectors.toSet())) +// .orElseGet(Sets::newHashSet); +// +// if (CollectionUtils.isEmpty(rolePermissionFeatureCodes)) { +// return null; +// } +// +// return productPermissions.stream() +// .filter(productPermission -> Objects.equals(productPermission.getCooperateType(), String.valueOf(role.getProductUnitType()))) +// .filter(productPermission -> rolePermissionFeatureCodes.contains(productPermission.getFeatureCode())) +// .map(e -> IdentityAuthRes.PermissionPoint.builder() +// .featureCode(e.getFeatureCode()) +// .featureId(e.getFeatureId()) +// .terminal(e.getTerminal()) +// .featureType(e.getFeatureType()) +// .build()) +// .collect(Collectors.toSet()); +// +// }) +// .filter(Objects::nonNull) +// .flatMap(Collection::stream) +// .collect(Collectors.toSet()); } private Map> listRolePermission(ListUserPermissionParam param) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index ed56cda8..abb0ac76 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -681,6 +681,6 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl Date: Wed, 18 Dec 2024 14:19:28 +0800 Subject: [PATCH 14/25] =?UTF-8?q?feat:(REQ-3282)=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=94=A8=E6=88=B7=E6=9D=83=E9=99=90=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../req/ListRoleUserRelationParam.java | 2 + .../tyr/feign/enums/IdentityTypeEnum.java | 14 + .../cn/axzo/tyr/feign/enums/RoleTypeEnum.java | 14 + .../tyr/feign/req/ListUserPermissionReq.java | 58 +- .../axzo/tyr/feign/resp/PermissionResp.java | 9 +- .../tyr/feign/resp/UserPermissionResp.java | 32 +- .../v2/UserPermissionController.java | 172 +++- .../tyr/server/service/PermissionService.java | 11 +- .../service/impl/PermissionServiceImpl.java | 192 ++-- .../impl/SaasRoleUserRelationServiceImpl.java | 1 + .../java/cn/axzo/tyr/base/TestConfig.java | 3 + .../v2/RoleUserV2ControllerTest.java | 13 +- .../v2/UserPermissionControllerTest.java | 832 ++++++++++++++++++ .../resources/mysql/RoleControllerTest.sql | 2 +- .../mysql/RoleGroupControllerTest.sql | 2 +- .../test/resources/mysql/RoleServiceTest.sql | 2 +- .../resources/mysql/RoleUserServiceTest.sql | 2 +- .../mysql/RoleUserV2ControllerTest.sql | 2 +- .../mysql/UserPermissionControllerTest.sql | 175 ++++ 19 files changed, 1388 insertions(+), 150 deletions(-) create mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/UserPermissionControllerTest.java create mode 100644 tyr-server/src/test/resources/mysql/UserPermissionControllerTest.sql diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java index 44c836c7..839691b1 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/ListRoleUserRelationParam.java @@ -201,6 +201,8 @@ public class ListRoleUserRelationParam { private Long ouId; private Long personId; + + private Long resourceId; } } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/IdentityTypeEnum.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/IdentityTypeEnum.java index ccbf816d..b4720fb7 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/IdentityTypeEnum.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/IdentityTypeEnum.java @@ -3,6 +3,10 @@ package cn.axzo.tyr.feign.enums; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Arrays; +import java.util.Objects; +import java.util.Optional; + /** * 人员身份类型枚举 * @@ -24,4 +28,14 @@ public enum IdentityTypeEnum { private final Integer code; private final String message; private final String desc; + + public static Optional fromCode(Integer code) { + if (Objects.isNull(code)) { + return Optional.empty(); + } + + return Arrays.stream(IdentityTypeEnum.values()) + .filter(e -> Objects.equals(e.getCode(), code)) + .findFirst(); + } } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RoleTypeEnum.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RoleTypeEnum.java index ab94b5de..32718ea4 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RoleTypeEnum.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/enums/RoleTypeEnum.java @@ -2,6 +2,11 @@ package cn.axzo.tyr.feign.enums; import lombok.AllArgsConstructor; import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.Objects; +import java.util.Optional; /** * @author tanjie@axzo.cn @@ -21,4 +26,13 @@ public enum RoleTypeEnum { private final String value; private final String desc; private final boolean isAdmin; + + public static Optional fromValue(String value) { + if (StringUtils.isBlank(value)) { + return Optional.empty(); + } + return Arrays.stream(RoleTypeEnum.values()) + .filter(e -> Objects.equals(e.getValue(), value)) + .findFirst(); + } } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListUserPermissionReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListUserPermissionReq.java index f41b2b8e..a649763b 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListUserPermissionReq.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/ListUserPermissionReq.java @@ -7,7 +7,9 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.Valid; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.util.List; import java.util.Set; @@ -18,20 +20,11 @@ import java.util.Set; public class ListUserPermissionReq { /** - * 人员id - * 根据personId查询权限或者根据identityId、identityType查询权限,不能同时都为空 + * 不能给太多,性能会有问题,一般控制在5个以内合适 */ - private Long personId; - - /** - * 身份id - */ - private Long identityId; - - /** - * 身份类型 - */ - private IdentityTypeEnum identityType; + @Valid + @NotEmpty(message = "userPermissions不能为空") + private List userPermissions; /** * 权限code @@ -44,12 +37,6 @@ public class ListUserPermissionReq { */ private String terminal; - /** - * 项目信息 - */ - @NotEmpty(message = "workspaceOuPairs不能为空") - private List workspaceOuPairs; - /** * app类型(APP:原生,H5:h5页面) */ @@ -65,21 +52,52 @@ public class ListUserPermissionReq { @Builder @NoArgsConstructor @AllArgsConstructor - public static class WorkspaceOuPair { + public static class UserPermission { + /** + * 人员id + * 根据personId查询权限或者根据identityId、identityType查询权限,不能同时都为空 + */ + private Long personId; + + /** + * 身份id + */ + private Long identityId; + + /** + * 身份类型 + */ + private IdentityTypeEnum identityType; + /** * 租户id */ + @NotNull(message = "workspaceId不能为空") private Long workspaceId; /** * 单位id */ + @NotNull(message = "ouId不能为空") private Long ouId; + /** + * 人岗架部门id + */ + private Long nodeId; + /** * 根据权限标签去过滤角色对应的权限 * 如果没有指定值,则会根据用户在当前workspaceId和ouId在人岗架的状态来解析 */ private Set permissionTags; + + public String buildPersonKey() { + return this.getPersonId() + "_" + this.getWorkspaceId() + "_" + this.getOuId(); + } + + public String buildIdentityKey() { + return this.getIdentityId() + "_" + this.getIdentityType().getCode() + "_" + this.getWorkspaceId() + "_" + this.getOuId(); + } } } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionResp.java index a835969e..9c70972f 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionResp.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/PermissionResp.java @@ -25,9 +25,7 @@ public class PermissionResp { private String featureCode; /** - * 新旧权限 - * 0:表示id是saas_feature的id - * 1:表示id是saas_feature_resource的id + * 权限点的类型 */ private Integer featureType; @@ -35,9 +33,4 @@ public class PermissionResp { * 端信息 */ private String terminal; - - /** - * 权限的标签 - */ - private Set tags; } diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/UserPermissionResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/UserPermissionResp.java index 43099be6..22616c64 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/UserPermissionResp.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/UserPermissionResp.java @@ -13,7 +13,6 @@ import java.util.List; @AllArgsConstructor public class UserPermissionResp { - /** * 人员id */ @@ -30,25 +29,24 @@ public class UserPermissionResp { private String identityType; /** - * 用户在项目的权限 + * 项目id */ - private List workspacePermissions; + private Long workspaceId; - @Data - @Builder - @AllArgsConstructor - @NoArgsConstructor - public static class WorkspacePermission { + /** + * 单位id + */ + private Long ouId; - private Long workspaceId; + /** + * 部门id + */ + private Long nodeId; - private Long ouId; + /** + * 是否是超管 + */ + private Boolean isSuperAdmin; - /** - * 是否是超管 - */ - private Boolean isSuperAdmin; - - private List permissions; - } + private List permissions; } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java index 7ba22e5c..aa901f15 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java @@ -2,23 +2,32 @@ package cn.axzo.tyr.server.controller.v2; import cn.axzo.foundation.exception.Axssert; import cn.axzo.foundation.result.ApiResult; -import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.feign.api.UserPermissionApi; +import cn.axzo.tyr.feign.enums.IdentityTypeEnum; +import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; +import cn.axzo.tyr.feign.enums.RoleTypeEnum; import cn.axzo.tyr.feign.req.ListPermissionUserReq; import cn.axzo.tyr.feign.req.ListUserPermissionReq; import cn.axzo.tyr.feign.resp.PermissionUserResp; import cn.axzo.tyr.feign.resp.UserPermissionResp; import cn.axzo.tyr.server.service.PermissionService; +import cn.axzo.tyr.server.service.PermissionTagService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RestController; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import static cn.axzo.tyr.server.config.exception.BizResultCode.PARAM_ERROR; @@ -31,6 +40,8 @@ public class UserPermissionController implements UserPermissionApi { private PermissionService permissionService; @Autowired private SaasRoleUserRelationService saasRoleUserRelationService; + @Autowired + private PermissionTagService permissionTagService; @Override public ApiResult> listUserPermission(ListUserPermissionReq req) { @@ -39,8 +50,24 @@ public class UserPermissionController implements UserPermissionApi { List saasRoleUsers = listRoleUserRelation(req); + if (CollectionUtils.isEmpty(saasRoleUsers)) { + return ApiResult.success(); + } - return null; + assembleTag(req); + + // 按照最细的维度进行用户的权限解析,这样才能组装成其他维度的数据 + List userParams = resolveUserParam(saasRoleUsers, req); + + List userPermissionResps = permissionService.listUserPermission(PermissionService.ListUserPermissionParam.builder() + .featureCodes(req.getFeatureCodes()) + .terminal(req.getTerminal()) + .appType(req.getAppType()) + .itemCode(req.getItemCode()) + .users(userParams) + .build()); + + return ApiResult.success(userPermissionResps); } @Override @@ -50,29 +77,38 @@ public class UserPermissionController implements UserPermissionApi { private void check(ListUserPermissionReq req) { - Axssert.check(Objects.nonNull(req.getPersonId()) || Objects.nonNull(req.getIdentityId()), - PARAM_ERROR, PARAM_ERROR.getErrorMessage(), "personId 和 identityId不能同时为空"); + req.getUserPermissions().forEach(user -> { + if (Objects.nonNull(user.getPersonId()) && (Objects.nonNull(user.getIdentityId()) || Objects.nonNull(user.getIdentityType()))) { + throw PARAM_ERROR.toException(PARAM_ERROR.getErrorMessage(), "personId 和 identityId只能二选一"); + } - if (Objects.nonNull(req.getIdentityId())) { - Axssert.check(Objects.nonNull(req.getIdentityType()), - PARAM_ERROR, PARAM_ERROR.getErrorMessage(), "identityType不能为空"); - } + Axssert.check(Objects.nonNull(user.getPersonId()) || Objects.nonNull(user.getIdentityId()), + PARAM_ERROR, PARAM_ERROR.getErrorMessage(), "personId 和 identityId不能同时为空"); + + if (Objects.nonNull(user.getIdentityId())) { + Axssert.check(Objects.nonNull(user.getIdentityType()), + PARAM_ERROR, PARAM_ERROR.getErrorMessage(), "identityType不能为空"); + } + }); } private List listRoleUserRelation(ListUserPermissionReq req) { + List batchPersons = req.getUserPermissions().stream() + .map(user -> ListRoleUserRelationParam.BatchPerson.builder() + .personId(user.getPersonId()) + .identityId(user.getIdentityId()) + .identityType(Optional.ofNullable(user.getIdentityType()) + .map(IdentityTypeEnum::getCode) + .orElse(null)) + .workspaceId(user.getWorkspaceId()) + .ouId(user.getOuId()) + .resourceId(user.getNodeId()) + .build()) + .collect(Collectors.toList()); + ListRoleUserRelationParam listRoleUserRelationParam = ListRoleUserRelationParam.builder() - .personId(req.getPersonId()) - .identityId(req.getIdentityId()) - .identityType(Optional.ofNullable(req.getIdentityType()) - .map(e -> IdentityType.valueOf(e.name())) - .orElse(null)) - .workspaceOuPairs(req.getWorkspaceOuPairs().stream() - .map(e -> ListRoleUserRelationParam.WorkspaceOuPair.builder() - .workspaceId(e.getWorkspaceId()) - .ouId(e.getOuId()) - .build()) - .collect(Collectors.toList())) + .batchPersons(batchPersons) .needRole(true) .build(); @@ -80,4 +116,102 @@ public class UserPermissionController implements UserPermissionApi { .filter(e -> e.getSaasRole() != null) .collect(Collectors.toList()); } + + private Set resolveRoles(Map> personIdRoleUserMap, + Map> identityIdRoleUserMap, + ListUserPermissionReq.UserPermission userPermission) { + List roleUsers = Lists.newArrayList(); + if (Objects.nonNull(userPermission.getPersonId())) { + roleUsers = personIdRoleUserMap.get(userPermission.buildPersonKey()); + } + + if (Objects.nonNull(userPermission.getIdentityId()) && Objects.nonNull(userPermission.getIdentityType())) { + roleUsers = identityIdRoleUserMap.get(userPermission.buildIdentityKey()); + } + + if (CollectionUtils.isEmpty(roleUsers)) { + return Collections.emptySet(); + } + + return roleUsers.stream() + .filter(e -> { + if (Objects.isNull(userPermission.getNodeId())) { + return true; + } + return Objects.equals(userPermission.getNodeId(), e.getResourceId()); + }) + .map(e -> + PermissionService.RoleParam.builder() + .roleId(e.getRoleId()) + .roleType(RoleTypeEnum.fromValue(e.getSaasRole().getRoleType()).orElse(null)) + .cooperateShipTypes(e.getSaasRole().getProductUnitType()) + .build()) + .collect(Collectors.toSet()); + } + + private List resolveUserParam(List saasRoleUsers, + ListUserPermissionReq req) { + + // 因为入参可能是根据personId来查询也可能根据identityId和identityType来查询,这里就需要组装多个map方便解析用户的role信息 + Map> personIdRoleUserMap = saasRoleUsers.stream() + .collect(Collectors.groupingBy(e -> e.getSaasRoleUser().getPersonId() + "_" + e.getWorkspaceId() + "_" + e.getOuId())); + + Map> identityIdRoleUserMap = saasRoleUsers.stream() + .collect(Collectors.groupingBy(e -> e.getIdentityId() + "_" + e.getIdentityType() + "_" + e.getWorkspaceId() + "_" + e.getOuId())); + + return req.getUserPermissions().stream() + .map(user -> + PermissionService.UserParam.builder() + .identityId(user.getIdentityId()) + .identityType(Optional.ofNullable(user.getIdentityType()) + .map(IdentityTypeEnum::getCode) + .orElse(null)) + .personId(user.getPersonId()) + .workspaceId(user.getWorkspaceId()) + .ouId(user.getOuId()) + .nodeId(user.getNodeId()) + .roles(resolveRoles(personIdRoleUserMap, identityIdRoleUserMap, user)) + .tags(user.getPermissionTags()) + .build()) + .collect(Collectors.toList()); + + } + + private void assembleTag(ListUserPermissionReq req) { + + List needResolveTags = req.getUserPermissions().stream() + .filter(e -> CollectionUtils.isEmpty(e.getPermissionTags())) + .collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(needResolveTags)) { + return; + } + + PermissionTagService.ResolvePermissionTagParam resolvePermissionTagParam = PermissionTagService.ResolvePermissionTagParam.builder() + .personPermissions(needResolveTags.stream() + .map(e -> PermissionTagService.PersonPermission.builder() + .workspaceId(e.getWorkspaceId()) + .ouId(e.getOuId()) + .personId(e.getPersonId()) + .build()) + .collect(Collectors.toList())) + .build(); + Map resolvePermissions = permissionTagService.resolvePermissionTag(resolvePermissionTagParam).stream() + .collect(Collectors.toMap(e -> e.getPersonId() + "_" + e.getOuId() + "_" + e.getWorkspaceId(), Function.identity())); + + req.getUserPermissions().forEach(e -> { + if (!CollectionUtils.isEmpty(e.getPermissionTags())) { + return; + } + + PermissionTagService.ResolvePermissionDTO resolvePermissionDTO = resolvePermissions.get(e.getPersonId() + "_" + e.getOuId() + "_" + e.getWorkspaceId()); + if (Objects.isNull(resolvePermissionDTO)) { + return; + } + + e.setPermissionTags(resolvePermissionDTO.getTags().stream() + .map(tag -> RolePermissionTagEnum.valueOf(tag.name())) + .collect(Collectors.toSet())); + }); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java index 4de3f781..f01e1848 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java @@ -14,7 +14,7 @@ import java.util.Set; public interface PermissionService { - Map> listUserPermission(ListUserPermissionParam param); + List listUserPermission(ListUserPermissionParam param); @Data @Builder @@ -51,6 +51,11 @@ public interface PermissionService { @NoArgsConstructor @AllArgsConstructor class UserParam { + + private Long identityId; + + private Integer identityType; + private Long personId; private Set tags; @@ -58,6 +63,10 @@ public interface PermissionService { private Set roles; private Long workspaceId; + + private Long ouId; + + private Long nodeId; } @Data diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java index 25db16c3..3e1cc496 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java @@ -1,7 +1,8 @@ package cn.axzo.tyr.server.service.impl; -import cn.axzo.tyr.client.model.res.IdentityAuthRes; +import cn.axzo.tyr.feign.enums.IdentityTypeEnum; import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; +import cn.axzo.tyr.feign.enums.RoleTypeEnum; import cn.axzo.tyr.feign.resp.PermissionResp; import cn.axzo.tyr.feign.resp.UserPermissionResp; import cn.axzo.tyr.server.service.PermissionService; @@ -51,28 +52,31 @@ public class PermissionServiceImpl implements PermissionService { * */ @Override - public Map> listUserPermission(ListUserPermissionParam param) { + public List listUserPermission(ListUserPermissionParam param) { if (CollectionUtils.isEmpty(param.getUsers())) { - return Collections.emptyMap(); + return Collections.emptyList(); } // 查询项目的权限 Map> workspacePermissionMap = listWorkspacePermission(param); if (Objects.isNull(workspacePermissionMap) || workspacePermissionMap.isEmpty()) { - return Collections.emptyMap(); + return Collections.emptyList(); } // 查询产品的端的所有菜单信息 List allFeatureResources = listAllSaasFeature(workspacePermissionMap); if (CollectionUtils.isEmpty(allFeatureResources)) { - return Collections.emptyMap(); + return Collections.emptyList(); } + Set effectFeatureIds = allFeatureResources.stream() + .map(SaasFeatureResourceService.SaasFeatureResourceCache::getFeatureId) + .collect(Collectors.toSet()); // 查询角色的权限 Map> rolePermissions = listRolePermission(param); // 按照人去解析每个人的权限,因为每个人的tag可能不一样 - param.getUsers().stream() + return param.getUsers().stream() .map(user -> { if (CollectionUtils.isEmpty(user.getRoles())) { return null; @@ -83,18 +87,44 @@ public class PermissionServiceImpl implements PermissionService { return null; } - // 用户在场时的管理员角色的权限 - Set adminRolePermission = resolveAdminRolePermission(workspacePermissions, user); + // 匹配用户在场时的管理员角色的权限,管理员角色的权限是对应的项目的权限 + Set adminRolePermissions = resolveAdminRolePermission(workspacePermissions, user); - // 用户普通角色的权限 - return null; + // 匹配普通角色的权限,需要根据角色配置的权限和项目的权限去匹配(单位类型、tag等信息) + Set normalRolePermissionPoints = resolveNormalRolePermission(workspacePermissions, user, rolePermissions); + + Set notAuthPermissionPoints = resolveNotAuthPermission(workspacePermissions, allFeatureResources); + + //组装返回值 + //是否超管 + + boolean isSuperAdmin = user.getRoles().stream() + .anyMatch(f -> Objects.equals(RoleTypeEnum.SUPER_ADMIN, f.getRoleType())); + UserPermissionResp result = UserPermissionResp.builder() + .identityId(user.getIdentityId()) + .identityType(IdentityTypeEnum.fromCode(user.getIdentityType()) + .map(IdentityTypeEnum::name) + .orElse(null)) + .personId(user.getPersonId()) + .ouId(user.getOuId()) + .workspaceId(user.getWorkspaceId()) + .nodeId(user.getNodeId()) + .isSuperAdmin(isSuperAdmin) + .build(); + + Set allPermissionPoints = Sets.newHashSet(); + allPermissionPoints.addAll(adminRolePermissions); + allPermissionPoints.addAll(normalRolePermissionPoints); + allPermissionPoints.addAll(notAuthPermissionPoints); + + + result.setPermissions(allPermissionPoints.stream() + .filter(e -> effectFeatureIds.contains(e.getFeatureId())) + .collect(Collectors.toList())); + return result; }) .filter(Objects::nonNull) .collect(Collectors.toList()); - - - - return null; } /** @@ -138,29 +168,31 @@ public class PermissionServiceImpl implements PermissionService { } - private Set buildNoAuthPermission(List productPermissions, - List allFeatures) { + private Set resolveNotAuthPermission(List productPermissions, + List allFeatures) { // 因为有权授权权限的权限点,就需要有所有上层权限点的权限 - Set notAuthFeatureIds = allFeatures.stream() + List notAuthFeatures = allFeatures.stream() .filter(SaasFeatureResourceService.SaasFeatureResourceCache::isNotAuth) - .map(e -> Optional.ofNullable(e.getParentIds()) - .map(f -> { - f.add(e.getFeatureId()); - return f; - }) - .orElseGet(() -> Sets.newHashSet(e.getFeatureId()))) + .collect(Collectors.toList()); + + Set notAuthFeatureIds = notAuthFeatures.stream() + .map(SaasFeatureResourceService.SaasFeatureResourceCache::getFeatureId) + .collect(Collectors.toSet()); + + Set notAuthParentFeatureIds = notAuthFeatures.stream() + .map(SaasFeatureResourceService.SaasFeatureResourceCache::getParentIds) .flatMap(Collection::stream) .collect(Collectors.toSet()); + notAuthFeatureIds.addAll(notAuthParentFeatureIds); if (CollectionUtils.isEmpty(notAuthFeatureIds)) { return Collections.emptySet(); } - return productPermissions.stream() .filter(productPermission -> notAuthFeatureIds.contains(productPermission.getFeatureId())) - .map(e -> IdentityAuthRes.PermissionPoint.builder() + .map(e -> PermissionResp.builder() .featureCode(e.getFeatureCode()) .featureId(e.getFeatureId()) .terminal(e.getTerminal()) @@ -169,60 +201,68 @@ public class PermissionServiceImpl implements PermissionService { .collect(Collectors.toSet()); } - private Set resolveNormalRolePermission(List workspacePermissions, - UserParam userParam) { + /** + * 根据角色的协同关系类型去匹配权限 + * @param workspacePermissions + * @param userParam + * @param rolePermissionMap + * @return + */ + private Set resolveNormalRolePermission(List workspacePermissions, + UserParam userParam, + Map> rolePermissionMap) { - // 普通角色 - List normalRoles = userParam.getRoles().stream() - .filter(role -> Objects.nonNull(role.getRoleType()) && !role.getRoleType().isAdmin()) - .collect(Collectors.toList()); - if (CollectionUtil.isEmpty(normalRoles)) { - log.info("no normal roles"); - return Collections.emptySet(); - } + Map> workspacePermissionMap = workspacePermissions.stream() + .collect(Collectors.groupingBy(ProductPermissionCacheService.PermissionDTO::getCooperateType, + Collectors.mapping(e -> PermissionResp.builder() + .featureCode(e.getFeatureCode()) + .featureId(e.getFeatureId()) + .terminal(e.getTerminal()) + .featureType(e.getFeatureType()) + .build(), Collectors.toList()))); - return Collections.emptySet(); + return userParam.getRoles().stream() + .map(role -> { + List rolePermissions = rolePermissionMap.get(role.getRoleId()); + if (CollectionUtils.isEmpty(rolePermissions)) { + return null; + } -// return normalRoles.stream() -// .map(role -> { -// -// Set rolePermissionFeatureCodes = Optional.ofNullable(rolePermissionMap.get(role.getId())) -// .map(e -> e.stream() -// .filter(Objects::nonNull) -// .filter(rolePermission -> { -// if (CollectionUtils.isEmpty(workspaceOuPair.getTags()) || CollectionUtils.isEmpty(rolePermission.getTags())) { -// return true; -// } -// -// if (Sets.intersection(workspaceOuPair.getTags(), rolePermission.getTags()).isEmpty()) { -// return false; -// } -// -// return true; -// }) -// .map(RolePermissionCacheService.PermissionDTO::getFeatureCode) -// .collect(Collectors.toSet())) -// .orElseGet(Sets::newHashSet); -// -// if (CollectionUtils.isEmpty(rolePermissionFeatureCodes)) { -// return null; -// } -// -// return productPermissions.stream() -// .filter(productPermission -> Objects.equals(productPermission.getCooperateType(), String.valueOf(role.getProductUnitType()))) -// .filter(productPermission -> rolePermissionFeatureCodes.contains(productPermission.getFeatureCode())) -// .map(e -> IdentityAuthRes.PermissionPoint.builder() -// .featureCode(e.getFeatureCode()) -// .featureId(e.getFeatureId()) -// .terminal(e.getTerminal()) -// .featureType(e.getFeatureType()) -// .build()) -// .collect(Collectors.toSet()); -// -// }) -// .filter(Objects::nonNull) -// .flatMap(Collection::stream) -// .collect(Collectors.toSet()); + List workspacePermissionsMatched = workspacePermissionMap.get(role.getCooperateShipTypes().toString()); + if (CollectionUtils.isEmpty(workspacePermissionsMatched)) { + return null; + } + + Set rolePermissionFeatureCodes = rolePermissions.stream() + .filter(Objects::nonNull) + .filter(rolePermission -> { + if (CollectionUtils.isEmpty(userParam.getTags()) || CollectionUtils.isEmpty(rolePermission.getTags())) { + return true; + } + Set paramTags = userParam.getTags().stream() + .map(RolePermissionTagEnum::name) + .collect(Collectors.toSet()); + + Set cacheTags = rolePermission.getTags().stream() + .map(cn.axzo.tyr.client.model.enums.RolePermissionTagEnum::name) + .collect(Collectors.toSet()); + return !Sets.intersection(paramTags, cacheTags).isEmpty(); + }) + .map(RolePermissionCacheService.PermissionDTO::getFeatureCode) + .collect(Collectors.toSet()); + + if (CollectionUtils.isEmpty(rolePermissionFeatureCodes)) { + return null; + } + + return workspacePermissionsMatched.stream() + .filter(productPermission -> rolePermissionFeatureCodes.contains(productPermission.getFeatureCode())) + .collect(Collectors.toSet()); + + }) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); } private Map> listRolePermission(ListUserPermissionParam param) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index abb0ac76..2bdd55b5 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -188,6 +188,7 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl Objects.equals(e.getFeatureId(), 101745L)) + .findFirst() + .get(); + Assertions.assertEquals(featureInfo.getFeatureId(), 101745L); + Assertions.assertEquals(featureInfo.getRelationType(), 1); + Assertions.assertEquals(featureInfo.getTags().size(), 1); + Assertions.assertTrue(featureInfo.getTags() .containsAll(Sets.newHashSet(cn.axzo.tyr.client.model.enums.RolePermissionTagEnum.JOINED))); diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/UserPermissionControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/UserPermissionControllerTest.java new file mode 100644 index 00000000..5a669d1b --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/UserPermissionControllerTest.java @@ -0,0 +1,832 @@ +package cn.axzo.tyr.server.controller.v2; + +import cn.axzo.client.feign.FeatureCodeCachedApi; +import cn.axzo.foundation.exception.BusinessException; +import cn.axzo.framework.domain.web.result.ApiListResult; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.maokai.api.client.OrgUserApi; +import cn.axzo.maokai.api.vo.response.OrgUserRes; +import cn.axzo.maokai.common.enums.OrgUserStatusEnum; +import cn.axzo.thrones.client.saas.ServicePkgClient; +import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct; +import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes; +import cn.axzo.tyr.base.BaseTest; +import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum; +import cn.axzo.tyr.client.model.req.IdentityAuthReq; +import cn.axzo.tyr.client.model.req.PermissionCheckReq; +import cn.axzo.tyr.client.model.res.IdentityAuthRes; +import cn.axzo.tyr.feign.enums.IdentityTypeEnum; +import cn.axzo.tyr.feign.req.ListUserPermissionReq; +import cn.axzo.tyr.feign.resp.UserPermissionResp; +import cn.axzo.tyr.server.service.PermissionQueryService; +import cn.axzo.tyr.server.service.TyrSaasAuthService; +import cn.azxo.framework.common.model.CommonResponse; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import org.apache.commons.collections.CollectionUtils; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static cn.axzo.tyr.server.config.exception.BizResultCode.PARAM_ERROR; +import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class UserPermissionControllerTest extends BaseTest { + + @Autowired + private MysqlDataLoader mysqlDataLoader; + @Autowired + private UserPermissionController userPermissionController; + @Autowired + private PermissionQueryService permissionQueryService; + @Autowired + private OrgUserApi orgUserApi; + @Autowired + private FeatureCodeCachedApi featureCodeCachedApi; + @Autowired + private ServicePkgClient servicePkgClient; + @Autowired + private TyrSaasAuthService tyrSaasAuthService; + + @BeforeEach + @Override + public void setup() { + super.setup(); + mysqlDataLoader.loadFromClassName(getClass().getSimpleName()); + MockitoAnnotations.initMocks(this); + Mockito.when(orgUserApi.listOrgUser(Mockito.any())) + .thenReturn(ApiListResult.ok(com.google.common.collect.Lists.newArrayList(OrgUserRes.builder() + .workspaceId(3L) + .ouId(4L) + .personId(1827L) + .status(OrgUserStatusEnum.JOINED) + .build(), + OrgUserRes.builder() + .workspaceId(3L) + .ouId(4L) + .personId(3470L) + .status(OrgUserStatusEnum.LEAVE) + .build()))); + + Map> featureCodeMap = Maps.newHashMap(); + featureCodeMap.put("h5:cmp_user_manage_worker_page", Sets.newHashSet("h5:cmp_user_manage_worker_page")); + Mockito.when(featureCodeCachedApi.list(Mockito.eq(FeatureCodeCachedApi.ListFeatureCodeParam.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page")) + .build()))) + .thenReturn(ApiResult.ok(featureCodeMap)); + + featureCodeMap = Maps.newHashMap(); + featureCodeMap.put("h5:cmp_user_manage_worker_page", Sets.newHashSet("h5:cmp_user_manage_worker_page")); + featureCodeMap.put("h5:cmp_user_manage_worker_jump_to_team_btn", Sets.newHashSet("h5:cmp_user_manage_worker_jump_to_team_btn")); + Mockito.when(featureCodeCachedApi.list(Mockito.eq(FeatureCodeCachedApi.ListFeatureCodeParam.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .build()))) + .thenReturn(ApiResult.ok(featureCodeMap)); + + ServicePkgDetailRes servicePkgDetail = new ServicePkgDetailRes(); + servicePkgDetail.setSpaceId(3L); + ServicePkgProduct servicePkgProduct = new ServicePkgProduct(); + servicePkgProduct.setProductId(2L); + servicePkgDetail.setProducts(com.google.common.collect.Lists.newArrayList(servicePkgProduct)); + Mockito.when(servicePkgClient.getServicePkgDetailBySpaceId(Mockito.any())) + .thenReturn(CommonResponse.success(com.google.common.collect.Lists.newArrayList(servicePkgDetail))); + } + + @Test + void listUserPermissionReplaceHasPermission() { + + // old cn.axzo.tyr.client.feign.PermissionQueryApi#hasPermission + PermissionCheckReq permissionCheckReq = PermissionCheckReq.builder() + .personId(1827L) + .featureCodes(Lists.newArrayList("h5:cmp_user_manage_worker_page")) + .ouId(4L) + .workspaceId(3L) + .build(); + boolean hasPermission = permissionQueryService.hasPermission(permissionCheckReq); + Assertions.assertTrue(hasPermission); + + hasPermission = permissionQueryService.hasPermission(PermissionCheckReq.builder() + .personId(1827L) + .featureCodes(Lists.newArrayList("h5:cmp_user_manage_worker_page")) + .ouId(4L) + .workspaceId(4L) + .build()); + Assertions.assertFalse(hasPermission); + + hasPermission = permissionQueryService.hasPermission(PermissionCheckReq.builder() + .personId(1827L) + .featureCodes(Lists.newArrayList("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .ouId(4L) + .workspaceId(3L) + .build()); + Assertions.assertTrue(hasPermission); + hasPermission = permissionQueryService.hasPermission(PermissionCheckReq.builder() + .personId(1827L) + .featureCodes(Lists.newArrayList("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .ouId(4L) + .workspaceId(3L) + .terminal("NT_CMP_APP_GENERAL") + .build()); + Assertions.assertTrue(hasPermission); + + hasPermission = permissionQueryService.hasPermission(PermissionCheckReq.builder() + .personId(1827L) + .featureCodes(Lists.newArrayList("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .ouId(4L) + .workspaceId(3L) + .terminal("NT_CMS_WEB_GENERAL") + .build()); + Assertions.assertFalse(hasPermission); + + hasPermission = permissionQueryService.hasPermission(PermissionCheckReq.builder() + .personId(1827L) + .featureCodes(Lists.newArrayList("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .ouId(4L) + .workspaceId(3L) + .tags(Sets.newHashSet(RolePermissionTagEnum.LEAVE)) + .build()); + Assertions.assertFalse(hasPermission); + + hasPermission = permissionQueryService.hasPermission(PermissionCheckReq.builder() + .personId(1827L) + .featureCodes(Lists.newArrayList("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .ouId(4L) + .workspaceId(3L) + .tags(Sets.newHashSet(RolePermissionTagEnum.JOINED)) + .build()); + Assertions.assertTrue(hasPermission); + // old cn.axzo.tyr.client.feign.PermissionQueryApi#hasPermission + + List userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build())) + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isNotEmpty(userPermissionResps)); + Assertions.assertEquals(userPermissionResps.get(0).getPersonId(), 1827L); + Assertions.assertEquals(userPermissionResps.get(0).getOuId(), 4L); + Assertions.assertEquals(userPermissionResps.get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(userPermissionResps.get(0).getIsSuperAdmin()); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().size(), 2); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureId(), 101745L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + + userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(4L) + .build())) + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isEmpty(userPermissionResps)); + + userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page_2")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build())) + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isEmpty(userPermissionResps)); + + userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_on_site_audit_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build())) + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isNotEmpty(userPermissionResps)); + Assertions.assertEquals(userPermissionResps.get(0).getPersonId(), 1827L); + Assertions.assertEquals(userPermissionResps.get(0).getOuId(), 4L); + Assertions.assertEquals(userPermissionResps.get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(userPermissionResps.get(0).getIsSuperAdmin()); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().size(), 0); + + userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build())) + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isNotEmpty(userPermissionResps)); + Assertions.assertEquals(userPermissionResps.get(0).getPersonId(), 1827L); + Assertions.assertEquals(userPermissionResps.get(0).getOuId(), 4L); + Assertions.assertEquals(userPermissionResps.get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(userPermissionResps.get(0).getIsSuperAdmin()); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().size(), 3); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_jump_to_team_btn"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureId(), 101745L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getTerminal(), "NT_CMP_APP_GENERAL"); + + userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build())) + .terminal("NT_CMS_WEB_GENERAL") + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isEmpty(userPermissionResps)); + + userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build())) + .terminal("NT_CMP_APP_GENERAL") + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isNotEmpty(userPermissionResps)); + Assertions.assertEquals(userPermissionResps.get(0).getPersonId(), 1827L); + Assertions.assertEquals(userPermissionResps.get(0).getOuId(), 4L); + Assertions.assertEquals(userPermissionResps.get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(userPermissionResps.get(0).getIsSuperAdmin()); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().size(), 3); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_jump_to_team_btn"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureId(), 101745L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getTerminal(), "NT_CMP_APP_GENERAL"); + + userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .permissionTags(Sets.newHashSet(cn.axzo.tyr.feign.enums.RolePermissionTagEnum.LEAVE)) + .build())) + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isNotEmpty(userPermissionResps)); + Assertions.assertEquals(userPermissionResps.get(0).getPersonId(), 1827L); + Assertions.assertEquals(userPermissionResps.get(0).getOuId(), 4L); + Assertions.assertEquals(userPermissionResps.get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(userPermissionResps.get(0).getIsSuperAdmin()); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().size(), 0); + + userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .permissionTags(Sets.newHashSet(cn.axzo.tyr.feign.enums.RolePermissionTagEnum.JOINED, + cn.axzo.tyr.feign.enums.RolePermissionTagEnum.LEAVE)) + .build())) + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isNotEmpty(userPermissionResps)); + Assertions.assertEquals(userPermissionResps.get(0).getPersonId(), 1827L); + Assertions.assertEquals(userPermissionResps.get(0).getOuId(), 4L); + Assertions.assertEquals(userPermissionResps.get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(userPermissionResps.get(0).getIsSuperAdmin()); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().size(), 3); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_jump_to_team_btn"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureId(), 101745L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getTerminal(), "NT_CMP_APP_GENERAL"); + + } + + @Test + void listUserPermissionReplaceFindIdentityAuth() { + + // old + IdentityAuthReq identityAuthReq = IdentityAuthReq.builder() + .personId(1827L) + .workspaceOusPairs(Lists.newArrayList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(3L) + .ouId(4L) + .build())) + .featureCode(Sets.newHashSet("h5:cmp_user_manage_worker_page")) + .build(); + IdentityAuthRes identityAuthMix = tyrSaasAuthService.findIdentityAuthMix(identityAuthReq); + Assertions.assertEquals(identityAuthMix.getPersonId(), 1827L); + Assertions.assertEquals(identityAuthMix.getPermissions().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getOuId(), 4L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(identityAuthMix.getPermissions().get(0).isSuperAdmin()); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().size(), 2); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureId(), 101745L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + + identityAuthReq = IdentityAuthReq.builder() + .personId(1827L) + .workspaceOusPairs(Lists.newArrayList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(4L) + .ouId(4L) + .build())) + .featureCode(Sets.newHashSet("h5:cmp_user_manage_worker_page")) + .build(); + identityAuthMix = tyrSaasAuthService.findIdentityAuthMix(identityAuthReq); + Assertions.assertEquals(identityAuthMix.getPersonId(), 1827L); + Assertions.assertEquals(identityAuthMix.getPermissions().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getOuId(), 4L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getWorkspaceId(), 4L); + Assertions.assertFalse(identityAuthMix.getPermissions().get(0).isSuperAdmin()); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().size(), 0); + + identityAuthReq = IdentityAuthReq.builder() + .personId(1827L) + .workspaceOusPairs(Lists.newArrayList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(3L) + .ouId(4L) + .build())) + .featureCode(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .build(); + identityAuthMix = tyrSaasAuthService.findIdentityAuthMix(identityAuthReq); + Assertions.assertEquals(identityAuthMix.getPersonId(), 1827L); + Assertions.assertEquals(identityAuthMix.getPermissions().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getOuId(), 4L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(identityAuthMix.getPermissions().get(0).isSuperAdmin()); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().size(), 3); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_jump_to_team_btn"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureId(), 101744L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureId(), 101745L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getTerminal(), "NT_CMP_APP_GENERAL"); + + identityAuthReq = IdentityAuthReq.builder() + .personId(1827L) + .workspaceOusPairs(Lists.newArrayList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(3L) + .ouId(4L) + .build())) + .featureCode(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .terminal(Lists.newArrayList("NT_CMS_WEB_GENERAL")) + .build(); + identityAuthMix = tyrSaasAuthService.findIdentityAuthMix(identityAuthReq); + Assertions.assertEquals(identityAuthMix.getPersonId(), 1827L); + Assertions.assertEquals(identityAuthMix.getPermissions().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getOuId(), 4L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(identityAuthMix.getPermissions().get(0).isSuperAdmin()); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().size(), 0); + + identityAuthReq = IdentityAuthReq.builder() + .personId(1827L) + .workspaceOusPairs(Lists.newArrayList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(3L) + .ouId(4L) + .build())) + .featureCode(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .terminal(Lists.newArrayList("NT_CMP_APP_GENERAL")) + .build(); + identityAuthMix = tyrSaasAuthService.findIdentityAuthMix(identityAuthReq); + Assertions.assertEquals(identityAuthMix.getPersonId(), 1827L); + Assertions.assertEquals(identityAuthMix.getPermissions().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getOuId(), 4L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(identityAuthMix.getPermissions().get(0).isSuperAdmin()); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().size(), 3); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_jump_to_team_btn"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureId(), 101744L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureId(), 101745L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getTerminal(), "NT_CMP_APP_GENERAL"); + + + identityAuthReq = IdentityAuthReq.builder() + .personId(1827L) + .workspaceOusPairs(Lists.newArrayList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(3L) + .ouId(4L) + .build())) + .featureCode(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .appType("H5") + .build(); + identityAuthMix = tyrSaasAuthService.findIdentityAuthMix(identityAuthReq); + Assertions.assertEquals(identityAuthMix.getPersonId(), 1827L); + Assertions.assertEquals(identityAuthMix.getPermissions().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getOuId(), 4L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(identityAuthMix.getPermissions().get(0).isSuperAdmin()); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().size(), 3); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_jump_to_team_btn"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureId(), 101744L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureId(), 101745L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getTerminal(), "NT_CMP_APP_GENERAL"); + + identityAuthReq = IdentityAuthReq.builder() + .personId(1827L) + .workspaceOusPairs(Lists.newArrayList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(3L) + .ouId(4L) + .build())) + .featureCode(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .appType("APP") + .build(); + identityAuthMix = tyrSaasAuthService.findIdentityAuthMix(identityAuthReq); + Assertions.assertEquals(identityAuthMix.getPersonId(), 1827L); + Assertions.assertEquals(identityAuthMix.getPermissions().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getOuId(), 4L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(identityAuthMix.getPermissions().get(0).isSuperAdmin()); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().size(), 0); + + identityAuthReq = IdentityAuthReq.builder() + .personId(1827L) + .workspaceOusPairs(Lists.newArrayList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(3L) + .ouId(4L) + .build())) + .featureCode(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .itemCode("h5:user_manage_D9B0187") + .build(); + identityAuthMix = tyrSaasAuthService.findIdentityAuthMix(identityAuthReq); + Assertions.assertEquals(identityAuthMix.getPersonId(), 1827L); + Assertions.assertEquals(identityAuthMix.getPermissions().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getOuId(), 4L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(identityAuthMix.getPermissions().get(0).isSuperAdmin()); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().size(), 0); + + identityAuthReq = IdentityAuthReq.builder() + .personId(1827L) + .workspaceOusPairs(Lists.newArrayList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(3L) + .ouId(4L) + .build())) + .featureCode(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .itemCode("h5:user_manage_D9B0186") + .build(); + identityAuthMix = tyrSaasAuthService.findIdentityAuthMix(identityAuthReq); + Assertions.assertEquals(identityAuthMix.getPersonId(), 1827L); + Assertions.assertEquals(identityAuthMix.getPermissions().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getOuId(), 4L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(identityAuthMix.getPermissions().get(0).isSuperAdmin()); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().size(), 3); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_jump_to_team_btn"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureId(), 101744L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureId(), 101745L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(2).getTerminal(), "NT_CMP_APP_GENERAL"); + + identityAuthReq = IdentityAuthReq.builder() + .personId(1827L) + .workspaceOusPairs(Lists.newArrayList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(3L) + .ouId(4L) + .build())) + .featureCode(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .featureId(Sets.newHashSet(101745L)) + .itemCode("h5:user_manage_D9B0186") + .build(); + identityAuthMix = tyrSaasAuthService.findIdentityAuthMix(identityAuthReq); + Assertions.assertEquals(identityAuthMix.getPersonId(), 1827L); + Assertions.assertEquals(identityAuthMix.getPermissions().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getOuId(), 4L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(identityAuthMix.getPermissions().get(0).isSuperAdmin()); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureId(), 101745L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + + identityAuthReq = IdentityAuthReq.builder() + .identityId(6L) + .identityType(IdentityType.PRACTITIONER) + .workspaceOusPairs(Lists.newArrayList(IdentityAuthReq.WorkspaceOuPair.builder() + .workspaceId(3L) + .ouId(4L) + .build())) + .featureCode(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .featureId(Sets.newHashSet(101745L)) + .itemCode("h5:user_manage_D9B0186") + .build(); + identityAuthMix = tyrSaasAuthService.findIdentityAuthMix(identityAuthReq); + Assertions.assertEquals(identityAuthMix.getIdentity(), 6L); + Assertions.assertEquals(identityAuthMix.getIdentityType(), IdentityType.PRACTITIONER); + Assertions.assertNull(identityAuthMix.getPersonId()); + Assertions.assertEquals(identityAuthMix.getPermissions().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getOuId(), 4L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(identityAuthMix.getPermissions().get(0).isSuperAdmin()); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().size(), 1); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureId(), 101745L); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getFeatureType(), 4); + Assertions.assertEquals(identityAuthMix.getPermissions().get(0).getPermissionPoint().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + + // old + + List userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build())) + .itemCode("h5:user_manage_D9B0186") + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isNotEmpty(userPermissionResps)); + Assertions.assertEquals(userPermissionResps.get(0).getPersonId(), 1827L); + Assertions.assertEquals(userPermissionResps.get(0).getOuId(), 4L); + Assertions.assertEquals(userPermissionResps.get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(userPermissionResps.get(0).getIsSuperAdmin()); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().size(), 3); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_jump_to_team_btn"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureId(), 101745L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getTerminal(), "NT_CMP_APP_GENERAL"); + + userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build())) + .appType("APP") + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isEmpty(userPermissionResps)); + + userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build())) + .appType("H5") + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isNotEmpty(userPermissionResps)); + Assertions.assertEquals(userPermissionResps.get(0).getPersonId(), 1827L); + Assertions.assertEquals(userPermissionResps.get(0).getOuId(), 4L); + Assertions.assertEquals(userPermissionResps.get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(userPermissionResps.get(0).getIsSuperAdmin()); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().size(), 3); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_jump_to_team_btn"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureId(), 101745L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getTerminal(), "NT_CMP_APP_GENERAL"); + } + + @Test + void listUserPermission() { + BusinessException businessException = assertThrows(BusinessException.class, () -> { + userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .identityId(11L) + .ouId(4L) + .workspaceId(3L) + .build())) + .appType("H5") + .build()) + .getData(); + }); + Assertions.assertEquals(businessException.getErrorCode(), PARAM_ERROR.getErrorCode()); + Assertions.assertEquals(businessException.getErrorMsg(), "参数错误:personId 和 identityId只能二选一"); + + businessException = assertThrows(BusinessException.class, () -> { + userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .identityType(IdentityTypeEnum.OPERATOR) + .ouId(4L) + .workspaceId(3L) + .build())) + .appType("H5") + .build()) + .getData(); + }); + Assertions.assertEquals(businessException.getErrorCode(), PARAM_ERROR.getErrorCode()); + Assertions.assertEquals(businessException.getErrorMsg(), "参数错误:personId 和 identityId只能二选一"); + + businessException = assertThrows(BusinessException.class, () -> { + userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .identityId(2424L) + .identityType(IdentityTypeEnum.OPERATOR) + .ouId(4L) + .workspaceId(3L) + .build())) + .appType("H5") + .build()) + .getData(); + }); + Assertions.assertEquals(businessException.getErrorCode(), PARAM_ERROR.getErrorCode()); + Assertions.assertEquals(businessException.getErrorMsg(), "参数错误:personId 和 identityId只能二选一"); + + businessException = assertThrows(BusinessException.class, () -> { + userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .ouId(4L) + .workspaceId(3L) + .build())) + .appType("H5") + .build()) + .getData(); + }); + Assertions.assertEquals(businessException.getErrorCode(), PARAM_ERROR.getErrorCode()); + Assertions.assertEquals(businessException.getErrorMsg(), "参数错误:personId 和 identityId不能同时为空"); + + businessException = assertThrows(BusinessException.class, () -> { + userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .identityId(123L) + .ouId(4L) + .workspaceId(3L) + .build())) + .appType("H5") + .build()) + .getData(); + }); + Assertions.assertEquals(businessException.getErrorCode(), PARAM_ERROR.getErrorCode()); + Assertions.assertEquals(businessException.getErrorMsg(), "参数错误:identityType不能为空"); + + businessException = assertThrows(BusinessException.class, () -> { + userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .identityType(IdentityTypeEnum.OPERATOR) + .ouId(4L) + .workspaceId(3L) + .build())) + .appType("H5") + .build()) + .getData(); + }); + Assertions.assertEquals(businessException.getErrorCode(), PARAM_ERROR.getErrorCode()); + Assertions.assertEquals(businessException.getErrorMsg(), "参数错误:personId 和 identityId不能同时为空"); + + List userPermissionResps = userPermissionController.listUserPermission(ListUserPermissionReq.builder() + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_page", "h5:cmp_user_manage_worker_jump_to_team_btn")) + .userPermissions(Lists.newArrayList(ListUserPermissionReq.UserPermission.builder() + .personId(1827L) + .ouId(4L) + .workspaceId(3L) + .build(), + ListUserPermissionReq.UserPermission.builder() + .identityId(8L) + .identityType(IdentityTypeEnum.PRACTITIONER) + .ouId(4L) + .workspaceId(3L) + .build())) + .appType("H5") + .build()) + .getData(); + Assertions.assertTrue(CollectionUtils.isNotEmpty(userPermissionResps)); + Assertions.assertEquals(userPermissionResps.get(0).getPersonId(), 1827L); + Assertions.assertEquals(userPermissionResps.get(0).getOuId(), 4L); + Assertions.assertEquals(userPermissionResps.get(0).getWorkspaceId(), 3L); + Assertions.assertFalse(userPermissionResps.get(0).getIsSuperAdmin()); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().size(), 3); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_jump_to_team_btn"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureId(), 101745L); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(0).getPermissions().get(2).getTerminal(), "NT_CMP_APP_GENERAL"); + + Assertions.assertEquals(userPermissionResps.get(1).getIdentityId(), 8L); + Assertions.assertEquals(userPermissionResps.get(1).getIdentityType(), IdentityTypeEnum.PRACTITIONER.name()); + Assertions.assertEquals(userPermissionResps.get(1).getOuId(), 4L); + Assertions.assertEquals(userPermissionResps.get(1).getWorkspaceId(), 3L); + Assertions.assertFalse(userPermissionResps.get(0).getIsSuperAdmin()); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().size(), 3); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(0).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_jump_to_team_btn"); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(1).getFeatureId(), 101744L); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(1).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(1).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(1).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(2).getFeatureId(), 101745L); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(2).getFeatureCode(), "h5:cmp_user_manage_worker_page"); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(2).getFeatureType(), 4); + Assertions.assertEquals(userPermissionResps.get(1).getPermissions().get(2).getTerminal(), "NT_CMP_APP_GENERAL"); + } +} \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleControllerTest.sql index e67f566c..3aaf3199 100644 --- a/tyr-server/src/test/resources/mysql/RoleControllerTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleControllerTest.sql @@ -94,4 +94,4 @@ INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, VALUES (693, 'oms:detail_backPay_btn', '查看投诉详情', 4, 'NT_OMS_WEB', 1, 612, '528,611,612,693,', 0, '', 0, 'oms:detail_backPay_btn', 0, 1, '', 1, '/home/complain-manage/backPayDetail', 1, ' ', 1, 0, null, 1, 1, '2024-06-07 10:55:16', '2024-12-05 17:45:22', 9000399478, 9000398292, 0); -#-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file +#-->RoleControllerTest.sql \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleGroupControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleGroupControllerTest.sql index b4376ffa..fc4c0d97 100644 --- a/tyr-server/src/test/resources/mysql/RoleGroupControllerTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleGroupControllerTest.sql @@ -46,4 +46,4 @@ INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, worksp VALUES (57, '6', '6', 'OMS超管组', -1, -1, 0, 9, 'omsSuperAdminGroup', '', 0, '2024-04-17 11:38:28', '2024-09-10 10:18:45', '57,'); -#-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file +#-->RoleGroupControllerTest.sql \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleServiceTest.sql b/tyr-server/src/test/resources/mysql/RoleServiceTest.sql index ca2014f1..716817bd 100644 --- a/tyr-server/src/test/resources/mysql/RoleServiceTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleServiceTest.sql @@ -94,4 +94,4 @@ VALUES (469, 'oms:msgPush_page', '消息推送(新版)', 2, 'NT_OMS_WEB', 0, 76, INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) VALUES (693, 'oms:detail_backPay_btn', '查看投诉详情', 4, 'NT_OMS_WEB', 1, 612, '528,611,612,693,', 0, '', 0, 'oms:detail_backPay_btn', 0, 1, '', 1, '/home/complain-manage/backPayDetail', 1, ' ', 1, 0, null, 1, 1, '2024-06-07 10:55:16', '2024-12-05 17:45:22', 9000399478, 9000398292, 0); -#-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file +#-->RoleServiceTest.sql \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleUserServiceTest.sql b/tyr-server/src/test/resources/mysql/RoleUserServiceTest.sql index 72e18da6..ba18a042 100644 --- a/tyr-server/src/test/resources/mysql/RoleUserServiceTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleUserServiceTest.sql @@ -22,4 +22,4 @@ VALUES (197520, 28802, 24425, 3, 24511, 3, 4, 0, 0, 0, '2024-01-18 16:36:16', '2 INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) VALUES (1157572, 40, 101101, 3, 2232, 3, 4, 0, 0, 0, '2024-09-27 09:39:49', '2024-09-27 09:39:48', 0, 0, 2); -#-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file +#-->RoleUserServiceTest.sql \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql index b823e51b..f75cf2e7 100644 --- a/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql +++ b/tyr-server/src/test/resources/mysql/RoleUserV2ControllerTest.sql @@ -172,4 +172,4 @@ INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, termi VALUES (369216, 'h5:cmp_user_manage_on_site_audit_page', 'h5:cmp_user_manage_on_site_audit_page', '人员管理-进场审核', 'PAGE', '__UNI__D9B0186#/pages/labour/enterAudit/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); -#-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file +#-->RoleUserV2ControllerTest.sql \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/UserPermissionControllerTest.sql b/tyr-server/src/test/resources/mysql/UserPermissionControllerTest.sql new file mode 100644 index 00000000..dceb3417 --- /dev/null +++ b/tyr-server/src/test/resources/mysql/UserPermissionControllerTest.sql @@ -0,0 +1,175 @@ +#-->DEFAULT + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101100, '超级管理员', '超级管理员', 'super_admin', 'ou_superadmin', 0, 0, 7, 1, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101101, '超级管理员', '超级管理员', 'super_admin', 'pro_superadmin', 0, 0, 1, 2, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101102, '超级管理员', '超级管理员', 'super_admin', 'oms_superadmin', 0, 0, 6, 6, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (101103, '超级管理员', '超级管理员', 'super_admin', 'zw_superadmin', 0, 0, 3, 3, 0, '2024-09-25 21:47:42', '2024-09-29 17:17:27', 2051297, 2051297, 1, 65535, 0, null, 0, '', 1, 0, 1); + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100920, '工人管理', '', 'init', 'cms:zb_worker——management', -1, -1, 1, 2, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 4, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100921, '查看组织架构', 'ff', 'init', 'cms:zb_org_view', -1, -1, 1, 2, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 5, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100923, '查看合约', 'dd', 'init', 'cms:zb_contact_view', -1, -1, 1, 2, 0, '2024-09-25 11:51:58', '2024-09-26 10:43:06', 154587, 154587, 1, 65535, 0, null, 0, '', 1, 2, 1); + + +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (1157571, 40, 101101, 3, 2232, 8, 1, 0, 0, 0, '2024-09-27 09:39:49', '2024-09-27 09:39:48', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (1157572, 40, 101101, 3, 2232, 3, 4, 0, 0, 0, '2024-09-27 09:39:49', '2024-09-27 09:39:48', 0, 0, 2); + +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (545048, 6, 100921, 3, 1827, 3, 4, 0, 0, 0, '2024-09-26 11:31:34', '2024-09-26 11:31:33', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (545301, 8, 100921, 3, 2107, 3, 4, 0, 0, 0, '2024-09-26 11:31:35', '2024-09-26 11:31:34', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544214, 14, 100921, 3, 0, 3, 4, 0, 0, 0, '2024-09-26 11:31:32', '2024-09-26 11:31:32', 1, 2, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (545447, 17, 100921, 3, 3135, 3, 4, 0, 0, 0, '2024-09-26 11:31:35', '2024-09-26 11:31:34', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (545448, 17, 100920, 3, 3135, 3, 4, 0, 0, 0, '2024-09-26 11:31:35', '2024-09-26 11:31:34', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544216, 18, 100921, 3, 0, 3, 4, 0, 0, 0, '2024-09-26 11:31:32', '2024-09-26 11:31:32', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544451, 36, 100921, 3, 3470, 3, 4, 0, 0, 0, '2024-09-26 11:31:33', '2024-09-26 11:31:32', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544452, 36, 100920, 3, 3470, 3, 4, 0, 0, 0, '2024-09-26 11:31:33', '2024-09-26 11:31:32', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544453, 36, 100923, 3, 3470, 3, 4, 0, 0, 0, '2024-09-26 11:31:33', '2024-09-26 11:31:32', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544687, 429, 100921, 3, 5267, 3, 4, 0, 0, 0, '2024-09-26 11:31:33', '2024-09-26 11:31:33', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (544688, 429, 100921, 3, 5267, 5, 6, 0, 0, 0, '2024-09-26 11:31:33', '2024-09-26 11:31:33', 0, 0, 2); + +INSERT INTO saas_pgroup_role_relation (id, role_id, group_id, is_delete, create_at, update_at, create_by, update_by) +VALUES (2290971, 100920, 1211, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:27', 154587, 154587); +INSERT INTO saas_pgroup_role_relation (id, role_id, group_id, is_delete, create_at, update_at, create_by, update_by) +VALUES (2290972, 100921, 1212, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:27', 154587, 154587); +INSERT INTO saas_pgroup_role_relation (id, role_id, group_id, is_delete, create_at, update_at, create_by, update_by) +VALUES (2290974, 100923, 1214, 0, '2024-09-25 11:51:58', '2024-09-26 10:43:27', 154587, 154587); + +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5208030, 1211, 101744, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 2051297, 1, 4, 'NT_CMP_APP_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5208040, 1211, 101745, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 2051297, 1, 4, 'NT_CMP_APP_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5208043, 1211, 101746, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 2051297, 1, 4, 'NT_CMP_APP_GENERAL', '["JOINED"]'); + +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5208031, 1212, 101744, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 2051297, 1, 4, 'NT_CMP_APP_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5208055, 1212, 101749, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 2051297, 1, 4, 'NT_CMP_APP_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5205310, 1212, 100835, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 9000404386, 1, 1, 'NT_CMS_WEB_GENERAL', '["JOINED"]'); + +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5206538, 1214, 101048, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 9000404204, 1, 2, 'NT_CMS_WEB_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5206556, 1214, 101053, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 9000404204, 1, 4, 'NT_CMS_WEB_GENERAL', '["JOINED"]'); +INSERT INTO saas_pgroup_permission_relation (id, group_id, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal, tags) +VALUES (5206562, 1214, 101054, 0, '2024-09-25 21:34:42', '2024-11-09 08:51:59', 2051297, 9000404204, 1, 4, 'NT_CMS_WEB_GENERAL', '["JOINED"]'); + +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (100835, 'cms:project_9103', '项目', 1, 'NT_CMS_WEB_GENERAL', 0, 100000, '100000,100835,', 0, '', 0, 'cms:project_9103', 1, 1, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/d4137963b9f54c7787afa7ef52d95540.svg', 1, '/', 0, '', 0, 0, '{"moreIcon": "https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cc474a2dc1884b6081f33d470a2e03e6.svg", "activeIcon": "https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/3e69eb003de64682a2e88c4d9da5ed1d.svg"}', 0, 0, '2024-06-01 14:50:52', '2024-10-29 11:29:10', 59926, 9000404098, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101048, 'cms:pro_contract_management_7701', '合约管理', 2, 'NT_CMS_WEB_GENERAL', 0, 100883, '100000,100835,100883,101048,', 2, '2', 0, 'cms:pro_contract_management_7701', 0, 1, '', 1, '/netConstruction/construction/contract-manage', 0, '', 0, 0, null, 1, 0, '2024-06-18 16:35:35', '2024-10-21 11:24:41', 59926, 9000404204, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101053, 'cms:pro_contract_price_authority_7706', '查看合约价格信息', 4, 'NT_CMS_WEB_GENERAL', 5, 101054, '100000,100835,100883,101048,101054,101053,', 0, '', 0, 'cms:pro_contract_price_authority_7706', 4, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-07-12 14:02:46', '2024-10-21 11:24:43', 59926, 9000404204, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101054, 'cms:pro_contract_detail_7707', '合约详情', 4, 'NT_CMS_WEB_GENERAL', 1, 101048, '100000,100835,100883,101048,101054,', 0, '', 0, 'cms:pro_contract_detail_7707', 3, 1, '', 1, '/', 0, '', 0, 0, null, 1, 1, '2024-07-04 16:27:16', '2024-10-21 11:24:42', 185732, 9000404204, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101744, 'cmp:pro_team_list_0443', '查看班组列表', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101744,', 0, '', 0, 'cmp:pro_team_list_0443', 2, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:39:22', '2024-08-28 10:53:36', 86256, 25923, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101745, 'cmp:pro_worker_invite_recorder_0445', '查看工人入场申请', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101745,', 0, '', 0, 'cmp:pro_worker_invite_recorder_0445', 3, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:40:29', '2024-08-28 10:53:36', 86256, 25923, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101746, 'cmp:pro_team_leader_invite_recorder_0446', '班组长入场申请记录', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101746,', 0, '', 0, 'cmp:pro_team_leader_invite_recorder_0446', 4, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:40:50', '2024-08-28 10:53:36', 86256, 25923, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101749, 'cmp:pro_team_index_0449', '查看班组详情', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101749,', 0, '', 0, 'cmp:pro_team_index_0449', 7, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:41:28', '2024-08-28 10:53:37', 86256, 25923, 0); + + +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (369, 100920, 104, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:27'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (370, 100921, 106, 0, '2024-09-25 11:51:57', '2024-09-26 10:43:27'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) VALUES (372, 100923, 105, 0, '2024-09-25 11:51:58', '2024-09-26 10:43:27'); + +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (104, '2', '1', '组织架构', -1, -1, 14, 4, 'cms:zb_org_group', '', 0, '2024-09-25 11:51:55', '2024-09-25 11:51:55', '14,104,'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (105, '2', '1', '成本管理', -1, -1, 14, 5, 'cms:zb_cost_group', '', 0, '2024-09-25 11:51:55', '2024-09-25 11:51:55', '14,105,'); +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (106, '2', '1', '工人管理', -1, -1, 105, 5, 'cms:zb_cost_group2', '', 0, '2024-09-25 11:51:55', '2024-09-25 11:51:55', '14,105,106,'); + +INSERT INTO product_module (id, icon, product_type, product_name, dict_workspace_type_id, dict_workspace_type_code, status, common_product, remark, auth_type, ou_type, is_delete, create_by, create_at, update_at, update_by, category, version, max_person_count, max_workspace_count, price, skus, material) +VALUES (2, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/test/1695286111017-Snipaste_09-13 16-24.png', 2, '项目基础', 2, '2', 1, 1, '', 1, null, 0, 0, '2022-08-17 19:46:11', '2024-12-12 15:37:27', 89601, 'GENERAL_SERVICE', 0, 0, 0, 0, NULL, NULL); + +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257742, 2, 7, '1', 101744, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257743, 2, 7, '1', 101745, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257744, 2, 7, '1', 101746, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257745, 2, 7, '1', 4443, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257746, 2, 7, '1', 4416, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257747, 2, 7, '1', 4417, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257748, 2, 7, '1', 4418, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257749, 2, 7, '1', 4419, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257750, 2, 7, '1', 4420, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257751, 2, 7, '1', 912, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); + +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (14744, 'cms:pro_construction_contract_management', 'cms:pro_contract_management_7701', 1, 'NT_CMS_WEB_GENERAL', '2024-07-10 20:39:15', '2024-07-10 20:39:15', null, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (18070, 'cms:pro_construction_contract_management', 'cms:pro_contract_management_7701', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (18079, 'cms:pro_construction_contract_detail', 'cms:pro_contract_detail_7707', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (18080, 'cms:pro_construction_contract_detail_inventory_submit_audit', 'cms:pro_contract_detail_7707', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24219, 'h5:cmp_user_manage_worker_jump_to_team_btn', 'cmp:pro_team_list_0443', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24220, 'h5:cmp_user_manage_worker_page', 'cmp:pro_team_list_0443', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24221, 'h5:cmp_user_manage_worker_labor_audit_btn', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24222, 'h5:cmp_user_manage_worker_page', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24223, 'h5:cmp_user_manage_labor_audit_page', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24224, 'h5:cmp_user_manage_labor_audit_detail_btn', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24225, 'h5:cmp_user_manage_worker_on_site_audit_btn', 'cmp:pro_team_leader_invite_recorder_0446', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); + + +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (718447, 'cms:pro_construction_contract_management', 'cms:pro_construction_contract_management', '合约管理', 'PAGE', '/netConstruction/construction/contract-manage', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:23', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (718451, 'cms:pro_construction_contract_detail', 'cms:pro_construction_contract_detail', '合约详情', 'PAGE', '/netConstruction/construction/contract-manage/contract-detail', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:23', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (718455, 'cms:pro_construction_contract_detail', 'cms:pro_construction_contract_detail_inventory_submit_audit', '合约详情-提交审批', 'COMPONENT', '', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:25', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369205, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_jump_to_team_btn', '人员管理-施工人员-跳转班组', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369197, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_page', '人员管理-施工人员', 'PAGE', '__UNI__D9B0186#/pages/worker/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:40', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369202, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_labor_audit_btn', '人员管理-施工人员-劳务审核', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369218, 'h5:cmp_user_manage_labor_audit_page', 'h5:cmp_user_manage_labor_audit_page', '人员管理-劳务审核', 'PAGE', '__UNI__D9B0186#/pages/labour/verify/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369219, 'h5:cmp_user_manage_labor_audit_page', 'h5:cmp_user_manage_labor_audit_detail_btn', '人员管理-劳务审核-详情', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369203, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_on_site_audit_btn', '人员管理-施工人员-进场审核', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369216, 'h5:cmp_user_manage_on_site_audit_page', 'h5:cmp_user_manage_on_site_audit_page', '人员管理-进场审核', 'PAGE', '__UNI__D9B0186#/pages/labour/enterAudit/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); + + +#-->UserPermissionControllerTest.sql \ No newline at end of file From 55a64d39b9797809f7fc4cd4329bf0187f70207f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Wed, 18 Dec 2024 14:35:06 +0800 Subject: [PATCH 15/25] =?UTF-8?q?feat:(REQ-3282)=20=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E5=B7=B2=E7=BB=8F=E5=BA=9F=E5=BC=83=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/repository/dao/SaasRoleDao.java | 21 ------------------- .../repository/dao/SaasRoleGroupDao.java | 7 ------- .../dao/SaasRoleUserRelationDao.java | 16 -------------- 3 files changed, 44 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java index 6e0a67f2..c878af86 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java @@ -60,27 +60,6 @@ public class SaasRoleDao extends ServiceImpl { return this.getBaseMapper().listRoleUserByPermissionGroup(permissionGroupIdList, workspaceIds); } - public SaasRole findRoleByTypeAndWorkspaceIdAndOuId(String roleType, Long workspaceId, - Long ouId) { - return this.lambdaQuery() - .eq(SaasRole::getRoleType, roleType) - .eq(SaasRole::getWorkspaceId, workspaceId) - .eq(SaasRole::getOwnerOuId, ouId) - .eq(SaasRole::getIsDelete, TableIsDeleteEnum.NORMAL.value) - .last(" limit 1").one(); - } - - public List listCommonRoleByNameAndWorkspaceIdAndOuId(String name, Long workspaceId, - Long ouId) { - return lambdaQuery().eq(SaasRole::getName, name) - .eq(SaasRole::getWorkspaceId, workspaceId) - .eq(SaasRole::getOwnerOuId, ouId) - .eq(SaasRole::getRoleType, RoleTypeEnum.COMMON.getValue()) - .eq(SaasRole::getIsDelete, TableIsDeleteEnum.NORMAL.value) - .select(SaasRole::getId) - .list(); - } - public List findRoleByName(Long ouId, Long workspaceId,List roleIds, List roleNames) { return this.lambdaQuery().select(SaasRole::getId, SaasRole::getName, SaasRole::getRoleType) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java index 470a9081..74e8eed7 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java @@ -54,13 +54,6 @@ public class SaasRoleGroupDao extends ServiceImpl listByCategoryCode(List categoryCode) { - return lambdaQuery().eq(BaseEntity::getIsDelete, 0L) - .in(SaasRoleGroup::getCategoryCode, categoryCode).list(); - } - public List listByCodes(List codes) { return lambdaQuery().eq(BaseEntity::getIsDelete, 0L) .in(SaasRoleGroup::getCode, codes).list(); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleUserRelationDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleUserRelationDao.java index 91695195..1569d96b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleUserRelationDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleUserRelationDao.java @@ -2,7 +2,6 @@ package cn.axzo.tyr.server.repository.dao; import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; import cn.axzo.karma.client.model.dto.ProjectWorkBaseDTO; -import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.tyr.client.model.BaseWorkspaceModel; import cn.axzo.tyr.client.model.enums.IdentityType; import cn.axzo.tyr.client.model.enums.SaasJobTypeEnum; @@ -32,16 +31,6 @@ public class SaasRoleUserRelationDao extends ServiceImpl query(Long identityId, Integer identityType, Long workspaceId, Long ouId) { - return this.lambdaQuery() - .eq(SaasRoleUserRelation::getIdentityId, identityId) - .eq(SaasRoleUserRelation::getIdentityType, identityType) - .eq(null != workspaceId, SaasRoleUserRelation::getWorkspaceId, workspaceId) - .eq(null != ouId, SaasRoleUserRelation::getOuId, ouId) - .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) - .list(); - } - public void deleteById(List ids) { if (CollUtil.isEmpty(ids)) { return; @@ -154,11 +143,6 @@ public class SaasRoleUserRelationDao extends ServiceImpl findBathSuperAdmin(List req) { From 057a8f6710de2b14746218b4fc68004877f2e3bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Thu, 19 Dec 2024 15:40:05 +0800 Subject: [PATCH 16/25] =?UTF-8?q?feat:(REQ-3282)=20=E6=94=B6=E5=8F=A3?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/model/req/PermissionQueryReq.java | 36 -- .../axzo/tyr/feign/req/UpsertUserRoleReq.java | 18 + tyr-server/pom.xml | 6 + .../config/exception/BizResultCode.java | 4 +- .../controller/v2/RoleUserV2Controller.java | 3 +- .../server/repository/dao/SaasRoleDao.java | 2 +- .../service/SaasRoleUserRelationService.java | 17 +- .../impl/SaasRoleUserRelationServiceImpl.java | 309 +++++++++++++++++- .../java/cn/axzo/tyr/base/TestConfig.java | 12 + .../v2/RoleUserV2ControllerTest.java | 51 +++ .../SaasRoleUserRelationServiceImplTest.java | 229 ++++++++++++- .../SaasRoleUserRelationServiceImplTest.sql | 41 +++ 12 files changed, 670 insertions(+), 58 deletions(-) delete mode 100644 tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java deleted file mode 100644 index 113d1f12..00000000 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/PermissionQueryReq.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.axzo.tyr.client.model.req; - -import cn.axzo.tyr.client.model.base.WorkspaceOUPair; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 权限查询请求 - * - * @version V1.0 - * @author: ZhanSiHu - * @date: 2024/4/7 16:23 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class PermissionQueryReq { - - @NotNull(message = "人员ID不能为空") - private Long personId; - - @NotEmpty(message = "单位标识对不能为空") - private List workspaceOUPairs; - - private String terminal; - - private List featureCodes; - -} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/UpsertUserRoleReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/UpsertUserRoleReq.java index 8cf0aa5a..989ecfd4 100644 --- a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/UpsertUserRoleReq.java +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/UpsertUserRoleReq.java @@ -27,6 +27,13 @@ public class UpsertUserRoleReq { @NotNull(message = "operatorId不能为空") private Long operatorId; + /** + * 更新用户角色的场景 + * 记录日持,方便排查问题 + */ + @Builder.Default + private String scene = "更新用户角色"; + @Data @Builder @NoArgsConstructor @@ -48,6 +55,11 @@ public class UpsertUserRoleReq { @NotNull(message = "personId不能为空") private Long personId; + /** + * 人岗架部门id + */ + private Long nodeId; + /** * 增量新增的角色id */ @@ -77,5 +89,11 @@ public class UpsertUserRoleReq { * 删除用户的角色code */ private Set removeRoleCodes; + + public String buildKey() { + return this.getIdentityId() + "_" + this.getIdentityType().getCode() + + "_" + this.getPersonId() + "_" + this.getWorkspaceId() + + "_" + this.getOuId(); + } } } diff --git a/tyr-server/pom.xml b/tyr-server/pom.xml index ea009985..8c01a8c7 100644 --- a/tyr-server/pom.xml +++ b/tyr-server/pom.xml @@ -167,6 +167,12 @@ config-api 2.0.0-SNAPSHOT + + + cn.axzo.platform + axzo-log-api + 1.0.0-SNAPSHOT + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java index 492cb309..865bd430 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizResultCode.java @@ -31,7 +31,9 @@ public enum BizResultCode implements IResultCode { TERMINAL_CODE_EXIST("100021", "端code已经存在,请修改"), TERMINAL_NOT_FOUND("100022", "原端不存在:{}"), FEATURE_CODE_OVER_LENGTH("100023", "组件code不能超过100个字符:{}"), - TERMINAL_NAME_EXIST("100024", "端名字已经存在,请修改"); + TERMINAL_NAME_EXIST("100024", "端名字已经存在,请修改"), + ROLE_ID_NOF_FOUND("100025", "角色ID不存在:{}"), + ROLE_CODE_NOF_FOUND("100026", "角色CODE不存在:{}"); private String errorCode; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java index f04cad6e..d489d094 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleUserV2Controller.java @@ -52,7 +52,8 @@ public class RoleUserV2Controller implements RoleUserApi { @Override public ApiResult upsertUserRole(UpsertUserRoleReq req) { - return null; + saasRoleUserRelationService.upsert(req); + return ApiResult.success(); } private PageRoleUserRelationParam from(PageRoleUserReq req) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java index c878af86..f6e6f6a0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java @@ -88,7 +88,7 @@ public class SaasRoleDao extends ServiceImpl { return new ArrayList<>(); } return lambdaQuery().in(BaseEntity::getId, roleIds) - .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) .eq(SaasRole::getRoleType, RoleTypeEnum.INIT.getValue()) .list(); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserRelationService.java index 47809a30..78dcd62b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserRelationService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserRelationService.java @@ -1,7 +1,6 @@ package cn.axzo.tyr.server.service; import cn.axzo.basics.profiles.common.enums.IdentityType; -import cn.axzo.framework.domain.page.PageResp; import cn.axzo.tyr.client.model.permission.IdentityAndAccountDTO; import cn.axzo.tyr.client.model.permission.IdentityKey; import cn.axzo.tyr.client.model.permission.QueryIdentityByPermissionDTO; @@ -10,11 +9,10 @@ import cn.axzo.tyr.client.model.req.QuerySuperAdminReq; import cn.axzo.tyr.client.model.req.UpdateUserJobReq; import cn.axzo.tyr.client.model.req.WorkspaceUpdateUserRoleDTO; import cn.axzo.tyr.client.model.res.SuperAminInfoResp; -import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserDTO; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationParam; -import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; +import cn.axzo.tyr.feign.req.UpsertUserRoleReq; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import com.baomidou.mybatisplus.extension.service.IService; import lombok.AllArgsConstructor; @@ -35,21 +33,10 @@ public interface SaasRoleUserRelationService extends IService page(PageRoleUserRelationParam param); - void upsert(UpsertParam param); + void upsert(UpsertUserRoleReq param); void batchRemove(BatchRemoveParam param); - @Data - @Builder - @NoArgsConstructor - @AllArgsConstructor - class UpsertParam { - - private List saasRoleUserRelations; - - private Long operator; - } - @Data @Builder @NoArgsConstructor diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index 2bdd55b5..ce1cbceb 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -15,10 +15,13 @@ import cn.axzo.framework.auth.domain.ContextInfo; import cn.axzo.framework.auth.domain.ContextInfoHolder; import cn.axzo.framework.rocketmq.Event; import cn.axzo.karma.client.model.dto.ProjectWorkBaseDTO; +import cn.axzo.log.platform.client.feign.LogApi; +import cn.axzo.log.platform.client.model.req.LogAddReq; import cn.axzo.maokai.api.client.OrganizationalUnitApi; import cn.axzo.maokai.api.vo.response.OrganizationalUnitVO; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.pudge.core.service.ServiceException; +import cn.axzo.tyr.client.common.enums.RoleResourceTypeEnum; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.enums.SaasJobTypeEnum; import cn.axzo.tyr.client.model.permission.IdentityAndAccountDTO; @@ -37,9 +40,11 @@ import cn.axzo.tyr.client.model.res.SuperAminInfoResp; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationParam; +import cn.axzo.tyr.feign.req.UpsertUserRoleReq; import cn.axzo.tyr.server.common.util.NumUtil; import cn.axzo.tyr.server.config.MqProducer; import cn.axzo.tyr.server.event.payload.SaasRoleUserRelationRemovePayload; +import cn.axzo.tyr.server.event.payload.SaasRoleUserRelationUpsertPayload; import cn.axzo.tyr.server.model.QueryUserRoleReq; import cn.axzo.tyr.server.repository.dao.SaasRoleDao; import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao; @@ -51,6 +56,7 @@ import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import cn.axzo.tyr.server.util.RpcInternalUtil; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -76,9 +82,13 @@ import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; import static cn.axzo.tyr.server.config.exception.BizResultCode.REMOVE_USER_ROLE_ERROR; +import static cn.axzo.tyr.server.config.exception.BizResultCode.ROLE_CODE_NOF_FOUND; +import static cn.axzo.tyr.server.config.exception.BizResultCode.ROLE_ID_NOF_FOUND; import static cn.axzo.tyr.server.event.inner.EventTypeEnum.SAAS_ROLE_USER_RELATION_REMOVED; +import static cn.axzo.tyr.server.event.inner.EventTypeEnum.SAAS_ROLE_USER_RELATION_UPSERT; /** * @author haiyangjin @@ -104,6 +114,8 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl roles = checkRoleCode(param); + + // 查询用户的历史记录 + Map> roleUserMap = listRoleUserRelation(param).stream() + .collect(Collectors.groupingBy(e -> e.getIdentityId() + "_" + e.getIdentityType() + + "_" + e.getSaasRoleUser().getPersonId() + "_" + e.getWorkspaceId() + "_" + e.getOuId())); + // 根据入参解析insert、delete的记录 + List upsert = Lists.newArrayList(); + assembleInsertData(roleUserMap, param, roles, upsert); + + assembleDeleteData(roleUserMap, param, roles, upsert); + + // 批量insert、delete + if (CollectionUtils.isEmpty(upsert)) { + return; + } + this.saveOrUpdateBatch(upsert); + + // 发送mq + List inserts = upsert.stream() + .filter(saasRoleUserRelation -> Objects.isNull(saasRoleUserRelation.getIsDelete()) || Objects.equals(TableIsDeleteEnum.NORMAL.value, saasRoleUserRelation.getIsDelete())) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(inserts)) { + Event event = Event.builder() + .targetType(TARGET_TYPE) + .eventCode(SAAS_ROLE_USER_RELATION_UPSERT.getEventCode()) + .data(SaasRoleUserRelationUpsertPayload.builder() + .newValues(inserts) + .build()) + .build(); + mqProducer.send(event); + } + + List deletes = upsert.stream() + .filter(saasRoleUserRelation -> Objects.nonNull(saasRoleUserRelation.getIsDelete()) && !Objects.equals(TableIsDeleteEnum.NORMAL.value, saasRoleUserRelation.getIsDelete())) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(deletes)) { + Event event = Event.builder() + .targetType(TARGET_TYPE) + .eventCode(SAAS_ROLE_USER_RELATION_REMOVED.getEventCode()) + .data(SaasRoleUserRelationRemovePayload.builder() + .values(deletes) + .build()) + .build(); + mqProducer.send(event); + } + + logApi.addLog(LogAddReq.builder() + .scene("UPSERT_USER_ROLE") + .level("INFO") + .tags(Lists.newArrayList(param.getUserRoles().stream() + .map(UpsertUserRoleReq.UserRoleReq::getPersonId) + .map(String::valueOf) + .collect(Collectors.toList()))) + .message(new JSONObject() + .fluentPut("param", param) + .fluentPut("upsert", upsert) + .toJSONString()) + .build()); } @Override @@ -684,4 +760,235 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl allRoleIds = Sets.newHashSet(); + Set insertRoleIds = param.getUserRoles().stream() + .map(UpsertUserRoleReq.UserRoleReq::getInsertRoleIds) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + + Set fullRoleIds = param.getUserRoles().stream() + .map(UpsertUserRoleReq.UserRoleReq::getFullRoleIds) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + + Set removeRoleIds = param.getUserRoles().stream() + .map(UpsertUserRoleReq.UserRoleReq::getRemoveRoleIds) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + allRoleIds.addAll(insertRoleIds); + allRoleIds.addAll(fullRoleIds); + allRoleIds.addAll(removeRoleIds); + if (CollectionUtils.isEmpty(allRoleIds)) { + return; + } + + List dbRoles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(allRoleIds)) + .build()); + + if (!Objects.equals(allRoleIds.size(), dbRoles.size())) { + Sets.SetView difference = Sets.difference(allRoleIds, dbRoles.stream().map(SaasRoleRes::getId).collect(Collectors.toSet())); + throw ROLE_ID_NOF_FOUND.toException(ROLE_ID_NOF_FOUND.getErrorMessage(), difference.stream().sorted().collect(Collectors.toList())); + } + } + + private Map checkRoleCode(UpsertUserRoleReq param) { + Set allRoleCodes = Sets.newHashSet(); + Set insertRoleCodes = param.getUserRoles().stream() + .map(UpsertUserRoleReq.UserRoleReq::getInsertRoleCodes) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + + Set fullRoleCodes = param.getUserRoles().stream() + .map(UpsertUserRoleReq.UserRoleReq::getFullRoleCodes) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + + Set removeRoleCodes = param.getUserRoles().stream() + .map(UpsertUserRoleReq.UserRoleReq::getRemoveRoleCodes) + .filter(Objects::nonNull) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + allRoleCodes.addAll(insertRoleCodes); + allRoleCodes.addAll(fullRoleCodes); + allRoleCodes.addAll(removeRoleCodes); + if (CollectionUtils.isEmpty(allRoleCodes)) { + return Collections.emptyMap(); + } + + List dbRoles = roleService.list(ListRoleReq.builder() + .roleCodes(allRoleCodes) + .build()); + + if (!Objects.equals(allRoleCodes.size(), dbRoles.size())) { + Sets.SetView difference = Sets.difference(allRoleCodes, dbRoles.stream().map(SaasRoleRes::getRoleCode).collect(Collectors.toSet())); + throw ROLE_CODE_NOF_FOUND.toException(ROLE_CODE_NOF_FOUND.getErrorMessage(), difference.stream().sorted().collect(Collectors.toList())); + } + + return dbRoles.stream() + .collect(Collectors.toMap(SaasRoleRes::getRoleCode, Function.identity(), (f, s) -> f)); + } + + private List listRoleUserRelation(UpsertUserRoleReq param) { + return this.listV2(ListRoleUserRelationParam.builder() + .batchPersons(param.getUserRoles().stream() + .map(e -> ListRoleUserRelationParam.BatchPerson.builder() + .identityId(e.getIdentityId()) + .identityType(e.getIdentityType().getCode()) + .personId(e.getPersonId()) + .workspaceId(e.getWorkspaceId()) + .ouId(e.getOuId()) + .resourceId(e.getNodeId()) + .build()) + .collect(Collectors.toList())) + .build()); + } + + private SaasRoleUserRelation from(UpsertUserRoleReq.UserRoleReq userRoleReq, + UpsertUserRoleReq param) { + SaasRoleUserRelation saasRoleUserRelation = new SaasRoleUserRelation(); + saasRoleUserRelation.setNaturalPersonId(userRoleReq.getPersonId()); + saasRoleUserRelation.setIdentityId(userRoleReq.getIdentityId()); + saasRoleUserRelation.setIdentityType(userRoleReq.getIdentityType().getCode()); + saasRoleUserRelation.setWorkspaceId(userRoleReq.getWorkspaceId()); + saasRoleUserRelation.setOuId(userRoleReq.getOuId()); + saasRoleUserRelation.setCreateBy(param.getOperatorId()); + saasRoleUserRelation.setResourceId(userRoleReq.getNodeId()); + // 目前都是node,所以没有让接口传入,后续如果放开了,可以增加默认值 + saasRoleUserRelation.setResourceType(RoleResourceTypeEnum.NODE.code); + return saasRoleUserRelation; + } + + private void assembleInsertData(Map> roleUserMap, + UpsertUserRoleReq param, + Map roles, + List upsert) { + List resultByInsertRoleIds = param.getUserRoles().stream() + .flatMap(e -> { + Set allInsertRoleIds = Optional.ofNullable(e.getInsertRoleIds()) + .orElseGet(Sets::newHashSet); + + allInsertRoleIds.addAll(Optional.ofNullable(e.getInsertRoleCodes()) + .map(roleCodes -> roleCodes.stream() + .map(roleCode -> roles.get(roleCode).getId()) + .collect(Collectors.toSet())) + .orElseGet(Sets::newHashSet)); + + return allInsertRoleIds.stream() + .map(roleId -> { + SaasRoleUserRelation saasRoleUserRelation = from(e, param); + saasRoleUserRelation.setRoleId(roleId); + return saasRoleUserRelation; + }); + }) + .collect(Collectors.toList()); + upsert.addAll(resultByInsertRoleIds); + + + List resultByFullRoleIds = param.getUserRoles().stream() + .flatMap(e -> { + Set allFullRoleIds = Optional.ofNullable(e.getFullRoleIds()) + .orElseGet(Sets::newHashSet); + + allFullRoleIds.addAll(Optional.ofNullable(e.getFullRoleCodes()) + .map(roleCodes -> roleCodes.stream() + .map(roleCode -> roles.get(roleCode).getId()) + .collect(Collectors.toSet())) + .orElseGet(Sets::newHashSet)); + + Set roleIds = Optional.ofNullable(roleUserMap.get(e.buildKey())) + .map(roleUsers -> roleUsers.stream() + .filter(roleUser -> Objects.isNull(e.getNodeId()) || Objects.equals(e.getNodeId(), roleUser.getResourceId())) + .map(SaasRoleUserV2DTO::getRoleId) + .collect(Collectors.toSet())) + .orElseGet(Sets::newHashSet); + + return allFullRoleIds.stream() + .filter(roleId -> !roleIds.contains(roleId)) + .map(roleId -> { + SaasRoleUserRelation saasRoleUserRelation = from(e, param); + saasRoleUserRelation.setRoleId(roleId); + return saasRoleUserRelation; + }); + }) + .collect(Collectors.toList()); + upsert.addAll(resultByFullRoleIds); + } + + /** + * 组装delete的数据是需要完整的信息,执行sql的时候,不会全部字段去更新, + * 是为了发送mq,方便消费mq的业务进行操作,因为软删除的是查询不到的不应该拿去做业务 + * @param roleUserMap + * @param param + * @param roles + * @param upsert + */ + private void assembleDeleteData(Map> roleUserMap, + UpsertUserRoleReq param, + Map roles, + List upsert) { + List resultByRemoveRoles = param.getUserRoles().stream() + .flatMap(e -> { + Set allRemoveRoleIds = Optional.ofNullable(e.getRemoveRoleIds()) + .orElseGet(Sets::newHashSet); + allRemoveRoleIds.addAll(Optional.ofNullable(e.getRemoveRoleCodes()) + .map(roleCodes -> roleCodes.stream() + .map(roleCode -> roles.get(roleCode).getId()) + .collect(Collectors.toSet())) + .orElseGet(Sets::newHashSet)); + List saasRoleUsers = Optional.ofNullable(roleUserMap.get(e.buildKey())) + .orElseGet(Lists::newArrayList); + + return saasRoleUsers.stream() + .filter(roleUser -> Objects.isNull(e.getNodeId()) || Objects.equals(e.getNodeId(), roleUser.getResourceId())) + .filter(roleUser -> allRemoveRoleIds.contains(roleUser.getRoleId())) + .map(roleUser -> { + SaasRoleUserRelation saasRoleUserRelation = new SaasRoleUserRelation(); + BeanUtils.copyProperties(roleUser, saasRoleUserRelation); + saasRoleUserRelation.setIsDelete(roleUser.getId()); + saasRoleUserRelation.setUpdateBy(param.getOperatorId()); + return saasRoleUserRelation; + }); + }) + .collect(Collectors.toList()); + upsert.addAll(resultByRemoveRoles); + + List resultByFullRoles = param.getUserRoles().stream() + .flatMap(e -> { + Set allFullRoleIds = Optional.ofNullable(e.getFullRoleIds()) + .orElseGet(Sets::newHashSet); + + allFullRoleIds.addAll(Optional.ofNullable(e.getFullRoleCodes()) + .map(roleCodes -> roleCodes.stream() + .map(roleCode -> roles.get(roleCode).getId()) + .collect(Collectors.toSet())) + .orElseGet(Sets::newHashSet)); + if (CollectionUtils.isEmpty(allFullRoleIds)) { + return Stream.empty(); + } + + List saasRoleUsers = Optional.ofNullable(roleUserMap.get(e.buildKey())) + .orElseGet(Lists::newArrayList); + + return saasRoleUsers.stream() + .filter(roleUser -> Objects.isNull(e.getNodeId()) || Objects.equals(e.getNodeId(), roleUser.getResourceId())) + .filter(roleUser -> !allFullRoleIds.contains(roleUser.getRoleId())) + .map(roleUser -> { + SaasRoleUserRelation saasRoleUserRelation = new SaasRoleUserRelation(); + BeanUtils.copyProperties(roleUser, saasRoleUserRelation); + saasRoleUserRelation.setIsDelete(roleUser.getId()); + saasRoleUserRelation.setUpdateBy(param.getOperatorId()); + return saasRoleUserRelation; + }); + }) + .collect(Collectors.toList()); + upsert.addAll(resultByFullRoles); + } } diff --git a/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java b/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java index 6bc95d93..faeba214 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/base/TestConfig.java @@ -3,10 +3,17 @@ package cn.axzo.tyr.base; import cn.axzo.apollo.workspace.api.workspace.WorkspaceApi; import cn.axzo.basics.profiles.api.UserProfileServiceApi; import cn.axzo.client.feign.FeatureCodeCachedApi; +import cn.axzo.framework.jackson.utility.JSON; import cn.axzo.framework.rocketmq.Event; import cn.axzo.framework.rocketmq.EventProducer; +import cn.axzo.log.platform.client.feign.LogApi; +import cn.axzo.log.platform.client.model.req.LogAddReq; +import cn.axzo.log.platform.client.model.req.LogBatchAddReq; +import cn.axzo.log.platform.client.model.req.LogFindReq; +import cn.axzo.log.platform.client.model.resp.LogResp; import cn.axzo.maokai.api.client.OrgUserApi; import cn.axzo.thrones.client.saas.ServicePkgClient; +import cn.azxo.framework.common.model.CommonResponse; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.test.context.TestConfiguration; @@ -17,7 +24,10 @@ import redis.embedded.RedisServer; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; import java.io.IOException; +import java.util.List; import java.util.Map; @Slf4j @@ -55,6 +65,8 @@ public class TestConfig { private OrgUserApi orgUserApi; @MockBean private FeatureCodeCachedApi featureCodeCachedApi; + @MockBean + private LogApi logApi; @Bean @Primary diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java index 46aa1965..9a863ef6 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/RoleUserV2ControllerTest.java @@ -5,6 +5,7 @@ import cn.axzo.apollo.workspace.api.workspace.WorkspaceApi; import cn.axzo.apollo.workspace.api.workspace.res.SimpleWorkspaceRes; import cn.axzo.basics.profiles.api.UserProfileServiceApi; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; +import cn.axzo.foundation.exception.BusinessException; import cn.axzo.framework.domain.web.result.ApiListResult; import cn.axzo.maokai.api.client.OrgUserApi; import cn.axzo.maokai.api.vo.response.OrgUserRes; @@ -16,6 +17,7 @@ import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; import cn.axzo.tyr.client.common.enums.FeatureResourceType; import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; import cn.axzo.tyr.client.model.req.ListPermissionFromRoleGroupReq; import cn.axzo.tyr.client.model.res.ListPermissionFromRoleGroupResp; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserDTO; @@ -29,8 +31,10 @@ import cn.axzo.tyr.feign.enums.IdentityTypeEnum; import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; import cn.axzo.tyr.feign.req.PageRoleUserReq; +import cn.axzo.tyr.feign.req.UpsertUserRoleReq; import cn.axzo.tyr.feign.resp.RoleUserResp; import cn.axzo.tyr.server.controller.roleuser.RoleUserController; +import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import cn.axzo.tyr.server.service.SaasRoleUserService; import cn.axzo.tyr.server.service.TyrSaasAuthService; @@ -49,6 +53,8 @@ import java.time.ZoneId; import java.util.List; import java.util.Objects; +import static cn.axzo.tyr.server.config.exception.BizResultCode.ROLE_CODE_NOF_FOUND; +import static cn.axzo.tyr.server.config.exception.BizResultCode.ROLE_ID_NOF_FOUND; import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE; class RoleUserV2ControllerTest extends BaseTest { @@ -1218,4 +1224,49 @@ class RoleUserV2ControllerTest extends BaseTest { .getData() .getData(); } + + @Test + void upsertUserRole() { + + BusinessException businessException = Assertions.assertThrows(BusinessException.class, () -> { + UpsertUserRoleReq upsertUserRoleReq = UpsertUserRoleReq.builder() + .userRoles(Sets.newHashSet(UpsertUserRoleReq.UserRoleReq.builder() + .insertRoleIds(Sets.newHashSet(11L)) + .build())) + .build(); + roleUserV2Controller.upsertUserRole(upsertUserRoleReq); + }); + + Assertions.assertEquals(businessException.getErrorCode(), ROLE_ID_NOF_FOUND.getErrorCode()); + Assertions.assertEquals(businessException.getErrorMsg(), "角色ID不存在:[11]"); + + businessException = Assertions.assertThrows(BusinessException.class, () -> { + UpsertUserRoleReq upsertUserRoleReq = UpsertUserRoleReq.builder() + .userRoles(Sets.newHashSet(UpsertUserRoleReq.UserRoleReq.builder() + .insertRoleIds(Sets.newHashSet(11L)) + .fullRoleIds(Sets.newHashSet(33L, 11L, 22L)) + .removeRoleIds(Sets.newHashSet(3L)) + .build())) + .build(); + roleUserV2Controller.upsertUserRole(upsertUserRoleReq); + }); + + Assertions.assertEquals(businessException.getErrorCode(), ROLE_ID_NOF_FOUND.getErrorCode()); + Assertions.assertEquals(businessException.getErrorMsg(), "角色ID不存在:[3, 11, 22, 33]"); + + businessException = Assertions.assertThrows(BusinessException.class, () -> { + UpsertUserRoleReq upsertUserRoleReq = UpsertUserRoleReq.builder() + .userRoles(Sets.newHashSet(UpsertUserRoleReq.UserRoleReq.builder() + .insertRoleCodes(Sets.newHashSet("AA")) + .fullRoleCodes(Sets.newHashSet("BB, CC")) + .removeRoleCodes(Sets.newHashSet("db")) + .build())) + .build(); + roleUserV2Controller.upsertUserRole(upsertUserRoleReq); + }); + + Assertions.assertEquals(businessException.getErrorCode(), ROLE_CODE_NOF_FOUND.getErrorCode()); + Assertions.assertEquals(businessException.getErrorMsg(), "角色CODE不存在:[AA, BB, CC, db]"); + + } } \ No newline at end of file diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImplTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImplTest.java index 89e3bc3e..e2c8da10 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImplTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImplTest.java @@ -4,11 +4,16 @@ import cn.axzo.foundation.exception.BusinessException; import cn.axzo.foundation.page.PageResp; import cn.axzo.tyr.base.BaseTest; import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.client.common.enums.RoleResourceTypeEnum; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; +import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO; import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam; import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationParam; +import cn.axzo.tyr.feign.enums.IdentityTypeEnum; +import cn.axzo.tyr.feign.req.UpsertUserRoleReq; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; +import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -28,6 +33,8 @@ class SaasRoleUserRelationServiceImplTest extends BaseTest { private SaasRoleUserRelationService saasRoleUserRelationService; @Autowired private MysqlDataLoader mysqlDataLoader; + @Autowired + private RoleService roleService; @BeforeEach @Override @@ -40,12 +47,12 @@ class SaasRoleUserRelationServiceImplTest extends BaseTest { void batchRemove() { List saasRoleUsers = saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder().build()); - Assertions.assertEquals(saasRoleUsers.size(), 4); + Assertions.assertEquals(saasRoleUsers.size(), 9); SaasRoleUserRelationService.BatchRemoveParam batchRemoveParam = SaasRoleUserRelationService.BatchRemoveParam.builder().build(); saasRoleUserRelationService.batchRemove(batchRemoveParam); - Assertions.assertEquals(saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder().build()).size(), 4); + Assertions.assertEquals(saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder().build()).size(), 9); BusinessException businessException = assertThrows(BusinessException.class, ()->{ saasRoleUserRelationService.batchRemove(SaasRoleUserRelationService.BatchRemoveParam.builder() @@ -57,7 +64,7 @@ class SaasRoleUserRelationServiceImplTest extends BaseTest { saasRoleUserRelationService.batchRemove(SaasRoleUserRelationService.BatchRemoveParam.builder() .ids(Sets.newHashSet(16399L, 16400L)) .build()); - Assertions.assertEquals(saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder().build()).size(), 2); + Assertions.assertEquals(saasRoleUserRelationService.listV2(ListRoleUserRelationParam.builder().build()).size(), 7); } @Test @@ -118,4 +125,220 @@ class SaasRoleUserRelationServiceImplTest extends BaseTest { result = saasRoleUserRelationService.listV2(list); Assertions.assertEquals(result.size(), 1); } + + @Test + void upsertUserRole() { + ListRoleUserRelationParam listRoleUserRelationParam = ListRoleUserRelationParam.builder() + .personId(1776L) + .resourceType(RoleResourceTypeEnum.NODE.code) + .resourceId(17990L) + .build(); + List saasRoleUsers = saasRoleUserRelationService.listV2(listRoleUserRelationParam); + + Assertions.assertEquals(saasRoleUsers.size(), 1); + // 清空role + saasRoleUserRelationService.upsert(UpsertUserRoleReq.builder() + .userRoles(Sets.newHashSet( + UpsertUserRoleReq.UserRoleReq.builder() + .identityId(10256L) + .identityType(IdentityTypeEnum.WORKER) + .personId(1776L) + .workspaceId(195L) + .ouId(7784L) + .nodeId(17990L) + .removeRoleIds(Sets.newHashSet(100008L)) + .build() + )) + .operatorId(11L) + .build()); + saasRoleUsers = saasRoleUserRelationService.listV2(listRoleUserRelationParam); + + Assertions.assertEquals(saasRoleUsers.size(), 0); + // 清空role + + // 更换role + saasRoleUserRelationService.upsert(UpsertUserRoleReq.builder() + .userRoles(Sets.newHashSet( + UpsertUserRoleReq.UserRoleReq.builder() + .identityId(10256L) + .identityType(IdentityTypeEnum.WORKER) + .personId(1776L) + .workspaceId(195L) + .ouId(7784L) + .nodeId(17990L) + .fullRoleIds(Sets.newHashSet(100009L)) + .build() + )) + .operatorId(11L) + .build()); + saasRoleUsers = saasRoleUserRelationService.listV2(listRoleUserRelationParam); + Assertions.assertEquals(saasRoleUsers.size(), 1); + Assertions.assertEquals(saasRoleUsers.get(0).getIdentityId(), 10256L); + Assertions.assertEquals(saasRoleUsers.get(0).getIdentityType(), 1); + Assertions.assertEquals(saasRoleUsers.get(0).getSaasRoleUser().getPersonId(), 1776L); + Assertions.assertEquals(saasRoleUsers.get(0).getRoleId(), 100009L); + Assertions.assertEquals(saasRoleUsers.get(0).getWorkspaceId(), 195L); + Assertions.assertEquals(saasRoleUsers.get(0).getOuId(), 7784L); + Assertions.assertEquals(saasRoleUsers.get(0).getResourceId(), 17990L); + Assertions.assertEquals(saasRoleUsers.get(0).getResourceType(), RoleResourceTypeEnum.NODE.code); + // 更换role + + // 增加和删除role + saasRoleUserRelationService.upsert(UpsertUserRoleReq.builder() + .userRoles(Sets.newHashSet( + UpsertUserRoleReq.UserRoleReq.builder() + .identityId(10256L) + .identityType(IdentityTypeEnum.WORKER) + .personId(1776L) + .workspaceId(195L) + .ouId(7784L) + .nodeId(17990L) + .insertRoleIds(Sets.newHashSet(100010L)) + .build() + )) + .operatorId(11L) + .build()); + saasRoleUserRelationService.upsert(UpsertUserRoleReq.builder() + .userRoles(Sets.newHashSet( + UpsertUserRoleReq.UserRoleReq.builder() + .identityId(10256L) + .identityType(IdentityTypeEnum.WORKER) + .personId(1776L) + .workspaceId(195L) + .ouId(7784L) + .nodeId(17990L) + .removeRoleIds(Sets.newHashSet(100009L)) + .insertRoleIds(Sets.newHashSet(100147L)) + .build() + )) + .operatorId(11L) + .build()); + saasRoleUsers = saasRoleUserRelationService.listV2(listRoleUserRelationParam); + Assertions.assertEquals(saasRoleUsers.size(), 2); + Assertions.assertEquals(saasRoleUsers.get(0).getIdentityId(), 10256L); + Assertions.assertEquals(saasRoleUsers.get(0).getIdentityType(), 1); + Assertions.assertEquals(saasRoleUsers.get(0).getSaasRoleUser().getPersonId(), 1776L); + Assertions.assertEquals(saasRoleUsers.get(0).getRoleId(), 100010L); + Assertions.assertEquals(saasRoleUsers.get(0).getWorkspaceId(), 195L); + Assertions.assertEquals(saasRoleUsers.get(0).getOuId(), 7784L); + Assertions.assertEquals(saasRoleUsers.get(0).getResourceId(), 17990L); + Assertions.assertEquals(saasRoleUsers.get(0).getResourceType(), RoleResourceTypeEnum.NODE.code); + + Assertions.assertEquals(saasRoleUsers.get(1).getIdentityId(), 10256L); + Assertions.assertEquals(saasRoleUsers.get(1).getIdentityType(), 1); + Assertions.assertEquals(saasRoleUsers.get(1).getSaasRoleUser().getPersonId(), 1776L); + Assertions.assertEquals(saasRoleUsers.get(1).getRoleId(), 100147L); + Assertions.assertEquals(saasRoleUsers.get(1).getWorkspaceId(), 195L); + Assertions.assertEquals(saasRoleUsers.get(1).getOuId(), 7784L); + Assertions.assertEquals(saasRoleUsers.get(1).getResourceId(), 17990L); + Assertions.assertEquals(saasRoleUsers.get(1).getResourceType(), RoleResourceTypeEnum.NODE.code); + // 增加role + } + + @Test + void upsertUserRoleReplaceChangeGroupLeaderRole() { + // old + // 清空role + ListRoleUserRelationParam listRoleUserRelationParam = ListRoleUserRelationParam.builder() + .personId(1776L) + .resourceType(RoleResourceTypeEnum.NODE.code) + .resourceId(17990L) + .build(); + List saasRoleUsers = saasRoleUserRelationService.listV2(listRoleUserRelationParam); + + Assertions.assertEquals(saasRoleUsers.size(), 1); + roleService.changeGroupLeaderRole(Lists.newArrayList( + ChangeGroupLeaderRoleReq.builder().groupNodeId(listRoleUserRelationParam.getResourceId()) + .groupLeaderPersonId(listRoleUserRelationParam.getPersonId()).build() + )); + saasRoleUsers = saasRoleUserRelationService.listV2(listRoleUserRelationParam); + + Assertions.assertEquals(saasRoleUsers.size(), 0); + // 清空role + + // 更换role + roleService.changeGroupLeaderRole(Lists.newArrayList( + ChangeGroupLeaderRoleReq.builder().groupNodeId(listRoleUserRelationParam.getResourceId()) + .groupNodeId(listRoleUserRelationParam.getResourceId()) + .groupLeaderPersonId(listRoleUserRelationParam.getPersonId()) + .workspaceId(195L) + .ouId(7784L) + .groupLeaderIdentityId(10256L) + .roleIdList(Lists.newArrayList(100009L)).build() + )); + saasRoleUsers = saasRoleUserRelationService.listV2(listRoleUserRelationParam); + Assertions.assertEquals(saasRoleUsers.size(), 1); + Assertions.assertEquals(saasRoleUsers.get(0).getIdentityId(), 10256L); + Assertions.assertEquals(saasRoleUsers.get(0).getIdentityType(), 1); + Assertions.assertEquals(saasRoleUsers.get(0).getSaasRoleUser().getPersonId(), 1776L); + Assertions.assertEquals(saasRoleUsers.get(0).getRoleId(), 100009L); + Assertions.assertEquals(saasRoleUsers.get(0).getWorkspaceId(), 195L); + Assertions.assertEquals(saasRoleUsers.get(0).getOuId(), 7784L); + Assertions.assertEquals(saasRoleUsers.get(0).getResourceId(), 17990L); + Assertions.assertEquals(saasRoleUsers.get(0).getResourceType(), RoleResourceTypeEnum.NODE.code); + // 更换role + + // 增加role + roleService.changeGroupLeaderRole(Lists.newArrayList( + ChangeGroupLeaderRoleReq.builder().groupNodeId(listRoleUserRelationParam.getResourceId()) + .groupNodeId(listRoleUserRelationParam.getResourceId()) + .groupLeaderPersonId(listRoleUserRelationParam.getPersonId()) + .workspaceId(195L) + .ouId(7784L) + .groupLeaderIdentityId(10256L) + .roleIdList(Lists.newArrayList(100009L, 100010L)).build() + )); + saasRoleUsers = saasRoleUserRelationService.listV2(listRoleUserRelationParam); + Assertions.assertEquals(saasRoleUsers.size(), 2); + Assertions.assertEquals(saasRoleUsers.get(0).getIdentityId(), 10256L); + Assertions.assertEquals(saasRoleUsers.get(0).getIdentityType(), 1); + Assertions.assertEquals(saasRoleUsers.get(0).getSaasRoleUser().getPersonId(), 1776L); + Assertions.assertEquals(saasRoleUsers.get(0).getRoleId(), 100009L); + Assertions.assertEquals(saasRoleUsers.get(0).getWorkspaceId(), 195L); + Assertions.assertEquals(saasRoleUsers.get(0).getOuId(), 7784L); + Assertions.assertEquals(saasRoleUsers.get(0).getResourceId(), 17990L); + Assertions.assertEquals(saasRoleUsers.get(0).getResourceType(), RoleResourceTypeEnum.NODE.code); + + Assertions.assertEquals(saasRoleUsers.get(1).getIdentityId(), 10256L); + Assertions.assertEquals(saasRoleUsers.get(1).getIdentityType(), 1); + Assertions.assertEquals(saasRoleUsers.get(1).getSaasRoleUser().getPersonId(), 1776L); + Assertions.assertEquals(saasRoleUsers.get(1).getRoleId(), 100010L); + Assertions.assertEquals(saasRoleUsers.get(1).getWorkspaceId(), 195L); + Assertions.assertEquals(saasRoleUsers.get(1).getOuId(), 7784L); + Assertions.assertEquals(saasRoleUsers.get(1).getResourceId(), 17990L); + Assertions.assertEquals(saasRoleUsers.get(1).getResourceType(), RoleResourceTypeEnum.NODE.code); + // 增加role + + // 增加和删除role + roleService.changeGroupLeaderRole(Lists.newArrayList( + ChangeGroupLeaderRoleReq.builder().groupNodeId(listRoleUserRelationParam.getResourceId()) + .groupNodeId(listRoleUserRelationParam.getResourceId()) + .groupLeaderPersonId(listRoleUserRelationParam.getPersonId()) + .workspaceId(195L) + .ouId(7784L) + .groupLeaderIdentityId(10256L) + .roleIdList(Lists.newArrayList(100147L, 100010L)).build() + )); + saasRoleUsers = saasRoleUserRelationService.listV2(listRoleUserRelationParam); + Assertions.assertEquals(saasRoleUsers.size(), 2); + Assertions.assertEquals(saasRoleUsers.get(0).getIdentityId(), 10256L); + Assertions.assertEquals(saasRoleUsers.get(0).getIdentityType(), 1); + Assertions.assertEquals(saasRoleUsers.get(0).getSaasRoleUser().getPersonId(), 1776L); + Assertions.assertEquals(saasRoleUsers.get(0).getRoleId(), 100010L); + Assertions.assertEquals(saasRoleUsers.get(0).getWorkspaceId(), 195L); + Assertions.assertEquals(saasRoleUsers.get(0).getOuId(), 7784L); + Assertions.assertEquals(saasRoleUsers.get(0).getResourceId(), 17990L); + Assertions.assertEquals(saasRoleUsers.get(0).getResourceType(), RoleResourceTypeEnum.NODE.code); + + Assertions.assertEquals(saasRoleUsers.get(1).getIdentityId(), 10256L); + Assertions.assertEquals(saasRoleUsers.get(1).getIdentityType(), 1); + Assertions.assertEquals(saasRoleUsers.get(1).getSaasRoleUser().getPersonId(), 1776L); + Assertions.assertEquals(saasRoleUsers.get(1).getRoleId(), 100147L); + Assertions.assertEquals(saasRoleUsers.get(1).getWorkspaceId(), 195L); + Assertions.assertEquals(saasRoleUsers.get(1).getOuId(), 7784L); + Assertions.assertEquals(saasRoleUsers.get(1).getResourceId(), 17990L); + Assertions.assertEquals(saasRoleUsers.get(1).getResourceType(), RoleResourceTypeEnum.NODE.code); + // 增加role + // old + } } \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/SaasRoleUserRelationServiceImplTest.sql b/tyr-server/src/test/resources/mysql/SaasRoleUserRelationServiceImplTest.sql index 75494e01..b2a76b6a 100644 --- a/tyr-server/src/test/resources/mysql/SaasRoleUserRelationServiceImplTest.sql +++ b/tyr-server/src/test/resources/mysql/SaasRoleUserRelationServiceImplTest.sql @@ -15,4 +15,45 @@ VALUES (3417, '商务副经理', '', 'init', 'cms:mafb_business_vice_officer', - INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) VALUES (3418, '生产副经理', '', 'init', 'cms:mafb_productivity_vice_officer', -1, -1, 5, 2, 0, '2023-10-23 17:50:00', '2024-08-13 10:25:41', -1, 2006333, 1, 65535, 0, null, 0, '', 1, 3, 1); + +INSERT INTO saas_role_group (id, workspace_type_code, ou_type_code, name, workspace_id, ou_id, parent_id, sort, code, category_code, is_delete, create_at, update_at, path) +VALUES (32, '2', '9', '小组长权限', -1, -1, 46, 7, 'projectTeamGPLeader', 'workspace_groupleader', 0, '2024-01-20 18:51:37', '2024-09-10 10:18:44', '46,32,'); + +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) +VALUES (165, 100009, 32, 0, '2024-01-20 18:51:37', '2024-01-20 18:51:37'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) +VALUES (166, 100010, 32, 0, '2024-01-20 18:51:37', '2024-01-20 18:51:37'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) +VALUES (167, 100008, 32, 0, '2024-01-20 18:51:37', '2024-01-20 18:51:37'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) +VALUES (180, 100147, 32, 0, '2024-02-20 10:11:17', '2024-02-20 10:11:17'); +INSERT INTO saas_role_group_relation (id, role_id, saas_role_group_id, is_delete, create_at, update_at) +VALUES (218, 100379, 32, 0, '2024-04-28 14:56:11', '2024-04-28 14:56:11'); + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100008, '小组内工人记工', '', 'init', 'cms:bz_subteam_worker_order', -1, -1, 9, 2, 0, '2024-01-20 18:51:37', '2024-10-25 14:18:42', 0, 89629, 1, 65535, 0, null, 0, '', 1, 1, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100009, '小组任务终止、转单、撤销', '', 'init', 'cms:bz_subteam_task_manage', -1, -1, 9, 2, 0, '2024-01-20 18:51:37', '2024-11-20 09:48:19', 0, 89629, 1, 65535, 0, null, 0, '', 1, 2, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100010, '发起考勤补卡', '', 'init', 'cms:bz_subteam_absence&attendance', -1, -1, 9, 2, 0, '2024-01-20 18:51:37', '2024-08-07 11:10:57', 0, 81, 1, 65535, 0, null, 0, '', 1, 3, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100147, '提交发薪申请、查看发薪记录', '', 'init', 'cms:bz_subteam_salary_apply&recoder', -1, -1, 9, 2, 0, '2024-02-20 10:11:17', '2024-08-13 10:26:11', 2003028, 29024, 1, 65535, 0, null, 0, '', 1, 4, 1); +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100379, '通讯录', '', 'init', 'XZZ-tongxunlu', -1, -1, 9, 2, 0, '2024-04-28 14:56:11', '2024-12-18 15:44:56', 2008237, 9000400266, 1, 65535, 0, null, 0, '', 1, 5, 1); + +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (197763, 10256, 100008, 1, 1776, 195, 7784, 2, 17990, 0, '2024-01-20 18:51:41', '2024-01-20 18:51:41', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (197766, 10344, 100008, 1, 1513, 195, 7334, 2, 17988, 0, '2024-01-20 18:51:41', '2024-01-20 18:51:41', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (197769, 20276, 100008, 1, 13130, 195, 7334, 2, 17985, 0, '2024-01-20 18:51:41', '2024-01-20 18:51:41', 0, 0, 2); +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (197775, 38205, 100008, 1, 31786, 3488, 9414, 2, 11629, 0, '2024-01-20 18:51:41', '2024-01-20 18:51:41', 0, 0, 2); + +INSERT INTO saas_role (id, NAME, description, role_type, role_code, workspace_id, owner_ou_id, product_unit_type, workspace_type, is_delete, create_at, update_at, create_by, update_by, fit_ou_type_bit, fit_ou_node_type_bit, position_template_id, project_team_manage_role_resource_id, from_pre_role_id, job_code, is_display, sort, enabled) +VALUES (100019, '项目二维码管理', '', 'init', 'cms:bz_project_qrcode_manage', -1, -1, 9, 2, 0, '2024-01-20 18:51:37', '2024-10-25 14:18:42', 0, 89629, 1, 65535, 0, null, 0, '', 1, 1, 1); + +INSERT INTO saas_role_user_relation (id, identity_id, role_id, identity_type, natural_person_id, workspace_id, ou_id, resource_type, resource_id, is_delete, create_at, update_at, create_by, update_by, job_type) +VALUES (197764, 10256, 100019, 1, 1776, 195, 7784, 0, 0, 0, '2024-01-20 18:51:41', '2024-01-20 18:51:41', 0, 0, 2); + #-->SaasRoleUserRelationServiceImplTest.sql \ No newline at end of file From 19f16a5d7ffe8c3a71f7df76a3d39964454b7d04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Thu, 19 Dec 2024 16:17:45 +0800 Subject: [PATCH 17/25] =?UTF-8?q?feat:(REQ-3282)=20=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=9D=83=E9=99=90=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=96=B0=E6=97=A7featureCode=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/impl/PermissionServiceImpl.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java index 3e1cc496..6ea2b27a 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java @@ -10,6 +10,7 @@ import cn.axzo.tyr.server.service.ProductPermissionCacheService; import cn.axzo.tyr.server.service.RolePermissionCacheService; import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.service.WorkspaceProductService; +import cn.axzo.tyr.server.util.FeatureCodeUtil; import cn.hutool.core.collection.CollectionUtil; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; @@ -37,6 +38,8 @@ public class PermissionServiceImpl implements PermissionService { private WorkspaceProductService workspaceProductService; @Autowired private SaasFeatureResourceService saasFeatureResourceService; + @Autowired + private FeatureCodeUtil featureCodeUtil; /** * 1、查询用户的角色 @@ -57,6 +60,10 @@ public class PermissionServiceImpl implements PermissionService { return Collections.emptyList(); } + // 为了兼容新旧featureCode,这里根据featureCode去查询新旧featureCode的映射把新旧featureCode都组装起 + Set newFeatureCodes = featureCodeUtil.resolveFeatureCode(param.getFeatureCodes()); + param.setFeatureCodes(newFeatureCodes); + // 查询项目的权限 Map> workspacePermissionMap = listWorkspacePermission(param); if (Objects.isNull(workspacePermissionMap) || workspacePermissionMap.isEmpty()) { From 50350b8cd7cc1dc54e00d3d5d3df5d7d74c0c985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Fri, 20 Dec 2024 13:56:27 +0800 Subject: [PATCH 18/25] =?UTF-8?q?feat:(REQ-3282)=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=9D=83=E9=99=90=E6=9F=A5=E8=AF=A2=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E6=94=AF=E6=8C=81=E6=AF=8F=E4=B8=AA=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=9F=A5=E8=AF=A2=E4=B8=8D=E5=90=8C=E7=9A=84=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/PrivateController.java | 21 +- .../tyr/server/service/PermissionService.java | 14 ++ .../ProductPermissionCacheService.java | 5 - .../service/WorkspaceProductService.java | 27 ++- .../service/impl/PermissionServiceImpl.java | 40 +++- .../service/impl/TyrSaasAuthServiceImpl.java | 33 ++- .../impl/WorkspaceProductServiceImpl.java | 81 +++---- .../v2/UserPermissionControllerTest.java | 10 +- .../axzo/tyr/server/permission/JobTest.java | 28 --- .../permission/PermissionPointTest.java | 145 ------------ .../tyr/server/permission/RoleUserTest.java | 78 ------- .../tyr/server/permission/SimpleTest.java | 25 -- .../impl/WorkspaceProductServiceImplTest.java | 214 ++++++++++++++++++ .../mysql/WorkspaceProductServiceImplTest.sql | 130 +++++++++++ 14 files changed, 472 insertions(+), 379 deletions(-) delete mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/permission/JobTest.java delete mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/permission/PermissionPointTest.java delete mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/permission/RoleUserTest.java delete mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/permission/SimpleTest.java create mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java create mode 100644 tyr-server/src/test/resources/mysql/WorkspaceProductServiceImplTest.sql diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java index 692be370..2f2fa2e1 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/PrivateController.java @@ -18,8 +18,6 @@ import cn.axzo.tyr.client.model.req.ListRoleReq; import cn.axzo.tyr.client.model.req.ListSaasRoleGroupParam; import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq; import cn.axzo.tyr.client.model.req.PageProductFeatureRelationReq; -import cn.axzo.tyr.client.model.req.PageRoleReq; -import cn.axzo.tyr.client.model.req.PermissionCheckReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; import cn.axzo.tyr.client.model.res.CommonDictResp; import cn.axzo.tyr.client.model.res.FeatureResourceDTO; @@ -69,7 +67,6 @@ import cn.axzo.tyr.server.service.SaasFeatureResourceService; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; -import cn.axzo.tyr.server.service.TyrSaasAuthService; import cn.axzo.tyr.server.service.WorkspaceProductService; import cn.axzo.tyr.server.service.impl.SaasFeatureResourceCacheService; import cn.axzo.tyr.server.util.FeatureCodeUtil; @@ -86,7 +83,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -615,11 +611,6 @@ public class PrivateController { return "ok"; } - @PostMapping("/api/private/workspaceProduct/list") - public Object listWorkspaceProduct(@RequestBody WorkspaceProductService.WorkspaceProductParam request) { - return workspaceProductService.listWorkspaceProductCached(request); - } - @PostMapping("/api/private/cacheWorkspaceProductHandler/process") public Object processCacheWorkspaceProductHandler(@RequestBody ServicePkgProductCreatedPayload request) { Event event = Event.builder() @@ -678,8 +669,8 @@ public class PrivateController { } @PostMapping("/api/private/workspaceProductCached/list") - public Object workspaceProductCached(@RequestBody WorkspaceProductService.ListWorkspaceProductPermissionCacheParam request) { - return workspaceProductService.listWorkspaceProductPermissionCached(request); + public Object workspaceProductCached(@RequestBody WorkspaceProductService.ListWorkspacePermissionCacheParam request) { + return workspaceProductService.listWorkspacePermissionCached(request); } /** @@ -1297,11 +1288,13 @@ public class PrivateController { } private List listWorkspaceProductPermission(CheckPermissionParam request) { - WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermissionCacheParam = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam + WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspaceProductPermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam .builder() - .workspaceIds(Sets.newHashSet(request.getWorkspaceId())) + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(request.getWorkspaceId()) + .build())) .build(); - return workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermissionCacheParam).stream() + return workspaceProductService.listWorkspacePermissionCached(listWorkspaceProductPermissionCacheParam).stream() .map(WorkspaceProductService.WorkspaceProductPermission::getProductPermissions) .flatMap(Collection::stream) .collect(Collectors.toList()); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java index f01e1848..256f2f8d 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java @@ -2,6 +2,8 @@ package cn.axzo.tyr.server.service; import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; +import cn.axzo.tyr.feign.req.ListPermissionUserReq; +import cn.axzo.tyr.feign.resp.PermissionUserResp; import cn.axzo.tyr.feign.resp.UserPermissionResp; import lombok.AllArgsConstructor; import lombok.Builder; @@ -14,8 +16,20 @@ import java.util.Set; public interface PermissionService { + /** + * 查询用户的权限 + * @param param + * @return + */ List listUserPermission(ListUserPermissionParam param); + /** + * 查询有权限的用户 + * @param param + * @return + */ + List listPermissionUser(ListPermissionUserReq param); + @Data @Builder @NoArgsConstructor diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java index a57ca4dd..7cc84d86 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java @@ -109,10 +109,5 @@ public interface ProductPermissionCacheService { * 项目code(H5会拉取项目下所有的元素) */ private String itemCode; - - /** - * 客户端版本号 - */ - private Integer version; } } \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java index 600eb8db..7257a304 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java @@ -14,13 +14,6 @@ import java.util.Set; public interface WorkspaceProductService { - /** - * 从缓存中查询项目的产品 - * @param param - * @return - */ - List listWorkspaceProductCached(WorkspaceProductParam param); - /** * 缓存项目的产品 * @param param @@ -28,11 +21,11 @@ public interface WorkspaceProductService { void storeWorkspaceProduct(StoreWorkspaceProductParam param); /** - * 从缓存中查询项目的产品及产品的权限 + * 从缓存中查询项目的权限 * @param param * @return */ - List listWorkspaceProductPermissionCached(ListWorkspaceProductPermissionCacheParam param); + List listWorkspacePermissionCached(ListWorkspacePermissionCacheParam param); /** * 从缓存中查询项目的产品及产品的菜单信息 @@ -60,12 +53,24 @@ public interface WorkspaceProductService { @Builder @NoArgsConstructor @AllArgsConstructor - class ListWorkspaceProductPermissionCacheParam { + class ListWorkspacePermissionCacheParam { + private List workspacePermissions; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + class WorkspacePermission { + /** * 项目id */ - private Set workspaceIds; + private Long workspaceId; + /** + * 权限code + */ private Set featureCodes; /** diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java index 6ea2b27a..36c82444 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java @@ -3,7 +3,9 @@ package cn.axzo.tyr.server.service.impl; import cn.axzo.tyr.feign.enums.IdentityTypeEnum; import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; +import cn.axzo.tyr.feign.req.ListPermissionUserReq; import cn.axzo.tyr.feign.resp.PermissionResp; +import cn.axzo.tyr.feign.resp.PermissionUserResp; import cn.axzo.tyr.feign.resp.UserPermissionResp; import cn.axzo.tyr.server.service.PermissionService; import cn.axzo.tyr.server.service.ProductPermissionCacheService; @@ -134,6 +136,25 @@ public class PermissionServiceImpl implements PermissionService { .collect(Collectors.toList()); } + /** + * 1、根据权限code及相关条件查询项目的权限 + * 2、查询单位、项目的所有role + * 3、根据所有role查询角色信息 + * 4、根据项目的权限和role查询角色的权限信息 + * 5、解析有权限的admin role + * 6、解析有权限的非admin role + * 7、解析有离场权限的admin role + * 8、聚合6,7,8的角色,根据角色查询用户 + * 9、根据用户查询用户的tags + * 10、 + * @param param + * @return + */ + @Override + public List listPermissionUser(ListPermissionUserReq param) { + return null; + } + /** * 只有查询在职权限时才能直接根据管理员角色和产品去匹配 * 因为离场权限,管理员角色会配置管理员角色对应的离场权限 @@ -300,14 +321,19 @@ public class PermissionServiceImpl implements PermissionService { return Collections.emptyMap(); } - WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermission = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() - .workspaceIds(workspaceIds) - .featureCodes(param.getFeatureCodes()) - .appType(param.getAppType()) - .itemCode(param.getItemCode()) - .terminal(param.getTerminal()) + WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspacePermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam + .builder() + .workspacePermissions(workspaceIds.stream() + .map(workspaceId -> WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(workspaceId) + .featureCodes(param.getFeatureCodes()) + .appType(param.getAppType()) + .itemCode(param.getItemCode()) + .terminal(param.getTerminal()) + .build()) + .collect(Collectors.toList())) .build(); - return workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermission) + return workspaceProductService.listWorkspacePermissionCached(listWorkspacePermissionCacheParam) .stream() .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, e -> Optional.ofNullable(e.getProductPermissions()) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index a45bbe82..eabb884b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -469,11 +469,14 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { // 查询的featureCodes有可能已经被删除,但是saas_feature_code效率比较低,两个表的id不会重复,所以解析成id去过滤权限 Set featureIds = checkFeatureCodes(param); - WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermissionCacheParam = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() - .workspaceIds(Sets.newHashSet(param.getWorkspaceId())) - .featureCodes(param.getFeatureCodes()) + WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspacePermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam + .builder() + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(param.getWorkspaceId()) + .featureCodes(param.getFeatureCodes()) + .build())) .build(); - List productPermissions = workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermissionCacheParam) + List productPermissions = workspaceProductService.listWorkspacePermissionCached(listWorkspacePermissionCacheParam) .stream() .map(WorkspaceProductService.WorkspaceProductPermission::getProductPermissions) .filter(e -> !CollectionUtils.isEmpty(e)) @@ -994,10 +997,14 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { // find product by workspace Set workspaceId = filterRoleAuths.stream().map(FilterRoleAuth::getWorkspaceId).collect(Collectors.toSet()); - WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermission = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() - .workspaceIds(workspaceId) + WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspacePermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(workspaceId.stream() + .map(e -> WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(e) + .build()) + .collect(Collectors.toList())) .build(); - Map> workspaceProductPermissions = workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermission) + Map> workspaceProductPermissions = workspaceProductService.listWorkspacePermissionCached(listWorkspacePermissionCacheParam) .stream() .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); @@ -1499,11 +1506,15 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { .map(IdentityAuthReq.WorkspaceOuPair::getWorkspaceId) .collect(Collectors.toSet()); // 查询项目的产品权限 - WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listProductPermisssion = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() - .workspaceIds(workspaceIds) - .featureCodes(identityAuthReq.getFeatureCode()) + WorkspaceProductService.ListWorkspacePermissionCacheParam listProductPermisssion = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(workspaceIds.stream() + .map(workspaceId -> WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(workspaceId) + .featureCodes(identityAuthReq.getFeatureCode()) + .build()) + .collect(Collectors.toList())) .build(); - return workspaceProductService.listWorkspaceProductPermissionCached(listProductPermisssion).stream() + return workspaceProductService.listWorkspacePermissionCached(listProductPermisssion).stream() .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java index 9d7731f5..309ef109 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java @@ -7,9 +7,6 @@ import cn.axzo.thrones.client.saas.ServicePkgClient; import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct; import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes; import cn.axzo.tyr.server.repository.dao.ProductModuleDao; -import cn.axzo.tyr.server.repository.entity.ProductFeatureQuery; -import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation; -import cn.axzo.tyr.server.service.ProductFeatureRelationService; import cn.axzo.tyr.server.service.ProductPermissionCacheService; import cn.axzo.tyr.server.service.ProductSaasFeatureResourceCacheService; import cn.axzo.tyr.server.service.WorkspaceProductService; @@ -22,6 +19,7 @@ import com.google.common.collect.Sets; import com.google.common.collect.Streams; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -36,6 +34,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.function.Function; import java.util.stream.Collectors; import static cn.axzo.tyr.server.config.exception.BizResultCode.REDIS_PRODUCT_NOT_NULL; @@ -51,8 +50,6 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService { @Autowired private ProductModuleDao productModuleDao; @Autowired - private ProductFeatureRelationService productFeatureRelationService; - @Autowired private StringRedisTemplate redisTemplate; @Autowired private ProductPermissionCacheService productPermissionCacheService; @@ -66,47 +63,6 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService { private static final String WORKSPACE_PRODUCT_KEY = "workspace:product"; - @Override - public List listWorkspaceProductCached(WorkspaceProductParam param) { - if (CollectionUtils.isEmpty(param.getWorkspaceIds())) { - return Collections.emptyList(); - } - - Map> workspaceProducts = listWorkspaceProduct(param.getWorkspaceIds()); - - Set productIds = workspaceProducts.values().stream() - .flatMap(Collection::stream) - .collect(Collectors.toSet()); - - if (CollectionUtils.isEmpty(productIds)) { - return Collections.emptyList(); - } - - ProductFeatureQuery productFeatureQuery = ProductFeatureQuery.builder() - .productIds(productIds) - .featureResourceTypes(param.getFeatureResourceTypes()) - .terminal(param.getTerminal()) - .type(param.getType()) - .featureIdPairs(param.getFeatureIdPairs()) - .build(); - Map> saasProductModuleFeatureRelations = productFeatureRelationService.queryOnCondition(productFeatureQuery).stream() - .collect(Collectors.groupingBy(SaasProductModuleFeatureRelation::getProductModuleId)); - - return workspaceProducts.entrySet().stream() - .filter(e -> CollectionUtils.isNotEmpty(e.getValue())) - .map(e -> { - List features = e.getValue().stream() - .map(saasProductModuleFeatureRelations::get) - .filter(Objects::nonNull) - .flatMap(Collection::stream) - .collect(Collectors.toList()); - return WorkspaceProduct.builder() - .workspaceId(e.getKey()) - .saasProductModuleFeatureRelations(features) - .build(); - }) - .collect(Collectors.toList()); - } @Override public void storeWorkspaceProduct(StoreWorkspaceProductParam param) { @@ -204,8 +160,14 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService { } @Override - public List listWorkspaceProductPermissionCached(ListWorkspaceProductPermissionCacheParam param) { - Map> workspaceProducts = listWorkspaceProduct(param.getWorkspaceIds()); + public List listWorkspacePermissionCached(ListWorkspacePermissionCacheParam param) { + if (CollectionUtils.isEmpty(param.getWorkspacePermissions())) { + return Collections.emptyList(); + } + + Map> workspaceProducts = listWorkspaceProduct(param.getWorkspacePermissions().stream() + .map(WorkspacePermission::getWorkspaceId) + .collect(Collectors.toSet())); Set productIds = workspaceProducts.values().stream() .flatMap(Collection::stream) @@ -217,19 +179,32 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService { ProductPermissionCacheService.ListProductPermissionParam listProductPermissionParam = ProductPermissionCacheService.ListProductPermissionParam.builder() .productIds(productIds) - .featureCodes(param.getFeatureCodes()) - .appType(param.getAppType()) - .itemCode(param.getItemCode()) - .terminal(param.getTerminal()) .build(); Map> productPermissionMap = productPermissionCacheService.list(listProductPermissionParam); + Map workspacePermissionMap = param.getWorkspacePermissions().stream() + .collect(Collectors.toMap(WorkspacePermission::getWorkspaceId, Function.identity(), (f, s) -> f)); + return workspaceProducts.entrySet().stream() .filter(e -> CollectionUtils.isNotEmpty(e.getValue())) .map(e -> { + + WorkspacePermission workspacePermissionParam = workspacePermissionMap.get(e.getKey()); + List productPermissions = e.getValue().stream() .map(productId -> { - List permissions = productPermissionMap.get(productId); + List permissions = Optional.ofNullable(productPermissionMap.get(productId)) + .orElseGet(Lists::newArrayList) + .stream() + .filter(permission -> CollectionUtils.isEmpty(workspacePermissionParam.getFeatureCodes()) + || workspacePermissionParam.getFeatureCodes().contains(permission.getFeatureCode())) + .filter(permission -> StringUtils.isBlank(workspacePermissionParam.getTerminal()) + || Objects.equals(workspacePermissionParam.getTerminal(), permission.getTerminal())) + .filter(permission -> StringUtils.isBlank(workspacePermissionParam.getAppType()) + || Objects.equals(workspacePermissionParam.getAppType(), permission.getAppType())) + .filter(permission -> StringUtils.isBlank(workspacePermissionParam.getItemCode()) + || Objects.equals(workspacePermissionParam.getItemCode(), permission.getItemCode())) + .collect(Collectors.toList()); if (CollectionUtils.isEmpty(permissions)) { return null; } diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/UserPermissionControllerTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/UserPermissionControllerTest.java index 5a669d1b..0ed804f7 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/UserPermissionControllerTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/controller/v2/UserPermissionControllerTest.java @@ -39,8 +39,6 @@ import java.util.Map; import java.util.Set; import static cn.axzo.tyr.server.config.exception.BizResultCode.PARAM_ERROR; -import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE; -import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertThrows; class UserPermissionControllerTest extends BaseTest { @@ -107,6 +105,14 @@ class UserPermissionControllerTest extends BaseTest { @Test void listUserPermissionReplaceHasPermission() { + Map> featureCodeMap = Maps.newHashMap(); + featureCodeMap.put("h5:cmp_user_manage_worker_page", Sets.newHashSet("h5:cmp_user_manage_worker_page")); + featureCodeMap.put("h5:cmp_user_manage_worker_page_2", Sets.newHashSet("h5:cmp_user_manage_worker_page_2")); + featureCodeMap.put("h5:cmp_user_manage_worker_on_site_audit_btn", Sets.newHashSet("h5:cmp_user_manage_worker_on_site_audit_btn")); + featureCodeMap.put("h5:cmp_user_manage_worker_jump_to_team_btn", Sets.newHashSet("h5:cmp_user_manage_worker_jump_to_team_btn")); + Mockito.when(featureCodeCachedApi.list(Mockito.any())) + .thenReturn(ApiResult.ok(featureCodeMap)); + // old cn.axzo.tyr.client.feign.PermissionQueryApi#hasPermission PermissionCheckReq permissionCheckReq = PermissionCheckReq.builder() .personId(1827L) diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/JobTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/JobTest.java deleted file mode 100644 index 2babfb87..00000000 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/JobTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.axzo.tyr.server.permission; - -import cn.axzo.tyr.server.job.ProductFeatureRefreshJobHandler; -import cn.axzo.tyr.server.model.ProductFeatureRefreshParam; -import com.alibaba.fastjson.JSON; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -/** - * @version V1.0 - * @author: ZhanSiHu - * @date: 2023/10/23 11:30 - */ -@SpringBootTest -public class JobTest { - @Autowired - private ProductFeatureRefreshJobHandler productFeatureRefreshJobHandler; - - @Test - public void testProductFeatureRefresh() throws Exception { - ProductFeatureRefreshParam param = new ProductFeatureRefreshParam(); - param.setWorkspaceType(2); - param.setProductId(1007L); - productFeatureRefreshJobHandler.execute(JSON.toJSONString(param)); - } - -} diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/PermissionPointTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/PermissionPointTest.java deleted file mode 100644 index ca39f750..00000000 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/PermissionPointTest.java +++ /dev/null @@ -1,145 +0,0 @@ -package cn.axzo.tyr.server.permission; - -import cn.axzo.framework.domain.web.result.ApiResult; -import cn.axzo.tyr.client.model.enums.FeatureType; -import cn.axzo.tyr.client.model.permission.PermissionPointDTO; -import cn.axzo.tyr.client.model.permission.PermissionPointListQueryRequest; -import cn.axzo.tyr.client.model.permission.PermissionPointMoveRequest; -import cn.axzo.tyr.client.model.permission.PermissionPointTreeNode; -import cn.axzo.tyr.client.model.permission.PermissionPointTreeQueryReq; -import cn.axzo.tyr.client.model.permission.PermissionPointVO; -import cn.axzo.tyr.server.controller.permission.PermissionPointController; -import cn.axzo.tyr.server.repository.entity.SaasFeature; -import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; -import cn.axzo.tyr.server.service.PermissionPointService; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.serializer.SerializerFeature; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.Arrays; -import java.util.List; - -/** - * 权限点测试 - * - * @version V1.0 - * @author: ZhanSiHu - * @date: 2023/9/6 14:59 - */ -@SpringBootTest -public class PermissionPointTest { - @Autowired - private PermissionPointController controller; - @Autowired - private SaasFeatureDao saasFeatureDao; - @Autowired - private PermissionPointService permissionPointService; - - @Test - public void testList() { - List saasFeatures = saasFeatureDao.listByIds(Arrays.asList(206L, 207L, 208L)); - System.out.println(JSON.toJSONString(saasFeatures)); - } - - @Test - public void testListTreeNode() { - PermissionPointTreeQueryReq request = new PermissionPointTreeQueryReq(); - //request.setParentId(354L); - //request.setKeyword("预警"); - //request.setWorkspaceType(Arrays.asList("ent")); - //request.setTerminalList(Arrays.asList("NT_CMS_WEB_ENT_ZB")); - request.setDelegateType(0); - request.setMaxLevel(3); - request.setMaxFeatureType(2); - ApiResult> result = controller.listTreeNodes(request); - System.out.println("---------------"); - System.out.println(JSON.toJSONString(result, SerializerFeature.DisableCircularReferenceDetect)); - } - - @Test - public void testGetDetail() { - Long permissionId = 360L; - ApiResult result = controller.getDetail(permissionId); - System.out.println(JSON.toJSONString(result)); - } - - @Test - public void testListByIds() { - List ids = Arrays.asList(354L, 360L); - ApiResult> result = controller.listTreeNodesByIds(ids); - System.out.println(JSON.toJSONString(result)); - } - - @Test - public void testInsert() { - PermissionPointDTO permissionPoint = new PermissionPointDTO(); - permissionPoint.setFeatureName("测试合同权限点"); - permissionPoint.setFeatureCode("CMS_WEB_PROJ_0158"); - //permissionPoint.setParentId(360L); - //permissionPoint.setPath("/0/354/360/"); - //permissionPoint.setSort(3); - //permissionPoint.setTerminal("NT_CMS_WEB_PROJ"); - permissionPoint.setTerminal("NT_CMS_WEB_ENT_ZB"); - permissionPoint.setFeatureType(1); - //permissionPoint.setAppName("tyr"); - //permissionPoint.setFeatureUrl("/tyr/test/permission"); - //permissionPoint.setNeedAuth(true); - //permissionPoint.setNeedAuth(true); - System.out.println(JSON.toJSONString(permissionPoint)); - controller.savePermissionPoint(permissionPoint); - } - - @Test - public void testUpdate() { - PermissionPointDTO permissionPoint = new PermissionPointDTO(); - permissionPoint.setId(3479L); - permissionPoint.setFeatureName("测试合同权限点"); - permissionPoint.setFeatureCode("CMS_WEB_PROJ_0159"); //不生效 - permissionPoint.setParentId(361L);//不生效 - permissionPoint.setPath("/0/354/361/");//不生效 - permissionPoint.setSort(9);//不生效 - permissionPoint.setTerminal("NT_CMS_WEB_PROJ-xx");//不生效 - permissionPoint.setFeatureType(3); - permissionPoint.setAppName("tyr"); - permissionPoint.setFeatureUrl("/tyr/test/permission"); - permissionPoint.setNeedAuth(true); - permissionPoint.setNeedAuth(true); - controller.savePermissionPoint(permissionPoint); - } - - - @Test - public void testMove() { - PermissionPointMoveRequest request = new PermissionPointMoveRequest(); - request.setPermissionId(3483L); - request.setParentId(360L); - request.setSort(1); - ApiResult result = controller.move(request); - System.out.println(JSON.toJSONString(result)); - } - - - @Test - public void testDelete() { - Long permissionId = 360L; - controller.deletePermissionPoint(permissionId); - } - - @Test - public void testQueryList() { - PermissionPointListQueryRequest request = new PermissionPointListQueryRequest(); - request.setFeatureType(FeatureType.BUTTON.getCode()); - request.setIds(Arrays.asList(255L, 266L)); - ApiResult> result = controller.queryList(request); - System.out.println(JSON.toJSONString(result)); - } - - @Test - public void test() { - List saasFeatures = permissionPointService.listNodeWithChildrenByCode("CMS_WEB_PROJ_0546", "NT_CMS_WEB_PROJ"); - System.out.println(JSON.toJSONString(saasFeatures)); - } - -} diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/RoleUserTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/RoleUserTest.java deleted file mode 100644 index 7d47a7bf..00000000 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/RoleUserTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.axzo.tyr.server.permission; - -import cn.axzo.framework.domain.web.result.ApiPageResult; -import cn.axzo.framework.domain.web.result.ApiResult; -import cn.axzo.tyr.client.feign.TyrSaasRoleApi; -import cn.axzo.tyr.client.model.BaseWorkspaceModel; -import cn.axzo.tyr.client.model.enums.FeatureType; -import cn.axzo.tyr.client.model.enums.IdentityType; -import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; -import cn.axzo.tyr.client.model.res.RoleWithUserRes; -import cn.axzo.tyr.server.controller.role.SaasRoleController; -import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; -import cn.axzo.tyr.server.repository.dao.SaasRoleDao; -import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao; -import cn.axzo.tyr.server.repository.entity.SaasRole; -import cn.axzo.tyr.server.service.RoleService; -import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.Arrays; -import java.util.List; - -/** - * 权限点测试 - * - * @version V1.0 - * @author: ZhanSiHu - * @date: 2023/9/6 14:59 - */ -@SpringBootTest -public class RoleUserTest { - @Autowired - private SaasRoleUserRelationDao saasRoleUserRelationDao; - @Autowired - private SaasFeatureDao saasFeatureDao; - - @Autowired - private SaasRoleController controller; - - @Autowired - private SaasRoleDao saasRoleDao; - - @Autowired - private RoleService roleService; - - @Test - public void testList() { - saasRoleUserRelationDao.deleteByUser(BaseWorkspaceModel.builder() - .workspaceId( - 999L - ) - .ouId(123L) - .identityId(32L) - .identityType(IdentityType.PRACTITIONER) - .build(), Arrays.asList(4L)); - } - - @Test - public void testQuery() { - RoleWithUserQueryReq request = new RoleWithUserQueryReq(); - request.setOuId(5195L); - request.setWorkspaceId(232L); - request.setPage(1L); - request.setPageSize(5L); - ApiPageResult result = controller.queryRoleWithUser(request); - System.out.println(JSON.toJSONString(result)); - } - - @Test - public void testListAdmin() { - roleService.listAdmins(111L, 22L); - } - - -} diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/SimpleTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/SimpleTest.java deleted file mode 100644 index 5b27c8d6..00000000 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/permission/SimpleTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package cn.axzo.tyr.server.permission; - -import cn.axzo.tyr.client.model.permission.PermissionPointVO; -import cn.hutool.core.date.StopWatch; -import org.junit.Test; - -import java.util.concurrent.TimeUnit; - -/** - * @version V1.0 - * @author: ZhanSiHu - * @date: 2023/9/13 18:43 - */ -public class SimpleTest { - - @Test - public void testSplitBit() { - - PermissionPointVO vo = new PermissionPointVO(); - vo.applyFitOuTypeBit(65535L); - System.out.println(vo.getFitOuTypeList()); - vo.applyFitOuTypeBit(65535L); - System.out.println(vo.getFitOuTypeList()); - } -} diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java new file mode 100644 index 00000000..e15fc87c --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java @@ -0,0 +1,214 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.thrones.client.saas.ServicePkgClient; +import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct; +import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes; +import cn.axzo.tyr.base.BaseTest; +import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.server.service.WorkspaceProductService; +import cn.azxo.framework.common.model.CommonResponse; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +class WorkspaceProductServiceImplTest extends BaseTest { + + @Autowired + private MysqlDataLoader mysqlDataLoader; + @Autowired + private WorkspaceProductService workspaceProductService; + @Autowired + private ServicePkgClient servicePkgClient; + + @BeforeEach + @Override + public void setup() { + super.setup(); + mysqlDataLoader.loadFromClassName(getClass().getSimpleName()); + ServicePkgDetailRes servicePkgDetail = new ServicePkgDetailRes(); + servicePkgDetail.setSpaceId(3L); + ServicePkgProduct servicePkgProduct = new ServicePkgProduct(); + servicePkgProduct.setProductId(2L); + servicePkgDetail.setProducts(Lists.newArrayList(servicePkgProduct)); + Mockito.when(servicePkgClient.getServicePkgDetailBySpaceId(Mockito.eq(Sets.newHashSet(3L)))) + .thenReturn(CommonResponse.success(Lists.newArrayList(servicePkgDetail))); + + ServicePkgDetailRes servicePkgDetail2 = new ServicePkgDetailRes(); + servicePkgDetail2.setSpaceId(4L); + ServicePkgProduct servicePkgProduct2 = new ServicePkgProduct(); + servicePkgProduct2.setProductId(3L); + servicePkgDetail2.setProducts(Lists.newArrayList(servicePkgProduct2)); + Mockito.when(servicePkgClient.getServicePkgDetailBySpaceId(Mockito.eq(Sets.newHashSet(3L, 4L)))) + .thenReturn(CommonResponse.success(Lists.newArrayList(servicePkgDetail2, servicePkgDetail))); + + Mockito.when(servicePkgClient.getServicePkgDetailBySpaceId(Mockito.eq(Sets.newHashSet(11L)))) + .thenReturn(CommonResponse.success(Lists.newArrayList())); + } + + @Test + void listWorkspacePermissionCached() { + + + // workspace 没有product + WorkspaceProductService.ListWorkspacePermissionCacheParam param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(11L) + .build())) + .build(); + List workspaceProductPermissions = workspaceProductService.listWorkspacePermissionCached(param); + + Assertions.assertTrue(CollectionUtils.isEmpty(workspaceProductPermissions)); + // workspace 没有product + + // workspace 有product,featureCode + param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(3L) + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn", "h5:cmp_allotted_time_page")) + .build(), + WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(4L) + .featureCodes(Sets.newHashSet("h5:cmp_allotted_time_page")) + .build())) + .build(); + + Map> workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getCooperateType(), "1"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureId(), 101745L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_labor_audit_btn"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getAppType(), "H5"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getItemCode(), "h5:user_manage_D9B0186"); + + Assertions.assertEquals(workspacePermissions.get(4L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(4L).get(0).getProductId(), 3L); + Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().size(), 1); + Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getCooperateType(), "9"); + Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getFeatureId(), 101936L); + Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_allotted_time_page"); + Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getAppType(), "H5"); + Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getItemCode(), "h5:allotted-time_26081705"); + // workspace 有product,featureCode + + // workspace 有product,terminal + param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(3L) + .terminal("NT_CMP_APP_GENERAL") + .build())) + .build(); + workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7); + + param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(3L) + .terminal("NT_CMP_APP_GENERAL_sdf") + .build())) + .build(); + workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,terminal + + // workspace 有product,appType + param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(3L) + .appType("H5") + .build())) + .build(); + workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7); + + param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(3L) + .appType("APP") + .build())) + .build(); + workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,appType + + // workspace 有product,itemCode + param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(3L) + .itemCode("h5:user_manage_D9B0186") + .build())) + .build(); + + workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7); + + param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(3L) + .itemCode("h5:user_manage_D9B0186_sdf") + .build())) + .build(); + workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,itemCode + + // workspace 有product,featureCode、terminal、appType、itemCode + param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(3L) + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn")) + .terminal("NT_CMP_APP_GENERAL") + .appType("H5") + .itemCode("h5:user_manage_D9B0186") + .build())) + .build(); + + workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 1); + + param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() + .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() + .workspaceId(3L) + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn")) + .terminal("NT_CMP_APP_GENERAL") + .appType("APP") + .itemCode("h5:user_manage_D9B0186_sdf") + .build())) + .build(); + + workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,featureCode、terminal、appType、itemCode + } +} \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/WorkspaceProductServiceImplTest.sql b/tyr-server/src/test/resources/mysql/WorkspaceProductServiceImplTest.sql new file mode 100644 index 00000000..273b7463 --- /dev/null +++ b/tyr-server/src/test/resources/mysql/WorkspaceProductServiceImplTest.sql @@ -0,0 +1,130 @@ +#-->DEFAULT + + +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (100835, 'cms:project_9103', '项目', 1, 'NT_CMS_WEB_GENERAL', 0, 100000, '100000,100835,', 0, '', 0, 'cms:project_9103', 1, 1, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/d4137963b9f54c7787afa7ef52d95540.svg', 1, '/', 0, '', 0, 0, '{"moreIcon": "https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cc474a2dc1884b6081f33d470a2e03e6.svg", "activeIcon": "https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/3e69eb003de64682a2e88c4d9da5ed1d.svg"}', 0, 0, '2024-06-01 14:50:52', '2024-10-29 11:29:10', 59926, 9000404098, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101048, 'cms:pro_contract_management_7701', '合约管理', 2, 'NT_CMS_WEB_GENERAL', 0, 100883, '100000,100835,100883,101048,', 2, '2', 0, 'cms:pro_contract_management_7701', 0, 1, '', 1, '/netConstruction/construction/contract-manage', 0, '', 0, 0, null, 1, 0, '2024-06-18 16:35:35', '2024-10-21 11:24:41', 59926, 9000404204, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101053, 'cms:pro_contract_price_authority_7706', '查看合约价格信息', 4, 'NT_CMS_WEB_GENERAL', 5, 101054, '100000,100835,100883,101048,101054,101053,', 0, '', 0, 'cms:pro_contract_price_authority_7706', 4, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-07-12 14:02:46', '2024-10-21 11:24:43', 59926, 9000404204, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101054, 'cms:pro_contract_detail_7707', '合约详情', 4, 'NT_CMS_WEB_GENERAL', 1, 101048, '100000,100835,100883,101048,101054,', 0, '', 0, 'cms:pro_contract_detail_7707', 3, 1, '', 1, '/', 0, '', 0, 0, null, 1, 1, '2024-07-04 16:27:16', '2024-10-21 11:24:42', 185732, 9000404204, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101744, 'cmp:pro_team_list_0443', '查看班组列表', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101744,', 0, '', 0, 'cmp:pro_team_list_0443', 2, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:39:22', '2024-08-28 10:53:36', 86256, 25923, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101745, 'cmp:pro_worker_invite_recorder_0445', '查看工人入场申请', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101745,', 0, '', 0, 'cmp:pro_worker_invite_recorder_0445', 3, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:40:29', '2024-08-28 10:53:36', 86256, 25923, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101746, 'cmp:pro_team_leader_invite_recorder_0446', '班组长入场申请记录', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101746,', 0, '', 0, 'cmp:pro_team_leader_invite_recorder_0446', 4, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:40:50', '2024-08-28 10:53:36', 86256, 25923, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101749, 'cmp:pro_team_index_0449', '查看班组详情', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101749,', 0, '', 0, 'cmp:pro_team_index_0449', 7, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:41:28', '2024-08-28 10:53:37', 86256, 25923, 0); + + +INSERT INTO product_module (id, icon, product_type, product_name, dict_workspace_type_id, dict_workspace_type_code, status, common_product, remark, auth_type, ou_type, is_delete, create_by, create_at, update_at, update_by, category, version, max_person_count, max_workspace_count, price, skus, material) +VALUES (2, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/test/1695286111017-Snipaste_09-13 16-24.png', 2, '项目基础', 2, '2', 1, 1, '', 1, null, 0, 0, '2022-08-17 19:46:11', '2024-12-12 15:37:27', 89601, 'GENERAL_SERVICE', 0, 0, 0, 0, NULL, NULL); +INSERT INTO product_module (id, icon, product_type, product_name, dict_workspace_type_id, dict_workspace_type_code, status, common_product, remark, auth_type, ou_type, is_delete, create_by, create_at, update_at, update_by, category, version, max_person_count, max_workspace_count, price, skus, material) +VALUES (3, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/test/1695279180099-人脸照.jpg', 2, '实名考勤', 2, '2', 1, 1, '', 1, null, 0, 0, '2022-08-17 19:46:11', '2024-10-28 11:14:06', 9000404668, 'GENERAL_SERVICE', 0, 0, 0, 0, null, null); + + +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257742, 2, 7, '1', 101744, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257743, 2, 7, '1', 101745, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257744, 2, 7, '1', 101746, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257745, 2, 7, '1', 4443, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257746, 2, 7, '1', 4416, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257747, 2, 7, '1', 4417, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257748, 2, 7, '1', 4418, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257749, 2, 7, '1', 4419, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257750, 2, 7, '1', 4420, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1257751, 2, 7, '1', 912, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, ''); + + +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (14744, 'cms:pro_construction_contract_management', 'cms:pro_contract_management_7701', 1, 'NT_CMS_WEB_GENERAL', '2024-07-10 20:39:15', '2024-07-10 20:39:15', null, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (18070, 'cms:pro_construction_contract_management', 'cms:pro_contract_management_7701', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (18079, 'cms:pro_construction_contract_detail', 'cms:pro_contract_detail_7707', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (18080, 'cms:pro_construction_contract_detail_inventory_submit_audit', 'cms:pro_contract_detail_7707', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24219, 'h5:cmp_user_manage_worker_jump_to_team_btn', 'cmp:pro_team_list_0443', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24220, 'h5:cmp_user_manage_worker_page', 'cmp:pro_team_list_0443', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24221, 'h5:cmp_user_manage_worker_labor_audit_btn', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24222, 'h5:cmp_user_manage_worker_page', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24223, 'h5:cmp_user_manage_labor_audit_page', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24224, 'h5:cmp_user_manage_labor_audit_detail_btn', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (24225, 'h5:cmp_user_manage_worker_on_site_audit_btn', 'cmp:pro_team_leader_invite_recorder_0446', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0); + + + +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (718447, 'cms:pro_construction_contract_management', 'cms:pro_construction_contract_management', '合约管理', 'PAGE', '/netConstruction/construction/contract-manage', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:23', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (718451, 'cms:pro_construction_contract_detail', 'cms:pro_construction_contract_detail', '合约详情', 'PAGE', '/netConstruction/construction/contract-manage/contract-detail', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:23', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (718455, 'cms:pro_construction_contract_detail', 'cms:pro_construction_contract_detail_inventory_submit_audit', '合约详情-提交审批', 'COMPONENT', '', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:25', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369205, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_jump_to_team_btn', '人员管理-施工人员-跳转班组', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369197, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_page', '人员管理-施工人员', 'PAGE', '__UNI__D9B0186#/pages/worker/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:40', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369202, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_labor_audit_btn', '人员管理-施工人员-劳务审核', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369218, 'h5:cmp_user_manage_labor_audit_page', 'h5:cmp_user_manage_labor_audit_page', '人员管理-劳务审核', 'PAGE', '__UNI__D9B0186#/pages/labour/verify/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369219, 'h5:cmp_user_manage_labor_audit_page', 'h5:cmp_user_manage_labor_audit_detail_btn', '人员管理-劳务审核-详情', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369203, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_on_site_audit_btn', '人员管理-施工人员-进场审核', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369216, 'h5:cmp_user_manage_on_site_audit_page', 'h5:cmp_user_manage_on_site_audit_page', '人员管理-进场审核', 'PAGE', '__UNI__D9B0186#/pages/labour/enterAudit/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); + + +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1749220, 3, 27, '9', 101437, 0, '2024-10-28 11:14:06', '2024-10-28 11:14:06', 0, 0, 1, 6, 'NT_CMP_APP_GENERAL'); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1749218, 3, 27, '9', 101934, 0, '2024-10-28 11:14:06', '2024-10-28 11:14:06', 0, 0, 1, 4, 'NT_CMP_APP_GENERAL'); +INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal) +VALUES (1749219, 3, 27, '9', 101936, 0, '2024-10-28 11:14:06', '2024-10-28 11:14:06', 0, 0, 1, 4, 'NT_CMP_APP_GENERAL'); + +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101437, 'cmp:application_center_019', '应用', 6, 'NT_CMP_APP_GENERAL', 0, 636, '636,101437,', 0, '', 0, 'cmp:application_center_019', 2, 1, '', 0, '', 0, '', 0, 0, '{"moreIcon": "", "activeIcon": "", "terminalType": "", "terminalBizType": ""}', 1, 0, '2024-05-31 11:26:29', '2024-12-13 09:31:22', 86256, 9000400021, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101934, 'cmp:pro_team_schedule_rule_edit_0912', '编辑', 4, 'NT_CMP_APP_GENERAL', 5, 101932, '636,101437,101444,101508,101932,101934,', 0, '', 0, 'cmp:pro_team_schedule_rule_edit_0912', 1, 1, '', 0, '', 0, '', 0, 0, null, 1, 1, '2024-09-12 15:30:56', '2024-09-12 18:55:42', 9000399280, 9000399280, 0); +INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete) +VALUES (101936, 'cmp:pro_task_time_allocate_task_0912', '工时分配到任务', 4, 'NT_CMP_APP_GENERAL', 5, 101935, '636,101437,101444,101508,101935,101936,', 0, '', 0, 'cmp:pro_task_time_allocate_task_0912', 0, 1, '', 0, '', 0, '', 0, 0, null, 1, 1, '2024-09-12 18:55:43', '2024-09-12 18:55:43', 9000399280, 9000399280, 0); + +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (25830, 'h5:cmp_attence_shift_list_page', 'cmp:pro_team_schedule_rule_edit_0912', 0, 'NT_CMP_APP_GENERAL', '2024-09-12 18:55:42', '2024-09-12 18:55:42', 9000399280, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (25831, 'h5:cmp_attence_shift_switch_btn', 'cmp:pro_team_schedule_rule_edit_0912', 0, 'NT_CMP_APP_GENERAL', '2024-09-12 18:55:42', '2024-09-12 18:55:42', 9000399280, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (25834, 'h5:cmp_allotted_time_page', 'cmp:pro_task_time_allocate_task_0912', 0, 'NT_CMP_APP_GENERAL', '2024-09-12 18:57:04', '2024-09-12 18:57:04', 9000399280, null, 0); +INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete) +VALUES (25835, 'h5:cmp_allotted_time_detail_btn', 'cmp:pro_task_time_allocate_task_0912', 0, 'NT_CMP_APP_GENERAL', '2024-09-12 18:57:04', '2024-09-12 18:57:04', 9000399280, null, 0); + +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369373, 'h5:cmp_attence_shift_list_page', 'h5:cmp_attence_shift_list_page', '排班管理-排班列表', 'PAGE', '__UNI__D5F1867#/', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:53', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:attence_shift_D5F1867', '', '__UNI__D5F1867', '考勤班次H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369374, 'h5:cmp_attence_shift_list_page', 'h5:cmp_attence_shift_switch_btn', '排班管理-启用/禁用班次', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:53', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:attence_shift_D5F1867', '', '__UNI__D5F1867', '考勤班次H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369351, 'h5:cmp_allotted_time_page', 'h5:cmp_allotted_time_page', '工时管理-分配工时', 'PAGE', '__UNI__26081705#/allotedTime', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:51', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:allotted-time_26081705', '', '__UNI__26081705', '工时管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); +INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by) +VALUES (369352, 'h5:cmp_allotted_time_page', 'h5:cmp_allotted_time_detail_btn', '工时管理-分配工时-工时详情', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:51', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:allotted-time_26081705', '', '__UNI__26081705', '工时管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null); + + +#-->WorkspaceProductServiceImplTest.sql \ No newline at end of file From 346837150bc3c3068decfb484b472865cfe33560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Fri, 20 Dec 2024 14:13:13 +0800 Subject: [PATCH 19/25] =?UTF-8?q?feat:(REQ-3282)=20=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E4=BB=A3=E7=A0=81=E4=BD=BF=E7=94=A8=E4=BB=A5?= =?UTF-8?q?=E5=89=8D=E7=9A=84=E9=A1=B9=E7=9B=AE=E6=9D=83=E9=99=90=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/WorkspaceProductService.java | 38 ++++++ .../service/impl/TyrSaasAuthServiceImpl.java | 34 ++--- .../impl/WorkspaceProductServiceImpl.java | 45 +++++++ .../impl/WorkspaceProductServiceImplTest.java | 120 ++++++++++++++++++ 4 files changed, 215 insertions(+), 22 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java index 7257a304..d0374a43 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java @@ -20,6 +20,15 @@ public interface WorkspaceProductService { */ void storeWorkspaceProduct(StoreWorkspaceProductParam param); + /** + * 从缓存中查询项目的产品及产品的权限 + * 没有切到:listWorkspacePermissionCached,后续有测试机会的时候切到listWorkspacePermissionCached + * @param param + * @return + */ + @Deprecated + List listWorkspaceProductPermissionCached(ListWorkspaceProductPermissionCacheParam param); + /** * 从缓存中查询项目的权限 * @param param @@ -49,6 +58,35 @@ public interface WorkspaceProductService { private Set uniCodes; } + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + class ListWorkspaceProductPermissionCacheParam { + /** + * 项目id + */ + private Set workspaceIds; + + private Set featureCodes; + + /** + * 端信息 + */ + private String terminal; + + /** + * app类型(APP:原生,H5:h5页面) + */ + private String appType; + + /** + * 项目code(H5会拉取项目下所有的元素) + * APP上每个应用的code,数据库叫itemCode,保持一致 + */ + private String itemCode; + } + @Data @Builder @NoArgsConstructor diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index eabb884b..02f7bb3c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -469,14 +469,11 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { // 查询的featureCodes有可能已经被删除,但是saas_feature_code效率比较低,两个表的id不会重复,所以解析成id去过滤权限 Set featureIds = checkFeatureCodes(param); - WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspacePermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam - .builder() - .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() - .workspaceId(param.getWorkspaceId()) - .featureCodes(param.getFeatureCodes()) - .build())) + WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermissionCacheParam = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(param.getWorkspaceId())) + .featureCodes(param.getFeatureCodes()) .build(); - List productPermissions = workspaceProductService.listWorkspacePermissionCached(listWorkspacePermissionCacheParam) + List productPermissions = workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermissionCacheParam) .stream() .map(WorkspaceProductService.WorkspaceProductPermission::getProductPermissions) .filter(e -> !CollectionUtils.isEmpty(e)) @@ -997,14 +994,11 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { // find product by workspace Set workspaceId = filterRoleAuths.stream().map(FilterRoleAuth::getWorkspaceId).collect(Collectors.toSet()); - WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspacePermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() - .workspacePermissions(workspaceId.stream() - .map(e -> WorkspaceProductService.WorkspacePermission.builder() - .workspaceId(e) - .build()) - .collect(Collectors.toList())) + WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermission = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(workspaceId) .build(); - Map> workspaceProductPermissions = workspaceProductService.listWorkspacePermissionCached(listWorkspacePermissionCacheParam) + + Map> workspaceProductPermissions = workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermission) .stream() .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); @@ -1506,15 +1500,11 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { .map(IdentityAuthReq.WorkspaceOuPair::getWorkspaceId) .collect(Collectors.toSet()); // 查询项目的产品权限 - WorkspaceProductService.ListWorkspacePermissionCacheParam listProductPermisssion = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() - .workspacePermissions(workspaceIds.stream() - .map(workspaceId -> WorkspaceProductService.WorkspacePermission.builder() - .workspaceId(workspaceId) - .featureCodes(identityAuthReq.getFeatureCode()) - .build()) - .collect(Collectors.toList())) + WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listProductPermisssion = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(workspaceIds) + .featureCodes(identityAuthReq.getFeatureCode()) .build(); - return workspaceProductService.listWorkspacePermissionCached(listProductPermisssion).stream() + return workspaceProductService.listWorkspaceProductPermissionCached(listProductPermisssion).stream() .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java index 309ef109..ac00015c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java @@ -159,6 +159,51 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService { return String.format(WORKSPACE_PRODUCT_KEY); } + @Override + public List listWorkspaceProductPermissionCached(ListWorkspaceProductPermissionCacheParam param) { + Map> workspaceProducts = listWorkspaceProduct(param.getWorkspaceIds()); + + Set productIds = workspaceProducts.values().stream() + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + + if (CollectionUtils.isEmpty(productIds)) { + return Collections.emptyList(); + } + + ProductPermissionCacheService.ListProductPermissionParam listProductPermissionParam = ProductPermissionCacheService.ListProductPermissionParam.builder() + .productIds(productIds) + .featureCodes(param.getFeatureCodes()) + .appType(param.getAppType()) + .itemCode(param.getItemCode()) + .terminal(param.getTerminal()) + .build(); + Map> productPermissionMap = productPermissionCacheService.list(listProductPermissionParam); + + return workspaceProducts.entrySet().stream() + .filter(e -> CollectionUtils.isNotEmpty(e.getValue())) + .map(e -> { + List productPermissions = e.getValue().stream() + .map(productId -> { + List permissions = productPermissionMap.get(productId); + if (CollectionUtils.isEmpty(permissions)) { + return null; + } + return ProductPermission.builder() + .productId(productId) + .permissions(permissions) + .build(); + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + return WorkspaceProductPermission.builder() + .workspaceId(e.getKey()) + .productPermissions(productPermissions) + .build(); + }) + .collect(Collectors.toList()); + } + @Override public List listWorkspacePermissionCached(ListWorkspacePermissionCacheParam param) { if (CollectionUtils.isEmpty(param.getWorkspacePermissions())) { diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java index e15fc87c..7dd1991f 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java @@ -20,6 +20,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static org.junit.jupiter.api.Assertions.*; + class WorkspaceProductServiceImplTest extends BaseTest { @Autowired @@ -54,6 +56,124 @@ class WorkspaceProductServiceImplTest extends BaseTest { .thenReturn(CommonResponse.success(Lists.newArrayList())); } + @Test + void listWorkspaceProductPermissionCached() { + + // workspace 没有product + WorkspaceProductService.ListWorkspaceProductPermissionCacheParam param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(11L)) + .build(); + List workspaceProductPermissions = workspaceProductService.listWorkspaceProductPermissionCached(param); + + Assertions.assertTrue(CollectionUtils.isEmpty(workspaceProductPermissions)); + // workspace 没有product + + // workspace 有product,featureCode + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L, 4L)) + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn", "h5:cmp_allotted_time_page")) + .build(); + Map> workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getCooperateType(), "1"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureId(), 101745L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_labor_audit_btn"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getAppType(), "H5"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getItemCode(), "h5:user_manage_D9B0186"); + // workspace 有product,featureCode + + // workspace 有product,terminal + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .terminal("NT_CMP_APP_GENERAL") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7); + + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .terminal("NT_CMP_APP_GENERAL_sdf") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,terminal + + // workspace 有product,appType + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .appType("H5") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7); + + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .appType("APP") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,appType + + // workspace 有product,itemCode + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .itemCode("h5:user_manage_D9B0186") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7); + + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .itemCode("h5:user_manage_D9B0186_sdf") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,itemCode + + // workspace 有product,featureCode、terminal、appType、itemCode + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn")) + .terminal("NT_CMP_APP_GENERAL") + .appType("H5") + .itemCode("h5:user_manage_D9B0186") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 1); + + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn")) + .terminal("NT_CMP_APP_GENERAL") + .appType("APP") + .itemCode("h5:user_manage_D9B0186_sdf") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,featureCode、terminal、appType、itemCode + } + @Test void listWorkspacePermissionCached() { From 3c12051105fbd8bdf2eec7443e7c1a3e60486c64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Fri, 20 Dec 2024 15:32:02 +0800 Subject: [PATCH 20/25] =?UTF-8?q?feat:(REQ-3282)=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E6=9D=83=E9=99=90=E6=9F=A5=E8=AF=A2=E6=9C=89?= =?UTF-8?q?=E6=9D=83=E9=99=90=E7=9A=84=E7=94=A8=E6=88=B7=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2/UserPermissionController.java | 2 +- .../service/impl/PermissionServiceImpl.java | 56 ++++++++++++++++++- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java index aa901f15..489f10f6 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/UserPermissionController.java @@ -72,7 +72,7 @@ public class UserPermissionController implements UserPermissionApi { @Override public ApiResult> listPermissionUser(ListPermissionUserReq req) { - return null; + return ApiResult.success(permissionService.listPermissionUser(req)); } private void check(ListUserPermissionReq req) { diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java index 36c82444..17455748 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java @@ -1,5 +1,7 @@ package cn.axzo.tyr.server.service.impl; +import cn.axzo.tyr.client.model.req.ListIdentityFromPermissionReq; +import cn.axzo.tyr.client.model.res.ListIdentityFromPermissionResp; import cn.axzo.tyr.feign.enums.IdentityTypeEnum; import cn.axzo.tyr.feign.enums.RolePermissionTagEnum; import cn.axzo.tyr.feign.enums.RoleTypeEnum; @@ -11,9 +13,11 @@ import cn.axzo.tyr.server.service.PermissionService; import cn.axzo.tyr.server.service.ProductPermissionCacheService; import cn.axzo.tyr.server.service.RolePermissionCacheService; import cn.axzo.tyr.server.service.SaasFeatureResourceService; +import cn.axzo.tyr.server.service.TyrSaasAuthService; import cn.axzo.tyr.server.service.WorkspaceProductService; import cn.axzo.tyr.server.util.FeatureCodeUtil; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.utils.Lists; @@ -42,6 +46,8 @@ public class PermissionServiceImpl implements PermissionService { private SaasFeatureResourceService saasFeatureResourceService; @Autowired private FeatureCodeUtil featureCodeUtil; + @Autowired + private TyrSaasAuthService tyrSaasAuthService; /** * 1、查询用户的角色 @@ -138,8 +144,8 @@ public class PermissionServiceImpl implements PermissionService { /** * 1、根据权限code及相关条件查询项目的权限 - * 2、查询单位、项目的所有role - * 3、根据所有role查询角色信息 + * 2、根据项目查询所有role + * 3、根据权限code查询有权限的角色信息 * 4、根据项目的权限和role查询角色的权限信息 * 5、解析有权限的admin role * 6、解析有权限的非admin role @@ -152,7 +158,28 @@ public class PermissionServiceImpl implements PermissionService { */ @Override public List listPermissionUser(ListPermissionUserReq param) { - return null; + // 使用原来接口,因为目前没有做用户维度的权限缓存,对源代码优化成本高,效果不显著,没有多大意义, + List list = param.getPermissionUsers().stream() + .map(e -> JSONObject.parseObject(JSONObject.toJSONString(e), ListIdentityFromPermissionReq.class)) + .collect(Collectors.toList()); + List listIdentityFromPermissions = tyrSaasAuthService.batchListIdentityFromPermission(list); + + return listIdentityFromPermissions.stream() + .map(e -> PermissionUserResp.builder() + .workspaceId(e.getWorkspaceId()) + .ouId(e.getOuId()) + .users(Optional.ofNullable(e.getUsers()) + .map(users -> users.stream() + .map(user -> PermissionUserResp.User.builder() + .identityId(user.getIdentityId()) + .identityType(user.getIdentityType()) + .personId(user.getPersonalId()) + .isSuperAdmin(user.isSuperAdmin()) + .build()) + .collect(Collectors.toSet())) + .orElseGet(Sets::newHashSet)) + .build()) + .collect(Collectors.toList()); } /** @@ -345,6 +372,29 @@ public class PermissionServiceImpl implements PermissionService { .orElseGet(Lists::newArrayList))); } +// private Map> listWorkspacePermission(ListPermissionUserReq param) { +// +// WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspacePermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() +// .workspacePermissions(param.getPermissionUsers().stream() +// .map(e -> WorkspaceProductService.WorkspacePermission.builder() +// .workspaceId(e.getWorkspaceId()) +// .featureCodes(Sets.newHashSet(e.getFeatureCode())) +// .terminal(e.getTerminal()) +// .build()) +// .collect(Collectors.toList())) +// .build(); +// return workspaceProductService.listWorkspacePermissionCached(listWorkspacePermissionCacheParam) +// .stream() +// .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, +// e -> Optional.ofNullable(e.getProductPermissions()) +// .map(productPermissions -> productPermissions.stream() +// .map(WorkspaceProductService.ProductPermission::getPermissions) +// .filter(Objects::nonNull) +// .flatMap(Collection::stream) +// .collect(Collectors.toList())) +// .orElseGet(Lists::newArrayList))); +// } + private List listAllSaasFeature(Map> workspacePermissions) { Set terminals = workspacePermissions.values().stream() From 1f73699ac9cf9bdce67f4ebcdf73351dc5e4f16a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Tue, 24 Dec 2024 10:37:35 +0800 Subject: [PATCH 21/25] =?UTF-8?q?feat:(REQ-3282)=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/service/impl/SaasRoleUserRelationServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index ce1cbceb..25911e92 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -265,10 +265,10 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl Date: Mon, 13 Jan 2025 14:42:56 +0800 Subject: [PATCH 22/25] =?UTF-8?q?feat:(REQ-3282)=20=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E7=9A=84productApi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/tyr/feign/api/ProductApi.java | 17 ++ .../cn/axzo/tyr/feign/req/PageProductReq.java | 50 +++++ .../cn/axzo/tyr/feign/resp/ProductResp.java | 174 ++++++++++++++++++ .../controller/v2/ProductV2Controller.java | 24 +++ .../tyr/server/service/ProductService.java | 8 +- .../service/impl/ProductServiceImpl.java | 24 ++- .../service/impl/ProductServiceImplTest.java | 51 +++++ .../mysql/ProductServiceImplTest.sql | 10 + 8 files changed, 356 insertions(+), 2 deletions(-) create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/api/ProductApi.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageProductReq.java create mode 100644 tyr-client/src/main/java/cn/axzo/tyr/feign/resp/ProductResp.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/ProductV2Controller.java create mode 100644 tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/ProductServiceImplTest.java create mode 100644 tyr-server/src/test/resources/mysql/ProductServiceImplTest.sql diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/api/ProductApi.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/ProductApi.java new file mode 100644 index 00000000..a8ed8690 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/api/ProductApi.java @@ -0,0 +1,17 @@ +package cn.axzo.tyr.feign.api; + +import cn.axzo.foundation.page.PageResp; +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.feign.req.PageProductReq; +import cn.axzo.tyr.feign.resp.ProductResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface ProductApi { + + @PostMapping("/api/product/page") + ApiResult> page(@RequestBody @Validated PageProductReq req); +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageProductReq.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageProductReq.java new file mode 100644 index 00000000..e0fc02d7 --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/req/PageProductReq.java @@ -0,0 +1,50 @@ +package cn.axzo.tyr.feign.req; + +import cn.axzo.foundation.dao.support.wrapper.CriteriaField; +import cn.axzo.foundation.dao.support.wrapper.Operator; +import cn.axzo.foundation.page.IPageReq; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.Max; +import java.util.List; +import java.util.Set; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PageProductReq implements IPageReq { + + @CriteriaField(ignore = true) + private Integer page; + + /** + * 最大值1000 + */ + @CriteriaField(ignore = true) + @Max(value = 1000, message = "pageSize最大值为1000") + private Integer pageSize; + + /** + * 排序:使用示例,createTime__DESC + */ + @CriteriaField(ignore = true) + private List sort; + + /** + * 工作台类型 + */ + @CriteriaField(field = "dictWorkspaceTypeId", operator = Operator.IN) + private Set dictWorkspaceTypeIdS; + + /** + * 产品默认授权方式 + * 1:创建工作台 + * 2:资质认证 + */ + @CriteriaField(field = "authType", operator = Operator.IN) + private Set authTypes; +} diff --git a/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/ProductResp.java b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/ProductResp.java new file mode 100644 index 00000000..8cd0aa9d --- /dev/null +++ b/tyr-client/src/main/java/cn/axzo/tyr/feign/resp/ProductResp.java @@ -0,0 +1,174 @@ +package cn.axzo.tyr.feign.resp; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ProductResp { + + private Long id; + + private Date createAt; + + private Date updateAt; + + private Long isDelete; + + /** + * 产品 icon + */ + private String icon; + + /** + * 产品板块名字 + */ + private String productName; + + /** + * 产品板块名字 + */ + private Integer productType; + + /** + * 基础产品与否 0:基础产品 1:普通产品 + */ + private Integer commonProduct; + + /** + * 产品所属工作台字典 ID + */ + private Long dictWorkspaceTypeId; + + /** + * 产品所属工作台字典 Code + */ + private String dictWorkspaceTypeCode; + + /** + * 产品状态 + */ + private Integer status; + + /** + * 产品板块备注 + */ + private String remark; + + /** + * 产品默认授权方式 + * 1:创建工作台 + * 2:资质认证 + */ + private Integer authType; + + /** + * 资质序列/单位类型(数组多选逗号隔开1,2,3,4,5) + * cn.axzo.basics.common.constant.enums.OrganizationalUnitTypeEnum + */ + private String ouType; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 修改人 + */ + private Long updateBy; + + /** + * 产品类型 + * PRODUCT_VERSION:产品版本类型、ADD_VALUE_SERVICE:增值服务类型、 + * GENERAL_SERVICE:通用产品类型、HARD_WARE:硬件产品类型 + */ + private String category; + + /** + * 版本升级序列(数字越小,版本越低,不能降级,只能升级) <企业、项目产品> + */ + private Integer version; + + /** + * 人数上限 <企业、项目产品> + */ + private Integer maxPersonCount; + + /** + * 最大项目数 <企业产品> + */ + private Integer maxWorkspaceCount; + + /** + * 价格(单位:分) + */ + private Long price; + + /** + * 产品详情 jsonList(skuNameSKU名称、model规格型号、count数量、unit单位) + */ + private List skus; + + /** + * 素材<仅硬件产品支持>json类型 + * ({"miages":List,"videos":List,"detailImages":List}) + */ + private Material material; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class Sku { + + /** + * SKU名称 + */ + private String skuName; + + /** + * 规格型号 + */ + private String model; + + /** + * 数量 + */ + private Integer count; + + /** + * 单位 + */ + private String unit; + } + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class Material { + + /** + * 图片 + */ + private List images; + + /** + * 视频 + */ + private List videos; + + /** + * 详情大图 + */ + private List detailImages; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/ProductV2Controller.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/ProductV2Controller.java new file mode 100644 index 00000000..112759e0 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/ProductV2Controller.java @@ -0,0 +1,24 @@ +package cn.axzo.tyr.server.controller.v2; + +import cn.axzo.foundation.page.PageResp; +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.tyr.feign.api.ProductApi; +import cn.axzo.tyr.feign.req.PageProductReq; +import cn.axzo.tyr.feign.resp.ProductResp; +import cn.axzo.tyr.server.service.ProductService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +public class ProductV2Controller implements ProductApi { + + @Autowired + private ProductService productService; + + @Override + public ApiResult> page(PageProductReq req) { + return ApiResult.success(productService.pageV2(req)); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductService.java index e06a82ca..821663e4 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductService.java @@ -1,6 +1,7 @@ package cn.axzo.tyr.server.service; import cn.axzo.basics.common.page.PageResult; +import cn.axzo.foundation.page.PageResp; import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.model.product.ProductAddReq; @@ -15,7 +16,10 @@ import cn.axzo.tyr.client.model.req.UpdateProductStatusReq; import cn.axzo.tyr.client.model.res.GovernmentTerminalResp; import cn.axzo.tyr.client.model.res.SaasProductResp; import cn.axzo.tyr.client.model.res.WorkspaceProductResp; +import cn.axzo.tyr.feign.req.PageProductReq; +import cn.axzo.tyr.feign.resp.ProductResp; import cn.axzo.tyr.server.repository.entity.ProductModule; +import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -25,7 +29,7 @@ import java.util.List; * @author wangli * @since 2023/9/7 14:21 */ -public interface ProductService { +public interface ProductService extends IService { ApiResult> list(ProductSearchListReq req); @@ -61,4 +65,6 @@ public interface ProductService { * @param req */ Long productModuleCreate(SaasProductSaveOrUpdateReq req); + + PageResp pageV2(PageProductReq req); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductServiceImpl.java index 2da39b7b..5cdf0a11 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductServiceImpl.java @@ -5,9 +5,12 @@ import cn.axzo.basics.common.page.PageResult; import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.basics.profiles.api.UserProfileServiceApi; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; +import cn.axzo.foundation.dao.support.converter.PageConverter; +import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper; import cn.axzo.framework.domain.page.PageResp; import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.framework.jackson.utility.JSON; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.pudge.core.service.ServiceException; import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum; @@ -32,6 +35,8 @@ import cn.axzo.tyr.client.model.req.UpdateProductStatusReq; import cn.axzo.tyr.client.model.res.GovernmentTerminalResp; import cn.axzo.tyr.client.model.res.SaasProductResp; import cn.axzo.tyr.client.model.res.WorkspaceProductResp; +import cn.axzo.tyr.feign.req.PageProductReq; +import cn.axzo.tyr.feign.resp.ProductResp; import cn.axzo.tyr.server.model.RelationOperateLogProductBindResourceDO; import cn.axzo.tyr.server.repository.dao.ProductModuleDao; import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao; @@ -39,6 +44,7 @@ import cn.axzo.tyr.server.repository.entity.ProductModule; import cn.axzo.tyr.server.repository.entity.SaasFeatureResource; import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateLog; import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation; +import cn.axzo.tyr.server.repository.mapper.ProductModuleMapper; import cn.axzo.tyr.server.service.ProductFeatureRelationService; import cn.axzo.tyr.server.service.ProductService; import cn.axzo.tyr.server.service.SaasBasicDictService; @@ -50,8 +56,10 @@ import cn.azxo.framework.common.constatns.Constants; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; @@ -82,7 +90,7 @@ import java.util.stream.Collectors; @Slf4j @RequiredArgsConstructor @Service -public class ProductServiceImpl implements ProductService { +public class ProductServiceImpl extends ServiceImpl implements ProductService { /** 政务端前缀 **/ private static final String PREFIX_TERMINAL_GA = "NT_PC_GA_"; @@ -643,4 +651,18 @@ public class ProductServiceImpl implements ProductService { productModuleDao.save(product); return product; } + + @Override + public cn.axzo.foundation.page.PageResp pageV2(PageProductReq req) { + QueryWrapper wrapper = QueryWrapperHelper.fromBean(req, ProductModule.class); + wrapper.eq("is_delete", 0); + + IPage page = this.page(PageConverter.toMybatis(req, ProductModule.class), wrapper); + + return PageConverter.toResp(page, this::from); + } + + private ProductResp from(ProductModule productModule) { + return JSON.parseObject(JSON.toJSONString(productModule), ProductResp.class); + } } diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/ProductServiceImplTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/ProductServiceImplTest.java new file mode 100644 index 00000000..b6a9a418 --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/ProductServiceImplTest.java @@ -0,0 +1,51 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.foundation.page.PageResp; +import cn.axzo.tyr.base.BaseTest; +import cn.axzo.tyr.base.MysqlDataLoader; +import cn.axzo.tyr.feign.req.PageProductReq; +import cn.axzo.tyr.feign.resp.ProductResp; +import cn.axzo.tyr.server.service.ProductService; +import cn.hutool.db.Page; +import org.apache.commons.compress.utils.Sets; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.junit.jupiter.api.Assertions.*; + +class ProductServiceImplTest extends BaseTest { + + @Autowired + private MysqlDataLoader mysqlDataLoader; + @Autowired + private ProductService productService; + + @BeforeEach + @Override + public void setup() { + super.setup(); + mysqlDataLoader.loadFromClassName(getClass().getSimpleName()); + } + + @Test + void pageV2() { + PageResp resp = productService.pageV2(PageProductReq.builder() + .build()); + + Assertions.assertEquals(resp.getData().size(), 2); + + resp = productService.pageV2(PageProductReq.builder() + .dictWorkspaceTypeIdS(Sets.newHashSet(1L)) + .build()); + Assertions.assertEquals(resp.getData().size(), 1); + + resp = productService.pageV2(PageProductReq.builder() + .authTypes(Sets.newHashSet(1)) + .build()); + Assertions.assertEquals(resp.getData().size(), 2); + + } +} \ No newline at end of file diff --git a/tyr-server/src/test/resources/mysql/ProductServiceImplTest.sql b/tyr-server/src/test/resources/mysql/ProductServiceImplTest.sql new file mode 100644 index 00000000..138acd6e --- /dev/null +++ b/tyr-server/src/test/resources/mysql/ProductServiceImplTest.sql @@ -0,0 +1,10 @@ +#-->DEFAULT + + +INSERT INTO product_module (id, icon, product_type, product_name, dict_workspace_type_id, dict_workspace_type_code, status, common_product, remark, auth_type, ou_type, is_delete, create_by, create_at, update_at, update_by, category, version, max_person_count, max_workspace_count, price, skus, material) +VALUES (1, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/test/1695189976949-Snipaste_09-15 16-36.png', 1, '企业基础-自动授权', 1, '1', 1, 1, '', 1, null, 0, 0, '2022-08-17 19:46:11', '2025-01-13 14:19:46', 9000399458, 'GENERAL_SERVICE', 0, 0, 0, 0, null, null); + +INSERT INTO product_module (id, icon, product_type, product_name, dict_workspace_type_id, dict_workspace_type_code, status, common_product, remark, auth_type, ou_type, is_delete, create_by, create_at, update_at, update_by, category, version, max_person_count, max_workspace_count, price, skus, material) +VALUES (2, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/test/1695286111017-Snipaste_09-13 16-24.png', 2, '项目基础', 2, '2', 1, 1, '', 1, null, 0, 0, '2022-08-17 19:46:11', '2024-12-25 13:39:12', 9000400021, 'GENERAL_SERVICE', 0, 0, 0, 0, null, null); + +#-->ProductServiceImplTest.sql \ No newline at end of file From 421bf34dac3c413217258f44041e6af06de77a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Wed, 15 Jan 2025 14:54:57 +0800 Subject: [PATCH 23/25] =?UTF-8?q?feat:(feature/REQ-3282)=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=BC=82=E6=AD=A5=E8=AE=B0=E5=BD=95=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=97=A5=E5=BF=97=EF=BC=8C=E5=B9=B6=E4=B8=8D=E6=8A=9B=E5=87=BA?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/service/OperateLogService.java | 8 +++++ .../service/impl/OperateLogServiceImpl.java | 36 +++++++++++++++++++ .../impl/SaasRoleUserRelationServiceImpl.java | 7 ++-- 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/OperateLogService.java create mode 100644 tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/OperateLogServiceImpl.java diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/OperateLogService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/OperateLogService.java new file mode 100644 index 00000000..b53ed3e2 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/OperateLogService.java @@ -0,0 +1,8 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.log.platform.client.model.req.LogAddReq; + +public interface OperateLogService { + + void save(LogAddReq param); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/OperateLogServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/OperateLogServiceImpl.java new file mode 100644 index 00000000..fd77ced4 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/OperateLogServiceImpl.java @@ -0,0 +1,36 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.framework.jackson.utility.JSON; +import cn.axzo.log.platform.client.feign.LogApi; +import cn.axzo.log.platform.client.model.req.LogAddReq; +import cn.axzo.tyr.server.service.OperateLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import java.util.concurrent.ExecutorService; + +@Slf4j +@Service +public class OperateLogServiceImpl implements OperateLogService { + + @Autowired + private LogApi logApi; + @Qualifier("asyncExecutor") + @Autowired + private ExecutorService asyncExecutor; + + @Override + public void save(LogAddReq param) { + + try { + // 目前操作日志的记录,不是核心流程,这个方法,不抛出异常,以免影响正常业务流程。 + // 异步处理 + asyncExecutor.submit(() -> logApi.addLog(param)); + } catch (Throwable e) { + log.warn("OperateLogServiceImpl save caught exception, msg = {}, param = {}", + e.getMessage(), JSON.toJSONString(param), e); + } + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index 25911e92..50e9da35 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -15,7 +15,6 @@ import cn.axzo.framework.auth.domain.ContextInfo; import cn.axzo.framework.auth.domain.ContextInfoHolder; import cn.axzo.framework.rocketmq.Event; import cn.axzo.karma.client.model.dto.ProjectWorkBaseDTO; -import cn.axzo.log.platform.client.feign.LogApi; import cn.axzo.log.platform.client.model.req.LogAddReq; import cn.axzo.maokai.api.client.OrganizationalUnitApi; import cn.axzo.maokai.api.vo.response.OrganizationalUnitVO; @@ -51,6 +50,7 @@ import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao; import cn.axzo.tyr.server.repository.entity.SaasRole; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import cn.axzo.tyr.server.repository.mapper.SaasRoleUserRelationMapper; +import cn.axzo.tyr.server.service.OperateLogService; import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasRoleGroupService; import cn.axzo.tyr.server.service.SaasRoleUserRelationService; @@ -115,7 +115,7 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl Date: Wed, 5 Feb 2025 15:11:50 +0800 Subject: [PATCH 24/25] =?UTF-8?q?feat:(feature/REQ-3282)=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95=EF=BC=8C?= =?UTF-8?q?=E6=8A=8A=E6=96=B0=E6=97=A7=E7=9A=84values=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=B8=8B=E6=9D=A5=EF=BC=8C=E6=96=B9=E4=BE=BF=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SaasRoleUserRelationServiceImpl.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java index 50e9da35..41988118 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -218,7 +218,8 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl roles = checkRoleCode(param); // 查询用户的历史记录 - Map> roleUserMap = listRoleUserRelation(param).stream() + List oldRoleUsers = listRoleUserRelation(param); + Map> roleUserMap = oldRoleUsers.stream() .collect(Collectors.groupingBy(e -> e.getIdentityId() + "_" + e.getIdentityType() + "_" + e.getSaasRoleUser().getPersonId() + "_" + e.getWorkspaceId() + "_" + e.getOuId())); // 根据入参解析insert、delete的记录 @@ -272,7 +273,8 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl> roleUserMap, - UpsertUserRoleReq param, - Map roles, - List upsert) { + UpsertUserRoleReq param, + Map roles, + List upsert) { List resultByRemoveRoles = param.getUserRoles().stream() .flatMap(e -> { Set allRemoveRoleIds = Optional.ofNullable(e.getRemoveRoleIds()) From 06f4e07cd409baa6173d7abf3ee80d60f8a93421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=BE=99?= Date: Wed, 12 Feb 2025 10:51:07 +0800 Subject: [PATCH 25/25] =?UTF-8?q?feat:(feature/REQ-3282)=20roleGroup?= =?UTF-8?q?=E5=9B=9E=E5=A1=AB=E8=BF=94=E5=9B=9E=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tyr/server/controller/v2/RoleGroupController.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java index e245410e..18132f6f 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/v2/RoleGroupController.java @@ -47,6 +47,15 @@ public class RoleGroupController implements RoleGroupApi { private RoleGroupResp from(SaasRoleGroupDTO saasRoleGroupDTO) { RoleGroupResp result = RoleGroupResp.builder().build(); + BeanUtils.copyProperties(saasRoleGroupDTO, result); + + result.setWorkspaceType(Integer.valueOf(saasRoleGroupDTO.getWorkspaceTypeCode())); + // 这里需要catch,因为oms端设置的时候是可以设置多个,用逗号隔开的,但是这样设置后会导致系统出问题,是不允许这样的 + try { + result.setCooperateShipType(Integer.valueOf(saasRoleGroupDTO.getOuTypeCode())); + } catch (Exception exception) { + log.warn("roleGroup ouTypeCode to cooperateShipType ERROR,", exception); + } assembleRole(saasRoleGroupDTO, result); return result; }