• maven 实现activity工作流的简单例子(以报销为例 附代码)


    今天看到公司有一个项目,是关于activity工作流的,第一次接触,记录一下,方便巩固和之后的查询。

    1.配置maven环境

    2.运行测试代码

    3.代码实现activity工作流

    1.配置maven环境

      activity是一个比较简单容易上手的工作流,主要操作分为一下步骤

    • 利用activity插件画出需要的逻辑流程图
    • 部署流程
    • 启动流程
    • 迭代处理流程
    • 流程结束

    (1)安装所需的画图插件(有在线安装和离线安装,建议是离线安装)

      离线通过安装包来安装

        下载链接:https://pan.baidu.com/s/1jZgTImyDFsQ62ttt5CyQKg,提取码:abw0

        解压后,将 对应的plugins中j所有ar包(我的解压路径是:D:activityWorkFlowActivitiDesignerplugins)复制到maven工具的安装目录()下,然后删除configuration文件下的org.eclipse.update整个文件(不删掉的话,会报错的)

      然后在 maven工具中选择help - install new software

    点击进来后,选择  add - local… 选择画图插件解压后的位置,如下图:

    验证是否安装成功,在maven工具中,点击 file - new - other...中 搜索activiti 如果出现  activiti diagram  和activiti project 两个文件 ,说明已经安装成功了。

        

    2.运行测试代码

    1.在maven工具中,新建一个maven工程

    2.在pom.xml配置文件中导入需要依赖的jar包,以mysql数据库为例

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>mavenPro</groupId>
      <artifactId>activityWordFlow</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
      
      <name>activityWordFlow</name>
      <url>http://maven.apache.org</url>
      <properties>  
        </properties>
      
       <dependencies> 
        <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-engine</artifactId>
        <version>6.0.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.activiti/activiti-spring -->
        <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring</artifactId>
        <version>6.0.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all -->
        <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.5.7</version>
        <type>pom</type>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-jdk14 -->
        <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-jdk14</artifactId>
        <version>1.7.25</version>
        <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.17</version>
        </dependency>
      </dependencies> 
      
    </project>
    pom.xml

     注意:如果版本不对引起的报错,可以百度“maven中央仓库”,在里面找到对应依赖的jar包,复制粘贴,替换即可。

    3.然后新建一个activiti.cfg.xml配置文件,来创建连接对应的数据库。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
            <property name="databaseSchemaUpdate" value="true"/>
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti"/>
            <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUsername" value="root" />
            <property name="jdbcPassword" value="qwer1234" />
        </bean>
    </beans>

     4.新建一个java类,用来在msql数据库中创建表

    package activityWordFlow;
    
    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.ProcessEngineConfiguration;
    
    public class CreateTable {
        public static void main(String[] args) {             
            ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();     
            System.out.println("processEngine="+processEngine);
             
        }
    }

    其中:是根据第3步的配置文件名称(activiti.cfg.xml),运行后,查看数据库,就会出现28张表,如下图:

     5. 先把properties界面展示出来,方便之后使用。

    6.以简单报销流程为例,在maven工具中,利用画图插件新建一个baoxiao.bpmn,如图:

    7.在界面上palette(画板)中,把StartEvent节点拖出来即可,然后选择 new user task,新增一个用户,依次添加报销人、经理审批、财务审批和结束节点(EndEvent),添加完成后,如下图:

    在该流程中的各个环节 ,配置属性   报销人---employee、经理审批---manager、财务审批 --- account,保存一下该流程

    注:如果保存成功了,会有同名的.png图片生成,本例子中是baoxiao.png,如图:

    如果没有生成的话,请在Window - preferences - save action 中,勾选 create process ...这一选项。

    到第七步完成后,一个简单报销的activity工作流已经建好了,接下来就是要通过代码来实现该工作流。

    3.代码实现activity工作流

    package activityWordFlow;
    
    import java.util.List;
    
    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.ProcessEngines;
    import org.activiti.engine.RuntimeService;
    import org.activiti.engine.repository.Deployment;
    import org.activiti.engine.runtime.ProcessInstance;
    import org.activiti.engine.task.Task;
    
    
    
    public class run {
            /**
             * 部署流程
             * 执行完,就会像act_re_procdef、act_re_deployment和act_ge_bytearray三张表中,插入数据
             */
            private static ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
             
                public void delployFlow(){
                             Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的service
                            .createDeployment()//创建一个部署对象
                            .name("报销流程")    //添加部署对象名称
                            .addClasspathResource("baoxiao.bpmn")//从classpath的资源加载,一次只能加载一个文件
                            .addClasspathResource("baoxiao.png")//从classpath的资源加载,一次只能加载一个文件
                            .deploy();//完成部署
                    
                    // 存在在数据库 act_re_procdef的DEPLOYMENT_ID_
                    //act_re_procdef(流程定义数据表)  act_re_deployment  (部署信息表)   act_ge_bytearray(资源文件表)
                    System.out.println(deployment.getId());
                    System.out.println(deployment.getName());
               }
                /**
                 * 启动流程  runtimeService对象
                 * 执行完,就会在 act.ru.task表中,插入数据(每次插入一条数据)
                 */
                public void flowStart() {
                    RuntimeService runtimeService = processEngine.getRuntimeService();// 获取runtimeService对象
                    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("员工报销单据");//act_re_procdef(流程定义数据表)中的key_字段
                }
                /**
                 * 查找代办任务信息
                 */
                public void findEmployeeTask(){
                    //数据库关系》》》》ID【act_re_deployment】 == ID【act_ru_execution】  == ID【act_ru_task】 ==》【ASSIGNEE_(cwh)】
                    String assignee = "employee";  //节点的assignee_   
                    List<Task> taskList= processEngine.getTaskService()//获取任务启动流程的service
                            .createTaskQuery()//创建查询对象
                            .taskAssignee(assignee)//指定查询人
                            .list();
                    
                    if(taskList.size()>0){
                        for (Task task : taskList){
                            System.out.println("代办任务ID:"+task.getId());
                            System.out.println("代办任务name:"+task.getName());
                            System.out.println("代办任务创建时间:"+task.getCreateTime());
                            System.out.println("代办任务办理人:"+task.getAssignee());
                            System.out.println("流程实例ID:"+task.getProcessInstanceId());
                            System.out.println("执行对象ID:"+task.getExecutionId());
                        }
                    }
                }
    
                /**
                 * 处理流程
                 * 
                 * 根据act_ru_task 任务表的id,获取流程的service对象,调用complete方法来处理流程。
                 * 
                 * @Description:
                 */
                public void completeTask(){
                    // ID【act_ru_task】
                    String taskId = "2505";        
                    processEngine.getTaskService().complete(taskId);//完成任务     
                    System.out.println("完成任务,任务ID:"+taskId);
             
              }
    
                public static void main(String[] args) {
                    run r = new run();
                    //r.delployFlow();
                    //r.flowStart();
                    r.findEmployeeTask();
                    //r.completeTask();
                }
    
    }

    如上图,注释上都写的很清楚了,一次执行以上方法,对应数据库中的表,就能查看到,工作流的数据流向。

  • 相关阅读:
    成为高级 React 开发你需要知道的知识点
    Socket 连接问题之大量 TIME_WAIT
    x == (x = y) 不等于 (x = y) == x ?
    「工具」三分钟了解一款思维导图工具:XMind Zen
    Touch Bar 废物利用系列 | 在触控栏上显示 Dock 应用图标
    vim中delete(backspace)键不能向左删除
    Vue2.0学习(四)--组件的继承与扩展
    quasar+cordova+zbar实现Android扫描条形码
    PWA技术理论+实战全解析
    分页请求时,有新数据加入时,下一页会出现重复数据问题
  • 原文地址:https://www.cnblogs.com/WQX-work24/p/12190657.html
Copyright © 2020-2023  润新知