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 index f6de9e38..3d49455b 100644 --- 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 @@ -1,12 +1,15 @@ package cn.axzo.tyr.client.feign; +import cn.axzo.framework.domain.web.result.ApiListResult; import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; -import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; +import cn.axzo.tyr.client.model.req.TreeRoleReq; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; @@ -140,4 +143,13 @@ public interface TyrSaasRoleApi { */ @PostMapping("api/saasRole/changeGroupLeaderRole") ApiResult changeGroupLeaderRole(@RequestBody @Valid List req); + + /** + * 查询角色树 + * @param req + * @return + */ + @PostMapping("/api/saasRole/tree") + ApiListResult treeSaasRole(@RequestBody @Valid TreeRoleReq req); + } diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java new file mode 100644 index 00000000..402f65f0 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/TreeRoleReq.java @@ -0,0 +1,15 @@ +package cn.axzo.tyr.client.model.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TreeRoleReq { + + private Boolean needRole; +} \ No newline at end of file diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java new file mode 100644 index 00000000..cbbd1057 --- /dev/null +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/res/RoleTreeRes.java @@ -0,0 +1,42 @@ +package cn.axzo.tyr.client.model.res; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RoleTreeRes { + + /** + * id + */ + private Long id; + + /** + * 根节点的code + */ + private String workspaceTypeCode; + + /** + * 名字 + */ + private String name; + + /** + * 类型:ROLE_GROUP(分组)、ROLE(角色)、ROOT(根节点) + */ + private String type; + + /** + * 是否显示 + */ + private Boolean isDisplay; + + private List children; +} 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 index 449812c4..65340683 100644 --- 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 @@ -66,4 +66,8 @@ public class SaasRoleGroupVO { private Date updateAt; + /** + * 上级分组id + */ + private Long parentId; } diff --git a/tyr-server/pom.xml b/tyr-server/pom.xml index 3c2ab346..e60566e2 100644 --- a/tyr-server/pom.xml +++ b/tyr-server/pom.xml @@ -101,6 +101,10 @@ maokai-api + + cn.axzo.pokonyan + pokonyan + 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 index 7e3becd5..1462a164 100644 --- 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 @@ -1,14 +1,20 @@ package cn.axzo.tyr.server.controller.role; import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.framework.domain.web.result.ApiListResult; import cn.axzo.framework.domain.web.result.ApiPageResult; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.tyr.client.feign.TyrSaasRoleApi; +import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; +import cn.axzo.tyr.client.model.req.CommonDictQueryReq; import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; +import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq; import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.res.RoleTreeRes; import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; -import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; +import cn.axzo.tyr.client.model.req.TreeRoleReq; +import cn.axzo.tyr.client.model.res.CommonDictResp; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; @@ -16,20 +22,34 @@ import cn.axzo.tyr.client.model.res.RoleWithUserRes; import cn.axzo.tyr.client.model.vo.SaasRoleAndGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; +import cn.axzo.tyr.client.model.vo.SaasRoleGroupVO; import cn.axzo.tyr.client.model.vo.SaasRoleVO; import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; import cn.axzo.tyr.server.model.PermissionCacheKey; +import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao; +import cn.axzo.tyr.server.repository.entity.SaasRole; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; import cn.axzo.tyr.server.service.PermissionCacheService; import cn.axzo.tyr.server.service.RoleService; +import cn.axzo.tyr.server.service.SaasCommonDictService; +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.apache.commons.lang3.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RestController; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 权限 @@ -49,6 +69,17 @@ public class SaasRoleController implements TyrSaasRoleApi { PermissionCacheService permissionCacheService; @Autowired private SaasRoleUserRelationDao saasRoleUserRelationDao; + @Autowired + private SaasCommonDictService saasCommonDictService; + @Autowired + private SaasRoleGroupService saasRoleGroupService; + @Autowired + private SaasRoleGroupRelationDao saasRoleGroupRelationDao; + + /** + * 角色组里面parentId = 0 + */ + private static final Long ROOT_ROLE_GROUP_PARENT_ID = 0L; @Override public ApiResult saveOrUpdate(SaveOrUpdateRoleVO saveOrUpdateRole) { @@ -133,4 +164,135 @@ public class SaasRoleController implements TyrSaasRoleApi { roleService.changeGroupLeaderRole(reqs); return ApiResult.ok(); } + + @Override + public ApiListResult treeSaasRole(TreeRoleReq req) { + + // 因为根节点在roleGroup里面没有,都是workspaceTypeCode,描述是放在字典表里 + List commonDicts = listRootRole(); + + List roots = commonDicts.stream() + .map(e -> RoleTreeRes.builder() + .workspaceTypeCode(e.getDictCode()) + .name(e.getDictValue()) + .type("ROOT") + .build()) + .collect(Collectors.toList()); + + Map> roleGroups = listRoleGroupTree(commonDicts, req); + + List result = roots.stream() + .peek(root -> root.setChildren(roleGroups.get(root.getWorkspaceTypeCode()))) + .collect(Collectors.toList()); + return ApiListResult.ok(result); + } + + /** + * 查询角色 + * Map<角色分组Id, List> + * @param roleGroups + * @param req + * @return + */ + private Map> listRole(List roleGroups, + TreeRoleReq req) { + + List roleGroupIds = roleGroups.stream().map(SaasRoleGroupVO::getId).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(roleGroupIds) || BooleanUtils.isNotTrue(req.getNeedRole())) { + return Collections.emptyMap(); + } + + List saasRoleGroupRelations = saasRoleGroupRelationDao.getByGroupIds(roleGroupIds); + + Map saasRoles = roleService.list(RoleService.ListSaasRoleParam.builder() + .roleIds(Lists.transform(saasRoleGroupRelations, SaasRoleGroupRelation::getRoleId)) + .build()) + .stream() + .collect(Collectors.toMap(SaasRole::getId, Function.identity())); + + return saasRoleGroupRelations.stream() + .collect(Collectors.groupingBy(SaasRoleGroupRelation::getSaasRoleGroupId)) + .entrySet() + .stream() + .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue() + .stream() + .map(value -> toRoleTree(saasRoles.get(value.getRoleId()))) + .filter(Objects::nonNull) + .collect(Collectors.toList()))); + } + + private Map> listRoleGroupTree(List commonDicts, + TreeRoleReq req) { + if (CollectionUtils.isEmpty(commonDicts)) { + return Collections.emptyMap(); + } + + List roleGroups = saasRoleGroupService.getList(QuerySaasRoleGroupReq.builder() + .workspaceTypeCode(Lists.transform(commonDicts, CommonDictResp::getDictCode)) + .build()) + .stream() + .sorted(Comparator.comparing(SaasRoleGroupVO::getSort)) + .collect(Collectors.toList()); + + Map> roles = listRole(roleGroups, req); + + Map> rootRoleGroups = roleGroups.stream() + .filter(e -> Objects.equals(e.getParentId(), ROOT_ROLE_GROUP_PARENT_ID)) + .collect(Collectors.groupingBy(SaasRoleGroupVO::getWorkspaceTypeCode, + LinkedHashMap::new, + Collectors.mapping(this::toRoleTree, Collectors.toList()))); + + rootRoleGroups.values().forEach(e -> e.forEach(root -> appendChildren(root, roleGroups, roles))); + + return rootRoleGroups; + } + + private RoleTreeRes toRoleTree(SaasRoleGroupVO roleGroup) { + return RoleTreeRes.builder() + .workspaceTypeCode(roleGroup.getWorkspaceTypeCode()) + .id(roleGroup.getId()) + .name(roleGroup.getName()) + .type("ROLE_GROUP") + .build(); + } + + private RoleTreeRes toRoleTree(SaasRole role) { + if (role == null) { + return null; + } + return RoleTreeRes.builder() + .id(role.getId()) + .name(role.getName()) + .type("ROLE") + .build(); + } + + private void appendChildren(RoleTreeRes rootRoleGroup, + List roleGroups, + Map> roles) { + if (rootRoleGroup == null) { + return; + } + + // 因为children可能是role或者roleGroup + List childrenRoleGroups = roleGroups.stream() + .filter(p -> Objects.equals(p.getParentId(), rootRoleGroup.getId())) + .map(this::toRoleTree) + .collect(Collectors.toList()); + + List childrenRoles = roles.get(rootRoleGroup.getId()); + if (CollectionUtils.isNotEmpty(childrenRoles)) { + childrenRoleGroups.addAll(childrenRoles); + } + + rootRoleGroup.setChildren(childrenRoleGroups); + + childrenRoleGroups.forEach(e -> appendChildren(e, roleGroups, roles)); + } + + private List listRootRole() { + return saasCommonDictService.query(CommonDictQueryReq.builder() + .scope("role") + .build()); + } } 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 index 32d8da5e..61e29103 100644 --- 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 @@ -3,8 +3,11 @@ 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.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; @@ -19,6 +22,9 @@ import java.io.Serializable; @Data @EqualsAndHashCode(callSuper = true) @Accessors(chain = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor public class SaasRoleGroup extends BaseEntity implements Serializable { private static final long serialVersionUID = 972205950455439772L; @@ -69,6 +75,10 @@ public class SaasRoleGroup extends BaseEntity implements Serializ */ private String categoryCode; + /** + * 上级分组id + */ + private Long parentId; /** * 获取主键值 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 index 3409e4eb..431392bf 100644 --- 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 @@ -1,8 +1,15 @@ package cn.axzo.tyr.server.service; import cn.axzo.framework.domain.page.PageResp; +import cn.axzo.pokonyan.dao.page.IPageParam; +import cn.axzo.pokonyan.dao.wrapper.CriteriaField; +import cn.axzo.pokonyan.dao.wrapper.Operator; import cn.axzo.tyr.client.model.enums.IdentityType; -import cn.axzo.tyr.client.model.req.*; +import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq; +import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq; +import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; +import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; +import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq; import cn.axzo.tyr.client.model.res.IsSuperAdminRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; @@ -16,6 +23,12 @@ import cn.axzo.tyr.server.model.RoleWithFeature; import cn.axzo.tyr.server.repository.entity.SaasRole; import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; import cn.axzo.tyr.server.service.impl.TyrSaasAuthServiceImpl; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; import java.util.List; import java.util.Set; @@ -27,7 +40,7 @@ import java.util.Set; * @author: ZhanSiHu * @date: 2023/9/6 15:51 */ -public interface RoleService { +public interface RoleService extends IService { List queryByIdentityIdType(Long identityId, Integer identityType,Long workspaceId,Long ouId, Boolean includePermissionGroup); @@ -103,5 +116,38 @@ public interface RoleService { /** 查询超管和管理员角色 **/ List listAdmins(Long workspaceId, Long ouId); + List list(ListSaasRoleParam param); + + Page page(PageSaasRoleParam param); + + @SuperBuilder + @Data + @NoArgsConstructor + @AllArgsConstructor + class ListSaasRoleParam { + + @CriteriaField(field = "id", operator = Operator.IN) + private List roleIds; + } + + @SuperBuilder + @Data + @NoArgsConstructor + @AllArgsConstructor + class PageSaasRoleParam extends ListSaasRoleParam implements IPageParam { + @CriteriaField(ignore = true) + Integer page; + + @CriteriaField(ignore = true) + Integer pageSize; + + /** + * 排序:使用示例,createTime__DESC + */ + @CriteriaField(ignore = true) + List sort; + } + + List listWithFeatures(Set roleIds, Set featureIds); } 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 index b8ae8a52..20b9f57c 100644 --- 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 @@ -1,9 +1,51 @@ package cn.axzo.tyr.server.service; +import cn.axzo.pokonyan.dao.page.IPageParam; +import cn.axzo.pokonyan.dao.wrapper.CriteriaField; +import cn.axzo.pokonyan.dao.wrapper.Operator; import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; import java.util.List; -public interface SaasRoleGroupRelationService { +public interface SaasRoleGroupRelationService extends IService { void saveOrUpdate(List relations); + + List list(ListSaasRoleGroupRelationParam param); + + Page page(PageSaasRoleGroupRelationParam param); + + @SuperBuilder + @Data + @NoArgsConstructor + @AllArgsConstructor + class ListSaasRoleGroupRelationParam { + + @CriteriaField(field = "roleId", operator = Operator.IN) + private List roleId; + } + + @SuperBuilder + @Data + @NoArgsConstructor + @AllArgsConstructor + class PageSaasRoleGroupRelationParam extends ListSaasRoleGroupRelationParam implements IPageParam { + @CriteriaField(ignore = true) + Integer page; + + @CriteriaField(ignore = true) + Integer pageSize; + + /** + * 排序:使用示例,createTime__DESC + */ + @CriteriaField(ignore = true) + List sort; + } + } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 0c380e6a..4a716ee0 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -4,6 +4,8 @@ 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.pokonyan.dao.converter.PageConverter; +import cn.axzo.pokonyan.dao.mysql.QueryWrapperHelper; import cn.axzo.tyr.client.common.enums.RoleResourceTypeEnum; import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.model.enums.IdentityType; @@ -45,6 +47,7 @@ import cn.axzo.tyr.server.repository.entity.SaasRoleGroup; import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; +import cn.axzo.tyr.server.repository.mapper.SaasRoleMapper; import cn.axzo.tyr.server.service.PermissionGroupService; import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; @@ -56,13 +59,16 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -93,7 +99,8 @@ import java.util.stream.Stream; @RequiredArgsConstructor @RefreshScope @Service -public class RoleServiceImpl implements RoleService { +public class RoleServiceImpl extends ServiceImpl + implements RoleService { @Autowired SaasRoleUserRelationDao roleUserRelationDao; @@ -1003,4 +1010,22 @@ public class RoleServiceImpl implements RoleService { } return result; } + + @Override + public List list(ListSaasRoleParam param) { + return PageConverter.drainAll(pageNumber -> { + PageSaasRoleParam pageParam = PageSaasRoleParam.builder().build(); + BeanUtils.copyProperties(param, pageParam); + pageParam.setPage(pageNumber); + pageParam.setPageSize(500); + return page(pageParam); + }); + } + + @Override + public Page page(PageSaasRoleParam param) { + QueryWrapper wrapper = QueryWrapperHelper.fromBean(param, SaasRole.class); + wrapper.eq("is_delete", 0); + return this.page(PageConverter.convertToMybatis(param, SaasRole.class), wrapper); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java index 5e363eaf..81797d13 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasFeatureResourceServiceImpl.java @@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -99,14 +100,26 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic // 新增时候 if (req.getId() == null) { baseResource.setCreateBy(req.getOperatorId()); + baseResource.setDisplayOrder(0); + List parallelResources = featureResourceDao.lambdaQuery().eq(SaasFeatureResource::getParentId, req.getParentId()).list(); + if (CollectionUtil.isNotEmpty(parallelResources)) { + SaasFeatureResource maxOrderResource = parallelResources.stream().max(Comparator.comparingInt(SaasFeatureResource::getDisplayOrder)).orElse(new SaasFeatureResource()); + baseResource.setDisplayOrder(maxOrderResource.getDisplayOrder() + 1); + } newResource(baseResource); } else { featureResourceDao.updateById(baseResource); } if (CollectionUtil.isNotEmpty(req.getComponentSaveReqList())) { - for (FeatureComponentSaveReq componentSaveReq : req.getComponentSaveReqList()) { - saveOrUpdateFeatureComponent(componentSaveReq, baseResource.getPath(), req.getOperatorId()); + List components = req.getComponentSaveReqList(); + for (int i = 0; i < components.size(); i++) { + FeatureComponentSaveReq childComponent = components.get(i); + if (childComponent.getParentId() != null) { + childComponent.setParentId(baseResource.getId()); + } + // 递归新增修改删除子节点 + saveOrUpdateFeatureComponent(childComponent, baseResource.getPath(), req.getOperatorId(), i); } } else { deleteComponentRecursionById(baseResource.getId(), null, req.getOperatorId()); @@ -122,10 +135,11 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic } - private void saveOrUpdateFeatureComponent(FeatureComponentSaveReq featureComponentSaveReq, String parentPath, Long operatorId) { + private void saveOrUpdateFeatureComponent(FeatureComponentSaveReq featureComponentSaveReq, String parentPath, Long operatorId, Integer displayOrder) { // 批量保存path SaasFeatureResource saasFeatureResource = BeanMapper.copyBean(featureComponentSaveReq, SaasFeatureResource.class); saasFeatureResource.setUpdateBy(operatorId); + saasFeatureResource.setDisplayOrder(displayOrder); if (saasFeatureResource.getId() != null) { featureResourceDao.updateById(saasFeatureResource); } else { @@ -141,12 +155,13 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic // 更新前端提交的数据; if (!CollectionUtil.isEmpty(children)) { - for (FeatureComponentSaveReq childComponent : children) { + for (int i = 0; i < children.size(); i++) { + FeatureComponentSaveReq childComponent = children.get(i); if (childComponent.getParentId() != null) { childComponent.setParentId(saasFeatureResource.getId()); } // 递归新增修改删除子节点 - saveOrUpdateFeatureComponent(childComponent, saasFeatureResource.getPath(), operatorId); + saveOrUpdateFeatureComponent(childComponent, saasFeatureResource.getPath(), operatorId, i); } } } @@ -165,6 +180,7 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic for (SaasFeatureResource deleteChild : deleteChildren) { // 删除自己及自己的子集 featureResourceDao.lambdaUpdate() + .eq(BaseEntity::getIsDelete,0) .apply("FIND_IN_SET('" + deleteChild.getId() + "', path)") .set(SaasFeatureResource::getUpdateBy, operatorId) .set(BaseEntity::getIsDelete,1); diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java index f067191e..dafb0283 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupRelationServiceImpl.java @@ -1,12 +1,19 @@ 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.pokonyan.dao.converter.PageConverter; +import cn.axzo.pokonyan.dao.mysql.QueryWrapperHelper; import cn.axzo.tyr.server.repository.dao.SaasRoleGroupRelationDao; +import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation; +import cn.axzo.tyr.server.repository.mapper.SaasRoleGroupRelationMapper; import cn.axzo.tyr.server.service.SaasRoleGroupRelationService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,7 +24,8 @@ import java.util.stream.Collectors; @Slf4j @Service @RequiredArgsConstructor -public class SaasRoleGroupRelationServiceImpl implements SaasRoleGroupRelationService { +public class SaasRoleGroupRelationServiceImpl extends ServiceImpl + implements SaasRoleGroupRelationService { private final SaasRoleGroupRelationDao saasRoleGroupRelationDao; @Override @@ -42,4 +50,23 @@ public class SaasRoleGroupRelationServiceImpl implements SaasRoleGroupRelationSe saasRoleGroupRelationDao.removeByIds(deleteList.stream().map(SaasRoleGroupRelation::getId).collect(Collectors.toList())); } } + + @Override + public List list(ListSaasRoleGroupRelationParam param) { + return PageConverter.drainAll(pageNumber -> { + PageSaasRoleGroupRelationParam pageParam = PageSaasRoleGroupRelationParam.builder().build(); + BeanUtils.copyProperties(param, pageParam); + pageParam.setPage(pageNumber); + pageParam.setPageSize(500); + return page(pageParam); + }); + } + + @Override + public Page page(PageSaasRoleGroupRelationParam param) { + QueryWrapper wrapper = QueryWrapperHelper.fromBean(param, SaasRoleGroupRelation.class); + wrapper.eq("is_delete", 0); + + return this.page(PageConverter.convertToMybatis(param, SaasRoleGroupRelation.class), wrapper); + } } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java index 3dfaf22f..8aa00f0b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/SaasRoleGroupServiceImpl.java @@ -156,6 +156,7 @@ public class SaasRoleGroupServiceImpl implements SaasRoleGroupService { saasRoleGroup.setSort(req.getSort()); saasRoleGroup.setWorkspaceId(req.getWorkspaceId() != null ? req.getWorkspaceId() : -1L); saasRoleGroup.setOuId(req.getOuId() != null ? req.getOuId() : -1L); + saasRoleGroup.setParentId(req.getParentId()); return saasRoleGroup; }