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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第15篇: Flowable-BPMN操作流程之排他网关

發布時間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第15篇: Flowable-BPMN操作流程之排他网关 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接上一篇:
第14篇:Flowable-BPMN操作流程之任務完成
https://blog.csdn.net/weixin_40816738/article/details/102902647

文章目錄

  • 一、背景
  • 二、定義
  • 三、流程準備
  • 四、流程文件
  • 五、控制器
  • 六、流程通過驗證
    • 6.1. 創建新流程
    • 6.2. 啟動流程
    • 6.3. 控制臺查看任務ID
    • 6.4. 通過流程
    • 6.5. 查看流程圖
  • 七、流程拒絕驗證
    • 7.1. 創建新流程
    • 7.2. 啟動流程
    • 7.3. 控制臺查看任務ID
    • 7.4. 拒絕流程
    • 7.5. 查看流程圖

一、背景

  • 流程在審批的過程中需要進行一些判斷然后再看下一步怎么走,完成判斷邏輯的是網關,排他網關就是其中的一種。

二、定義

排他網關(也叫異或(XOR)網關,或更技術性的叫法 基于數據的排他網關), 用來在流程中實現決策。 當流程執行到這個網關,所有外出順序流都會被處理一遍。 其中條件解析為true的順序流(或者沒有設置條件,概念上在順序流上定義了一個’true’) 會被選中,讓流程繼續運行。簡單理解條件為True繼續執行,False將不執行。

三、流程準備

我們在Modeler中給我們的流程配置一個排他網關,添加后流程如下:
在排他網關的到結束的連接線上配置好網關是否通過的條件,比如審核通過我們設置為${outcome==‘通過’},當走到這里流程變量outcome為通過的時候將會走審核通過這個流程,等于拒絕的時候走下面的流程,參數配置如下圖所示:

四、流程文件

流程文件內容如下:

<?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:flowable="http://flowable.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.flowable.org/processdef"><process id="test_bpmn" name="測試BPMN模型" isExecutable="true"><documentation>測試BPMN模型</documentation><startEvent id="start" name="開始"></startEvent><endEvent id="end" name="通過結束"></endEvent><userTask id="testUser" name="用戶任務測試" flowable:assignee="admin"><extensionElements><flowable:taskListener event="create" class="com.hyj.flowlistener.CommonUserStartListener"></flowable:taskListener><modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete></extensionElements></userTask><sequenceFlow id="sid-8D834F3C-45A8-4C88-9AD1-1AC426CC9002" sourceRef="start" targetRef="testUser"></sequenceFlow><exclusiveGateway id="ex_gateway_check" name="審核結果"></exclusiveGateway><sequenceFlow id="sid-50731902-EF37-4E07-9DED-2E83F7EB54B7" sourceRef="testUser" targetRef="ex_gateway_check"></sequenceFlow><endEvent id="end_fail" name="失敗結束"></endEvent><sequenceFlow id="check_fail" name="審核拒絕" sourceRef="ex_gateway_check" targetRef="end_fail"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${outcome=='拒絕'}]]></conditionExpression></sequenceFlow><sequenceFlow id="check_ok" name="審核通過" sourceRef="ex_gateway_check" targetRef="end"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${outcome=='通過'}]]></conditionExpression></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_test_bpmn"><bpmndi:BPMNPlane bpmnElement="test_bpmn" id="BPMNPlane_test_bpmn"><bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start"><omgdc:Bounds height="30.0" width="30.0" x="210.0" y="120.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end"><omgdc:Bounds height="28.0" width="28.0" x="630.0" y="60.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="testUser" id="BPMNShape_testUser"><omgdc:Bounds height="80.0" width="100.0" x="315.0" y="95.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="ex_gateway_check" id="BPMNShape_ex_gateway_check"><omgdc:Bounds height="40.0" width="40.0" x="480.0" y="115.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="end_fail" id="BPMNShape_end_fail"><omgdc:Bounds height="28.0" width="28.0" x="630.0" y="180.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="check_fail" id="BPMNEdge_check_fail"><omgdi:waypoint x="500.5" y="154.4338310580205"></omgdi:waypoint><omgdi:waypoint x="500.5" y="194.0"></omgdi:waypoint><omgdi:waypoint x="630.0" y="194.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-8D834F3C-45A8-4C88-9AD1-1AC426CC9002" id="BPMNEdge_sid-8D834F3C-45A8-4C88-9AD1-1AC426CC9002"><omgdi:waypoint x="239.94999779398907" y="135.0"></omgdi:waypoint><omgdi:waypoint x="315.0" y="135.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-50731902-EF37-4E07-9DED-2E83F7EB54B7" id="BPMNEdge_sid-50731902-EF37-4E07-9DED-2E83F7EB54B7"><omgdi:waypoint x="414.95000000000005" y="135.0"></omgdi:waypoint><omgdi:waypoint x="480.0" y="135.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="check_ok" id="BPMNEdge_check_ok"><omgdi:waypoint x="500.5" y="115.5"></omgdi:waypoint><omgdi:waypoint x="500.5" y="74.0"></omgdi:waypoint><omgdi:waypoint x="630.0" y="74.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram> </definitions>

五、控制器

  • 控制器原來直接是個完成任務現在,我們方便起見拆分為2個一個是通過任務,一個是拒絕任務,如果你的排他網關使用的都是該參數那么就可以通用。
@RequestMapping("/accept")@ResponseBodypublic Map<String,Object> acceptTask(@RequestBody @RequestParam(required = false) Map<String,String> paras){Map<String,Object> res =new HashMap<>();Map<String,String> data = new HashMap<>();if (MapUtils.isEmpty(paras)){res.put("msg","請輸入任務參數");res.put("res","0");res.put("data",data);return res;}String taskId = paras.get("taskId");if (StringUtils.isEmpty(taskId)){res.put("msg","請輸入任務ID");res.put("res","0");res.put("data",data);return res;}Map<String,Object> flowParas=new HashMap<>();flowParas.putAll(paras);flowParas.put("outcome","通過");boolean bok = flowService.completeTask(taskId,flowParas);if (bok){data.put("taskId",taskId);res.put("msg","通過任務成功");res.put("res","1");}else {data.put("taskId",taskId);res.put("msg","通過任務失敗");res.put("res","0");}res.put("data",data);return res;}@RequestMapping("/reject")@ResponseBodypublic Map<String,Object> rejectTask(@RequestBody @RequestParam(required = false) Map<String,String> paras){Map<String,Object> res =new HashMap<>();Map<String,String> data = new HashMap<>();if (MapUtils.isEmpty(paras)){res.put("msg","請輸入任務參數");res.put("res","0");res.put("data",data);return res;}String taskId = paras.get("taskId");if (StringUtils.isEmpty(taskId)){res.put("msg","請輸入任務ID");res.put("res","0");res.put("data",data);return res;}Map<String,Object> flowParas=new HashMap<>();flowParas.putAll(paras);flowParas.put("outcome","拒絕");boolean bok = flowService.completeTask(taskId,flowParas);if (bok){data.put("taskId",taskId);res.put("msg","拒絕任務成功");res.put("res","1");}else {data.put("taskId",taskId);res.put("msg","拒絕任務失敗");res.put("res","0");}res.put("data",data);return res;}

六、流程通過驗證

6.1. 創建新流程

使用測試BPMN模型4.bpmn20.xml的流程配置文件,輸入創建地址完成創建。
http://localhost:8989/flow/create

6.2. 啟動流程

http://localhost:8989/flow/start?processKey=test_bpmn
輸入改地址完成流程啟動

6.3. 控制臺查看任務ID

  • 此時查看流程后臺,會打印當前的任務ID

6.4. 通過流程

輸入新增的通過地址完成流程審批
http://localhost:8989/flow/accept?taskId=99bb7920-0082-11ea-8f3c-f8a2d6bfea5a

6.5. 查看流程圖

進入流程查看地址:
http://localhost:8989/flow/processDiagram?processId=8f9bf5e7-0083-11ea-9dbd-f8a2d6bfea5a
查看我們的審批流程走到了最后,而拒絕沒有發生變化,說明排他網關成功的區分了兩個流程,流程進展如下圖所示:

七、流程拒絕驗證

7.1. 創建新流程

替換罪行的流程配置文件,輸入創建地址完成創建。
http://localhost:8989/flow/create

7.2. 啟動流程

http://localhost:8989/flow/start?processKey=test_bpmn
,輸入改地址完成流程啟動

processId:976c4c43-0106-11ea-85ad-f8a2d6bfea5a

7.3. 控制臺查看任務ID

  • 此時查看流程后臺,會打印當前的任務ID

7.4. 拒絕流程

輸入新增的通過地址完成流程審批
http://localhost:8989/flow/reject?taskId=9774b0b9-0106-11ea-85ad-f8a2d6bfea5a

7.5. 查看流程圖

進入流程查看地址:
http://localhost:8989/flow/processDiagram?processId=976c4c43-0106-11ea-85ad-f8a2d6bfea5a
,查看我們的審批流程走到了最后,而拒絕沒有發生變化,說明排他網關成功的區分了兩個流程,流程進展如下圖所示:

代碼下載:

gitlab鏈接:https://gitlab.com/gb-heima/flowablestudy/tree/master/flowablelech15

碼云鏈接:https://gitee.com/gb_90/flowable-study/tree/master/flowablelech15

總結

以上是生活随笔為你收集整理的第15篇: Flowable-BPMN操作流程之排他网关的全部內容,希望文章能夠幫你解決所遇到的問題。

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