Nó de múltiplas instâncias Activiti6.0 (11) (referendado)

índice

I. Introdução

2. Função multi-instância

1. Variáveis ​​especiais de múltiplas instâncias

2. Configuração de várias instâncias

3. Verificação


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 &gt; 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

 

 

Acho que você gosta

Origin blog.csdn.net/m0_38001814/article/details/104261770
Recomendado
Clasificación