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

flowable動(dòng)態(tài)創(chuàng)建多級(jí)流程模板實(shí)現(xiàn)demo

 更新時(shí)間:2023年05月23日 11:15:21   作者:多喝灬丶燙水  
這篇文章主要為大家介紹了flowable動(dòng)態(tài)創(chuàng)建多級(jí)流程模板實(shí)現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

flowable動(dòng)態(tài)創(chuàng)建多級(jí)流程模板

引入Maven依賴

<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.6.0</version>
</dependency>

動(dòng)態(tài)創(chuàng)建流程節(jié)點(diǎn)工具類

/**
 * 動(dòng)態(tài)創(chuàng)建流程節(jié)點(diǎn)
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class FlowableBpmnHandler {
    /**
     * 創(chuàng)建開始節(jié)點(diǎn)信息
     *
     * @return
     */
    public static FlowElement createStartFlowElement(String id, String name) {
        StartEvent startEvent = new StartEvent();
        startEvent.setId(id);
        startEvent.setName(name);
        return startEvent;
    }
    /**
     * 創(chuàng)建結(jié)束節(jié)點(diǎn)信息
     *
     * @param id
     * @param name
     * @return
     */
    public static FlowElement createEndFlowElement(String id, String name) {
        EndEvent endEvent = new EndEvent();
        endEvent.setId(id);
        endEvent.setName(name);
        return endEvent;
    }
    /**
     * 循環(huán)創(chuàng)建普通任務(wù)節(jié)點(diǎn)信息
     *
     * @param processEntity 流程實(shí)體
     * @return
     */
    public static List<UserTask> createCommonUserTask(ProcessEntity processEntity) {
        List<ProcessNode> processNodes = processEntity.getProcessNodeList();
        List<UserTask> userTaskList = Lists.newLinkedList();
        for (int i = 0; i < processNodes.size(); i++) {
            ProcessNode node = processNodes.get(i);
            node.setNodeId(UUIDHelper.randomUUID());
            node.setNodeLevel(i + 1);
            UserTask userTask = new UserTask();
            userTask.setId(TypeEnum.getProcessKey(processEntity.getType()) + "_task_" + node.getNodeId());
            userTask.setCategory(String.valueOf(i + 1));
            userTask.setDocumentation(i == processNodes.size() - 1 ? "true" : "false");
            userTask.setName(node.getNodeName());
            userTaskList.add(userTask);
        }
        return userTaskList;
    }
    /**
     * 創(chuàng)建排它網(wǎng)關(guān)節(jié)點(diǎn)
     *
     * @return
     */
    public static ExclusiveGateway createExclusiveGateway(Integer i) {
        ExclusiveGateway gateway = new ExclusiveGateway();
        gateway.setName("getaway_name_" + i);
        gateway.setId("getaway_id_" + i);
        return gateway;
    }
}

動(dòng)態(tài)創(chuàng)建流程模板工具類

/**
 * 動(dòng)態(tài)創(chuàng)建流程模板
 *
 * @author ll
 * @date 2023/04/19 14:28
 **/
@Slf4j
@Component
public class DynamicProcessDefinition {
    @Resource
    private RepositoryService repositoryService;
    public String createProcessDefinition(ProcessEntity processEntity) {
        //數(shù)據(jù)校驗(yàn):傳入的數(shù)據(jù)節(jié)點(diǎn)字段:流程配置id、節(jié)點(diǎn)id、節(jié)點(diǎn)順序、節(jié)點(diǎn)描述
        List&lt;ProcessNode&gt; nodeList = processEntity.getProcessNodeList();
        if (CollUtil.isEmpty(nodeList)) {
            throw new RuntimeException("流程節(jié)點(diǎn)不能少于一個(gè),請(qǐng)配置發(fā)起人節(jié)點(diǎn)和至少一個(gè)審批節(jié)點(diǎn)");
        }
        BpmnModel bpmnModel = new BpmnModel();
        Process process = new Process();
        bpmnModel.addProcess(process);
        // 流程標(biāo)識(shí)
        process.setId(TypeEnum.getProcessKey(processEntity.getType()));
        process.setName(TypeEnum.getProcessKey(processEntity.getType()));
        //開始事件
        FlowElement startEvent = FlowableBpmnHandler.createStartFlowElement("start", "開始");
        process.addFlowElement(startEvent);
        //結(jié)束事件--任務(wù)正常完成
        FlowElement endEvent = FlowableBpmnHandler.createEndFlowElement("end", "結(jié)束");
        process.addFlowElement(endEvent);
        //創(chuàng)建用戶節(jié)點(diǎn)任務(wù)
        List&lt;UserTask&gt; userTaskList = FlowableBpmnHandler.createCommonUserTask(processEntity);
        //構(gòu)建流程模板
        buildProcessTemplate(process, startEvent, endEvent, userTaskList);
        //該流程的流程xml字符串
        //BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
        //byte[] convertToXML = bpmnXMLConverter.convertToXML(bpmnModel);
        //String bytes = new String(convertToXML);
        //log.info("該流程的流程xml為:{}", bytes);
        // 創(chuàng)建一個(gè)新的部署
        Deployment deploy = repositoryService.createDeployment().key(TypeEnum.getProcessKey(processEntity.getType()))
                .name(TypeEnum.getProcessKey(processEntity.getType()))
                .addBpmnModel(TypeEnum.getProcessKey(processEntity.getType()) + ".bpmn", bpmnModel)
                .deploy();
        log.info("部署id:{}", deploy.getId());
        return deploy.getId();
    }
    /**
     * 構(gòu)建流程模板
     *
     * @param process
     * @param startEvent
     * @param endEvent
     * @param userTaskList
     * @return void
     * @author ll
     * @date 2023/04/24 08:53
     */
    private void buildProcessTemplate(Process process, FlowElement startEvent, FlowElement endEvent, List&lt;UserTask&gt; userTaskList) {
        for (int i = 0; i &lt; userTaskList.size(); i++) {
            //用戶任務(wù)
            UserTask userTask = userTaskList.get(i);
            process.addFlowElement(userTask);
            //創(chuàng)建排它網(wǎng)關(guān)節(jié)點(diǎn)
            ExclusiveGateway exclusiveGateway = FlowableBpmnHandler.createExclusiveGateway(i);
            process.addFlowElement(exclusiveGateway);
            //開始事件到第一個(gè)節(jié)點(diǎn)
            if (i == 0) {
                // 開始節(jié)點(diǎn)到第一級(jí)節(jié)點(diǎn)
                SequenceFlow startSequenceFlow = new SequenceFlow(startEvent.getId(), userTask.getId());
                process.addFlowElement(startSequenceFlow);
            }
            //用戶任務(wù)到網(wǎng)關(guān)節(jié)點(diǎn)
            SequenceFlow sequenceFlow = new SequenceFlow(userTask.getId(), exclusiveGateway.getId());
            sequenceFlow.setName(userTask.getName() + "_開始審批");
            process.addFlowElement(sequenceFlow);
            //同意:取下一步用戶任務(wù)的節(jié)點(diǎn)id,可能為結(jié)束節(jié)點(diǎn)或者用戶任務(wù)節(jié)點(diǎn)
            String nextUserTaskId = endEvent.getId();
            if (userTaskList.size() - i &gt; 1) {
                nextUserTaskId = userTaskList.get(i + 1).getId();
            }
            SequenceFlow sequenceFlowAgree = new SequenceFlow(exclusiveGateway.getId(), nextUserTaskId);
            sequenceFlowAgree.setConditionExpression("${auditResult}");
            sequenceFlowAgree.setName("同意");
            process.addFlowElement(sequenceFlowAgree);
            //不同意:回退到上一步,取上一步的節(jié)點(diǎn)id
            String preUserTaskId = userTaskList.get(0).getId();
            if (i != 0) {
                preUserTaskId = userTaskList.get(i - 1).getId();
            }
            SequenceFlow sequenceFlowRefuse = new SequenceFlow(exclusiveGateway.getId(), preUserTaskId);
            sequenceFlowRefuse.setConditionExpression("${!auditResult}");
            sequenceFlowRefuse.setName("拒絕");
            process.addFlowElement(sequenceFlowRefuse);
        }
    }
}

保存流程配置模板的接口

@Resource
private DynamicProcessDefinition dynamicProcessDefinition;
@RequestMapping("/save")
public Result&lt;String&gt; save(@RequestBody ProcessEntity processEntity) {
    return dynamicProcessDefinition.createProcessDefinition(processEntity);;
}

開啟流程接口

@RequestMapping("/start")
    public String start(@RequestBody AuditData auditData) {
                //業(yè)務(wù)自己定義key
        String businessKey = auditData.getBusinessKey();
        //流程定義key
        String processKey = auditData.getType();
        // 判斷是否啟動(dòng)流程
        boolean isStartProcess = null != runtimeService.createProcessInstanceQuery()
                .processDefinitionKey(processKey)
                .processInstanceBusinessKey(businessKey)
                .singleResult();
        if (!isStartProcess) {
            //記錄開啟流程的用戶
            HashMap&lt;String, Object&gt; variable = Maps.newHashMap();
            //啟動(dòng)流程
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processKey, businessKey, variable);
            log.info("啟動(dòng)流程實(shí)例成功:processInstanceId={}", processInstance.getId());
        }
        return !isStartProcess ? "流程啟動(dòng)成功" : "流程啟動(dòng)失敗";
    }

以上就是flowable動(dòng)態(tài)創(chuàng)建多級(jí)流程模板demo的詳細(xì)內(nèi)容,更多關(guān)于flowable動(dòng)態(tài)多級(jí)流程模板的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java后臺(tái)開發(fā)之表單提交之前驗(yàn)證

    Java后臺(tái)開發(fā)之表單提交之前驗(yàn)證

    這篇文章主要介紹了Java后臺(tái)開發(fā)之表單提交之前驗(yàn)證的實(shí)現(xiàn)代碼,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-02-02
  • Java二維數(shù)組計(jì)算集合總結(jié)

    Java二維數(shù)組計(jì)算集合總結(jié)

    本篇文章給大家整理了關(guān)于Java二維數(shù)組計(jì)算集合的內(nèi)容總結(jié),有需要的讀者們可以參考下。
    2018-02-02
  • Spring Boot的應(yīng)用啟動(dòng)與關(guān)閉的方法

    Spring Boot的應(yīng)用啟動(dòng)與關(guān)閉的方法

    本篇文章主要介紹了Spring Boot的應(yīng)用啟動(dòng)與關(guān)閉的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Spring MVC簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Spring MVC簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Spring MVC屬于SpringFrameWork的后續(xù)產(chǎn)品,已經(jīng)融合在Spring Web Flow里面。今天先從寫一個(gè)Spring MVC的HelloWorld開始,讓我們看看如何搭建起一個(gè)Spring mvc的環(huán)境并運(yùn)行程序,感興趣的朋友一起學(xué)習(xí)吧
    2017-08-08
  • Java爬蟲爬取漫畫示例

    Java爬蟲爬取漫畫示例

    這篇文章主要介紹了Java爬蟲爬取漫畫示例,大部分的爬蟲入門教學(xué)都是爬取圖片的,本文就來測(cè)試一下爬取網(wǎng)站的漫畫,需要的朋友可以參考下
    2023-04-04
  • SpringBoot項(xiàng)目中出現(xiàn)不同端口跨域問題的解決方法

    SpringBoot項(xiàng)目中出現(xiàn)不同端口跨域問題的解決方法

    這篇文章主要介紹了SpringBoot項(xiàng)目中出現(xiàn)不同端口跨域問題的解決方法,文中介紹了兩種解決方法,并給出了詳細(xì)的代碼供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-03-03
  • Spring Boot 實(shí)現(xiàn)敏感詞及特殊字符過濾處理

    Spring Boot 實(shí)現(xiàn)敏感詞及特殊字符過濾處理

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)敏感詞及特殊字符過濾處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java面試之如何實(shí)現(xiàn)10億數(shù)據(jù)判重

    Java面試之如何實(shí)現(xiàn)10億數(shù)據(jù)判重

    當(dāng)數(shù)據(jù)量比較大時(shí),使用常規(guī)的方式來判重就不行了,所以這篇文章小編主要來和大家介紹一下Java實(shí)現(xiàn)10億數(shù)據(jù)判重的相關(guān)方法,希望對(duì)大家有所幫助
    2024-02-02
  • Jackson常用方法以及jacksonUtil工具類詳解

    Jackson常用方法以及jacksonUtil工具類詳解

    這篇文章主要介紹了Jackson常用方法以及jacksonUtil工具類詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • shiro多驗(yàn)證登錄代碼實(shí)例及問題解決

    shiro多驗(yàn)證登錄代碼實(shí)例及問題解決

    這篇文章主要介紹了shiro多驗(yàn)證登錄代碼實(shí)例及問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

化德县| 开远市| 文水县| 乐清市| 新密市| 凤庆县| 乌拉特中旗| 大荔县| 宜川县| 静宁县| 太仓市| 仁怀市| 峨眉山市| 新干县| 高密市| 监利县| 罗城| 达孜县| 阳东县| 青田县| 建水县| 涪陵区| 夏邑县| 台州市| 彭州市| 德庆县| 松潘县| 靖宇县| 兰考县| 肥城市| 关岭| 大竹县| 涞源县| 苍山县| 磐石市| 黄山市| 东至县| 琼海市| 若尔盖县| 柳河县| 栖霞市|