Merge remote-tracking branch 'origin/feature/REQ-2227' into feature/REQ-2227

This commit is contained in:
zhansihu 2024-04-09 15:28:50 +08:00
commit ebed487c99
13 changed files with 419 additions and 13 deletions

View File

@ -1,12 +1,15 @@
package cn.axzo.tyr.client.feign; 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.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult; 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.QueryByIdentityIdTypeReq;
import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; import cn.axzo.tyr.client.model.req.QueryRoleByNameReq;
import cn.axzo.tyr.client.model.req.QuerySaasRoleReq; 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.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.IsSuperAdminRes;
import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes;
import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; import cn.axzo.tyr.client.model.res.QueryRoleByNameResp;
@ -140,4 +143,13 @@ public interface TyrSaasRoleApi {
*/ */
@PostMapping("api/saasRole/changeGroupLeaderRole") @PostMapping("api/saasRole/changeGroupLeaderRole")
ApiResult<Void> changeGroupLeaderRole(@RequestBody @Valid List<ChangeGroupLeaderRoleReq> req); ApiResult<Void> changeGroupLeaderRole(@RequestBody @Valid List<ChangeGroupLeaderRoleReq> req);
/**
* 查询角色树
* @param req
* @return
*/
@PostMapping("/api/saasRole/tree")
ApiListResult<RoleTreeRes> treeSaasRole(@RequestBody @Valid TreeRoleReq req);
} }

View File

@ -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;
}

View File

@ -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<RoleTreeRes> children;
}

View File

@ -66,4 +66,8 @@ public class SaasRoleGroupVO {
private Date updateAt; private Date updateAt;
/**
* 上级分组id
*/
private Long parentId;
} }

View File

@ -101,6 +101,10 @@
<artifactId>maokai-api</artifactId> <artifactId>maokai-api</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.axzo.pokonyan</groupId>
<artifactId>pokonyan</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>

View File

@ -1,14 +1,20 @@
package cn.axzo.tyr.server.controller.role; package cn.axzo.tyr.server.controller.role;
import cn.axzo.basics.common.exception.ServiceException; 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.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.feign.TyrSaasRoleApi; 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.QueryByIdentityIdTypeReq;
import cn.axzo.tyr.client.model.req.QueryRoleByNameReq; 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.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.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.IsSuperAdminRes;
import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes;
import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; 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.SaasRoleAndGroupVO;
import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO; import cn.axzo.tyr.client.model.vo.SaasRoleCategoryVO;
import cn.axzo.tyr.client.model.vo.SaasRoleGroupCodeVO; 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.SaasRoleVO;
import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO; import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO;
import cn.axzo.tyr.server.model.PermissionCacheKey; 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.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.PermissionCacheService;
import cn.axzo.tyr.server.service.RoleService; 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 com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController; 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.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; PermissionCacheService permissionCacheService;
@Autowired @Autowired
private SaasRoleUserRelationDao saasRoleUserRelationDao; 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 @Override
public ApiResult<Long> saveOrUpdate(SaveOrUpdateRoleVO saveOrUpdateRole) { public ApiResult<Long> saveOrUpdate(SaveOrUpdateRoleVO saveOrUpdateRole) {
@ -133,4 +164,135 @@ public class SaasRoleController implements TyrSaasRoleApi {
roleService.changeGroupLeaderRole(reqs); roleService.changeGroupLeaderRole(reqs);
return ApiResult.ok(); return ApiResult.ok();
} }
@Override
public ApiListResult<RoleTreeRes> treeSaasRole(TreeRoleReq req) {
// 因为根节点在roleGroup里面没有都是workspaceTypeCode描述是放在字典表里
List<CommonDictResp> commonDicts = listRootRole();
List<RoleTreeRes> roots = commonDicts.stream()
.map(e -> RoleTreeRes.builder()
.workspaceTypeCode(e.getDictCode())
.name(e.getDictValue())
.type("ROOT")
.build())
.collect(Collectors.toList());
Map<String, List<RoleTreeRes>> roleGroups = listRoleGroupTree(commonDicts, req);
List<RoleTreeRes> result = roots.stream()
.peek(root -> root.setChildren(roleGroups.get(root.getWorkspaceTypeCode())))
.collect(Collectors.toList());
return ApiListResult.ok(result);
}
/**
* 查询角色
* Map<角色分组Id, List<RoleTreeRes>>
* @param roleGroups
* @param req
* @return
*/
private Map<Long, List<RoleTreeRes>> listRole(List<SaasRoleGroupVO> roleGroups,
TreeRoleReq req) {
List<Long> roleGroupIds = roleGroups.stream().map(SaasRoleGroupVO::getId).collect(Collectors.toList());
if (CollectionUtils.isEmpty(roleGroupIds) || BooleanUtils.isNotTrue(req.getNeedRole())) {
return Collections.emptyMap();
}
List<SaasRoleGroupRelation> saasRoleGroupRelations = saasRoleGroupRelationDao.getByGroupIds(roleGroupIds);
Map<Long, SaasRole> 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<String, List<RoleTreeRes>> listRoleGroupTree(List<CommonDictResp> commonDicts,
TreeRoleReq req) {
if (CollectionUtils.isEmpty(commonDicts)) {
return Collections.emptyMap();
}
List<SaasRoleGroupVO> roleGroups = saasRoleGroupService.getList(QuerySaasRoleGroupReq.builder()
.workspaceTypeCode(Lists.transform(commonDicts, CommonDictResp::getDictCode))
.build())
.stream()
.sorted(Comparator.comparing(SaasRoleGroupVO::getSort))
.collect(Collectors.toList());
Map<Long, List<RoleTreeRes>> roles = listRole(roleGroups, req);
Map<String, List<RoleTreeRes>> 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<SaasRoleGroupVO> roleGroups,
Map<Long, List<RoleTreeRes>> roles) {
if (rootRoleGroup == null) {
return;
}
// 因为children可能是role或者roleGroup
List<RoleTreeRes> childrenRoleGroups = roleGroups.stream()
.filter(p -> Objects.equals(p.getParentId(), rootRoleGroup.getId()))
.map(this::toRoleTree)
.collect(Collectors.toList());
List<RoleTreeRes> childrenRoles = roles.get(rootRoleGroup.getId());
if (CollectionUtils.isNotEmpty(childrenRoles)) {
childrenRoleGroups.addAll(childrenRoles);
}
rootRoleGroup.setChildren(childrenRoleGroups);
childrenRoleGroups.forEach(e -> appendChildren(e, roleGroups, roles));
}
private List<CommonDictResp> listRootRole() {
return saasCommonDictService.query(CommonDictQueryReq.builder()
.scope("role")
.build());
}
} }

View File

@ -3,8 +3,11 @@ package cn.axzo.tyr.server.repository.entity;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable; import java.io.Serializable;
@ -19,6 +22,9 @@ import java.io.Serializable;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Accessors(chain = true) @Accessors(chain = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SaasRoleGroup extends BaseEntity<SaasRoleGroup> implements Serializable { public class SaasRoleGroup extends BaseEntity<SaasRoleGroup> implements Serializable {
private static final long serialVersionUID = 972205950455439772L; private static final long serialVersionUID = 972205950455439772L;
@ -69,6 +75,10 @@ public class SaasRoleGroup extends BaseEntity<SaasRoleGroup> implements Serializ
*/ */
private String categoryCode; private String categoryCode;
/**
* 上级分组id
*/
private Long parentId;
/** /**
* 获取主键值 * 获取主键值

View File

@ -1,8 +1,15 @@
package cn.axzo.tyr.server.service; package cn.axzo.tyr.server.service;
import cn.axzo.framework.domain.page.PageResp; 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.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.IsSuperAdminRes;
import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes; import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes;
import cn.axzo.tyr.client.model.res.QueryRoleByNameResp; 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.SaasRole;
import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser;
import cn.axzo.tyr.server.service.impl.TyrSaasAuthServiceImpl; 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.List;
import java.util.Set; import java.util.Set;
@ -27,7 +40,7 @@ import java.util.Set;
* @author: ZhanSiHu * @author: ZhanSiHu
* @date: 2023/9/6 15:51 * @date: 2023/9/6 15:51
*/ */
public interface RoleService { public interface RoleService extends IService<SaasRole> {
List<SaasRoleVO> queryByIdentityIdType(Long identityId, Integer identityType,Long workspaceId,Long ouId, Boolean includePermissionGroup); List<SaasRoleVO> queryByIdentityIdType(Long identityId, Integer identityType,Long workspaceId,Long ouId, Boolean includePermissionGroup);
@ -103,5 +116,38 @@ public interface RoleService {
/** 查询超管和管理员角色 **/ /** 查询超管和管理员角色 **/
List<SaasRole> listAdmins(Long workspaceId, Long ouId); List<SaasRole> listAdmins(Long workspaceId, Long ouId);
List<SaasRole> list(ListSaasRoleParam param);
Page<SaasRole> page(PageSaasRoleParam param);
@SuperBuilder
@Data
@NoArgsConstructor
@AllArgsConstructor
class ListSaasRoleParam {
@CriteriaField(field = "id", operator = Operator.IN)
private List<Long> 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<String> sort;
}
List<RoleWithFeature> listWithFeatures(Set<Long> roleIds, Set<Long> featureIds); List<RoleWithFeature> listWithFeatures(Set<Long> roleIds, Set<Long> featureIds);
} }

View File

@ -1,9 +1,51 @@
package cn.axzo.tyr.server.service; 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 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; import java.util.List;
public interface SaasRoleGroupRelationService { public interface SaasRoleGroupRelationService extends IService<SaasRoleGroupRelation> {
void saveOrUpdate(List<SaasRoleGroupRelation> relations); void saveOrUpdate(List<SaasRoleGroupRelation> relations);
List<SaasRoleGroupRelation> list(ListSaasRoleGroupRelationParam param);
Page<SaasRoleGroupRelation> page(PageSaasRoleGroupRelationParam param);
@SuperBuilder
@Data
@NoArgsConstructor
@AllArgsConstructor
class ListSaasRoleGroupRelationParam {
@CriteriaField(field = "roleId", operator = Operator.IN)
private List<Long> 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<String> sort;
}
} }

View File

@ -4,6 +4,8 @@ import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum;
import cn.axzo.basics.common.exception.ServiceException; import cn.axzo.basics.common.exception.ServiceException;
import cn.axzo.framework.domain.page.PageResp; import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity; 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.RoleResourceTypeEnum;
import cn.axzo.tyr.client.common.enums.RoleTypeEnum; import cn.axzo.tyr.client.common.enums.RoleTypeEnum;
import cn.axzo.tyr.client.model.enums.IdentityType; 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.SaasRoleGroupRelation;
import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation; import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation;
import cn.axzo.tyr.server.repository.entity.SaasRoleWithUser; 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.PermissionGroupService;
import cn.axzo.tyr.server.service.RoleService; import cn.axzo.tyr.server.service.RoleService;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService; 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.collection.ListUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.cloud.context.config.annotation.RefreshScope;
@ -93,7 +99,8 @@ import java.util.stream.Stream;
@RequiredArgsConstructor @RequiredArgsConstructor
@RefreshScope @RefreshScope
@Service @Service
public class RoleServiceImpl implements RoleService { public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
implements RoleService {
@Autowired @Autowired
SaasRoleUserRelationDao roleUserRelationDao; SaasRoleUserRelationDao roleUserRelationDao;
@ -1003,4 +1010,22 @@ public class RoleServiceImpl implements RoleService {
} }
return result; return result;
} }
@Override
public List<SaasRole> 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<SaasRole> page(PageSaasRoleParam param) {
QueryWrapper<SaasRole> wrapper = QueryWrapperHelper.fromBean(param, SaasRole.class);
wrapper.eq("is_delete", 0);
return this.page(PageConverter.convertToMybatis(param, SaasRole.class), wrapper);
}
} }

View File

@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -99,14 +100,26 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic
// 新增时候 // 新增时候
if (req.getId() == null) { if (req.getId() == null) {
baseResource.setCreateBy(req.getOperatorId()); baseResource.setCreateBy(req.getOperatorId());
baseResource.setDisplayOrder(0);
List<SaasFeatureResource> 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); newResource(baseResource);
} else { } else {
featureResourceDao.updateById(baseResource); featureResourceDao.updateById(baseResource);
} }
if (CollectionUtil.isNotEmpty(req.getComponentSaveReqList())) { if (CollectionUtil.isNotEmpty(req.getComponentSaveReqList())) {
for (FeatureComponentSaveReq componentSaveReq : req.getComponentSaveReqList()) { List<FeatureComponentSaveReq> components = req.getComponentSaveReqList();
saveOrUpdateFeatureComponent(componentSaveReq, baseResource.getPath(), req.getOperatorId()); 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 { } else {
deleteComponentRecursionById(baseResource.getId(), null, req.getOperatorId()); 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 // 批量保存path
SaasFeatureResource saasFeatureResource = BeanMapper.copyBean(featureComponentSaveReq, SaasFeatureResource.class); SaasFeatureResource saasFeatureResource = BeanMapper.copyBean(featureComponentSaveReq, SaasFeatureResource.class);
saasFeatureResource.setUpdateBy(operatorId); saasFeatureResource.setUpdateBy(operatorId);
saasFeatureResource.setDisplayOrder(displayOrder);
if (saasFeatureResource.getId() != null) { if (saasFeatureResource.getId() != null) {
featureResourceDao.updateById(saasFeatureResource); featureResourceDao.updateById(saasFeatureResource);
} else { } else {
@ -141,12 +155,13 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic
// 更新前端提交的数据 // 更新前端提交的数据
if (!CollectionUtil.isEmpty(children)) { 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) { if (childComponent.getParentId() != null) {
childComponent.setParentId(saasFeatureResource.getId()); 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) { for (SaasFeatureResource deleteChild : deleteChildren) {
// 删除自己及自己的子集 // 删除自己及自己的子集
featureResourceDao.lambdaUpdate() featureResourceDao.lambdaUpdate()
.eq(BaseEntity::getIsDelete,0)
.apply("FIND_IN_SET('" + deleteChild.getId() + "', path)") .apply("FIND_IN_SET('" + deleteChild.getId() + "', path)")
.set(SaasFeatureResource::getUpdateBy, operatorId) .set(SaasFeatureResource::getUpdateBy, operatorId)
.set(BaseEntity::getIsDelete,1); .set(BaseEntity::getIsDelete,1);

View File

@ -1,12 +1,19 @@
package cn.axzo.tyr.server.service.impl; package cn.axzo.tyr.server.service.impl;
import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum; 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.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 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.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -17,7 +24,8 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class SaasRoleGroupRelationServiceImpl implements SaasRoleGroupRelationService { public class SaasRoleGroupRelationServiceImpl extends ServiceImpl<SaasRoleGroupRelationMapper, SaasRoleGroupRelation>
implements SaasRoleGroupRelationService {
private final SaasRoleGroupRelationDao saasRoleGroupRelationDao; private final SaasRoleGroupRelationDao saasRoleGroupRelationDao;
@Override @Override
@ -42,4 +50,23 @@ public class SaasRoleGroupRelationServiceImpl implements SaasRoleGroupRelationSe
saasRoleGroupRelationDao.removeByIds(deleteList.stream().map(SaasRoleGroupRelation::getId).collect(Collectors.toList())); saasRoleGroupRelationDao.removeByIds(deleteList.stream().map(SaasRoleGroupRelation::getId).collect(Collectors.toList()));
} }
} }
@Override
public List<SaasRoleGroupRelation> 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<SaasRoleGroupRelation> page(PageSaasRoleGroupRelationParam param) {
QueryWrapper<SaasRoleGroupRelation> wrapper = QueryWrapperHelper.fromBean(param, SaasRoleGroupRelation.class);
wrapper.eq("is_delete", 0);
return this.page(PageConverter.convertToMybatis(param, SaasRoleGroupRelation.class), wrapper);
}
} }

View File

@ -156,6 +156,7 @@ public class SaasRoleGroupServiceImpl implements SaasRoleGroupService {
saasRoleGroup.setSort(req.getSort()); saasRoleGroup.setSort(req.getSort());
saasRoleGroup.setWorkspaceId(req.getWorkspaceId() != null ? req.getWorkspaceId() : -1L); saasRoleGroup.setWorkspaceId(req.getWorkspaceId() != null ? req.getWorkspaceId() : -1L);
saasRoleGroup.setOuId(req.getOuId() != null ? req.getOuId() : -1L); saasRoleGroup.setOuId(req.getOuId() != null ? req.getOuId() : -1L);
saasRoleGroup.setParentId(req.getParentId());
return saasRoleGroup; return saasRoleGroup;
} }