【8.0】【sys】更新用户审批人的获取

pull/57/head
fengshuonan 2023-07-15 23:53:42 +08:00
parent 6464f90ba0
commit 2cffa63ff9
6 changed files with 258 additions and 1 deletions

View File

@ -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 001
* @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 001
* @param detectModeEnum
* @return id
* @author fengshuonan
* @since 2022/9/18 14:52
*/
List<Long> getDeptOrgApprover(Long deptId, Integer orgApproverType, Integer parentLevel, DetectModeEnum detectModeEnum);
}

View File

@ -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 00
* @param detectModeEnum
* @return id
* @author fengshuonan
* @since 2022/9/18 15:02
*/
Long getParentLevelOrgId(Long orgId, Integer parentLevelNum, DetectModeEnum detectModeEnum);
}

View File

@ -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;
}
}

View File

@ -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 {
/**
*

View File

@ -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

View File

@ -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 00
* @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);
}
}