日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Activiti6+SpringBoot---会签功能学习-1

發(fā)布時間:2023/12/14 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Activiti6+SpringBoot---会签功能学习-1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1. 會簽說明
  • 2. 多實例
  • 3.流程實現
    • 3.1 設計流程圖

1. 會簽說明

會簽,是指多個人員針對同一個事務進行協(xié)商處理,共同簽署決定一件事情。
在工作流中會簽,是指多個人員在同一個環(huán)節(jié)進行處理,同一環(huán)節(jié)的有多個處理人并行處理,按照配置規(guī)則,固定比例的人員辦理完成后即可繼續(xù)扭轉至下一環(huán)節(jié)。

2. 多實例

多實例節(jié)點是在業(yè)務流程中定義重復環(huán)節(jié)的一個方法。 從開發(fā)角度講,多實例和循環(huán)是一樣的: 它可以根據給定的集合,為每個元素執(zhí)行一個環(huán)節(jié)甚至一個完整的子流程, 既可以順序依次執(zhí)行也可以并發(fā)同步執(zhí)行。

多實例是在一個普通的節(jié)點上添加了額外的屬性定義 (所以叫做’多實例特性’),這樣運行時節(jié)點就會執(zhí)行多次。 下面的節(jié)點都可以成為一個多實例節(jié)點:

User Task

Script Task

Java Service Task

Web Service Task

Business Rule Task

Email Task

Manual Task

Receive Task

(Embedded) Sub-Process

Call Activity

根據規(guī)范的要求,每個上級流程為每個實例創(chuàng)建分支時都要提供如下變量:

nrOfInstances:實例總數

nrOfActiveInstances:當前活動的,比如,還沒完成的,實例數量。 對于順序執(zhí)行的多實例,值一直為1。

nrOfCompletedInstances:已經完成實例的數目。

可以通過execution.getVariable(x)方法獲得這些變量。

另外,每個創(chuàng)建的分支都會有分支級別的本地變量(比如,其他實例不可見, 不會保存到流程實例級別):

loopCounter:表示特定實例的在循環(huán)的索引值。可以使用activiti的elementIndexVariable屬性修改loopCounter的變量名。
圖形標記
如果節(jié)點是多實例的,會在節(jié)點底部顯示三條短線。 三條豎線表示實例會并行執(zhí)行。 三條橫線表示順序執(zhí)行。

Xml內容
要把一個節(jié)點設置為多實例,節(jié)點xml元素必須設置一個multiInstanceLoopCharacteristics子元素。

<multiInstanceLoopCharacteristics isSequential="false|true">... </multiInstanceLoopCharacteristics>

isSequential屬性表示節(jié)點是進行 順序執(zhí)行還是并行執(zhí)行。

實例的數量會在進入節(jié)點時計算一次。 有一些方法配置它。一種方法是使用loopCardinality子元素直接指定一個數字。

<multiInstanceLoopCharacteristics isSequential="false|true"><loopCardinality>5</loopCardinality> </multiInstanceLoopCharacteristics>

也可以使用結果為整數的表達式:

<multiInstanceLoopCharacteristics isSequential="false|true"><loopCardinality>${nrOfOrders-nrOfCancellations}</loopCardinality> </multiInstanceLoopCharacteristics>

另一個定義實例數目的方法是,通過loopDataInputRef子元素,設置一個類型為集合的流程變量名。 對于集合中的每個元素,都會創(chuàng)建一個實例。 也可以通過inputDataItem子元素指定集合。 下面的代碼演示了這些配置:

<userTask id="miTasks" name="My Task ${loopCounter}" activiti:assignee="${assignee}"><multiInstanceLoopCharacteristics isSequential="false"><loopDataInputRef>assigneeList</loopDataInputRef><inputDataItem name="assignee" /></multiInstanceLoopCharacteristics> </userTask>

假設assigneeList變量包含這些值[kermit, gonzo, foziee]。 在上面代碼中,三個用戶任務會同時創(chuàng)建。每個分支都會擁有一個用名為assignee的流程變量, 這個變量會包含集合中的對應元素,在例子中會用來設置用戶任務的分配者。

loopDataInputRef和inputDataItem的缺點是1)名字不好記, 2)根據BPMN 2.0格式定義,它們不能包含表達式。activiti通過在 multiInstanceCharacteristics中設置 collection和 elementVariable屬性解決了這個問題:

<userTask id="miTasks" name="My Task" activiti:assignee="${assignee}"><multiInstanceLoopCharacteristics isSequential="true"activiti:collection="${myService.resolveUsersForTask()}" activiti:elementVariable="assignee" ></multiInstanceLoopCharacteristics> </userTask>

多實例節(jié)點在所有實例都完成時才會結束。也可以指定一個表達式在每個實例結束時執(zhí)行。 如果表達式返回true,所有其他的實例都會銷毀,多實例節(jié)點也會結束,流程會繼續(xù)執(zhí)行。 這個表達式必須定義在completionCondition子元素中。

<userTask id="miTasks" name="My Task" activiti:assignee="${assignee}"><multiInstanceLoopCharacteristics isSequential="false"activiti:collection="assigneeList" activiti:elementVariable="assignee" ><completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition></multiInstanceLoopCharacteristics> </userTask>

在這里例子中,會為assigneeList集合的每個元素創(chuàng)建一個并行的實例。 當60%的任務完成時,其他任務就會刪除,流程繼續(xù)執(zhí)行。
以上內容為Activiti用戶手冊的內容,下面實現一個簡單地流程。

3.流程實現

3.1 設計流程圖

第一張為:${nrOfCompletedInstances/nrOfInstances >= 1 },表示需要所有會簽任務全部完成才會往下執(zhí)行。

Bpmn文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 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" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1597109014081" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema"><process id="jointlySign" isClosed="false" isExecutable="true" processType="None"><startEvent id="_2" name="開始"/><userTask activiti:assignee="${assignee}" activiti:candidateGroups="生產部領導" activiti:exclusive="true" id="_3" name="生產部領導會簽"><multiInstanceLoopCharacteristics activiti:collection="${assignees}" activiti:elementVariable="assignee" isSequential="false"><completionCondition><![CDATA[${nrOfCompletedInstances/nrOfInstances>1}]]></completionCondition></multiInstanceLoopCharacteristics></userTask><endEvent id="_4" name="結束"/><sequenceFlow id="_5" sourceRef="_2" targetRef="_3"/><sequenceFlow id="_6" sourceRef="_3" targetRef="_4"/></process><bpmndi:BPMNDiagram documentation="background=#000000;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram"><bpmndi:BPMNPlane bpmnElement="jointlySign"><bpmndi:BPMNShape bpmnElement="_2" id="Shape-_2"><omgdc:Bounds height="32.0" width="32.0" x="45.0" y="290.0"/><bpmndi:BPMNLabel><omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="_3" id="Shape-_3"><omgdc:Bounds height="55.0" width="85.0" x="260.0" y="285.0"/><bpmndi:BPMNLabel><omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="_4" id="Shape-_4"><omgdc:Bounds height="32.0" width="32.0" x="560.0" y="295.0"/><bpmndi:BPMNLabel><omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="_5" id="BPMNEdge__5" sourceElement="_2" targetElement="_3"><omgdi:waypoint x="77.0" y="306.0"/><omgdi:waypoint x="260.0" y="312.5"/><bpmndi:BPMNLabel><omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="_6" id="BPMNEdge__6" sourceElement="_3" targetElement="_4"><omgdi:waypoint x="345.0" y="312.5"/><omgdi:waypoint x="560.0" y="311.0"/><bpmndi:BPMNLabel><omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram> </definitions>

測試類

package com.yb;import org.activiti.engine.HistoryService; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.HashMap; import java.util.List;/*** @author liangjie@itcast.cn* @version 1.0* @date 2020/8/5*/ @RunWith(SpringRunner.class) @SpringBootTest public class ActivitiJpaTest04 {@Resourceprivate RepositoryService repositoryService;@Resourceprivate RuntimeService runtimeService;@Resourceprivate TaskService taskService;@Resourceprivate HistoryService historyService;@Resourceprivate HttpServletRequest request;/*** 部署流程,測試會簽功能*/@Testpublic void repositoryDeploy(){Deployment deploy = repositoryService.createDeployment().addClasspathResource("processes/activiti_jointlySign.bpmn").addClasspathResource("processes/activiti_jointlySign.png").name("測試會簽功能-1").deploy();System.out.println("部署ID:"+deploy.getId());System.out.println("部署名稱"+deploy.getName());}/*** 發(fā)布流程*/@Testpublic void runtimeRelease(){ArrayList<String> list = new ArrayList<>();list.add("tom");list.add("jack");list.add("mary");HashMap<String, Object> map = new HashMap<>();map.put("assignees",list);ProcessInstance pi = runtimeService.startProcessInstanceByKey("jointlySign",map);System.out.println("流程實例ID:"+pi.getId());System.out.println("流程定義ID:"+pi.getProcessDefinitionId());}/*** 查詢及完成任務-需要所有會簽全部完成*/@Testpublic void taskQueryComplete(){List<Task> list = taskService.createTaskQuery().taskAssignee("tom").list();for (Task task : list) {System.out.println("--------------------------------------------");System.out.println("任務ID:" + task.getId());System.out.println("任務名稱:" + task.getName());System.out.println("任務創(chuàng)建時間:" + task.getCreateTime());System.out.println("任務委派人:" + task.getAssignee());System.out.println("流程實例ID:" + task.getProcessInstanceId());taskService.complete(task.getId());}} }

數據庫歷史記錄:
需要三個人全部完成才能結束,通過結束時間可以看出這三個人都是必須完成任務的。

第二張為:${nrOfCompletedInstances/nrOfInstances >= 0.6},表示需要兩個會簽任務完成就會往下執(zhí)行。

Bpmn文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 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" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1597111769369" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema"><process id="jointlySign2" isClosed="false" isExecutable="true" processType="None"><startEvent id="_2" name="開始"/><userTask activiti:assignee="${assignee}" activiti:candidateGroups="生產部領導" activiti:exclusive="true" id="_3" name="生產部領導會簽"><multiInstanceLoopCharacteristics activiti:collection="${assignees}" activiti:elementVariable="assignee" isSequential="false"><completionCondition><![CDATA[${nrOfCompletedInstances/nrOfInstances>0.6}]]></completionCondition></multiInstanceLoopCharacteristics></userTask><endEvent id="_4" name="結束"/><sequenceFlow id="_5" sourceRef="_2" targetRef="_3"/><sequenceFlow id="_6" sourceRef="_3" targetRef="_4"/></process><bpmndi:BPMNDiagram documentation="background=#000000;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram"><bpmndi:BPMNPlane bpmnElement="jointlySign2"><bpmndi:BPMNShape bpmnElement="_2" id="Shape-_2"><omgdc:Bounds height="32.0" width="32.0" x="400.0" y="15.0"/><bpmndi:BPMNLabel><omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="_3" id="Shape-_3"><omgdc:Bounds height="55.0" width="85.0" x="375.0" y="170.0"/><bpmndi:BPMNLabel><omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="_4" id="Shape-_4"><omgdc:Bounds height="32.0" width="32.0" x="405.0" y="345.0"/><bpmndi:BPMNLabel><omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/></bpmndi:BPMNLabel></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="_5" id="BPMNEdge__5" sourceElement="_2" targetElement="_3"><omgdi:waypoint x="416.0" y="47.0"/><omgdi:waypoint x="416.0" y="170.0"/><bpmndi:BPMNLabel><omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="_6" id="BPMNEdge__6" sourceElement="_3" targetElement="_4"><omgdi:waypoint x="421.0" y="225.0"/><omgdi:waypoint x="421.0" y="345.0"/><bpmndi:BPMNLabel><omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/></bpmndi:BPMNLabel></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram> </definitions>

測試類

package com.yb;import org.activiti.engine.HistoryService; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.HashMap; import java.util.List;/*** @author liangjie@itcast.cn* @version 1.0* @date 2020/8/5*/ @RunWith(SpringRunner.class) @SpringBootTest public class ActivitiJpaTest05 {@Resourceprivate RepositoryService repositoryService;@Resourceprivate RuntimeService runtimeService;@Resourceprivate TaskService taskService;@Resourceprivate HistoryService historyService;@Resourceprivate HttpServletRequest request;/*** 部署流程,測試會簽功能*/@Testpublic void repositoryDeploy(){Deployment deploy = repositoryService.createDeployment().addClasspathResource("processes/activiti_jointlySign2.bpmn").addClasspathResource("processes/activiti_jointlySign2.png").name("測試會簽功能-2").deploy();System.out.println("部署ID:"+deploy.getId());System.out.println("部署名稱"+deploy.getName());}/*** 發(fā)布流程*/@Testpublic void runtimeRelease(){ArrayList<String> list = new ArrayList<>();list.add("tom");list.add("jack");list.add("mary");HashMap<String, Object> map = new HashMap<>();map.put("assignees",list);ProcessInstance pi = runtimeService.startProcessInstanceByKey("jointlySign2",map);System.out.println("流程實例ID:"+pi.getId());System.out.println("流程定義ID:"+pi.getProcessDefinitionId());}/*** 查詢及完成任務*/@Testpublic void taskQueryComplete(){List<Task> list = taskService.createTaskQuery().taskAssignee("tom").list();for (Task task : list) {System.out.println("--------------------------------------------");System.out.println("任務ID:" + task.getId());System.out.println("任務名稱:" + task.getName());System.out.println("任務創(chuàng)建時間:" + task.getCreateTime());System.out.println("任務委派人:" + task.getAssignee());System.out.println("流程實例ID:" + task.getProcessInstanceId());taskService.complete(task.getId());}} }

數據庫歷史記錄:
需要二個人完成就可以結束,通過結束時間可以看出這有兩個人的結束時間是相同的,說明只要有兩個人完成任務就可以結束流程了。

總結

以上是生活随笔為你收集整理的Activiti6+SpringBoot---会签功能学习-1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。