mirror of https://gitee.com/stylefeng/roses
【8.0】【sys】更新用户审批人的获取
parent
6464f90ba0
commit
2cffa63ff9
|
@ -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 {
|
||||
|
||||
/**
|
||||
* 获取指定用户所属主部门的审批人列表
|
||||
* <p>
|
||||
* 用户可能有多组组织机构id,所以这里只取主部门
|
||||
*
|
||||
* @param userId 指定用户id
|
||||
* @param orgApproverType 审批人类型
|
||||
* @param parentLevel 从0开始,0为获取指定用户同部门的领导,1为上一级部门的领导,以此类推
|
||||
* @param detectModeEnum 指定查找的模式,自上而下找对应的负责人,还是自下而上
|
||||
* @return 用户的部门负责人id集合
|
||||
* @author fengshuonan
|
||||
* @since 2022/9/18 14:52
|
||||
*/
|
||||
List<Long> 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<Long> getDeptOrgApprover(Long deptId, Integer orgApproverType, Integer parentLevel, DetectModeEnum detectModeEnum);
|
||||
|
||||
}
|
|
@ -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);
|
||||
|
||||
/**
|
||||
* 获取指定组织机构的上级组织机构是什么
|
||||
* <p>
|
||||
* 自下而上:逐级向上获取直到获取到最高级
|
||||
* 自上而下:逐级向下获取,直到获取到本层机构
|
||||
*
|
||||
* @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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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<DetectModeEnum> {
|
||||
|
||||
/**
|
||||
* 自下而上
|
||||
* <p>
|
||||
* 从下往上一级一级找
|
||||
*/
|
||||
TO_TOP(1, "自下而上"),
|
||||
|
||||
/**
|
||||
* 自上而下
|
||||
* <p>
|
||||
* 从最高级开始一级一级往下找
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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<HrOrgApprover> {
|
||||
public interface HrOrgApproverService extends IService<HrOrgApprover>, OrgApproverServiceApi {
|
||||
|
||||
/**
|
||||
* 删除
|
||||
|
|
|
@ -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<HrOrgApproverMapper, H
|
|||
@Resource
|
||||
private DictApi dictApi;
|
||||
|
||||
@Resource
|
||||
private OrganizationServiceApi organizationServiceApi;
|
||||
|
||||
@Resource
|
||||
private SysUserOrgServiceApi sysUserOrgServiceApi;
|
||||
|
||||
@Override
|
||||
public void del(HrOrgApproverRequest hrOrgApproverRequest) {
|
||||
LambdaQueryWrapper<HrOrgApprover> wrapper = this.createWrapper(hrOrgApproverRequest);
|
||||
|
@ -138,6 +148,46 @@ public class HrOrgApproverServiceImpl extends ServiceImpl<HrOrgApproverMapper, H
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Long> 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<Long> 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<HrOrgApprover> hrOrgApproverLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||
hrOrgApproverLambdaQueryWrapper.eq(HrOrgApprover::getOrgId, parentLevelOrgId);
|
||||
hrOrgApproverLambdaQueryWrapper.eq(HrOrgApprover::getOrgApproverType, orgApproverType);
|
||||
List<HrOrgApprover> userList = this.list(hrOrgApproverLambdaQueryWrapper);
|
||||
|
||||
return userList.stream().map(HrOrgApprover::getUserId).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validateHaveOrgBind(Set<Long> beRemovedOrgIdList) {
|
||||
// none
|
||||
|
|
|
@ -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<HrOrganizationMapper,
|
|||
return OrgConstants.NONE_PARENT_ORG;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getParentLevelOrgId(Long orgId, Integer parentLevelNum, DetectModeEnum detectModeEnum) {
|
||||
if (DetectModeEnum.TO_TOP.equals(detectModeEnum)) {
|
||||
return calcParentOrgId(orgId, parentLevelNum, true);
|
||||
} else {
|
||||
return calcParentOrgId(orgId, parentLevelNum, false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取信息
|
||||
*
|
||||
|
@ -609,4 +620,76 @@ public class HrOrganizationServiceImpl extends ServiceImpl<HrOrganizationMapper,
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算获取上级组织机构id
|
||||
*
|
||||
* @param orgId 指定机构id
|
||||
* @param parentLevelNum 上级机构的层级数,从0开始,0代表不计算直接返回本身
|
||||
* @param reverse 是否反转,true-代表自下而上计算,false-代表自上而下计算
|
||||
* @author fengshuonan
|
||||
* @since 2022/10/1 11:45
|
||||
*/
|
||||
private Long calcParentOrgId(Long orgId, Integer parentLevelNum, boolean reverse) {
|
||||
|
||||
if (ObjectUtil.isEmpty(orgId) || ObjectUtil.isEmpty(parentLevelNum)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 如果上级层数为0,则直接返回参数的orgId,代表同级别组织机构
|
||||
if (parentLevelNum == 0) {
|
||||
return orgId;
|
||||
}
|
||||
|
||||
// 获取当前部门的所有父级id
|
||||
HrOrganization hrOrganization = this.getById(orgId);
|
||||
if (hrOrganization == null || StrUtil.isEmpty(hrOrganization.getOrgPids())) {
|
||||
return null;
|
||||
}
|
||||
String orgParentIdListStr = hrOrganization.getOrgPids();
|
||||
|
||||
// 去掉中括号符号
|
||||
orgParentIdListStr = orgParentIdListStr.replaceAll("\\[", "");
|
||||
orgParentIdListStr = orgParentIdListStr.replaceAll("]", "");
|
||||
|
||||
// 获取所有上级id列表
|
||||
String[] orgParentIdList = orgParentIdListStr.split(",");
|
||||
if (reverse) {
|
||||
orgParentIdList = ArrayUtil.reverse(orgParentIdList);
|
||||
}
|
||||
|
||||
// 先删掉id为-1的机构,因为-1是不存在的
|
||||
ArrayList<String> 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);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue