zoukankan      html  css  js  c++  java
  • 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();
                }
    
    }

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

  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/WQX-work24/p/12190657.html
Copyright © 2011-2022 走看看