diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/flowable/listener/MulitiInstanceCompleteTask.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/flowable/listener/MulitiInstanceCompleteTask.java new file mode 100644 index 00000000..3e9f8994 --- /dev/null +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/flowable/listener/MulitiInstanceCompleteTask.java @@ -0,0 +1,53 @@ +package cn.jyjz.flowable.listener; + + +import org.flowable.engine.delegate.DelegateExecution; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.Serializable; + +/** + * 定义多人会签的规则 + * flowable默认帮我们提供的流程实例的变量: + * 1、nrOfInstances:总的会签任务数量。如上面设置的3。 + * 2、nrOfActiveInstances:当前获取的会签任务数量,即还没有完成的。 + * 3、 nrOfCompletedInstances:已经完成的会签任务数量。 + * + * flag:我们自定义的。 + * return flag:控制当前会签是否结束的。 + */ +@Component("multilnstanceCompleteTask") +public class MulitiInstanceCompleteTask implements Serializable { + + private Logger log = LoggerFactory.getLogger(MulitiInstanceCompleteTask.class); + /** + * 完成任务是需要触发的方法 + * @param execution + * @return + * false 表示会签任务还没有结束 + + * true 表示会签任务结束了 + */ + public boolean completeTask(DelegateExecution execution) { + + //当前获取的会签任务数量 + int nrOfActiveInstances = (int) execution.getVariable("nrOfActiveInstances"); + //总的会签任务数量 + int nrOfInstances = (int) execution.getVariable("nrOfInstances"); + //已经完成的会签任务数量 + int nrOfCompletedInstances = (int) execution.getVariable("nrOfCompletedInstances"); + + log.info("总的会签任务数量:" + nrOfInstances + + "当前获取的会签任务数量:" + nrOfActiveInstances + + " - " + "已经完成的会签任务数量:" + nrOfInstances); + + if(nrOfInstances >= nrOfCompletedInstances){ + return true; + }else{ + return false; + } + } + +} diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/flowable/listener/MulitiInstanceTaskListener.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/flowable/listener/MulitiInstanceTaskListener.java new file mode 100644 index 00000000..1cd5da0c --- /dev/null +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/flowable/listener/MulitiInstanceTaskListener.java @@ -0,0 +1,16 @@ +package cn.jyjz.flowable.listener; + +import org.flowable.engine.delegate.DelegateExecution; +import org.springframework.stereotype.Component; + +import java.io.Serializable; + +@Component("mulitiInstanceTaskListener") +public class MulitiInstanceTaskListener implements Serializable { + + public void completeListener(DelegateExecution execution){ +// System.out.println("任务:"+execution.getId()); +// System.out.println("persons:" + execution.getVariable("persons")); +// System.out.println("person" + execution.getVariable("person")); + } +} diff --git a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/flowable/service/impl/FlowTaskServiceImpl.java b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/flowable/service/impl/FlowTaskServiceImpl.java index 220f7270..1fbf7d31 100644 --- a/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/flowable/service/impl/FlowTaskServiceImpl.java +++ b/jyjz-system/jyjz-system-oa/src/main/java/cn/jyjz/flowable/service/impl/FlowTaskServiceImpl.java @@ -432,8 +432,57 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask } return result; } - - + + + public UserTask getNextTasks(Task task){ + + //获取流程发布Id信息 + String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult().getProcessDefinitionId(); + + //获取bpm对象 + BpmnModel bpmnModel = repositoryService.getBpmnModel(definitionId); + + //传节点定义key 获取当前节点 + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + + //输出连线 + List outgoingFlows = flowNode.getOutgoingFlows(); + + //遍历返回下一个节点信息 + for (SequenceFlow outgoingFlow : outgoingFlows) { + //类型自己判断 + FlowElement targetFlowElement = outgoingFlow.getTargetFlowElement(); + //用户任务 + if (targetFlowElement instanceof UserTask) { + UserTask userTask = (UserTask) targetFlowElement; + return userTask; + } else if (targetFlowElement instanceof ExclusiveGateway) { + setExclusiveGateway(targetFlowElement); + } + } + return null; + } + + private void setExclusiveGateway(FlowElement targetFlow) { + //排他网关,获取连线信息 + List targetFlows = ((ExclusiveGateway) targetFlow).getOutgoingFlows(); + for (SequenceFlow sequenceFlow : targetFlows) { + //目标节点信息 + FlowElement targetFlowElement = sequenceFlow.getTargetFlowElement(); + if (targetFlowElement instanceof UserTask) { + // do something + } else if (targetFlowElement instanceof EndEvent) { + // do something + } else if (targetFlowElement instanceof ServiceTask) { + // do something + } else if (targetFlowElement instanceof ExclusiveGateway) { + //递归寻找 + setExclusiveGateway(targetFlowElement); + } else if (targetFlowElement instanceof SubProcess) { + // do something + } + } + } /** * 完成任务 */ @@ -481,6 +530,19 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask */ private void disposeSucceedTask(Task task, ProcessDefinition processDefinition, Map variables, OcrTaskchildPicture model, String formId, UserToken userToken, FlowApprove approve, String deptid) throws Exception { + + //获取下一个节点 + UserTask userTask = this.getNextTasks(task); + if(null != userTask){ + MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics(); + // 会签节点 + if (Objects.nonNull(multiInstance)) { + if(null != userTask.getCandidateUsers() && userTask.getCandidateUsers().size() > 1){ + variables.put("persons",userTask.getCandidateUsers()); + } + } + } + //进入下一个节点 taskService.complete(task.getId(), variables); updateAssignee(task.getProcessInstanceId(), task.getProcessDefinitionId(), processDefinition, deptid);