feat:(REQ-2545) 增加新的查询菜单的接口
This commit is contained in:
parent
58362775ae
commit
30eaf00d10
@ -5,10 +5,12 @@ import cn.axzo.tyr.client.model.req.NavTreeReq;
|
||||
import cn.axzo.tyr.client.model.req.PagePermissionReq;
|
||||
import cn.axzo.tyr.client.model.req.PagePermissionResp;
|
||||
import cn.axzo.tyr.client.model.req.PermissionCheckReq;
|
||||
import cn.axzo.tyr.client.model.req.TreePermissionReq;
|
||||
import cn.axzo.tyr.client.model.req.TreeProductFeatureResourceReq;
|
||||
import cn.axzo.tyr.client.model.res.FeatureResourceDTO;
|
||||
import cn.axzo.tyr.client.model.res.NavTreeResp;
|
||||
import cn.axzo.tyr.client.model.res.ProductFeatureResourceResp;
|
||||
import cn.axzo.tyr.client.model.res.TreePermissionResp;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
@ -29,6 +31,7 @@ public interface PermissionQueryApi {
|
||||
|
||||
/** 返回有权限的导航菜单页面 **/
|
||||
@PostMapping(value = "/api/v3/permission/query/getNavTree")
|
||||
@Deprecated
|
||||
ApiResult<List<NavTreeResp>> getNavTree(@RequestBody @Valid NavTreeReq req);
|
||||
|
||||
/** 页面权限详情:页面自身及所有下级 **/
|
||||
@ -54,4 +57,14 @@ public interface PermissionQueryApi {
|
||||
*/
|
||||
@PostMapping(value = "/api/v3/productPermission/list")
|
||||
ApiResult<List<FeatureResourceDTO>> listFeatureResource(@RequestBody @Validated TreeProductFeatureResourceReq request);
|
||||
|
||||
/**
|
||||
* 查询用户有权限的菜单资源树
|
||||
* getNavTree已经废弃,不在原方法上改的原因:OMS端现在没有保存角色的菜单权限,且不通用,不能传入指定类型的节点和树种某个节点下的子节点
|
||||
* 待oms端把菜单的权限点保存且使用前端的页面元素后就可以切换这个接口
|
||||
* @param req
|
||||
* @return
|
||||
*/
|
||||
@PostMapping(value = "/api/v3/permission/featureResource/tree")
|
||||
ApiResult<List<TreePermissionResp>> treePermission(@RequestBody @Validated TreePermissionReq req);
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ package cn.axzo.tyr.client.model.req;
|
||||
import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
|
||||
import cn.axzo.foundation.dao.support.wrapper.Operator;
|
||||
import cn.axzo.foundation.page.IPageReq;
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
@ -30,4 +31,25 @@ public class PagePgroupPermissionRelationReq implements IPageReq {
|
||||
|
||||
@CriteriaField(field = "id", operator = Operator.IN)
|
||||
private List<Long> ids;
|
||||
|
||||
@CriteriaField(field = "groupId", operator = Operator.IN)
|
||||
private List<Long> groupIds;
|
||||
|
||||
@CriteriaField(field = "featureId", operator = Operator.IN)
|
||||
private List<Long> featureIds;
|
||||
|
||||
@CriteriaField(field = "type", operator = Operator.EQ)
|
||||
private Integer type;
|
||||
|
||||
/**
|
||||
* 查询菜单树节点类型
|
||||
*/
|
||||
@CriteriaField(ignore = true)
|
||||
private List<FeatureResourceType> featureResourceTypes;
|
||||
|
||||
/**
|
||||
* 端,查询权限点时,会根据端过滤,增加效率,目前只有CMS端的新版本才冗余了端
|
||||
*/
|
||||
@CriteriaField(ignore = true)
|
||||
private String terminal;
|
||||
}
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
package cn.axzo.tyr.client.model.req;
|
||||
|
||||
import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
|
||||
import cn.axzo.foundation.dao.support.wrapper.Operator;
|
||||
import cn.axzo.foundation.page.IPageReq;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PageSaasFeatureResourceReq implements IPageReq {
|
||||
|
||||
@CriteriaField(ignore = true)
|
||||
Integer page;
|
||||
|
||||
@CriteriaField(ignore = true)
|
||||
Integer pageSize;
|
||||
|
||||
/**
|
||||
* 排序:使用示例,createTime__DESC
|
||||
*/
|
||||
@CriteriaField(ignore = true)
|
||||
List<String> sort;
|
||||
|
||||
@CriteriaField(field = "id", operator = Operator.IN)
|
||||
private List<Long> ids;
|
||||
|
||||
/**
|
||||
* 授权类型0-全部角色 1-指定角色
|
||||
* FeatureResourceAuthType.ALL_ROLE
|
||||
*/
|
||||
@CriteriaField(field = "authType", operator = Operator.EQ)
|
||||
private Integer authType;
|
||||
|
||||
/**
|
||||
* 资源所属端
|
||||
*/
|
||||
@CriteriaField(field = "terminal", operator = Operator.EQ)
|
||||
private String terminal;
|
||||
}
|
||||
@ -34,6 +34,8 @@ public class PermissionCheckReq {
|
||||
@NotNull(message = "租户ID不能为空")
|
||||
private Long workspaceId;
|
||||
|
||||
/** 登录端 **/
|
||||
/**
|
||||
* 登录端,历史的cms和cmp,cm端没有给端,给了会有问题
|
||||
*/
|
||||
private String terminal;
|
||||
}
|
||||
|
||||
@ -0,0 +1,49 @@
|
||||
package cn.axzo.tyr.client.model.req;
|
||||
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
|
||||
import cn.axzo.tyr.client.model.base.WorkspaceOUPair;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class TreePermissionReq {
|
||||
|
||||
@NotNull(message = "人员ID不能为空")
|
||||
private Long personId;
|
||||
|
||||
/**
|
||||
* 端
|
||||
*/
|
||||
@NotNull(message = "端不能为空")
|
||||
private String terminal;
|
||||
|
||||
/**
|
||||
* 项目与企业
|
||||
*/
|
||||
@NotEmpty(message = "项目与企业对不能为空")
|
||||
private List<WorkspaceOUPair> workspaceOUPairs;
|
||||
|
||||
/**
|
||||
* 查询菜单树节点类型
|
||||
*/
|
||||
private List<FeatureResourceType> featureResourceTypes;
|
||||
|
||||
/**
|
||||
* 父节点id
|
||||
*/
|
||||
private Long parentFeatureId;
|
||||
|
||||
/**
|
||||
* 是否需要返回权限码
|
||||
*/
|
||||
private boolean needFeatureCodes;
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
package cn.axzo.tyr.client.model.res;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class SaasPermissionRelationRes {
|
||||
|
||||
/**
|
||||
* 菜单资源树节点id
|
||||
*/
|
||||
private Long featureId;
|
||||
|
||||
/**
|
||||
* 新旧菜单资源数标识
|
||||
*/
|
||||
private Integer type;
|
||||
|
||||
/**
|
||||
* 菜单资源树节点类型
|
||||
*/
|
||||
private Integer featureType;
|
||||
}
|
||||
@ -114,6 +114,11 @@ public class SaasRoleRes {
|
||||
*/
|
||||
private List<SaasRoleUserV2DTO.SaasRoleUser> saasRoleUsers;
|
||||
|
||||
/**
|
||||
* 角色关联的权限点id信息,没有featureCode,直接查询的pgPermissionRelation
|
||||
*/
|
||||
private List<SaasPermissionRelationRes> permissionRelations;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
|
||||
@ -0,0 +1,95 @@
|
||||
package cn.axzo.tyr.client.model.res;
|
||||
|
||||
|
||||
import cn.axzo.basics.common.model.IBaseTree;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class TreePermissionResp implements IBaseTree<TreePermissionResp, Long> {
|
||||
|
||||
/**
|
||||
* 菜单树节点id
|
||||
*/
|
||||
private Long featureId;
|
||||
|
||||
/**
|
||||
* 菜单树节点名字
|
||||
*/
|
||||
private String featureName;
|
||||
|
||||
/**
|
||||
* 菜单资源类型1-菜单 2-页面 3-应用入口 4-组件 5-root节点 6-分组
|
||||
*/
|
||||
private Integer featureType;
|
||||
|
||||
/**
|
||||
* 跳转类型 1-站内跳转 2-站外跳转
|
||||
*/
|
||||
private Integer redirectType;
|
||||
|
||||
/**
|
||||
* 资源跳转URI
|
||||
*/
|
||||
private String linkUrl;
|
||||
|
||||
/**
|
||||
* 菜单树节点对应的前端featureCodes
|
||||
*/
|
||||
private Set<String> featureCodes;
|
||||
|
||||
/** 图标 **/
|
||||
private String icon;
|
||||
|
||||
/**
|
||||
* 上级资源ID
|
||||
*/
|
||||
private Long parentId;
|
||||
|
||||
/**
|
||||
* 资源状态 0-隐藏 1-展示
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
/**
|
||||
* 菜单页面编码,端唯一
|
||||
*/
|
||||
private String uniCode;
|
||||
|
||||
/**
|
||||
* 菜单树子节点信息
|
||||
*/
|
||||
private List<TreePermissionResp> children;
|
||||
|
||||
@JsonIgnore
|
||||
@Override
|
||||
public Long getNodeCode() {
|
||||
return this.getFeatureId();
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
@Override
|
||||
public Long getParentNodeCode() {
|
||||
return this.getParentId();
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
@Override
|
||||
public List<TreePermissionResp> getNodeChildren() {
|
||||
return this.getChildren();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNodeChildren(List<TreePermissionResp> nodeChildren) {
|
||||
this.children = nodeChildren;
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
package cn.axzo.tyr.client.model.roleuser.dto;
|
||||
|
||||
import cn.axzo.tyr.client.model.res.SaasPermissionRelationRes;
|
||||
import cn.axzo.tyr.client.model.res.SaasPermissionRes;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@ -38,6 +39,17 @@ public class SaasRoleUserV2DTO {
|
||||
* 用户名字
|
||||
*/
|
||||
private String realName;
|
||||
|
||||
/**
|
||||
* 单位Id
|
||||
*/
|
||||
private Long ouId;
|
||||
|
||||
/**
|
||||
* 项目id
|
||||
*/
|
||||
private Long workspaceId;
|
||||
|
||||
}
|
||||
|
||||
@Data
|
||||
@ -72,5 +84,10 @@ public class SaasRoleUserV2DTO {
|
||||
* 角色权限
|
||||
*/
|
||||
private List<SaasPermissionRes> saasPermissions;
|
||||
|
||||
/**
|
||||
* 角色关联的权限点id信息,没有featureCode,直接查询的pgPermissionRelation
|
||||
*/
|
||||
private List<SaasPermissionRelationRes> permissionRelations;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,6 +2,7 @@ package cn.axzo.tyr.client.model.roleuser.req;
|
||||
|
||||
import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
|
||||
import cn.axzo.foundation.dao.support.wrapper.Operator;
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
|
||||
import cn.axzo.tyr.client.model.enums.IdentityType;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@ -63,6 +64,24 @@ public class ListRoleUserRelationParam {
|
||||
@CriteriaField(ignore = true)
|
||||
private List<Long> featureIds;
|
||||
|
||||
@CriteriaField(ignore = true)
|
||||
private Boolean needPermissionRelation;
|
||||
|
||||
/**
|
||||
* 查询菜单树节点类型
|
||||
*/
|
||||
@CriteriaField(ignore = true)
|
||||
private List<FeatureResourceType> featureResourceTypes;
|
||||
|
||||
/**
|
||||
* 新旧权限点,needPermissionRelation = true时最好带上,因为新旧权限点会有冲突的情况发生
|
||||
*/
|
||||
@CriteriaField(ignore = true)
|
||||
private Integer type;
|
||||
|
||||
@CriteriaField(ignore = true)
|
||||
private String terminal;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
|
||||
@ -6,10 +6,12 @@ import cn.axzo.tyr.client.model.req.NavTreeReq;
|
||||
import cn.axzo.tyr.client.model.req.PagePermissionReq;
|
||||
import cn.axzo.tyr.client.model.req.PagePermissionResp;
|
||||
import cn.axzo.tyr.client.model.req.PermissionCheckReq;
|
||||
import cn.axzo.tyr.client.model.req.TreePermissionReq;
|
||||
import cn.axzo.tyr.client.model.req.TreeProductFeatureResourceReq;
|
||||
import cn.axzo.tyr.client.model.res.FeatureResourceDTO;
|
||||
import cn.axzo.tyr.client.model.res.NavTreeResp;
|
||||
import cn.axzo.tyr.client.model.res.ProductFeatureResourceResp;
|
||||
import cn.axzo.tyr.client.model.res.TreePermissionResp;
|
||||
import cn.axzo.tyr.server.service.PermissionQueryService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -55,4 +57,9 @@ public class PermissionQueryController implements PermissionQueryApi {
|
||||
public ApiResult<List<FeatureResourceDTO>> listFeatureResource(TreeProductFeatureResourceReq request) {
|
||||
return ApiResult.ok(permissionService.listFeatureResource(request));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<List<TreePermissionResp>> treePermission(TreePermissionReq req) {
|
||||
return ApiResult.ok(permissionService.treePermission(req));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package cn.axzo.tyr.server.repository.entity;
|
||||
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
|
||||
@ -24,4 +25,14 @@ public class ProductFeatureQuery {
|
||||
private Integer workspaceJoinType;
|
||||
|
||||
private Set<Long> featureIds;
|
||||
|
||||
/**
|
||||
* 菜单资源数节点类型
|
||||
*/
|
||||
private List<FeatureResourceType> featureResourceTypes;
|
||||
|
||||
/**
|
||||
* 区分新老菜单资源树
|
||||
*/
|
||||
private Integer type;
|
||||
}
|
||||
|
||||
@ -33,6 +33,16 @@ public class SaasFeatureResource extends BaseEntity<SaasFeature> {
|
||||
*/
|
||||
public static final Long DEFAULT_WORKSPACE_TYPE = 0L;
|
||||
|
||||
/**
|
||||
* 显示状态
|
||||
*/
|
||||
public static final Integer DISPLAY_STATUS = 1;
|
||||
|
||||
/**
|
||||
* 隐藏状态
|
||||
*/
|
||||
public static final Integer HIDE_STATUS = 0;
|
||||
|
||||
|
||||
/**
|
||||
* 资源编码-权限码
|
||||
|
||||
@ -65,6 +65,11 @@ public class SaasPgroupPermissionRelation extends BaseEntity<SaasPgroupPermissio
|
||||
*/
|
||||
private Integer featureType;
|
||||
|
||||
/**
|
||||
* featureId所在端
|
||||
*/
|
||||
private String terminal;
|
||||
|
||||
/**
|
||||
* 获取主键值
|
||||
*
|
||||
|
||||
@ -58,7 +58,6 @@ public class SaasProductModuleFeatureRelation extends BaseEntity<SaasProductModu
|
||||
*/
|
||||
private String terminal;
|
||||
|
||||
|
||||
/**
|
||||
* 获取主键值
|
||||
*
|
||||
|
||||
@ -4,10 +4,12 @@ import cn.axzo.tyr.client.model.req.NavTreeReq;
|
||||
import cn.axzo.tyr.client.model.req.PagePermissionReq;
|
||||
import cn.axzo.tyr.client.model.req.PagePermissionResp;
|
||||
import cn.axzo.tyr.client.model.req.PermissionCheckReq;
|
||||
import cn.axzo.tyr.client.model.req.TreePermissionReq;
|
||||
import cn.axzo.tyr.client.model.req.TreeProductFeatureResourceReq;
|
||||
import cn.axzo.tyr.client.model.res.FeatureResourceDTO;
|
||||
import cn.axzo.tyr.client.model.res.NavTreeResp;
|
||||
import cn.axzo.tyr.client.model.res.ProductFeatureResourceResp;
|
||||
import cn.axzo.tyr.client.model.res.TreePermissionResp;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
|
||||
|
||||
import java.util.List;
|
||||
@ -22,6 +24,7 @@ import java.util.List;
|
||||
public interface PermissionQueryService {
|
||||
|
||||
/** 获取导航菜单页面 **/
|
||||
@Deprecated
|
||||
List<NavTreeResp> getNavTree(NavTreeReq req);
|
||||
|
||||
boolean hasPermission(PermissionCheckReq req);
|
||||
@ -41,4 +44,11 @@ public interface PermissionQueryService {
|
||||
* @return
|
||||
*/
|
||||
List<FeatureResourceDTO> listFeatureResource(TreeProductFeatureResourceReq request);
|
||||
|
||||
/**
|
||||
* 查询人的权限点树
|
||||
* @param req
|
||||
* @return
|
||||
*/
|
||||
List<TreePermissionResp> treePermission(TreePermissionReq req);
|
||||
}
|
||||
|
||||
@ -4,12 +4,12 @@ import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
|
||||
import cn.axzo.foundation.dao.support.wrapper.Operator;
|
||||
import cn.axzo.foundation.page.IPageReq;
|
||||
import cn.axzo.framework.domain.page.PageResp;
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
|
||||
import cn.axzo.tyr.client.model.enums.IdentityType;
|
||||
import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq;
|
||||
import cn.axzo.tyr.client.model.req.FeatureRoleRelationReq;
|
||||
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.req.RoleWithUserQueryReq;
|
||||
import cn.axzo.tyr.client.model.res.FeatureRoleRelationResp;
|
||||
@ -28,8 +28,6 @@ import cn.axzo.tyr.server.model.RoleWithFeature;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasFeature;
|
||||
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;
|
||||
@ -67,17 +65,6 @@ public interface RoleService extends IService<SaasRole> {
|
||||
|
||||
List<SaasRoleWithUser> listRoleUserByPermissionGroup(List<Long> permissionGroupIdList, Set<Long> workspaceIds);
|
||||
|
||||
|
||||
/**
|
||||
* * 过滤角色的按钮权限
|
||||
* * 1.分组上的适用单位类型过滤
|
||||
* * 2.角色的例外过滤
|
||||
* @param role
|
||||
* @param userRoleInfoMap
|
||||
* @return 按钮级别权限点ID
|
||||
*/
|
||||
Set<Long> filterPermissionPoint(Set<SaasRoleVO> role, TyrSaasAuthServiceImpl.OUWRoleInfo userRoleInfoMap);
|
||||
|
||||
/**
|
||||
* 通过角色名字获取角色信息
|
||||
* @param req
|
||||
@ -88,17 +75,6 @@ public interface RoleService extends IService<SaasRole> {
|
||||
/** 分页查询角色含用户 **/
|
||||
PageResp<RoleWithUserRes> queryRoleWithUser(RoleWithUserQueryReq req);
|
||||
|
||||
/**
|
||||
* 通过角色类型获取角色
|
||||
* @param req
|
||||
* @param roleTypes
|
||||
* @return
|
||||
*/
|
||||
List<SaasRoleVO> queryRoleByRoleTypes(QueryByIdentityIdTypeReq req, List<String> roleTypes);
|
||||
|
||||
List<SaasRole> listForOUWorkspace(Long ouId, Long workspaceId, Integer workspaceJoinType);
|
||||
|
||||
|
||||
List<SaasRoleAndGroupVO> queryInitRoleByWorkspaceId(String workspaceType);
|
||||
|
||||
/**
|
||||
@ -187,6 +163,27 @@ public interface RoleService extends IService<SaasRole> {
|
||||
*/
|
||||
@CriteriaField(ignore = true)
|
||||
private List<Long> featureIds;
|
||||
|
||||
@CriteriaField(ignore = true)
|
||||
private Boolean needPermissionRelation;
|
||||
|
||||
/**
|
||||
* 查询菜单树节点类型
|
||||
*/
|
||||
@CriteriaField(ignore = true)
|
||||
private List<FeatureResourceType> featureResourceTypes;
|
||||
|
||||
/**
|
||||
* 新旧权限点,needPermissionRelation = true时最好带上,因为新旧权限点会有冲突的情况发生
|
||||
*/
|
||||
@CriteriaField(ignore = true)
|
||||
private Integer type;
|
||||
|
||||
/**
|
||||
* 端,查询权限点时,会根据端过滤,增加效率,目前只有CMS端的新版本才冗余了端
|
||||
*/
|
||||
@CriteriaField(ignore = true)
|
||||
private String terminal;
|
||||
}
|
||||
|
||||
@SuperBuilder
|
||||
|
||||
@ -1,12 +1,14 @@
|
||||
package cn.axzo.tyr.server.service;
|
||||
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq;
|
||||
import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq;
|
||||
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
|
||||
import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode;
|
||||
import cn.axzo.tyr.server.model.ResourcePermission;
|
||||
import cn.axzo.tyr.server.model.ResourcePermissionQueryDTO;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
|
||||
import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq;
|
||||
import io.swagger.models.auth.In;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
@ -18,15 +20,12 @@ import java.util.Set;
|
||||
* @author: ZhanSiHu
|
||||
* @date: 2024/4/3 10:17
|
||||
*/
|
||||
public interface SaasFeatureResourceService {
|
||||
public interface SaasFeatureResourceService extends IService<SaasFeatureResource> {
|
||||
|
||||
Long saveOrUpdateMenu(FeatureResourceTreeSaveReq req);
|
||||
|
||||
void updateFeatureAuthType(Long featureId, Integer authType);
|
||||
|
||||
/**递归的**/
|
||||
List<SaasFeatureResource> listDescendant(Long featureId);
|
||||
|
||||
/**递归的**/
|
||||
List<SaasFeatureResource> batchListDescendant(List<Long> featureIds);
|
||||
|
||||
@ -34,9 +33,6 @@ public interface SaasFeatureResourceService {
|
||||
|
||||
FeatureResourceTreeNode getTreeFeatureDescendant(Long featureId, Integer featureType);
|
||||
|
||||
/**删除指定菜单**/
|
||||
void deleteMenuFeature(Long featureId, Long operatorId);
|
||||
|
||||
/**菜单重排序**/
|
||||
void reorderMenuFeature(Long featureId, Integer offset);
|
||||
|
||||
@ -53,7 +49,9 @@ public interface SaasFeatureResourceService {
|
||||
|
||||
Set<Long> listAuthFree();
|
||||
|
||||
List<SaasFeatureResource> listNavMenu(String terminal);
|
||||
|
||||
List<SaasFeatureResource> listByParentIdAndTerminalAndIds(Long parentId, String terminal, List<Long> featureIds);
|
||||
|
||||
List<SaasFeatureResource> list(PageSaasFeatureResourceReq param);
|
||||
|
||||
PageResp<SaasFeatureResource> page(PageSaasFeatureResourceReq param);
|
||||
}
|
||||
|
||||
@ -16,6 +16,8 @@ public interface SaasPgroupPermissionRelationService extends IService<SaasPgroup
|
||||
|
||||
PageResp<SaasPgroupPermissionRelation> page(PagePgroupPermissionRelationReq param);
|
||||
|
||||
List<SaasPgroupPermissionRelation> list(PagePgroupPermissionRelationReq param);
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
|
||||
@ -0,0 +1,62 @@
|
||||
package cn.axzo.tyr.server.service;
|
||||
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public interface WorkspaceProductService {
|
||||
|
||||
|
||||
List<WorkspaceProduct> listWorkspaceProduct(WorkspaceProductParam param);
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
class WorkspaceProductParam {
|
||||
/**
|
||||
* 端
|
||||
*/
|
||||
private String terminal;
|
||||
|
||||
/**
|
||||
* 项目id
|
||||
*/
|
||||
private Set<Long> workspaceIds;
|
||||
|
||||
/**
|
||||
* 查询菜单树节点类型
|
||||
*/
|
||||
private List<FeatureResourceType> featureResourceTypes;
|
||||
|
||||
/**
|
||||
* 区分新老菜单资源树
|
||||
*/
|
||||
private Integer type;
|
||||
}
|
||||
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
class WorkspaceProduct {
|
||||
|
||||
/**
|
||||
* 项目id
|
||||
*/
|
||||
private Long workspaceId;
|
||||
|
||||
/**
|
||||
* 产品资源树关系
|
||||
*/
|
||||
private List<SaasProductModuleFeatureRelation> saasProductModuleFeatureRelations;
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,6 +11,7 @@ import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
|
||||
import cn.axzo.thrones.client.saas.ServicePkgClient;
|
||||
import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct;
|
||||
import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes;
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType;
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
|
||||
import cn.axzo.tyr.client.common.enums.RoleTypeEnum;
|
||||
import cn.axzo.tyr.client.model.base.WorkspaceOUPair;
|
||||
@ -20,12 +21,18 @@ import cn.axzo.tyr.client.model.req.IdentityAuthReq;
|
||||
import cn.axzo.tyr.client.model.req.NavTreeReq;
|
||||
import cn.axzo.tyr.client.model.req.PagePermissionReq;
|
||||
import cn.axzo.tyr.client.model.req.PagePermissionResp;
|
||||
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
|
||||
import cn.axzo.tyr.client.model.req.PermissionCheckReq;
|
||||
import cn.axzo.tyr.client.model.req.TreePermissionReq;
|
||||
import cn.axzo.tyr.client.model.req.TreeProductFeatureResourceReq;
|
||||
import cn.axzo.tyr.client.model.res.FeatureResourceDTO;
|
||||
import cn.axzo.tyr.client.model.res.IdentityAuthRes;
|
||||
import cn.axzo.tyr.client.model.res.NavTreeResp;
|
||||
import cn.axzo.tyr.client.model.res.ProductFeatureResourceResp;
|
||||
import cn.axzo.tyr.client.model.res.SaasPermissionRelationRes;
|
||||
import cn.axzo.tyr.client.model.res.TreePermissionResp;
|
||||
import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO;
|
||||
import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam;
|
||||
import cn.axzo.tyr.server.model.PermissionDO;
|
||||
import cn.axzo.tyr.server.model.PermissionQueryContext;
|
||||
import cn.axzo.tyr.server.model.ResourcePermission;
|
||||
@ -35,20 +42,28 @@ import cn.axzo.tyr.server.model.UserIdentity;
|
||||
import cn.axzo.tyr.server.model.WorkspaceFeatureRelation;
|
||||
import cn.axzo.tyr.server.repository.dao.ProductModuleDao;
|
||||
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
|
||||
import cn.axzo.tyr.server.repository.dao.SaasPageElementFeatureResourceRelationDao;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation;
|
||||
import cn.axzo.tyr.server.service.PermissionQueryService;
|
||||
import cn.axzo.tyr.server.service.ProductFeatureRelationService;
|
||||
import cn.axzo.tyr.server.service.RoleService;
|
||||
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
|
||||
import cn.axzo.tyr.server.service.SaasRoleUserRelationService;
|
||||
import cn.axzo.tyr.server.service.TyrSaasAuthService;
|
||||
import cn.axzo.tyr.server.service.WorkspaceProductService;
|
||||
import cn.axzo.tyr.server.util.KeyUtil;
|
||||
import cn.axzo.tyr.server.utils.RpcInternalUtil;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
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.BooleanUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
@ -56,6 +71,7 @@ import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
@ -63,10 +79,14 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.tyr.server.repository.entity.SaasFeatureResource.DISPLAY_STATUS;
|
||||
import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE;
|
||||
|
||||
/**
|
||||
* 权限查询服务实现
|
||||
*
|
||||
@ -88,6 +108,10 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
|
||||
private final ProductModuleDao productModuleDao;
|
||||
private final ProductFeatureRelationService productFeatureRelationService;
|
||||
private final SaasFeatureResourceDao saasFeatureResourceDao;
|
||||
private final SaasFeatureResourceService saasFeatureResourceService;
|
||||
private final SaasRoleUserRelationService saasRoleUserRelationService;
|
||||
private final WorkspaceProductService workspaceProductService;
|
||||
private final SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao;
|
||||
|
||||
@Value("${use.old.auth:true}")
|
||||
private boolean USE_OLD_AUTH;
|
||||
@ -103,7 +127,6 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
|
||||
|
||||
//查询权限
|
||||
List<PermissionDO> permissions = queryUserPermission(context);
|
||||
// List<PermissionDO> permissions = queryAllPermission(context);
|
||||
if (CollectionUtil.isEmpty(permissions)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
@ -204,7 +227,6 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
|
||||
.appendPersonId(req.getPersonId());
|
||||
//查询权限
|
||||
List<PermissionDO> permissions = queryUserPermission(context);
|
||||
// List<PermissionDO> permissions = queryAllPermission(context);
|
||||
Set<Long> featureIds = permissions.stream().map(PermissionDO::getFeatureIds).flatMap(Set::stream).collect(Collectors.toSet());
|
||||
//权限过滤
|
||||
return resourceList.stream()
|
||||
@ -252,6 +274,61 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TreePermissionResp> treePermission(TreePermissionReq req) {
|
||||
|
||||
Set<Long> featureIds = listUserPermissionFeatureIds(req);
|
||||
|
||||
if (CollectionUtils.isEmpty(featureIds)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<SaasFeatureResource> saasFeatureResources = saasFeatureResourceService.list(PageSaasFeatureResourceReq.builder()
|
||||
.ids(Lists.newArrayList(featureIds))
|
||||
.terminal(req.getTerminal())
|
||||
.sort(Lists.newArrayList("displayOrder__ASC"))
|
||||
.build());
|
||||
// 有可能存在资源树被删除的情况
|
||||
if (CollectionUtils.isEmpty(saasFeatureResources)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
Map<String, Set<String>> featureCodes = listFeatureCodes(saasFeatureResources, req);
|
||||
|
||||
List<TreePermissionResp> treePermissionResps = saasFeatureResources.stream()
|
||||
.map(e -> TreePermissionResp.builder()
|
||||
.featureId(e.getId())
|
||||
.featureName(e.getFeatureName())
|
||||
.featureType(e.getFeatureType())
|
||||
.redirectType(e.getRedirectType())
|
||||
.linkUrl(e.getLinkUrl())
|
||||
.icon(e.getIcon())
|
||||
.parentId(e.getParentId())
|
||||
.status(e.getStatus())
|
||||
.uniCode(e.getUniCode())
|
||||
.featureCodes(featureCodes.get(e.getUniCode()))
|
||||
.build())
|
||||
.collect(Collectors.toList());
|
||||
// 组装导航树
|
||||
// 过滤掉隐藏的节点,因为存在某些节点被隐藏,需要把这些节点和子节点给过滤掉
|
||||
return TreeUtil.buildTree(treePermissionResps, (Function<TreePermissionResp, Boolean>) e -> Objects.equals(DISPLAY_STATUS, e.getStatus()));
|
||||
}
|
||||
|
||||
private Map<String, Set<String>> listFeatureCodes(List<SaasFeatureResource> saasFeatureResources,
|
||||
TreePermissionReq req) {
|
||||
|
||||
if (CollectionUtils.isEmpty(saasFeatureResources) || BooleanUtils.isNotTrue(req.isNeedFeatureCodes())) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
|
||||
List<String> uniCodes = saasFeatureResources.stream()
|
||||
.map(SaasFeatureResource::getUniCode)
|
||||
.collect(Collectors.toList());
|
||||
return saasPageElementFeatureResourceRelationDao.listByUniCodeAndTerminal(uniCodes, req.getTerminal()).stream()
|
||||
.collect(Collectors.groupingBy(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode,
|
||||
Collectors.mapping(SaasPageElementFeatureResourceRelation::getPageElementCode, Collectors.toSet())));
|
||||
}
|
||||
|
||||
private List<ProductFeatureRelationVO> getProductFeatureRelationByWorkspace(Set<Long> workspaceIds) {
|
||||
List<ServicePkgDetailRes> servicePkgDetailRes = RpcInternalUtil.rpcListProcessor(() -> servicePkgClient.getServicePkgDetailBySpaceId(workspaceIds),
|
||||
"查询租户的产品", workspaceIds).getData();
|
||||
@ -487,4 +564,112 @@ public class PermissionQueryServiceImpl implements PermissionQueryService {
|
||||
}
|
||||
return relations;
|
||||
}
|
||||
|
||||
private Set<Long> listUserPermissionFeatureIds(TreePermissionReq treePermissionReq) {
|
||||
|
||||
List<ListRoleUserRelationParam.WorkspaceOuPair> workspaceOuPairs = treePermissionReq.getWorkspaceOUPairs().stream()
|
||||
.map(e -> ListRoleUserRelationParam.WorkspaceOuPair.builder()
|
||||
.workspaceId(e.getWorkspaceId())
|
||||
.ouId(e.getOuId())
|
||||
.build())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
ListRoleUserRelationParam listRoleUserRelationParam = ListRoleUserRelationParam.builder()
|
||||
.personId(treePermissionReq.getPersonId())
|
||||
.workspaceOuPairs(Lists.newArrayList(workspaceOuPairs))
|
||||
.needRole(true)
|
||||
.needPermissionRelation(true)
|
||||
.featureResourceTypes(treePermissionReq.getFeatureResourceTypes())
|
||||
.type(NEW_FEATURE)
|
||||
.terminal(treePermissionReq.getTerminal())
|
||||
.build();
|
||||
List<SaasRoleUserV2DTO> saasRoleUserV2DTOS = saasRoleUserRelationService.listV2(listRoleUserRelationParam).stream()
|
||||
.filter(e -> e.getSaasRole() != null && CollectionUtils.isNotEmpty(e.getSaasRole().getPermissionRelations()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (CollectionUtil.isEmpty(saasRoleUserV2DTOS)) {
|
||||
log.warn("no user role relation found");
|
||||
return Collections.emptySet();
|
||||
}
|
||||
//查询租户产品权限点
|
||||
Set<Long> workspaceIds = treePermissionReq.getWorkspaceOUPairs().stream()
|
||||
.map(WorkspaceOUPair::getWorkspaceId)
|
||||
.collect(Collectors.toSet());
|
||||
WorkspaceProductService.WorkspaceProductParam workspaceProductParam = WorkspaceProductService.WorkspaceProductParam.builder()
|
||||
.terminal(treePermissionReq.getTerminal())
|
||||
.workspaceIds(workspaceIds)
|
||||
.featureResourceTypes(treePermissionReq.getFeatureResourceTypes())
|
||||
.build();
|
||||
List<WorkspaceProductService.WorkspaceProduct> workspaceProducts = workspaceProductService.listWorkspaceProduct(workspaceProductParam);
|
||||
|
||||
//免授权
|
||||
PageSaasFeatureResourceReq pageSaasFeatureResourceReq = PageSaasFeatureResourceReq.builder()
|
||||
.terminal(treePermissionReq.getTerminal())
|
||||
.authType(FeatureResourceAuthType.ALL_ROLE.getCode())
|
||||
.build();
|
||||
List<Long> authFreeFeatureIds = featureResourceService.list(pageSaasFeatureResourceReq).stream()
|
||||
.map(SaasFeatureResource::getId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
//取交集确定权限
|
||||
return mixFeatureIds(saasRoleUserV2DTOS, workspaceProducts, authFreeFeatureIds);
|
||||
}
|
||||
|
||||
private Set<Long> mixFeatureIds(List<SaasRoleUserV2DTO> saasRoleUsers,
|
||||
List<WorkspaceProductService.WorkspaceProduct> workspaceProducts,
|
||||
List<Long> authFreeFeatureIds) {
|
||||
|
||||
Map<Long, WorkspaceProductService.WorkspaceProduct> workspaceProductMap = workspaceProducts.stream()
|
||||
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProduct::getWorkspaceId, Function.identity()));
|
||||
|
||||
return saasRoleUsers.stream()
|
||||
.filter(roleUser -> {
|
||||
WorkspaceProductService.WorkspaceProduct workspaceProduct = workspaceProductMap.get(roleUser.getSaasRoleUser().getWorkspaceId());
|
||||
if (workspaceProduct == null || CollectionUtils.isEmpty(workspaceProduct.getSaasProductModuleFeatureRelations())) {
|
||||
log.warn("no workspace product feature found for id:{}", roleUser.getSaasRoleUser().getWorkspaceId());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
})
|
||||
.map(roleUser -> {
|
||||
WorkspaceProductService.WorkspaceProduct workspaceProduct = workspaceProductMap.get(roleUser.getSaasRoleUser().getWorkspaceId());
|
||||
|
||||
SaasRoleUserV2DTO.SaasRole saasRole = roleUser.getSaasRole();
|
||||
if (RoleTypeEnum.isAdmin(saasRole.getRoleType())) {
|
||||
return resolveAdminRole(workspaceProduct, saasRole);
|
||||
}
|
||||
return resolveNormalRole(workspaceProduct, saasRole, authFreeFeatureIds);
|
||||
})
|
||||
.flatMap(Collection::stream)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
private List<Long> resolveAdminRole(WorkspaceProductService.WorkspaceProduct workspaceProduct,
|
||||
SaasRoleUserV2DTO.SaasRole saasRole) {
|
||||
|
||||
//超管和管理员 直接取和角色类型匹配的租户产品权限
|
||||
return workspaceProduct.getSaasProductModuleFeatureRelations().stream()
|
||||
.filter(f -> Objects.equals(f.getDictCode(), saasRole.getProductUnitType().toString())
|
||||
|| !NumberUtil.isPositiveNumber(saasRole.getProductUnitType()))
|
||||
.map(SaasProductModuleFeatureRelation::getFeatureId)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private List<Long> resolveNormalRole(WorkspaceProductService.WorkspaceProduct workspaceProduct,
|
||||
SaasRoleUserV2DTO.SaasRole saasRole,
|
||||
List<Long> authFreeFeatureIds) {
|
||||
//普通角色:角色同类型的租户产品权限已分配 且角色上已分配 + 免授权
|
||||
Set<Long> roleFeatureIds = Optional.ofNullable(saasRole.getPermissionRelations())
|
||||
.map(e -> e.stream()
|
||||
.map(SaasPermissionRelationRes::getFeatureId)
|
||||
.collect(Collectors.toSet()))
|
||||
.orElseGet(Collections::emptySet);
|
||||
|
||||
return workspaceProduct.getSaasProductModuleFeatureRelations().stream()
|
||||
.filter(f -> Objects.equals(f.getDictCode(), saasRole.getProductUnitType().toString())
|
||||
|| !NumberUtil.isPositiveNumber(saasRole.getProductUnitType()))
|
||||
.map(SaasProductModuleFeatureRelation::getFeatureId)
|
||||
.filter(id -> roleFeatureIds.contains(id) || authFreeFeatureIds.contains(id))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,33 +1,30 @@
|
||||
package cn.axzo.tyr.server.service.impl;
|
||||
|
||||
import cn.axzo.basics.common.BeanMapper;
|
||||
import cn.axzo.basics.common.util.AssertUtil;
|
||||
import cn.axzo.framework.auth.domain.TerminalInfo;
|
||||
import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
|
||||
import cn.axzo.thrones.client.saas.ServicePkgClient;
|
||||
import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct;
|
||||
import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes;
|
||||
import cn.axzo.tyr.client.common.enums.ProductModuleFeatureRelationTypeEnum;
|
||||
import cn.axzo.tyr.client.model.permission.PermissionPointTreeNode;
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
|
||||
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.dao.ProductModuleDao;
|
||||
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
|
||||
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
|
||||
import cn.axzo.tyr.server.repository.dao.SaasProductModuleFeatureRelationDao;
|
||||
import cn.axzo.tyr.server.repository.entity.ProductFeatureQuery;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasFeature;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation;
|
||||
import cn.axzo.tyr.server.repository.dao.SaasProductModuleFeatureRelationDao;
|
||||
import cn.axzo.tyr.server.service.ProductFeatureRelationService;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import cn.hutool.core.date.StopWatch;
|
||||
import cn.hutool.core.stream.SimpleCollector;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -36,21 +33,16 @@ import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.BinaryOperator;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE;
|
||||
import static cn.axzo.tyr.server.util.RpcInternalUtil.checkAndGetData;
|
||||
|
||||
/**
|
||||
@ -224,7 +216,20 @@ public class ProductFeatureRelationServiceImpl implements ProductFeatureRelation
|
||||
SaasProductModuleFeatureRelation::getProductModuleId, condition.getProductIds())
|
||||
.eq(Objects.nonNull(condition.getWorkspaceJoinType()),
|
||||
SaasProductModuleFeatureRelation::getDictCode, condition.getWorkspaceJoinType())
|
||||
.in(CollectionUtil.isNotEmpty(condition.getFeatureIds()), SaasProductModuleFeatureRelation::getFeatureId, condition.getFeatureIds());
|
||||
.in(CollectionUtil.isNotEmpty(condition.getFeatureIds()), SaasProductModuleFeatureRelation::getFeatureId, condition.getFeatureIds())
|
||||
.eq(Objects.nonNull(condition.getType()), SaasProductModuleFeatureRelation::getType, condition.getType());
|
||||
if (!CollectionUtils.isEmpty(condition.getFeatureResourceTypes())) {
|
||||
wrapper.in(SaasProductModuleFeatureRelation::getFeatureType, Lists.transform(condition.getFeatureResourceTypes(), FeatureResourceType::getCode));
|
||||
}
|
||||
|
||||
// 目前只有新版本的CMS端产品配置时才冗余了terminal
|
||||
if (Objects.equals(NEW_FEATURE, condition.getType()) && StringUtils.hasLength(condition.getTerminal())) {
|
||||
TerminalInfo terminalInfo = new TerminalInfo(condition.getTerminal());
|
||||
if (terminalInfo.isCMS()) {
|
||||
wrapper.eq(SaasProductModuleFeatureRelation::getTerminal, condition.getTerminal());
|
||||
}
|
||||
}
|
||||
|
||||
return this.saasProductModuleFeatureRelationDao.list(wrapper);
|
||||
}
|
||||
|
||||
|
||||
@ -10,9 +10,9 @@ import cn.axzo.tyr.client.common.enums.RoleResourceTypeEnum;
|
||||
import cn.axzo.tyr.client.common.enums.RoleTypeEnum;
|
||||
import cn.axzo.tyr.client.model.enums.IdentityType;
|
||||
import cn.axzo.tyr.client.model.enums.PermissionGroupType;
|
||||
import cn.axzo.tyr.client.model.permission.PermissionPointTreeNode;
|
||||
import cn.axzo.tyr.client.model.req.ChangeGroupLeaderRoleReq;
|
||||
import cn.axzo.tyr.client.model.req.FeatureRoleRelationReq;
|
||||
import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq;
|
||||
import cn.axzo.tyr.client.model.req.QueryByIdentityIdTypeReq;
|
||||
import cn.axzo.tyr.client.model.req.QueryRoleByNameReq;
|
||||
import cn.axzo.tyr.client.model.req.QuerySaasPermissionGroupReq;
|
||||
@ -24,6 +24,7 @@ import cn.axzo.tyr.client.model.res.IsSuperAdminRes;
|
||||
import cn.axzo.tyr.client.model.res.QueryBatchByIdentityIdTypeRes;
|
||||
import cn.axzo.tyr.client.model.res.QueryRoleByNameResp;
|
||||
import cn.axzo.tyr.client.model.res.RoleWithUserRes;
|
||||
import cn.axzo.tyr.client.model.res.SaasPermissionRelationRes;
|
||||
import cn.axzo.tyr.client.model.res.SaasPermissionRes;
|
||||
import cn.axzo.tyr.client.model.res.SaasRoleGroupRes;
|
||||
import cn.axzo.tyr.client.model.res.SaasRoleRes;
|
||||
@ -34,7 +35,6 @@ import cn.axzo.tyr.client.model.vo.SaasPermissionGroupVO;
|
||||
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.ResourcePermission;
|
||||
@ -102,7 +102,6 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
@ -722,36 +721,6 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
|
||||
.list();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Long> filterPermissionPoint(Set<SaasRoleVO> role, TyrSaasAuthServiceImpl.OUWRoleInfo userRoleInfoMap) {
|
||||
// 按钮级别权限点ID
|
||||
Set<Long> result = new HashSet<>();
|
||||
if (CollectionUtils.isEmpty(role)) {
|
||||
return result;
|
||||
}
|
||||
Set<Long> initRoleId = new HashSet<>();
|
||||
//有标准角,查询角色分组
|
||||
if (role.stream().anyMatch(r -> Objects.equals(RoleTypeEnum.INIT.getValue(), r.getRoleType()))) {
|
||||
List<SaasRoleGroupVO> roleGroupList = saasRoleGroupService.getList(QuerySaasRoleGroupReq.builder()
|
||||
.workspaceTypeCode(Collections.singletonList(userRoleInfoMap.getWorkspaceType().toString()))
|
||||
// .ouTypeCode(Collections.singletonList(userRoleInfoMap.getWorkspaceJoinType().getValue().toString()))
|
||||
.build());
|
||||
initRoleId = roleGroupList.stream().map(SaasRoleGroupVO::getRoleIds).filter(CollectionUtil::isNotEmpty).flatMap(List::stream).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
Set<Long> finalInitRoleId = initRoleId;
|
||||
List<SaasRoleVO> resultRole = role.stream().filter(r ->
|
||||
Objects.equals(r.getRoleType(), RoleTypeEnum.COMMON.getValue())
|
||||
|| finalInitRoleId.contains(r.getId()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return resultRole.stream().map(
|
||||
e -> e.getMatchFeature(userRoleInfoMap.workspaceId, userRoleInfoMap.getOuId()))
|
||||
.flatMap(List::stream)
|
||||
.map(PermissionPointTreeNode::getPermissionPointId)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResp<RoleWithUserRes> queryRoleWithUser(RoleWithUserQueryReq req) {
|
||||
page2Default(req);
|
||||
@ -810,25 +779,6 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaasRoleVO> queryRoleByRoleTypes(QueryByIdentityIdTypeReq req, List<String> roleTypes) {
|
||||
List<Long> roleIds = roleUserRelationDao.query(req.getIdentityId(), req.getIdentityType(),
|
||||
req.getWorkspaceId(), req.getOuId()).stream().map(SaasRoleUserRelation::getRoleId).collect(Collectors.toList());
|
||||
List<SaasRole> list = new ArrayList<>();
|
||||
if (CollectionUtils.isNotEmpty(roleIds)) {
|
||||
list = saasRoleDao.lambdaQuery()
|
||||
.in(BaseEntity::getId, roleIds)
|
||||
.in(SaasRole::getRoleType, roleTypes)
|
||||
.list();
|
||||
}
|
||||
return BeanUtil.copyToList(list, SaasRoleVO.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaasRole> listForOUWorkspace(Long ouId, Long workspaceId, Integer workspaceJoinType) {
|
||||
return saasRoleDao.listForOUWorkspace(ouId, workspaceId, workspaceJoinType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<QueryRoleByNameResp> findRoleByName(QueryRoleByNameReq req) {
|
||||
// TODO jhy 这个方法有问题
|
||||
@ -1203,21 +1153,26 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
|
||||
|
||||
Map<Long, List<SaasRoleUserV2DTO.SaasRoleUser>> saasRoleUsers = listSaasRoleUser(param, page.getRecords());
|
||||
|
||||
Map<Long, List<SaasPermissionRelationRes>> permissionRelations = listRolePermissionRelations(param, page.getRecords());
|
||||
|
||||
return PageConverter.toResp(page, (record) -> from(record,
|
||||
saasRoleGroups,
|
||||
BooleanUtils.isTrue(param.getNeedPermissionOld()) ? saasPermissionsOld : saasPermissions,
|
||||
saasRoleUsers));
|
||||
saasRoleUsers,
|
||||
permissionRelations));
|
||||
}
|
||||
|
||||
private SaasRoleRes from(SaasRole saasRole,
|
||||
Map<Long, List<SaasRoleGroupRes>> saasRoleGroups,
|
||||
Map<Long, List<SaasPermissionRes>> saasPermissions,
|
||||
Map<Long, List<SaasRoleUserV2DTO.SaasRoleUser>> saasRoleUsers) {
|
||||
Map<Long, List<SaasRoleUserV2DTO.SaasRoleUser>> saasRoleUsers,
|
||||
Map<Long, List<SaasPermissionRelationRes>> permissionRelations) {
|
||||
SaasRoleRes saasRoleRes = SaasRoleRes.builder().build();
|
||||
BeanUtils.copyProperties(saasRole, saasRoleRes);
|
||||
saasRoleRes.setSaasRoleGroups(saasRoleGroups.get(saasRoleRes.getId()));
|
||||
saasRoleRes.setSaasPermissions(saasPermissions.get(saasRoleRes.getId()));
|
||||
saasRoleRes.setSaasRoleUsers(saasRoleUsers.get(saasRoleRes.getId()));
|
||||
saasRoleRes.setPermissionRelations(permissionRelations.get(saasRoleRes.getId()));
|
||||
return saasRoleRes;
|
||||
}
|
||||
|
||||
@ -1496,4 +1451,90 @@ public class RoleServiceImpl extends ServiceImpl<SaasRoleMapper, SaasRole>
|
||||
Collectors.toList())));
|
||||
}
|
||||
|
||||
private Map<Long, List<SaasPermissionRelationRes>> listRolePermissionRelations(PageSaasRoleParam param,
|
||||
List<SaasRole> saasRoles) {
|
||||
if (CollectionUtils.isEmpty(saasRoles) || BooleanUtils.isNotTrue(param.getNeedPermissionRelation())) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
|
||||
List<SaasPgroupRoleRelation> saasPgroupRoleRelations = saasPgroupRoleRelationDao.findByRoleIds(Lists.transform(saasRoles, SaasRole::getId));
|
||||
|
||||
if (CollectionUtils.isEmpty(saasPgroupRoleRelations)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
|
||||
PagePgroupPermissionRelationReq pagePgroupPermissionRelationReq = PagePgroupPermissionRelationReq.builder()
|
||||
.groupIds(Lists.transform(saasPgroupRoleRelations, SaasPgroupRoleRelation::getGroupId))
|
||||
.featureIds(param.getFeatureIds())
|
||||
.featureResourceTypes(param.getFeatureResourceTypes())
|
||||
.type(param.getType())
|
||||
.terminal(param.getTerminal())
|
||||
.build();
|
||||
List<SaasPgroupPermissionRelation> saasPgroupPermissionRelations = saasPgroupPermissionRelationService.list(pagePgroupPermissionRelationReq);
|
||||
|
||||
Map<Long, List<SaasPgroupPermissionRelation>> pgroupPermissions = saasPgroupPermissionRelations.stream()
|
||||
.collect(Collectors.groupingBy(SaasPgroupPermissionRelation::getGroupId));
|
||||
|
||||
return saasPgroupRoleRelations.stream()
|
||||
.map(e -> {
|
||||
List<SaasPgroupPermissionRelation> permissionRelations = pgroupPermissions.get(e.getGroupId());
|
||||
if (CollectionUtils.isEmpty(permissionRelations)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return permissionRelations.stream()
|
||||
.map(permissionRelation -> SaasPermissionRelationWrapper.from(e, permissionRelation))
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
})
|
||||
.filter(Objects::nonNull)
|
||||
.flatMap(Collection::stream)
|
||||
.collect(Collectors.groupingBy(SaasPermissionRelationWrapper::getRoleId,
|
||||
Collectors.mapping(e -> SaasPermissionRelationRes.builder()
|
||||
.featureId(e.getFeatureId())
|
||||
.type(e.getType())
|
||||
.featureType(e.getFeatureType())
|
||||
.build(),
|
||||
Collectors.toList())));
|
||||
}
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
static class SaasPermissionRelationWrapper {
|
||||
|
||||
/**
|
||||
* 角色id
|
||||
*/
|
||||
private Long roleId;
|
||||
|
||||
/**
|
||||
* 菜单资源树节点id
|
||||
*/
|
||||
private Long featureId;
|
||||
|
||||
/**
|
||||
* 新旧菜单资源数标识
|
||||
*/
|
||||
private Integer type;
|
||||
|
||||
/**
|
||||
* 菜单资源树节点类型
|
||||
*/
|
||||
private Integer featureType;
|
||||
|
||||
public static SaasPermissionRelationWrapper from(SaasPgroupRoleRelation saasPgroupRoleRelation,
|
||||
SaasPgroupPermissionRelation permissionRelation) {
|
||||
if (permissionRelation == null) {
|
||||
return null;
|
||||
}
|
||||
return SaasPermissionRelationWrapper.builder()
|
||||
.roleId(saasPgroupRoleRelation.getRoleId())
|
||||
.featureId(permissionRelation.getFeatureId())
|
||||
.type(permissionRelation.getType())
|
||||
.featureType(permissionRelation.getFeatureType())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,6 +3,9 @@ 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.foundation.dao.support.converter.PageConverter;
|
||||
import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper;
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.framework.domain.web.code.BaseCode;
|
||||
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceAuthType;
|
||||
@ -12,6 +15,7 @@ import cn.axzo.tyr.client.model.req.FeatureComponentSaveReq;
|
||||
import cn.axzo.tyr.client.model.req.FeatureResourceTreeSaveReq;
|
||||
import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq;
|
||||
import cn.axzo.tyr.client.model.req.ModifyPageElementRelationDTO;
|
||||
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
|
||||
import cn.axzo.tyr.client.model.res.FeatureResourceDTO;
|
||||
import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode;
|
||||
import cn.axzo.tyr.client.model.res.PageElementBasicDTO;
|
||||
@ -22,15 +26,16 @@ import cn.axzo.tyr.server.model.convert.SaasFeatureResourceConvert;
|
||||
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
|
||||
import cn.axzo.tyr.server.service.SaasCommonDictService;
|
||||
import cn.axzo.tyr.server.repository.mapper.SaasFeatureResourceMapper;
|
||||
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
|
||||
import cn.axzo.tyr.server.service.SaasPageElementService;
|
||||
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService;
|
||||
import cn.azxo.framework.common.utils.StringUtils;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.nacos.common.utils.UuidUtils;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
@ -41,7 +46,6 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
@ -60,16 +64,13 @@ import static cn.axzo.tyr.server.repository.entity.SaasFeatureResource.DEFAULT_W
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceService {
|
||||
public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResourceMapper, SaasFeatureResource>
|
||||
implements SaasFeatureResourceService {
|
||||
|
||||
/** 功能资源树根节点所有端配置的scope **/
|
||||
private static final String RESOURCE_TERMINAL_SCOPE = "resource.terminal";
|
||||
|
||||
private final SaasFeatureResourceDao featureResourceDao;
|
||||
private final SaasFeatureResourceCacheService saasFeatureResourceCacheService;
|
||||
private final SaasCommonDictService saasCommonDictService;
|
||||
|
||||
private final SaasPgroupPermissionRelationService pgroupPermissionRelationService;
|
||||
private final SaasPageElementService saasPageElementService;
|
||||
|
||||
@Override
|
||||
@ -331,15 +332,6 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic
|
||||
}
|
||||
}
|
||||
|
||||
// 查询resource节点及子节点
|
||||
@Override
|
||||
public List<SaasFeatureResource> listDescendant(Long featureId) {
|
||||
return featureResourceDao.lambdaQuery()
|
||||
.eq(BaseEntity::getIsDelete,0)
|
||||
.apply("FIND_IN_SET('" + featureId + "', path)")
|
||||
.list();
|
||||
}
|
||||
|
||||
// 查询resource节点及子节点
|
||||
@Override
|
||||
public List<SaasFeatureResource> batchListDescendant(List<Long> featureIds) {
|
||||
@ -363,29 +355,6 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic
|
||||
.one();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true)
|
||||
public void deleteMenuFeature(Long featureId, Long operatorId) {
|
||||
|
||||
// if (featureId == null) {
|
||||
// return;
|
||||
// }
|
||||
// List<SaasFeatureResource> featureDescendant = featureResourceDao.lambdaQuery()
|
||||
// .eq(BaseEntity::getIsDelete,0)
|
||||
// .apply("FIND_IN_SET('" + featureId + "', path)")
|
||||
// .list();
|
||||
// List<Long> featureIds = featureDescendant.stream().map(SaasFeatureResource::getId).collect(Collectors.toList());
|
||||
// pgroupPermissionRelationService.deleteByFeatureIds(featureIds);
|
||||
// // 删除自己及自己的子集
|
||||
// featureResourceDao.lambdaUpdate()
|
||||
// .eq(BaseEntity::getIsDelete,0)
|
||||
// .apply("FIND_IN_SET('" + featureId + "', path)")
|
||||
// .set(SaasFeatureResource::getUpdateBy, operatorId)
|
||||
// .set(BaseEntity::getIsDelete,1)
|
||||
// .update();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@CacheEvict(value = SaasFeatureResourceCacheService.CACHE_FEATURE_RESOURCE_TREE,allEntries = true)
|
||||
@ -458,19 +427,6 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic
|
||||
return true;
|
||||
}
|
||||
|
||||
private List<FeatureResourceTreeNode> fillChildren2Root(List<FeatureResourceTreeNode> rootNodes, List<FeatureResourceTreeNode> childrenNodes) {
|
||||
Map<String, FeatureResourceTreeNode> rootNodeMap = rootNodes.stream().collect(Collectors.toMap(FeatureResourceDTO::getTerminal, Function.identity(), (v1, v2) -> v1));
|
||||
for(FeatureResourceTreeNode child : childrenNodes) {
|
||||
FeatureResourceTreeNode rootNode = rootNodeMap.get(child.getTerminal());
|
||||
if (child.getParentId() > 0 || Objects.isNull(rootNode)) {
|
||||
continue;
|
||||
}
|
||||
rootNode.getChildren().add(child);
|
||||
}
|
||||
|
||||
return rootNodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* 菜单/页面/应用/分组,权限码每个端唯一,
|
||||
* 组件权限码不校验唯一
|
||||
@ -509,24 +465,6 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic
|
||||
.list().stream().map(SaasFeatureResource::getId).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaasFeatureResource> listNavMenu(String terminal) {
|
||||
//按需扩展要查询的字段
|
||||
return featureResourceDao.lambdaQuery()
|
||||
.select(SaasFeatureResource::getId,
|
||||
SaasFeatureResource::getParentId,
|
||||
SaasFeatureResource::getFeatureCode,
|
||||
SaasFeatureResource::getFeatureName,
|
||||
SaasFeatureResource::getFeatureType,
|
||||
SaasFeatureResource::getLinkUrl,
|
||||
SaasFeatureResource::getIcon)
|
||||
.eq(SaasFeatureResource::getStatus, FeatureResourceStatus.NORMAL.getCode())
|
||||
.eq(SaasFeatureResource::getFeatureType, FeatureResourceType.MENU.getCode())
|
||||
.eq(SaasFeatureResource::getTerminal, terminal)
|
||||
.orderByAsc(SaasFeatureResource::getDisplayOrder)
|
||||
.list();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaasFeatureResource> listByParentIdAndTerminalAndIds(Long parentId, String terminal, List<Long> featureIds) {
|
||||
return featureResourceDao.lambdaQuery()
|
||||
@ -537,6 +475,25 @@ public class SaasFeatureResourceServiceImpl implements SaasFeatureResourceServic
|
||||
.list();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaasFeatureResource> list(PageSaasFeatureResourceReq param) {
|
||||
return PageConverter.drainAll(pageNumber -> {
|
||||
param.setPage(pageNumber);
|
||||
param.setPageSize(500);
|
||||
return page(param);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResp<SaasFeatureResource> page(PageSaasFeatureResourceReq param) {
|
||||
QueryWrapper<SaasFeatureResource> wrapper = QueryWrapperHelper.fromBean(param, SaasFeatureResource.class);
|
||||
wrapper.eq("is_delete", 0);
|
||||
|
||||
IPage<SaasFeatureResource> page = this.page(PageConverter.toMybatis(param, SaasFeatureResource.class), wrapper);
|
||||
|
||||
return PageConverter.toResp(page, Function.identity());
|
||||
}
|
||||
|
||||
private void fillPageElement2PageFeatureResource(FeatureResourceTreeNode featureResourceTreeNode) {
|
||||
if (!FeatureResourceType.PAGE.getCode().equals(featureResourceTreeNode.getFeatureType())) {
|
||||
return;
|
||||
|
||||
@ -4,6 +4,8 @@ import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum;
|
||||
import cn.axzo.foundation.dao.support.converter.PageConverter;
|
||||
import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper;
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.framework.auth.domain.TerminalInfo;
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
|
||||
import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq;
|
||||
import cn.axzo.tyr.server.repository.dao.SaasPgroupPermissionRelationDao;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
|
||||
@ -12,11 +14,13 @@ import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
@ -25,6 +29,8 @@ import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@ -71,8 +77,29 @@ public class SaasPgroupPermissionRelationServiceImpl
|
||||
QueryWrapper<SaasPgroupPermissionRelation> wrapper = QueryWrapperHelper.fromBean(param, SaasPgroupPermissionRelation.class);
|
||||
wrapper.eq("is_delete", 0);
|
||||
|
||||
if (CollectionUtils.isNotEmpty(param.getFeatureResourceTypes())) {
|
||||
wrapper.in("feature_type", Lists.transform(param.getFeatureResourceTypes(), FeatureResourceType::getCode));
|
||||
}
|
||||
|
||||
// 目前只有新版本的CMS端产品配置时才冗余了terminal
|
||||
if (Objects.equals(NEW_FEATURE, param.getType()) && StringUtils.hasLength(param.getTerminal())) {
|
||||
TerminalInfo terminalInfo = new TerminalInfo(param.getTerminal());
|
||||
if (terminalInfo.isCMS()) {
|
||||
wrapper.eq("terminal", param.getTerminal());
|
||||
}
|
||||
}
|
||||
|
||||
IPage<SaasPgroupPermissionRelation> page = this.page(PageConverter.toMybatis(param, SaasPgroupPermissionRelation.class), wrapper);
|
||||
|
||||
return PageConverter.toResp(page, Function.identity());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaasPgroupPermissionRelation> list(PagePgroupPermissionRelationReq param) {
|
||||
return PageConverter.drainAll(pageNumber -> {
|
||||
param.setPage(pageNumber);
|
||||
param.setPageSize(500);
|
||||
return page(param);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -42,6 +42,7 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -201,9 +202,18 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl<SaasRoleUserRel
|
||||
Map<Long, SaasRoleUserV2DTO.SaasRoleUser> saasRoleUsers,
|
||||
Map<Long, SaasRoleUserV2DTO.SaasRole> saasRoles) {
|
||||
|
||||
SaasRoleUserV2DTO.SaasRoleUser saasRoleUser = SaasRoleUserV2DTO.SaasRoleUser.builder()
|
||||
.ouId(saasRoleUserRelation.getOuId())
|
||||
.workspaceId(saasRoleUserRelation.getWorkspaceId())
|
||||
.personId(saasRoleUserRelation.getNaturalPersonId())
|
||||
.realName(Optional.ofNullable(saasRoleUsers.get(saasRoleUserRelation.getNaturalPersonId()))
|
||||
.map(SaasRoleUserV2DTO.SaasRoleUser::getRealName)
|
||||
.orElse(null))
|
||||
.build();
|
||||
|
||||
return SaasRoleUserV2DTO.builder()
|
||||
.roleId(saasRoleUserRelation.getRoleId())
|
||||
.saasRoleUser(saasRoleUsers.get(saasRoleUserRelation.getNaturalPersonId()))
|
||||
.saasRoleUser(saasRoleUser)
|
||||
.saasRole(saasRoles.get(saasRoleUserRelation.getRoleId()))
|
||||
.build();
|
||||
}
|
||||
@ -223,6 +233,10 @@ public class SaasRoleUserRelationServiceImpl extends ServiceImpl<SaasRoleUserRel
|
||||
.roleIds(roleIds)
|
||||
.needPermissionOld(param.getNeedRolePermissionOld())
|
||||
.featureIds(param.getFeatureIds())
|
||||
.featureResourceTypes(param.getFeatureResourceTypes())
|
||||
.needPermissionRelation(param.getNeedPermissionRelation())
|
||||
.type(param.getType())
|
||||
.terminal(param.getTerminal())
|
||||
.build();
|
||||
return roleService.list(listSaasRoleParam).stream()
|
||||
.map(e -> {
|
||||
|
||||
@ -0,0 +1,106 @@
|
||||
package cn.axzo.tyr.server.service.impl;
|
||||
|
||||
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
|
||||
import cn.axzo.thrones.client.saas.ServicePkgClient;
|
||||
import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct;
|
||||
import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes;
|
||||
import cn.axzo.tyr.server.repository.dao.ProductModuleDao;
|
||||
import cn.axzo.tyr.server.repository.entity.ProductFeatureQuery;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation;
|
||||
import cn.axzo.tyr.server.service.ProductFeatureRelationService;
|
||||
import cn.axzo.tyr.server.service.WorkspaceProductService;
|
||||
import cn.axzo.tyr.server.utils.RpcInternalUtil;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.lang.Pair;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class WorkspaceProductServiceImpl implements WorkspaceProductService {
|
||||
|
||||
@Autowired
|
||||
private ServicePkgClient servicePkgClient;
|
||||
@Autowired
|
||||
private ProductModuleDao productModuleDao;
|
||||
@Autowired
|
||||
private ProductFeatureRelationService productFeatureRelationService;
|
||||
|
||||
@Override
|
||||
public List<WorkspaceProduct> listWorkspaceProduct(WorkspaceProductParam param) {
|
||||
|
||||
if (CollectionUtils.isEmpty(param.getWorkspaceIds())) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<ServicePkgDetailRes> servicePkgDetailRes = RpcInternalUtil.rpcListProcessor(() -> servicePkgClient.getServicePkgDetailBySpaceId(param.getWorkspaceIds()),
|
||||
"查询项目的产品", param.getWorkspaceIds()).getData();
|
||||
if (CollectionUtil.isEmpty(servicePkgDetailRes)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
Set<Long> productIds = servicePkgDetailRes.stream()
|
||||
.map(ServicePkgDetailRes::getProducts)
|
||||
.filter(CollectionUtil::isNotEmpty)
|
||||
.flatMap(List::stream)
|
||||
.map(ServicePkgProduct::getProductId)
|
||||
.collect(Collectors.toSet());
|
||||
if (CollectionUtil.isEmpty(productIds)) {
|
||||
log.warn("no product found for workspace :{}", param.getWorkspaceIds());
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// 已被删除产品过滤一层
|
||||
productIds = productModuleDao.listByIds(productIds)
|
||||
.stream()
|
||||
.filter(productModule -> Objects.equals(productModule.getIsDelete(),0L))
|
||||
.map(BaseEntity::getId)
|
||||
.collect(Collectors.toSet());
|
||||
if (CollectionUtil.isEmpty(productIds)) {
|
||||
log.warn("all product is deleted for workspace :{}", param.getWorkspaceIds());
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
ProductFeatureQuery productFeatureQuery = ProductFeatureQuery.builder()
|
||||
.productIds(productIds)
|
||||
.featureResourceTypes(param.getFeatureResourceTypes())
|
||||
.type(param.getType())
|
||||
.terminal(param.getTerminal())
|
||||
.build();
|
||||
Map<Long, List<SaasProductModuleFeatureRelation>> saasProductModuleFeatureRelations = productFeatureRelationService.queryOnCondition(productFeatureQuery).stream()
|
||||
.collect(Collectors.groupingBy(SaasProductModuleFeatureRelation::getProductModuleId));
|
||||
|
||||
return servicePkgDetailRes.stream()
|
||||
.filter(e -> CollectionUtils.isNotEmpty(e.getProducts()))
|
||||
.map(e -> {
|
||||
List<SaasProductModuleFeatureRelation> features = e.getProducts().stream()
|
||||
.map(product -> saasProductModuleFeatureRelations.get(product.getProductId()))
|
||||
.filter(Objects::nonNull)
|
||||
.flatMap(Collection::stream)
|
||||
.collect(Collectors.toList());
|
||||
return Pair.of(e.getSpaceId(), features);
|
||||
})
|
||||
// 考虑一个项目有多个服务包的情况
|
||||
.collect(Collectors.toMap(Pair::getKey, Pair::getValue, (f, s) -> {
|
||||
f.addAll(s);
|
||||
return f;
|
||||
}))
|
||||
.entrySet()
|
||||
.stream()
|
||||
.map(e -> WorkspaceProduct.builder()
|
||||
.workspaceId(e.getKey())
|
||||
.saasProductModuleFeatureRelations(e.getValue())
|
||||
.build())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user