+ * 基于当前人所属的部门所在的机构层级,以及以下的机构下的数据
*/
- DEFINE(40, "指定部门数据"),
+ DEFINE_ORG_LEVEL_WITH_CHILD(32, "指定机构层级及以下"),
+
+ /**
+ * 指定机构集合数据
+ */
+ DEFINE(40, "指定机构集合数据"),
+
+ /**
+ * 指定机构及以下
+ */
+ DEFINE_ORG_WITH_CHILD(41, "指定机构及以下"),
/**
* 全部数据
@@ -93,4 +108,26 @@ public enum DataScopeTypeEnum {
throw new ServiceException(DataScopeExceptionEnum.DATA_SCOPE_ERROR);
}
+ @Override
+ public Object getKey() {
+ return code;
+ }
+
+ @Override
+ public Object getName() {
+ return message;
+ }
+
+ @Override
+ public DataScopeTypeEnum parseToEnum(String originValue) {
+ if (ObjectUtil.isEmpty(originValue)) {
+ return null;
+ }
+ for (DataScopeTypeEnum value : DataScopeTypeEnum.values()) {
+ if (value.code.equals(Convert.toInt(originValue))) {
+ return value;
+ }
+ }
+ return null;
+ }
}
diff --git a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/factory/SortedTreeBuildFactory.java b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/factory/SortedTreeBuildFactory.java
index 6bb2311ff..3c8fce9e8 100644
--- a/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/factory/SortedTreeBuildFactory.java
+++ b/kernel-a-rule/src/main/java/cn/stylefeng/roses/kernel/rule/tree/factory/SortedTreeBuildFactory.java
@@ -28,9 +28,12 @@ import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractSortedTreeNode;
import lombok.Data;
import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
/**
* 带排序功能的树构造器
@@ -54,22 +57,14 @@ public class SortedTreeBuildFactory
- * 拼接条件最终效果如下:org_id in (select org_id from sys_hr_organization where org_pids like "%[id]%" or org_id = id)
- *
- * @author fengshuonan
- * @since 2024-02-29 20:14
- */
- private static Expression deptWithChildScope(DataScopeConfig dataScopeConfig, Long deptOrCompanyId) {
-
- // 创建 org_id 列
- Column orgIdColumn = new Column(dataScopeConfig.getOrgIdFieldName());
-
- // 创建子查询 select 部分
- LateralSubSelect subSelect = new LateralSubSelect();
- PlainSelect selectBody = new PlainSelect();
- selectBody.setSelectItems(ListUtil.of(new SelectItem<>(orgIdColumn)));
- selectBody.setFromItem(new Table("sys_hr_organization"));
-
- // 创建 LIKE 表达式
- LikeExpression likeExpression = new LikeExpression();
- likeExpression.setLeftExpression(new Column("org_pids"));
- likeExpression.setRightExpression(new StringValue("%[" + deptOrCompanyId + "]%"));
-
- // 设置等于表达式
- EqualsTo equalsTo = new EqualsTo();
- equalsTo.setLeftExpression(orgIdColumn);
- equalsTo.setRightExpression(new LongValue(deptOrCompanyId));
-
- // 创建 OR 表达式
- OrExpression orExpression = new OrExpression(likeExpression, equalsTo);
-
- // 设置子查询的 WHERE 条件
- selectBody.setWhere(orExpression);
- subSelect.setSelect(selectBody);
-
- // 创建 IN 表达式
- return new InExpression(orgIdColumn, subSelect);
- }
}
diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/datascope/UserRoleDataScopeApi.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/datascope/UserRoleDataScopeApi.java
index 1f96d38ec..5131dc990 100644
--- a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/datascope/UserRoleDataScopeApi.java
+++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/datascope/UserRoleDataScopeApi.java
@@ -1,6 +1,7 @@
package cn.stylefeng.roses.kernel.db.mp.datascope;
import cn.stylefeng.roses.kernel.db.mp.datascope.config.DataScopeConfig;
+import cn.stylefeng.roses.kernel.rule.enums.permission.DataScopeTypeEnum;
/**
* 获取用户角色的数据范围
@@ -18,4 +19,12 @@ public interface UserRoleDataScopeApi {
*/
DataScopeConfig getUserRoleDataScopeConfig();
+ /**
+ * 获取当前用户的,规定指定类型的数据范围的配置
+ *
+ * @author fengshuonan
+ * @since 2025/1/27 23:32
+ */
+ DataScopeConfig getUserPointDataScopeConfig(DataScopeTypeEnum dataScopeTypeEnum);
+
}
diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/datascope/config/DataScopeConfig.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/datascope/config/DataScopeConfig.java
index 499b5aa7c..0f3fe5715 100644
--- a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/datascope/config/DataScopeConfig.java
+++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/datascope/config/DataScopeConfig.java
@@ -1,10 +1,9 @@
package cn.stylefeng.roses.kernel.db.mp.datascope.config;
import cn.stylefeng.roses.kernel.db.mp.datascope.ProjectDataScopeHandler;
-import cn.stylefeng.roses.kernel.rule.enums.permission.DataScopeTypeEnum;
import lombok.Data;
-import java.util.List;
+import java.util.Set;
/**
* 数据范围权限配置
@@ -16,38 +15,48 @@ import java.util.List;
public class DataScopeConfig {
/**
- * 用户的数据范围权限类型
+ * 是否是全部的数据范围
+ *
+ * 不限制数据范围的查询
*/
- private DataScopeTypeEnum dataScopeType;
+ private boolean totalDataScope = false;
+
+ //-------------------------------针对限制的用户的数据范围进行校验-------------------------------
/**
- * 限制的用户id
+ * 是否对创建人进行校验
+ */
+ private boolean doCreateUserValidate = false;
+
+ /**
+ * 用户拥有权限的用户id
+ *
+ * 一般为用户自己的id
*/
private Long userId;
- /**
- * 用户所在部门id
- */
- private Long userDeptId;
-
- /**
- * 用户所在公司id
- */
- private Long userCompanyId;
-
- /**
- * 指定机构的ID列表,仅在数据范围类型为 DEFINE 时使用
- */
- private List
+ * 通过角色权限表,计算出来的最终结果
+ */
+ private Set
+ * 通过缓存加速获取文件信息
*
* @author fengshuonan
* @since 2023/11/13 17:49
diff --git a/kernel-d-file/file-api/src/main/java/cn/stylefeng/roses/kernel/file/api/format/FileUrlFormatProcess.java b/kernel-d-file/file-api/src/main/java/cn/stylefeng/roses/kernel/file/api/format/FileUrlFormatProcess.java
index f460d95fe..822fa583d 100644
--- a/kernel-d-file/file-api/src/main/java/cn/stylefeng/roses/kernel/file/api/format/FileUrlFormatProcess.java
+++ b/kernel-d-file/file-api/src/main/java/cn/stylefeng/roses/kernel/file/api/format/FileUrlFormatProcess.java
@@ -7,6 +7,8 @@ import cn.stylefeng.roses.kernel.rule.format.BaseSimpleFieldFormatProcess;
/**
* Json响应,针对返回的文件信息,响应一个文件的具体url
+ *
+ * 通过缓存加速获取文件详情
*
* @author fengshuonan
* @since 2023/3/28 9:30
diff --git a/kernel-d-file/file-api/src/main/java/cn/stylefeng/roses/kernel/file/api/pojo/response/SysFileInfoResponse.java b/kernel-d-file/file-api/src/main/java/cn/stylefeng/roses/kernel/file/api/pojo/response/SysFileInfoResponse.java
index 40c4f4069..da6c3e867 100644
--- a/kernel-d-file/file-api/src/main/java/cn/stylefeng/roses/kernel/file/api/pojo/response/SysFileInfoResponse.java
+++ b/kernel-d-file/file-api/src/main/java/cn/stylefeng/roses/kernel/file/api/pojo/response/SysFileInfoResponse.java
@@ -126,6 +126,12 @@ public class SysFileInfoResponse {
@ChineseDescription("存储路径")
private String filePath;
+ /**
+ * 文件的md5值
+ */
+ @ChineseDescription("文件的md5值")
+ private String fileMd5;
+
/**
* 文件访问的路径,如果是私密文件,则返回带鉴权的url,如果不是私密文件,则返回公网能直接访问的url
*/
@@ -150,10 +156,4 @@ public class SysFileInfoResponse {
@ChineseDescription("上传时间")
private Date uploadTime;
- /**
- * 文件的md5值
- */
- @ChineseDescription("文件的md5值")
- private String fileMd5;
-
}
diff --git a/kernel-d-file/file-business/pom.xml b/kernel-d-file/file-business/pom.xml
index 2964604c5..a9ceaf690 100644
--- a/kernel-d-file/file-business/pom.xml
+++ b/kernel-d-file/file-business/pom.xml
@@ -7,7 +7,7 @@
+ * key是文件id,value是SysFileInfoResponse
+ *
+ * @author fengshuonan
+ * @since 2025/1/14 16:58
+ */
+public class FileInfoMemoryCache extends AbstractMemoryCacheOperator
+ * key是文件id,value是SysFileInfoResponse
+ *
+ * @author fengshuonan
+ * @since 2025/1/14 16:58
+ */
+public class FileInfoRedisCache extends AbstractRedisCacheOperator
+ * 走缓存加速字典名称的获取
*
* @author fengshuonan
* @since 2023/5/4 21:20
@@ -20,9 +22,9 @@ public class DictFormatProcess extends BaseSimpleFieldFormatProcess {
@Override
public Object simpleItemFormat(Object businessId) {
- Long orgId = Convert.toLong(businessId);
+ Long dictId = Convert.toLong(businessId);
DictApi bean = SpringUtil.getBean(DictApi.class);
- return bean.getDictNameByDictId(orgId);
+ return bean.getDictNameByDictId(dictId);
}
}
diff --git a/kernel-s-dict/dict-business/pom.xml b/kernel-s-dict/dict-business/pom.xml
index 0c3c201e8..3db42ed45 100644
--- a/kernel-s-dict/dict-business/pom.xml
+++ b/kernel-s-dict/dict-business/pom.xml
@@ -7,7 +7,7 @@
+ * key是职位id,value是字典详情
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 14:55
+ */
+public class DictInfoMemoryCache extends AbstractMemoryCacheOperator
+ * key是职位id,value是字典详情
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 14:10
+ */
+public class DictInfoRedisCache extends AbstractRedisCacheOperator
+ * key是混合类型的,value是字典名称
+ *
+ * key可能有两种,1. 字典类型id+字典编码 2. 字典类型编码+字典编码
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 16:33
+ */
+public class MixedDictNameMemoryCache extends AbstractMemoryCacheOperator
+ * key是混合类型的,value是字典名称
+ *
+ * key可能有两种,1. 字典类型id+字典编码 2. 字典类型编码+字典编码
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 14:10
+ */
+public class MixedDictNameRedisCache extends AbstractRedisCacheOperator
+ * key是混合类型的,value是字典名称
+ *
+ * key可能有两种,1. 字典类型id+字典编码 2. 字典类型编码+字典编码
+ */
+ String DICT_MIXED_NAME_CACHE_PREFIX = "DICT:MIXED:";
+
+}
diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/DictService.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/DictService.java
index ebc823a17..c60052737 100644
--- a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/DictService.java
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/DictService.java
@@ -66,7 +66,6 @@ public interface DictService extends IService
+ * 第一种:key是字典id
+ * 第二种:key是字典类型id + 字典编码
+ * 第三种:key是字典类型编码 + 字典编码
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 18:02
+ */
+ @Override
+ public void deleteDictIdCaches(Long dictId) {
+ if (dictId == null) {
+ return;
+ }
+
+ // 获取字典id的详情
+ SysDict sysDict = this.getById(dictId);
+ if (sysDict == null) {
+ return;
+ }
+ this.deleteDictIdCaches(sysDict);
+ }
+
+ /**
+ * 删除字典id对应的缓存,目前有3种缓存
+ *
+ * 第一种:key是字典id
+ * 第二种:key是字典类型id + 字典编码
+ * 第三种:key是字典类型编码 + 字典编码
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 18:02
+ */
+ @Override
+ public void deleteDictIdCaches(SysDict sysDict) {
+ if (sysDict == null) {
+ return;
+ }
+
+ // 删除字典id为key的缓存
+ this.dictInfoCache.remove(String.valueOf(sysDict.getDictId()));
+
+ // 删除字典类型id+字典编码为缓存key的缓存
+ this.dictNameMixedCache.remove(sysDict.getDictTypeId() + sysDict.getDictCode());
+
+ // 获取字典类型对应的字典编码
+ SysDictType sysDictType = dictTypeService.getById(sysDict.getDictTypeId());
+ if (sysDictType != null) {
+ this.dictNameMixedCache.remove(sysDictType.getDictTypeCode() + sysDict.getDictCode());
+ }
+ }
+
/**
* 获取详细信息
*
@@ -520,9 +667,4 @@ public class DictServiceImpl extends ServiceImpl
+ * key是混合类型的,value是字典名称
+ *
+ * key可能有两种,1. 字典类型id+字典编码 2. 字典类型编码+字典编码
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 16:35
+ */
+ @Bean
+ public CacheOperatorApi
+ * key是混合类型的,value是字典名称
+ *
+ * key可能有两种,1. 字典类型id+字典编码 2. 字典类型编码+字典编码
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 15:05
+ */
+ @Bean
+ public CacheOperatorApi
+ * 如果找不到指定层级,返回为空
+ *
+ * @param orgId 指定机构id
+ * @param orgLevelCode 机构层级编码
+ * @return 指定层级的机构的id
+ * @author fengshuonan
+ * @since 2025/1/26 14:45
+ */
+ Long getParentOrgLevel(Long orgId, String orgLevelCode);
+
+ /**
+ * 获取指定机构的,指定层级编码的机构信息
+ *
+ * 例如:获取北京公司/信息中心/技术部,获取技术部的一级机构信息(北京公司),二级机构信息(信息中心)
+ *
+ *
+ * @param hrOrganizationDTO 指定的机构信息
+ * @param levelCode 指定的层级编码,对应的sys_hr_organization_level表的levelCode
+ * @author fengshuonan
+ * @since 2025/2/6 16:39
+ */
+ HrOrganizationDTO getParentOrgByDataScopeType(HrOrganizationDTO hrOrganizationDTO, String levelCode);
+
}
diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysRoleServiceApi.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysRoleServiceApi.java
index ed7be3a64..0891c6155 100644
--- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysRoleServiceApi.java
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/SysRoleServiceApi.java
@@ -25,6 +25,7 @@
package cn.stylefeng.roses.kernel.sys.api;
import cn.stylefeng.roses.kernel.sys.api.pojo.role.SysRoleDTO;
+import cn.stylefeng.roses.kernel.sys.api.pojo.role.SysRoleTreeDTO;
import java.util.List;
@@ -80,4 +81,12 @@ public interface SysRoleServiceApi {
*/
List
+ * 优先从缓存获取数据,进行名称的获取
*
* @author fengshuonan
* @since 2024-01-16 20:10
diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/OrgDetailFormatProcess.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/OrgDetailFormatProcess.java
index 013164161..aabc135c3 100644
--- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/OrgDetailFormatProcess.java
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/OrgDetailFormatProcess.java
@@ -9,6 +9,8 @@ import java.util.HashMap;
/**
* 组织机构id格式化为获取机构的详情
+ *
+ * 优先从缓存获取数据,进行名称的获取
*
* @author fengshuonan
* @since 2023/7/17 15:36
diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/OrgFullPathNameFormatProcess.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/OrgFullPathNameFormatProcess.java
new file mode 100644
index 000000000..8e009a404
--- /dev/null
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/OrgFullPathNameFormatProcess.java
@@ -0,0 +1,37 @@
+package cn.stylefeng.roses.kernel.sys.api.format;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.extra.spring.SpringUtil;
+import cn.stylefeng.roses.kernel.rule.format.BaseSimpleFieldFormatProcess;
+import cn.stylefeng.roses.kernel.sys.api.OrganizationServiceApi;
+
+/**
+ * 快速获取组织机构的全路径组织机构名称
+ *
+ * 通过缓存加快名称获取
+ *
+ * @author fengshuonan
+ * @since 2025/1/11 0:11
+ */
+public class OrgFullPathNameFormatProcess extends BaseSimpleFieldFormatProcess {
+
+ @Override
+ public Class> getItemClass() {
+ return Long.class;
+ }
+
+ @Override
+ public Object simpleItemFormat(Object businessId) {
+
+ if (businessId == null) {
+ return null;
+ }
+
+ Long orgId = Convert.toLong(businessId);
+
+ OrganizationServiceApi organizationServiceApi = SpringUtil.getBean(OrganizationServiceApi.class);
+
+ return organizationServiceApi.getOrgTotalPathName(orgId);
+ }
+
+}
diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/OrgNameFormatProcess.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/OrgNameFormatProcess.java
index 2ca187704..f4c4cde58 100644
--- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/OrgNameFormatProcess.java
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/OrgNameFormatProcess.java
@@ -7,6 +7,8 @@ import cn.stylefeng.roses.kernel.sys.api.OrganizationServiceApi;
/**
* 获取机构名称的处理
+ *
+ * 采用组织机构详情缓存,加速获取
*
* @author fengshuonan
* @since 2023/7/14 16:46
diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/PositionNameFormatProcess.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/PositionNameFormatProcess.java
index 7995736d4..177d544f7 100644
--- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/PositionNameFormatProcess.java
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/PositionNameFormatProcess.java
@@ -7,6 +7,8 @@ import cn.stylefeng.roses.kernel.sys.api.PositionServiceApi;
/**
* 职位名称的格式化
+ *
+ * 采用职位名称缓存,加速获取
*
* @author fengshuonan
* @since 2023/7/15 21:58
diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/RoleNameFormatProcess.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/RoleNameFormatProcess.java
index 2d36ccfae..07c837b69 100644
--- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/RoleNameFormatProcess.java
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/RoleNameFormatProcess.java
@@ -7,6 +7,8 @@ import cn.stylefeng.roses.kernel.sys.api.SysRoleServiceApi;
/**
* JSON响应对角色id的转化
+ *
+ * 通过缓存加快角色名称获取
*
* @author fengshuonan
* @since 2023/5/4 21:20
diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/UserNameFormatProcess.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/UserNameFormatProcess.java
index f19bf3f05..9d8b4a3b1 100644
--- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/UserNameFormatProcess.java
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/format/UserNameFormatProcess.java
@@ -7,6 +7,8 @@ import cn.stylefeng.roses.kernel.sys.api.SysUserServiceApi;
/**
* 用户姓名包装
+ *
+ * 优先从缓存读取,再从数据库读取
*
* @author fengshuonan
* @since 2023/6/16 22:26
diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/org/HrOrganizationDTO.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/org/HrOrganizationDTO.java
index dcf90f130..40d39bbe9 100644
--- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/org/HrOrganizationDTO.java
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/org/HrOrganizationDTO.java
@@ -44,6 +44,12 @@ public class HrOrganizationDTO {
@ChineseDescription("主键")
private Long orgId;
+ /**
+ * 组织机构类型:1-公司,2-部门
+ */
+ @ChineseDescription("组织机构类型:1-公司,2-部门")
+ private Integer orgType;
+
/**
* 父id
*/
diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/org/OrganizationLevelRequest.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/org/OrganizationLevelRequest.java
new file mode 100644
index 000000000..641a70128
--- /dev/null
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/pojo/org/OrganizationLevelRequest.java
@@ -0,0 +1,29 @@
+package cn.stylefeng.roses.kernel.sys.api.pojo.org;
+
+import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
+import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
+import cn.stylefeng.roses.kernel.sys.api.entity.OrganizationLevel;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * 组织机构层级封装类
+ *
+ * @author fengshuonan
+ * @since 2025/01/22 09:44
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class OrganizationLevelRequest extends BaseRequest {
+
+ /**
+ * 组织机构层级不能为空
+ */
+ @NotEmpty(message = "组织机构层级不能为空", groups = edit.class)
+ @ChineseDescription("组织机构层级")
+ private List
+ * 用在用户绑定角色上,选中的则是绑定的
+ */
+ @ChineseDescription("是否选中")
+ private Boolean checkedFlag = false;
+
+ /**
+ * 子节点
+ */
+ @ChineseDescription("子节点")
+ private List
+ * key是组织机构id,value是组织机构详情
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 11:47
+ */
+public class SysOrgInfoMemoryCache extends AbstractMemoryCacheOperator
+ * key是组织机构id,value是组织机构详情
+ *
+ * @author fengshuonan
+ * @since 2023/7/14 1:06
+ */
+public class SysOrgInfoRedisCache extends AbstractRedisCacheOperator
@@ -47,12 +52,15 @@ public class OrgSubFlagClearListener {
* @since 2023/7/14 18:40
*/
@BusinessListener(businessCode = OrgConstants.EDIT_ORG_EVENT)
- public void editOrgCallback() {
+ public void editOrgCallback(Long orgId) {
// 获取所有主键
Collection
+ * 根据父级id、定位id、公司筛选标识等查询条件进行查询
+ *
+ * @author fengshuonan
+ * @since 2025/1/26 20:13
+ */
+ public static LambdaQueryWrapper
+ * 根据名称、状态、指定机构id等参数
+ *
+ * @author fengshuonan
+ * @since 2025/1/26 20:20
+ */
+ public static LambdaQueryWrapper
+ * key是职位id,value是职位名称
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 14:10
+ */
+public class PositionMemoryCache extends AbstractMemoryCacheOperator
+ * key是职位id,value是职位名称
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 14:10
+ */
+public class PositionRedisCache extends AbstractRedisCacheOperator
+ * key是用户id,value是用户
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 11:05
+ */
+public class UserInfoRedisCache extends AbstractRedisCacheOperator
+ * 已经绑定的角色会checked
+ *
+ * @author fengshuonan
+ * @since 2025/1/24 14:33
+ */
+ @GetResource(name = "获取用户指定机构下的业务角色树", path = "/sysRoleAssign/v2/getCompanyBusinessRoleTree")
+ public ResponseData
+ * 已经绑定的角色会checked
+ *
+ * @author fengshuonan
+ * @since 2025/1/24 14:44
+ */
+ List
+ * key是角色id,value是角色名称
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 14:33
+ */
+public class RoleNameMemoryCache extends AbstractMemoryCacheOperator
+ * key是角色id,value是角色名称
+ *
+ * @author fengshuonan
+ * @since 2025/1/10 14:33
+ */
+public class RoleNameRedisCache extends AbstractRedisCacheOperator
+ * 用在权限分配界面,左侧的角色列表
+ *
+ * @author fengshuonan
+ * @since 2025/2/5 15:53
+ */
+ @GetResource(name = "获取角色分类和角色组成的树", path = "/permission/getRoleCategoryAndRoleTree")
+ public ResponseData> list(OrganizationLevelRequest organizationLevelRequest) {
+ return new SuccessResponseData<>(organizationLevelService.findList(organizationLevelRequest));
+ }
+
+ /**
+ * 添加组织机构层级
+ *
+ * @author fengshuonan
+ * @since 2025/01/22 09:44
+ */
+ @PostResource(name = "添加组织机构层级", path = "/organizationLevel/updateTotal")
+ public ResponseData> add(@RequestBody @Validated(OrganizationLevelRequest.edit.class) OrganizationLevelRequest organizationLevelRequest) {
+ organizationLevelService.updateTotal(organizationLevelRequest);
+ return new SuccessResponseData<>();
+ }
+
+}
diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/entity/HrOrganization.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/entity/HrOrganization.java
index ca43e565e..b7ef43601 100644
--- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/entity/HrOrganization.java
+++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/entity/HrOrganization.java
@@ -2,7 +2,8 @@ package cn.stylefeng.roses.kernel.sys.modular.org.entity;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseExpandFieldEntity;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
-import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractTreeNode;
+import cn.stylefeng.roses.kernel.rule.tree.factory.base.AbstractSortedTreeNode;
+import cn.stylefeng.roses.kernel.sys.api.entity.OrganizationLevel;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -19,7 +20,7 @@ import java.util.List;
@TableName(value = "sys_hr_organization", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
-public class HrOrganization extends BaseExpandFieldEntity implements AbstractTreeNode
> getUserOrgList(@RequestParam("userId") Long userId) {
+ List
> getCompanyBusinessRoleTree(@RequestParam("userId") Long userId, @RequestParam("orgId") Long orgId) {
+ List
> getCompanyRoleTree(@RequestParam("userId") Long userId, @RequestParam("orgId") Long orgId) {
+ List
> getRoleCategoryAndRoleTree() {
+ return new SuccessResponseData<>(sysRoleService.roleCategoryAndRoleTreeList(RoleTypeEnum.BUSINESS_ROLE.getCode(), null));
+ }
+
}
diff --git a/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/controller/RoleCategoryController.java b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/controller/RoleCategoryController.java
new file mode 100644
index 000000000..d041bad68
--- /dev/null
+++ b/kernel-s-system/system-business-permission/src/main/java/cn/stylefeng/roses/kernel/sys/modular/role/controller/RoleCategoryController.java
@@ -0,0 +1,90 @@
+package cn.stylefeng.roses.kernel.sys.modular.role.controller;
+
+import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest;
+import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
+import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
+import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
+import cn.stylefeng.roses.kernel.sys.modular.role.entity.RoleCategory;
+import cn.stylefeng.roses.kernel.sys.modular.role.pojo.request.RoleCategoryRequest;
+import cn.stylefeng.roses.kernel.sys.modular.role.service.RoleCategoryService;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 角色分类控制器
+ *
+ * @author fengshuonan
+ * @since 2025/01/22 17:40
+ */
+@RestController
+@ApiResource(name = "角色分类")
+public class RoleCategoryController {
+
+ @Resource
+ private RoleCategoryService roleCategoryService;
+
+ /**
+ * 获取角色分类树
+ *
+ * @author fengshuonan
+ * @since 2025/1/22 17:45
+ */
+ @GetResource(name = "获取角色分类树", path = "/roleCategory/treeList")
+ public ResponseData
> treeList(@Validated(BaseRequest.list.class) RoleCategoryRequest roleCategoryRequest) {
+ return new SuccessResponseData<>(roleCategoryService.treeList(roleCategoryRequest));
+ }
+
+ /**
+ * 添加角色分类
+ *
+ * @author fengshuonan
+ * @since 2025/01/22 17:40
+ */
+ @PostResource(name = "添加角色分类", path = "/roleCategory/add")
+ public ResponseData