diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..bc77e220 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,3 @@ +FROM registry.cn-hangzhou.aliyuncs.com/axzo-k8s/jdk1.8-fc:v1 +COPY tyr-server/target/tyr-server-2.0.0-SNAPSHOT.jar ./tyr.jar +ENTRYPOINT [{ENTRYPOINT}] diff --git a/README.md b/README.md index 67fd2d26..a25a1b85 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,14 @@ # 项目介绍 -权限服务 \ No newline at end of file +提尔(Týr),是北欧神话中的战争与勇气之神,同时也是契约的保证人,誓言的守护者和荣耀的代表。阿萨神族主神奥丁之子。 + +权限服务 + + +dev环境启动参数: +-Dspring.datasource.url=jdbc:mysql://116.63.13.181:3311/pudge-dev?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=true&verifyServerCertificate=false&rewriteBatchedStatements=true +-Dspring.redis.host=123.249.44.111 +-Drocketmq.name-server=114.116.202.128:9876 +-Dspring.redis.port=31270 +-DCUSTOM_ENV=dev +-Dserver.port=8080 +-Dspring.profiles.active=dev \ No newline at end of file diff --git a/integration-test/src/test/resources/reponse-check.js b/integration-test/src/test/resources/reponse-check.js new file mode 100644 index 00000000..e2d7b749 --- /dev/null +++ b/integration-test/src/test/resources/reponse-check.js @@ -0,0 +1,7 @@ +client.test("request executed successful", function () { + client.assert(response.status == 200, "Response status is not 200") +}); + +client.test("response body status successful", function () { + client.assert(response.body.code == 0, "Response body code is not 0") +}); diff --git a/integration-test/src/test/resources/rest-client.env.json b/integration-test/src/test/resources/rest-client.env.json new file mode 100644 index 00000000..252aa85a --- /dev/null +++ b/integration-test/src/test/resources/rest-client.env.json @@ -0,0 +1,8 @@ +{ + "local": { + "host": "http://localhost:8080" + }, + "dev": { + "host": "https://dev-app.axzo.cn/msg-center/webApi/message/" + } +} \ No newline at end of file diff --git a/integration-test/src/test/resources/role-user.http b/integration-test/src/test/resources/role-user.http new file mode 100644 index 00000000..3d1e2906 --- /dev/null +++ b/integration-test/src/test/resources/role-user.http @@ -0,0 +1,24 @@ +### +POST {{host}}/api/saas-role-user/list +Accept: application/json +Content-Type: application/json + +{ + +} + +> reponse-check.js + +### +POST {{host}}/api/saas-role-user/delete +Accept: application/json +Content-Type: application/json + +{ + +} + +> reponse-check.js + + + diff --git a/pom.xml b/pom.xml index 4bead31e..39612245 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ cn.axzo.tyr tyr pom - 1.0.0-SNAPSHOT + ${revision} tyr @@ -20,6 +20,7 @@ + 2.0.0-SNAPSHOT 2.0.0-SNAPSHOT 2.0.0-SNAPSHOT 1.18.22 diff --git a/tyr-api/pom.xml b/tyr-api/pom.xml index 298ff057..08786447 100644 --- a/tyr-api/pom.xml +++ b/tyr-api/pom.xml @@ -5,7 +5,7 @@ tyr cn.axzo.tyr - 1.0.0-SNAPSHOT + ${revision} ../pom.xml @@ -18,5 +18,13 @@ cn.axzo.framework axzo-consumer-spring-cloud-starter + + cn.axzo.framework + axzo-core + + + cn.axzo.basics + basics-common + diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/TyrClient.java b/tyr-api/src/main/java/cn/axzo/tyr/client/TyrClient.java deleted file mode 100644 index deaf693d..00000000 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/TyrClient.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.axzo.tyr.client; - -import cn.axzo.framework.domain.page.PageQO; -import cn.axzo.framework.domain.page.PageResp; -import cn.axzo.framework.domain.web.ApiException; -import cn.axzo.framework.domain.web.result.ApiPageResult; -import cn.axzo.framework.domain.web.result.ApiResult; -import cn.axzo.tyr.client.feign.TyrApi; -import cn.axzo.tyr.client.model.NewUserReq; -import cn.axzo.tyr.client.model.QueryUserReq; -import cn.axzo.tyr.client.model.UpdateUserReq; -import cn.axzo.tyr.client.model.UserRes; -import cn.azxo.framework.common.model.CommonResponse; -import lombok.RequiredArgsConstructor; - -import javax.validation.Valid; - -/** - * @Author: liyong.tian - * @Date: 2022/9/17 - * @Description: - */ -@RequiredArgsConstructor -public class TyrClient { - - private final TyrApi api; - - /** - * 老项目迁移使用 - */ - public UserRes createUser(@Valid NewUserReq req) { - CommonResponse apiResult = api.createUser(req); - if (apiResult.getCode() == 200) { - return apiResult.getData(); - } - throw new RuntimeException(apiResult.getMsg()); - } - - /** - * 新项目使用 - */ - public UserRes updateUser(Long id, @Valid UpdateUserReq req) { - ApiResult apiResult = api.updateUser(id, req); - if (apiResult.isSuccess()) { - return apiResult.getData(); - } - throw new ApiException(apiResult.getRespCode()); - } - - public PageResp fetchUsers(QueryUserReq req, PageQO page) { - ApiPageResult apiPageResult = api.fetchUsers(req.toQueryMap(), page); - if (apiPageResult.isSuccess()) { - return apiPageResult.toPage(); - } - throw new ApiException(apiPageResult.getRespCode()); - } -} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/annotation/EnumValidator.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/annotation/EnumValidator.java new file mode 100644 index 00000000..6ecac533 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/annotation/EnumValidator.java @@ -0,0 +1,28 @@ +package cn.axzo.tyr.client.common.annotation; + +import cn.axzo.tyr.client.common.validator.EnumValueValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +/** + * @author: chenwenjian + * @date: 2023/8/29 18:31 + * @description: + * @modifiedBy: + * @version: 1.0 + */ +@Documented +@Constraint(validatedBy = EnumValueValidator.class) +@Target({ElementType.FIELD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface EnumValidator { + String message() default "Value is not valid"; + + Class[] groups() default {}; + + Class[] payload() default {}; + + Class> enumClass(); +} \ No newline at end of file diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java new file mode 100644 index 00000000..ec0f621a --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/enums/RoleTypeEnum.java @@ -0,0 +1,46 @@ +package cn.axzo.tyr.client.common.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author tanjie@axzo.cn + * @date 2023/9/13 16:35 + */ + +@Getter +@AllArgsConstructor +public enum RoleTypeEnum { + + //角色类型:common 普通角色 super_admin超级管理员(禁止删除) admin子管理员(禁止删除) init初始化内置角色 + COMMON("common", "普通角色",false), + SUPER_ADMIN("super_admin", "超级管理员",true), + ADMIN("admin", "子管理员",true), + INIT("init", "初始化内置角色",false); + + @EnumValue + private final String value; + private final String desc; + private final boolean isAdmin; + + private static Map map = null; + + public static RoleTypeEnum getRoleType(String value) { + if (map == null) { + map = Arrays.stream(values()) + .collect(Collectors.toMap(RoleTypeEnum::getValue, Function.identity())); + } + return map.get(value); + } + + public boolean isAdminRole() { + return isAdmin; + } + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/util/package-info.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/util/package-info.java new file mode 100644 index 00000000..28f2b2e6 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/util/package-info.java @@ -0,0 +1 @@ +package cn.axzo.tyr.client.common.util; \ No newline at end of file diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/common/validator/EnumValueValidator.java b/tyr-api/src/main/java/cn/axzo/tyr/client/common/validator/EnumValueValidator.java new file mode 100644 index 00000000..ce353098 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/common/validator/EnumValueValidator.java @@ -0,0 +1,34 @@ +package cn.axzo.tyr.client.common.validator; + + +import cn.axzo.tyr.client.common.annotation.EnumValidator; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * @author: chenwenjian + * @date: 2023/8/29 18:24 + * @description: + * @modifiedBy: + * @version: 1.0 + */ +public class EnumValueValidator implements ConstraintValidator> { + + @Override + public boolean isValid(Enum value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + Class> enumClass = value.getDeclaringClass(); + Enum[] enumValues = enumClass.getEnumConstants(); + for (Enum enumValue : enumValues) { + if (enumValue.name().equals(value.name())) { + // 找到匹配的枚举值 + return true; + } + } + // 未找到匹配的枚举值 + return false; + } +} \ No newline at end of file diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/config/TyrClientAutoConfiguration.java b/tyr-api/src/main/java/cn/axzo/tyr/client/config/TyrClientAutoConfiguration.java index bb8bf3b7..e26a0238 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/config/TyrClientAutoConfiguration.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/config/TyrClientAutoConfiguration.java @@ -1,10 +1,6 @@ package cn.axzo.tyr.client.config; -import cn.axzo.tyr.client.TyrClient; -import cn.axzo.tyr.client.feign.TyrApi; -import cn.axzo.tyr.client.feign.TyrFallbackFactory; import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** @@ -16,13 +12,4 @@ import org.springframework.context.annotation.Configuration; @Configuration public class TyrClientAutoConfiguration { - @Bean - public TyrFallbackFactory tyrFallbackFactory() { - return new TyrFallbackFactory(); - } - - @Bean - public TyrClient tyrClient(TyrApi tyrApi) { - return new TyrClient(tyrApi); - } } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionPointApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionPointApi.java new file mode 100644 index 00000000..bf09e3ee --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/PermissionPointApi.java @@ -0,0 +1,57 @@ +package cn.axzo.tyr.client.feign; + +import cn.axzo.framework.domain.web.result.ApiResult; +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 org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * 权限点API接口 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 14:48 + */ +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface PermissionPointApi { + + /** 查询权限点树形节点 **/ + @PostMapping(value = "/api/v1/permissionPoint/listTreeNodes") + ApiResult> listTreeNodes(@RequestBody PermissionPointTreeQueryReq request); + + /** 根据权限点ID查询详情 **/ + @GetMapping(value = "/api/v1/permissionPoint/getDetail/{permissionId}") + ApiResult getDetail(@PathVariable Long permissionId); + + /** 根据权限点ID批量查询节点信息 **/ + @PostMapping(value = "/api/v1/permissionPoint/listTreeNodesByIds") + ApiResult> listTreeNodesByIds(@RequestBody List permissionIds); + + /** 保存权限点 - 新增或更新 **/ + @PostMapping(value = "/api/v1/permissionPoint/save") + ApiResult savePermissionPoint(@RequestBody PermissionPointDTO dto); + + /** 删除权限点 **/ + @PostMapping(value = "/api/v1/permissionPoint/delete/{permissionId}") + ApiResult> deletePermissionPoint(@PathVariable Long permissionId); + + + /** 位置移动 **/ + @PostMapping(value = "/api/v1/permissionPoint/move") + ApiResult move(@RequestBody PermissionPointMoveRequest request); + + /** 查询权限点列表 - 不组装树形结构 **/ + @PostMapping(value = "/api/v1/permissionPoint/queryList") + ApiResult> queryList(@RequestBody PermissionPointListQueryRequest request); +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/ProductApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/ProductApi.java new file mode 100644 index 00000000..77cfd610 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/ProductApi.java @@ -0,0 +1,105 @@ +package cn.axzo.tyr.client.feign; + +import cn.axzo.framework.domain.web.result.ApiPageResult; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.product.ProductAddReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO; +import cn.axzo.tyr.client.model.product.ProductSearchListReq; +import cn.axzo.tyr.client.model.product.ProductSearchPageReq; +import cn.axzo.tyr.client.model.product.ProductUpdateReq; +import cn.axzo.tyr.client.model.product.ProductVO; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 产品相关 API + * + * @author wangli + * @since 2023/9/6 14:47 + */ +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface ProductApi { + + /** + * 获取产品基础信息的列表 + * + * @param req {@link ProductSearchListReq} + * @return 如果没有查询到, 返回空集合, 集合内类型: {@link ProductVO} + */ + @PostMapping("api/auth/product/list") + ApiResult> list(@RequestBody ProductSearchListReq req); + + /** + * 获取产品基础信息的分页列表 + * + * @param req {@link ProductSearchPageReq} + * @return 如果没有查询, 返回 ApiPageResult.empty(), 携带分页信息,集合内类型: {@link ProductVO} + */ + @PostMapping("api/auth/product/page") + ApiPageResult page(@RequestBody ProductSearchPageReq req); + + /** + * 获取指定 ID 的产品基础信息 + * + * @param id 产品 ID + * @return {@link ProductVO} + */ + @GetMapping("api/auth/product/get/id") + ApiResult getById(@RequestParam(required = false) @NotNull(message = "id不能为空") Long id); + + /** + * 新增产品基础信息 + * + * @param req {@link ProductAddReq} + * @return 返回当前新增产品基础信息 + */ + @PostMapping("api/auth/product/add") + ApiResult add(@Validated @RequestBody ProductAddReq req); + + /** + * 修改产品基础信息 + * + * @param req {@link ProductUpdateReq} + * @return 返回修改后的产品基础信息 + */ + @PutMapping("api/auth/product/update") + ApiResult update(@Validated @RequestBody ProductUpdateReq req); + + /** + * 删除指定 ID 的产品 + * + * @param id 产品 ID + * @return 返回被删除的产品信息 + */ + @DeleteMapping("api/auth/product/delete/id") + ApiResult delete(@RequestParam(required = false) @NotNull(message = "id不能为空") Long id); + + /** + * 返回指定产品和单位类型下所有已有权限点集合 + * + * @param req {@link ProductFeatureRelationSearchReq} + * @return 如果没有查询到, 返回空集合, 集合内类型: {@link ProductFeatureRelationVO} + */ + @PostMapping("api/auth/product/feature/relation/list") + ApiResult> featureList(@Validated @RequestBody ProductFeatureRelationSearchReq req); + + /** + * 更新产品与权限点的关联关系 + * + * @param req {@link ProductFeatureRelationUpdateReq} + * @return + */ + @PostMapping("api/auth/product/feature/relation/update") + ApiResult updateFeatureRelation(@Validated @RequestBody List req); +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasBasicDictApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasBasicDictApi.java new file mode 100644 index 00000000..376e7987 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasBasicDictApi.java @@ -0,0 +1,90 @@ +package cn.axzo.tyr.client.feign; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.dict.request.*; +import cn.axzo.tyr.client.model.dict.response.BasicDictNodeResp; +import cn.axzo.tyr.client.model.dict.response.BasicDictTreeResp; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * @author: chenwenjian + * @date: 2023/9/6 15:33 + * @description: 企业字典api + * @modifiedBy: + * @version: 1.0 + */ +@FeignClient(name = "tyr", url = "http://tyr:8080") +public interface SaasBasicDictApi { + + /** + * 获取字典树节点 + * + * @param req 根据自身需求传入参数 + * @return + */ + @PostMapping("api/dict/node-list") + ApiResult> getBasicDictNodeList(@RequestBody @Validated BasicDictQueryReq req); + + /** + * 获取字典树,需要单侧树时才传type + * + * @param req + * @return + */ + @PostMapping("api/dict/node-tree") + ApiResult> getBasicDictNodeTree(@RequestBody @Validated BasicDictQueryReq req); + + /** + * 通过type和code获取字典节点详情 + * + * @param req 传入type和code + * @return + */ + @PostMapping("api/dict/node") + ApiResult getBasicDictNode(@RequestBody @Validated BasicDictNodeReq req); + + /** + * 添加字典 + * + * @param req 其中name,code在同一个父级节点下不能重复 + * @return 节点id + */ + @PostMapping("api/dict/create") + ApiResult create(@RequestBody @Validated BasicDictCreateReq req); + + /** + * 编辑字典 + * 目前只支持更新字典名称 + * + * @param req 字典id和name + * @return 更新状态 + */ + @PostMapping("api/dict/update") + ApiResult update(@RequestBody @Validated BasicDictUpdateReq req); + + /** + * 更新字典状态 + * + * @param req 字典id和status + * @return 更新状态 + */ + @PostMapping("api/dict/update-status") + ApiResult updateStatus(@RequestBody @Validated BasicDictUpdateStatusReq req); + + /** + * 通过id获取字典节点 + * + * @param id 节点id + * @return 一个字典节点 + */ + @GetMapping("api/dict/get") + ApiResult get(@RequestParam Long id); + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasPermissionGroupApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasPermissionGroupApi.java new file mode 100644 index 00000000..5d7583d4 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasPermissionGroupApi.java @@ -0,0 +1,55 @@ +package cn.axzo.tyr.client.feign; + +import cn.axzo.framework.domain.web.result.ApiPageResult; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.QuerySaasPermissionGroupReq; +import cn.axzo.tyr.client.model.vo.DeletePermissionGroupVO; +import cn.axzo.tyr.client.model.vo.SaasPermissionGroupVO; +import cn.axzo.tyr.client.model.vo.SaveOrUpdatePermissionGroupVO; +import cn.axzo.tyr.client.model.vo.SavePermissionGroupPPVO; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.validation.Valid; +import java.util.List; + +/** + * 权限集 + */ +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface SaasPermissionGroupApi { + + /** + * 保存/更新 例外 + */ + @PostMapping("/api/saasPermissionGoup/saveOrUpdateSpecial") + ApiResult saveOrUpdateSpecial(@RequestBody @Valid SaveOrUpdatePermissionGroupVO permissionGroup); + + /** + * 根据id查询详情 + * @param id + * @return + */ + @PostMapping("/api/saasPermissionGoup/getById") + ApiResult getById(@RequestParam("id") Long id); + + /** + * 查询 + */ + @PostMapping("/api/saasPermissionGoup/query") + ApiPageResult query(@RequestBody@Valid QuerySaasPermissionGroupReq req); + + /** + * 删除 + */ + @PostMapping("/api/saasPermissionGoup/delete") + ApiResult delete(@RequestBody List id); + + @PostMapping("/api/saasPermissionGoup/savePermissionPoints") + ApiResult savePermissionPoints(@RequestBody@Valid SavePermissionGroupPPVO save); + + @PostMapping("/api/saasPermissionGoup/deletePermissionGroupSpecial") + ApiResult deletePermissionGroupSpecial(@RequestBody @Valid DeletePermissionGroupVO group); +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasPermissionGroupScopeApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasPermissionGroupScopeApi.java new file mode 100644 index 00000000..df318a73 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasPermissionGroupScopeApi.java @@ -0,0 +1,13 @@ +package cn.axzo.tyr.client.feign; + +import org.springframework.cloud.openfeign.FeignClient; + +/** + * 权限集作用范围 + */ +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080/api/saasPermissionGroup}") +public interface SaasPermissionGroupScopeApi { + + + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java new file mode 100644 index 00000000..ee7ec061 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/SaasRoleGroupApi.java @@ -0,0 +1,43 @@ +package cn.axzo.tyr.client.feign; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; +import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 角色分组 + */ +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface SaasRoleGroupApi { + + /** + * 保存/更新 + * @return + */ + @PostMapping("/api/saasRoleGroup/save") + ApiResult saveOrUpdate(@RequestBody SaasRoleGroupVO req); + + /** + * 获取权限分组列表 + * @return + */ + @PostMapping("/api/saasRoleGroup/getList") + ApiResult> getList(@RequestBody QuerySaasRoleGroupReq req); + + @PostMapping("/api/saasRoleGroup/getById") + ApiResult getById(@RequestParam("id") Long id); + + /** + * 删除 + */ + @PostMapping("/api/saasRoleGroup//api/saasPermissionGoup/delete") + ApiResult delete(@RequestBody@NotEmpty List ids); + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrApi.java deleted file mode 100644 index 11e90458..00000000 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrApi.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.axzo.tyr.client.feign; - -import cn.axzo.framework.domain.page.PageQO; -import cn.axzo.framework.domain.web.result.ApiPageResult; -import cn.axzo.framework.domain.web.result.ApiResult; -import cn.axzo.tyr.client.model.NewUserReq; -import cn.axzo.tyr.client.model.UpdateUserReq; -import cn.axzo.tyr.client.model.UserRes; -import cn.azxo.framework.common.model.CommonResponse; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; - -/** - * @Author: liyong.tian - * @Date: 2022/9/17 - * @Description: - */ -@FeignClient(name = "tyr", url = "http://localhost:8899", fallbackFactory = TyrFallbackFactory.class) -public interface TyrApi { - - @PostMapping(value = "/api/v1/users", consumes = APPLICATION_JSON_VALUE) - CommonResponse createUser(@RequestBody NewUserReq req); - - @PutMapping(value = "/api/v2/users/{id}", consumes = APPLICATION_JSON_VALUE) - ApiResult updateUser(@PathVariable("id") Long id, @RequestBody UpdateUserReq req); - - @GetMapping(value = "/api/v2/users") - ApiPageResult fetchUsers(@RequestParam Map query, PageQO page); -} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrApiFallback.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrApiFallback.java deleted file mode 100644 index eab606a0..00000000 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrApiFallback.java +++ /dev/null @@ -1,52 +0,0 @@ -package cn.axzo.tyr.client.feign; - -import cn.axzo.framework.client.feign.FeignFallback; -import cn.axzo.framework.domain.page.PageQO; -import cn.axzo.framework.domain.web.result.ApiPageResult; -import cn.axzo.framework.domain.web.result.ApiResult; -import cn.axzo.tyr.client.model.NewUserReq; -import cn.axzo.tyr.client.model.UpdateUserReq; -import cn.axzo.tyr.client.model.UserRes; -import cn.azxo.framework.common.model.CommonResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; - -/** - * @Author: liyong.tian - * @Date: 2022/9/17 - * @Description: - */ -@Slf4j -@RequiredArgsConstructor -public class TyrApiFallback implements TyrApi { - - private final FeignFallback fallback; - - /** - * 老项目迁移使用 - * @param req - * @return - */ - @Override - public CommonResponse createUser(NewUserReq req) { - log.error("[tyr-api] createUser fallback", fallback.getCause()); - return CommonResponse.error("创建用户失败"); - } - - /** - * 新项目推荐使用 - */ - @Override - public ApiResult updateUser(Long id, UpdateUserReq req) { - log.error("[tyr-api] updateUser fallback", fallback.getCause()); - return fallback.resp(); - } - - @Override - public ApiPageResult fetchUsers(Map query, PageQO page) { - log.error("[tyr-api] fetchUsers fallback", fallback.getCause()); - return fallback.pageResp(); - } -} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrFallbackFactory.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrFallbackFactory.java deleted file mode 100644 index d15c7c57..00000000 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrFallbackFactory.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.axzo.tyr.client.feign; - -import cn.axzo.framework.client.feign.FeignFallback; -import cn.axzo.framework.domain.web.code.IRespCode; -import cn.axzo.framework.domain.web.code.RespCode; -import feign.hystrix.FallbackFactory; -import org.springframework.stereotype.Component; - -@Component -public class TyrFallbackFactory implements FallbackFactory { - - // TODO: 2022/11/3 100-调整为具体的项目编号,XXX-调整为项目名 - private final IRespCode respCode = new RespCode("100" + "91001", "XXX服务不可用"); - - @Override - public TyrApiFallback create(Throwable cause) { - return new TyrApiFallback(new FeignFallback(cause, respCode)); - } -} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java new file mode 100644 index 00000000..9894c45f --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleApi.java @@ -0,0 +1,75 @@ +package cn.axzo.tyr.client.feign; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; +import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.res.IsSuperAdminRes; +import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; +import cn.axzo.tyr.client.model.vo.SaasRoleVO; +import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 角色 + */ +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface TyrSaasRoleApi { + + /** + * 保存/更新 + * 标准角worksaceId ouId = -1,自定义跟随自定义分组赋值 + * 如果权限列表不为空则创建通用权限 + */ + @PostMapping("/api/saasRole/saveOrUpdate") + ApiResult saveOrUpdate(@RequestBody @Validated SaveOrUpdateRoleVO saveOrUpdateRole); + + /** + * 根据id查询详情 + */ + @PostMapping("/api/saasRole/getById") + ApiResult getById(@RequestParam(required = true) @NotNull Long id); + + /** + * 获取角色列表 + * @return + */ + @PostMapping("/api/saasRole/query") + ApiResult> query(@RequestBody QuerySaasRoleReq req); + + /** + * 删除 + */ + @PostMapping("/api/saasRole/delete") + ApiResult delete(@RequestBody List id); + + /** + * 根据身份id身份类型查询权限列表(批量) + * @param identityType 身份类型 1:工人 2:班组长 3:从业人员 4:监管人员 5:运营人员 + * @return + */ + @GetMapping("/api/saasRole/queryByIdentityIdType") + ApiResult> queryByIdentityIdType(@RequestParam(required = true) Long identityId,@RequestParam(required = true) Integer identityType,@RequestParam(required = true) Long workspaceId,@RequestParam(required = true) Long ouId); + + /** + * 根据身份id身份类型查询权限列表(批量) + * @return + */ + @PostMapping("/api/saasRole/queryBatchByIdentityIdType") + ApiResult> queryBatchByIdentityIdType(@RequestBody List req); + + /** + * 根据身份id身份类型查询是否为超管 + * @return + */ + @PostMapping("/api/saasRole/isSuperAdmin") + ApiResult> isSuperAdmin(@RequestBody List req); + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleUserApi.java b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleUserApi.java new file mode 100644 index 00000000..e26eb196 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/feign/TyrSaasRoleUserApi.java @@ -0,0 +1,47 @@ +package cn.axzo.tyr.client.feign; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserRelationDTO; +import cn.axzo.tyr.client.model.roleuser.req.DeleteRoleUserParam; +import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; +import cn.axzo.tyr.client.model.roleuser.req.RoleUserReq; +import cn.azxo.framework.common.model.CommonResponse; +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 javax.validation.Valid; +import java.util.List; + +/** + * 角色 + */ +@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}") +public interface TyrSaasRoleUserApi { + + /** + * 保存/更新 用户的角色,每次传入新的角色ID时都会覆盖原来的所有角色 + */ + @PostMapping("/api/saas-role-user/save-or-update") + ApiResult saveOrUpdate(@RequestBody @Valid RoleUserReq req); + + /** + * 用户角色列表 限制1000条 + * @param param + * @return + */ + @PostMapping("/api/saas-role-user/list") + ApiResult> roleUserList(@RequestBody @Valid RoleUserParam param); + + /** + * 移除某个人在某个工作台的所有角色(除超管) + * + * @param param + * @return + */ + @PostMapping("api/saas-role-user/delete") + ApiResult deleteUserAllRoles(@RequestBody @Valid List param); + + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/BaseWorkspaceModel.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/BaseWorkspaceModel.java new file mode 100644 index 00000000..5bcb0133 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/BaseWorkspaceModel.java @@ -0,0 +1,45 @@ +package cn.axzo.tyr.client.model; + +import cn.axzo.tyr.client.model.enums.IdentityType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +/** + * @author tanjie@axzo.cn + * @date 2023/9/13 16:09 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BaseWorkspaceModel { + + /** + * 工作台id + */ + @NotNull + private Long workspaceId; + + /** + * 单位id + */ + @NotNull + private Long ouId; + + /** + * 身份id + */ + @NotNull + private Long identityId; + + /** + * 身份类型 + */ + @NotNull + private IdentityType identityType; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/NewUserReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/NewUserReq.java deleted file mode 100644 index 21f5c7ad..00000000 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/NewUserReq.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.axzo.tyr.client.model; - -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -/** - * @Author: liyong.tian - * @Date: 2022/9/2 - * @Description: - */ -@Data -public class NewUserReq { - - @NotBlank(message = "名称不能为空") - private String name; - - @NotNull - private Integer sex; - - private Integer age; - - private String phone; - - private String email; - - private String address; -} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/QueryUserReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/QueryUserReq.java deleted file mode 100644 index 8d88889b..00000000 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/QueryUserReq.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.axzo.tyr.client.model; - -import cn.axzo.framework.context.client.IQueryMap; -import cn.axzo.framework.context.client.QueryMap; -import lombok.Data; - -@Data -public class QueryUserReq implements IQueryMap { - - private Long id; - - private String name; - - private String phone; - - private String email; - - @Override - public void append(QueryMap.Builder builder) { - builder.put("id", id).put("name", name).put("phone", phone).put("email", email); - } -} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/UpdateUserReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/UpdateUserReq.java deleted file mode 100644 index acb268a6..00000000 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/UpdateUserReq.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.axzo.tyr.client.model; - -import lombok.Data; - -@Data -public class UpdateUserReq { - - private String name; - - private Integer sex; - - private Integer age; - - private String phone; - - private String email; - - private String address; -} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/UserRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/UserRes.java deleted file mode 100644 index 7508a5f6..00000000 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/UserRes.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.axzo.tyr.client.model; - -import lombok.Data; - -@Data -public class UserRes { - - private Long id; - - private String name; - - private Integer sex; - - private Integer age; - - private String phone; - - private String email; - - private String address; -} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictCreateReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictCreateReq.java new file mode 100644 index 00000000..4ba67505 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictCreateReq.java @@ -0,0 +1,47 @@ +package cn.axzo.tyr.client.model.dict.request; + +import cn.axzo.tyr.client.common.annotation.EnumValidator; +import cn.axzo.tyr.client.model.enums.DictTypeFiledEnum; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author: chenwenjian + * @date: 2023/9/6 14:44 + * @description: 添加字典请求入参 + * @modifiedBy: + * @version: 1.0 + */ +@Data +public class BasicDictCreateReq { + + /** + * 所属上级节点id + */ + @NotNull(message = "所属上级不能为空") + private Long parentId; + + /** + * type类型不能为空 + */ + @NotNull(message = "type类型不能为空") + @EnumValidator(enumClass = DictTypeFiledEnum.class, message = "枚举类型错误") + private DictTypeFiledEnum type; + + /** + * 字典名称 + */ + @NotBlank(message = "字典名称不能为空") + @Length(max = 35, message = "字典名称长度不能超过35字符") + private String name; + + /** + * 编码code + */ + @NotBlank(message = "code不能为空") + private String code; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictNodeReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictNodeReq.java new file mode 100644 index 00000000..843bc689 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictNodeReq.java @@ -0,0 +1,29 @@ +package cn.axzo.tyr.client.model.dict.request; + +import cn.axzo.tyr.client.common.annotation.EnumValidator; +import cn.axzo.tyr.client.model.enums.DictTypeFiledEnum; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author: chenwenjian + * @date: 2023/9/6 15:46 + * @description: + * @modifiedBy: + * @version: 1.0 + */ +@Data +public class BasicDictNodeReq { + + /** + * 类型 + */ + @NotNull(message = "type不能为空") + @EnumValidator(enumClass = DictTypeFiledEnum.class, message = "枚举类型错误") + private DictTypeFiledEnum type; + + @NotNull(message = "code不能为空") + private String code; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictQueryReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictQueryReq.java new file mode 100644 index 00000000..fe0e0b51 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictQueryReq.java @@ -0,0 +1,61 @@ +package cn.axzo.tyr.client.model.dict.request; + +import cn.axzo.tyr.client.common.annotation.EnumValidator; +import cn.axzo.tyr.client.model.enums.DictTypeFiledEnum; +import cn.axzo.tyr.client.model.enums.DictWorkSpaceTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author: chenwenjian + * @date: 2023/9/6 14:02 + * @description: 获取企业字典树请求入参 + * @modifiedBy: + * @version: 1.0 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BasicDictQueryReq { + + private List ids; + + private Long parentId; + + /** + * workspace + */ + @EnumValidator(enumClass = DictWorkSpaceTypeEnum.class, message = "枚举类型错误") + private DictWorkSpaceTypeEnum workspaceType; + + /** + * type + */ + @EnumValidator(enumClass = DictTypeFiledEnum.class, message = "枚举类型错误") + private DictTypeFiledEnum type; + + /** + * 字典名称 + */ + private String name; + + /** + * 字典code + */ + private List codes; + + /** + * 状态,默认只查启用记录 + */ + private Boolean status = true; + + /** + * 层级 + */ + private Integer level; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictUpdateReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictUpdateReq.java new file mode 100644 index 00000000..cadc17fb --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictUpdateReq.java @@ -0,0 +1,27 @@ +package cn.axzo.tyr.client.model.dict.request; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +/** + * @author: chenwenjian + * @date: 2023/9/6 15:00 + * @description: 编辑请求入参 + * @modifiedBy: + * @version: 1.0 + */ +@Data +public class BasicDictUpdateReq { + + private Long id; + + /** + * 字典名称 + */ + @NotBlank(message = "字典名称不能为空") + @Length(max = 35, message = "字典名称长度不能超过35字符") + private String name; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictUpdateStatusReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictUpdateStatusReq.java new file mode 100644 index 00000000..c3ffe041 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/request/BasicDictUpdateStatusReq.java @@ -0,0 +1,29 @@ +package cn.axzo.tyr.client.model.dict.request; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author: chenwenjian + * @date: 2023/9/6 15:04 + * @description: 状态更改请求入参 + * @modifiedBy: + * @version: 1.0 + */ +@Data +public class BasicDictUpdateStatusReq { + + /** + * 节点id + */ + @NotNull(message = "节点id不能为空") + private Long id; + + /** + * 状态,true启用,false禁用 + */ + @NotNull(message = "状态不能为空") + private Boolean status; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/response/BasicDictNodeResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/response/BasicDictNodeResp.java new file mode 100644 index 00000000..f4704a31 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/response/BasicDictNodeResp.java @@ -0,0 +1,64 @@ +package cn.axzo.tyr.client.model.dict.response; + +import lombok.Data; + +/** + * @author: chenwenjian + * @date: 2023/9/6 15:39 + * @description: + * @modifiedBy: + * @version: 1.0 + */ +@Data +public class BasicDictNodeResp { + + private Long id; + + private Long parentId; + + /** + * 工作台类型,"ent", "proj", "oms" + */ + private String workspaceType; + + /** + * 类型,"ouType", "terminal" + */ + private String type; + + /** + * 字典名称 + */ + private String name; + + /** + * 字典code + */ + private String code; + + /** + * 唯一code + */ + private String uniqueCode; + + /** + * 状态 + */ + private Boolean status; + + /** + * 路径 + */ + private String path; + + /** + * 层级 + */ + private Integer level; + + /** + * 扩展字段 + */ + private String ext; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/response/BasicDictTreeResp.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/response/BasicDictTreeResp.java new file mode 100644 index 00000000..57d9bc9e --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/dict/response/BasicDictTreeResp.java @@ -0,0 +1,51 @@ +package cn.axzo.tyr.client.model.dict.response; + +import lombok.Data; + +import java.util.List; + +/** + * @author: chenwenjian + * @date: 2023/9/6 14:08 + * @description: + * @modifiedBy: + * @version: 1.0 + */ +@Data +public class BasicDictTreeResp { + + private Long id; + + private Long parentId; + + /** + * 工作台类型,"ent", "proj", "oms" + */ + private String workspaceType; + + /** + * 类型,"ouType", "terminal" + */ + private String type; + + /** + * 字典名称 + */ + private String name; + + /** + * 字典code + */ + private String code; + + /** + * 状态 + */ + private Boolean status; + + /** + * 当前节点下子节点 + */ + private List children; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/DelegatedType.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/DelegatedType.java new file mode 100644 index 00000000..3dc3bbd2 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/DelegatedType.java @@ -0,0 +1,42 @@ +package cn.axzo.tyr.client.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +/** + * 权限点授权策略类型 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 11:05 + */ +@Getter +@AllArgsConstructor +public enum DelegatedType { + + PLAT(1, "平台授权型"), + CUSTOM(2, "客户授权型"), + NO_NEED(3, "免授权型"), + ; + + private Integer code; + private String desc; + + private static final Map MAPPING = new HashMap<>(); + static { + for (DelegatedType type : DelegatedType.values()) { + MAPPING.put(type.code, type); + } + } + + public static DelegatedType apply(Integer code) { + return code == null ? null :MAPPING.get(code); + } + + public boolean sameCode(Integer code) { + return this.code.equals(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/DictTypeFiledEnum.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/DictTypeFiledEnum.java new file mode 100644 index 00000000..2e803d2a --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/DictTypeFiledEnum.java @@ -0,0 +1,62 @@ +package cn.axzo.tyr.client.model.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; + +import java.util.Arrays; + +/** + * @author: chenwenjian + * @date: 2023/9/8 15:12 + * @description: 字典type字段枚举 + * @modifiedBy: + * @version: 1.0 + */ + +public enum DictTypeFiledEnum { + + /** + * 企业类型 + */ + OUTYPE("ou_type","企业类型"), + + /** + * 端 + */ + TERMINAL("terminal","端"), + + /** + * 工作台 + */ + WORKSPACE("workspace","工作台") + ; + + @EnumValue + @JsonValue + private final String value; + + private final String description; + + public String getValue() { + return value; + } + + public String getDescription() { + return description; + } + + DictTypeFiledEnum(String value, String description) { + this.value = value; + this.description = description; + } + + /** + * 通过value值获取枚举类型 + * + * @param value value值 + * @return + */ + public static DictTypeFiledEnum getByValue(String value) { + return Arrays.stream(values()).filter(l -> l.getValue().equals(value)).findFirst().orElse(null); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/DictWorkSpaceTypeEnum.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/DictWorkSpaceTypeEnum.java new file mode 100644 index 00000000..135b9950 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/DictWorkSpaceTypeEnum.java @@ -0,0 +1,66 @@ +package cn.axzo.tyr.client.model.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; + +import java.util.Arrays; + +/** + * @author: chenwenjian + * @date: 2023/9/8 14:21 + * @description: 字典工作台类型枚举 + * @modifiedBy: + * @version: 1.0 + */ +public enum DictWorkSpaceTypeEnum { + + /** + * 企业工作台 + */ + ENT("ent", "企业工作台"), + + /** + * 项目部工作台 + */ + PROJ("proj", "项目部工作台"), + + /** + * OMS工作台 + */ + OMS("oms", "OMS工作台"), + + /** + * 班组工作台 + */ + TEAM("team","班组工作台") + ; + + @EnumValue + @JsonValue + private final String value; + + private final String description; + + public String getValue() { + return value; + } + + public String getDescription() { + return description; + } + + DictWorkSpaceTypeEnum(String value, String description) { + this.value = value; + this.description = description; + } + + /** + * 通过value值获取枚举类型 + * + * @param value value值 + * @return + */ + public static DictWorkSpaceTypeEnum getByValue(String value) { + return Arrays.stream(values()).filter(l -> l.getValue().equals(value)).findFirst().orElse(null); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/FeatureType.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/FeatureType.java new file mode 100644 index 00000000..40fd7d03 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/FeatureType.java @@ -0,0 +1,43 @@ +package cn.axzo.tyr.client.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +/** + * 权限点元素类型 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 21:03 + */ +@Getter +@AllArgsConstructor +public enum FeatureType { + + MODULE(0, "菜单"), //原0-模块 + MENU(1, "页面"), //原 1-菜单 + PAGE(2, "页面"), //原 2-页面 没使用 + BUTTON(3, "按钮"), //原 3-功能 + ; + + private Integer code; + private String desc; + + private static final Map MAPPING = new HashMap<>(); + static { + for (FeatureType type : FeatureType.values()) { + MAPPING.put(type.code, type); + } + } + + public static FeatureType apply(Integer code) { + return code == null ? null :MAPPING.get(code); + } + + public boolean sameCode(Integer code) { + return this.code.equals(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/IEnum.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/IEnum.java new file mode 100644 index 00000000..66789b7d --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/IEnum.java @@ -0,0 +1,27 @@ +package cn.axzo.tyr.client.model.enums; + +/** + * 项目名称:pudge + * 类 名 称:AbstractEnum + * 类 描 述:TODO + * 创建时间:2022/7/14 12:26 + * 创 建 人:xuyaozuo + */ +public interface IEnum { + + Integer getCode(); + String getMessage(); + + static & IEnum> T enumFromCode(Class enumType, Integer code) { + T defaultEnum = null; + for (T c : enumType.getEnumConstants()) { + if (c.getCode().equals(code)) { + return c; + } + if (c.getCode().equals(0)) { + defaultEnum = c; + } + } + return defaultEnum; + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/IdentityType.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/IdentityType.java new file mode 100644 index 00000000..7e5aa1cb --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/IdentityType.java @@ -0,0 +1,53 @@ +package cn.axzo.tyr.client.model.enums; + +import cn.axzo.basics.common.exception.ServiceException; +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 人员身份类型枚举 + * + * @author xuyaozuo + * @since 2022/5/9 21:59 + */ +@Getter +@AllArgsConstructor +public enum IdentityType implements IEnum{ + + /*人员身份类型*/ + NOT_SUPPORT(0, "NOT_SUPPORT", "无效类型"), + WORKER(1, "WORKER", "工人"), + WORKER_LEADER(2, "WORKER_LEADER", "班组长"), + PRACTITIONER(3, "PRACTITIONER", "从业人员"), + REGULATOR(4, "REGULATOR", "监管人员"), + OPERATOR(5, "OPERATOR", "运营人员"), + ; + @EnumValue + @JsonValue + private final Integer code; + private final String message; + private final String desc; + + + public static IdentityType getIdentityType(Integer code) { + IdentityType[] values = values(); + for (IdentityType item : values) { + if (item.getCode().equals(code)) { + return item; + } + } + throw new ServiceException("档案身份类型不匹配 code:" + code); + } + + public static IdentityType getIdentityType(String message) { + IdentityType[] values = values(); + for (IdentityType item : values) { + if (item.getMessage().equals(message)) { + return item; + } + } + throw new ServiceException("档案身份类型不匹配 message:" + message); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PageLinkType.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PageLinkType.java new file mode 100644 index 00000000..fd1b7b1e --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PageLinkType.java @@ -0,0 +1,41 @@ +package cn.axzo.tyr.client.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +/** + * 页面适用终端 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/12 11:52 + */ +@Getter +@AllArgsConstructor +public enum PageLinkType { + PC(1, "PC"), + UNI(2, "UNI"), + APP(4, "APP"), + ; + + private Integer code; + private String desc; + + private static final Map MAPPING = new HashMap<>(); + static { + for (PageLinkType type : PageLinkType.values()) { + MAPPING.put(type.code, type); + } + } + + public static PageLinkType apply(Integer code) { + return code == null ? null :MAPPING.get(code); + } + + public boolean sameCode(Integer code) { + return this.code.equals(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionGroupType.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionGroupType.java new file mode 100644 index 00000000..d2808dbd --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionGroupType.java @@ -0,0 +1,29 @@ +package cn.axzo.tyr.client.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +@Getter +@AllArgsConstructor +public enum PermissionGroupType { + COMMON(1, "通用"), + SPECIAL(0, "例外"), + ; + + private Integer code; + private String desc; + + private static final Map MAPPING = new HashMap<>(); + static { + for (PermissionGroupType type : PermissionGroupType.values()) { + MAPPING.put(type.code, type); + } + } + + public static PermissionGroupType apply(Integer code) { + return code == null ? null :MAPPING.get(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionScope.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionScope.java new file mode 100644 index 00000000..5fbd890c --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionScope.java @@ -0,0 +1,29 @@ +package cn.axzo.tyr.client.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +@Getter +@AllArgsConstructor +public enum PermissionScope { + INCLUDE(1, "正选"), + EXCLUDE (2, "反选"), + ; + + private Integer code; + private String desc; + + private static final Map MAPPING = new HashMap<>(); + static { + for (PermissionScope type : PermissionScope.values()) { + MAPPING.put(type.code, type); + } + } + + public static PermissionScope apply(Integer code) { + return code == null ? null :MAPPING.get(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionScopeType.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionScopeType.java new file mode 100644 index 00000000..d08e51a0 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionScopeType.java @@ -0,0 +1,29 @@ +package cn.axzo.tyr.client.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +@Getter +@AllArgsConstructor +public enum PermissionScopeType { + WORKSPACE("workspace", "项目部"), + OU ("ou", "单位"), + ; + + private String code; + private String desc; + + private static final Map MAPPING = new HashMap<>(); + static { + for (PermissionScopeType type : PermissionScopeType.values()) { + MAPPING.put(type.code, type); + } + } + + public static PermissionScopeType apply(Integer code) { + return code == null ? null :MAPPING.get(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionType.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionType.java new file mode 100644 index 00000000..a799cc85 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/PermissionType.java @@ -0,0 +1,29 @@ +package cn.axzo.tyr.client.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +@Getter +@AllArgsConstructor +public enum PermissionType { + FEATURE("feature", "功能"), + DATA("data", "数据"), + ; + + private String code; + private String desc; + + private static final Map MAPPING = new HashMap<>(); + static { + for (PermissionType type : PermissionType.values()) { + MAPPING.put(type.code, type); + } + } + + public static PermissionType apply(Integer code) { + return code == null ? null :MAPPING.get(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/RoleGroupScope.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/RoleGroupScope.java new file mode 100644 index 00000000..ad610bf1 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/RoleGroupScope.java @@ -0,0 +1,29 @@ +package cn.axzo.tyr.client.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +@Getter +@AllArgsConstructor +public enum RoleGroupScope { + ALL(1, "全部"), + SPECIFY_ENTERPRISE_TYPE(2, "指定企业类型"), + ; + + private Integer code; + private String desc; + + private static final Map MAPPING = new HashMap<>(); + static { + for (RoleGroupScope type : RoleGroupScope.values()) { + MAPPING.put(type.code, type); + } + } + + public static RoleGroupScope apply(Integer code) { + return code == null ? null :MAPPING.get(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/RoleLevel.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/RoleLevel.java new file mode 100644 index 00000000..0e942c4e --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/enums/RoleLevel.java @@ -0,0 +1,29 @@ +package cn.axzo.tyr.client.model.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +@Getter +@AllArgsConstructor +public enum RoleLevel { + WORKSPACE(1, "工作台"), + GROUP(2, "角色分组"), + ROLE(3, "角色"), + ; + private Integer code; + private String desc; + + private static final Map MAPPING = new HashMap<>(); + static { + for (RoleLevel level : RoleLevel.values()) { + MAPPING.put(level.code, level); + } + } + + public static RoleLevel apply(Integer code) { + return code == null ? null :MAPPING.get(code); + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointDTO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointDTO.java new file mode 100644 index 00000000..2c5959a8 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointDTO.java @@ -0,0 +1,178 @@ +package cn.axzo.tyr.client.model.permission; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +/** + * 权限点对象 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/5 15:50 + */ +@Data +public class PermissionPointDTO { + + /** + * 权限点id + */ + private Long id; + + /** + * 权限点名称 + */ + @NotBlank(message = "权限点名称不能为空") + private String featureName; + + /** + * 元素code + */ + @NotBlank(message = "权限点元素code不能为空") + private String featureCode; + + /** + * 菜单icon + */ + private String icon; + + /** + * 父级权限点id + */ + private Long parentId; + + /** 父级权限点名称 **/ + private String parentName; + + + /** + * 页面路由 + */ + private String linkUrl; + + /** + * 适用终端 1:PC 2:UNI 4:APP + */ + private Integer linkType; + + /** + * 扩展字段 - APP适配参数 + */ + private String linkExt; + + /** + * 小程序AppID + */ + private String microAppItemId; + + /** + * 权限点层级path + */ + private String path; + + /** 层级名称 顶级-……-当前节点 **/ + private List pathName; + + /** + * 排序 + */ + private Integer sort; + + /** + * 菜单适用工作台 + */ + @NotBlank(message = "所属工作台不能为空") + private String terminal; + + /** + * 元素类别 0.菜单 1.页面 3按钮 + */ + @NotNull(message = "元素类别不能为空") + private Integer featureType; + + + /** + * 创建人id + */ + private Long createBy; + + /** + * 创建时间 + */ + private LocalDateTime createAt; + + /** + * 更新时间 + */ + private LocalDateTime updateAt; + + /** + * 修改人id + */ + private Long updateBy; + + + /** + * 0:查看 1:操作 + */ + private Integer operateType; + + + /** + * 适用单位类型 1:总包 2:建设单位 4:监理单位 8:劳务分包 16:专业分包 32-班组 + */ + private List fitOuTypeList; + + /** + * 适用节点类型 1:部门 2:班组 4:小组 + */ + private List fitOuNodeTypeList; + + /** + * 所属应用 + */ + private String appName; + + /** + * 功能URL + */ + private String featureUrl; + + /** + * 是否认证 0:无需要认证 1:需要认证 + */ + private Boolean needCert; + + /** + * 是否授权 0:无需要授权 1:需要授权 + */ + private Boolean needAuth; + + /** + * 授权策略类型,允许为空 1-平台授权型 2-客户授权型 3-免授权型 + */ + private Integer delegatedType; + + /** 业务编码 **/ + private String businessNo; + + public Long mergeFitOuTypeBit() { + if (this.fitOuTypeList == null || this.fitOuTypeList.isEmpty()) { + return null; + } + return this.fitOuTypeList.stream().mapToLong(Long::longValue).sum(); + } + + + public Long mergeFitOuNodeTypeBit() { + if (this.fitOuNodeTypeList == null || this.fitOuNodeTypeList.isEmpty()) { + return null; + } + return this.fitOuNodeTypeList.stream().mapToLong(Long::longValue).sum(); + } + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointListQueryRequest.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointListQueryRequest.java new file mode 100644 index 00000000..08098cab --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointListQueryRequest.java @@ -0,0 +1,47 @@ +package cn.axzo.tyr.client.model.permission; + +import lombok.Data; + +import java.util.List; + +/** + * 权限点列表查询对象 + * 按需扩展 + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/12 18:51 + */ +@Data +public class PermissionPointListQueryRequest { + + /** + * 元素类别 0.菜单 1.页面 3按钮 + * 参考FeatureType + * **/ + private Integer featureType; + + /** + * 授权策略类型,允许为空 1-平台授权型 2-客户授权型 3-免授权型 + * 参考DelegatedType + **/ + private Integer delegatedType; + + /** + * 权限点所属工作台 + * **/ + private String terminal; + + /** + * 父级权限点ID + * **/ + private Long parentId; + + /** + * path左匹配 + * **/ + private String likePath; + + /** 权限点ID列表 **/ + private List ids; +} + diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointMoveRequest.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointMoveRequest.java new file mode 100644 index 00000000..c1df001b --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointMoveRequest.java @@ -0,0 +1,30 @@ +package cn.axzo.tyr.client.model.permission; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 权限点移动请求 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/12 15:45 + */ +@Data +public class PermissionPointMoveRequest { + + /** 权限点ID **/ + @NotNull(message = "权限点ID不能为空") + private Long permissionId; + + /** 父级节点ID - 可为空-则parent为工作台 **/ + private Long parentId = 0L; + + /** 排序sort **/ + @NotNull(message = "权限点排序不能为空") + private Integer sort; + + /** 操作人 **/ + private Long updaterId; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointTreeNode.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointTreeNode.java new file mode 100644 index 00000000..067a636e --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointTreeNode.java @@ -0,0 +1,193 @@ +package cn.axzo.tyr.client.model.permission; + +import cn.axzo.basics.common.model.IBaseTree; +import cn.axzo.framework.domain.ServiceException; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +/** + * 权限点树形节点 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/5 15:20 + */ +@Data +public class PermissionPointTreeNode implements IBaseTree { + /** 权限点ID **/ + private Long permissionPointId; + + /** 父级节点ID **/ + private Long parentId; + + /** 权限点名称 **/ + private String permissionName; + + /** 权限code **/ + private String code; + + /** 排序 **/ + private Integer sort; + + /** 所属端 **/ + private String terminal; + + /** 权限点层级path **/ + private String path; + + /** + * 元素类别 0.菜单 1.页面 3按钮 + */ + private Integer featureType; + + /** 元素类别描述 - 对应featureType **/ + private String featureTypeDesc; + + /** + * 授权策略类型,允许为空 1-平台授权型 2-客户授权型 3-免授权型 + */ + private Integer delegatedType; + + /** 图标 **/ + private String icon; + + /** 页面路由地址 **/ + private String linkUrl; + + /** 链接类型 1-PC 2-小程序 4-原生 **/ + private String linkType; + + /** 扩展字段 **/ + private String linkExt; + + /** 小程序ID **/ + private String microAppItemId; + + /** + * 网关专属字段,所属应用 + */ + private String appName; + + /** + * 网关专属字段 ,功能URL,对应后端接口url + */ + private String featureUrl; + + /** + * 创建人id + */ + private Long createBy; + + /** + * 创建时间 + */ + private LocalDateTime createAt; + + /** + * 更新时间 + */ + private LocalDateTime updateAt; + + /** + * 修改人id + */ + private Long updateBy; + + private String legacyLayout; + + + /** + * 0:查看 1:操作 + */ + private Integer operateType; + + + /** + * 适用单位类型 1:总包 2:建设单位 4:监理单位 8:劳务分包 16:专业分包 32-班组 + */ + private List fitOuTypeList; + + /** + * 适用节点类型 1:部门 2:班组 4:小组 + */ + private List fitOuNodeTypeList; + + /** + * 是否认证 0:无需要认证 1:需要认证 + */ + private Boolean needCert; + + /** + * 是否授权 0:无需要授权 1:需要授权 + */ + private Boolean needAuth; + + + /** 业务编码 **/ + private String businessNo; + + /** + * 父级业务id + */ + private String parentBusinessNo; + + /** 下级节点 **/ + private List children; + + + @JsonIgnore + @Override + public Long getNodeCode() { + return permissionPointId; + } + + @JsonIgnore + @Override + public Long getParentNodeCode() { + return parentId; + } + + @JsonIgnore + @Override + public List getNodeChildren() { + return children; + } + + @JsonIgnore + @Override + public void setNodeChildren(List nodeChildren) { + this.children = nodeChildren; + } + /** + * 将树型结构平铺展示。会将当前节点也添加到children中 + */ + public void flatChildren() { + if (CollectionUtil.isNotEmpty(children)) { + this.children = getNode(new ArrayList<>(),children, 10); + } + } + + private List getNode(List rootList,List list,Integer maxDepth) { + if (maxDepth < 1) { + throw new ServiceException("超过最大递归深度,可能发生死循环"); + } + if (CollectionUtil.isEmpty(list)) { + return rootList; + } + list.stream().forEach(e -> { + getNode(rootList, e.getChildren(), maxDepth - 1); + e.setChildren(null); + } ); + + rootList.addAll(list); + + + return rootList; + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointTreeQueryReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointTreeQueryReq.java new file mode 100644 index 00000000..d9e3ffc5 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointTreeQueryReq.java @@ -0,0 +1,44 @@ +package cn.axzo.tyr.client.model.permission; + +import lombok.Data; + +import java.util.List; +import java.util.Set; + +/** + * 权限点树形查询请求参数 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/5 15:12 + */ +@Data +public class PermissionPointTreeQueryReq { + + /** 授权策略 0-全部 1-平台授权型 2-客户授权型 3-免授权型**/ + private Integer delegateType = 0; + + /** 搜索关键字 - 名称模糊搜索 **/ + private String keyword; + + /** 权限点父级ID - 用于查询子节点 **/ + private Long parentId; + + /** 权限点所属工作台 **/ + private List terminalList; + + /** 权限点ID列表 **/ + private Set ids; + + /** 权限点terminal对应workspaceType **/ + private List workspaceType; + + /** + * 过滤层级-包含顶层两级 + * 1-工作台类型 2-工作台 + * **/ + private Integer maxLevel; + + /** featureType 层级过滤-过滤掉featureType大于该值的数据 **/ + private Integer maxFeatureType; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointVO.java new file mode 100644 index 00000000..201f684d --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/permission/PermissionPointVO.java @@ -0,0 +1,201 @@ +package cn.axzo.tyr.client.model.permission; + +import cn.hutool.core.math.BitStatusUtil; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +/** + * 权限点展示对象 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/5 15:50 + */ +@Data +public class PermissionPointVO { + + /** + * 权限点id + */ + private Long id; + + /** + * 权限点名称 + */ + private String featureName; + + /** + * 元素code + */ + private String featureCode; + + /** + * 菜单icon + */ + private String icon; + + /** + * 父级权限点id + */ + private Long parentId; + + /** 父级权限点名称 **/ + private String parentName; + /** + * 父级元素类别 0.菜单 1.页面 3按钮 + * **/ + private Integer parentFeatureType; + + /** 父级元素类别描述 **/ + private String parentFeatureTypeDes; + + + /** + * 页面路由 + */ + private String linkUrl; + + /** + * 适用终端 1:PC 2:UNI 4:APP + */ + private Integer linkType; + + /** + * 扩展字段 - APP适配参数 + */ + private String linkExt; + + /** + * 小程序AppID + */ + private String microAppItemId; + + /** + * 权限点层级path + */ + private String path; + + /** 层级名称 顶级-……-当前节点 **/ + private List pathName; + + /** + * 排序 + */ + private Integer sort; + + /** + * 菜单适用工作台 + */ + private String terminal; + + /** + * 元素类别 0.模块 1.菜单 2页面 3按钮 + */ + private Integer featureType; + + /** + * 元素类别描述 + * **/ + private String featureTypeDesc; + + + /** + * 创建人id + */ + private Long createBy; + + /** + * 创建时间 + */ + private LocalDateTime createAt; + + /** + * 更新时间 + */ + private LocalDateTime updateAt; + + /** + * 修改人id + */ + private Long updateBy; + + + /** + * 适用单位类型 1:总包 2:建设单位 4:监理单位 8:劳务分包 16:专业分包 32-班组 + */ + private List fitOuTypeList; + + /** + * 适用节点类型 1:部门 2:班组 4:小组 + */ + private List fitOuNodeTypeList; + + /** + * 所属应用 + */ + private String appName; + + /** + * 功能URL + */ + private String featureUrl; + + /** + * 是否认证 0:无需要认证 1:需要认证 + */ + private Boolean needCert; + + /** + * 是否授权 0:无需要授权 1:需要授权 + */ + private Boolean needAuth; + + /** + * 授权策略类型,允许为空 1-平台授权型 2-客户授权型 3-免授权型 + */ + private Integer delegatedType; + + /** 授权策略类型描述 **/ + private String delegatedTypeDesc; + + public void applyFitOuTypeBit(long fitOuTypeBit) { + //这个最值需要处理 + if (fitOuTypeBit > 63L) { + fitOuTypeBit = 63L; + } + long mask = 1L; + ArrayList list = new ArrayList<>(); + while (mask <= 32) { + long bitValue = fitOuTypeBit & mask; + if (bitValue != 0) { + list.add(bitValue); + } + mask = mask << 1; + } + this.fitOuTypeList = list; + } + + public void applyFitOuNodeTypeBit(long fitOuNodeTypeBit) { + //这个最值需要处理 + if (fitOuNodeTypeBit > 7L) { + fitOuNodeTypeBit = 7L; + } + long mask = 1L; + ArrayList list = new ArrayList<>(); + while (mask <= 32) { + long bitValue = fitOuNodeTypeBit & mask; + if (bitValue != 0) { + list.add(bitValue); + } + mask = mask << 1; + } + this.fitOuNodeTypeList = list; + } + + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductAddReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductAddReq.java new file mode 100644 index 00000000..9dae9962 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductAddReq.java @@ -0,0 +1,48 @@ +package cn.axzo.tyr.client.model.product; + +import lombok.Data; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 产品新增模型 + * + * @author wangli + * @since 2023/9/6 15:13 + */ +@Data +@Accessors(chain = true) +public class ProductAddReq { + + /** + * 产品名称 + */ + @NotBlank(message = "产品名称不能为空") + @Length(max = 35, message = "产品名称长度不能超过 35 个字符") + private String productName; + + /** + * 产品图标 + */ + @NotBlank(message = "产品图标不能为空") + private String icon; + + /** + * 产品所属工作台类型 + */ + @NotNull(message = "工作台类型不能为空") + private Long dictWorkspaceTypeId; + + /** + * 产品所属工作台类型 + */ + private String dictWorkspaceTypeCode; + + /** + * 上下架状态 1:上架, 0:下架 + */ + private Integer status; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationSearchReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationSearchReq.java new file mode 100644 index 00000000..169ba66b --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationSearchReq.java @@ -0,0 +1,37 @@ +package cn.axzo.tyr.client.model.product; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; + +/** + * 产品与权限点搜索入参模型 + * + * @author wangli + * @since 2023/9/6 15:48 + */ +@Data +@Accessors(chain = true) +public class ProductFeatureRelationSearchReq { + + /** + * 产品 ID + */ + @NotNull(message = "产品 ID 不能为空") + private Long productModuleId; + + /** + * 字典第三级 Code ID + */ + private Long dictCodeId; + + /** + * 字典的 code + */ + private String dictCode; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationUpdateReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationUpdateReq.java new file mode 100644 index 00000000..6ed6fa36 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationUpdateReq.java @@ -0,0 +1,44 @@ +package cn.axzo.tyr.client.model.product; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; + +/** + * 产品与权限点关系修改入参模型 + * + * @author wangli + * @since 2023/9/7 18:53 + */ +@Data +@Accessors(chain = true) +public class ProductFeatureRelationUpdateReq { + + /** + * 产品 ID + */ + @NotNull(message = "产品 ID 不能为空") + private Long productModuleId; + + /** + * 字典第三级 Code ID(OuType) + */ + @NotNull(message = "字典 ouType ID 不能为空") + private Long dictCodeId; + + /** + * 字典的 code + */ + private String dictCode; + + /** + * 权限点 ID + */ + private List featureIds = new ArrayList<>(); +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationVO.java new file mode 100644 index 00000000..4e6d76fe --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductFeatureRelationVO.java @@ -0,0 +1,38 @@ +package cn.axzo.tyr.client.model.product; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 产品与权限点的关联关系响应模型 + * + * @author wangli + * @since 2023/9/6 15:44 + */ +@Data +@Accessors(chain = true) +public class ProductFeatureRelationVO { + + /** + * 关系表主键 ID + */ + private Long id; + + /** + * 所属产品 ID + */ + private Long productModuleId; + + /** + * 企业字典 ID + */ + private Long dictCodeId; + + /** + * 权限点 ID + */ + private Long featureId; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductSearchListReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductSearchListReq.java new file mode 100644 index 00000000..28e609cc --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductSearchListReq.java @@ -0,0 +1,40 @@ +package cn.axzo.tyr.client.model.product; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 产品分页搜索 + * + * @author wangli + * @since 2023/9/6 14:58 + */ +@Data +@Accessors(chain = true) +public class ProductSearchListReq{ + /** + * 产品 ID 集合 + */ + private List ids; + /** + * 产品名称 + */ + private String name; + + /** + * 工作台类型 + */ + private Long dictWorkspaceTypeId; + + /** + * 状态 + */ + private Integer status; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductSearchPageReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductSearchPageReq.java new file mode 100644 index 00000000..2451a09b --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductSearchPageReq.java @@ -0,0 +1,38 @@ +package cn.axzo.tyr.client.model.product; + + +import cn.axzo.core.domain.PageRequest; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 产品分页搜索 + * + * @author wangli + * @since 2023/9/6 14:58 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class ProductSearchPageReq extends PageRequest { + + /** + * 产品名称 + */ + private String name; + + /** + * 工作台类型 + */ + private Long dictWorkspaceTypeId; + + /** + * 状态 + */ + private Integer status; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductUpdateReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductUpdateReq.java new file mode 100644 index 00000000..73d9b7ea --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductUpdateReq.java @@ -0,0 +1,53 @@ +package cn.axzo.tyr.client.model.product; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 产品更新模型 + * + * @author wangli + * @since 2023/9/6 15:13 + */ +@Data +@Accessors(chain = true) +public class ProductUpdateReq { + /** + * 产品 ID + */ + @NotNull(message = "产品 ID 不能为空") + private Long id; + + /** + * 产品名称 + */ + private String productName; + + /** + * 产品图标 + */ + private String icon; + + /** + * 产品所属工作台类型 + */ + private Long dictWorkspaceTypeId; + + /** + * 产品所属工作台类型 Code + */ + private String dictWorkspaceTypeCode; + + /** + * 上下架状态 1:上架, 0:下架 + */ + private Integer status; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductVO.java new file mode 100644 index 00000000..0b8e3447 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/product/ProductVO.java @@ -0,0 +1,66 @@ +package cn.axzo.tyr.client.model.product; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 产品模型 + * + * @author wangli + * @since 2023/9/6 14:51 + */ +@Data +@Accessors(chain = true) +public class ProductVO { + + /** + * 产品 ID + */ + private Long id; + + /** + * 产品名称 + */ + private String productName; + + /** + * 产品图标 + */ + private String icon; + + /** + * 产品所属工作台类型 + */ + private Long dictWorkspaceTypeId; + + /** + * 产品所属工作台类型code + */ + private String dictWorkspaceTypeCode; + + /** + * 产品所属工作类型名称 + */ + private String dictWorkspaceTypeDesc; + + /** + * 上下架状态 1:上架, 0:下架 + */ + private Integer status; + + /** + * 创建时间 + */ + private Date createAt; + + /** + * 更新时间 + */ + private Date updateAt; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QueryByIdentityIdTypeReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QueryByIdentityIdTypeReq.java new file mode 100644 index 00000000..e5f04f63 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QueryByIdentityIdTypeReq.java @@ -0,0 +1,22 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@EqualsAndHashCode +public class QueryByIdentityIdTypeReq { + + Long identityId; + + /** + * 身份类型 1:工人 2:班组长 3:从业人员 4:监管人员 5:运营人员 + */ + Integer identityType; + + Long workspaceId; + + Long ouId; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasPermissionGroupReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasPermissionGroupReq.java new file mode 100644 index 00000000..99ae315a --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasPermissionGroupReq.java @@ -0,0 +1,73 @@ +package cn.axzo.tyr.client.model.req; + + +import cn.axzo.basics.common.page.PageRequest; +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; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class QuerySaasPermissionGroupReq extends PageRequest { + + /** + * 角色id + */ + @NotEmpty(message = "角色id必填") + private List roleIds; + + /** + * 权限组id + */ + private List ids; + + /** + * 权限集名称 + */ + private String name; + + /** + * 是否为通用权限集 1:是 0:否 + */ + private Integer isCommon; + + /** + * 工作台id(过滤权限集作用范围) + */ + private List workspaceId; + + /** + * 单位id(过滤权限集作用范围) + */ + private List ouId; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 权限集类型:feature data + */ + private String type; + + /** + * true 查询分页 + * false 查询list 全部 + */ + @NotNull + @Builder.Default + private Boolean fetchPage = Boolean.TRUE; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleGroupReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleGroupReq.java new file mode 100644 index 00000000..e6309e29 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleGroupReq.java @@ -0,0 +1,42 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class QuerySaasRoleGroupReq { + + private List ids; + + /** + * 项目部id(不传或者传-1查询的是标准分组) + */ + private List workspaceIds; + + /** + * 单位id(不传或者传-1查询的是标准分组) + */ + private List ouIds; + + /** + * 工作台类型字典code + */ + private List workspaceTypeCode; + + /** + * 单位类型字典code + */ + private List ouTypeCode; + + /** + * 被那些角色使用到的分组 + */ + private List roleIds; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java new file mode 100644 index 00000000..56e2ce54 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/QuerySaasRoleReq.java @@ -0,0 +1,57 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class QuerySaasRoleReq { + + /** + * 角色id + */ + private List ids; + + /** + * 角色类型:common 自定义角色 admin管理员 init标准角色 + */ + private List roleType; + + /** + * 工作台类型编码 + */ + private List workspaceTypeCode; + + /** + * 单位类型编码 + */ + private List ouTypeCode; + + /** + * 工作台id(过滤权限集作用范围) + */ + private List workspaceId; + + /** + * 单位id(过滤权限集作用范围) + */ + private List ouId; + + /** + * 分组id + */ + private List sassRoleGroupIds; + + private Integer isCommon; + + /** + * 是否包含权限集(如果不需要则不执行后续查询链路) + */ + private Boolean includePermissionGroup; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/IsSuperAdminRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/IsSuperAdminRes.java new file mode 100644 index 00000000..d0f0f069 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/IsSuperAdminRes.java @@ -0,0 +1,26 @@ +package cn.axzo.tyr.client.model.res; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class IsSuperAdminRes { + + Long identityId; + + /** + * 身份类型 1:工人 2:班组长 3:从业人员 4:监管人员 5:运营人员 + */ + Integer identityType; + + Long workspaceId; + + Long ouId; + + Boolean isSuperAdmin; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/QueryBatchByIdentityIdTypeRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/QueryBatchByIdentityIdTypeRes.java new file mode 100644 index 00000000..a1632fc9 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/QueryBatchByIdentityIdTypeRes.java @@ -0,0 +1,31 @@ +package cn.axzo.tyr.client.model.res; + +import cn.axzo.tyr.client.model.vo.SaasRoleVO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class QueryBatchByIdentityIdTypeRes { + + Long identityId; + + /** + * 身份类型 1:工人 2:班组长 3:从业人员 4:监管人员 5:运营人员 + */ + Integer identityType; + + Long workspaceId; + + Long ouId; + + List role; + + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserRelationDTO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserRelationDTO.java new file mode 100644 index 00000000..e5174227 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/dto/SaasRoleUserRelationDTO.java @@ -0,0 +1,71 @@ +package cn.axzo.tyr.client.model.roleuser.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author haiyangjin + * @date 2023/9/14 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SaasRoleUserRelationDTO { + /** + * 主键ID + */ + private Long id; + + /** + * 身份Id + */ + private Long identityId; + + /** + * 身份类型 1:工人 2:从业人员 3:班组长 4:运营人员 5:政务人员 + */ + private Integer identityType; + + /** + * 角色Id + */ + private Long roleId; + + /** + * 自然人Id + */ + private Long naturalPersonId; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 所属单位Id 用户在当前工作台的所属单位 + */ + private Long ouId; + + /** + * 工作台Id + */ + private Long workspaceId; + + /** + * 资源类型 + */ + private Integer resourceType; + + /** + * 资源Id + */ + private Long resourceId; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/DeleteRoleUserParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/DeleteRoleUserParam.java new file mode 100644 index 00000000..64d9b6f2 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/DeleteRoleUserParam.java @@ -0,0 +1,40 @@ +package cn.axzo.tyr.client.model.roleuser.req; + +import cn.axzo.tyr.client.model.enums.IdentityType; +import lombok.*; + +import javax.validation.constraints.NotNull; + +/** + * @author haiyangjin + * @date 2023/9/15 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DeleteRoleUserParam { + /** + * 工作台id + */ + @NotNull(message = "工作台id不能为空") + private Long workspaceId; + + /** + * 单位id : 非必填 + */ + @NotNull(message = "单位id不能为空") + private Long ouId; + + /** + * 被赋予角色的人的身份id + */ + @NotNull(message = "身份id不能为空") + private Long identityId; + + /** + * 必填 + */ + @NotNull(message = "身份类型不能为空") + private IdentityType identityType; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/RoleUserParam.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/RoleUserParam.java new file mode 100644 index 00000000..00626fe6 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/RoleUserParam.java @@ -0,0 +1,53 @@ +package cn.axzo.tyr.client.model.roleuser.req; + +import cn.axzo.tyr.client.model.enums.IdentityType; +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.Set; + +/** + * @author haiyangjin + * @date 2023/9/14 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RoleUserParam { + /** + * 工作台id + */ + private Long workspaceId; + + /** + * 单位id + */ + private Long ouId; + + + /** + * personId + */ + private Long personId; + + /** + * 身份id + * 传身份id的时候请带上身份类型。 身份id会重复 + */ + private Long identityId; + + /** + * 身份类型 + */ + private IdentityType identityType; + + /** + * role ids + */ + private Set roleIds; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/RoleUserReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/RoleUserReq.java new file mode 100644 index 00000000..8fae1cde --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/roleuser/req/RoleUserReq.java @@ -0,0 +1,57 @@ +package cn.axzo.tyr.client.model.roleuser.req; + +import cn.axzo.tyr.client.model.enums.IdentityType; +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; +import java.util.Set; + + +/** + * @author tanjie@axzo.cn + * @date 2023/9/13 15:38 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RoleUserReq { + + /** + * 工作台id + */ + @NotNull + private Long workspaceId; + + /** + * 单位id + */ + @NotNull + private Long ouId; + + + private Long personId; + /** + * 身份id + */ + @NotNull + private Long identityId; + + /** + * 身份类型 + */ + @NotNull + private IdentityType identityType; + + /** + * 完整的update,所有RoleId都被更新 + */ + @NotEmpty + private Set updateRoleIds; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/DeletePermissionGroupVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/DeletePermissionGroupVO.java new file mode 100644 index 00000000..edbe49c9 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/DeletePermissionGroupVO.java @@ -0,0 +1,27 @@ +package cn.axzo.tyr.client.model.vo; + +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; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class DeletePermissionGroupVO { + @NotNull + private Long roleId; + + @NotEmpty + private List specialPermissionGroupIds; + + @NotNull + private Long operatorId; + + private String operatorName; +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasPermissionGroupVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasPermissionGroupVO.java new file mode 100644 index 00000000..9c95c5e2 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasPermissionGroupVO.java @@ -0,0 +1,72 @@ +package cn.axzo.tyr.client.model.vo; + +import cn.axzo.tyr.client.model.permission.PermissionPointTreeNode; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class SaasPermissionGroupVO { + + private Long id; + + /** + * 权限集名称 + */ + private String name; + + private Date createAt; + + private Date updateAt; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建者姓名 + */ + private String creatorName; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 更新者姓名 + */ + private String updatorName; + + /** + * 权限集类型:feature data + */ + private String type; + + /** + * 是否为通用权限集 1:是 0:否 + */ + private Integer isCommon; + /** + * 权限集对应的角色 + */ + private Long roleId; + /** + * 权限 + */ + private List feature; + + /** + * 权限范围 + */ + private List scopes; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleGroupVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleGroupVO.java new file mode 100644 index 00000000..d309d788 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleGroupVO.java @@ -0,0 +1,62 @@ +package cn.axzo.tyr.client.model.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.util.Date; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class SaasRoleGroupVO { + + private Long id; + + /** + * 工作台类型字典code + */ + @NotBlank + private String workspaceTypeCode; + + /** + * 单位类型字典code + */ + private List ouTypeCode; + + /** + * 名称 + */ + private String name; + + /** + * 角色 + * 如果查询时候指定了roleIds,返回的roleIds <= 请求的roleIds + * 如果查询时候没有指定roleIds, 返回roleId 等于 该分组对应的所有的角色id + */ + private List roleIds; + + /** + * 工作台id(自定义时传入) + */ + private Long workspaceId; + + /** + * 单位id(自定义时传入) + */ + private Long ouId; + + /** + * 排序 + */ + private Integer sort; + + private Date createAt; + + private Date updateAt; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRolePermissionScopeVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRolePermissionScopeVO.java new file mode 100644 index 00000000..283cec37 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRolePermissionScopeVO.java @@ -0,0 +1,34 @@ +package cn.axzo.tyr.client.model.vo; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class SaasRolePermissionScopeVO { + + private Long id; + + private Long pgroupId; + + /** + * 选择类型: 1.正选 2.反选 + */ + private Integer type; + + /** + * 作用范围类型: workspace ou + */ + private String scopeType; + + /** + * 作用范围id(workspace_id/ou_id) + */ + private Long scopeId; + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleVO.java new file mode 100644 index 00000000..ac4a41f9 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaasRoleVO.java @@ -0,0 +1,141 @@ +package cn.axzo.tyr.client.model.vo; + +import cn.axzo.trade.datasecurity.core.annotation.control.DisableCrypt; +import cn.axzo.tyr.client.model.permission.PermissionPointTreeNode; +import cn.hutool.core.collection.CollectionUtil; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class SaasRoleVO { + + private Long id; + + /** + * 角色名称 + */ + private String name; + + /** + * 角色类型: init 标准 common 自定义角色 admin管理员 super_admin 超管 + */ + private String roleType; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 权限组 + */ + private List permissionGroup; + + /** + * 是否删除 + */ + private Long isDelete; + + private Date createAt; + + private Date updateAt; + + /** + * 获取角色对应所用的菜单,不管例外 + * + * @return + */ + public List getFeature() { + return this.permissionGroup.stream().map(SaasPermissionGroupVO::getFeature).flatMap(List::stream).distinct().collect(Collectors.toList()); + } + + /** + * 获取角色基于单位ID和工作台ID所匹配的所以菜单(包括通用和例外) + * @param workspaceId + * @param ouId + * @return + */ + public List getMatchFeature (Long workspaceId, Long ouId) { + Set permissionPoint = new HashSet<>(); + //例外 + group: + for (SaasPermissionGroupVO permissionGroupVO : permissionGroup) { + // 通用权限 + if (CollectionUtil.isEmpty(permissionGroupVO.getScopes())) { + permissionPoint.addAll(permissionGroupVO.getFeature()); + continue; + } + List scopes = permissionGroupVO.getScopes(); + + scope: + for (SaasRolePermissionScopeVO scope : scopes) { + //正选 + if (Objects.equals(scope.getType(), 1)) { + + // 判断是否与当前工作台或者单位ID匹配 + if (scope.getScopeType().equals("workspace") + && match(true, permissionPoint, permissionGroupVO.getFeature(), scope.getScopeId(), workspaceId)) { + continue group; + } + + if (scope.getScopeType().equals("ou") + && match(true, permissionPoint, permissionGroupVO.getFeature(), scope.getScopeId(), ouId) + ) { + continue group; + } + + //反选 + } else if (Objects.equals(scope.getType(), 2)) { + + // 判断是否与当前工作台或者单位ID匹配 + if (scope.getScopeType().equals("workspace") + && match(false, permissionPoint, permissionGroupVO.getFeature(), scope.getScopeId(), workspaceId) + /* && !Objects.equals(scope.getScopeId(), workspaceId) + && permissionPoint.addAll(permissionGroupVO.getFeature())*/) { + continue group; + } + + if (scope.getScopeType().equals("ou") + && match(false, permissionPoint, permissionGroupVO.getFeature(), scope.getScopeId(), ouId) + /* && !Objects.equals(scope.getScopeId(), ouId) + && permissionPoint.addAll(permissionGroupVO.getFeature())*/) { + continue group; + } + } + + } + + } + return new ArrayList<>((Collection) permissionPoint); + } + + private boolean match(boolean isMatch, Set source, Collection target, Long scopeId, Long workspaceId) { + if (isMatch && scopeId.equals(workspaceId)) { + source.addAll(target); + return true; + } else if (!isMatch && !Objects.equals(scopeId, workspaceId)) { + source.addAll(target); + return true; + } + return false; + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdatePermissionGroupVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdatePermissionGroupVO.java new file mode 100644 index 00000000..de5f234e --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdatePermissionGroupVO.java @@ -0,0 +1,62 @@ +package cn.axzo.tyr.client.model.vo; + +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +@Data +public class SaveOrUpdatePermissionGroupVO { + + /** + * 权限集id(例外) + */ + private Long id; + + @NotNull + private Long roleId; + /** + * 权限集名称 + */ + @NotBlank + private String name; + + private String description; + + @NotNull + private Long operatorId; + + private String operatorName; + + @NotNull + private String type; + + /** + * 已选择的项目部 + */ + @Valid + private List selectedWorkspace; + + /** + * 已选择的单位 + */ + @Valid + private List selectedOu; + + @Data + public static class PermissionGroupScopeVO { + /** + * 选择类型 1:正选(指定组织适用) 2:反选(指定组织不适用) + */ + @NotNull + private Integer type; + /** + * 作为范围id(workspaceId/ouId) + */ + @NotNull + private Long scopeId; + } + +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java new file mode 100644 index 00000000..f8515d9f --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SaveOrUpdateRoleVO.java @@ -0,0 +1,79 @@ +package cn.axzo.tyr.client.model.vo; + +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +@Data +public class SaveOrUpdateRoleVO { + + /** + * 角色id(编辑时有效) + */ + private Long id; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + private String name; + + private String description; + + /** + * 角色类型:init 业务角色 admin管理员 common 自定义 + */ + @NotBlank(message = "角色类型不能为空") + private String roleType; + + private Long workspaceId; + + private Integer workspaceType; + + private Long ownerOuId; + + private Long operatorId; + + private String operatorName; + /** + * 角色分组 + */ + @NotEmpty + @Valid + private List groupTree; + + private String permissionGroupName; + + private String permissionGroupDescription; + + /** + * 权限集类型:feature data + */ + private String permissionGroupType; + + /** + * 选中的权限点id + */ + @NotNull + private List selectedPPIds; + + @Data + public static class GroupInfoVO { + + /** + * 角色分组id + */ + @NotNull + private Long id; + + /** + * 项目部类型字典code + */ + @NotNull + private String workspaceTypeCode; + } +} diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SavePermissionGroupPPVO.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SavePermissionGroupPPVO.java new file mode 100644 index 00000000..220810f0 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/vo/SavePermissionGroupPPVO.java @@ -0,0 +1,28 @@ +package cn.axzo.tyr.client.model.vo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@Data +public class SavePermissionGroupPPVO { + + /** + * 权限集id + */ + @NotNull + private Long id; + + /** + * 创建者 + */ + @NotNull + private Long operatorId; + + /** + * 选中的权限id + */ + private List selectedPPIds; + +} diff --git a/tyr-api/src/test/java/cn/axzo/maven/archetype/client/AppTest.java b/tyr-api/src/test/java/cn/axzo/maven/archetype/client/AppTest.java deleted file mode 100644 index 7d836fa0..00000000 --- a/tyr-api/src/test/java/cn/axzo/maven/archetype/client/AppTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.axzo.maven.archetype.client; - -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -/** - * Unit test for simple App. - */ -@RunWith(SpringRunner.class) -@SpringBootTest -public class AppTest { - -} diff --git a/tyr-server/pom.xml b/tyr-server/pom.xml index 27a641c1..20ab0ca7 100644 --- a/tyr-server/pom.xml +++ b/tyr-server/pom.xml @@ -3,7 +3,7 @@ tyr cn.axzo.tyr - 1.0.0-SNAPSHOT + ${revision} ../pom.xml 4.0.0 @@ -13,7 +13,20 @@ tyr-server + + + true + true + + + + + cn.axzo.tyr + tyr-api + ${project.version} + + cn.axzo.framework axzo-web-spring-boot-starter @@ -30,25 +43,44 @@ cn.axzo.framework axzo-processor-spring-boot-starter - + mysql + mysql-connector-java + + + - - cn.axzo.framework - axzo-swagger-yapi-spring-boot-starter - + --> - + cn.axzo.framework axzo-logger-spring-boot-starter + + cn.axzo.pokonyan + pokonyan + + + cn.axzo.basics + basics-common + + + com.xuxueli + xxl-job-core + + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java index dd5073f9..2b251373 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/TyrApplication.java @@ -1,13 +1,54 @@ package cn.axzo.tyr.server; +import cn.hutool.extra.spring.SpringUtil; +import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; +import cn.axzo.tyr.server.job.OMSRoleJobHandler; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.scheduling.annotation.EnableAsync; -@MapperScan(value = {"cn.axzo.**.mapper"}) -@SpringBootApplication +@Slf4j +@EnableAsync +@EnableDiscoveryClient +//@EnableFeignClients +@MapperScan(value = {"cn.axzo.tyr.server.repository.mapper"}) +@SpringBootApplication(scanBasePackages = "cn.axzo") public class TyrApplication { public static void main(String[] args) { - SpringApplication.run(TyrApplication.class, args); + ConfigurableApplicationContext run = SpringApplication.run(TyrApplication.class, args); + Environment env = run.getEnvironment(); + log.info( + "--------------------------------------------------------------------------------------------------------------------\n" + + "Application 【{}】 is running on 【{}】 environment!\n" + + "Api Local: \thttp://127.0.0.1:{}\n" + + "Mysql: \t{}\t username:{}\n" + + "Redis: \t{}:{}\t database:{}\n" + + "RabbitMQ: \t{}\t username:{}", + env.getProperty("spring.application.name"), + env.getProperty("spring.profiles.active"), + env.getProperty("server.port"), + env.getProperty("spring.datasource.url"), + env.getProperty("spring.datasource.username"), + env.getProperty("spring.redis.host"), + env.getProperty("spring.redis.port"), + env.getProperty("spring.redis.database"), + env.getProperty("spring.rabbitmq.addresses"), + env.getProperty("spring.rabbitmq.username") + + "\n----------------------------------------------------------"); + +// try { +// test(); +// } catch (Exception e) { +// e.printStackTrace(); +// } } + +// public static void test() throws Exception { +// OMSRoleJobHandler executor = SpringUtil.getBean(OMSRoleJobHandler.class); +// executor.execute(null); +// } } 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 new file mode 100644 index 00000000..077c006a --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/common/constants/PermissionConstant.java @@ -0,0 +1,21 @@ +package cn.axzo.tyr.server.common.constants; + +/** + * 权限相关常量 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/7 16:50 + */ +public class PermissionConstant { + + /** 权限点path分隔符 **/ + public static final String FEATURE_PATH_DELIMITER = "/"; + + /** 无父级的parent_business_no **/ + public static final String FEATURE_TOP_BIZ_NO = "0"; + /** 顶级path **/ + public static final String FEATURE_TOP_PATH = "/0/"; + /** 权限点business_no前缀 **/ + public static final String FEATURE_BIZ_NO_PREFIX = "feature"; +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/common/enums/ErrorCode.java b/tyr-server/src/main/java/cn/axzo/tyr/server/common/enums/ErrorCode.java deleted file mode 100644 index 7fa875f9..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/common/enums/ErrorCode.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.axzo.tyr.server.common.enums; - -import cn.axzo.framework.domain.web.code.IProjectRespCode; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @Author: liyong.tian - * @Date: 2022/9/5 - * @Description: 响应码规范:一共8位,取值范围0~9,3位项目编号(首位不能为0)+2位模块编号+3位自定义编号 - */ -@Getter -@AllArgsConstructor -public enum ErrorCode implements IProjectRespCode { - - USER_NOT_EXISTS("01001", "用户不存在,id=%s"), - USER_PHONE_EMAIL_IS_NULL("01002", "电话和邮箱不能都为空"); - - private String code; - private String message; - - @Override - public String getProjectCode() { - // 根据不同项目进行项目编码调整,可联系框架组获取项目编号(首位不能为0) - return "100"; - } -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/common/enums/ResultCode.java b/tyr-server/src/main/java/cn/axzo/tyr/server/common/enums/ResultCode.java deleted file mode 100644 index e96ef1be..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/common/enums/ResultCode.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.axzo.tyr.server.common.enums; - -/** - * @Author: liyong.tian - * @Date: 2022/9/5 - * @Description: - */ -public enum ResultCode { - /** - * 成功 [GET] - */ - SUCCESS(200), - /** - * [POST/PUT/PATCH] 用户新建或修改数据成功 - */ - CREATED(201), - /** - * [*] 标识一个请求已经进入后台排队 (异步任务) - */ - ACCEPTED(202), - /** - * [DELETE]: 用户删除数据成功 - */ - NO_CONTENT(204), - /** - * [POST/PUT/PATCH] 用户发出的请求有错误, 服务器没有进行新建或修改数据的操作, 该操作是幂等的. - */ - FAIL(400), - /** - * [*] 标识没有权限 (令牌、用户名、密码错误) - */ - UNAUTHORIZED(401), - /** - * [*] 标识用户得到授权(与401错误相对), 但是访问是被禁止的 - */ - FORBIDDEN(403), - /** - * [*] 用户发出的请求针对的是不存在的记录, 服务器没有进行操作 - */ - NOT_FOUND(404), - /** - * [GET] 用户请求的格式不可得 (比如用户请求JSON格式, 但是只有XML格式) - */ - NOT_ACCEPTABLE(406), - /** - * [GET] 用户请求的资源被永久删除, 且不会再得到 - */ - GONE(410), - /** - * [POST/PUT/PATCH] 当创建一个对象时, 发生一个验证错误646 - */ - UNPROCESSABLE_ENTITY(422), - /** - * 服务器内部错误 - */ - INTERNAL_SERVER_ERROR(9999), - /** - * 通用业务异常 - */ - SERVICE_EXCEPTION_ERROR(9998), - - /** - * ####业务的响应码#### - * 按业务依次划分 : - * 一共6位, 第6位是业务代码 第1-5位响应码, 按业务不同码不同 - * #100000 全局级别 - */ - - /** - * 100001 当前用户被强制下线 - */ - CUSTOM_100001(100001), - /** - * 确认弹窗响应码 - */ - CUSTOM_100002(100002); - - public int code; - - ResultCode(int code) { - this.code = code; - } - - public int getCode() { - return code; - } - -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/common/util/StreamUtil.java b/tyr-server/src/main/java/cn/axzo/tyr/server/common/util/StreamUtil.java new file mode 100644 index 00000000..6ea7edd8 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/common/util/StreamUtil.java @@ -0,0 +1,17 @@ +package cn.axzo.tyr.server.common.util; + +import java.util.Collection; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author tanjie@axzo.cn + * @date 2023/9/13 16:24 + */ +public class StreamUtil { + + public static List mapToList(Collection collection, Function function) { + return collection.stream().map(function).collect(Collectors.toList()); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/common/util/Throws.java b/tyr-server/src/main/java/cn/axzo/tyr/server/common/util/Throws.java new file mode 100644 index 00000000..b1f898c7 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/common/util/Throws.java @@ -0,0 +1,21 @@ +package cn.axzo.tyr.server.common.util; + +import cn.axzo.framework.core.enums.ErrorLevel; +import cn.axzo.framework.core.enums.ErrorType; +import cn.axzo.framework.domain.web.BizException; +import cn.axzo.framework.domain.web.code.IRespCode; + +/** + * 抛异常工具 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/12 11:25 + */ +public class Throws { + + /** 用于抛出请求参数类异常 - 避免msg丢失 **/ + public static BizException bizException(IRespCode code, String message) { + throw new BizException(ErrorLevel.P2, ErrorType.ERROR_BUSINESS, code, message); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/common/util/package-info.java b/tyr-server/src/main/java/cn/axzo/tyr/server/common/util/package-info.java deleted file mode 100644 index 1cd2c6fa..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/common/util/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.axzo.tyr.server.common.util; \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/XxlJobConfig.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/XxlJobConfig.java new file mode 100644 index 00000000..44dfeabc --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/XxlJobConfig.java @@ -0,0 +1,76 @@ +package cn.axzo.tyr.server.config; + +import cn.azxo.framework.common.logger.JobLoggerTemplate; +import cn.azxo.framework.common.service.JobParamResolver; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author xuxueli 2017-04-28 + */ +@Configuration +public class XxlJobConfig { + + Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + /** + * //@Value("http://dev-xxl-job.axzo.cn/xxl-job-admin") + */ + @Value("${xxl.job.admin.addresses}") + private String adminAddresses; + + @Value("${xxl.job.executor.appname}") + private String appName; + + @Value("") + private String ip; + + @Value("${xxl.job.executor.port}") + private int port; + + + /** + * // @Value("${xxl.job.accessToken}") + */ + @Value("") + private String accessToken; + + @Value("") + private String logPath; + + @Value("-1") + private int logRetentionDays; + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appName); + xxlJobSpringExecutor.setIp(ip); + xxlJobSpringExecutor.setPort(port); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); + + return xxlJobSpringExecutor; + } + + @Bean("jobParamResolver") + public JobParamResolver jobParamResolver(){ + return new JobParamResolver(); + } + + @Bean("jobLoggerTemplate") + public JobLoggerTemplate jobLoggerTemplate(){ + return new JobLoggerTemplate(); + } + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizExceptionResultHandler.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizExceptionResultHandler.java new file mode 100644 index 00000000..8c0e4837 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/BizExceptionResultHandler.java @@ -0,0 +1,33 @@ +package cn.axzo.tyr.server.config.exception; + +import cn.axzo.framework.autoconfigure.web.exception.RespErrorCodeMappingProperties; +import cn.axzo.framework.autoconfigure.web.exception.handler.AbstractExceptionApiResultHandler; +import cn.axzo.framework.domain.web.BizException; +import cn.axzo.framework.domain.web.code.IRespCode; +import cn.axzo.framework.domain.web.code.RespCode; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; + +/** + * 业务异常处理器 + * 避免返回http 500,造成封装多余的消息 + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/19 16:12 + */ +@Component +public class BizExceptionResultHandler extends AbstractExceptionApiResultHandler { + public BizExceptionResultHandler(RespErrorCodeMappingProperties properties) { + super(properties); + } + + @Override + protected IRespCode decode(BizException ex, IRespCode fallbackCode) { + return new RespCode(ex.getCode(), ex.getMessage()); + } + + @Override + protected HttpStatus mappingHttpStatus(String code, BizException ex) { + return HttpStatus.OK; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/ServiceExceptionResultHandler.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/ServiceExceptionResultHandler.java new file mode 100644 index 00000000..244828f6 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/exception/ServiceExceptionResultHandler.java @@ -0,0 +1,53 @@ +package cn.axzo.tyr.server.config.exception; + + +import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.framework.autoconfigure.web.exception.RespErrorCodeMappingProperties; +import cn.axzo.framework.autoconfigure.web.exception.handler.AbstractExceptionApiResultHandler; +import cn.axzo.framework.domain.web.code.IRespCode; +import cn.axzo.framework.domain.web.code.RespCode; +import cn.axzo.framework.domain.web.result.ApiResult; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import java.util.Set; + +/** + * 目前整体框架中 ServiceException 有多种,而常用的 {@link cn.axzo.basics.common.util.AssertUtil} 抛出的是 {@link cn.axzo.basics.common.exception.ServiceException} + * 与框架默认的异常处理器不兼容,所以新增加一个处理该异常的处理器 + * + * @author wangli + * @since 2023/9/11 11:39 + */ +@Component +public class ServiceExceptionResultHandler extends AbstractExceptionApiResultHandler { + public ServiceExceptionResultHandler(RespErrorCodeMappingProperties properties) { + super(properties); + } + + @Override + protected IRespCode decode(ServiceException error, IRespCode fallbackCode) { + return new RespCode(String.valueOf(error.getErrorCode()), error.getMessage()); + } + + @Override + protected HttpStatus mappingHttpStatus(String code, ServiceException ex) { + return HttpStatus.OK; + } + + @ExceptionHandler(ConstraintViolationException.class) + @ResponseBody + public ApiResult handleConstraintViolationException(ConstraintViolationException exception) { + Set> violations = exception.getConstraintViolations(); + StringBuilder builder = new StringBuilder(); + for (ConstraintViolation violation : violations) { + builder.append(violation.getMessage()); + break; + } + return ApiResult.err(builder.toString()); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/config/filter/HttpTraceLogFilter.java b/tyr-server/src/main/java/cn/axzo/tyr/server/config/filter/HttpTraceLogFilter.java index d85f107a..bc42c1b4 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/config/filter/HttpTraceLogFilter.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/config/filter/HttpTraceLogFilter.java @@ -39,7 +39,7 @@ import java.util.*; * @Description: Http接口日志记录 */ @Slf4j -@Component +//@Component public class HttpTraceLogFilter extends OncePerRequestFilter implements Ordered { private static final String X_REQUEST_ID = "x-request-id"; @@ -256,4 +256,4 @@ public class HttpTraceLogFilter extends OncePerRequestFilter implements Ordered } } } -} \ No newline at end of file +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/consumer/package-info.java b/tyr-server/src/main/java/cn/axzo/tyr/server/consumer/package-info.java deleted file mode 100644 index eb001a5e..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/consumer/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.axzo.tyr.server.consumer; \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/app/package-info.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/app/package-info.java index 49e38f03..e69de29b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/app/package-info.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/app/package-info.java @@ -1 +0,0 @@ -package cn.axzo.tyr.server.controller.app; \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/dict/SaasBasicDictController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/dict/SaasBasicDictController.java new file mode 100644 index 00000000..d08cc647 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/dict/SaasBasicDictController.java @@ -0,0 +1,64 @@ +package cn.axzo.tyr.server.controller.dict; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.feign.SaasBasicDictApi; +import cn.axzo.tyr.client.model.dict.request.*; +import cn.axzo.tyr.client.model.dict.response.BasicDictNodeResp; +import cn.axzo.tyr.client.model.dict.response.BasicDictTreeResp; +import cn.axzo.tyr.server.service.SaasBasicDictService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author: chenwenjian + * @date: 2023/9/8 14:32 + * @description: 字典controller + * @modifiedBy: + * @version: 1.0 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class SaasBasicDictController implements SaasBasicDictApi { + + private final SaasBasicDictService saasBasicDictService; + + @Override + public ApiResult> getBasicDictNodeList(BasicDictQueryReq req) { + return ApiResult.ok(saasBasicDictService.getBasicDictNodeList(req)); + } + + @Override + public ApiResult> getBasicDictNodeTree(BasicDictQueryReq req) { + return ApiResult.ok(saasBasicDictService.getBasicDictNodeTree(req)); + } + + @Override + public ApiResult getBasicDictNode(BasicDictNodeReq req) { + return ApiResult.ok(saasBasicDictService.getBasicDictNode(req)); + } + + @Override + public ApiResult create(BasicDictCreateReq req) { + return ApiResult.ok(saasBasicDictService.create(req)); + } + + @Override + public ApiResult update(BasicDictUpdateReq req) { + return ApiResult.ok(saasBasicDictService.update(req)); + } + + @Override + public ApiResult updateStatus(BasicDictUpdateStatusReq req) { + return ApiResult.ok(saasBasicDictService.updateStauts(req)); + } + + @Override + public ApiResult get(Long id) { + return ApiResult.ok(saasBasicDictService.getById(id)); + } + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionPointController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionPointController.java new file mode 100644 index 00000000..f592485a --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/permission/PermissionPointController.java @@ -0,0 +1,71 @@ +package cn.axzo.tyr.server.controller.permission; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.feign.PermissionPointApi; +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.service.PermissionPointService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 权限点接口实现 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 14:55 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class PermissionPointController implements PermissionPointApi { + + private final PermissionPointService permissionPointService; + + @Override + public ApiResult> listTreeNodes(PermissionPointTreeQueryReq request) { + + //查询数据 + return ApiResult.ok(permissionPointService.listTreeNodes(request)); + } + + @Override + public ApiResult getDetail(Long permissionId) { + return ApiResult.ok(permissionPointService.getDetail(permissionId)); + } + + @Override + public ApiResult> listTreeNodesByIds(List permissionIds) { + return ApiResult.ok(permissionPointService.listNodesByIds(permissionIds)); + } + + @Override + public ApiResult savePermissionPoint(PermissionPointDTO dto) { + return ApiResult.ok(permissionPointService.save(dto)); + } + + @Override + public ApiResult> deletePermissionPoint(Long permissionId) { + return ApiResult.ok(permissionPointService.delete(permissionId)); + } + + + @Override + public ApiResult move(PermissionPointMoveRequest request) { + permissionPointService.move(request); + return ApiResult.ok(); + } + + @Override + public ApiResult> queryList(PermissionPointListQueryRequest request) { + return ApiResult.ok(permissionPointService.queryList(request)); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/product/ProductController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/product/ProductController.java new file mode 100644 index 00000000..c3ae5fb8 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/product/ProductController.java @@ -0,0 +1,127 @@ +package cn.axzo.tyr.server.controller.product; + +import cn.axzo.framework.domain.web.result.ApiPageResult; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.feign.ProductApi; +import cn.axzo.tyr.client.model.product.ProductAddReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO; +import cn.axzo.tyr.client.model.product.ProductSearchListReq; +import cn.axzo.tyr.client.model.product.ProductSearchPageReq; +import cn.axzo.tyr.client.model.product.ProductUpdateReq; +import cn.axzo.tyr.client.model.product.ProductVO; +import cn.axzo.tyr.server.service.ProductFeatureRelationService; +import cn.axzo.tyr.server.service.ProductService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 产品相关 API 实现 + * + * @author wangli + * @since 2023/9/7 14:05 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class ProductController implements ProductApi { + + private final ProductService productService; + private final ProductFeatureRelationService productFeatureRelationService; + /** + * 获取产品基础信息的列表 + * + * @param req {@link ProductSearchListReq} + * @return 如果没有查询到, 返回空集合, 集合内类型: {@link ProductVO} + */ + @Override + public ApiResult> list(ProductSearchListReq req) { + return productService.list(req); + } + + /** + * 获取产品基础信息的分页列表 + * + * @param req {@link ProductSearchPageReq} + * @return 如果没有查询, 返回 ApiPageResult.empty(), 携带分页信息,集合内类型: {@link ProductVO} + */ + @Override + public ApiPageResult page(ProductSearchPageReq req) { + return productService.page(req); + } + + /** + * 获取指定 ID 的产品基础信息 + * + * @param id 产品 ID + * @return {@link ProductVO} + */ + @Override + public ApiResult getById(Long id) { + return productService.getById(id); + } + + /** + * 新增产品基础信息 + * + * @param req {@link ProductAddReq} + * @return 返回当前新增产品基础信息 + */ + @Override + public ApiResult add(ProductAddReq req) { + return productService.add(req); + } + + /** + * 修改产品基础信息 + * + * @param req {@link ProductUpdateReq} + * @return 返回修改后的产品基础信息 + */ + @Override + public ApiResult update(ProductUpdateReq req) { + return productService.update(req); + } + + /** + * 删除指定 ID 的产品 + * + * @param id 产品 ID + * @return 返回被删除的产品信息 + */ + @Override + public ApiResult delete(Long id) { + return productService.delete(id); + } + + /** + * 返回指定产品和单位类型下所有已有权限点集合 + * + * @param req {@link ProductFeatureRelationSearchReq} + * @return 如果没有查询到, 返回空集合, 集合内类型: {@link ProductFeatureRelationVO} + */ + @Override + public ApiResult> featureList(ProductFeatureRelationSearchReq req) { + return productFeatureRelationService.featureList(req); + } + + /** + * 更新产品与权限点的关联关系 + * + * @param req {@link ProductFeatureRelationUpdateReq} + * @return + */ + @Override + public ApiResult updateFeatureRelation(List req) { + if(CollectionUtils.isEmpty(req)) { + return ApiResult.ok(false); + } + return productFeatureRelationService.updateFeatureRelation(req); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasPermissionGroupController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasPermissionGroupController.java new file mode 100644 index 00000000..aea17984 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasPermissionGroupController.java @@ -0,0 +1,82 @@ +package cn.axzo.tyr.server.controller.role; + + +import cn.axzo.basics.common.exception.ServiceException; +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.tyr.client.feign.SaasPermissionGroupApi; +import cn.axzo.tyr.client.model.req.QuerySaasPermissionGroupReq; +import cn.axzo.tyr.client.model.vo.DeletePermissionGroupVO; +import cn.axzo.tyr.client.model.vo.SaasPermissionGroupVO; +import cn.axzo.tyr.client.model.vo.SaveOrUpdatePermissionGroupVO; +import cn.axzo.tyr.client.model.vo.SavePermissionGroupPPVO; +import cn.axzo.tyr.server.repository.dao.SaasPermissionGroupDao; +import cn.axzo.tyr.server.repository.dao.SaasPermissionGroupScopeDao; +import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao; +import cn.axzo.tyr.server.service.PermissionGroupService; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class SaasPermissionGroupController implements SaasPermissionGroupApi { + + private final SaasPermissionGroupDao permissionGroupDao; + private final SaasPgroupPermissionRelationDao pgroupPermissionRelationDao; + private final SaasPermissionGroupScopeDao permissionGroupScopeDao; + private final PermissionGroupService permissionGroupService; + + @Override + public ApiResult saveOrUpdateSpecial(SaveOrUpdatePermissionGroupVO permissionGroup) { + return ApiResult.ok(permissionGroupService.saveOrUpdateSpecial(permissionGroup)); + } + + @Override + public ApiResult getById(Long id) { + PageResp pgPage = permissionGroupService.page(QuerySaasPermissionGroupReq.builder() + .fetchPage(Boolean.FALSE).ids(Lists.newArrayList(id)).build()); + List pGroups = pgPage.getList(); + if (CollectionUtils.isEmpty(pGroups)) { + throw new ServiceException("未查询到权限组信息"); + } + return ApiResult.ok(pGroups.get(0)); + } + + @Override + public ApiPageResult query(QuerySaasPermissionGroupReq req) { + return ApiPageResult.ok(permissionGroupService.page(req)); + } + + @Transactional + @Override + public ApiResult delete(List id) { + // 删除权限集 + permissionGroupDao.delete(id); + // 删除权限集权限关联关系 + pgroupPermissionRelationDao.deleteByPGroupId(id); + // 删除权限集作用范围 + permissionGroupScopeDao.deleteByPGroupId(id); + return ApiResult.ok(); + } + + @Override + public ApiResult savePermissionPoints(SavePermissionGroupPPVO save) { + permissionGroupService.savePermissionPoints(save); + return ApiResult.ok(); + } + + @Override + public ApiResult deletePermissionGroupSpecial(DeletePermissionGroupVO group) { + permissionGroupService.deletePermissionGroupSpecial(group); + return ApiResult.ok(); + } + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java new file mode 100644 index 00000000..45f3dd69 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleController.java @@ -0,0 +1,77 @@ +package cn.axzo.tyr.server.controller.role; + +import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.feign.TyrSaasRoleApi; +import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; +import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.res.IsSuperAdminRes; +import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; +import cn.axzo.tyr.client.model.vo.SaasRoleVO; +import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; +import cn.axzo.tyr.server.service.RoleService; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 权限 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 14:55 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class SaasRoleController implements TyrSaasRoleApi { + + @Autowired + RoleService roleService; + + @Override + public ApiResult saveOrUpdate(SaveOrUpdateRoleVO saveOrUpdateRole) { + return ApiResult.ok(roleService.saveOrUpdate(saveOrUpdateRole)); + } + + @Override + public ApiResult getById(Long id) { + QuerySaasRoleReq query = QuerySaasRoleReq.builder().ids(Lists.newArrayList(id)).build(); + List saasRoles = roleService.query(query); + if (CollectionUtils.isNotEmpty(saasRoles)) { + return ApiResult.ok(saasRoles.get(0)); + } + throw new ServiceException("未查询到角色"); + } + + @Override + public ApiResult> query(QuerySaasRoleReq req) { + return ApiResult.ok(roleService.query(req)); + } + + @Override + public ApiResult delete(List id) { + return null; + } + + @Override + public ApiResult> queryByIdentityIdType(Long identityId, Integer identityType,Long workspaceId,Long ouId) { + return ApiResult.ok(roleService.queryByIdentityIdType(identityId, identityType,workspaceId,ouId)); + } + + @Override + public ApiResult> queryBatchByIdentityIdType(List req) { + return ApiResult.ok(roleService.queryBatchByIdentityIdType(req)); + } + + @Override + public ApiResult> isSuperAdmin(List req) { + return ApiResult.ok(roleService.isSuperAdmin(req)); + } + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleGroupController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleGroupController.java new file mode 100644 index 00000000..36ab2927 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/role/SaasRoleGroupController.java @@ -0,0 +1,48 @@ +package cn.axzo.tyr.server.controller.role; + +import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.feign.SaasRoleGroupApi; +import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; +import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; +import cn.axzo.tyr.server.service.SaasRoleGroupService; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class SaasRoleGroupController implements SaasRoleGroupApi { + + private final SaasRoleGroupService saasRoleGroupService; + + @Override + public ApiResult saveOrUpdate(SaasRoleGroupVO req) { + return ApiResult.ok(saasRoleGroupService.saveOrUpdate(req)); + } + + @Override + public ApiResult> getList(QuerySaasRoleGroupReq req) { + return ApiResult.ok(saasRoleGroupService.getList(req)); + } + + @Override + public ApiResult getById(Long id) { + List roleGroups = saasRoleGroupService.getList(QuerySaasRoleGroupReq.builder().ids(Lists.newArrayList(id)).build()); + if (CollectionUtils.isEmpty(roleGroups)) { + throw new ServiceException("未查询到角色分组信息"); + } + return ApiResult.ok(roleGroups.get(0)); + } + + @Override + public ApiResult delete(List ids) { + saasRoleGroupService.delete(ids); + return ApiResult.ok(); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java new file mode 100644 index 00000000..991d1e15 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/roleuser/RoleUserController.java @@ -0,0 +1,48 @@ +package cn.axzo.tyr.server.controller.roleuser; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.feign.TyrSaasRoleUserApi; +import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserRelationDTO; +import cn.axzo.tyr.client.model.roleuser.req.DeleteRoleUserParam; +import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; +import cn.axzo.tyr.client.model.roleuser.req.RoleUserReq; +import cn.axzo.tyr.server.service.SaasRoleUserRelationService; +import cn.axzo.tyr.server.service.SaasRoleUserService; +import cn.azxo.framework.common.model.CommonResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author tanjie@axzo.cn + * @date 2023/9/13 15:47 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class RoleUserController implements TyrSaasRoleUserApi { + private final SaasRoleUserService saasRoleUserService; + private final SaasRoleUserRelationService saasRoleUserRelationService; + @Override + public ApiResult saveOrUpdate(@Valid RoleUserReq req) { + saasRoleUserService.saveOrUpdate(req); + return ApiResult.ok(); + + } + + @Override + public ApiResult> roleUserList(@RequestBody @Valid RoleUserParam param) { + return ApiResult.ok(saasRoleUserRelationService.list(param)); + } + + @Override + public ApiResult deleteUserAllRoles(@RequestBody @Valid List param) { + return ApiResult.ok(saasRoleUserService.deleteUserAllRoles(param)); + } + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/web/UserController.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/web/UserController.java deleted file mode 100644 index 7ce449bd..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/web/UserController.java +++ /dev/null @@ -1,76 +0,0 @@ -package cn.axzo.tyr.server.controller.web; - -import cn.axzo.tyr.server.service.user.UserService; -import cn.axzo.tyr.server.service.dto.request.user.NewUserDTO; -import cn.axzo.tyr.server.service.dto.request.user.UpdateUserDTO; -import cn.axzo.tyr.server.service.dto.request.user.UserQO; -import cn.axzo.tyr.server.service.dto.response.user.UserVO; -import cn.azxo.framework.common.model.CommonPageResponse; -import cn.azxo.framework.common.model.CommonResponse; -import com.github.xiaoymin.knife4j.annotations.ApiSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - * @Author: liyong.tian - * @Date: 2022/9/2 - * @Description: - */ -@Slf4j -@Api(tags = "web-用户信息接口") -@ApiSupport(author = "田立勇") -@RequestMapping("/api/v1") -@RestController -@RequiredArgsConstructor -public class UserController { - - private final UserService userService; - - @ApiOperation(value = "创建用户") - @PostMapping("/users") - public CommonResponse createUser(@Valid @RequestBody NewUserDTO dto) { - log.info("REST request to save user : {}", dto); - // 校验入参 - dto.valid(); - UserVO result = userService.create(dto); - return CommonResponse.success(result); - } - - @ApiOperation(value = "修改用户") - @PutMapping("/users/{id}") - public CommonResponse updateUser(@ApiParam("用户ID") @PathVariable Long id, - @Valid @RequestBody UpdateUserDTO dto) { - log.info("REST request to update user : {}", dto); - // 校验入参 - dto.valid(); - UserVO result = userService.update(id, dto); - return CommonResponse.success(result); - } - - @ApiOperation("获取用户列表") - @GetMapping("/users") - public CommonResponse> getUsers(@Valid UserQO userQO) { - CommonPageResponse results = userService.queryByPage(userQO); - return CommonResponse.success(results); - } - - @ApiOperation("获取用户详情") - @GetMapping("/users/{id}") - public CommonResponse getUser(@ApiParam("用户ID") @PathVariable Long id) { - UserVO result = userService.getOne(id); - return CommonResponse.success(result); - } - - @ApiOperation("删除用户") - @DeleteMapping("/users/{id}") - public CommonResponse deleteUser(@ApiParam("用户ID") @PathVariable Long id) { - userService.delete(id); - return CommonResponse.success(); - } -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/web/UserResource.java b/tyr-server/src/main/java/cn/axzo/tyr/server/controller/web/UserResource.java deleted file mode 100644 index 73607e7f..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/controller/web/UserResource.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.axzo.tyr.server.controller.web; - -import cn.axzo.framework.domain.page.PageQO; -import cn.axzo.framework.domain.page.PageResp; -import cn.axzo.framework.web.http.ApiResponse; -import cn.axzo.framework.web.http.ApiPageResponse; -import cn.axzo.tyr.server.service.dto.request.user.NewUserDTO; -import cn.axzo.tyr.server.service.dto.request.user.UpdateUserDTO; -import cn.axzo.tyr.server.service.dto.request.user.UserQO1; -import cn.axzo.tyr.server.service.dto.response.user.UserVO; -import cn.axzo.tyr.server.service.user.UserService; -import com.github.xiaoymin.knife4j.annotations.ApiSupport; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - * @Author: liyong.tian - * @Date: 2022/10/28 - * @Description: 新项目搭建推荐方式 - */ -@Slf4j -@Api(tags = "web-用户信息接口") -@ApiSupport(author = "田立勇") -@RequestMapping("/api/v2") -@RestController -@RequiredArgsConstructor -public class UserResource { - - private final UserService userService; - - @ApiOperation(value = "创建用户") - @PostMapping("/users") - public ApiResponse createUser(@Valid @RequestBody NewUserDTO dto) { - log.info("REST request to save user : {}", dto); - // 校验入参 - dto.valid(); - UserVO result = userService.create(dto); - return ApiResponse.ok(result); - } - - @ApiOperation(value = "修改用户") - @PutMapping("/users/{id}") - public ApiResponse updateUser(@ApiParam("用户ID") @PathVariable Long id, - @Valid @RequestBody UpdateUserDTO dto) { - log.info("REST request to update user : {}", dto); - // 校验入参 - dto.valid(); - UserVO result = userService.update(id, dto); - return ApiResponse.ok(result); - } - - @ApiOperation("获取用户列表") - @GetMapping("/users") - public ApiPageResponse getUsers(@ModelAttribute UserQO1 userQo, PageQO page) { - PageResp results = userService.find(userQo, page); - return ApiPageResponse.ok(results); - } - - @ApiOperation("获取用户详情") - @GetMapping("/users/{id}") - public ApiResponse getUser(@ApiParam("用户ID") @PathVariable Long id) { - UserVO result = userService.getOne(id); - return ApiResponse.ok(result); - } - - @ApiOperation("删除用户") - @DeleteMapping("/users/{id}") - public ApiResponse deleteUser(@ApiParam("用户ID") @PathVariable Long id) { - userService.delete(id); - return ApiResponse.ok(); - } -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/job/OMSRoleJobHandler.java b/tyr-server/src/main/java/cn/axzo/tyr/server/job/OMSRoleJobHandler.java new file mode 100644 index 00000000..b7167aea --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/job/OMSRoleJobHandler.java @@ -0,0 +1,179 @@ +package cn.axzo.tyr.server.job; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.server.repository.entity.*; +import cn.axzo.tyr.server.repository.dao.*; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.IJobHandler; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 成都重新推送job + * + * @author cn + * @version 1.0 + * @description + * @date 2021/9/13 11:31 + */ +@Component +@AllArgsConstructor +@Slf4j +public class OMSRoleJobHandler extends IJobHandler { + + @Autowired + SaasRoleGroupDao roleGroupDao; + @Autowired + SaasRoleDao roleDao; + @Autowired + SaasPermissionGroupDao saasPermissionGroupDao; + @Autowired + SaasFeatureDao featureDao; + @Autowired + SaasRoleGroupRelationDao roleGroupRelationDao; + @Autowired + SaasRoleUserRelationDao roleUserRelationDao; + @Autowired + SaasPgroupRoleRelationDao pgroupRoleRelationDao; + @Autowired + SaasPgroupPermissionRelationDao pgroupPermissionRelationDao; + + /** + * 清洗OMS角色相关数据(注:先通过SQL检查和清除脏数据,要不然无法保证各个实体的关联关系) + * + * @param s + * @return + * @throws Exception + */ + @Transactional // 在一个事务里面做,一起提交 + @Override + @XxlJob("OMSRoleJobHandler") + public ReturnT execute(String s) throws Exception { + log.info("OMSRoleJobHandler start"); + // 创建角色分组 + SaasRoleGroup roleGroup = new SaasRoleGroup(); + roleGroup.setWorkspaceTypeCode("6"); + roleGroup.setOuTypeCode("6"); + roleGroup.setName("管理员"); + roleGroup.setWorkspaceId(-1l); + roleGroup.setOuId(-1l); + roleGroup.setSort(1); + roleGroupDao.save(roleGroup); + // 查询OMS的角色 workspaceType=6 OMS的角色 + List oldRole = roleDao.lambdaQuery() + .eq(SaasRole::getWorkspaceType, 6) + .notIn(SaasRole::getRoleType, "super_admin") + .list(); + // 重置老角色多余的字段 + oldRole.forEach(e -> { + e.setWorkspaceId(-1l); + e.setOwnerOuId(-1l); + }); + roleDao.updateBatchById(oldRole); + // 保存角色分组关联关系 + List roleGroupRelation = oldRole.stream().map(e -> { + SaasRoleGroupRelation saasRoleGroupRelation = new SaasRoleGroupRelation(); + saasRoleGroupRelation.setRoleId(e.getId()); + saasRoleGroupRelation.setSaasRoleGroupId(roleGroup.getId()); + return saasRoleGroupRelation; + }).collect(Collectors.toList()); + roleGroupRelationDao.saveBatch(roleGroupRelation); + // 查询角色关联的角色,打包成新的权限集 + ArrayList deletePgroup = new ArrayList<>(); + ArrayList deletePgroupRoleRelation = new ArrayList<>(); + ArrayList deletePgroupPermissionRelation = new ArrayList<>(); + oldRole.forEach(role -> { + List pgroupRoleRelation = pgroupRoleRelationDao.lambdaQuery().eq(SaasPgroupRoleRelation::getRoleId, role.getId()).list(); + if (CollectionUtils.isEmpty(pgroupRoleRelation)) { + return; + } + List permissionGroup = saasPermissionGroupDao.lambdaQuery().in(BaseEntity::getId, pgroupRoleRelation.stream().map(SaasPgroupRoleRelation::getGroupId).collect(Collectors.toList())).list(); + if (CollectionUtils.isEmpty(permissionGroup)) { + // 删除角色权限集关联关系 + deletePgroupRoleRelation.addAll(pgroupRoleRelation); + return; + } + List pgroupPermissionRelation = pgroupPermissionRelationDao.lambdaQuery().in(SaasPgroupPermissionRelation::getGroupId, permissionGroup.stream().map(BaseEntity::getId).collect(Collectors.toList())).list(); + if (CollectionUtils.isEmpty(pgroupPermissionRelation)) { + // 如果没查到权限则表示当前权限集是无意义的,删掉 + deletePgroup.addAll(permissionGroup); + // 删除角色权限集关联关系 + deletePgroupRoleRelation.addAll(pgroupRoleRelation); + return; + } + List feature = featureDao.lambdaQuery().in(BaseEntity::getId, pgroupPermissionRelation.stream().map(SaasPgroupPermissionRelation::getFeatureId).collect(Collectors.toList())).list(); + if (CollectionUtils.isEmpty(feature)) { + // 删除权限集权限关联关系 + deletePgroupPermissionRelation.addAll(pgroupPermissionRelation); + // 如果没查到权限则表示当前权限集是无意义的,删掉 + deletePgroup.addAll(permissionGroup); + // 删除角色权限集关联关系 + deletePgroupRoleRelation.addAll(pgroupRoleRelation); + return; + } + // 创建新的权限集 + SaasPermissionGroup saasPermissionGroup = new SaasPermissionGroup(); + saasPermissionGroup.setName("通用权限"); + saasPermissionGroup.setDescription(""); + saasPermissionGroup.setCreateBy(-1L); + saasPermissionGroup.setUpdateBy(-1L); + saasPermissionGroup.setType("feature"); + saasPermissionGroup.setIsCommon(1); + saasPermissionGroupDao.save(saasPermissionGroup); + deletePgroup.addAll(permissionGroup); + // 创建新的角色权限集关联关系 + SaasPgroupRoleRelation saasPgroupRoleRelation = new SaasPgroupRoleRelation(); + saasPgroupRoleRelation.setRoleId(role.getId()); + saasPgroupRoleRelation.setGroupId(saasPermissionGroup.getId()); + saasPgroupRoleRelation.setCreateBy(-1L); + saasPgroupRoleRelation.setUpdateBy(-1L); + pgroupRoleRelationDao.save(saasPgroupRoleRelation); + // 创建新的权限集权限关联关系 + feature.forEach(e -> { + SaasPgroupPermissionRelation saasPgroupPermissionRelation = new SaasPgroupPermissionRelation(); + saasPgroupPermissionRelation.setGroupId(saasPermissionGroup.getId()); + saasPgroupPermissionRelation.setFeatureId(e.getId()); + saasPgroupPermissionRelation.setCreateBy(-1L); + saasPgroupPermissionRelation.setUpdateBy(-1L); + pgroupPermissionRelationDao.save(saasPgroupPermissionRelation); + }); + // 暂存待删除数据 + deletePgroupPermissionRelation.addAll(pgroupPermissionRelation); + // 暂存待删除数据 + deletePgroupRoleRelation.addAll(pgroupRoleRelation); + }); + // 所有的数据都不能在循环中删,要不然下一次循环中就查不到了 + // 删除老的权限集权限关联关系 + deletePgroupPermissionRelation.forEach(e -> { + pgroupPermissionRelationDao.lambdaUpdate() + .eq(BaseEntity::getId, e.getId()) + .set(BaseEntity::getIsDelete, e.getId()) + .update(); + }); + // 删除老的角色权限集关联关系 + deletePgroupRoleRelation.forEach(e -> { + pgroupRoleRelationDao.lambdaUpdate() + .eq(BaseEntity::getId, e.getId()) + .set(BaseEntity::getIsDelete, e.getId()) + .update(); + }); + // 删除权限集 + deletePgroup.forEach(e -> { + saasPermissionGroupDao.lambdaUpdate() + .eq(BaseEntity::getId, e.getId()) + .set(BaseEntity::getIsDelete, e.getId()) + .update(); + }); + log.info("OMSRoleJobHandler end"); + return ReturnT.SUCCESS; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/job/package-info.java b/tyr-server/src/main/java/cn/axzo/tyr/server/job/package-info.java deleted file mode 100644 index d3a347ea..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/job/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.axzo.tyr.server.job; \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/SaasBasicDictDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/SaasBasicDictDao.java new file mode 100644 index 00000000..82516fe2 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/SaasBasicDictDao.java @@ -0,0 +1,70 @@ +package cn.axzo.tyr.server.repository; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.tyr.client.model.dict.request.BasicDictNodeReq; +import cn.axzo.tyr.client.model.dict.request.BasicDictQueryReq; +import cn.axzo.tyr.client.model.dict.request.BasicDictUpdateReq; +import cn.axzo.tyr.client.model.dict.request.BasicDictUpdateStatusReq; +import cn.axzo.tyr.client.model.dict.response.BasicDictNodeResp; +import cn.axzo.tyr.client.model.enums.DictTypeFiledEnum; +import cn.axzo.tyr.server.repository.entity.SaasBasicDict; +import cn.axzo.tyr.server.repository.mapper.SaasBasicDictMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + * @author: chenwenjian + * @date: 2023/9/7 17:43 + * @description: + * @modifiedBy: + * @version: 1.0 + */ +@Service +public class SaasBasicDictDao extends ServiceImpl { + + public List getBasicDictNodeList(BasicDictQueryReq req) { + LambdaQueryChainWrapper queryChainWrapper = lambdaQuery(); + if (Objects.nonNull(req)) { + queryChainWrapper.eq(Objects.nonNull(req.getParentId()), SaasBasicDict::getParentId, req.getParentId()) + .eq(Objects.nonNull(req.getWorkspaceType()), SaasBasicDict::getWorkspaceType, req.getWorkspaceType()) + .eq(Objects.nonNull(req.getType()), SaasBasicDict::getType, req.getType()) + .in(Objects.nonNull(req.getCodes()), SaasBasicDict::getCode, req.getCodes()) + .eq(Objects.nonNull(req.getStatus()), SaasBasicDict::getStatus, req.getStatus()) + .eq(Objects.nonNull(req.getLevel()), SaasBasicDict::getLevel, req.getLevel()) + .like(Objects.nonNull(req.getName()), SaasBasicDict::getName, req.getName()); + } + List basicDictList = queryChainWrapper.orderByDesc(SaasBasicDict::getSort).list(); + return BeanMapper.copyList(basicDictList, BasicDictNodeResp.class); + } + + public BasicDictNodeResp getBasicDictNode(BasicDictNodeReq req) { + SaasBasicDict saasBasicDict = lambdaQuery().eq(Objects.nonNull(req.getType()), SaasBasicDict::getType, req.getType()) + .eq(Objects.nonNull(req.getCode()), SaasBasicDict::getCode, req.getCode()) + .one(); + return BeanMapper.copyBean(saasBasicDict, BasicDictNodeResp.class); + } + + public Boolean updateStatus(BasicDictUpdateStatusReq req) { + return lambdaUpdate().eq(SaasBasicDict::getId, req.getId()) + .set(SaasBasicDict::getStatus, req.getStatus()) + .update(); + } + + public Boolean update(BasicDictUpdateReq req) { + return lambdaUpdate().eq(SaasBasicDict::getId, req.getId()) + .set(SaasBasicDict::getName, req.getName()) + .update(); + } + + public BasicDictNodeResp getWorkspaceType(String workspaceType) { + SaasBasicDict dict = this.getOne(new LambdaQueryWrapper() + .eq(SaasBasicDict::getType, DictTypeFiledEnum.WORKSPACE.getValue()) + .eq(SaasBasicDict::getWorkspaceType, workspaceType)); + return BeanMapper.copyBean(dict, BasicDictNodeResp.class); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/UserDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/UserDao.java deleted file mode 100644 index b0909277..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/UserDao.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.axzo.tyr.server.repository; - -import cn.axzo.framework.domain.page.PageQO; -import cn.axzo.tyr.server.repository.mapper.UserMapper; -import cn.axzo.tyr.server.service.dto.request.user.UserQO; -import cn.axzo.tyr.server.service.dto.request.user.UserQO1; -import cn.axzo.tyr.server.repository.entity.user.User; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Repository; - -/** - * @Author: liyong.tian - * @Date: 2022/9/5 - * @Description: - */ -@Repository -@RequiredArgsConstructor -public class UserDao extends ServiceImpl { - - private final UserMapper userMapper; - - public User findById(Long id) { - return userMapper.selectById(id); - } - - public void delete(Long id) { - userMapper.deleteById(id); - } - - public IPage queryByPage(UserQO userQO) { - return userMapper.selectPage(userQO.toPage(), - Wrappers.lambdaQuery(User.class) - .eq(userQO.getId() != null, User::getId, userQO.getId()) - .like(StringUtils.isNotBlank(userQO.getName()), User::getName, userQO.getName()) - .like(StringUtils.isNotBlank(userQO.getPhone()), User::getPhone, userQO.getPhone()) - .like(StringUtils.isNotBlank(userQO.getEmail()), User::getEmail, userQO.getEmail()) - .orderByDesc(User::getCreateAt) - ); - } - - public IPage find(UserQO1 userQO, PageQO page) { - return userMapper.selectPage(page.toPage(), - Wrappers.lambdaQuery(User.class) - .eq(userQO.getId() != null, User::getId, userQO.getId()) - .like(StringUtils.isNotBlank(userQO.getName()), User::getName, userQO.getName()) - .like(StringUtils.isNotBlank(userQO.getPhone()), User::getPhone, userQO.getPhone()) - .like(StringUtils.isNotBlank(userQO.getEmail()), User::getEmail, userQO.getEmail()) - .orderByDesc(User::getCreateAt) - ); - } -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/ProductModuleDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/ProductModuleDao.java new file mode 100644 index 00000000..c83be1d3 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/ProductModuleDao.java @@ -0,0 +1,18 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.tyr.server.repository.entity.ProductModule; +import cn.axzo.tyr.server.repository.mapper.ProductModuleMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * saas-产品表(SaasProduct)表服务实现类 + * + * @author makejava + * @since 2022-05-24 11:15:04 + */ +@Service +public class ProductModuleDao extends ServiceImpl { + +} + 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 new file mode 100644 index 00000000..bfe031a1 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasFeatureDao.java @@ -0,0 +1,27 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.tyr.server.repository.entity.SaasFeature; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author ZhanSiHu + * @since 2023-09-06 + */ +public interface SaasFeatureDao extends IService { + + void updateChildrenPath(Long updater, String pathPrefix, String newPathPrefix); + + List listByParentId(Long parentId); + + void updateSort(Long permissionId, int switchIndex); + + List listLikePath(String path); + + List listByParentIdAndTerminal(Long parentId, String terminal); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPermissionGroupDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPermissionGroupDao.java new file mode 100644 index 00000000..358ce34f --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPermissionGroupDao.java @@ -0,0 +1,23 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.server.repository.entity.SaasPermissionGroup; +import cn.axzo.tyr.server.repository.mapper.SaasPermissionGroupMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class SaasPermissionGroupDao extends ServiceImpl { + + public void delete(List id) { + lambdaUpdate() + .in(BaseEntity::getId,id) + .set(BaseEntity::getIsDelete,id) + .update(); + } + + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPermissionGroupScopeDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPermissionGroupScopeDao.java new file mode 100644 index 00000000..11174e8b --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPermissionGroupScopeDao.java @@ -0,0 +1,36 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.server.repository.entity.SaasPermissionGroupScope; +import cn.axzo.tyr.server.repository.mapper.SaasPermissionGroupScopeMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Repository; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +@Repository +public class SaasPermissionGroupScopeDao extends ServiceImpl { + + public void deleteByPGroupId(List pgroupId) { + lambdaUpdate() + .in(SaasPermissionGroupScope::getPgroupId,pgroupId) + .set(BaseEntity::getIsDelete, TableIsDeleteEnum.DELETE.value) + .update(); + } + + @Override + public boolean removeByIds(Collection idList) { + if (CollectionUtils.isEmpty(idList)) { + return false; + } + return lambdaUpdate() + .in(SaasPermissionGroupScope::getId,idList) + .set(BaseEntity::getIsDelete, TableIsDeleteEnum.DELETE.value) + .update(); + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPgroupPermissionRelationDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPgroupPermissionRelationDao.java new file mode 100644 index 00000000..37240edd --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPgroupPermissionRelationDao.java @@ -0,0 +1,42 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; +import cn.axzo.tyr.server.repository.mapper.SaasPgroupPermissionRelationMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Repository; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +@Repository +public class SaasPgroupPermissionRelationDao extends ServiceImpl { + + public void removeByPermissionPointIds(List permissionPointIds) { + this.remove(new LambdaQueryWrapper() + .in(SaasPgroupPermissionRelation::getFeatureId, permissionPointIds)); + } + + public void deleteByPGroupId(List pgroupId) { + lambdaUpdate() + .in(SaasPgroupPermissionRelation::getGroupId,pgroupId) + .set(BaseEntity::getIsDelete, TableIsDeleteEnum.DELETE.value) + .update(); + } + + @Override + public boolean removeByIds(Collection idList) { + if (CollectionUtils.isEmpty(idList)) { + return false; + } + return lambdaUpdate() + .in(SaasPgroupPermissionRelation::getId,idList) + .set(BaseEntity::getIsDelete, TableIsDeleteEnum.DELETE.value) + .update(); + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPgroupRoleRelationDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPgroupRoleRelationDao.java new file mode 100644 index 00000000..32a9560f --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasPgroupRoleRelationDao.java @@ -0,0 +1,36 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation; +import cn.axzo.tyr.server.repository.mapper.SaasPgroupRoleRelationMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Repository; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +@Repository +public class SaasPgroupRoleRelationDao extends ServiceImpl { + + public void deleteByRoleId(List roleId) { + lambdaUpdate() + .in(SaasPgroupRoleRelation::getRoleId,roleId) + .set(BaseEntity::getIsDelete, TableIsDeleteEnum.DELETE.value) + .update(); + } + + @Override + public boolean removeByIds(Collection idList) { + if (CollectionUtils.isEmpty(idList)) { + return false; + } + return lambdaUpdate() + .in(SaasPgroupRoleRelation::getId,idList) + .set(BaseEntity::getIsDelete, TableIsDeleteEnum.DELETE.value) + .update(); + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasProductModuleFeatureRelationDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasProductModuleFeatureRelationDao.java new file mode 100644 index 00000000..ce3317c3 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasProductModuleFeatureRelationDao.java @@ -0,0 +1,29 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation; +import cn.axzo.tyr.server.repository.mapper.SaasProductModuleFeatureRelationMapper; +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * 产品-菜单关联关系(SaasProductModuleFeatureRelation)表服务实现类 + * + * @author makejava + * @since 2022-05-24 11:18:41 + */ +@Repository +public class SaasProductModuleFeatureRelationDao extends ServiceImpl { + + public void removeByPermissionPointIds(List permissionPointIds) { + if (CollectionUtil.isEmpty(permissionPointIds)) { + return; + } + this.remove(new LambdaQueryWrapper() + .in(SaasProductModuleFeatureRelation::getFeatureId, permissionPointIds)); + } +} + 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 new file mode 100644 index 00000000..072dd6db --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleDao.java @@ -0,0 +1,34 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.server.repository.entity.SaasRole; +import cn.axzo.tyr.server.repository.mapper.SaasRoleMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Repository; + +import java.io.Serializable; +import java.util.List; + +@Repository +public class SaasRoleDao extends ServiceImpl { + + @Override + public SaasRole getById(Serializable id) { + List roles = lambdaQuery().eq(SaasRole::getId, id).eq(SaasRole::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + if (CollectionUtils.isEmpty(roles)) { + return null; + } + return roles.get(0); + } + + public void delete(List id) { + lambdaUpdate() + .in(BaseEntity::getId,id) + .set(BaseEntity::getIsDelete,id) + .update(); + } + +} + 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 new file mode 100644 index 00000000..a8f02b69 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupDao.java @@ -0,0 +1,54 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; +import cn.axzo.tyr.server.repository.mapper.SaasRoleGroupMapper; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class SaasRoleGroupDao extends ServiceImpl { + + @Autowired + SaasRoleGroupMapper mapper; + + /** + * 通用查询 + */ + public List query(QuerySaasRoleGroupReq req) { + // 构建单位类型查询条件json数组 + StringBuilder condition = new StringBuilder(); + if (CollectionUtils.isNotEmpty(req.getOuTypeCode())) { + condition = new StringBuilder(); + for (String value : req.getOuTypeCode()) { + condition.append(" FIND_IN_SET('" + value + "', ou_type_code) OR"); + } + } + LambdaQueryChainWrapper eq = this.lambdaQuery() + .in(CollectionUtils.isNotEmpty(req.getIds()), BaseEntity::getId, req.getIds()) + .in(CollectionUtils.isNotEmpty(req.getWorkspaceTypeCode()), SaasRoleGroup::getWorkspaceTypeCode, req.getWorkspaceTypeCode()) + .in(CollectionUtils.isNotEmpty(req.getWorkspaceIds()), SaasRoleGroup::getWorkspaceId, req.getWorkspaceIds()) + .in(CollectionUtils.isNotEmpty(req.getOuIds()), SaasRoleGroup::getOuId, req.getOuIds()) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value); + if(CollectionUtils.isNotEmpty(req.getOuTypeCode())){ + eq.last(" AND (" + condition.substring(0, condition.length() - 2) + ")"); + } + return eq.list(); + } + + public void delete(List id) { + lambdaUpdate() + .in(BaseEntity::getId,id) + .set(BaseEntity::getIsDelete,1l) + .update(); + } + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupRelationDao.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupRelationDao.java new file mode 100644 index 00000000..c9dd7f87 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleGroupRelationDao.java @@ -0,0 +1,29 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import cn.axzo.tyr.server.repository.mapper.SaasRoleGroupRelationMapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Repository; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +@Repository +public class SaasRoleGroupRelationDao extends ServiceImpl { + + @Override + public boolean removeByIds(Collection idList) { + if (CollectionUtils.isEmpty(idList)) { + return false; + } + return lambdaUpdate() + .in(SaasRoleGroupRelation::getId,idList) + .set(BaseEntity::getIsDelete, TableIsDeleteEnum.DELETE.value) + .update(); + } +} + 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 new file mode 100644 index 00000000..725a640c --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/SaasRoleUserRelationDao.java @@ -0,0 +1,58 @@ +package cn.axzo.tyr.server.repository.dao; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.client.model.BaseWorkspaceModel; +import cn.axzo.tyr.client.model.roleuser.req.DeleteRoleUserParam; +import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; +import cn.axzo.tyr.server.repository.mapper.SaasRoleUserRelationMapper; +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class SaasRoleUserRelationDao extends ServiceImpl { + + public List query(Long identityId, Integer identityType, Long workspaceId, Long ouId) { + return this.lambdaQuery() + .eq(SaasRoleUserRelation::getIdentityId,identityId) + .eq(SaasRoleUserRelation::getIdentityType,identityType) + .eq(SaasRoleUserRelation::getWorkspaceId,workspaceId) + .eq(SaasRoleUserRelation::getOuId,ouId) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + } + + public void deleteByRoldId(List roleId) { + lambdaUpdate() + .in(SaasRoleUserRelation::getRoleId,roleId) + .set(BaseEntity::getIsDelete,TableIsDeleteEnum.DELETE.value) + .update(); + } + + /** + * 若未传入roleId会导致用户所以角色都被清除。 + * @param baseWorkspaceModel + * @param roleId 删除指定角色 + */ + public void deleteByUser(BaseWorkspaceModel baseWorkspaceModel,List roleId) { + remove( + Wrappers.lambdaQuery(SaasRoleUserRelation.class) + .eq(SaasRoleUserRelation::getIdentityId, baseWorkspaceModel.getIdentityId()) + .eq(SaasRoleUserRelation::getIdentityType, baseWorkspaceModel.getIdentityType()) + .eq(SaasRoleUserRelation::getWorkspaceId, baseWorkspaceModel.getWorkspaceId()) + .eq(SaasRoleUserRelation::getOuId, baseWorkspaceModel.getOuId()) + .in(CollectionUtil.isNotEmpty(roleId), SaasRoleUserRelation::getRoleId, roleId) + ); + + } + + + + + +} + 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 new file mode 100644 index 00000000..48791cd3 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/dao/impl/SaasFeatureDaoImpl.java @@ -0,0 +1,50 @@ +package cn.axzo.tyr.server.repository.dao.impl; + +import cn.axzo.tyr.server.repository.entity.SaasFeature; +import cn.axzo.tyr.server.repository.mapper.SaasFeatureMapper; +import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author ZhanSiHu + * @since 2023-09-06 + */ +@Service +public class SaasFeatureDaoImpl extends ServiceImpl implements SaasFeatureDao { + + @Override + public void updateChildrenPath(Long updater, String pathPrefix, String newPathPrefix) { + this.baseMapper.updateChildrenPath(updater, pathPrefix, newPathPrefix); + } + + @Override + public List 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)); + } + + @Override + public List listLikePath(String path) { + return this.list(new LambdaQueryWrapper().likeRight(SaasFeature::getPath, path)); + } + + @Override + public List listByParentIdAndTerminal(Long parentId, String terminal) { + return this.list(new LambdaQueryWrapper() + .eq(SaasFeature::getParentId, parentId) + .eq(SaasFeature::getTerminal, terminal)); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/ProductModule.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/ProductModule.java new file mode 100644 index 00000000..68a5b235 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/ProductModule.java @@ -0,0 +1,65 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.io.Serializable; + +/** + * saas-产品表(SaasProduct)表实体类 + * + * @author makejava + * @since 2022-05-24 11:15:03 + */ +@Getter +@Setter +@ToString +@EqualsAndHashCode(callSuper = true) +@TableName("product_module") +public class ProductModule extends BaseEntity { + + /** + * 产品 icon + */ + private String icon; + + /** + * 产品板块名字 + */ + private String productName; + + /** + * 产品所属工作台字典 ID + */ + private Long dictWorkspaceTypeId; + + /** + * 产品所属工作台字典 Code + */ + private String dictWorkspaceTypeCode; + + /** + * 产品状态 + */ + private Integer status; + + /** + * 产品板块备注 + */ + private String remark; + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasBasicDict.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasBasicDict.java new file mode 100644 index 00000000..f7b5c798 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasBasicDict.java @@ -0,0 +1,98 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.ibatis.type.BooleanTypeHandler; + +import java.io.Serializable; +import java.util.Map; + +/** + * @author: chenwenjian + * @date: 2023/9/7 17:39 + * @description: 字典实体类 + * @modifiedBy: + * @version: 1.0 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@TableName("saas_basic_dict") +public class SaasBasicDict extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 100L; + + /** + * 父节点id + */ + @TableField(value = "parent_id") + private Long parentId; + + /** + * 工作台类型,"ent", "proj", "oms" + */ + @TableField(value = "workspace_type") + private String workspaceType; + + /** + * 类型,"ouType", "terminal" + */ + @TableField(value = "type") + private String type; + + /** + * 名称 + */ + @TableField(value = "name") + private String name; + + /** + * code + */ + @TableField(value = "code") + private String code; + + /** + * 唯一code + */ + @TableField(value = "unique_code") + private String uniqueCode; + + /** + * 状态,0禁用,1启用 + */ + @TableField(value = "status", typeHandler = BooleanTypeHandler.class) + private Boolean status; + + /** + * 排序 + */ + @TableField(value = "sort") + private Integer sort; + + /** + * 层级 + */ + @TableField(value = "level") + private Integer level; + + /** + * 路径 + */ + @TableField(value = "path") + private String path; + + /** + * 扩展信息 + */ + @TableField(value = "ext", typeHandler = JacksonTypeHandler.class) + private Map ext; + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasFeature.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasFeature.java new file mode 100644 index 00000000..3f04f6fc --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasFeature.java @@ -0,0 +1,169 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author ZhanSiHu + * @since 2023-09-06 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@TableName("saas_feature") +public class SaasFeature extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** + * 名称 + */ + private String featureName; + + /** + * code + */ + private String featureCode; + + /** + * 图标地址 + */ + private String icon; + + /** + * 菜单上级id + */ + private Long parentId; + + /** + * 产品板块Id + */ + private Long parentModuleId; + + /** + * 链接地址 + */ + private String linkUrl; + + /** + * 1:CMS 2:小程序 4:原生 + */ + private Integer linkType; + + /** + * 扩展字段 + */ + private String linkExt; + + /** + * 小程序id 关联micro_app_item id + */ + private String microAppItemId; + + /** + * 路径 + */ + private String path; + + /** + * 描述 + */ + private String description; + + /** + * 排序 + */ + private Integer sort; + + /** + * 菜单适用于平台 0:企业工作台 1:项目工作台 + */ + private String terminal; + + /** + * 类型 0.模块 1.菜单 2页面 3功能 + */ + private Integer featureType; + + + /** + * 创建人id + */ + private Long createBy; + + /** + * 修改人id + */ + private Long updateBy; + + private String legacyLayout; + + /** + * 0:查看 1:操作 + */ + private Integer operateType; + + /** + * 为了迁移菜单用的,迁移后将废弃 + */ + private Long oldId; + + /** + * 适用单位类型-65535:所有 1:总包 2:建设单位 4:监理单位 8:劳务分包 16:专业分包 + */ + private Long fitOuTypeBit; + + /** + * 适用节点类型65535:所有 1:部门 2:班组 4:小组 + */ + private Long fitOuNodeTypeBit; + + /** + * 网关专属字段,所属应用 + */ + private String appName; + + /** + * 网关专属字段 ,功能URL,对应后端接口url + */ + private String featureUrl; + + /** + * 网关专属字段,是否认证 0:无需要认证 1:需要认证 - 登录-默认1 + */ + private Boolean needCert; + + /** + * 网关专属字段,是否授权 0:无需要授权 1:需要授权 - 权限-默认1 + */ + private Boolean needAuth; + + /** + * 业务id,用于环境同步作为唯一键 + */ + private String businessNo; + + /** + * 父级业务id + */ + private String parentBusinessNo; + + /** + * 授权策略类型,允许为空 1-平台授权型 2-客户授权型 3-免授权型 + */ + private Integer delegatedType; + + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPermissionGroup.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPermissionGroup.java new file mode 100644 index 00000000..8fcd2444 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPermissionGroup.java @@ -0,0 +1,68 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.io.Serializable; + +/** + * 权限集(SaasPermissionGroup)表实体类 + * + * @author makejava + * @since 2022-05-24 11:18:41 + */ +@Getter +@Setter +@ToString +@EqualsAndHashCode(callSuper = true) +@TableName("saas_permission_group") +public class SaasPermissionGroup extends BaseEntity { + + /** + * 权限集名称 + */ + private String name; + + /** + * 权限集描述 + */ + private String description; + + /** + * 创建者 + */ + private Long createBy; + + private String creatorName; + /** + * 更新者 + */ + private Long updateBy; + + private String updatorName; + + /** + * 权限集类型:feature data + */ + private String type; + + /** + * 是否为通用权限集 1:是 0:否 + */ + private Integer isCommon; + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPermissionGroupScope.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPermissionGroupScope.java new file mode 100644 index 00000000..52669b3c --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPermissionGroupScope.java @@ -0,0 +1,70 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Objects; + +/** + * 权限集作用范围 + * + * @author makejava + * @since 2022-06-05 10:59:29 + */ +@TableName("saas_permission_group_scope") +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class SaasPermissionGroupScope extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 972205950455439772L; + + /** + * 权限组id + */ + @TableField("pgroup_id") + private Long pgroupId; + + /** + * 选择类型: 1.正选 2.反选 + */ + @TableField("type") + private Integer type; + + /** + * 作用范围类型: workspace ou + */ + @TableField("scope_type") + private String scopeType; + + /** + * 作用范围id(workspace_id/ou_id) + */ + @TableField("scope_id") + private Long scopeId; + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SaasPermissionGroupScope that = (SaasPermissionGroupScope) o; + return Objects.equals(pgroupId, that.pgroupId) && Objects.equals(type, that.type) && Objects.equals(scopeType, that.scopeType) && Objects.equals(scopeId, that.scopeId); + } + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPgroupPermissionRelation.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPgroupPermissionRelation.java new file mode 100644 index 00000000..982d7452 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPgroupPermissionRelation.java @@ -0,0 +1,65 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.io.Serializable; +import java.util.Objects; + +/** + * 权限集功能中间表(SaasPgroupPermissionRelation)表实体类 + * + * @author makejava + * @since 2022-05-24 11:18:41 + */ +@Getter +@Setter +@ToString +@EqualsAndHashCode(callSuper = true) +@TableName("saas_pgroup_permission_relation") +public class SaasPgroupPermissionRelation extends BaseEntity { + + + /** + * 权限集id + */ + private Long groupId; + /** + * 功能id + */ + private Long featureId; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SaasPgroupPermissionRelation that = (SaasPgroupPermissionRelation) o; + return Objects.equals(groupId, that.groupId) && Objects.equals(featureId, that.featureId); + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPgroupRoleRelation.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPgroupRoleRelation.java new file mode 100644 index 00000000..a69676a3 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasPgroupRoleRelation.java @@ -0,0 +1,55 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.io.Serializable; + +/** + * 角色权限集中间表(SaasPgroupRoleRelation)表实体类 + * + * @author makejava + * @since 2022-05-24 11:18:41 + */ +@Getter +@Setter +@ToString +@EqualsAndHashCode(callSuper = true) +@TableName("saas_pgroup_role_relation") +public class SaasPgroupRoleRelation extends BaseEntity { + + /** + * 角色id + */ + private Long roleId; + + /** + * 权限集id + */ + private Long groupId; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasProductModuleFeatureRelation.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasProductModuleFeatureRelation.java new file mode 100644 index 00000000..ea2d0a19 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasProductModuleFeatureRelation.java @@ -0,0 +1,56 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.io.Serializable; + +/** + * saas-账户表(SaasAccount)表实体类 + * + * @author makejava + * @since 2022-05-24 11:18:42 + */ +@Getter +@Setter +@ToString +@EqualsAndHashCode(callSuper = true) +@TableName("saas_product_module_feature_relation") +public class SaasProductModuleFeatureRelation extends BaseEntity { + + /** + * 产品 ID + */ + private Long productModuleId; + + /** + * 产品关联企业字典三级(ouType)的 ID + */ + private Long dictCodeId; + + /** + * 产品关联的字典 Code 原值 + */ + private String dictCode; + + /** + * 权限点 ID + */ + private Long featureId; + + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRole.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRole.java new file mode 100644 index 00000000..75208466 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRole.java @@ -0,0 +1,71 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.io.Serializable; + +/** + * saas-角色(SaasRole)表实体类 + * + * @author makejava + * @since 2022-05-24 11:18:41 + */ +@Getter +@Setter +@ToString +@EqualsAndHashCode(callSuper = true) +@TableName("saas_role") +public class SaasRole extends BaseEntity { + + /** + * 角色名称 + */ + private String name; + + /** + * 角色描述 + */ + private String description; + + /** + * 角色类型:common 普通角色 super_admin超级管理员(禁止删除) admin子管理员(禁止删除) init初始化内置角色 + */ + private String roleType; + + private Long workspaceId; + + /** + * 废弃 + */ + @Deprecated + private Integer workspaceType; + + private Long ownerOuId; + + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleGroup.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleGroup.java new file mode 100644 index 00000000..8d5797f4 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleGroup.java @@ -0,0 +1,72 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 角色分组 + * + * @author makejava + * @since 2022-06-05 10:59:29 + */ +@TableName("saas_role_group") +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class SaasRoleGroup extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 972205950455439772L; + + /** + * 工作台类型字典code + */ + @TableField("workspace_type_code") + private String workspaceTypeCode; + + /** + * 单位类型字典code + */ + @TableField("ou_type_code") + private String ouTypeCode; + + /** + * 名称 + */ + @TableField("name") + private String name; + + /** + * 所属工作台id + */ + @TableField("workspace_id") + private Long workspaceId; + + /** + * 所属单位id + */ + @TableField("ou_id") + private Long ouId; + + /** + * 排序 + */ + @TableField("sort") + private Integer sort; + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleGroupRelation.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleGroupRelation.java new file mode 100644 index 00000000..92b7a22f --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleGroupRelation.java @@ -0,0 +1,57 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Objects; + +/** + * 角色分组关联表 + * + * @author makejava + * @since 2022-06-05 10:59:29 + */ +@TableName("saas_role_group_relation") +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class SaasRoleGroupRelation extends BaseEntity implements Serializable { + + private static final long serialVersionUID = 972205950455439772L; + + /** + * 角色id + */ + @TableField("role_id") + private Long roleId; + + /** + * 角色分组id + */ + @TableField("saas_role_group_id") + private Long saasRoleGroupId; + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SaasRoleGroupRelation that = (SaasRoleGroupRelation) o; + return Objects.equals(roleId, that.roleId) && Objects.equals(saasRoleGroupId, that.saasRoleGroupId); + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleUserRelation.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleUserRelation.java new file mode 100644 index 00000000..ca3c4687 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/SaasRoleUserRelation.java @@ -0,0 +1,86 @@ +package cn.axzo.tyr.server.repository.entity; + +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.client.model.enums.IdentityType; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.io.Serializable; + +/** + * saas-角色用户关联表(SaasRoleUserRelation)表实体类 + * + * @author makejava + * @since 2022-05-24 11:18:41 + */ +@Getter +@Setter +@ToString +@EqualsAndHashCode(callSuper = true) +@TableName("saas_role_user_relation") +public class SaasRoleUserRelation extends BaseEntity { + + /** + * 身份Id + */ + private Long identityId; + + /** + * 身份类型 1:工人 2:从业人员 3:班组长 4:运营人员 5:政务人员 + */ + private Integer identityType; + + /** + * 角色Id + */ + private Long roleId; + + /** + * 自然人Id + */ + private Long naturalPersonId; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 所属单位Id 用户在当前工作台的所属单位 + */ + private Long ouId; + + /** + * 工作台Id + */ + private Long workspaceId; + + /** + * 资源类型 + */ + private Integer resourceType; + + /** + * 资源Id + */ + private Long resourceId; + + /** + * 获取主键值 + * + * @return 主键值 + */ + @Override + protected Serializable pkVal() { + return this.id; + } +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/package-info.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/package-info.java deleted file mode 100644 index f2633475..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.axzo.tyr.server.repository.entity; \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/user/User.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/user/User.java deleted file mode 100644 index 3ceee26d..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/entity/user/User.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.axzo.tyr.server.repository.entity.user; - -import cn.axzo.framework.data.mybatisplus.model.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -/** - * @Author: liyong.tian - * @Date: 2022/9/5 - * @Description: - */ -@Data -@TableName("b_user") -public class User extends BaseEntity { - - private String name; - - private Integer sex; - - private Integer age; - - private String phone; - - private String email; - - private String address; -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/ProductModuleMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/ProductModuleMapper.java new file mode 100644 index 00000000..f5158c8f --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/ProductModuleMapper.java @@ -0,0 +1,15 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.ProductModule; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * saas-产品表(SaasProduct)表数据库访问层 + * + * @author makejava + * @since 2022-05-24 11:15:00 + */ +public interface ProductModuleMapper extends BaseMapper { + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasBasicDictMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasBasicDictMapper.java new file mode 100644 index 00000000..bae7c405 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasBasicDictMapper.java @@ -0,0 +1,17 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasBasicDict; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author: chenwenjian + * @date: 2023/9/7 17:41 + * @description: + * @modifiedBy: + * @version: 1.0 + */ +@Mapper +public interface SaasBasicDictMapper extends BaseMapper { + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureMapper.java new file mode 100644 index 00000000..c5f38ccb --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureMapper.java @@ -0,0 +1,21 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasFeature; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Update; + +/** + *

+ * Mapper 接口 + *

+ * + * @author ZhanSiHu + * @since 2023-09-06 + */ +public interface SaasFeatureMapper extends BaseMapper { + + @Update("UPDATE saas_feature " + + "SET path = REPLACE(path,#{pathPrefix}, #{newPathPrefix}) , update_by = #{updater} " + + "WHERE path LIKE CONCAT(#{pathPrefix},'%') ") + void updateChildrenPath(Long updater, String pathPrefix, String newPathPrefix); +} \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPermissionGroupMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPermissionGroupMapper.java new file mode 100644 index 00000000..4ad68967 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPermissionGroupMapper.java @@ -0,0 +1,10 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasPermissionGroup; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +@Mapper +public interface SaasPermissionGroupMapper extends BaseMapper { + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPermissionGroupScopeMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPermissionGroupScopeMapper.java new file mode 100644 index 00000000..9a6ce08e --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPermissionGroupScopeMapper.java @@ -0,0 +1,11 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasPermissionGroupScope; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SaasPermissionGroupScopeMapper extends BaseMapper { + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPgroupPermissionRelationMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPgroupPermissionRelationMapper.java new file mode 100644 index 00000000..566ff109 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPgroupPermissionRelationMapper.java @@ -0,0 +1,12 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; +import cn.axzo.tyr.server.repository.entity.SaasRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SaasPgroupPermissionRelationMapper extends BaseMapper { + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPgroupRoleRelationMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPgroupRoleRelationMapper.java new file mode 100644 index 00000000..061aca58 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasPgroupRoleRelationMapper.java @@ -0,0 +1,11 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SaasPgroupRoleRelationMapper extends BaseMapper { + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasProductModuleFeatureRelationMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasProductModuleFeatureRelationMapper.java new file mode 100644 index 00000000..74a17178 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasProductModuleFeatureRelationMapper.java @@ -0,0 +1,15 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * 产品-菜单关联关系(SaasProductModuleFeatureRelation)表数据库访问层 + * + * @author makejava + * @since 2022-05-24 11:18:41 + */ +public interface SaasProductModuleFeatureRelationMapper extends BaseMapper { + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleGroupMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleGroupMapper.java new file mode 100644 index 00000000..e6c7c56d --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleGroupMapper.java @@ -0,0 +1,11 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SaasRoleGroupMapper extends BaseMapper { + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleGroupRelationMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleGroupRelationMapper.java new file mode 100644 index 00000000..bdc39ded --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleGroupRelationMapper.java @@ -0,0 +1,11 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SaasRoleGroupRelationMapper extends BaseMapper { + +} + 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 new file mode 100644 index 00000000..2ceeb2d8 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java @@ -0,0 +1,11 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SaasRoleMapper extends BaseMapper { + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleUserRelationMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleUserRelationMapper.java new file mode 100644 index 00000000..60dd9d61 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleUserRelationMapper.java @@ -0,0 +1,12 @@ +package cn.axzo.tyr.server.repository.mapper; + +import cn.axzo.tyr.server.repository.entity.SaasRole; +import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SaasRoleUserRelationMapper extends BaseMapper { + +} + diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/UserMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/UserMapper.java deleted file mode 100644 index 0f0704f9..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/UserMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.axzo.tyr.server.repository.mapper; - -import cn.axzo.tyr.server.repository.entity.user.User; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - * @Author: liyong.tian - * @Date: 2022/9/5 - * @Description: - */ -@Mapper -public interface UserMapper extends BaseMapper { -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionGroupService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionGroupService.java new file mode 100644 index 00000000..4cb5ce60 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionGroupService.java @@ -0,0 +1,40 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.framework.domain.page.PageResp; +import cn.axzo.tyr.client.model.enums.PermissionGroupType; +import cn.axzo.tyr.client.model.req.QuerySaasPermissionGroupReq; +import cn.axzo.tyr.client.model.vo.DeletePermissionGroupVO; +import cn.axzo.tyr.client.model.vo.SaasPermissionGroupVO; +import cn.axzo.tyr.client.model.vo.SaveOrUpdatePermissionGroupVO; +import cn.axzo.tyr.client.model.vo.SavePermissionGroupPPVO; +import cn.axzo.tyr.server.repository.entity.SaasPermissionGroup; + +/** + * 角色 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 15:51 + */ +public interface PermissionGroupService { + /** + * 接口需要区分查分页或者查询list + * 默认查询page + * @param req + * @return + */ + PageResp page(QuerySaasPermissionGroupReq req); + + void savePermissionPoints(SavePermissionGroupPPVO save); + + /** + * 新增或者编辑例外权限 + * @param permissionGroup + * @return + */ + Long saveOrUpdateSpecial(SaveOrUpdatePermissionGroupVO permissionGroup); + + SaasPermissionGroup getRequiredPermissionGroup(Long permissionGroupId, PermissionGroupType type); + + void deletePermissionGroupSpecial(DeletePermissionGroupVO group); +} 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 new file mode 100644 index 00000000..e423c645 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionPointService.java @@ -0,0 +1,46 @@ +package cn.axzo.tyr.server.service; + +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 java.util.List; + +/** + * 权限点服务 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 15:51 + */ +public interface PermissionPointService { + + /** + * 权限点条件查询 + * **/ + List listTreeNodes(PermissionPointTreeQueryReq request); + + /** + * 根据权限点ID查询基本信息 + * **/ + List listNodesByIds(List permissionIds); + + /** + * 根据权限点ID查询详情 + * **/ + PermissionPointVO getDetail(Long permissionId); + + /** 保存权限点 **/ + PermissionPointDTO save(PermissionPointDTO dto); + + /** 删除权限点 返回business_no **/ + List delete(Long permissionId); + + /** 位置移动-父级和排序 **/ + void move(PermissionPointMoveRequest request); + + List queryList(PermissionPointListQueryRequest request); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductFeatureRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductFeatureRelationService.java new file mode 100644 index 00000000..df2c25ce --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductFeatureRelationService.java @@ -0,0 +1,20 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO; + +import java.util.List; + +/** + * 产品与权限点的 Service 接口定义 + * + * @author wangli + * @since 2023/9/7 14:26 + */ +public interface ProductFeatureRelationService { + ApiResult> featureList(ProductFeatureRelationSearchReq req); + + ApiResult updateFeatureRelation(List 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 new file mode 100644 index 00000000..df47aaf6 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductService.java @@ -0,0 +1,32 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.framework.domain.web.result.ApiPageResult; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.product.ProductAddReq; +import cn.axzo.tyr.client.model.product.ProductSearchListReq; +import cn.axzo.tyr.client.model.product.ProductSearchPageReq; +import cn.axzo.tyr.client.model.product.ProductUpdateReq; +import cn.axzo.tyr.client.model.product.ProductVO; + +import java.util.List; + +/** + * 产品相关 Service 接口定义 + * + * @author wangli + * @since 2023/9/7 14:21 + */ +public interface ProductService { + ApiResult> list(ProductSearchListReq req); + + + ApiPageResult page(ProductSearchPageReq req); + + ApiResult getById(Long id); + + ApiResult add(ProductAddReq req); + + ApiResult update(ProductUpdateReq req); + + ApiResult delete(Long id); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java new file mode 100644 index 00000000..8d17e03a --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/RoleService.java @@ -0,0 +1,32 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; +import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.res.IsSuperAdminRes; +import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; +import cn.axzo.tyr.client.model.vo.SaasRoleVO; +import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; + +import java.util.List; +import java.util.Map; + +/** + * 角色 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 15:51 + */ +public interface RoleService { + + + List queryByIdentityIdType(Long identityId, Integer identityType,Long workspaceId,Long ouId); + + List query(QuerySaasRoleReq req); + + List queryBatchByIdentityIdType(List req); + + Long saveOrUpdate(SaveOrUpdateRoleVO saveOrUpdateRole); + + List isSuperAdmin(List req); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasBasicDictService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasBasicDictService.java new file mode 100644 index 00000000..5601373b --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasBasicDictService.java @@ -0,0 +1,32 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.client.model.dict.request.*; +import cn.axzo.tyr.client.model.dict.response.BasicDictNodeResp; +import cn.axzo.tyr.client.model.dict.response.BasicDictTreeResp; + +import java.util.List; + +/** + * @author: chenwenjian + * @date: 2023/9/7 17:54 + * @description: + * @modifiedBy: + * @version: 1.0 + */ +public interface SaasBasicDictService { + List getBasicDictNodeList(BasicDictQueryReq req); + + List getBasicDictNodeTree(BasicDictQueryReq req); + + BasicDictNodeResp getById(Long id); + + BasicDictNodeResp getBasicDictNode(BasicDictNodeReq req); + + Long create(BasicDictCreateReq req); + + Boolean update(BasicDictUpdateReq req); + + Boolean updateStauts(BasicDictUpdateStatusReq req); + + BasicDictNodeResp getWorkspaceType(String workspaceType); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPermissionGroupScopeService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPermissionGroupScopeService.java new file mode 100644 index 00000000..f5de1fbd --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPermissionGroupScopeService.java @@ -0,0 +1,9 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.server.repository.entity.SaasPermissionGroupScope; + +import java.util.List; + +public interface SaasPermissionGroupScopeService { + void saveOrUpdate(List pgroupIds, List scopes); +} 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 new file mode 100644 index 00000000..a32f8627 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java @@ -0,0 +1,9 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; + +import java.util.List; + +public interface SaasPgroupPermissionRelationService { + void saveOrUpdate(List groupIds, List relations); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupRelationService.java new file mode 100644 index 00000000..b8ae8a52 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupRelationService.java @@ -0,0 +1,9 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; + +import java.util.List; + +public interface SaasRoleGroupRelationService { + void saveOrUpdate(List relations); +} 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 new file mode 100644 index 00000000..1324c6c5 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java @@ -0,0 +1,14 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; +import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; + +import java.util.List; + +public interface SaasRoleGroupService { + List getList(QuerySaasRoleGroupReq req); + + Long saveOrUpdate(SaasRoleGroupVO req); + + void delete(List ids); +} 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 new file mode 100644 index 00000000..19c8e585 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserRelationService.java @@ -0,0 +1,18 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserRelationDTO; +import cn.axzo.tyr.client.model.roleuser.req.DeleteRoleUserParam; +import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author haiyangjin + * @date 2023/9/14 + */ +public interface SaasRoleUserRelationService { + List list(RoleUserParam param); +} 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 new file mode 100644 index 00000000..50eddab2 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java @@ -0,0 +1,37 @@ +package cn.axzo.tyr.server.service; + +import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.roleuser.req.DeleteRoleUserParam; +import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; +import cn.axzo.tyr.client.model.roleuser.req.RoleUserReq; +import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author tanjie@axzo.cn + * @date 2023/9/13 15:36 + */ +public interface SaasRoleUserService { + + void saveOrUpdate( RoleUserReq req); + + /** + * 删除用户角色,但是不能删除超管 + * + * @param param + * @return + */ + boolean deleteUserAllRoles(List param); + + /** + * 是超管 + * + * @param identityId + * @param workspaceId + * @param ouId + * @return + */ + boolean isSuperAdmin(Long identityId, IdentityType identityType, Long workspaceId, Long ouId); +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/converter/EntityConverter.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/converter/EntityConverter.java deleted file mode 100644 index 1dd728f1..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/converter/EntityConverter.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.axzo.tyr.server.service.converter; - -import java.util.List; - -/** - * @Author: liyong.tian - * @Date: 2022/9/5 - * @Description: - */ -public interface EntityConverter{ - - V toVo(E var); - - List toVo(List var); -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/converter/UserConverter.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/converter/UserConverter.java deleted file mode 100644 index af7010d8..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/converter/UserConverter.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.axzo.tyr.server.service.converter; - -import cn.axzo.tyr.server.service.dto.request.user.NewUserDTO; -import cn.axzo.tyr.server.service.dto.request.user.UpdateUserDTO; -import cn.axzo.tyr.server.service.dto.response.user.UserVO; -import cn.axzo.tyr.server.repository.entity.user.User; -import org.mapstruct.Mapper; -import org.mapstruct.MappingTarget; - -import static org.mapstruct.NullValueCheckStrategy.ALWAYS; - -/** - * @Author: liyong.tian - * @Date: 2022/9/2 - * @Description: - */ -@Mapper( - componentModel = "spring", - nullValueCheckStrategy = ALWAYS -) -public interface UserConverter extends EntityConverter { - - User toEntity(NewUserDTO dto); - - void updateEntity(UpdateUserDTO dto, @MappingTarget User user); -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/package-info.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/package-info.java deleted file mode 100644 index 8f23be65..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.axzo.tyr.server.service.dto.request; \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/NewUserDTO.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/NewUserDTO.java deleted file mode 100644 index 732aefe6..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/NewUserDTO.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.axzo.tyr.server.service.dto.request.user; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.apache.commons.lang3.StringUtils; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -/** - * @Author: liyong.tian - * @Date: 2022/9/2 - * @Description: - */ -@Data -public class NewUserDTO { - - @ApiModelProperty(value = "名称", position = 1) - @NotBlank(message = "名称不能为空") - private String name; - - @ApiModelProperty(value = "性别", position = 2) - @NotNull - private Integer sex; - - @ApiModelProperty(value = "年龄", position = 3) - private Integer age; - - @ApiModelProperty(value = "电话", position = 4) - private String phone; - - @ApiModelProperty(value = "邮箱", position = 5) - private String email; - - @ApiModelProperty(value = "地址", position = 6) - private String address; - - public void valid() { - // 电话和邮箱不能都为空 - if (StringUtils.isEmpty(phone) && StringUtils.isEmpty(email)) { - throw new RuntimeException("电话和邮箱不能都为空"); - } - } -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/UpdateUserDTO.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/UpdateUserDTO.java deleted file mode 100644 index bec543a7..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/UpdateUserDTO.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.axzo.tyr.server.service.dto.request.user; - -import cn.axzo.framework.domain.web.ApiException; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.apache.commons.lang3.StringUtils; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -import static cn.axzo.tyr.server.common.enums.ErrorCode.USER_PHONE_EMAIL_IS_NULL; - -/** - * @Author: liyong.tian - * @Date: 2022/9/5 - * @Description: - */ -@Data -public class UpdateUserDTO { - - @ApiModelProperty(value = "名称", position = 1) - @NotBlank(message = "名称不能为空") - private String name; - - @ApiModelProperty(value = "性别", position = 2) - @NotNull - private Integer sex; - - @ApiModelProperty(value = "年龄", position = 3) - private Integer age; - - @ApiModelProperty(value = "电话", position = 4) - private String phone; - - @ApiModelProperty(value = "邮箱", position = 5) - private String email; - - @ApiModelProperty(value = "地址", position = 6) - private String address; - - public void valid() { - // 电话和邮箱不能都为空 - if (StringUtils.isEmpty(phone) && StringUtils.isEmpty(email)) { - throw new ApiException(USER_PHONE_EMAIL_IS_NULL); - } - } -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/UserQO.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/UserQO.java deleted file mode 100644 index 090a549b..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/UserQO.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.axzo.tyr.server.service.dto.request.user; - -import cn.axzo.framework.domain.page.PageQO; -import io.swagger.annotations.ApiParam; -import lombok.Data; - -/** - * @Author: liyong.tian - * @Date: 2022/9/5 - * @Description: - */ -@Data -public class UserQO extends PageQO { - - @ApiParam("主键") - private Long id; - - @ApiParam("姓名") - private String name; - - @ApiParam("手机") - private String phone; - - @ApiParam("邮箱") - private String email; -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/UserQO1.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/UserQO1.java deleted file mode 100644 index 09c4dac5..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/request/user/UserQO1.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.axzo.tyr.server.service.dto.request.user; - -import cn.axzo.framework.domain.page.PageQO; -import io.swagger.annotations.ApiParam; -import lombok.Data; - -/** - * @Author: liyong.tian - * @Date: 2022/9/5 - * @Description: - */ -@Data -public class UserQO1 { - - @ApiParam("主键") - private Long id; - - @ApiParam("姓名") - private String name; - - @ApiParam("手机") - private String phone; - - @ApiParam("邮箱") - private String email; -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/response/package-info.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/response/package-info.java deleted file mode 100644 index 28c9eaaf..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/response/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.axzo.tyr.server.service.dto.response; \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/response/user/UserVO.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/response/user/UserVO.java deleted file mode 100644 index 8317e4cd..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/dto/response/user/UserVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.axzo.tyr.server.service.dto.response.user; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @Author: liyong.tian - * @Date: 2022/9/2 - * @Description: - */ -@Data -public class UserVO { - - @ApiModelProperty(value = "id", position = 1) - private Long id; - - @ApiModelProperty(value = "名称", position = 2) - private String name; - - @ApiModelProperty(value = "性别", position = 3) - private Integer sex; - - @ApiModelProperty(value = "年龄", position = 4) - private Integer age; - - @ApiModelProperty(value = "电话", position = 5) - private String phone; - - @ApiModelProperty(value = "邮箱", position = 6) - private String email; - - @ApiModelProperty(value = "地址", position = 7) - private String address; -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/event/package-info.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/event/package-info.java deleted file mode 100644 index 0d058404..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/event/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.axzo.tyr.server.service.event; \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionGroupImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionGroupImpl.java new file mode 100644 index 00000000..1d100032 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionGroupImpl.java @@ -0,0 +1,384 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.framework.domain.page.PageResp; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.client.model.enums.PermissionGroupType; +import cn.axzo.tyr.client.model.enums.PermissionScope; +import cn.axzo.tyr.client.model.enums.PermissionScopeType; +import cn.axzo.tyr.client.model.permission.PermissionPointTreeNode; +import cn.axzo.tyr.client.model.req.QuerySaasPermissionGroupReq; +import cn.axzo.tyr.client.model.vo.*; +import cn.axzo.tyr.server.repository.dao.*; +import cn.axzo.tyr.server.repository.entity.*; +import cn.axzo.tyr.server.service.PermissionGroupService; +import cn.axzo.tyr.server.service.PermissionPointService; +import cn.axzo.tyr.server.service.SaasPermissionGroupScopeService; +import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +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.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 权限集 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 15:51 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class PermissionGroupImpl implements PermissionGroupService { + private final SaasPermissionGroupDao permissionGroupDao; + private final SaasPgroupRoleRelationDao pgroupRoleRelationDao; + private final SaasPgroupPermissionRelationDao permissionRelationDao; + private final PermissionPointService featureService; + private final SaasPermissionGroupScopeDao saasPermissionGroupScopeDao; + private final SaasPgroupPermissionRelationService saasPgroupPermissionRelationService; + private final SaasRoleDao saasRoleDao; + private final SaasPermissionGroupScopeService saasPermissionGroupScopeService; + + @Override + public PageResp page(QuerySaasPermissionGroupReq req) { + if (CollectionUtils.isEmpty(req.getWorkspaceId())) { + req.setWorkspaceId(Arrays.asList(-1L)); + } else if(!req.getWorkspaceId().contains(-1L)){ + req.getWorkspaceId().add(-1L); + } + if (CollectionUtils.isEmpty(req.getOuId())) { + req.setOuId(Arrays.asList(-1L)); + } else if (!req.getOuId().contains(-1L)) { + req.getOuId().add(-1L); + } + // 如果角色id不为空则先查询角色权限集关联表 + IPage iPage = req.toPage(); + List relationList = null; + if (CollectionUtils.isNotEmpty(req.getRoleIds())) { + relationList = pgroupRoleRelationDao.lambdaQuery() + .in(SaasPgroupRoleRelation::getRoleId, req.getRoleIds()) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + List hitIds = relationList.stream().map(SaasPgroupRoleRelation::getGroupId).distinct().collect(Collectors.toList()); + if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(req.getIds())) { + req.getIds().retainAll(hitIds); + } else { + req.setIds(hitIds); + } + // 如果没查询到关联关系则直接返回 + if (CollectionUtils.isEmpty(relationList)) { + return PageResp.zero(iPage.getCurrent(), iPage.getSize()); + } + } + // 查询权限集 + LambdaQueryChainWrapper lambdaQueryWrapper = permissionGroupDao.lambdaQuery() + .in(CollectionUtils.isNotEmpty(req.getIds()), BaseEntity::getId, req.getIds()) + .eq(req.getIsCommon() != null, SaasPermissionGroup::getIsCommon, req.getIsCommon()) + .eq(req.getCreateBy() != null, SaasPermissionGroup::getCreateBy, req.getCreateBy()) + .eq(req.getUpdateBy() != null, SaasPermissionGroup::getUpdateBy, req.getUpdateBy()) + .eq(StringUtils.isNotBlank(req.getType()), SaasPermissionGroup::getType, req.getType()) + .like(StringUtils.isNotBlank(req.getName()), SaasPermissionGroup::getName, req.getName()) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .orderByAsc(BaseEntity::getCreateAt).orderByAsc(BaseEntity::getId); + List groupList; + if (BooleanUtils.isTrue(req.getFetchPage())) { + // 分页 + iPage = lambdaQueryWrapper.page(iPage); + groupList = iPage.getRecords(); + } else { + groupList = lambdaQueryWrapper.list(); + iPage.setTotal(groupList.size()); + } + + // 如果权限集为空则直接返回 + if (CollectionUtils.isEmpty(groupList)) { + return PageResp.zero(iPage.getCurrent(), iPage.getSize()); + } + List groupIds = groupList.stream().map(BaseEntity::getId).collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(relationList)) { + relationList = pgroupRoleRelationDao.lambdaQuery() + .in(SaasPgroupRoleRelation::getGroupId, groupIds) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + } + // 角色和权限集是1Vn 关系,权限集必然依附角色存在 + Map pgrrMap = relationList.stream().collect(Collectors.toMap(SaasPgroupRoleRelation::getGroupId, Function.identity(), (e1, e2) -> e2)); + + // 查询权限集关联的权限 + List permissionList = permissionRelationDao.lambdaQuery() + .in(SaasPgroupPermissionRelation::getGroupId, groupIds) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + List features = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(permissionList)) { + // 查询全部featureCode + features = featureService.listNodesByIds(permissionList.stream().map(SaasPgroupPermissionRelation::getFeatureId).collect(Collectors.toList())); + } + Map featureMap = features.stream().collect(Collectors.toMap(PermissionPointTreeNode::getPermissionPointId, Function.identity(), (e1, e2) -> e2)); + Map> pgroupPermissionMap = permissionList.stream() + .collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getGroupId, + Collectors.mapping(releation -> featureMap.get(releation.getFeatureId()), Collectors.toList()))); + List saasPermissionGroupScopesSource = saasPermissionGroupScopeDao.lambdaQuery() + .in(SaasPermissionGroupScope::getPgroupId, groupIds) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + // 过滤权限集作用范围 + List workspaceIdWithOutCommon = req.getWorkspaceId().stream().filter(workspaceId -> !workspaceId.equals(-1L)).collect(Collectors.toList()); + List ouIdWithOutCommon = req.getOuId().stream().filter(ouId -> !ouId.equals(-1L)).collect(Collectors.toList()); + List saasPermissionGroupScopes = saasPermissionGroupScopesSource.stream().filter(e -> { + // 过滤出选中的工作台 + if (PermissionScopeType.WORKSPACE.getCode().equals(e.getScopeType())) { + if (CollectionUtils.isNotEmpty(workspaceIdWithOutCommon) && ! workspaceIdWithOutCommon.contains(e.getScopeId())) { + return false; + } + }else { + // 过滤出选中的单位 + if (CollectionUtils.isNotEmpty(ouIdWithOutCommon) && ! ouIdWithOutCommon.contains(e.getScopeId())) { + return false; + } + } + return true; + }).collect(Collectors.toList()); + Map> permissionGroupScopeMap = saasPermissionGroupScopes.stream().collect(Collectors.groupingBy(SaasPermissionGroupScope::getPgroupId, Collectors.mapping(e -> BeanMapper.copyBean(e, SaasRolePermissionScopeVO.class), Collectors.toList()))); + // 组装填充字段 + List pageList = groupList.stream().map(group -> { + SaasPermissionGroupVO pgroupResult = SaasPermissionGroupVO.builder() + .id(group.getId()) + .name(group.getName()) + .scopes(Optional.ofNullable(permissionGroupScopeMap.get(group.getId())).orElse(new ArrayList<>())) + .feature(Optional.ofNullable(pgroupPermissionMap.get(group.getId())).orElse(new ArrayList<>())) + .createBy(group.getCreateBy()) + .creatorName(group.getCreatorName()) + .updateBy(group.getUpdateBy()) + .updatorName(group.getUpdatorName()) + .roleId(Optional.ofNullable(pgrrMap.get(group.getId())).map(SaasPgroupRoleRelation::getRoleId).orElse(null)) + .type(group.getType()) + .isCommon(group.getIsCommon()) + .createAt(group.getCreateAt()) + .updateAt(group.getUpdateAt()) + .build(); + return pgroupResult; + } + ).collect(Collectors.toList()); + return PageResp.list(iPage.getCurrent(), iPage.getSize(), iPage.getTotal(), pageList); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void savePermissionPoints(SavePermissionGroupPPVO save) { + SaasPermissionGroup saasPermissionGroup = getRequiredPermissionGroup(save.getId(), null); + List pgpRelations = Optional.ofNullable(save.getSelectedPPIds()).orElse(new ArrayList<>()).stream().map(ppId -> { + SaasPgroupPermissionRelation target = new SaasPgroupPermissionRelation(); + target.setGroupId(saasPermissionGroup.getId()); + target.setFeatureId(ppId); + target.setCreateBy(save.getOperatorId()); + target.setUpdateBy(save.getOperatorId()); + return target; + }).collect(Collectors.toList()); + saasPgroupPermissionRelationService.saveOrUpdate(Lists.newArrayList(saasPermissionGroup.getId()), pgpRelations); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long saveOrUpdateSpecial(SaveOrUpdatePermissionGroupVO permissionGroup) { + Date now = new Date(); + SaasPermissionGroup saasPermissionGroup = validAndBuildPermissionGroup(permissionGroup, now); + permissionGroupDao.saveOrUpdate(saasPermissionGroup); + if (Objects.isNull(permissionGroup.getId())) { + SaasPgroupRoleRelation roleRelation = new SaasPgroupRoleRelation(); + roleRelation.setRoleId(permissionGroup.getRoleId()); + roleRelation.setGroupId(saasPermissionGroup.getId()); + roleRelation.setCreateBy(permissionGroup.getOperatorId()); + roleRelation.setUpdateBy(permissionGroup.getOperatorId()); + roleRelation.setCreateAt(now); + roleRelation.setUpdateAt(now); + pgroupRoleRelationDao.save(roleRelation); + } + List scopes = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(permissionGroup.getSelectedWorkspace())) { + scopes.addAll(permissionGroup.getSelectedWorkspace().stream().map(w -> { + SaasPermissionGroupScope scope = new SaasPermissionGroupScope(); + scope.setPgroupId(saasPermissionGroup.getId()); + scope.setType(w.getType()); + scope.setScopeType(PermissionScopeType.WORKSPACE.getCode()); + scope.setScopeId(w.getScopeId()); + scope.setCreateAt(now); + scope.setUpdateAt(now); + return scope; + }).collect(Collectors.toList())); + } + if (CollectionUtils.isNotEmpty(permissionGroup.getSelectedOu())) { + scopes.addAll(permissionGroup.getSelectedOu().stream().map(w -> { + SaasPermissionGroupScope scope = new SaasPermissionGroupScope(); + scope.setPgroupId(saasPermissionGroup.getId()); + scope.setType(w.getType()); + scope.setScopeType(PermissionScopeType.OU.getCode()); + scope.setScopeId(w.getScopeId()); + scope.setCreateAt(now); + scope.setUpdateAt(now); + return scope; + }).collect(Collectors.toList())); + } + saasPermissionGroupScopeService.saveOrUpdate(Lists.newArrayList(saasPermissionGroup.getId()), scopes); + return saasPermissionGroup.getId(); + } + + @Override + public SaasPermissionGroup getRequiredPermissionGroup(Long permissionGroupId, PermissionGroupType type) { + List groups = permissionGroupDao.lambdaQuery() + .eq(SaasPermissionGroup::getId, permissionGroupId) + .eq(SaasPermissionGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + if (CollectionUtils.isEmpty(groups)) { + throw new ServiceException("权限集不存在"); + } + SaasPermissionGroup saasPermissionGroup = groups.get(0); + if (Objects.nonNull(type) && !Objects.equals(saasPermissionGroup.getIsCommon(), type.getCode())) { + throw new ServiceException(String.format("权限集不是%s权限集", type.getDesc())); + } + return saasPermissionGroup; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deletePermissionGroupSpecial(DeletePermissionGroupVO group) { + List relations = pgroupRoleRelationDao.lambdaQuery().eq(SaasPgroupRoleRelation::getRoleId, group.getRoleId()) + .in(SaasPgroupRoleRelation::getGroupId, group.getSpecialPermissionGroupIds()) + .eq(SaasPgroupRoleRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + if (CollectionUtils.isEmpty(relations)) { + throw new ServiceException("权限集不存在"); + } + List deleteGroupIds = relations.stream().map(SaasPgroupRoleRelation::getGroupId).sorted().collect(Collectors.toList()); + List groups = permissionGroupDao.lambdaQuery() + .in(SaasPermissionGroup::getId, deleteGroupIds) + .eq(SaasPermissionGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + if (groups.stream().anyMatch(e -> !Objects.equals(e.getIsCommon(), PermissionGroupType.SPECIAL.getCode()))) { + throw new ServiceException("只能删除例外权限集"); + } + //删除角色关联 + pgroupRoleRelationDao.removeByIds(relations.stream().map(SaasPgroupRoleRelation::getId).sorted().collect(Collectors.toList())); + List scopes = saasPermissionGroupScopeDao.lambdaQuery().in(SaasPermissionGroupScope::getPgroupId, deleteGroupIds) + .eq(SaasPermissionGroupScope::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + if (CollectionUtils.isNotEmpty(scopes)) { + // 删除例外scope + saasPermissionGroupScopeDao.removeByIds(scopes.stream().map(SaasPermissionGroupScope::getId).sorted().collect(Collectors.toList())); + } + List pgroupPermissionRelations = permissionRelationDao.lambdaQuery().in(SaasPgroupPermissionRelation::getGroupId, deleteGroupIds) + .eq(SaasPgroupPermissionRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + // 删除权限集和权限点关联关系 + if (CollectionUtils.isNotEmpty(pgroupPermissionRelations)) { + permissionRelationDao.removeByIds(pgroupPermissionRelations.stream().map(SaasPgroupPermissionRelation::getId).sorted().collect(Collectors.toList())); + } + // 删除权限集 + permissionGroupDao.lambdaUpdate() + .in(BaseEntity::getId,deleteGroupIds) + .set(BaseEntity::getIsDelete, TableIsDeleteEnum.DELETE.value) + .set(BaseEntity::getUpdateAt, new Date()) + .set(SaasPermissionGroup::getUpdateBy, group.getOperatorId()) + .set(SaasPermissionGroup::getUpdatorName, group.getOperatorName()) + .update(); + } + + private SaasPermissionGroup validAndBuildPermissionGroup(SaveOrUpdatePermissionGroupVO permissionGroup, Date now) { + // 验证角色是否存在 + SaasRole saasRole = saasRoleDao.getById(permissionGroup.getRoleId()); + if (Objects.isNull(saasRole)) { + throw new ServiceException("角色不存在"); + } + if (Objects.nonNull(permissionGroup.getId())) { + int relationCount = pgroupRoleRelationDao.lambdaQuery() + .eq(SaasPgroupRoleRelation::getRoleId, permissionGroup.getRoleId()) + .eq(SaasPgroupRoleRelation::getGroupId, permissionGroup.getId()) + .eq(SaasPgroupRoleRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).count(); + if (relationCount == 0) { + throw new ServiceException("角色和权限组不存在关联关系"); + } + } + validPermissionGroupScope(permissionGroup); + SaasPermissionGroup saasPermissionGroup; + if (Objects.isNull(permissionGroup.getId())) { + saasPermissionGroup = new SaasPermissionGroup(); + saasPermissionGroup.setCreateBy(permissionGroup.getOperatorId()); + saasPermissionGroup.setCreatorName(Optional.ofNullable(permissionGroup.getOperatorName()).orElse("")); + saasPermissionGroup.setIsCommon(PermissionGroupType.SPECIAL.getCode()); + saasPermissionGroup.setCreateAt(now); + } else { + saasPermissionGroup = getRequiredPermissionGroup(permissionGroup.getId(), PermissionGroupType.SPECIAL); + } + saasPermissionGroup.setType(permissionGroup.getType()); + saasPermissionGroup.setName(permissionGroup.getName()); + saasPermissionGroup.setUpdateBy(permissionGroup.getOperatorId()); + saasPermissionGroup.setUpdatorName(Optional.ofNullable(permissionGroup.getOperatorName()).orElse("")); + saasPermissionGroup.setDescription(permissionGroup.getDescription()); + saasPermissionGroup.setUpdateAt(now); + List relations = pgroupRoleRelationDao.lambdaQuery().eq(SaasPgroupRoleRelation::getRoleId, permissionGroup.getRoleId()) + .eq(SaasPgroupRoleRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + if (CollectionUtils.isNotEmpty(relations)) { + List groupIds = relations.stream().map(SaasPgroupRoleRelation::getGroupId).sorted().collect(Collectors.toList()); + List groups = permissionGroupDao.lambdaQuery().in(SaasPermissionGroup::getId, groupIds).eq(SaasPermissionGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + Optional repeatName = groups.stream().filter(g -> !Objects.equals(g.getId(), saasPermissionGroup.getId()) && StringUtils.equalsIgnoreCase(saasPermissionGroup.getName(), g.getName())) + .findFirst(); + if (repeatName.isPresent()) { + throw new ServiceException("同角色,例外名称不能重复"); + } + } + return saasPermissionGroup; + } + + /** + * 验证例外 + * @param permissionGroup + */ + private void validPermissionGroupScope(SaveOrUpdatePermissionGroupVO permissionGroup) { + List selectedWorkspace = permissionGroup.getSelectedWorkspace(); + List selectedOu = permissionGroup.getSelectedOu(); + Set scopeTypes = new HashSet<>(); + if (CollectionUtils.isEmpty(selectedWorkspace) && CollectionUtils.isEmpty(selectedOu)) { + //throw new ServiceException("例外不能为空"); + return; + } + if (CollectionUtils.isNotEmpty(selectedWorkspace)) { + Map> selectedWorkspaceMap = selectedWorkspace.stream() + .collect(Collectors.groupingBy(SaveOrUpdatePermissionGroupVO.PermissionGroupScopeVO::getType)); + List includeScopes = Optional.ofNullable(selectedWorkspaceMap.get(PermissionScope.INCLUDE.getCode())).orElse(new ArrayList<>()); + List excludeScopes = Optional.ofNullable(selectedWorkspaceMap.get(PermissionScope.EXCLUDE.getCode())).orElse(new ArrayList<>()); + if (includeScopes.size() + excludeScopes.size() != selectedWorkspace.size()) { + throw new ServiceException("选择类型设置错误"); + } + if (CollectionUtils.containsAny(includeScopes, excludeScopes)) { + throw new ServiceException("项目部例外设置冲突"); + } + scopeTypes.addAll(selectedWorkspace.stream().map(SaveOrUpdatePermissionGroupVO.PermissionGroupScopeVO::getType).collect(Collectors.toSet())); + } + if (CollectionUtils.isNotEmpty(selectedOu)) { + Map> selectedOuMap = selectedOu.stream() + .collect(Collectors.groupingBy(SaveOrUpdatePermissionGroupVO.PermissionGroupScopeVO::getType)); + List includeScopes = Optional.ofNullable(selectedOuMap.get(PermissionScope.INCLUDE.getCode())).orElse(new ArrayList<>()); + List excludeScopes = Optional.ofNullable(selectedOuMap.get(PermissionScope.EXCLUDE.getCode())).orElse(new ArrayList<>()); + if (includeScopes.size() + excludeScopes.size() != selectedOu.size()) { + throw new ServiceException("选择类型设置错误"); + } + if (CollectionUtils.containsAny(includeScopes, excludeScopes)) { + throw new ServiceException("单位例外设置冲突"); + } + scopeTypes.addAll(selectedOu.stream().map(SaveOrUpdatePermissionGroupVO.PermissionGroupScopeVO::getType).collect(Collectors.toSet())); + } + // 移除这行,例外设置支持移除和包含 + if (scopeTypes.size() > 1) { + throw new ServiceException("例外类型不能同时指定适用与不适用"); + } + } +} 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 new file mode 100644 index 00000000..8957f3cb --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionPointServiceImpl.java @@ -0,0 +1,528 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.util.StopWatchUtil; +import cn.axzo.basics.common.util.TreeUtil; +import cn.axzo.framework.domain.web.BizException; +import cn.axzo.framework.domain.web.code.BaseCode; +import cn.axzo.tyr.client.model.dict.request.BasicDictNodeReq; +import cn.axzo.tyr.client.model.dict.request.BasicDictQueryReq; +import cn.axzo.tyr.client.model.dict.response.BasicDictNodeResp; +import cn.axzo.tyr.client.model.dict.response.BasicDictTreeResp; +import cn.axzo.tyr.client.model.enums.DictTypeFiledEnum; +import cn.axzo.tyr.client.model.enums.DictWorkSpaceTypeEnum; +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.common.util.Throws; +import cn.axzo.tyr.server.repository.dao.SaasProductModuleFeatureRelationDao; +import cn.axzo.tyr.server.repository.entity.SaasFeature; +import cn.axzo.tyr.server.repository.dao.SaasFeatureDao; +import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao; +import cn.axzo.tyr.server.service.PermissionPointService; +import cn.axzo.tyr.server.service.SaasBasicDictService; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static cn.axzo.tyr.client.model.enums.FeatureType.BUTTON; +import static cn.axzo.tyr.client.model.enums.FeatureType.MODULE; +import static cn.axzo.tyr.server.common.constants.PermissionConstant.*; + +/** + * 权限点服务实现 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 15:51 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class PermissionPointServiceImpl implements PermissionPointService { + + private final SaasFeatureDao saasFeatureDao; + private final SaasBasicDictService saasBasicDictService; + private final SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao; + private final SaasProductModuleFeatureRelationDao saasProductModuleFeatureRelationDao; + + @Override + public List listTreeNodes(PermissionPointTreeQueryReq request) { + StopWatchUtil watch = StopWatchUtil.createStarted("permission-point-tree"); + + watch.start("dbQuery"); + //构建查询条件 + Wrapper queryWrapper = buildQueryWrapper(request); + List list = saasFeatureDao.list(queryWrapper); + watch.stop(); + + //构建树形结构, 整体排序保证层级内的有序 - 优化点:构建树形结构时进行过滤 + watch.start("sort-build-tree"); + List treeList = TreeUtil.buildTree(list.stream() + .map(this::feature2Node) + .sorted(Comparator.comparing(PermissionPointTreeNode::getSort)) + .collect(Collectors.toList())); + list = null; //for GC + watch.stop(); + + //搜索或需要按授权策略过滤 - 有额外的过滤条件 + watch.start("filter-node"); + List nodesResult = filterTreeNode(request, treeList); + watch.stop(); + + //指定parent后不需要顶级的工作台 + if (request.getParentId() != null || CollectionUtil.isEmpty(nodesResult)) { + return nodesResult; + } + //顶级展示 - 非特殊过滤时,没有子节点也应该展示,否则无法新增 + watch.start("build-top"); + boolean needAllTop = StrUtil.isBlank(request.getKeyword()) + && CollectionUtil.isEmpty(request.getTerminalList()) + && CollectionUtil.isEmpty(request.getWorkspaceType()) + && CollectionUtil.isEmpty(request.getIds()); + List resultTree = buildTopNodes(nodesResult, needAllTop); + watch.stop(); + log.info("permission-point-tree cost:{}", watch.prettyPrint()); + //层级过滤 + filterLevel(resultTree, request.getMaxLevel(), 1); + return resultTree; + } + + private void filterLevel(List resultTree, Integer maxLevel, Integer currentLevel) { + if (maxLevel == null || resultTree == null) { + return; + } + if (currentLevel < maxLevel) { + //递归子级 + for (PermissionPointTreeNode node : resultTree) { + filterLevel(node.getChildren(), maxLevel, currentLevel + 1); + } + } else { + //清空下级 + for (PermissionPointTreeNode node : resultTree) { + node.setChildren(null); + } + } + + } + + + private List buildTopNodes(List nodesResult, boolean needAllTop) { + //构建workspace-terminal工作台层级 + + //按terminal分组 + Map> mappingNode = nodesResult.stream() + .collect(Collectors.groupingBy(PermissionPointTreeNode::getTerminal)); + List dictList = saasBasicDictService.getBasicDictNodeTree(BasicDictQueryReq.builder() + .type(DictTypeFiledEnum.TERMINAL).build()); + //遍历所有workspace和terminal-构建顶层两级 + List result = new ArrayList<>(); + for (BasicDictTreeResp workspace : dictList) { + List terminals = workspace.getChildren(); + PermissionPointTreeNode workspaceNode = null; + for (BasicDictTreeResp terminal : terminals) { + //有下级权限点 则建立上级 + List childrenNodes = mappingNode.get(terminal.getCode()); + if (needAllTop || CollectionUtil.isNotEmpty(childrenNodes)) { + //需要保留顶级时,没有子节点也要展示 + PermissionPointTreeNode terminalTree = new PermissionPointTreeNode(); + terminalTree.setPermissionName(terminal.getName()); + terminalTree.setTerminal(terminal.getCode()); + terminalTree.setCode(terminal.getCode()); + terminalTree.setChildren(childrenNodes); + if (workspaceNode == null) { + List terminalChildren = new ArrayList<>(); + workspaceNode = new PermissionPointTreeNode(); + workspaceNode.setPermissionName(workspace.getName()); + workspaceNode.setChildren(terminalChildren); + } + workspaceNode.getChildren().add(terminalTree); + } + } + if (workspaceNode != null) { + result.add(workspaceNode); + } + } + return result; + } + + private Wrapper buildQueryWrapper(PermissionPointTreeQueryReq request) { + //条件转换 workspace --> terminal + workspace2Terminal(request); + //查询条件构建 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .in(CollectionUtil.isNotEmpty(request.getTerminalList()), SaasFeature::getTerminal, request.getTerminalList()) + .le(Objects.nonNull(request.getMaxFeatureType()), SaasFeature::getFeatureType, request.getMaxFeatureType()); + //查指定节点子级处理条件 + if (request.getParentId() != null && request.getParentId() != 0) { + SaasFeature parent = this.saasFeatureDao.getById(request.getParentId()); + if (parent == null) { + log.error("指定的父级节点不存在:{}", request.getParentId()); + Throws.bizException(BaseCode.BAD_REQUEST, "父级节点不存在"); + } + //追加条件path左匹配 + queryWrapper.likeRight(SaasFeature::getPath, parent.getPath() + parent.getId() + FEATURE_PATH_DELIMITER); + } + return queryWrapper; + } + + private void workspace2Terminal(PermissionPointTreeQueryReq request) { + if (CollectionUtil.isNotEmpty(request.getWorkspaceType())) { + List terminals = new ArrayList<>(); + BasicDictQueryReq dictReq = new BasicDictQueryReq(); + for (String workSpaceType : request.getWorkspaceType()) { + dictReq.setWorkspaceType(DictWorkSpaceTypeEnum.getByValue(workSpaceType)); + dictReq.setType(DictTypeFiledEnum.TERMINAL); + List dictList = saasBasicDictService.getBasicDictNodeList(dictReq); + terminals.addAll(dictList.stream().map(BasicDictNodeResp::getCode).collect(Collectors.toList())); + } + request.setTerminalList(terminals); + } + } + + private List filterTreeNode(PermissionPointTreeQueryReq request, List treeList) { + //过滤条件 + boolean needFilter = StrUtil.isNotBlank(request.getKeyword()) + || request.getDelegateType() != 0 + || CollectionUtil.isNotEmpty(request.getIds()); + + if (needFilter) { + return treeList.stream().filter(x -> this.recursionFilter(request, x)).collect(Collectors.toList()); + } + return treeList; + } + + private boolean recursionFilter(PermissionPointTreeQueryReq request, PermissionPointTreeNode node) { + // 过滤参数为空时 认为匹配成功 + //条件匹配 - 关键字 + boolean matchKeyword = request.getKeyword() == null || node.getPermissionName().contains(request.getKeyword()); + + //条件匹配 - 授权策略类型 + boolean matchDelegateType = request.getDelegateType() == 0 || Objects.equals(request.getDelegateType(), node.getDelegatedType()); + + //条件匹配 - ID + boolean matchId = CollectionUtil.isEmpty(request.getIds()) || request.getIds().contains(node.getPermissionPointId()); + + if (matchKeyword && matchDelegateType && matchId) { + //如果匹配直接返回,否则过滤子节点 + return true; + } + + if (CollectionUtil.isEmpty(node.getChildren())) { + return false; + } + //过滤子节点 - 递归 - 必要时改为循环 + List filterChildren = node.getChildren().stream() + .filter(x -> recursionFilter(request, x)) + .collect(Collectors.toList()); + + if (CollectionUtil.isEmpty(filterChildren)) { + return false; + } + node.setChildren(filterChildren); + return true; + } + + @Override + public List listNodesByIds(List permissionIds) { + if (CollectionUtil.isEmpty(permissionIds)) { + return new ArrayList<>(); + } + return this.saasFeatureDao.listByIds(permissionIds) + .stream() + .map(this::feature2Node) + .collect(Collectors.toList()); + } + + @Override + public PermissionPointVO getDetail(Long permissionId) { + + SaasFeature feature = getAndCheck(permissionId); + PermissionPointVO vo = BeanMapper.copyBean(feature, PermissionPointVO.class); + vo.setFeatureTypeDesc(FeatureType.apply(vo.getFeatureType()).getDesc()); + //按位拆分适配单位类型和节点类型 + vo.applyFitOuTypeBit(feature.getFitOuTypeBit()); + vo.applyFitOuNodeTypeBit(feature.getFitOuNodeTypeBit()); + + //补充上级信息 + //最顶级二层 + BasicDictNodeReq terminalReq = new BasicDictNodeReq(); + terminalReq.setCode(feature.getTerminal()); + terminalReq.setType(DictTypeFiledEnum.TERMINAL); + BasicDictNodeResp terminal = saasBasicDictService.getBasicDictNode(terminalReq); + BasicDictNodeResp workspace = saasBasicDictService.getWorkspaceType(terminal.getWorkspaceType()); + List pathName = new ArrayList<>(); + pathName.add(workspace.getName()); + pathName.add(terminal.getName()); + + if (vo.getParentId() == null || vo.getParentId() < 1) { + //没有parent直接挂在工作台下 + vo.setParentName(terminal.getName()); + vo.setPathName(pathName); + return vo; + } + + //查询所有父级 - path拆分查询 + List ids = StrUtil.split(vo.getPath(), FEATURE_PATH_DELIMITER, true, true) + .stream() + .map(Long::valueOf) + .filter(id -> id > 0) + .collect(Collectors.toList()); + Map parentsMapping = this.saasFeatureDao.listByIds(ids) + .stream() + .collect(Collectors.toMap(SaasFeature::getId, Function.identity())); + //填充层级父级名称 直接父级信息 + for (Long parentId : ids) { + SaasFeature saasFeature = parentsMapping.get(parentId); + if (saasFeature != null) { + pathName.add(saasFeature.getFeatureName()); + } + } + vo.setPathName(pathName); + SaasFeature parent = parentsMapping.get(vo.getParentId()); + vo.setParentName(parent.getFeatureName()); + vo.setParentFeatureType(parent.getFeatureType()); + vo.setParentFeatureTypeDes(FeatureType.apply(parent.getFeatureType()).getDesc()); + + return vo; + } + + @Override + public PermissionPointDTO save(PermissionPointDTO dto) { + if (dto.getId() == null) { + return doInsert(dto); + } + return doUpdate(dto); + } + + private PermissionPointDTO doUpdate(PermissionPointDTO dto) { + SaasFeature feature = getAndCheck(dto.getId()); + SaasFeature saasFeature = BeanMapper.copyBean(dto, SaasFeature.class); + saasFeature.setFitOuTypeBit(dto.mergeFitOuTypeBit()); + saasFeature.setFitOuNodeTypeBit(dto.mergeFitOuNodeTypeBit()); + //清理不可直接更新的数据 + saasFeature.setParentId(null); + saasFeature.setPath(null); + saasFeature.setSort(null); + saasFeature.setTerminal(null); + saasFeature.setBusinessNo(null); + this.saasFeatureDao.updateById(saasFeature); + //返回一些要用的数据 + dto.setBusinessNo(feature.getBusinessNo()); + return dto; + } + + private SaasFeature getAndCheck(Long permissionId) { + SaasFeature feature = this.saasFeatureDao.getById(permissionId); + if (feature == null) { + log.error("未查询到权限点:{}", permissionId); + Throws.bizException(BaseCode.BAD_REQUEST, "未查询到权限点"); + } + return feature; + } + + private PermissionPointDTO doInsert(PermissionPointDTO dto) { + SaasFeature saasFeature = BeanMapper.copyBean(dto, SaasFeature.class); + saasFeature.setFitOuTypeBit(dto.mergeFitOuTypeBit()); + saasFeature.setFitOuNodeTypeBit(dto.mergeFitOuNodeTypeBit()); + SaasFeature parent = null; + if (dto.getParentId() == null || dto.getParentId() < 1) { + saasFeature.setParentId(0L); + saasFeature.setPath(FEATURE_TOP_PATH); + saasFeature.setParentBusinessNo(FEATURE_TOP_BIZ_NO); + } else { + parent = this.saasFeatureDao.getById(dto.getParentId()); + saasFeature.setPath(parent.getPath() + parent.getId() + FEATURE_PATH_DELIMITER); + saasFeature.setParentBusinessNo(parent.getBusinessNo()); + } + FeatureType featureType = FeatureType.apply(dto.getFeatureType()); + checkParentType(featureType, parent); + + //生成biz_no + saasFeature.setBusinessNo(FEATURE_BIZ_NO_PREFIX + System.currentTimeMillis()); + this.saasFeatureDao.save(saasFeature); + dto.setId(saasFeature.getId()); + dto.setBusinessNo(saasFeature.getBusinessNo()); + //调整排序 - 兼容处理老数据,数据规范化 + changeSort(saasFeature, saasFeature.getSort()); + return dto; + } + + private void checkParentType(FeatureType featureType, SaasFeature parent) { + //检查父级元素类型 + switch (featureType) { + case MODULE: + if (parent != null) { + Throws.bizException(BaseCode.BAD_REQUEST, "菜单必须为顶级"); + } + break; + case MENU: + //MENU PAGE相同逻辑 + case PAGE: + if (parent == null + || FeatureType.apply(parent.getFeatureType()) == BUTTON) { + Throws.bizException(BaseCode.BAD_REQUEST, "页面层级错误"); + } + break; + case BUTTON: + if (parent == null + || FeatureType.apply(parent.getFeatureType()) == MODULE + || FeatureType.apply(parent.getFeatureType()) == BUTTON) { + Throws.bizException(BaseCode.BAD_REQUEST, "按钮层级错误"); + } + break; + default: + Throws.bizException(BaseCode.BAD_REQUEST, "不支持的元素类型"); + } + } + + @Transactional(rollbackFor = Throwable.class) + @Override + public List delete(Long permissionPointId) { + List delIds = new ArrayList<>(); + List bizNoList = new ArrayList<>(); + SaasFeature feature = getAndCheck(permissionPointId); + //删除自己 + this.saasFeatureDao.removeById(permissionPointId); + delIds.add(feature.getId()); + if (feature.getFeatureType().equals(BUTTON.getCode())) { + //bizNo返回用于删除路由 + bizNoList.add(feature.getBusinessNo()); + } + //删除所有子节点 + List children = this.saasFeatureDao.listLikePath(feature.getPath() + feature.getId() + FEATURE_PATH_DELIMITER); + if (CollectionUtil.isNotEmpty(children)) { + List childrenIds = children.stream().map(SaasFeature::getId).collect(Collectors.toList()); + this.saasFeatureDao.removeByIds(childrenIds); + delIds.addAll(childrenIds); + List buttonBizNoList = children.stream() + .filter(x -> x.getFeatureType().equals(BUTTON.getCode())) + .map(SaasFeature::getBusinessNo) + .collect(Collectors.toList()); + bizNoList.addAll(buttonBizNoList); + } + //删除关联数据 + this.saasPgroupPermissionRelationDao.removeByPermissionPointIds(delIds); + this.saasProductModuleFeatureRelationDao.removeByPermissionPointIds(delIds); + return bizNoList; + } + + + @Override + public void move(PermissionPointMoveRequest request) { + SaasFeature feature = getAndCheck(request.getPermissionId()); + changeParent(feature, request); + feature.setParentId(request.getParentId()); + changeSort(feature, request.getSort()); + } + + @Override + public List queryList(PermissionPointListQueryRequest request) { + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(Objects.nonNull(request.getTerminal()), SaasFeature::getTerminal, request.getTerminal()) + .eq(Objects.nonNull(request.getFeatureType()), SaasFeature::getFeatureType, request.getFeatureType()) + .eq(Objects.nonNull(request.getParentId()), SaasFeature::getParentId, request.getParentId()) + .eq(Objects.nonNull(request.getDelegatedType()), SaasFeature::getDelegatedType, request.getDelegatedType()) + .in(CollectionUtil.isNotEmpty(request.getIds()), SaasFeature::getId, request.getIds()) + .likeRight(Objects.nonNull(request.getLikePath()), SaasFeature::getPath, request.getLikePath()); + + return this.saasFeatureDao.list(wrapper) + .stream() + .map(this::feature2Node) + .collect(Collectors.toList()); + } + + private void changeSort(SaasFeature feature, Integer targetSort) { + //排序从1开始 + //原parent下节点排序会有缺失 - 有节点新增时进行处理 + //同terminal 同级节点 + List saasFeatures = this.saasFeatureDao.listByParentIdAndTerminal(feature.getParentId(), + feature.getTerminal()); + //数据规范化 + if (targetSort == null + || targetSort > saasFeatures.size()) { + //默认在最后 + targetSort = saasFeatures.size(); + } + targetSort = targetSort < 1 ? 1 : targetSort; + //排序并排除自己 + List sortedList = saasFeatures.stream() + .sorted(Comparator.comparing(SaasFeature::getSort)) + .filter(x -> !x.getId().equals(feature.getId())) + .collect(Collectors.toList()); + //将自己插入指定位置 + sortedList.add(targetSort - 1, feature); + //记录排序 + Map sortMap = new HashMap<>(); + //找到需要更新排序的节点 + for (int i = 0; i < sortedList.size(); i++) { + SaasFeature saasFeature = sortedList.get(i); + if (!Objects.equals(saasFeature.getSort(), i + 1)) { + sortMap.put(saasFeature.getId(), i + 1); + } + } + + //执行更新 - 有一定性能问题 + for (Map.Entry entry : sortMap.entrySet()) { + this.saasFeatureDao.updateSort(entry.getKey(), entry.getValue()); + } + } + + private void changeParent(SaasFeature feature, PermissionPointMoveRequest request) { + Long parentId = request.getParentId(); + if (Objects.equals(feature.getParentId(), parentId)) { + //父级未变 + return; + } + SaasFeature parent = null; + if (parentId > 0) { + parent = this.saasFeatureDao.getById(parentId); + if (!StrUtil.equals(feature.getTerminal(), parent.getTerminal())) { + Throws.bizException(BaseCode.BAD_REQUEST, "不允许跨工作台"); + } + if (parent.getPath().contains(String.valueOf(request.getPermissionId()))) { + Throws.bizException(BaseCode.BAD_REQUEST, "不允许移到子级"); + } + } + //检查元素类型层级 + FeatureType featureType = FeatureType.apply(feature.getFeatureType()); + checkParentType(featureType, parent); + + //当前节点更新 + SaasFeature entity = new SaasFeature(); + entity.setId(feature.getId()); + entity.setParentId(parentId); + entity.setParentBusinessNo(parent == null ? "0" : parent.getBusinessNo()); + entity.setPath(parent == null ? FEATURE_TOP_PATH : parent.getPath() + parent.getId() + FEATURE_PATH_DELIMITER); + entity.setUpdateBy(request.getUpdaterId()); + this.saasFeatureDao.updateById(entity); + //更新子级path + this.saasFeatureDao.updateChildrenPath(request.getUpdaterId(), feature.getPath() + feature.getId() + FEATURE_PATH_DELIMITER, + entity.getPath() + entity.getId() + FEATURE_PATH_DELIMITER); + } + + private PermissionPointTreeNode feature2Node(SaasFeature feature) { + PermissionPointTreeNode node = BeanMapper.copyBean(feature, PermissionPointTreeNode.class); + node.setPermissionPointId(feature.getId()); + node.setPermissionName(feature.getFeatureName()); + node.setCode(feature.getFeatureCode()); + node.setFeatureTypeDesc(FeatureType.apply(feature.getFeatureType()).getDesc()); + return node; + } + + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductFeatureRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductFeatureRelationServiceImpl.java new file mode 100644 index 00000000..2dab53a6 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductFeatureRelationServiceImpl.java @@ -0,0 +1,66 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationSearchReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationUpdateReq; +import cn.axzo.tyr.client.model.product.ProductFeatureRelationVO; +import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation; +import cn.axzo.tyr.server.repository.dao.SaasProductModuleFeatureRelationDao; +import cn.axzo.tyr.server.service.ProductFeatureRelationService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 产品与权限点的 Service 接口实现 + * + * @author wangli + * @since 2023/9/7 14:27 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class ProductFeatureRelationServiceImpl implements ProductFeatureRelationService { + private final SaasProductModuleFeatureRelationDao saasProductModuleFeatureRelationDao; + + @Override + public ApiResult> featureList(ProductFeatureRelationSearchReq req) { + List list = saasProductModuleFeatureRelationDao.lambdaQuery() + .eq(SaasProductModuleFeatureRelation::getProductModuleId, req.getProductModuleId()) + .eq(Objects.nonNull(req.getDictCodeId()), SaasProductModuleFeatureRelation::getDictCodeId, req.getDictCodeId()) + .eq(StringUtils.hasLength(req.getDictCode()), SaasProductModuleFeatureRelation::getDictCode, req.getDictCode()) + .list(); + return ApiResult.ok(BeanMapper.copyList(list, ProductFeatureRelationVO.class)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ApiResult updateFeatureRelation(List req) { + List productIds = req.stream().map(ProductFeatureRelationUpdateReq::getProductModuleId).distinct().collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(productIds)) { + saasProductModuleFeatureRelationDao.remove(new LambdaQueryWrapper() + .in(SaasProductModuleFeatureRelation::getProductModuleId, productIds)); + } + List saveList = new ArrayList<>(); + req.forEach(i -> i.getFeatureIds().forEach(featureId -> { + SaasProductModuleFeatureRelation relation = new SaasProductModuleFeatureRelation(); + relation.setProductModuleId(i.getProductModuleId()); + relation.setDictCodeId(i.getDictCodeId()); + relation.setDictCode(i.getDictCode()); + relation.setFeatureId(featureId); + saveList.add(relation); + })); + saasProductModuleFeatureRelationDao.saveBatch(saveList); + return ApiResult.ok(true); + } +} 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 new file mode 100644 index 00000000..1cefaa0c --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/ProductServiceImpl.java @@ -0,0 +1,102 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.basics.common.util.AssertUtil; +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.tyr.client.model.product.ProductAddReq; +import cn.axzo.tyr.client.model.product.ProductSearchListReq; +import cn.axzo.tyr.client.model.product.ProductSearchPageReq; +import cn.axzo.tyr.client.model.product.ProductUpdateReq; +import cn.axzo.tyr.client.model.product.ProductVO; +import cn.axzo.tyr.server.repository.entity.ProductModule; +import cn.axzo.tyr.server.repository.dao.ProductModuleDao; +import cn.axzo.tyr.server.service.ProductService; +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +/** + * 产品相关 Service 接口实现 + * + * @author wangli + * @since 2023/9/7 14:22 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class ProductServiceImpl implements ProductService { + private final ProductModuleDao productModuleDao; + + @Override + public ApiResult> list(ProductSearchListReq req) { + List list = productModuleDao.lambdaQuery() + .in(!CollectionUtils.isEmpty(req.getIds()), ProductModule::getId, req.getIds()) + .like(StringUtils.hasLength(req.getName()), ProductModule::getProductName, req.getName()) + .eq(Objects.nonNull(req.getDictWorkspaceTypeId()), ProductModule::getDictWorkspaceTypeId, req.getDictWorkspaceTypeId()) + .eq(Objects.nonNull(req.getStatus()), ProductModule::getStatus, req.getStatus()) + .list(); + return ApiResult.ok(BeanMapper.copyList(list, ProductVO.class)); + } + + @Override + public ApiPageResult page(ProductSearchPageReq req) { + IPage page = productModuleDao.lambdaQuery() + .like(StringUtils.hasLength(req.getName()), ProductModule::getProductName, req.getName()) + .eq(Objects.nonNull(req.getDictWorkspaceTypeId()), ProductModule::getDictWorkspaceTypeId, req.getDictWorkspaceTypeId()) + .eq(Objects.nonNull(req.getStatus()), ProductModule::getStatus, req.getStatus()) + .page(req.toPage()); + List list = BeanMapper.copyList(page.getRecords(), ProductVO.class); + PageResp data = PageResp.list(page.getCurrent(), page.getSize(), page.getTotal(), list); + return ApiPageResult.ok(data); + } + + @Override + public ApiResult getById(Long id) { + return ApiResult.ok(BeanMapper.copyBean(productModuleDao.getById(id), ProductVO.class)); + } + + @Override + public ApiResult add(ProductAddReq req) { + Optional optProduct = productModuleDao.lambdaQuery() + .eq(ProductModule::getProductName, req.getProductName()) + .eq(ProductModule::getDictWorkspaceTypeId, req.getDictWorkspaceTypeId()) + .oneOpt(); + AssertUtil.isTrue(!optProduct.isPresent(), "产品名称在相同工作台类型下不允许重复"); + ProductModule productModule = BeanMapper.copyBean(req, ProductModule.class); + productModuleDao.save(productModule); + return ApiResult.ok(BeanMapper.copyBean(productModule, ProductVO.class)); + } + + @Override + public ApiResult update(ProductUpdateReq req) { + Optional optProduct = productModuleDao.lambdaQuery() + .eq(ProductModule::getProductName, req.getProductName()) + .eq(ProductModule::getDictWorkspaceTypeId, req.getDictWorkspaceTypeId()) + .oneOpt(); + AssertUtil.isTrue(!optProduct.isPresent() || Objects.equals(req.getId(), optProduct.get().getId()), "产品名称在相同工作台类型下不允许重复"); + ProductModule productModule = productModuleDao.getById(req.getId()); + BeanMapper.copyBeanIgnoreNull(req, () -> productModule); + productModuleDao.updateById(productModule); + return ApiResult.ok(BeanMapper.copyBeanIgnoreNull(productModule, ProductVO.class)); + } + + @Override + public ApiResult delete(Long id) { + ProductModule productModule = productModuleDao.getById(id); + AssertUtil.isTrue(Objects.nonNull(productModule), "产品不存在"); + productModuleDao.lambdaUpdate() + .eq(ProductModule::getId, id) + .set(ProductModule::getIsDelete, id) + .update(); + return ApiResult.ok(BeanMapper.copyBean(productModule, ProductVO.class)); + } +} 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 new file mode 100644 index 00000000..36fd716a --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -0,0 +1,393 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.client.common.enums.RoleTypeEnum; +import cn.axzo.tyr.client.model.enums.PermissionGroupType; +import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; +import cn.axzo.tyr.client.model.req.QuerySaasPermissionGroupReq; +import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; +import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.res.IsSuperAdminRes; +import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; +import cn.axzo.tyr.client.model.vo.SaasPermissionGroupVO; +import cn.axzo.tyr.client.model.vo.SaasRoleVO; +import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; +import cn.axzo.tyr.server.repository.dao.*; +import cn.axzo.tyr.server.repository.entity.*; +import cn.axzo.tyr.server.service.PermissionGroupService; +import cn.axzo.tyr.server.service.RoleService; +import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; +import cn.axzo.tyr.server.service.SaasRoleGroupRelationService; +import cn.hutool.core.bean.BeanUtil; +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.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 角色 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 15:51 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class RoleServiceImpl implements RoleService { + + @Autowired + SaasRoleUserRelationDao roleUserRelationDao; + @Autowired + SaasRoleDao saasRoleDao; + @Autowired + PermissionGroupService permissionGroupService; + @Autowired + SaasPgroupRoleRelationDao saasPgroupRoleRelationDao; + @Autowired + SaasRoleGroupDao saasRoleGroupDao; + @Autowired + SaasRoleGroupRelationDao roleGroupRelationDao; + @Autowired + SaasPermissionGroupDao saasPermissionGroupDao; + @Autowired + SaasRoleGroupRelationService saasRoleGroupRelationService; + @Autowired + SaasFeatureDao saasFeatureDao; + @Autowired + SaasPgroupPermissionRelationService saasPgroupPermissionRelationService; + + @Override + public List queryByIdentityIdType(Long identityId, Integer identityType, Long workspaceId, Long ouId) { + // 查询人关联的角色id + List roleIds = roleUserRelationDao.query(identityId, identityType, workspaceId, ouId).stream().map(SaasRoleUserRelation::getRoleId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(roleIds)) { + return new ArrayList<>(); + } + return getByIds(roleIds, null, null,null, null); + } + + /** + * 根据id查询权限详情包含权限组合权限集(底层基础方法) + * + * @return + */ + public List getByIds(List roleIds, Integer isCommon, List workspaceId, List ouId, Boolean includePermissionGroup) { + if (includePermissionGroup == null) { + includePermissionGroup = true; + } + if (CollectionUtils.isEmpty(roleIds)) { + return new ArrayList<>(); + } + // 查询角色信息 + List roles = saasRoleDao.lambdaQuery().in(BaseEntity::getId, roleIds).list(); + // 查询权限集 + Map> pgrouRelationMap = null; + Map> pGroupMap = null; + // 如果不包含则跳过 + if(includePermissionGroup) { + // 查询权限集关联关系 + List saasPgroupRoleRelations = queryPermissionGroupRelation(roleIds); + if (CollectionUtils.isNotEmpty(saasPgroupRoleRelations)) { + // 转map + pgrouRelationMap = saasPgroupRoleRelations.stream().collect(Collectors.groupingBy(SaasPgroupRoleRelation::getRoleId)); + // 查询权限集 + pGroupMap = permissionGroupService.page(QuerySaasPermissionGroupReq.builder() + .isCommon(isCommon) + .ids(saasPgroupRoleRelations.stream().map(SaasPgroupRoleRelation::getGroupId).collect(Collectors.toList())) + .workspaceId(workspaceId) + .ouId(ouId) + .fetchPage(Boolean.FALSE) + .build()).getList() + // 转map + .stream().collect(Collectors.groupingBy(SaasPermissionGroupVO::getId)); + } + } + Map> finalPgrouRelationMap = pgrouRelationMap; + Map> finalPGroupMap = pGroupMap; + return roles.stream().map(role -> { + // 获取对应的权限集 + List pGroup = new ArrayList<>(); + if (finalPgrouRelationMap != null && finalPgrouRelationMap.containsKey(role.getId())) { + pGroup = finalPgrouRelationMap.get(role.getId()) + .stream() + .map(SaasPgroupRoleRelation::getGroupId) + .map(finalPGroupMap::get) + .filter(Objects::nonNull) + .flatMap(List::stream) + .collect(Collectors.toList()); + } + SaasRoleVO saasRoleVO = BeanUtil.copyProperties(role, SaasRoleVO.class); + saasRoleVO.setPermissionGroup(pGroup); + return saasRoleVO; + }).collect(Collectors.toList()); + } + + /** + * 通用查询 + * + * @param req + * @return + */ + @Override + public List query(QuerySaasRoleReq req) { + // 如果没有传则默认查询通用维度默认值是 -1,-1+传入的参数含义是查询通用和自定义 + if (CollectionUtils.isEmpty(req.getWorkspaceId())) { + req.setWorkspaceId(Arrays.asList(-1L)); + } else if(!req.getWorkspaceId().contains(-1L)){ + req.getWorkspaceId().add(-1L); + } + if (CollectionUtils.isEmpty(req.getOuId())) { + req.setOuId(Arrays.asList(-1L)); + } else if (!req.getOuId().contains(-1L)) { + req.getOuId().add(-1L); + } + // 根据工作台类型和单位类型查询角色分组 + List roleGroup = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(req.getWorkspaceTypeCode()) || CollectionUtils.isNotEmpty(req.getOuTypeCode())) { + roleGroup = saasRoleGroupDao.query(QuerySaasRoleGroupReq.builder() + .ids(req.getSassRoleGroupIds()) + .workspaceTypeCode(req.getWorkspaceTypeCode()) + .ouTypeCode(req.getOuTypeCode()) + .build()); + if (CollectionUtils.isEmpty(roleGroup)) { + return new ArrayList<>(); + } + } + // 根据角色分组查询角色分组关联表 + List groupRelation = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(roleGroup)) { + groupRelation = roleGroupRelationDao.lambdaQuery() + .in(SaasRoleGroupRelation::getSaasRoleGroupId, roleGroup.stream().map(BaseEntity::getId).collect(Collectors.toList())) + .list(); + if (CollectionUtils.isEmpty(groupRelation)) { + return new ArrayList<>(); + } + } + // 查询角色 + List list = saasRoleDao.lambdaQuery() + .in(CollectionUtils.isNotEmpty(req.getIds()), BaseEntity::getId, req.getIds()) + .in(CollectionUtils.isNotEmpty(groupRelation), BaseEntity::getId, groupRelation.stream().map(SaasRoleGroupRelation::getRoleId).collect(Collectors.toList())) + .in(CollectionUtils.isNotEmpty(req.getRoleType()), SaasRole::getRoleType, req.getRoleType()) + .in(CollectionUtils.isNotEmpty(req.getWorkspaceId()),SaasRole::getWorkspaceId,req.getWorkspaceId()) + .in(CollectionUtils.isNotEmpty(req.getOuId()),SaasRole::getOwnerOuId,req.getOuId()) + .orderByDesc(BaseEntity::getId) + .list(); + return getByIds(list.stream().map(BaseEntity::getId).collect(Collectors.toList()), req.getIsCommon(),req.getWorkspaceId(),req.getOuId(),req.getIncludePermissionGroup()); + } + + @Override + public List queryBatchByIdentityIdType(List req) { + List result = new ArrayList<>(); + req.forEach(e -> { + result.add(QueryBatchByIdentityIdTypeRes.builder() + .identityId(e.getIdentityId()) + .identityType(e.getIdentityType()) + .workspaceId(e.getWorkspaceId()) + .ouId(e.getOuId()) + .role(queryByIdentityIdType(e.getIdentityId(),e.getIdentityType(),e.getWorkspaceId(),e.getOuId())) + .build()); + }); + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long saveOrUpdate(SaveOrUpdateRoleVO saveOrUpdateRole) { + // 新增OR修改角色 + Date now = new Date(); + + List groupTrees = saveOrUpdateRole.getGroupTree(); + // 验证角色分组信息 + validRoleGroup(groupTrees); + SaasRole saasRole = validAndBuildRole(saveOrUpdateRole, now); + //验证权限集信息 + SaasPermissionGroup saasPermissionGroup = validPermissionGroupCommon(saveOrUpdateRole); + validFeature(saveOrUpdateRole.getSelectedPPIds()); + + saasRoleDao.saveOrUpdate(saasRole); + // 新增或者保存分组和角色映射关系 + saasRoleGroupRelationService.saveOrUpdate(groupTrees.stream().map(g -> { + SaasRoleGroupRelation roleGroupRelation = new SaasRoleGroupRelation(); + roleGroupRelation.setRoleId(saasRole.getId()); + roleGroupRelation.setSaasRoleGroupId(g.getId()); + roleGroupRelation.setCreateAt(now); + roleGroupRelation.setUpdateAt(now); + return roleGroupRelation; + }).collect(Collectors.toList())); + saasPermissionGroupDao.saveOrUpdate(saasPermissionGroup); + SaasPgroupRoleRelation pgrr = new SaasPgroupRoleRelation(); + pgrr.setRoleId(saasRole.getId()); + pgrr.setGroupId(saasPermissionGroup.getId()); + pgrr.setCreateBy(saveOrUpdateRole.getOperatorId()); + pgrr.setUpdateBy(saveOrUpdateRole.getOperatorId()); + pgrr.setCreateAt(now); + pgrr.setUpdateAt(now); + // 保存角色通用权限映射,通用权限的映射关系不会被变更 + if (Objects.isNull(saveOrUpdateRole.getId())) { + saasPgroupRoleRelationDao.save(pgrr); + } + // 保存权限集和权限点映射关系 + List pgpRelations = Optional.ofNullable(saveOrUpdateRole.getSelectedPPIds()).orElse(new ArrayList<>()).stream().map(ppId -> { + SaasPgroupPermissionRelation target = new SaasPgroupPermissionRelation(); + target.setGroupId(saasPermissionGroup.getId()); + target.setFeatureId(ppId); + target.setCreateBy(saveOrUpdateRole.getOperatorId()); + target.setUpdateBy(saveOrUpdateRole.getOperatorId()); + return target; + }).collect(Collectors.toList()); + saasPgroupPermissionRelationService.saveOrUpdate(Lists.newArrayList(saasPermissionGroup.getId()), pgpRelations); + return saasRole.getId(); + } + + @Override + public List isSuperAdmin(List req) { + List result = new ArrayList<>(); + req.forEach(e -> { + List roleIds = roleUserRelationDao.query(e.getIdentityId(), e.getIdentityType(), e.getWorkspaceId(), e.getOuId()).stream().map(SaasRoleUserRelation::getRoleId).collect(Collectors.toList()); + List list = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(roleIds)) { + list = saasRoleDao.lambdaQuery() + .in(BaseEntity::getId, roleIds) + .eq(SaasRole::getRoleType, RoleTypeEnum.SUPER_ADMIN.getValue()) + .list(); + } + result.add(IsSuperAdminRes.builder() + .identityId(e.getIdentityId()) + .identityType(e.getIdentityType()) + .workspaceId(e.getWorkspaceId()) + .ouId(e.getOuId()) + .isSuperAdmin(CollectionUtils.isNotEmpty(list)?true:false) + .build()); + }); + return result; + } + + private SaasRole validAndBuildRole(SaveOrUpdateRoleVO saveOrUpdateRole, Date now) { + SaasRole saasRole; + if (Objects.isNull(saveOrUpdateRole.getId())) { + saasRole = new SaasRole(); + saasRole.setCreateBy(saveOrUpdateRole.getOperatorId()); + saasRole.setCreateAt(now); + } else { + saasRole = saasRoleDao.getById(saveOrUpdateRole.getId()); + if (Objects.isNull(saasRole)) { + throw new ServiceException("角色不存在"); + } + } + saasRole.setName(saveOrUpdateRole.getName()); + saasRole.setDescription(saasRole.getDescription()); + saasRole.setRoleType(saveOrUpdateRole.getRoleType()); + saasRole.setWorkspaceId(saveOrUpdateRole.getWorkspaceId()); + saasRole.setOwnerOuId(saveOrUpdateRole.getOwnerOuId()); + saasRole.setUpdateBy(saveOrUpdateRole.getOperatorId()); + saasRole.setUpdateAt(now); + // 不可能为空 + List groupIds = saveOrUpdateRole.getGroupTree().stream().map(SaveOrUpdateRoleVO.GroupInfoVO::getId).sorted().collect(Collectors.toList()); + //同分组内角色名称不能重复 + List relations = roleGroupRelationDao.lambdaQuery().in(SaasRoleGroupRelation::getSaasRoleGroupId, groupIds) + .eq(SaasRoleGroupRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + if (CollectionUtils.isNotEmpty(relations)) { + List roleIds = relations.stream().map(SaasRoleGroupRelation::getRoleId).sorted().collect(Collectors.toList()); + Map> groupRoleMap = relations.stream().collect(Collectors.groupingBy(SaasRoleGroupRelation::getSaasRoleGroupId, Collectors.mapping(SaasRoleGroupRelation::getRoleId, Collectors.toSet()))); + List roles = saasRoleDao.lambdaQuery().in(SaasRole::getId, roleIds).eq(SaasRole::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + Map roleMap = roles.stream().collect(Collectors.toMap(SaasRole::getId, Function.identity(), (e1, e2) -> e2)); + groupRoleMap.forEach((groupId, roleSet) -> { + Optional repeatNameRole = roleSet.stream().map(roleMap::get) + .filter(e -> Objects.nonNull(e) && !Objects.equals(e.getId(), saveOrUpdateRole.getId()) && StringUtils.equalsIgnoreCase(e.getName(), saasRole.getName())) + .findFirst(); + if (repeatNameRole.isPresent()) { + throw new ServiceException("同分组内角色名称不能重复"); + } + }); + } + return saasRole; + } + + private void validFeature(List featureIds) { + if (CollectionUtils.isEmpty(featureIds)) { + return; + } + List saasFeatures = saasFeatureDao.lambdaQuery().in(SaasFeature::getId, featureIds) + .eq(SaasFeature::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + Map featureMap = saasFeatures.stream().collect(Collectors.toMap(SaasFeature::getId, Function.identity())); + List invalidFeatues = featureIds.stream().filter(rg -> { + SaasFeature target = featureMap.get(rg); + return Objects.isNull(target); + }).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(invalidFeatues)) { + throw new ServiceException("权限点信息错误"); + } + } + + private SaasPermissionGroup validPermissionGroupCommon(SaveOrUpdateRoleVO saveOrUpdateRole) { + SaasPermissionGroup saasPermissionGroup; + if (Objects.isNull(saveOrUpdateRole.getId())) { + //新增 + saasPermissionGroup = new SaasPermissionGroup(); + saasPermissionGroup.setIsCommon(PermissionGroupType.COMMON.getCode()); + saasPermissionGroup.setCreateBy(saveOrUpdateRole.getOperatorId()); + saasPermissionGroup.setCreatorName(saveOrUpdateRole.getOperatorName()); + } else { + // 修改验证 + List relations = saasPgroupRoleRelationDao.lambdaQuery().eq(SaasPgroupRoleRelation::getRoleId, saveOrUpdateRole.getId()) + .eq(SaasPgroupRoleRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + if (CollectionUtils.isEmpty(relations)) { + throw new ServiceException("数据错误,通用权限集不存在"); + } + List pgroupIds = relations.stream().map(SaasPgroupRoleRelation::getGroupId).sorted().collect(Collectors.toList()); + List commonGroups = saasPermissionGroupDao.lambdaQuery().in(SaasPermissionGroup::getId, pgroupIds).eq(SaasPermissionGroup::getIsCommon, PermissionGroupType.COMMON.getCode()) + .eq(SaasPermissionGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + if (CollectionUtils.isEmpty(commonGroups)) { + throw new ServiceException("数据错误,通用权限集不存在"); + } + if (commonGroups.size() > 1) { + throw new ServiceException("数据错误,存在多个通用权限集"); + } + saasPermissionGroup = commonGroups.get(0); + } + saasPermissionGroup.setName(saveOrUpdateRole.getPermissionGroupName()); + saasPermissionGroup.setDescription(saveOrUpdateRole.getPermissionGroupDescription()); + saasPermissionGroup.setUpdateBy(saveOrUpdateRole.getOperatorId()); + saasPermissionGroup.setUpdatorName(saveOrUpdateRole.getOperatorName()); + saasPermissionGroup.setType(saveOrUpdateRole.getPermissionGroupType()); + return saasPermissionGroup; + } + + private void validRoleGroup(List groupTrees) { + if (CollectionUtils.isEmpty(groupTrees)) { + return; + } + List groups = saasRoleGroupDao.lambdaQuery() + .in(SaasRoleGroup::getId, groupTrees.stream().map(SaveOrUpdateRoleVO.GroupInfoVO::getId).collect(Collectors.toList())) + .eq(SaasRoleGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + Map roleGroupMap = groups.stream().collect(Collectors.toMap(SaasRoleGroup::getId, Function.identity())); + List invalidRoleGroups = groupTrees.stream().filter(rg -> { + SaasRoleGroup target = roleGroupMap.get(rg.getId()); + return Objects.isNull(target) || !Objects.equals(target.getWorkspaceTypeCode(), rg.getWorkspaceTypeCode()); + }).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(invalidRoleGroups)) { + throw new ServiceException("角色分组信息错误"); + } + } + + /** + * 根据角色id查询权限集关联关系 + */ + public List queryPermissionGroupRelation(List roleIds) { + return saasPgroupRoleRelationDao.lambdaQuery() + .in(SaasPgroupRoleRelation::getRoleId, roleIds) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .list(); + } +} 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 new file mode 100644 index 00000000..2e7130c5 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleUserService.java @@ -0,0 +1,116 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.client.common.enums.RoleTypeEnum; +import cn.axzo.tyr.client.model.BaseWorkspaceModel; +import cn.axzo.tyr.client.model.enums.IdentityType; +import cn.axzo.tyr.client.model.roleuser.req.DeleteRoleUserParam; +import cn.axzo.tyr.client.model.roleuser.req.RoleUserReq; +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.repository.entity.SaasRoleUserRelation; +import cn.axzo.tyr.server.service.SaasRoleUserService; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.nacos.common.utils.CollectionUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 角色 + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/6 15:51 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class RoleUserService implements SaasRoleUserService { + + private final SaasRoleUserRelationDao roleUserRelationDao; + private final SaasRoleDao saasRoleDao; + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdate(RoleUserReq req) { + + if (CollectionUtil.isEmpty(req.getUpdateRoleIds())) { + throw new ServiceException("当前不支持空角色"); + } + + List roles = saasRoleDao.listByIds(req.getUpdateRoleIds()); + if (roles.stream().anyMatch(e -> RoleTypeEnum.getRoleType(e.getRoleType()).isAdminRole())) { + throw new ServiceException("暂不支持更换管理员角色"); + } + + List existsRoleUser = roleUserRelationDao.query(req.getIdentityId(), req.getIdentityType().getCode(), req.getWorkspaceId(), req.getOuId()); + if (CollectionUtils.isNotEmpty(existsRoleUser)) { + List existsRole = saasRoleDao.listByIds(existsRoleUser.stream().mapToLong(SaasRoleUserRelation::getRoleId).boxed().collect(Collectors.toList())); + List notAdminRole = existsRole.stream().filter(e -> !RoleTypeEnum.getRoleType(e.getRoleType()).isAdminRole()).collect(Collectors.toList()); + // 删除现有非管理员的角色 + roleUserRelationDao.deleteByUser(BaseWorkspaceModel.builder() + .workspaceId(req.getWorkspaceId()) + .ouId(req.getOuId()) + .identityId(req.getIdentityId()) + .identityType(req.getIdentityType()) + .build() + , notAdminRole + .stream() + .mapToLong(BaseEntity::getId) + .boxed() + .collect(Collectors.toList())); + + } + + roleUserRelationDao.saveBatch(req.getUpdateRoleIds().stream().map(e -> { + SaasRoleUserRelation saasRoleUserRelation = new SaasRoleUserRelation(); + saasRoleUserRelation.setIdentityId(req.getIdentityId()); + saasRoleUserRelation.setIdentityType(req.getIdentityType().getCode()); + saasRoleUserRelation.setRoleId(e); + saasRoleUserRelation.setNaturalPersonId(req.getPersonId()); + saasRoleUserRelation.setNaturalPersonId(req.getPersonId()); + saasRoleUserRelation.setOuId(req.getOuId()); + saasRoleUserRelation.setWorkspaceId(req.getWorkspaceId()); + return saasRoleUserRelation; + }).collect(Collectors.toList())); + + } + + @Override + public boolean deleteUserAllRoles(List param) { + param.forEach(item -> { + if (isSuperAdmin(item.getIdentityId(), item.getIdentityType(), item.getWorkspaceId(), item.getOuId())) { + throw new ServiceException("超级管理员无法被删除"); + } + roleUserRelationDao.deleteByUser(BaseWorkspaceModel.builder() + .workspaceId(item.getWorkspaceId()) + .ouId(item.getOuId()) + .identityId(item.getIdentityId()) + .identityType(item.getIdentityType()) + .build(), null); + }); + return true; + } + + @Override + public boolean isSuperAdmin(Long identityId, IdentityType identityType, Long workspaceId, Long ouId) { + List roleList = saasRoleDao.lambdaQuery() + .eq(SaasRole::getOwnerOuId, ouId) + .eq(SaasRole::getWorkspaceId, workspaceId) + .eq(SaasRole::getRoleType, RoleTypeEnum.SUPER_ADMIN.getValue()) + .list(); + List roleIds = roleList.stream().map(SaasRole::getId).collect(Collectors.toList()); + List saasRoleUserRelations = roleUserRelationDao.lambdaQuery().eq(SaasRoleUserRelation::getIdentityId, identityId) + .eq(SaasRoleUserRelation::getIdentityType, identityType.getCode()) + .eq(SaasRoleUserRelation::getWorkspaceId, workspaceId) + .eq(SaasRoleUserRelation::getOuId, ouId) + .in(SaasRoleUserRelation::getRoleId, roleIds).last("limit 1").list(); + return saasRoleUserRelations.size() > 0; + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasBasicDictServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasBasicDictServiceImpl.java new file mode 100644 index 00000000..d99c244b --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasBasicDictServiceImpl.java @@ -0,0 +1,183 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.BeanMapper; +import cn.axzo.framework.domain.ServiceException; +import cn.axzo.tyr.client.model.dict.request.*; +import cn.axzo.tyr.client.model.dict.response.BasicDictNodeResp; +import cn.axzo.tyr.client.model.dict.response.BasicDictTreeResp; +import cn.axzo.tyr.server.repository.SaasBasicDictDao; +import cn.axzo.tyr.server.repository.entity.SaasBasicDict; +import cn.axzo.tyr.server.service.SaasBasicDictService; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author: chenwenjian + * @date: 2023/9/8 15:40 + * @description: + * @modifiedBy: + * @version: 1.0 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class SaasBasicDictServiceImpl implements SaasBasicDictService { + + private final SaasBasicDictDao saasBasicDictDao; + + @Override + public List getBasicDictNodeList(BasicDictQueryReq req) { + return saasBasicDictDao.getBasicDictNodeList(req); + } + + /** + * 获取节点树 + * + * @param req + * @return + */ + @Override + public List getBasicDictNodeTree(BasicDictQueryReq req) { + // 获取所有节点 + List basicDictNodeList = saasBasicDictDao.getBasicDictNodeList(req); + + return constructDictTree(basicDictNodeList); + } + + /** + * 根据节点列表构建节点树 + * + * @param nodeList 节点列表 + * @return 节点树 + */ + public List constructDictTree(List nodeList) { + if (CollectionUtil.isEmpty(nodeList)) { + return Collections.emptyList(); + } + ArrayList root = new ArrayList<>(); + List parentIds = nodeList.stream().map(BasicDictNodeResp::getParentId).distinct().collect(Collectors.toList()); + nodeList.addAll(BeanMapper.copyList(saasBasicDictDao.listByIds(parentIds), BasicDictNodeResp.class)); + + Map nodeMap = nodeList.stream() + .distinct() + .collect(Collectors.toMap(BasicDictNodeResp::getId, nodeResp -> BeanMapper.copyBean(nodeResp, BasicDictTreeResp.class))); + + nodeMap.forEach((id, basicDictTreeResp) -> { + if (basicDictTreeResp.getParentId() == 0) { + root.add(basicDictTreeResp); + } else { + BasicDictTreeResp parent = nodeMap.get(basicDictTreeResp.getParentId()); + if (Objects.isNull(parent.getChildren())) { + parent.setChildren(new ArrayList<>()); + } + parent.getChildren().add(basicDictTreeResp); + } + }); + return root; + } + + /** + * 获取节点详情 + * + * @param req type和code + * @return 一个字典节点 + */ + @Override + public BasicDictNodeResp getBasicDictNode(BasicDictNodeReq req) { + return saasBasicDictDao.getBasicDictNode(req); + } + + /** + * 创建字典节点 + * 目前不支持创建顶级节点即工作台类型 + * + * @param req + * @return + */ + @Override + public Long create(BasicDictCreateReq req) { + SaasBasicDict parent = saasBasicDictDao.getById(req.getParentId()); + if (Objects.isNull(parent)) { + throw new ServiceException("不存在给定的上级节点"); + } + // 获取所属父节点下所有同级节点,name和code在同级节点中不能重复 + List brotherNodeList = saasBasicDictDao.getBasicDictNodeList( + BasicDictQueryReq.builder() + .parentId(req.getParentId()) + .type(req.getType()) + .build()); + brotherNodeList.forEach(n -> { + if (n.getName().equals(req.getName())) { + throw new ServiceException("该节点下已存在名称为" + req.getName() + "的节点"); + } + if (n.getCode().equals(req.getCode())) { + throw new ServiceException("该节点下已存在code为" + req.getCode() + "的节点"); + } + }); + for (int i = 0; i < 3; i++) { + try { + // 生成唯一的unique_code,若生成了与数据库中已存在uniqueCode重复的uniqueCode + String uniqueCode = RandomUtil.randomString(10); + SaasBasicDict saasBasicDict = BeanMapper.copyBean(req, SaasBasicDict.class, (b, s) -> { + s.setWorkspaceType(parent.getWorkspaceType()); + s.setType(b.getType().getValue()); + s.setUniqueCode(uniqueCode); + s.setLevel(parent.getLevel() + 1); + s.setPath(String.join(",", parent.getPath(), uniqueCode)); + }); + boolean save = saasBasicDictDao.save(saasBasicDict); + if (save) { + return saasBasicDict.getId(); + } + } catch (MybatisPlusException e) { + + } + } + throw new ServiceException("系统繁忙,请稍后重试"); + } + + @Override + public Boolean update(BasicDictUpdateReq req) { + BasicDictNodeResp currentNode = getById(req.getId()); + if (Objects.isNull(currentNode)) { + throw new ServiceException("节点不存在"); + } + + // 获取同级节点用于校验同级节点name唯一性 + List brotherNodes = saasBasicDictDao.list(new LambdaQueryWrapper() + .eq(SaasBasicDict::getParentId, currentNode.getParentId()) + .eq(SaasBasicDict::getType, currentNode.getType())); + + brotherNodes.forEach(n -> { + if (n.getName().equals(req.getName())) { + throw new ServiceException("该节点下已存在名称为" + req.getName() + "的节点"); + } + }); + + return saasBasicDictDao.update(req); + } + + @Override + public Boolean updateStauts(BasicDictUpdateStatusReq req) { + return saasBasicDictDao.updateStatus(req); + } + + @Override + public BasicDictNodeResp getWorkspaceType(String workspaceType) { + return saasBasicDictDao.getWorkspaceType(workspaceType); + } + + @Override + public BasicDictNodeResp getById(Long id) { + return BeanMapper.copyBean(saasBasicDictDao.getById(id), BasicDictNodeResp.class); + } + +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPermissionGroupScopeServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPermissionGroupScopeServiceImpl.java new file mode 100644 index 00000000..0081be38 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPermissionGroupScopeServiceImpl.java @@ -0,0 +1,47 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.tyr.server.repository.dao.SaasPermissionGroupScopeDao; +import cn.axzo.tyr.server.repository.entity.SaasPermissionGroupScope; +import cn.axzo.tyr.server.service.SaasPermissionGroupScopeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class SaasPermissionGroupScopeServiceImpl implements SaasPermissionGroupScopeService { + private final SaasPermissionGroupScopeDao saasPermissionGroupScopeDao; + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdate(List pgroupIds, List scopes) { + if (CollectionUtils.isEmpty(pgroupIds) && CollectionUtils.isEmpty(scopes)) { + return; + } + if (CollectionUtils.isEmpty(pgroupIds)) { + pgroupIds = scopes.stream().map(SaasPermissionGroupScope::getPgroupId).distinct().sorted().collect(Collectors.toList()); + } else if (Objects.isNull(scopes)) { + scopes = new ArrayList<>(); + } + List exists = saasPermissionGroupScopeDao.lambdaQuery() + .in(SaasPermissionGroupScope::getPgroupId, pgroupIds) + .eq(SaasPermissionGroupScope::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + Collection insertList = CollectionUtils.subtract(scopes, exists); + Collection deleteList = CollectionUtils.subtract(exists, scopes); + if (CollectionUtils.isNotEmpty(insertList)) { + saasPermissionGroupScopeDao.saveBatch(insertList); + } + if (CollectionUtils.isNotEmpty(deleteList)) { + saasPermissionGroupScopeDao.removeByIds(deleteList.stream().map(SaasPermissionGroupScope::getId).sorted().collect(Collectors.toList())); + } + } +} 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 new file mode 100644 index 00000000..65106522 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasPgroupPermissionRelationServiceImpl.java @@ -0,0 +1,49 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao; +import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation; +import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class SaasPgroupPermissionRelationServiceImpl implements SaasPgroupPermissionRelationService { + private final SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao; + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdate(List groupIds, List relations) { + if (CollectionUtils.isEmpty(groupIds) && CollectionUtils.isEmpty(relations)) { + return; + } + // 移除权限点 + if (CollectionUtils.isEmpty(groupIds)) { + groupIds = relations.stream().map(SaasPgroupPermissionRelation::getGroupId).distinct().sorted().collect(Collectors.toList()); + } else if (Objects.isNull(relations)){ + relations = new ArrayList<>(); + } + List exists = saasPgroupPermissionRelationDao.lambdaQuery() + .in(SaasPgroupPermissionRelation::getGroupId, groupIds) + .eq(SaasPgroupPermissionRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + Collection insertList = CollectionUtils.subtract(relations, exists); + Collection deleteList = CollectionUtils.subtract(exists, relations); + if (CollectionUtils.isNotEmpty(insertList)) { + saasPgroupPermissionRelationDao.saveBatch(insertList); + } + if (CollectionUtils.isNotEmpty(deleteList)) { + saasPgroupPermissionRelationDao.removeByIds(deleteList.stream().map(SaasPgroupPermissionRelation::getId).sorted().collect(Collectors.toList())); + } + } +} 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 new file mode 100644 index 00000000..f067191e --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java @@ -0,0 +1,45 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; +import cn.axzo.tyr.server.service.SaasRoleGroupRelationService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class SaasRoleGroupRelationServiceImpl implements SaasRoleGroupRelationService { + private final SaasRoleGroupRelationDao saasRoleGroupRelationDao; + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdate(List relations) { + if (CollectionUtils.isEmpty(relations)) { + return; + } + List exists = saasRoleGroupRelationDao.lambdaQuery() + .in(SaasRoleGroupRelation::getRoleId, relations.stream().map(SaasRoleGroupRelation::getRoleId).distinct().sorted().collect(Collectors.toList())) + .eq(SaasRoleGroupRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + if (CollectionUtils.isEmpty(exists)) { + saasRoleGroupRelationDao.saveBatch(relations); + return; + } + Collection insertList = CollectionUtils.subtract(relations, exists); + Collection deleteList = CollectionUtils.subtract(exists, relations); + if (CollectionUtils.isNotEmpty(insertList)) { + saasRoleGroupRelationDao.saveBatch(insertList); + } + if (CollectionUtils.isNotEmpty(deleteList)) { + saasRoleGroupRelationDao.removeByIds(deleteList.stream().map(SaasRoleGroupRelation::getId).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 new file mode 100644 index 00000000..0d3cc20d --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -0,0 +1,145 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; +import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; +import cn.axzo.tyr.server.repository.dao.SaasRoleGroupDao; +import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import cn.axzo.tyr.server.service.SaasRoleGroupService; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@RequiredArgsConstructor +@Service +public class SaasRoleGroupServiceImpl implements SaasRoleGroupService { + private final SaasRoleGroupDao saasRoleGroupDao; + private final SaasRoleGroupRelationDao saasRoleGroupRelationDao; + + @Override + public List getList(QuerySaasRoleGroupReq req) { + if (CollectionUtils.isEmpty(req.getWorkspaceIds())) { + req.setWorkspaceIds(Arrays.asList(-1L)); + } else if(!req.getWorkspaceIds().contains(-1L)){ + req.getWorkspaceIds().add(-1L); + } + if (CollectionUtils.isEmpty(req.getOuIds())) { + req.setOuIds(Arrays.asList(-1L)); + } else if (!req.getOuIds().contains(-1L)) { + req.getOuIds().add(-1L); + } + List saasRoleGroupRelations = null; + if (CollectionUtils.isNotEmpty(req.getRoleIds())) { + saasRoleGroupRelations = saasRoleGroupRelationDao.lambdaQuery() + .in(SaasRoleGroupRelation::getRoleId, req.getRoleIds()) + .eq(SaasRoleGroupRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + List groupIds = saasRoleGroupRelations.stream().map(SaasRoleGroupRelation::getSaasRoleGroupId).distinct().collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(req.getIds())) { + req.getIds().retainAll(groupIds); + } else { + req.setIds(groupIds); + } + if (CollectionUtils.isEmpty(req.getIds())) { + return new ArrayList<>(); + } + } + + List groups = saasRoleGroupDao.query(req); + if (CollectionUtils.isEmpty(groups)) { + return new ArrayList<>(); + } + // 如果参数指定了roleIds, 返回的值就包含在请求的roleIds中,否则返回全量的roleIds + if (CollectionUtils.isEmpty(saasRoleGroupRelations)) { + saasRoleGroupRelations = saasRoleGroupRelationDao.lambdaQuery() + .in(SaasRoleGroupRelation::getSaasRoleGroupId, groups.stream().map(SaasRoleGroup::getId).collect(Collectors.toList())) + .eq(SaasRoleGroupRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + } + Map> groupRoleMap = saasRoleGroupRelations.stream().collect(Collectors.groupingBy(SaasRoleGroupRelation::getSaasRoleGroupId, Collectors.mapping(SaasRoleGroupRelation::getRoleId, Collectors.toList()))); + List results = groups.stream() + .map(e -> { + SaasRoleGroupVO target = BeanUtil.copyProperties(e, SaasRoleGroupVO.class); + if (StringUtils.isNotBlank(e.getOuTypeCode())) { + target.setOuTypeCode(Arrays.stream(e.getOuTypeCode().split(",")).filter(StringUtils::isNotBlank).map(s -> s.trim()).collect(Collectors.toList())); + } + target.setRoleIds(groupRoleMap.get(e.getId())); + return target; + }).collect(Collectors.toList()); + + return results; + } + + @Override + public Long saveOrUpdate(SaasRoleGroupVO req) { + SaasRoleGroup saasRoleGroup = validAndBuildGroup(req); + saasRoleGroupDao.saveOrUpdate(saasRoleGroup); + return saasRoleGroup.getId(); + } + + /** + * 只有当分组下面角色为空时才能删除 + * @param ids + */ + @Override + public void delete(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return; + } + int relationCount = saasRoleGroupRelationDao.lambdaQuery() + .in(SaasRoleGroupRelation::getSaasRoleGroupId, ids) + .eq(SaasRoleGroupRelation::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .count(); + if (relationCount > 0) { + throw new ServiceException("分组关联角色,不能删除"); + } + saasRoleGroupDao.delete(ids); + } + + private SaasRoleGroup validAndBuildGroup(SaasRoleGroupVO req) { + SaasRoleGroup saasRoleGroup; + Date now = new Date(); + if (Objects.isNull(req.getId())) { + //新增 + saasRoleGroup = new SaasRoleGroup(); + saasRoleGroup.setCreateAt(now); + } else { + //修改 + saasRoleGroup = saasRoleGroupDao.lambdaQuery().eq(SaasRoleGroup::getId, req.getId()) + .eq(SaasRoleGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value).one(); + if (Objects.isNull(saasRoleGroup)) { + throw new ServiceException("角色分组不存在"); + } + } + List groups = saasRoleGroupDao.lambdaQuery().eq(SaasRoleGroup::getWorkspaceTypeCode, req.getWorkspaceTypeCode()) + .eq(SaasRoleGroup::getIsDelete, TableIsDeleteEnum.NORMAL.value).list(); + if (CollectionUtils.isNotEmpty(groups)) { + Optional repeatGroupName = groups.stream() + .filter(g -> !Objects.equals(g.getId(), req.getId()) && StringUtils.equalsIgnoreCase(g.getName(), req.getName())).findFirst(); + if (repeatGroupName.isPresent()) { + throw new ServiceException("同工作台类型内,分组名称不能重复"); + } + } + // 拼接ouTypeCode字符串 + String ouTypeCodeStr = null; + if (CollectionUtils.isNotEmpty(req.getOuTypeCode())) { + ouTypeCodeStr = StringUtils.join(req.getOuTypeCode(),","); + } + saasRoleGroup.setUpdateAt(now); + saasRoleGroup.setWorkspaceTypeCode(req.getWorkspaceTypeCode()); + saasRoleGroup.setOuTypeCode(ouTypeCodeStr); + saasRoleGroup.setName(req.getName()); + saasRoleGroup.setSort(req.getSort()); + saasRoleGroup.setWorkspaceId(req.getWorkspaceId() != null ? req.getWorkspaceId() : -1L); + saasRoleGroup.setOuId(req.getOuId() != null ? req.getOuId() : -1L); + return saasRoleGroup; + } +} 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 new file mode 100644 index 00000000..2f27b378 --- /dev/null +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleUserRelationServiceImpl.java @@ -0,0 +1,53 @@ +package cn.axzo.tyr.server.service.impl; + +import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; +import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; +import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserRelationDTO; +import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam; +import cn.axzo.tyr.server.repository.dao.SaasRoleDao; +import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao; +import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; +import cn.axzo.tyr.server.service.SaasRoleUserRelationService; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author haiyangjin + * @date 2023/9/14 + */ +@Slf4j +@Service +public class SaasRoleUserRelationServiceImpl implements SaasRoleUserRelationService { + + @Resource + private SaasRoleUserRelationDao saasRoleUserRelationDao; + + @Resource + private SaasRoleDao saasRoleDao; + + @Override + public List list(RoleUserParam param) { + List saasRoleUserRelations = saasRoleUserRelationDao.lambdaQuery() + .eq(Objects.nonNull(param.getIdentityId()), SaasRoleUserRelation::getIdentityId, param.getIdentityId()) + .eq(Objects.nonNull(param.getIdentityType()), SaasRoleUserRelation::getIdentityType, param.getIdentityType()) + .eq(Objects.nonNull(param.getWorkspaceId()), SaasRoleUserRelation::getWorkspaceId, param.getWorkspaceId()) + .eq(Objects.nonNull(param.getOuId()), SaasRoleUserRelation::getOuId, param.getOuId()) + .in(CollectionUtil.isNotEmpty(param.getRoleIds()), SaasRoleUserRelation::getRoleId, param.getRoleIds()) + .eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value) + .last("LIMIT 1000") + .list(); + if (CollectionUtil.isEmpty(saasRoleUserRelations)) { + return Collections.emptyList(); + } + + return saasRoleUserRelations.stream().map(e -> BeanUtil.copyProperties(e, SaasRoleUserRelationDTO.class)).collect(Collectors.toList()); + } +} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/manager/package-info.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/manager/package-info.java deleted file mode 100644 index 9270b83b..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/manager/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.axzo.tyr.server.service.manager; \ No newline at end of file diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/user/UserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/user/UserService.java deleted file mode 100644 index 1cffffb4..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/user/UserService.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.axzo.tyr.server.service.user; - -import cn.axzo.framework.domain.page.PageQO; -import cn.axzo.framework.domain.page.PageResp; -import cn.axzo.tyr.server.service.dto.request.user.NewUserDTO; -import cn.axzo.tyr.server.service.dto.request.user.UpdateUserDTO; -import cn.axzo.tyr.server.service.dto.request.user.UserQO; -import cn.axzo.tyr.server.service.dto.request.user.UserQO1; -import cn.axzo.tyr.server.service.dto.response.user.UserVO; -import cn.azxo.framework.common.model.CommonPageResponse; - -/** - * @Author: liyong.tian - * @Date: 2022/9/2 - * @Description: - */ -public interface UserService { - UserVO create(NewUserDTO dto); - - UserVO update(Long id, UpdateUserDTO dto); - - UserVO getOne(Long id); - - void delete(Long id); - - CommonPageResponse queryByPage(UserQO userQO); - - PageResp find(UserQO1 userQo, PageQO page); -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/user/impl/UserServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/user/impl/UserServiceImpl.java deleted file mode 100644 index 56fae11d..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/user/impl/UserServiceImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -package cn.axzo.tyr.server.service.user.impl; - -import cn.axzo.framework.domain.page.PageQO; -import cn.axzo.framework.domain.page.PageResp; -import cn.axzo.framework.domain.web.ApiException; -import cn.axzo.tyr.server.common.enums.ErrorCode; -import cn.axzo.tyr.server.service.dto.request.user.NewUserDTO; -import cn.axzo.tyr.server.service.dto.request.user.UpdateUserDTO; -import cn.axzo.tyr.server.service.dto.request.user.UserQO; -import cn.axzo.tyr.server.service.dto.request.user.UserQO1; -import cn.axzo.tyr.server.service.dto.response.user.UserVO; -import cn.axzo.tyr.server.repository.entity.user.User; -import cn.axzo.tyr.server.repository.UserDao; -import cn.axzo.tyr.server.service.user.UserService; -import cn.axzo.tyr.server.service.converter.UserConverter; -import cn.azxo.framework.common.model.CommonPageResponse; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * @Author: liyong.tian - * @Date: 2022/9/2 - * @Description: - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class UserServiceImpl implements UserService { - - private final UserConverter userConverter; - - private final UserDao userDao; - - @Override - public UserVO create(NewUserDTO dto) { - User user = userConverter.toEntity(dto); - userDao.save(user); - return userConverter.toVo(user); - } - - @Override - public UserVO update(Long id, UpdateUserDTO dto) { - User user = userDao.findById(id); - if (user == null) { - throw new ApiException(ErrorCode.USER_NOT_EXISTS, id); - } - userConverter.updateEntity(dto, user); - return userConverter.toVo(user); - } - - @Override - public UserVO getOne(Long id) { - User user = userDao.findById(id); - return userConverter.toVo(user); - } - - @Override - public void delete(Long id) { - userDao.delete(id); - } - - @Override - public CommonPageResponse queryByPage(UserQO userQo) { - IPage page = userDao.queryByPage(userQo); - List userList = page.getRecords(); - if (CollectionUtils.isEmpty(userList)) { - return CommonPageResponse.zero(userQo.getPage(), userQo.getPageSize()); - } - return new CommonPageResponse<>(page.getCurrent(), page.getSize(), page.getTotal(), userConverter.toVo(page.getRecords())); - } - - @Override - public PageResp find(UserQO1 userQo, PageQO page) { - IPage userPage = userDao.find(userQo, page); - return PageResp.list(userPage, userConverter.toVo(userPage.getRecords())); - } -} diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/validator/package-info.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/validator/package-info.java deleted file mode 100644 index b4ae43f2..00000000 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/validator/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.axzo.tyr.server.service.validator; \ No newline at end of file diff --git a/tyr-server/src/main/resources/bootstrap.yml b/tyr-server/src/main/resources/bootstrap.yml index 91560edb..08d64163 100644 --- a/tyr-server/src/main/resources/bootstrap.yml +++ b/tyr-server/src/main/resources/bootstrap.yml @@ -4,16 +4,18 @@ spring: cloud: nacos: config: - server-addr: ${NACOS_HOST:dev-nacos.axzo.cn}:${NACOS_PORT:80} + server-addr: ${NACOS_HOST}:${NACOS_PORT} file-extension: yaml - namespace: ${NACOS_NAMESPACE_ID:35eada10-9574-4db8-9fea-bc6a4960b6c7} - prefix: ${spring.application.name} + namespace: ${NACOS_NAMESPACE_ID} profiles: - active: ${NACOS_PROFILES_ACTIVE:local} + active: ${NACOS_PROFILES_ACTIVE:dev} include: swagger main: allow-bean-definition-overriding: true +mybatis-plus: + type-enums-package: cn.axzo.tyr.client.model.enums + logging: level: com.alibaba.nacos.client.config.impl: WARN @@ -35,3 +37,55 @@ management: knife4j: enable: true + +--- +#本地开发机器连接公网中间件地址(仅 DEV 环境) +spring: + config: + activate: + on-profile: local + cloud: + nacos: + config: + server-addr: ${NACOS_HOST:dev-nacos.axzo.cn}:${NACOS_PORT:80} + file-extension: yaml + namespace: ${NACOS_NAMESPACE_ID:f82179f1-81a9-41a1-a489-4f9ab5660a6e} +logging: + level: + root: debug +--- +#开发环境 +spring: + config: + activate: + on-profile: dev + cloud: + nacos: + config: + server-addr: ${NACOS_HOST:dev-nacos.axzo.cn}:${NACOS_PORT:80} + file-extension: yaml + namespace: ${NACOS_NAMESPACE_ID:35eada10-9574-4db8-9fea-bc6a4960b6c7} +--- +#测试环境 +spring: + config: + activate: + on-profile: test + cloud: + nacos: + config: + server-addr: ${NACOS_HOST:test-nacos.axzo.cn}:${NACOS_PORT:80} + file-extension: yaml + namespace: ${NACOS_NAMESPACE_ID:f3c0f0d2-bac4-4498-bee7-9c3636b3afdf} +--- +#预发布环境 +spring: + config: + activate: + on-profile: pre + cloud: + nacos: + config: + server-addr: ${NACOS_HOST:https://pre-nacos.axzo.cn}:${NACOS_PORT:443} + file-extension: yaml + namespace: ${NACOS_NAMESPACE_ID:8b4cf725-7595-4c92-b2a6-9260a51ce078} diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/AppTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/AppTest.java deleted file mode 100644 index 7a8b5c69..00000000 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/AppTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.axzo.tyr.server; - -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -/** - * Unit test for simple App. - */ -@RunWith(SpringRunner.class) -@SpringBootTest -public class AppTest { - -} 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 new file mode 100644 index 00000000..b6b4e1af --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/PermissionPointTest.java @@ -0,0 +1,136 @@ +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 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; + + @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)); + } + +} 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 new file mode 100644 index 00000000..b1444025 --- /dev/null +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/permission/SimpleTest.java @@ -0,0 +1,22 @@ +package cn.axzo.tyr.server.permission; + +import cn.axzo.tyr.client.model.permission.PermissionPointVO; +import org.junit.Test; + +/** + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/9/13 18:43 + */ +public class SimpleTest { + + @Test + public void testSplitBit() { + + PermissionPointVO vo = new PermissionPointVO(); + vo.applyFitOuTypeBit(34L); + System.out.println(vo.getFitOuTypeList()); + vo.applyFitOuTypeBit(65535L); + System.out.println(vo.getFitOuTypeList()); + } +}