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

落爺英雄遲暮 提交于 2020-01-14 11:54:46

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

 

1.配置maven环境

2.运行测试代码

3.代码实现activity工作流

 

1.配置maven环境

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

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

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

  离线通过安装包来安装

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

    解压后,将 对应的plugins中j所有ar包(我的解压路径是:D:\activityWorkFlow\ActivitiDesigner\plugins)复制到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();
            }

}

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!