índice
1. Variáveis especiais de múltiplas instâncias
2. Configuração de várias instâncias
I. Introdução
No processo de negócios real, o nó de várias instâncias é um cenário muito comum, que muitas vezes é usado no processo de aprovação de várias pessoas. Simplificando, o processador de um determinado link é atribuído a várias pessoas, e todas essas pessoas precisam aprovar ou aprovar parcialmente o processo A função de circulação automática. Da perspectiva de nossos desenvolvedores, a essência é fornecer uma gama de conjunto de pessoal de processamento e, em seguida, fazer um loop do conjunto e executar o link atual para cada elemento do conjunto. Pode ser executado sequencialmente ou simultaneamente e de forma síncrona, ou seja, sequencialmente. Contra-assinatura ou contra-assinatura ordinária
2. Função multi-instância
Multi-instância é adicionar atributos adicionais de multi-instância a um nó comum, de modo que o nó decorado por multi-instância seja executado várias vezes. Na especificação BPMN, os nós mais comuns podem se tornar um nó de várias instâncias, e a maioria comumente usado é conveniente.É userTask.
1. Variáveis especiais de múltiplas instâncias
Cada processo de nível superior fornece as seguintes variáveis ao criar um branch para cada instância. Essas variáveis podem ser usadas em expressões de condição final de várias instâncias:
- nrOfInstances: número total de instâncias
- nrOfActiveInstances: O número de instâncias atualmente ativas, para várias instâncias executadas sequencialmente, o valor é sempre 1
- nrOfCompletedInstances: o número de instâncias concluídas
- loopCounter: O valor do índice do loop onde a instância atual está localizada, outras instâncias não são visíveis e não serão salvas no nível da instância do processo
Essas variáveis podem ser obtidas das seguintes maneiras:
taskService.getVariable(String taskId, String variableName)
2. Configuração de várias instâncias
A próxima configuração é baseada em Activiti-app. Claro, o método baseado em BomnModel também é possível. Primeiro, olhe para o fluxograma geral:
Primeiro, configure o tipo de instância múltipla . Existem três enumerações opcionais, o padrão é NENHUMA, ou seja, sem contra-assinatura:
- NENHUMA: não referendada
- PARALELO: modo de contra-assinatura, disparar em paralelo, gerar várias tarefas ao mesmo tempo, ou seja, contra-assinatura comum
- SEQUENCIAL: modo de contra-assinatura, gatilho de sequência, gerar tarefas em sequência, ou seja, contra-assinatura sequencial
Em seguida, configure a coleção de intervalo de pessoal de várias instâncias e os nomes dos elementos na coleção . Aqui, usamos variáveis para atribuir a coleção ao nó:
Finalmente, a configuração da variável de processo do nó atual pessoas , preste atenção ao nome da variável e o nome do elemento na coleção é o usuário deve ser o mesmo!
Até agora, o método de configuração mais simples está completo. Além disso, também podemos configurar as condições finais de nós de várias instâncias . Por padrão, todas as tarefas de instância são concluídas antes do final, mas você também pode usar as variáveis especiais mencionadas acima. Para configurar dinamicamente:
A expressão pode ser baseada no negócio, por exemplo: desde que 50% das pessoas sejam aprovadas, a instância atual será transferida diretamente ($ {nrOfCompletedInstances / nrOfInstances> = 0,6})
O xml configurado é o seguinte:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
<process id="multiInstance" name="多实例会签" isExecutable="true">
<startEvent id="startEvent1"></startEvent>
<endEvent id="sid-0A0EABAB-F9B6-4673-941C-91C9F88F73AA"></endEvent>
<userTask id="sid-ACFA83C3-37AA-4912-94E2-806A969E12BE" name="会签审批环节" activiti:assignee="${user}">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${userList}" activiti:elementVariable="user"></multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="sid-4618D0A7-F5CA-4BEA-8FF7-1E4D222EF989" sourceRef="startEvent1" targetRef="sid-ACFA83C3-37AA-4912-94E2-806A969E12BE"></sequenceFlow>
<sequenceFlow id="sid-EA45E614-56CF-4C54-8494-EA4C96FB995C" sourceRef="sid-ACFA83C3-37AA-4912-94E2-806A969E12BE" targetRef="sid-0A0EABAB-F9B6-4673-941C-91C9F88F73AA"></sequenceFlow>
</process>
</definitions>
3. Verificação
Basta chamar o seguinte código
@Test
public void multiInstanceTest() {
// 1、发布流程,当流程的key相同时则以版本来控制,每次启动流程实例时默认取最新版本
Deployment deployment = repositoryService.createDeployment().name("多实例会签流程").addClasspathResource("processes/multiInstance.bpmn20.xml").deploy();
Map<String, Object> variable = new HashMap<>();
variable.put("userList", Lists.newArrayList("张三", "李四", "王五", "赵六"));
// 2、启动一个流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("multiInstance", variable);
// 3、查询当前任务
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).list();
System.out.println("当前任务数量:" + tasks.size());
for (Task task : tasks) {
System.out.println("任务名:" + task.getName() + ",任务处理人:" + task.getAssignee());
}
// 下面演示先完成一个任务,看流程是否会流转
taskService.complete(tasks.get(0).getId());
tasks = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).list();
System.out.println("完成一个任务后,当前任务数量:" + tasks.size());
for (Task task : tasks) {
System.out.println("任务名:" + task.getName() + ",任务处理人:" + task.getAssignee());
}
}
Veja a saída do console:
当前任务数量:4
任务名:会签审批环节,任务处理人:张三
任务名:会签审批环节,任务处理人:李四
任务名:会签审批环节,任务处理人:王五
任务名:会签审批环节,任务处理人:赵六
完成一个任务后,当前任务数量:3
任务名:会签审批环节,任务处理人:李四
任务名:会签审批环节,任务处理人:王五
任务名:会签审批环节,任务处理人:赵六
Quando uma condição final é adicionada, ou seja, $ {nrOfCompletedInstances> 0}, a configuração xml torna-se:
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${userList}" activiti:elementVariable="user">
<completionCondition>${nrOfCompletedInstances > 0}</completionCondition>
</multiInstanceLoopCharacteristics>
Chamando o código acima novamente, você descobrirá que, uma vez que uma tarefa seja concluída, as tarefas restantes são excluídas:
当前任务数量:4
任务名:会签审批环节,任务处理人:张三
任务名:会签审批环节,任务处理人:李四
任务名:会签审批环节,任务处理人:王五
任务名:会签审批环节,任务处理人:赵六
完成一个任务后,当前任务数量:0