flowable动态创建多级流程模板实现demo

 更新时间:2023年05月23日 11:15:21   作者:多喝灬丶烫水  
这篇文章主要为大家介绍了flowable动态创建多级流程模板实现demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

flowable动态创建多级流程模板

引入Maven依赖

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

动态创建流程节点工具类

/**
 * 动态创建流程节点
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class FlowableBpmnHandler {
    /**
     * 创建开始节点信息
     *
     * @return
     */
    public static FlowElement createStartFlowElement(String id, String name) {
        StartEvent startEvent = new StartEvent();
        startEvent.setId(id);
        startEvent.setName(name);
        return startEvent;
    }
    /**
     * 创建结束节点信息
     *
     * @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;
    }
    /**
     * 循环创建普通任务节点信息
     *
     * @param processEntity 流程实体
     * @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;
    }
    /**
     * 创建排它网关节点
     *
     * @return
     */
    public static ExclusiveGateway createExclusiveGateway(Integer i) {
        ExclusiveGateway gateway = new ExclusiveGateway();
        gateway.setName("getaway_name_" + i);
        gateway.setId("getaway_id_" + i);
        return gateway;
    }
}

动态创建流程模板工具类

/**
 * 动态创建流程模板
 *
 * @author ll
 * @date 2023/04/19 14:28
 **/
@Slf4j
@Component
public class DynamicProcessDefinition {
    @Resource
    private RepositoryService repositoryService;
    public String createProcessDefinition(ProcessEntity processEntity) {
        //数据校验:传入的数据节点字段:流程配置id、节点id、节点顺序、节点描述
        List&lt;ProcessNode&gt; nodeList = processEntity.getProcessNodeList();
        if (CollUtil.isEmpty(nodeList)) {
            throw new RuntimeException("流程节点不能少于一个,请配置发起人节点和至少一个审批节点");
        }
        BpmnModel bpmnModel = new BpmnModel();
        Process process = new Process();
        bpmnModel.addProcess(process);
        // 流程标识
        process.setId(TypeEnum.getProcessKey(processEntity.getType()));
        process.setName(TypeEnum.getProcessKey(processEntity.getType()));
        //开始事件
        FlowElement startEvent = FlowableBpmnHandler.createStartFlowElement("start", "开始");
        process.addFlowElement(startEvent);
        //结束事件--任务正常完成
        FlowElement endEvent = FlowableBpmnHandler.createEndFlowElement("end", "结束");
        process.addFlowElement(endEvent);
        //创建用户节点任务
        List&lt;UserTask&gt; userTaskList = FlowableBpmnHandler.createCommonUserTask(processEntity);
        //构建流程模板
        buildProcessTemplate(process, startEvent, endEvent, userTaskList);
        //该流程的流程xml字符串
        //BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
        //byte[] convertToXML = bpmnXMLConverter.convertToXML(bpmnModel);
        //String bytes = new String(convertToXML);
        //log.info("该流程的流程xml为:{}", bytes);
        // 创建一个新的部署
        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();
    }
    /**
     * 构建流程模板
     *
     * @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++) {
            //用户任务
            UserTask userTask = userTaskList.get(i);
            process.addFlowElement(userTask);
            //创建排它网关节点
            ExclusiveGateway exclusiveGateway = FlowableBpmnHandler.createExclusiveGateway(i);
            process.addFlowElement(exclusiveGateway);
            //开始事件到第一个节点
            if (i == 0) {
                // 开始节点到第一级节点
                SequenceFlow startSequenceFlow = new SequenceFlow(startEvent.getId(), userTask.getId());
                process.addFlowElement(startSequenceFlow);
            }
            //用户任务到网关节点
            SequenceFlow sequenceFlow = new SequenceFlow(userTask.getId(), exclusiveGateway.getId());
            sequenceFlow.setName(userTask.getName() + "_开始审批");
            process.addFlowElement(sequenceFlow);
            //同意:取下一步用户任务的节点id,可能为结束节点或者用户任务节点
            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);
            //不同意:回退到上一步,取上一步的节点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) {
                //业务自己定义key
        String businessKey = auditData.getBusinessKey();
        //流程定义key
        String processKey = auditData.getType();
        // 判断是否启动流程
        boolean isStartProcess = null != runtimeService.createProcessInstanceQuery()
                .processDefinitionKey(processKey)
                .processInstanceBusinessKey(businessKey)
                .singleResult();
        if (!isStartProcess) {
            //记录开启流程的用户
            HashMap&lt;String, Object&gt; variable = Maps.newHashMap();
            //启动流程
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processKey, businessKey, variable);
            log.info("启动流程实例成功:processInstanceId={}", processInstance.getId());
        }
        return !isStartProcess ? "流程启动成功" : "流程启动失败";
    }

以上就是flowable动态创建多级流程模板demo的详细内容,更多关于flowable动态多级流程模板的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot返回多种格式的数据的实现示例

    SpringBoot返回多种格式的数据的实现示例

    本文主要介绍了SpringBoot返回多种格式的数据的实现示例,主要包括了FastJson,xml,pdf,excel,资源流,具有一定的参考价值,感兴趣的可以了解一下
    2021-10-10
  • 深入浅出分析Java 类和对象

    深入浅出分析Java 类和对象

    面向对象乃是Java语言的核心,是程序设计的思想。Java语言的面向对象技术包括了面向对象和面向过程的基本概念,面向对象的特征,Java语言的类,对象,修饰符,抽象类等一系列的知识点
    2022-03-03
  • Java语言实现非递归实现树的前中后序遍历总结

    Java语言实现非递归实现树的前中后序遍历总结

    今天小编就为大家分享一篇关于Java语言实现非递归实现树的前中后序遍历总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java数组索引异常产生及解决方案

    Java数组索引异常产生及解决方案

    这篇文章主要介绍了Java数组索引异常产生及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java实现简单堆栈代码

    Java实现简单堆栈代码

    这篇文章主要为大家详细介绍了Java实现简单堆栈代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 详解spring boot mybatis全注解化

    详解spring boot mybatis全注解化

    这篇文章主要介绍了spring boot mybatis全注解化的相关资料,需要的朋友可以参考下
    2017-09-09
  • 教你Spring Cloud保证各个微服务之间调用安全性

    教你Spring Cloud保证各个微服务之间调用安全性

    在微服务的架构下,系统会根据业务拆分为多个服务,各自负责单一的职责,在这样的架构下,我们需要确保各api的安全性,今天通过本文给大家分享Spring Cloud中如何保证各个微服务之间调用的安全性,需要的朋友参考下吧
    2021-08-08
  • Java利用VLC开发简易视屏播放器功能

    Java利用VLC开发简易视屏播放器功能

    这篇文章主要介绍了Java利用VLC开发简易视屏播放器,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Java中Map的用法详解

    Java中Map的用法详解

    将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口
    2016-05-05
  • RocketMQ整合SpringBoot实现生产级二次封装

    RocketMQ整合SpringBoot实现生产级二次封装

    本文主要介绍了RocketMQ整合SpringBoot实现生产级二次封装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论