listAllFeatureByTerminal(String terminal) {
return lambdaQuery()
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java
index 37c03d23..cae6288d 100644
--- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasFeatureResourceMapper.java
@@ -2,8 +2,6 @@ package cn.axzo.tyr.server.repository.mapper;
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.annotations.Update;
/**
*
@@ -15,8 +13,4 @@ import org.apache.ibatis.annotations.Update;
*/
public interface SaasFeatureResourceMapper extends BaseMapper {
- @Update("UPDATE saas_feature_resource" +
- " SET path = REPLACE(path, #{oldPath}, #{newPath})" +
- " WHERE is_delete = 0 AND path LIKE CONCAT(#{oldPath}, '%')")
- void replacePath(@Param("oldPath") String oldPath, @Param("newPath") String newPath);
}
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java
index eb4a7aff..8b7380ad 100644
--- a/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/repository/mapper/SaasRoleMapper.java
@@ -25,8 +25,6 @@ public interface SaasRoleMapper extends BaseMapper {
Page pageQueryForOUWorkspace(IPage page, Long ouId, Long workspaceId, Integer workspaceJoinType,
Integer superAdminWorkspaceType);
- List listForOUWorkspace(Long ouId, Long workspaceId, Integer workspaceJoinType);
-
List listFeatureByIds(@Param("roleIds") Set roleIds, @Param("featureIds") Set featureIds);
}
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/OperateLogService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/OperateLogService.java
new file mode 100644
index 00000000..b53ed3e2
--- /dev/null
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/OperateLogService.java
@@ -0,0 +1,8 @@
+package cn.axzo.tyr.server.service;
+
+import cn.axzo.log.platform.client.model.req.LogAddReq;
+
+public interface OperateLogService {
+
+ void save(LogAddReq param);
+}
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionPointService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionPointService.java
index 1a543d3f..b95fdab2 100644
--- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionPointService.java
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionPointService.java
@@ -51,14 +51,6 @@ public interface PermissionPointService {
List queryList(PermissionPointListQueryRequest request);
- /**
- * 指定条件查询出子级的所以父级
- * 并将父级平铺返回
- * @param request
- * @return
- */
- List listTreeNodesFlatChild(PermissionPointTreeQueryReq request);
-
/** 根据code查询权限点, terminal可为空 **/
List listNodeWithChildrenByCode(String featureCode, String terminal);
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java
new file mode 100644
index 00000000..256f2f8d
--- /dev/null
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/PermissionService.java
@@ -0,0 +1,101 @@
+package cn.axzo.tyr.server.service;
+
+import cn.axzo.tyr.feign.enums.RolePermissionTagEnum;
+import cn.axzo.tyr.feign.enums.RoleTypeEnum;
+import cn.axzo.tyr.feign.req.ListPermissionUserReq;
+import cn.axzo.tyr.feign.resp.PermissionUserResp;
+import cn.axzo.tyr.feign.resp.UserPermissionResp;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface PermissionService {
+
+ /**
+ * 查询用户的权限
+ * @param param
+ * @return
+ */
+ List listUserPermission(ListUserPermissionParam param);
+
+ /**
+ * 查询有权限的用户
+ * @param param
+ * @return
+ */
+ List listPermissionUser(ListPermissionUserReq param);
+
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ class ListUserPermissionParam {
+ private List users;
+
+ /**
+ * 权限code
+ * 没有指定就查询所有的权限,指定了就查询指定code的权限
+ */
+ private Set featureCodes;
+
+ /**
+ * 端信息
+ */
+ private String terminal;
+
+ /**
+ * app类型(APP:原生,H5:h5页面)
+ */
+ private String appType;
+
+ /**
+ * 项目code(H5会拉取项目下所有的元素)
+ * APP上每个应用的code,数据库叫itemCode,保持一致
+ */
+ private String itemCode;
+ }
+
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ class UserParam {
+
+ private Long identityId;
+
+ private Integer identityType;
+
+ private Long personId;
+
+ private Set tags;
+
+ private Set roles;
+
+ private Long workspaceId;
+
+ private Long ouId;
+
+ private Long nodeId;
+ }
+
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ class RoleParam {
+ private Long roleId;
+
+ private RoleTypeEnum roleType;
+
+ /**
+ * 产品单位类型
+ * 1:总包 2:建设单位 3:监理单位 4:劳务分包 5:专业分包 6:OMS通用 7:企业通用 8:企业内班组 9:项目内班组
+ */
+ private Integer cooperateShipTypes;
+ }
+}
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java
index 1e67c38a..7cc84d86 100644
--- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductPermissionCacheService.java
@@ -62,6 +62,22 @@ public interface ProductPermissionCacheService {
private Set productIds;
private Set featureCodes;
+
+ /**
+ * 端信息
+ */
+ private String terminal;
+
+ /**
+ * app类型(APP:原生,H5:h5页面)
+ */
+ private String appType;
+
+ /**
+ * 项目code(H5会拉取项目下所有的元素)
+ * APP上每个应用的code,数据库叫itemCode,保持一致
+ */
+ private String itemCode;
}
@Data
@@ -93,10 +109,5 @@ public interface ProductPermissionCacheService {
* 项目code(H5会拉取项目下所有的元素)
*/
private String itemCode;
-
- /**
- * 客户端版本号
- */
- private Integer version;
}
}
\ No newline at end of file
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductService.java
index e06a82ca..821663e4 100644
--- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductService.java
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/ProductService.java
@@ -1,6 +1,7 @@
package cn.axzo.tyr.server.service;
import cn.axzo.basics.common.page.PageResult;
+import cn.axzo.foundation.page.PageResp;
import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.model.product.ProductAddReq;
@@ -15,7 +16,10 @@ import cn.axzo.tyr.client.model.req.UpdateProductStatusReq;
import cn.axzo.tyr.client.model.res.GovernmentTerminalResp;
import cn.axzo.tyr.client.model.res.SaasProductResp;
import cn.axzo.tyr.client.model.res.WorkspaceProductResp;
+import cn.axzo.tyr.feign.req.PageProductReq;
+import cn.axzo.tyr.feign.resp.ProductResp;
import cn.axzo.tyr.server.repository.entity.ProductModule;
+import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
@@ -25,7 +29,7 @@ import java.util.List;
* @author wangli
* @since 2023/9/7 14:21
*/
-public interface ProductService {
+public interface ProductService extends IService {
ApiResult> list(ProductSearchListReq req);
@@ -61,4 +65,6 @@ public interface ProductService {
* @param req
*/
Long productModuleCreate(SaasProductSaveOrUpdateReq req);
+
+ PageResp pageV2(PageProductReq req);
}
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java
index 4927926f..8801c2a4 100644
--- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupPermissionRelationService.java
@@ -1,7 +1,9 @@
package cn.axzo.tyr.server.service;
import cn.axzo.foundation.page.PageResp;
+import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum;
import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq;
+import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp;
import cn.axzo.tyr.client.model.vo.SaveOrUpdateRoleVO;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -10,14 +12,16 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
+import java.util.Date;
import java.util.List;
+import java.util.Set;
public interface SaasPgroupPermissionRelationService extends IService {
void saveOrUpdate(UpsertPermissionRelationParam param);
- PageResp page(PagePgroupPermissionRelationReq param);
+ PageResp page(PagePgroupPermissionRelationReq param);
- List list(PagePgroupPermissionRelationReq param);
+ List list(PagePgroupPermissionRelationReq param);
void delete(DeleteParam param);
@@ -61,4 +65,64 @@ public interface SaasPgroupPermissionRelationService extends IService ids;
}
+
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ class SaasPgroupPermissionRelationDTO {
+
+ private Long id;
+
+ private Date createAt;
+
+ private Date updateAt;
+
+ /**
+ * 权限集id
+ */
+ private Long groupId;
+ /**
+ * 功能id
+ */
+ private Long featureId;
+
+ /**
+ * 创建者
+ */
+ private Long createBy;
+
+ /**
+ * 更新者
+ */
+ private Long updateBy;
+
+ /**
+ * 关联类型(0:saas_feature,1:saas_feature_resource)
+ * 暂时的,因为cms端会有灰度,数据从saas_feature和saas_feature_resource出
+ */
+ private Integer type;
+
+ /**
+ * 菜单资源类型1-菜单 2-页面 3-应用入口 4-组件
+ * 冗余菜单资源类型,是在cms端查询菜单和页面时,方便快速查询
+ * type = 0时,featureType是saas_feature表的featureType
+ * type = 1时,featureType是saas_feature_resource表的featureType
+ * 后面会全部切换到saas_feature_resource
+ * FeatureResourceType
+ */
+ private Integer featureType;
+
+ /**
+ * featureId所在端
+ */
+ private String terminal;
+
+ /**
+ * 标签
+ */
+ private Set tags;
+
+ private SaasFeatureResourceResp saasFeatureResource;
+ }
}
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupRoleRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupRoleRelationService.java
new file mode 100644
index 00000000..8973ca91
--- /dev/null
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasPgroupRoleRelationService.java
@@ -0,0 +1,141 @@
+package cn.axzo.tyr.server.service;
+
+import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
+import cn.axzo.foundation.dao.support.wrapper.Operator;
+import cn.axzo.foundation.page.IPageReq;
+import cn.axzo.foundation.page.PageResp;
+import cn.axzo.tyr.client.common.enums.FeatureResourceType;
+import cn.axzo.tyr.client.model.enums.RolePermissionTagEnum;
+import cn.axzo.tyr.client.model.res.SaasRoleRes;
+import cn.axzo.tyr.server.repository.entity.SaasPgroupRoleRelation;
+import com.baomidou.mybatisplus.extension.service.IService;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+public interface SaasPgroupRoleRelationService extends IService {
+
+ List list(ListSaasPgroupRoleRelationParam param);
+
+ PageResp page(PageSaasPgroupRoleRelationParam param);
+
+ @Data
+ @SuperBuilder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ class ListSaasPgroupRoleRelationParam {
+
+ @CriteriaField(field = "roleId", operator = Operator.IN)
+ private Set roleIds;
+
+ @CriteriaField(field = "groupId", operator = Operator.IN)
+ private Set groupIds;
+
+ @CriteriaField(ignore = true)
+ private Boolean needRole;
+
+ /**
+ * 查询featureResource,需要
+ * 组装在pgroupPermissionRelations.SaasFeatureResourceResp
+ */
+ @CriteriaField(ignore = true)
+ private Boolean needFeatureResource;
+
+ /**
+ * 只查询featureId跟pgroupId的关联关系记录
+ * 组装在pgroupPermissionRelations
+ */
+ @CriteriaField(ignore = true)
+ private Boolean needFeatureResourceRelation;
+
+ /**
+ * 根据权限标签去过滤角色对应的权限,
+ * 只有在needPermission = true时才生效
+ */
+ @CriteriaField(ignore = true)
+ private Set permissionTags;
+
+ /**
+ * 端,查询权限点时,会根据端过滤,增加效率,目前只有CMS端的新版本才冗余了端
+ */
+ @CriteriaField(ignore = true)
+ private String terminal;
+
+ @CriteriaField(ignore = true)
+ private List featureIds;
+
+ /**
+ * 查询菜单树节点类型
+ */
+ @CriteriaField(ignore = true)
+ private List featureResourceTypes;
+
+ /**
+ * 新旧feature
+ */
+ @CriteriaField(ignore = true)
+ private Integer type;
+ }
+
+ @SuperBuilder
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ class PageSaasPgroupRoleRelationParam extends ListSaasPgroupRoleRelationParam implements IPageReq {
+
+ @CriteriaField(ignore = true)
+ Integer page;
+
+ @CriteriaField(ignore = true)
+ Integer pageSize;
+
+ /**
+ * 排序:使用示例,createTime__DESC
+ */
+ @CriteriaField(ignore = true)
+ List sort;
+ }
+
+ @Builder
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ class SaasPgroupRoleRelationDTO {
+
+ private Long id;
+
+ private Date createAt;
+
+ private Date updateAt;
+
+ /**
+ * 角色id
+ */
+ private Long roleId;
+
+ /**
+ * 权限集id
+ */
+ private Long groupId;
+
+ /**
+ * 创建者
+ */
+ private Long createBy;
+
+ /**
+ * 更新者
+ */
+ private Long updateBy;
+
+ private SaasRoleRes saasRoleRes;
+
+ private List pgroupPermissionRelations;
+ }
+}
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java
index 36958eb8..4523cdbc 100644
--- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleGroupService.java
@@ -19,6 +19,7 @@ import java.util.List;
*/
public interface SaasRoleGroupService extends IService {
+ @Deprecated
List getList(QuerySaasRoleGroupReq req);
/**
@@ -26,6 +27,7 @@ public interface SaasRoleGroupService extends IService {
* @param req 角色分组参数
* @return 角色分组列表
*/
+ @Deprecated
List getRoleGroupList(QuerySaasRoleGroupReq req);
@@ -40,6 +42,7 @@ public interface SaasRoleGroupService extends IService {
* @param categoryCode
* @return
*/
+ @Deprecated
List listByCategoryCode(List categoryCode);
/**
@@ -47,6 +50,7 @@ public interface SaasRoleGroupService extends IService {
* @param codes 角色组编码
* @param type 1-仅查当前code 2-对应code角色组及子级角色组 3-仅对应code角色组的子级
* **/
+ @Deprecated
List listByCodes(List codes, int type);
List list(ListSaasRoleGroupParam param);
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserRelationService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserRelationService.java
index 47809a30..78dcd62b 100644
--- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserRelationService.java
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserRelationService.java
@@ -1,7 +1,6 @@
package cn.axzo.tyr.server.service;
import cn.axzo.basics.profiles.common.enums.IdentityType;
-import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.tyr.client.model.permission.IdentityAndAccountDTO;
import cn.axzo.tyr.client.model.permission.IdentityKey;
import cn.axzo.tyr.client.model.permission.QueryIdentityByPermissionDTO;
@@ -10,11 +9,10 @@ import cn.axzo.tyr.client.model.req.QuerySuperAdminReq;
import cn.axzo.tyr.client.model.req.UpdateUserJobReq;
import cn.axzo.tyr.client.model.req.WorkspaceUpdateUserRoleDTO;
import cn.axzo.tyr.client.model.res.SuperAminInfoResp;
-import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserDTO;
import cn.axzo.tyr.client.model.roleuser.dto.SaasRoleUserV2DTO;
import cn.axzo.tyr.client.model.roleuser.req.ListRoleUserRelationParam;
import cn.axzo.tyr.client.model.roleuser.req.PageRoleUserRelationParam;
-import cn.axzo.tyr.client.model.roleuser.req.RoleUserParam;
+import cn.axzo.tyr.feign.req.UpsertUserRoleReq;
import cn.axzo.tyr.server.repository.entity.SaasRoleUserRelation;
import com.baomidou.mybatisplus.extension.service.IService;
import lombok.AllArgsConstructor;
@@ -35,21 +33,10 @@ public interface SaasRoleUserRelationService extends IService page(PageRoleUserRelationParam param);
- void upsert(UpsertParam param);
+ void upsert(UpsertUserRoleReq param);
void batchRemove(BatchRemoveParam param);
- @Data
- @Builder
- @NoArgsConstructor
- @AllArgsConstructor
- class UpsertParam {
-
- private List saasRoleUserRelations;
-
- private Long operator;
- }
-
@Data
@Builder
@NoArgsConstructor
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java
index cb2965a8..1847e30b 100644
--- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/SaasRoleUserService.java
@@ -42,8 +42,6 @@ public interface SaasRoleUserService {
*/
List batchSuperAdminList(List param);
- List listByRoleIds(List roleIds, Long ouId, Long workspaceId);
-
/**
* 删除单位参与的工作台的所有的人员与角色。 目前主要是用于移除参与单位的地方
*/
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java
index b84067c0..d0374a43 100644
--- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java
@@ -14,16 +14,6 @@ import java.util.Set;
public interface WorkspaceProductService {
-
- List listWorkspaceProduct(WorkspaceProductParam param);
-
- /**
- * 从缓存中查询项目的产品
- * @param param
- * @return
- */
- List listWorkspaceProductCached(WorkspaceProductParam param);
-
/**
* 缓存项目的产品
* @param param
@@ -32,11 +22,20 @@ public interface WorkspaceProductService {
/**
* 从缓存中查询项目的产品及产品的权限
+ * 没有切到:listWorkspacePermissionCached,后续有测试机会的时候切到listWorkspacePermissionCached
* @param param
* @return
*/
+ @Deprecated
List listWorkspaceProductPermissionCached(ListWorkspaceProductPermissionCacheParam param);
+ /**
+ * 从缓存中查询项目的权限
+ * @param param
+ * @return
+ */
+ List listWorkspacePermissionCached(ListWorkspacePermissionCacheParam param);
+
/**
* 从缓存中查询项目的产品及产品的菜单信息
* @param param
@@ -70,6 +69,63 @@ public interface WorkspaceProductService {
private Set workspaceIds;
private Set featureCodes;
+
+ /**
+ * 端信息
+ */
+ private String terminal;
+
+ /**
+ * app类型(APP:原生,H5:h5页面)
+ */
+ private String appType;
+
+ /**
+ * 项目code(H5会拉取项目下所有的元素)
+ * APP上每个应用的code,数据库叫itemCode,保持一致
+ */
+ private String itemCode;
+ }
+
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ class ListWorkspacePermissionCacheParam {
+ private List workspacePermissions;
+ }
+
+ @Data
+ @Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
+ class WorkspacePermission {
+
+ /**
+ * 项目id
+ */
+ private Long workspaceId;
+
+ /**
+ * 权限code
+ */
+ private Set featureCodes;
+
+ /**
+ * 端信息
+ */
+ private String terminal;
+
+ /**
+ * app类型(APP:原生,H5:h5页面)
+ */
+ private String appType;
+
+ /**
+ * 项目code(H5会拉取项目下所有的元素)
+ * APP上每个应用的code,数据库叫itemCode,保持一致
+ */
+ private String itemCode;
}
@Data
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/OperateLogServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/OperateLogServiceImpl.java
new file mode 100644
index 00000000..fd77ced4
--- /dev/null
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/OperateLogServiceImpl.java
@@ -0,0 +1,36 @@
+package cn.axzo.tyr.server.service.impl;
+
+import cn.axzo.framework.jackson.utility.JSON;
+import cn.axzo.log.platform.client.feign.LogApi;
+import cn.axzo.log.platform.client.model.req.LogAddReq;
+import cn.axzo.tyr.server.service.OperateLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.ExecutorService;
+
+@Slf4j
+@Service
+public class OperateLogServiceImpl implements OperateLogService {
+
+ @Autowired
+ private LogApi logApi;
+ @Qualifier("asyncExecutor")
+ @Autowired
+ private ExecutorService asyncExecutor;
+
+ @Override
+ public void save(LogAddReq param) {
+
+ try {
+ // 目前操作日志的记录,不是核心流程,这个方法,不抛出异常,以免影响正常业务流程。
+ // 异步处理
+ asyncExecutor.submit(() -> logApi.addLog(param));
+ } catch (Throwable e) {
+ log.warn("OperateLogServiceImpl save caught exception, msg = {}, param = {}",
+ e.getMessage(), JSON.toJSONString(param), e);
+ }
+ }
+}
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionPointServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionPointServiceImpl.java
index ac20abdb..7806bd86 100644
--- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionPointServiceImpl.java
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionPointServiceImpl.java
@@ -659,18 +659,6 @@ public class PermissionPointServiceImpl implements PermissionPointService {
return node;
}
-
- @Override
- public List listTreeNodesFlatChild(PermissionPointTreeQueryReq request) {
- List permissionPointTreeNodes = listTreeNodes(request);
- //将树型结构打平
- return permissionPointTreeNodes.stream().map(e -> {
- e.flatChildren();
- return e.getChildren();
- }).flatMap(List::stream).collect(Collectors.toList());
-
- }
-
@Override
public List listNodeWithChildrenByCode(String featureCode, String terminal) {
return listNodeWithChildrenByCodes(Collections.singletonList(featureCode), terminal);
diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java
new file mode 100644
index 00000000..17455748
--- /dev/null
+++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/PermissionServiceImpl.java
@@ -0,0 +1,415 @@
+package cn.axzo.tyr.server.service.impl;
+
+import cn.axzo.tyr.client.model.req.ListIdentityFromPermissionReq;
+import cn.axzo.tyr.client.model.res.ListIdentityFromPermissionResp;
+import cn.axzo.tyr.feign.enums.IdentityTypeEnum;
+import cn.axzo.tyr.feign.enums.RolePermissionTagEnum;
+import cn.axzo.tyr.feign.enums.RoleTypeEnum;
+import cn.axzo.tyr.feign.req.ListPermissionUserReq;
+import cn.axzo.tyr.feign.resp.PermissionResp;
+import cn.axzo.tyr.feign.resp.PermissionUserResp;
+import cn.axzo.tyr.feign.resp.UserPermissionResp;
+import cn.axzo.tyr.server.service.PermissionService;
+import cn.axzo.tyr.server.service.ProductPermissionCacheService;
+import cn.axzo.tyr.server.service.RolePermissionCacheService;
+import cn.axzo.tyr.server.service.SaasFeatureResourceService;
+import cn.axzo.tyr.server.service.TyrSaasAuthService;
+import cn.axzo.tyr.server.service.WorkspaceProductService;
+import cn.axzo.tyr.server.util.FeatureCodeUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Sets;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.utils.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class PermissionServiceImpl implements PermissionService {
+
+ @Autowired
+ private RolePermissionCacheService rolePermissionCacheService;
+ @Autowired
+ private WorkspaceProductService workspaceProductService;
+ @Autowired
+ private SaasFeatureResourceService saasFeatureResourceService;
+ @Autowired
+ private FeatureCodeUtil featureCodeUtil;
+ @Autowired
+ private TyrSaasAuthService tyrSaasAuthService;
+
+ /**
+ * 1、查询用户的角色
+ * 2、查询角色的权限
+ * 3、查询项目的权限
+ * 4、查找项目权限的端的所有菜单、可能菜单已经被删除,需要需要校验有权限id是否存在
+ * 5、解析超管、管理员角色的权限
+ * 6、解析普通角色的权限
+ * 7、解析免授权的权限
+ * 8、合并5、6、7的权限并返回
+ * 因为角色的单位类型要跟产品的单位类型去匹配、超管|管理员角色的权限是对应的产品的权限、普通角色的权限需要跟产品匹配
+ * 权限点指定是全部角色,则只需要产品勾选了权限即有权限
+ *
+ */
+ @Override
+ public List listUserPermission(ListUserPermissionParam param) {
+ if (CollectionUtils.isEmpty(param.getUsers())) {
+ return Collections.emptyList();
+ }
+
+ // 为了兼容新旧featureCode,这里根据featureCode去查询新旧featureCode的映射把新旧featureCode都组装起
+ Set newFeatureCodes = featureCodeUtil.resolveFeatureCode(param.getFeatureCodes());
+ param.setFeatureCodes(newFeatureCodes);
+
+ // 查询项目的权限
+ Map> workspacePermissionMap = listWorkspacePermission(param);
+ if (Objects.isNull(workspacePermissionMap) || workspacePermissionMap.isEmpty()) {
+ return Collections.emptyList();
+ }
+
+ // 查询产品的端的所有菜单信息
+ List allFeatureResources = listAllSaasFeature(workspacePermissionMap);
+ if (CollectionUtils.isEmpty(allFeatureResources)) {
+ return Collections.emptyList();
+ }
+
+ Set effectFeatureIds = allFeatureResources.stream()
+ .map(SaasFeatureResourceService.SaasFeatureResourceCache::getFeatureId)
+ .collect(Collectors.toSet());
+ // 查询角色的权限
+ Map> rolePermissions = listRolePermission(param);
+
+ // 按照人去解析每个人的权限,因为每个人的tag可能不一样
+ return param.getUsers().stream()
+ .map(user -> {
+ if (CollectionUtils.isEmpty(user.getRoles())) {
+ return null;
+ }
+
+ List workspacePermissions = workspacePermissionMap.get(user.getWorkspaceId());
+ if (CollectionUtils.isEmpty(workspacePermissions)) {
+ return null;
+ }
+
+ // 匹配用户在场时的管理员角色的权限,管理员角色的权限是对应的项目的权限
+ Set adminRolePermissions = resolveAdminRolePermission(workspacePermissions, user);
+
+ // 匹配普通角色的权限,需要根据角色配置的权限和项目的权限去匹配(单位类型、tag等信息)
+ Set normalRolePermissionPoints = resolveNormalRolePermission(workspacePermissions, user, rolePermissions);
+
+ Set notAuthPermissionPoints = resolveNotAuthPermission(workspacePermissions, allFeatureResources);
+
+ //组装返回值
+ //是否超管
+
+ boolean isSuperAdmin = user.getRoles().stream()
+ .anyMatch(f -> Objects.equals(RoleTypeEnum.SUPER_ADMIN, f.getRoleType()));
+ UserPermissionResp result = UserPermissionResp.builder()
+ .identityId(user.getIdentityId())
+ .identityType(IdentityTypeEnum.fromCode(user.getIdentityType())
+ .map(IdentityTypeEnum::name)
+ .orElse(null))
+ .personId(user.getPersonId())
+ .ouId(user.getOuId())
+ .workspaceId(user.getWorkspaceId())
+ .nodeId(user.getNodeId())
+ .isSuperAdmin(isSuperAdmin)
+ .build();
+
+ Set allPermissionPoints = Sets.newHashSet();
+ allPermissionPoints.addAll(adminRolePermissions);
+ allPermissionPoints.addAll(normalRolePermissionPoints);
+ allPermissionPoints.addAll(notAuthPermissionPoints);
+
+
+ result.setPermissions(allPermissionPoints.stream()
+ .filter(e -> effectFeatureIds.contains(e.getFeatureId()))
+ .collect(Collectors.toList()));
+ return result;
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * 1、根据权限code及相关条件查询项目的权限
+ * 2、根据项目查询所有role
+ * 3、根据权限code查询有权限的角色信息
+ * 4、根据项目的权限和role查询角色的权限信息
+ * 5、解析有权限的admin role
+ * 6、解析有权限的非admin role
+ * 7、解析有离场权限的admin role
+ * 8、聚合6,7,8的角色,根据角色查询用户
+ * 9、根据用户查询用户的tags
+ * 10、
+ * @param param
+ * @return
+ */
+ @Override
+ public List listPermissionUser(ListPermissionUserReq param) {
+ // 使用原来接口,因为目前没有做用户维度的权限缓存,对源代码优化成本高,效果不显著,没有多大意义,
+ List list = param.getPermissionUsers().stream()
+ .map(e -> JSONObject.parseObject(JSONObject.toJSONString(e), ListIdentityFromPermissionReq.class))
+ .collect(Collectors.toList());
+ List listIdentityFromPermissions = tyrSaasAuthService.batchListIdentityFromPermission(list);
+
+ return listIdentityFromPermissions.stream()
+ .map(e -> PermissionUserResp.builder()
+ .workspaceId(e.getWorkspaceId())
+ .ouId(e.getOuId())
+ .users(Optional.ofNullable(e.getUsers())
+ .map(users -> users.stream()
+ .map(user -> PermissionUserResp.User.builder()
+ .identityId(user.getIdentityId())
+ .identityType(user.getIdentityType())
+ .personId(user.getPersonalId())
+ .isSuperAdmin(user.isSuperAdmin())
+ .build())
+ .collect(Collectors.toSet()))
+ .orElseGet(Sets::newHashSet))
+ .build())
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * 只有查询在职权限时才能直接根据管理员角色和产品去匹配
+ * 因为离场权限,管理员角色会配置管理员角色对应的离场权限
+ * @param workspacePermissions
+ * @param userParam
+ * @return
+ */
+ private Set resolveAdminRolePermission(List workspacePermissions,
+ UserParam userParam) {
+
+ if (!CollectionUtils.isEmpty(userParam.getTags()) && !userParam.getTags().contains(RolePermissionTagEnum.JOINED)) {
+ log.info("admin role permission:tags not null and no joined tag");
+ return Collections.emptySet();
+ }
+
+ //超管和管理员角色
+ List adminRoles = userParam.getRoles().stream()
+ .filter(role -> Objects.nonNull(role.getRoleType()) && role.getRoleType().isAdmin())
+ .collect(Collectors.toList());
+ if (CollectionUtil.isEmpty(adminRoles)) {
+ log.info("no admin roles");
+ return Collections.emptySet();
+ }
+
+ Set cooperateShipTypes = adminRoles.stream()
+ .map(RoleParam::getCooperateShipTypes)
+ .map(String::valueOf)
+ .collect(Collectors.toSet());
+
+ return workspacePermissions.stream()
+ .filter(e -> cooperateShipTypes.contains(e.getCooperateType()))
+ .map(e -> PermissionResp.builder()
+ .featureCode(e.getFeatureCode())
+ .featureId(e.getFeatureId())
+ .terminal(e.getTerminal())
+ .featureType(e.getFeatureType())
+ .build())
+ .collect(Collectors.toSet());
+ }
+
+
+ private Set resolveNotAuthPermission(List productPermissions,
+ List allFeatures) {
+
+ // 因为有权授权权限的权限点,就需要有所有上层权限点的权限
+ List notAuthFeatures = allFeatures.stream()
+ .filter(SaasFeatureResourceService.SaasFeatureResourceCache::isNotAuth)
+ .collect(Collectors.toList());
+
+ Set notAuthFeatureIds = notAuthFeatures.stream()
+ .map(SaasFeatureResourceService.SaasFeatureResourceCache::getFeatureId)
+ .collect(Collectors.toSet());
+
+ Set notAuthParentFeatureIds = notAuthFeatures.stream()
+ .map(SaasFeatureResourceService.SaasFeatureResourceCache::getParentIds)
+ .flatMap(Collection::stream)
+ .collect(Collectors.toSet());
+
+ notAuthFeatureIds.addAll(notAuthParentFeatureIds);
+ if (CollectionUtils.isEmpty(notAuthFeatureIds)) {
+ return Collections.emptySet();
+ }
+
+ return productPermissions.stream()
+ .filter(productPermission -> notAuthFeatureIds.contains(productPermission.getFeatureId()))
+ .map(e -> PermissionResp.builder()
+ .featureCode(e.getFeatureCode())
+ .featureId(e.getFeatureId())
+ .terminal(e.getTerminal())
+ .featureType(e.getFeatureType())
+ .build())
+ .collect(Collectors.toSet());
+ }
+
+ /**
+ * 根据角色的协同关系类型去匹配权限
+ * @param workspacePermissions
+ * @param userParam
+ * @param rolePermissionMap
+ * @return
+ */
+ private Set resolveNormalRolePermission(List workspacePermissions,
+ UserParam userParam,
+ Map> rolePermissionMap) {
+
+ Map> workspacePermissionMap = workspacePermissions.stream()
+ .collect(Collectors.groupingBy(ProductPermissionCacheService.PermissionDTO::getCooperateType,
+ Collectors.mapping(e -> PermissionResp.builder()
+ .featureCode(e.getFeatureCode())
+ .featureId(e.getFeatureId())
+ .terminal(e.getTerminal())
+ .featureType(e.getFeatureType())
+ .build(), Collectors.toList())));
+
+ return userParam.getRoles().stream()
+ .map(role -> {
+ List