flowable实现自定义代码方式生成流程model_flow.setconditionexpressionyon()-程序员宅基地

技术标签: activity  

一、步骤:

1.创建 BpmnModel

2.为BpmnModel设置Process

3.创建FlowElement

3.为Process添加FlowElement

4.校验BpmModel,部署

二、代码实现:

public void test(String activity){
        Deployment deploy=null;
        try {

            BpmnModel bpmnModel=new BpmnModel();
            //设置流程信息
            //此信息都可以通过前期自定义数据,使用时再查询
            Process process=new Process();
            process.setId("test_model_3");
            process.setName("测试流程图三");
            //添加流程节点信息---start
            String startId="startEvent_id_1";
            String startName="开始_1";
            String endId="endEvent_id_1";
            String endName="结束_1";
            //创建数组存储所有流程节点信息
            List<FlowElement> elementList=new ArrayList<>();
            //创建开始节点
            FlowElement startFlowElement=createStartFlowElement(startId,startName);
            FlowElement endFlowElement=createEndFlowElement(endId,endName);
            elementList.add(startFlowElement);
            elementList.add(endFlowElement);

            //查询普通任务节点信息
            elementList.addAll(findUserTaskElements());

            //把节点放入process
            elementList.stream().forEach(item -> process.addFlowElement(item));

            //查询各个节点的关系信息,并添加进流程
            List<FlowElementPojo> flowElementPojoList =createCirculationSequence();
            for (FlowElementPojo flowElementPojo:flowElementPojoList){
                SequenceFlow sequenceFlow=createSequeneFlow(flowElementPojo.getId(),"流转",flowElementPojo.getResourceFlowElementId(),
                        flowElementPojo.getTargetFlowElementId(),"${a==\"f\"}");
                process.addFlowElement(sequenceFlow);
            }

            bpmnModel.addProcess(process);

            //校验bpmModel
            ProcessValidator processValidator=new ProcessValidatorFactory().createDefaultProcessValidator();
            List<ValidationError> validationErrorList=processValidator.validate(bpmnModel);
            if (validationErrorList.size()>0){
                throw new RuntimeException("流程有误,请检查后重试");
            }

            String fileName="model_"+activity+"bpmn20.xml";

            //生成自动布局
            new BpmnAutoLayout(bpmnModel).execute();
            deploy =repositoryService.createDeployment().addBpmnModel(fileName,bpmnModel)
                    .tenantId("intelligentAsset")
                    .deploy();
        }catch (Exception e){


        }finally {

        }

    }

 创建开始节点:

    /**
     * 创建开始节点信息
     * @return
     */
    public FlowElement createStartFlowElement(String id,String name){
        StartEvent startEvent=new StartEvent();
        startEvent.setId(id);
        startEvent.setName(name);
        return startEvent;
    }

创建结束节点:

    /**
     * 创建结束节点信息
     * @param id
     * @param name
     * @return
     */
    public FlowElement createEndFlowElement(String id,String name){
        EndEvent endEvent=new EndEvent();
        endEvent.setId(id);
        endEvent.setName(name);
        return endEvent;
    }

创建普通任务节点:

    /**
     * 创建普通任务节点信息
     * @param id
     * @param name
     * @param assignee
     * @return
     */
    public FlowElement createCommonUserTask(String id,String name,String assignee){
        UserTask userTask=new UserTask();
        userTask.setId(id);
        userTask.setName(name);
        userTask.setAssignee(assignee);
        return userTask;
    }

创建会签任务节点信息:

 /**
     * 创建会签节点信息
     * @param id
     * @param name
     * @return
     */
    public FlowElement createMultiUserTask(String id,String name){
        UserTask userTask=new UserTask();
        userTask.setId(id);
        userTask.setName(name);
        //分配用户
        userTask.setAssignee("${assignee}");
        MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics=new MultiInstanceLoopCharacteristics();
//        multiInstanceLoopCharacteristics.setCollectionString("${collectionList}");
        //完成条件,默认所有人都完成
        multiInstanceLoopCharacteristics.setCompletionCondition("${completionCondition}");
        //元素变量多实例,一般和设置的assignee变量是对应的
        multiInstanceLoopCharacteristics.setElementVariable("assignee");
        //集合多实例,用于接收集合数据的表达式
        multiInstanceLoopCharacteristics.setInputDataItem("${itemList}");
        userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
        return userTask;


    }

创建/查询各个节点的流转关系信息:

/**
     * 查询各节点关联流转信息,即流转线
     *FlowElementPojo 是自定义类
     */
    public List<FlowElementPojo> createCirculationSequence(){


        List<FlowElementPojo> list=new ArrayList<>();
        FlowElementPojo flowElementPojo_start=new FlowElementPojo();
        flowElementPojo_start.setId("sequence_id_1");
        flowElementPojo_start.setTargetFlowElementId("userTask_0");
        flowElementPojo_start.setResourceFlowElementId("startEvent_id_1");
        flowElementPojo_start.setFlowElementType("sequence");

        FlowElementPojo flowElementPojo_user_0=new FlowElementPojo();
        flowElementPojo_user_0.setId("sequence_id_2");
        flowElementPojo_user_0.setTargetFlowElementId("userTask_1");
        flowElementPojo_user_0.setResourceFlowElementId("userTask_0");
        flowElementPojo_user_0.setFlowElementType("sequence");

        FlowElementPojo flowElementPojo_user_1=new FlowElementPojo();
        flowElementPojo_user_1.setId("sequence_id_3");
        flowElementPojo_user_1.setTargetFlowElementId("userTask_2");
        flowElementPojo_user_1.setResourceFlowElementId("userTask_1");
        flowElementPojo_user_1.setFlowElementType("sequence");

        FlowElementPojo flowElementPojo_user_2=new FlowElementPojo();
        flowElementPojo_user_2.setId("sequence_id_4");
        flowElementPojo_user_2.setTargetFlowElementId("endEvent_id_1");
        flowElementPojo_user_2.setResourceFlowElementId("userTask_2");
        flowElementPojo_user_2.setFlowElementType("sequence");

        list.add(flowElementPojo_start);
        list.add(flowElementPojo_user_0);
        list.add(flowElementPojo_user_1);
        list.add(flowElementPojo_user_2);

        return list;

    }
/**
     * 绘制节点流转顺序
     * @param id
     * @param name
     * @param targetId
     * @param sourceId
     * @param conditionExpression
     * @return
     */
    public SequenceFlow createSequeneFlow(String id,String name,String sourceId,String targetId,String conditionExpression){
        SequenceFlow sequenceFlow=new SequenceFlow();
        sequenceFlow.setId(id);
        sequenceFlow.setName(name);
        if (ObjectUtils.isNotEmpty(targetId)){
            sequenceFlow.setTargetRef(targetId);
        }
        if (ObjectUtils.isNotEmpty(sourceId)){
            sequenceFlow.setSourceRef(sourceId);
        }
        if (ObjectUtils.isNotEmpty(conditionExpression)){
            sequenceFlow.setConditionExpression(conditionExpression);
        }
        return sequenceFlow;
    }

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39102174/article/details/102585135

智能推荐

KEIL文件移动脚本--网关脚本_nrfutil' 不是内部或外部命令,也不是可运行的程序-程序员宅基地

文章浏览阅读650次。上面是效果原因 每次都是编译在大文件里面我希望只有BIN文件在一个干净的地方写一个.BAT在任何地方都是可以执行的 最后挂在KEIL里面内容 mv.batFOR /F %%I IN ('DIR /B /S "D:\TSBrowserDownloads\DA145xx_SDK_for_handover\DA145xx_SDK\old\projects\Izar\src\Node_Dialog_DA14531_SHENNONG\Keil_5\out_DA14531\Ob..._nrfutil' 不是内部或外部命令,也不是可运行的程序

全面解析并解决计算机缺失msvcp80.dll文件的问题-程序员宅基地

文章浏览阅读427次,点赞24次,收藏17次。在使用计算机过程中,有时会遇到“计算机缺失msvcp80.dll文件”的错误提示,这直接影响了部分应用程序的正常运行。msvcp80.dll是Microsoft Visual C++ 2005 redistributable runtime library(即VC++ 2005运行时库)的一部分,对于基于VC++ 2005编译的应用程序至关重要。本文将深入探究此问题产生的原因,并提出切实可行的解决方案。_msvcp80.dll

<读书笔记>《JS DOM编程艺术》-程序员宅基地

文章浏览阅读54次。2016/03/04 12:00第一二章:JS的简史以及基本语法1.P112.variable3.P13 等于4.P135.P14 转义字符6.关联数组不是一个好习惯7.P18 对象8.P31firefox和chrome的兼容性;+1900,IE好着呢;第三章:强大的DOM编程1.DOM:Document O..._dom编程艺术第3版下载

高级信息系统项目管理师—论文—进度管理_信息系统集成项目管理工程师高级论文-程序员宅基地

文章浏览阅读9.6k次,点赞7次,收藏35次。摘要:2015年3月,我作为项目经理参与了某公司与XX市交通运输局的道路交通智能监控抓拍系统的建设工作。我作为项目经理,主要进行了需求分析、系统设计、项目管理等工作。我十分重视项目的进度管理,运行丰富的项目管理经验,结合进度管理理论,对项目的各阶段进行了进度管理:规划进度管理、定义活动、估算活动顺序、估算活动资源、估算活动持续时间、制定进度计划、控制项目进度等过程全面展开对沟通的管控。依照项目管理..._信息系统集成项目管理工程师高级论文

java Lambda-程序员宅基地

文章浏览阅读317次。 https://www.cnblogs.com/heimianshusheng/p/5663913.html

UI设计师未来职业规划_ui设计未来工作期望-程序员宅基地

文章浏览阅读1.7k次。  近几年UI设计行业一直都比较火,不少其他行业的设计师都转行UI设计。这时候可能就会有小伙伴问未来职业规范怎么做才能脱颖而出呢?今天胡老师和大家来探讨一下。  现在的UI设计的市场需求和刚兴起那会截然不同,那时只要会设计图标简单的界面就可以找到一份很不错工作。而且薪资也比较可观。因此UI设计瞬间爆火,还有很多设计同行也分分转战UI设计。这个职位的特点,一定是指数型的,好的人会越来越好,一般的人面对的门槛则会提高。其实任何行业和职业都是这样的,只不过在互联网的设计师、工程师(以及其他职位)中,尤其明显。_ui设计未来工作期望

随便推点

Mybatis_"mybatis the content of element type \"choose\" mu-程序员宅基地

文章浏览阅读261次。Mybatis环境:JDK1.8Mysql5.7maven 3.6.1IDEA回顾JDBCMysqlJava基础MavenJunit1. 简介1.1 什么是MybatisMyBatis 是一款优秀的持久层框架它支持自定义 SQL、存储过程以及高级映射MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java _"mybatis the content of element type \"choose\" must match \"(when*,otherwise?)"

【预测模型】基于萤火虫算法优化bp神经网络实现数据预测matlab源码_mape1=mean(abs(error./output_test));-程序员宅基地

文章浏览阅读700次。1 算法介绍1.1 萤火虫算法算法基本思想描述如下:在群体中,每个萤火虫个体被随机分布在目标函数定义的空间中,初始阶段,所有的萤火虫都具有相同的荧光素值和动态决策半径。其中,每个萤火虫个体根据来自动态决策半径内所有邻居萤火虫信号的强弱来决定其移动的方向。萤火虫的动态决策半径会随着在它范围内萤火虫个体的数目而变化,每个萤火虫的荧光素也会随着决策半径内萤火虫个体的数目而改变。萤火虫群优化算法是无记忆的,无需目标函数的全局信息和梯度信息,具有计算速度快,调节参数少,易于实现等特点。萤火虫进化过程中,每次._mape1=mean(abs(error./output_test));

mybatis自动生成代码时报错:The server time zone value ‘�й���׼ʱ��‘ is unrecognized or represents more than one_mybatisplus报错the server time zone value ' й-程序员宅基地

文章浏览阅读588次。这种情况一般是因为在generatorConfig.xml文件中,连接数据库时缺少serverTimeZone导致的,在数据库连接上加上serverTimeZone=UTC即可解决。generatorConfig.xml代码如下:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator.._mybatisplus报错the server time zone value ' й

相机标定-机器视觉基础(理论推导、Halcon和OpenCV相机标定)_机器视觉标定-程序员宅基地

文章浏览阅读5.3k次,点赞13次,收藏109次。相机标定是获得目标工件精准坐标信息的基础。首先,必须进行相机内参标定,构建一个模型消除图像畸变;其次,需要对相机和机器人的映射关系进行手眼标定,构建一个模型将图像坐标系上的点映射到世界坐标系。主要分为背景知识、相机内外参模型推导、编程代码实现三个部分。_机器视觉标定

RBM-MHC: A Semi-Supervised Machine-LearningMethod for Sample-Specific Prediction of AntigenPresent-程序员宅基地

文章浏览阅读211次。介绍:本文提出了一种灵活的机器学习方法,用于预测组织相容性白细胞抗原I类蛋白呈递给T细胞的病毒和癌症抗原。该方法旨在对新获得的样本进行预测,现在数据库中关于呈递HLA蛋白的信息很少。1、Highlights:为定制和新产生的数据集可以提供灵活的HLA抗原呈递预测; 预测较差的HLA等位基因得到改善; 在只有很少HLA注释的情况下,能够准确预测HLA类型; 拥有更加低维的数据表示;2、摘要 目前最先进的方法可以准确预测HLA等位基因的表达,在比较具有代表性的等位基因中表现比较好,..._rbm-mhc

【Python】PyQt5 指示灯控件的制作,以及窗口动态添加、删除指示灯控件_pyqt led灯-程序员宅基地

文章浏览阅读7k次,点赞4次,收藏45次。pyqt 自定义了一个指示灯控件,并在窗口中实现动态添加、删除指示灯控件的操作。_pyqt led灯

推荐文章

热门文章

相关标签