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