diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/OrgApproverServiceApi.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/OrgApproverServiceApi.java
new file mode 100644
index 000000000..f498b9e72
--- /dev/null
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/OrgApproverServiceApi.java
@@ -0,0 +1,43 @@
+package cn.stylefeng.roses.kernel.sys.api;
+
+import cn.stylefeng.roses.kernel.sys.api.enums.org.DetectModeEnum;
+
+import java.util.List;
+
+/**
+ * 组织机构审批人获取相关的方法
+ *
+ * @author fengshuonan
+ * @since 2023/5/26 10:35
+ */
+public interface OrgApproverServiceApi {
+
+ /**
+ * 获取指定用户所属主部门的审批人列表
+ *
+ * 用户可能有多组组织机构id,所以这里只取主部门
+ *
+ * @param userId 指定用户id
+ * @param orgApproverType 审批人类型
+ * @param parentLevel 从0开始,0为获取指定用户同部门的领导,1为上一级部门的领导,以此类推
+ * @param detectModeEnum 指定查找的模式,自上而下找对应的负责人,还是自下而上
+ * @return 用户的部门负责人id集合
+ * @author fengshuonan
+ * @since 2022/9/18 14:52
+ */
+ List getUserMainOrgApprover(Long userId, Integer orgApproverType, Integer parentLevel, DetectModeEnum detectModeEnum);
+
+ /**
+ * 获取指定部门的部门负责人
+ *
+ * @param deptId 指定部门id
+ * @param orgApproverType 审批人类型
+ * @param parentLevel 从0开始,0为获取指定同部门的领导,1为上一级部门的领导,以此类推
+ * @param detectModeEnum 指定查找的模式,自上而下找对应的负责人,还是自下而上
+ * @return 负责人id集合
+ * @author fengshuonan
+ * @since 2022/9/18 14:52
+ */
+ List getDeptOrgApprover(Long deptId, Integer orgApproverType, Integer parentLevel, DetectModeEnum detectModeEnum);
+
+}
diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/OrganizationServiceApi.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/OrganizationServiceApi.java
index 593806564..6656c8dd3 100644
--- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/OrganizationServiceApi.java
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/OrganizationServiceApi.java
@@ -1,5 +1,7 @@
package cn.stylefeng.roses.kernel.sys.api;
+import cn.stylefeng.roses.kernel.sys.api.enums.org.DetectModeEnum;
+
/**
* 组织机构信息的api
*
@@ -16,4 +18,19 @@ public interface OrganizationServiceApi {
*/
String getOrgNameById(Long orgId);
+ /**
+ * 获取指定组织机构的上级组织机构是什么
+ *
+ * 自下而上:逐级向上获取直到获取到最高级
+ * 自上而下:逐级向下获取,直到获取到本层机构
+ *
+ * @param orgId 指定机构id
+ * @param parentLevelNum 上级机构的层级数,从0开始,0代表直接返回本部门
+ * @param detectModeEnum 自上而下还是自下而上
+ * @return 上级机构的id
+ * @author fengshuonan
+ * @since 2022/9/18 15:02
+ */
+ Long getParentLevelOrgId(Long orgId, Integer parentLevelNum, DetectModeEnum detectModeEnum);
+
}
diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/enums/org/DetectModeEnum.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/enums/org/DetectModeEnum.java
new file mode 100644
index 000000000..c0cd4811b
--- /dev/null
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/enums/org/DetectModeEnum.java
@@ -0,0 +1,63 @@
+package cn.stylefeng.roses.kernel.sys.api.enums.org;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
+import cn.stylefeng.roses.kernel.rule.base.ReadableEnum;
+import lombok.Getter;
+
+/**
+ * 指定查找模式
+ *
+ * @author fengshuonan
+ * @since 2022/10/1 18:02
+ */
+@Getter
+public enum DetectModeEnum implements ReadableEnum {
+
+ /**
+ * 自下而上
+ *
+ * 从下往上一级一级找
+ */
+ TO_TOP(1, "自下而上"),
+
+ /**
+ * 自上而下
+ *
+ * 从最高级开始一级一级往下找
+ */
+ TO_DOWN(2, "自上而下");
+
+ private final Integer code;
+
+ private final String name;
+
+ DetectModeEnum(Integer code, String name) {
+ this.code = code;
+ this.name = name;
+ }
+
+ @Override
+ public Object getKey() {
+ return code;
+ }
+
+ @Override
+ public Object getName() {
+ return name;
+ }
+
+ @Override
+ public DetectModeEnum parseToEnum(String originValue) {
+ if (ObjectUtil.isEmpty(originValue)) {
+ return null;
+ }
+ for (DetectModeEnum value : DetectModeEnum.values()) {
+ if (value.code.equals(Convert.toInt(originValue))) {
+ return value;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/HrOrgApproverService.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/HrOrgApproverService.java
index 9dd54bd5a..6c0fba6ff 100644
--- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/HrOrgApproverService.java
+++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/HrOrgApproverService.java
@@ -1,6 +1,7 @@
package cn.stylefeng.roses.kernel.sys.modular.org.service;
import cn.stylefeng.roses.kernel.rule.pojo.dict.SimpleDict;
+import cn.stylefeng.roses.kernel.sys.api.OrgApproverServiceApi;
import cn.stylefeng.roses.kernel.sys.modular.org.entity.HrOrgApprover;
import cn.stylefeng.roses.kernel.sys.modular.org.pojo.request.HrOrgApproverRequest;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -13,7 +14,7 @@ import java.util.List;
* @author fengshuonan
* @date 2023/06/10 21:23
*/
-public interface HrOrgApproverService extends IService {
+public interface HrOrgApproverService extends IService, OrgApproverServiceApi {
/**
* 删除
diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrgApproverServiceImpl.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrgApproverServiceImpl.java
index a9f9d8181..f37563727 100644
--- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrgApproverServiceImpl.java
+++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrgApproverServiceImpl.java
@@ -5,7 +5,11 @@ import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.dict.api.DictApi;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import cn.stylefeng.roses.kernel.rule.pojo.dict.SimpleDict;
+import cn.stylefeng.roses.kernel.sys.api.OrganizationServiceApi;
+import cn.stylefeng.roses.kernel.sys.api.SysUserOrgServiceApi;
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveOrgCallbackApi;
+import cn.stylefeng.roses.kernel.sys.api.enums.org.DetectModeEnum;
+import cn.stylefeng.roses.kernel.sys.api.pojo.user.UserOrgDTO;
import cn.stylefeng.roses.kernel.sys.modular.org.constants.ApproverConstants;
import cn.stylefeng.roses.kernel.sys.modular.org.entity.HrOrgApprover;
import cn.stylefeng.roses.kernel.sys.modular.org.enums.HrOrgApproverExceptionEnum;
@@ -37,6 +41,12 @@ public class HrOrgApproverServiceImpl extends ServiceImpl wrapper = this.createWrapper(hrOrgApproverRequest);
@@ -138,6 +148,46 @@ public class HrOrgApproverServiceImpl extends ServiceImpl getUserMainOrgApprover(Long userId, Integer orgApproverType, Integer parentLevel, DetectModeEnum detectModeEnum) {
+
+ // 获取用户的所属机构id
+ UserOrgDTO userMainOrgInfo = sysUserOrgServiceApi.getUserMainOrgInfo(userId);
+ Long orgId = userMainOrgInfo.getDeptId();
+
+ if (ObjectUtil.isEmpty(orgId)) {
+ orgId = userMainOrgInfo.getCompanyId();
+ }
+
+ // 用户没有机构,则返回空
+ if (ObjectUtil.isEmpty(orgId)) {
+ return new ArrayList<>();
+ }
+
+ // 获取指定部门的负责人id信息
+ return getDeptOrgApprover(orgId, orgApproverType, parentLevel, detectModeEnum);
+ }
+
+ @Override
+ public List getDeptOrgApprover(Long deptId, Integer orgApproverType, Integer parentLevel, DetectModeEnum detectModeEnum) {
+
+ // 根据参数的级别,获取组织机构的父级机构
+ Long parentLevelOrgId = this.organizationServiceApi.getParentLevelOrgId(deptId, parentLevel, detectModeEnum);
+
+ // 如果没有上级组织机构,则直接返回为空
+ if (ObjectUtil.isEmpty(parentLevelOrgId)) {
+ return new ArrayList<>();
+ }
+
+ // 获取该组织机构的指定类型的负责人
+ LambdaQueryWrapper hrOrgApproverLambdaQueryWrapper = new LambdaQueryWrapper<>();
+ hrOrgApproverLambdaQueryWrapper.eq(HrOrgApprover::getOrgId, parentLevelOrgId);
+ hrOrgApproverLambdaQueryWrapper.eq(HrOrgApprover::getOrgApproverType, orgApproverType);
+ List userList = this.list(hrOrgApproverLambdaQueryWrapper);
+
+ return userList.stream().map(HrOrgApprover::getUserId).collect(Collectors.toList());
+ }
+
@Override
public void validateHaveOrgBind(Set beRemovedOrgIdList) {
// none
diff --git a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java
index a33964939..cb22269b0 100644
--- a/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java
+++ b/kernel-s-system/system-business-hr/src/main/java/cn/stylefeng/roses/kernel/sys/modular/org/service/impl/HrOrganizationServiceImpl.java
@@ -2,6 +2,7 @@ package cn.stylefeng.roses.kernel.sys.modular.org.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.spring.SpringUtil;
@@ -18,6 +19,7 @@ import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import cn.stylefeng.roses.kernel.rule.tree.factory.DefaultTreeBuildFactory;
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveOrgCallbackApi;
import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants;
+import cn.stylefeng.roses.kernel.sys.api.enums.org.DetectModeEnum;
import cn.stylefeng.roses.kernel.sys.api.enums.org.OrgTypeEnum;
import cn.stylefeng.roses.kernel.sys.api.exception.enums.OrgExceptionEnum;
import cn.stylefeng.roses.kernel.sys.api.pojo.org.CompanyDeptDTO;
@@ -466,6 +468,15 @@ public class HrOrganizationServiceImpl extends ServiceImpl parentOrgIdList = new ArrayList<>();
+ for (String orgIdItem : orgParentIdList) {
+ if (!TreeConstants.DEFAULT_PARENT_ID.toString().equals(orgIdItem)) {
+ parentOrgIdList.add(orgIdItem);
+ }
+ }
+
+ // 根据请求参数,需要从parentOrgIdList获取的下标
+ int needGetArrayIndex = parentLevelNum - 1;
+
+ // parentOrgIdList最大能提供的下标
+ int maxCanGetIndex = parentOrgIdList.size() - 1;
+
+ // 如果没有最顶级的上级,则他本身就是最顶级上级
+ if (maxCanGetIndex < 0) {
+ return orgId;
+ }
+
+ // 根据参数传参,进行获取上级的操作
+ String orgIdString;
+ if (needGetArrayIndex <= (maxCanGetIndex)) {
+ orgIdString = parentOrgIdList.get(needGetArrayIndex);
+ } else {
+ // 如果需要获取的下标,大于了最大下标
+ if (reverse) {
+ orgIdString = parentOrgIdList.get(maxCanGetIndex);
+ } else {
+ return orgId;
+ }
+ }
+ return Long.valueOf(orgIdString);
+ }
+
}
\ No newline at end of file