mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-26 17:21:53 +08:00
仿钉钉流程设计- 连续多级部门负责人, 支持选多个部门
This commit is contained in:
parent
0d738fa397
commit
20c97d1441
@ -1,5 +1,6 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.strategy;
|
package cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.strategy;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy;
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy;
|
||||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||||
@ -7,6 +8,7 @@ import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
|||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -26,7 +28,7 @@ public abstract class BpmTaskCandidateAbstractDeptLeaderStrategy implements BpmT
|
|||||||
* 获取上级部门的负责人
|
* 获取上级部门的负责人
|
||||||
*
|
*
|
||||||
* @param assignDept 指定部门
|
* @param assignDept 指定部门
|
||||||
* @param level 第几级
|
* @param level 第几级
|
||||||
* @return 部门负责人 Id
|
* @return 部门负责人 Id
|
||||||
*/
|
*/
|
||||||
protected Long getAssignLevelDeptLeaderId(DeptRespDTO assignDept, Integer level) {
|
protected Long getAssignLevelDeptLeaderId(DeptRespDTO assignDept, Integer level) {
|
||||||
@ -48,26 +50,29 @@ public abstract class BpmTaskCandidateAbstractDeptLeaderStrategy implements BpmT
|
|||||||
/**
|
/**
|
||||||
* 获取连续上级部门的负责人, 包含指定部门的负责人
|
* 获取连续上级部门的负责人, 包含指定部门的负责人
|
||||||
*
|
*
|
||||||
* @param assignDept 指定部门
|
* @param assignDeptIds 指定部门 Ids
|
||||||
* @param level 第几级
|
* @param level 第几级
|
||||||
* @return 连续部门负责人 Id
|
* @return 连续部门负责人 Id
|
||||||
*/
|
*/
|
||||||
protected Set<Long> getMultiLevelDeptLeaderIds(DeptRespDTO assignDept, Integer level){
|
protected Set<Long> getMultiLevelDeptLeaderIds(List<Long> assignDeptIds, Integer level) {
|
||||||
Assert.isTrue(level > 0, "level 必须大于 0");
|
Assert.isTrue(level > 0, "level 必须大于 0");
|
||||||
if (assignDept == null) {
|
if (CollUtil.isEmpty(assignDeptIds)) {
|
||||||
return Collections.emptySet();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
Set<Long> deptLeaderIds = new LinkedHashSet<>(); // 保证有序
|
Set<Long> deptLeaderIds = new LinkedHashSet<>(); // 保证有序
|
||||||
DeptRespDTO dept = assignDept;
|
DeptRespDTO dept;
|
||||||
for (int i = 0; i < level; i++) {
|
for (Long deptId : assignDeptIds) {
|
||||||
if (dept.getLeaderUserId() != null) {
|
dept = deptApi.getDept(deptId);
|
||||||
deptLeaderIds.add(dept.getLeaderUserId());
|
for (int i = 0; i < level; i++) {
|
||||||
|
if (dept.getLeaderUserId() != null) {
|
||||||
|
deptLeaderIds.add(dept.getLeaderUserId());
|
||||||
|
}
|
||||||
|
DeptRespDTO parentDept = deptApi.getDept(dept.getParentId());
|
||||||
|
if (parentDept == null) { // 找不到父级部门. 已经到了最高层级了
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dept = parentDept;
|
||||||
}
|
}
|
||||||
DeptRespDTO parentDept = deptApi.getDept(dept.getParentId());
|
|
||||||
if (parentDept == null) { // 找不到父级部门. 已经到了最高层级了
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
dept = parentDept;
|
|
||||||
}
|
}
|
||||||
return deptLeaderIds;
|
return deptLeaderIds;
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.common.util.string.StrUtils;
|
|||||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy;
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy;
|
||||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum;
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum;
|
||||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
|
||||||
import org.flowable.engine.delegate.DelegateExecution;
|
import org.flowable.engine.delegate.DelegateExecution;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -32,22 +31,21 @@ public class BpmTaskCandidateMultiLevelDeptLeaderStrategy extends BpmTaskCandida
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void validateParam(String param) {
|
public void validateParam(String param) {
|
||||||
// 参数格式: ,分割。 前面一个指定指定部门Id, 后面一个是部门的层级
|
// 参数格式: ,分割。前面的部门Id. 可以为多个。 最后一个为部门层级
|
||||||
List<Long> params = StrUtils.splitToLong(param, ",");
|
List<Long> params = StrUtils.splitToLong(param, ",");
|
||||||
Assert.isTrue(params.size() == 2, "参数格式不匹配");
|
List<List<Long>> splitList = CollUtil.split(params, params.size() - 1);
|
||||||
deptApi.validateDeptList(CollUtil.toList(params.get(0)));
|
Assert.isTrue(splitList.size() == 2, "参数格式不匹配");
|
||||||
Assert.isTrue(params.get(1) > 0, "部门层级必须大于 0");
|
deptApi.validateDeptList(splitList.get(0));
|
||||||
|
Assert.isTrue(splitList.get(1).get(0) > 0, "部门层级必须大于 0");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<Long> calculateUsers(DelegateExecution execution, String param) {
|
public Set<Long> calculateUsers(DelegateExecution execution, String param) {
|
||||||
// 参数格式: ,分割。 前面一个指定指定部门Id, 后面一个是审批的层级
|
// 参数格式: ,分割。前面的部门Id. 可以为多个。 最后一个为部门层级
|
||||||
List<Long> params = StrUtils.splitToLong(param, ",");
|
List<Long> params = StrUtils.splitToLong(param, ",");
|
||||||
// TODO @芋艿 是否要支持多个部门。 是不是这种场景,一个部门就可以了
|
List<List<Long>> splitList = CollUtil.split(params, params.size() - 1);
|
||||||
Long deptId = params.get(0);
|
Long level = splitList.get(1).get(0);
|
||||||
Long level = params.get(1);
|
return getMultiLevelDeptLeaderIds(splitList.get(0), level.intValue());
|
||||||
DeptRespDTO dept = deptApi.getDept(deptId);
|
|
||||||
return getMultiLevelDeptLeaderIds(dept, level.intValue());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,11 @@ import org.flowable.engine.runtime.ProcessInstance;
|
|||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static cn.hutool.core.collection.ListUtil.toList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发起人连续多级部门的负责人 {@link BpmTaskCandidateStrategy} 实现类
|
* 发起人连续多级部门的负责人 {@link BpmTaskCandidateStrategy} 实现类
|
||||||
*
|
*
|
||||||
@ -52,9 +55,11 @@ public class BpmTaskCandidateStartUserMultiLevelDeptLeaderStrategy extends BpmTa
|
|||||||
// 获得流程发起人
|
// 获得流程发起人
|
||||||
ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId());
|
ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId());
|
||||||
Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId());
|
Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId());
|
||||||
|
|
||||||
DeptRespDTO dept = getStartUserDept(startUserId);
|
DeptRespDTO dept = getStartUserDept(startUserId);
|
||||||
return getMultiLevelDeptLeaderIds(dept, Integer.valueOf(param)); // 参数是部门的层级
|
if (dept == null) {
|
||||||
|
return Collections.emptySet();
|
||||||
|
}
|
||||||
|
return getMultiLevelDeptLeaderIds(toList(dept.getId()), Integer.valueOf(param)); // 参数是部门的层级
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user