最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解

 更新時(shí)間:2022年11月24日 09:50:46   作者:自由了  
這篇文章主要為大家介紹了Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

最近項(xiàng)目有用到Activiti工作流,但是需求有點(diǎn)特殊,需要通過參數(shù)去生成BPMN圖,查閱了資料后,能實(shí)現(xiàn)簡單的工作流生成,那接下來看看如何通過代碼動(dòng)態(tài)生成工作流的吧。

一.設(shè)計(jì)思路

1.以普通的請假流程為例

(1)生成開始節(jié)點(diǎn)加第1個(gè)任務(wù)和調(diào)整申請任務(wù)(拒絕或者退回操作)以及其排他網(wǎng)關(guān)

(2)循環(huán)審批列表,生成第2至第N-1個(gè)任務(wù),并每個(gè)任務(wù)后都有1個(gè)排他網(wǎng)關(guān),用于連接調(diào)整申請任務(wù)

(3)最后1個(gè)節(jié)點(diǎn),后面無排他任務(wù),故需要單獨(dú)處理

二.具體實(shí)現(xiàn)代碼

    List<String> roles=new ArrayList<>();
        roles.add("1508574");
        roles.add("13765234");
        roles.add("18834222");
        listMap.put("province",roles);
          for (String auditRole : processParamsDto.getAuditRoles()) {
        if (auditRole.equals(processParamsDto.getAuditRoles().get(0))) {
            //開始連線
            process.addFlowElement(createUserTask("task".concat("_").concat(auditRole), "審批".concat(auditRole), auditRole));
            process.addFlowElement(createSequenceFlow("start", "task".concat("_").concat(auditRole), null));
            //正常的 第一個(gè)網(wǎng)關(guān) process.addFlowElement(createExclusiveGateway("exclusiveGateWay".concat("_").concat(auditRole), "exclusiveGateWay".concat("_").concat(auditRole)));
            //第一個(gè)排他網(wǎng)關(guān)連線 任務(wù)->排他網(wǎng)關(guān)
            process.addFlowElement(createSequenceFlow("task".concat("_").concat(auditRole), "exclusiveGateWay".concat("_").concat(auditRole), null));
            //重新申請分支  創(chuàng)建重新申請任務(wù)
            process.addFlowElement(createUserTask("task".concat("_").concat("重新申請"), "指定人".concat("審批"), "${startBy}"));
            //申請網(wǎng)關(guān)->申請任務(wù)
            process.addFlowElement(createSequenceFlow("exclusiveGateWay".concat("_").concat(auditRole), "task".concat("_").concat("重新申請"), "${flag==false}"));
            //申請網(wǎng)關(guān)
            process.addFlowElement(createExclusiveGateway("exclusiveGateWay".concat("_").concat("重新申請"), "exclusiveGateWay".concat("_").concat("重新申請")));
            //申請任務(wù)->申請網(wǎng)關(guān)
            process.addFlowElement(createSequenceFlow("task".concat("_").concat("重新申請"),"exclusiveGateWay".concat("_").concat("重新申請"), null));
        } else if (!auditRole.equals(processParamsDto.getAuditRoles().get(processParamsDto.getAuditRoles().size() - 1))) {
            //創(chuàng)建排他網(wǎng)關(guān)  每個(gè)任務(wù)后都有一個(gè)排他網(wǎng)關(guān)
            //第二個(gè)任務(wù)至第size-1個(gè)任務(wù)
            process.addFlowElement(createUserTask("task".concat("_").concat(auditRole), "審批".concat(auditRole), auditRole));
            //第一個(gè)網(wǎng)關(guān)->第二個(gè)任務(wù)  任務(wù)之前的節(jié)點(diǎn) 網(wǎng)關(guān)->第二個(gè)任務(wù)....第N個(gè)任務(wù) true
            process.addFlowElement(createSequenceFlow("exclusiveGateWay".concat("_").concat(getPreAuditRole(auditRole,processParamsDto.getAuditRoles())), "task".concat("_").concat(auditRole), "${flag==true}"));
            //網(wǎng)關(guān)->申請任務(wù) false
            process.addFlowElement(createExclusiveGateway("exclusiveGateWay".concat("_").concat(auditRole), "exclusiveGateWay(當(dāng)前)".concat("_").concat(auditRole)));
            process.addFlowElement(createSequenceFlow("task".concat("_").concat(auditRole), "exclusiveGateWay".concat("_").concat(auditRole), null));
            //排他網(wǎng)關(guān)—>重新申請任務(wù)
            process.addFlowElement(createSequenceFlow("exclusiveGateWay".concat("_").concat(auditRole), "task".concat("_").concat("重新申請"),"#{flag==false}"));
        } else if (auditRole.equals(processParamsDto.getAuditRoles().get(processParamsDto.getAuditRoles().size() - 1))) {
            String lastNode=processParamsDto.getAuditRoles().get(processParamsDto.getAuditRoles().size() - 1);
            System.out.println("當(dāng)前節(jié)點(diǎn)"+lastNode);
            process.addFlowElement(createUserTask("task".concat(lastNode), "審批".concat(auditRole), auditRole));
            process.addFlowElement(createSequenceFlow("exclusiveGateWay".concat("_").concat(getPreAuditRole(auditRole,processParamsDto.getAuditRoles())),"task".concat(lastNode),"#{flag==true}"));
            process.addFlowElement(createEndEvent());
            process.addFlowElement(createSequenceFlow("task".concat(processParamsDto.getAuditRoles().get(processParamsDto.getAuditRoles().size() - 1)), "end", "${flag==true}"));     process.addFlowElement(createSequenceFlow("exclusiveGateWay".concat("_").concat("重新申請"), "end", "${flag==false}"));
  process.addFlowElement(createSequenceFlow("exclusiveGateWay".concat("_").concat("重新申請"), "task".concat("_").concat(processParamsDto.getAuditRoles().get(0)), "${flag==true}"));
        }
    }     
     new BpmnAutoLayout(model).execute();
    //定義并設(shè)置流程變量
    Map<String, Object> variables = new HashMap<>();
        variables.put("flag", 1 == 2);
    //deploy
    Deployment deployment = repositoryService.createDeployment().addBpmnModel("process/dynamic-model.bpmn", model).name("Dynamic process deployment").key("test_bpmn").deploy();
processEngine.getRuntimeService().startProcessInstanceByKey(processDefinition.getKey(), variables);
InputStream inputStreamXml = processEngine.getRepositoryService().getResourceAsStream(deployment.getId(), "process/dynamic-model.bpmn");
//保存到本地,方便查看生成后的文件
 FileUtils.copyInputStreamToFile(inputStreamXml, new File("D:\bpmn_data\process.bpmn.xml"));

三.注意事項(xiàng)

1.activiti-bpmn-layout.jar

//BPMN圖布局自動(dòng)調(diào)整需要添加
<dependency>
   <groupId>org.activiti</groupId>
   <artifactId>activiti-bpmn-layout</artifactId>
   <version>7.1.0.M4</version>
</dependency>

2.mxgraph-all.jar

//需要手動(dòng)添加,其自帶的mxgraph找不到方法,原因待確認(rèn),有時(shí)間去提個(gè)issue問問
<dependency>
   <groupId>com.mxgraph</groupId>
   <artifactId>mxgraph-all</artifactId>
   <version>4.2.2</version>
   <scope>system</scope>
</dependency>

3.使用了layout和不使用的生成的圖對比

四.總結(jié)

通過代碼生成的BPMN圖其實(shí)很亂,即使加了BpmnAutoLayout方法去調(diào)整布局,但是不影響流程正常使用。還有就是看了一遍源碼,沒有找到子流程(SubProcess的子任務(wù))的生成方法,暫時(shí)不支持生成子流程,待我再多研究研究。

后話

簡單流程通過代碼生成沒問題,復(fù)雜流程還是建議用工具繪圖,通過代碼生成有時(shí)候容易出問題。畢竟有一些節(jié)點(diǎn)不能連線,而且復(fù)雜流程對于一些退回操作不是很友好,實(shí)現(xiàn)起來很麻煩。

以上就是Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Activiti7動(dòng)態(tài)生成工作流的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實(shí)現(xiàn)批量導(dǎo)出導(dǎo)入數(shù)據(jù)及附件文件zip包

    Java實(shí)現(xiàn)批量導(dǎo)出導(dǎo)入數(shù)據(jù)及附件文件zip包

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)批量導(dǎo)出導(dǎo)入數(shù)據(jù)及附件文件zip包的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一
    2022-09-09
  • Java面試題沖刺第十一天--集合框架篇(2)

    Java面試題沖刺第十一天--集合框架篇(2)

    這篇文章主要為大家分享了最有價(jià)值的兩道集合框架的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • springboot 集成支付寶支付的示例代碼

    springboot 集成支付寶支付的示例代碼

    這篇文章主要介紹了springboot 集成支付寶支付的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java多線程編程中的兩種常用并發(fā)容器講解

    Java多線程編程中的兩種常用并發(fā)容器講解

    這篇文章主要介紹了Java多線程編程中的兩種常用并發(fā)容器講解,分別是ConcurrentHashMap與ConcurrentHashMap,需要的朋友可以參考下
    2015-12-12
  • springboot實(shí)現(xiàn)yml里的自定義配置方法

    springboot實(shí)現(xiàn)yml里的自定義配置方法

    這篇文章主要介紹了springboot實(shí)現(xiàn)yml里的自定義配置方法,主要介紹三種,字符串配置,數(shù)組配置和帶默認(rèn)值的配置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java并發(fā)工具輔助類代碼實(shí)例

    Java并發(fā)工具輔助類代碼實(shí)例

    這篇文章主要介紹了Java并發(fā)工具輔助類代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java中轉(zhuǎn)換器設(shè)計(jì)模式深入講解

    Java中轉(zhuǎn)換器設(shè)計(jì)模式深入講解

    這篇文章主要給大家介紹了關(guān)于Java中轉(zhuǎn)換器設(shè)計(jì)模式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot的WebSocket實(shí)現(xiàn)單聊群聊

    SpringBoot的WebSocket實(shí)現(xiàn)單聊群聊

    這篇文章主要為大家詳細(xì)介紹了SpringBoot的WebSocket實(shí)現(xiàn)單聊群聊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • SpringBoot配置Spring Native的詳細(xì)步驟

    SpringBoot配置Spring Native的詳細(xì)步驟

    配置 Spring Native 以減少 Spring Boot 應(yīng)用的啟動(dòng)時(shí)間,涉及幾個(gè)關(guān)鍵步驟,包括設(shè)置相應(yīng)的依賴、配置文件以及構(gòu)建過程,本文給大家就介紹了詳細(xì)的步驟和配置示例,需要的朋友可以參考下
    2024-11-11
  • Java之Spring整合Junit

    Java之Spring整合Junit

    Java Spring框架是一個(gè)輕量級的開源框架,具有很高的凝聚力和吸引力,本篇文章帶你了解如何配置數(shù)據(jù)源、注解開發(fā)以及整合Junit
    2023-04-04

最新評論

盱眙县| 沙河市| 汾西县| 策勒县| 会泽县| 格尔木市| 潼南县| 高台县| 探索| 乐亭县| 周至县| 翁源县| 镇远县| 敦化市| 根河市| 万源市| 南投市| 大同县| 江川县| 兴义市| 张家口市| 五家渠市| 五家渠市| 大埔区| 金阳县| 祁东县| 电白县| 南昌市| 普兰店市| 城口县| 化隆| 通辽市| 玉林市| 彭阳县| 香港| 班戈县| 塔河县| 绥化市| 同江市| 甘谷县| 荃湾区|