如何根据预测流程节点信息判断是否跳过当前审批节点
关键词:工作流、跳过、审批节点
一、需求
背景:在采购订货系统中,工作流流程审批存在这样的审批规范:
如果某个用户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<String> nextNodeId = pcrData.getNextNodeId(); if (nextNodeId.size() > 0) { //获取下一个节点的审核人 List<Long> assignee = pcrData.getAssignee(); if (assignee.size() > 0) { //只有一个审批人,如果实际工作流流程节点有多个审批人,遍历去取审批人即可 Long nextApproverId = assignee.get(0); if (!nextApproverId.equals(currentApproverId)) { Map<Long, Map<String, Object>> userInfoBySuperior = UserServiceHelper.getUserInfoBySuperior(nextApproverId); if (userInfoBySuperior.containsKey(currentApproverId)) { //如果当前节点是后面某个节点审批人的领导,则跳过 conditiona = true; if (conditiona && conditionb) { condition = true; break; } } } else {//存在后面还有相同的审批人。 conditionb = true; if (conditiona && conditionb) { condition = true; break; } } } } } } return condition; } }
每一个审批节点都注册上面的插件ReqWorkflowPlugin
2、控制同一个用户只能审批一个节点
四、效果图
(1)创建人不是张三所在部门负责人时,跳过第三级、第四级审批节点
(2)创建人是张三所在部门负责人时,跳过第一级、第四级审批节点
五、开发环境版本
V6.0.1
六、参考资料
如何根据预测流程节点信息判断是否跳过当前审批节点
本文2024-09-23 00:55:03发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-142579.html