如何根据预测流程节点信息判断是否跳过当前审批节点

关键词:工作流、跳过、审批节点
一、需求
背景:在采购订货系统中,工作流流程审批存在这样的审批规范:
如果某个用户a是某个审批节点审批人 ,同时后面还有审批节点的审批人是用户a,并且后面存在某个审批节点的审批人b是他的下属,那么跳过当前审批节点
如果某个用户a是某个审批节点审批人 ,同时后面没有审批节点的审批人是用户a,或者后面不存在某个审批节点的审批人b是他的下属,则保留当前审批审批节点。
场景:在工作流审批时,有如下X-Y-Z-M三个审批节点,审批人设置为如下图。第一级审批人、第三级审批人和第四级节点是 一样的。
如果创建人是第二级审批人(张三)的领导时,第一级和第四级审批节点跳过,保留第二级审批节点和第三级审批节点。
如果创建人不是第二级审批人(张三)的领导时,保留第一级审批和第二级审批节点,第三节和第四级审批节点跳过。

二、思路与方案
(1)思路:
目前,工作流系统支持存在多个审批节点时,要么是只能跳过前面相同审批人节点(审批人后审控制介绍 (kingdee.com))。要么只能跳过后面所有系统审批人节点(自动审批的四种场景 (kdcloud.com))。要么是按照当前表单数据作为条件是否跳过当前审批节点。并不能按照当前节点之后的审批信息去判断是否跳过某个审批节点。因此需要借助二开插件实现如需求中描述的场景。
(2)方案:
在工作流审批的各个节点添加工作流插件,在条件事件hasTrueCondition中调用流程预测接口WorkflowServiceHelper.getPreComputorRecord去获取出每个审批节点的审批人,然后判断后面的审批人中是否存在某个审批人是当前审批人的下属,并且还存在其他审批节点的审批人和当前节点审批人是相同的,则跳过当前审批节点。需要注意的是,调用流程预测接口时,又会进入条件事件hasTrueCondition,导致死循环。因此要在hasTrueCondition做条件判断如果是预测接口进入的工作流插件,直接不走插件的处理逻辑。
三、实现过程
1、控制领导在下属后面去审批
public class ReqWorkflowPlugin implements Plugin, IWorkflowPlugin {
@Override
public boolean hasTrueCondition(AgentExecution execution) {
if(execution instanceof PreComputatorExecutionEntityImpl){//预测流程时,不走这个条件判断,避免死循环
return false;
}
Boolean condition=false;//是否跳过当前节点
Boolean conditiona=false;//如果当前节点是后面某个节点审批人的领导
Boolean conditionb=false;//存在后面还有和当前节点相同的审批人的审批节点。
//单据id
String businessKey = execution.getBusinessKey();
//获取当前审批人
String curPartipantIds = execution.getCurrentTask() == null?null: (String) execution.getCurrentTask().getVariable("currentParticipant");
List<Long> currentApproverIds = execution.getCurrentApprover();
if(currentApproverIds.isEmpty() && null!=curPartipantIds && curPartipantIds.trim().length()>0
&&!curPartipantIds.contains(",")){
currentApproverIds.add(Long.parseLong(curPartipantIds));//仅有一个参与人时
}
if (currentApproverIds.size() == 1) {
Long currentApproverId = currentApproverIds.get(0);
Long processInstanceId = execution.getProcessInstanceId();
//获取流程后面节点的预计算结果
IPreComputorRecord preComputorRecord = WorkflowServiceHelper.getPreComputorRecord(processInstanceId);
List<IPreComputorRecordItem> pcrDataList = preComputorRecord.getPcrData();
for (int i = 1; i < pcrDataList.size(); i++) {//当i=0时,是当前节点,要比较的是当前之后的节点
IPreComputorRecordItem pcrData = pcrDataList.get(i);
List<S如何根据预测流程节点信息判断是否跳过当前审批节点
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



