activiti工作流的常规操作

一,pom文件引入jar包(如下是完整的pom文件)

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.activiti</groupId>
  <artifactId>activi01</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>activi01 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
  <properties>
  	<activiti.version>7.0.0.Beta1</activiti.version>
    <log4j.version>1.2.12</log4j.version>
    <slf4j.version>1.6.6</slf4j.version>
  </properties>
  
  <dependencies>
	<!-- activiti,mysql,mybatis,log4j,数据库连接池的包 -->
	<dependency>
	    <groupId>org.activiti</groupId>
	    <artifactId>activiti-engine</artifactId>
	    <version>${activiti.version}</version>
	</dependency>
	<dependency>
	    <groupId>org.activiti</groupId>
	    <artifactId>activiti-spring</artifactId>
	    <version>${activiti.version}</version>
	</dependency>
	<!-- 模型处理 -->
	<dependency>
	    <groupId>org.activiti</groupId>
	    <artifactId>activiti-bpmn-model</artifactId>
	    <version>${activiti.version}</version>
	</dependency>
	<!-- bgmn 转换 -->
	<dependency>
	    <groupId>org.activiti</groupId>
	    <artifactId>activiti-bpmn-converter</artifactId>
	    <version>${activiti.version}</version>
	</dependency>
	<!-- bpmn 转换 -->
	<dependency>
	    <groupId>org.activiti</groupId>
	    <artifactId>activiti-json-converter</artifactId>
	    <version>${activiti.version}</version>
	</dependency>
	<!-- bpmn 布局 -->
	<dependency>
	    <groupId>org.activiti</groupId>
	    <artifactId>activiti-bpmn-layout</artifactId>
	    <version>${activiti.version}</version>
	</dependency>
	<!-- activiti 云支持 -->
	<dependency>
	    <groupId>org.activiti.cloud</groupId>
	    <artifactId>activiti-cloud-services-api</artifactId>
	    <version>${activiti.version}</version>
	</dependency>
	<!-- mysql -->
	<dependency>
	    <groupId>mysql</groupId>
	    <artifactId>mysql-connector-java</artifactId>
	    <version>5.1.40</version>
	</dependency>
	<!-- mybatis -->
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis</artifactId>
	    <version>3.4.5</version>
	</dependency>
	<dependency>
	    <groupId>commons-dbcp</groupId>
	    <artifactId>commons-dbcp</artifactId>
	    <version>1.4</version>
	</dependency>
	 <!-- https://mvnrepository.com/artifact/junit/junit -->
	<dependency>
	    <groupId>junit</groupId>
	    <artifactId>junit</artifactId>
	    <version>4.12</version>
	    <scope>test</scope>
	</dependency>
	<dependency>
	    <groupId>log4j</groupId>
	    <artifactId>log4j</artifactId>
	    <version>${log4j.version}</version>
	</dependency>
	<dependency>
	    <groupId>org.slf4j</groupId>
	    <artifactId>slf4j-api</artifactId>
	    <version>${slf4j.version}</version>
	</dependency>
	<dependency>
	    <groupId>org.slf4j</groupId>
	    <artifactId>slf4j-log4j12</artifactId>
	    <version>${slf4j.version}</version>
	</dependency>
  </dependencies>
  
  
  <build>
    <finalName>activi01</finalName>
  </build>
</project>

二,创建bpmn文件evection.bpmn

请提前安装bpmn插件

ecevtion.bpmn

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="myEvection" name="出差申请" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="创建出差申请" activiti:assignee="zhangsan"></userTask>
    <userTask id="usertask2" name="经理审批" activiti:assignee="Jerry"></userTask>
    <userTask id="usertask3" name="总经理审批" activiti:assignee="jack"></userTask>
    <userTask id="usertask4" name="财务审批" activiti:assignee="rose"></userTask>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
    <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="usertask4"></sequenceFlow>
    <sequenceFlow id="flow5" sourceRef="usertask4" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_myEvection">
    <bpmndi:BPMNPlane bpmnElement="myEvection" id="BPMNPlane_myEvection">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="365.0" y="191.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="330.0" y="332.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="330.0" y="470.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
        <omgdc:Bounds height="55.0" width="105.0" x="330.0" y="580.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask4" id="BPMNShape_usertask4">
        <omgdc:Bounds height="55.0" width="105.0" x="330.0" y="690.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="365.0" y="820.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="382.0" y="226.0"></omgdi:waypoint>
        <omgdi:waypoint x="382.0" y="332.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="382.0" y="387.0"></omgdi:waypoint>
        <omgdi:waypoint x="382.0" y="470.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="382.0" y="525.0"></omgdi:waypoint>
        <omgdi:waypoint x="382.0" y="580.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
        <omgdi:waypoint x="382.0" y="635.0"></omgdi:waypoint>
        <omgdi:waypoint x="382.0" y="690.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
        <omgdi:waypoint x="382.0" y="745.0"></omgdi:waypoint>
        <omgdi:waypoint x="382.0" y="820.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

注意:保存bpmn文件会自动生成一个同名后缀为.png的文件(生成图片比较慢),如果不能生成请检查配置。

三.创建activiti.cfg.xml和log4j.properties文件

activiti.cfg.xml

注:请先新建一个activiti的数据库

<?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 -->
    <bean id="processEngineConfiguration"
        class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/activiti?useSSL=false&amp;serverTimezone=UTC" />
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUsername" value="root" />
        <property name="jdbcPassword" value="123456" />
        <!-- activiti数据库表生成策略,true表示如果数据库中已存在相应的表,那么直接使用,如果不存在,那么会创建 -->
        <property name="databaseSchemaUpdate" value="true" />
        <!-- 
        <property name="createDiagramOnDeploy" value="false" />
         -->
    </bean>
</beans>

 log4j.properties

log4j.rootCategory=debug,CONSOLE,LOGFILE

log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c{1}:%L] - %m%n
log4j.appender.CONSOLE.Encoding=UTF-8
log4j.appender.CONSOLE.threshold=INFO

#将WARN等级的错误日志输出到每天目录,每天一个文件
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.File=logs/act/activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c{1}:%L]  - %m%n
log4j.appender.LOGFILE.Encoding=UTF-8

四,创建junit4测试类

package com.activiti01;

import java.util.List;

import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricActivityInstanceQuery;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class ActivitiDemo {

	/**
	 * 测试流程部署
	 */
	@Test
	public void testDeployment() {

		// 1 创建 ProcessEngine
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		// 2 获取RepositoryService
		RepositoryService repositoryService = processEngine.getRepositoryService();

		// 3使用 service进行流程部署,定义一个流程的名字,把bpmn和png文件部署到数据库
		Deployment deployment = repositoryService.createDeployment().name("出差申请流程")
				.addClasspathResource("bpmn/evection.bpmn").addClasspathResource("bpmn/evection.png").deploy();
		// 4 (非必须)输出部署信息
		System.out.println("流程部署的id=" + deployment.getId());
		System.out.println("流程部署的name=" + deployment.getName());

	}

	/**
	 * 启动流程实例 <br>
	 * act_hi_actinst 流程实例执行的历史<br>
	 * act_hi_indentitylink 流程参与者的历史信息 <br>
	 * act_hi_procinst 流程实例的历史信息 <br>
	 * act_hi_taskinst 任务的历史信息 <br>
	 * act_ru_execution 流程执行的信息 <br>
	 * act_ru_indentitylink 流程参与者信息 <br>
	 * act_ru_task 任务信息 <br>
	 * 
	 */
	@Test
	public void testStartProcess() {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		RuntimeService runtimeService = processEngine.getRuntimeService();
		ProcessInstance instance = runtimeService.startProcessInstanceByKey("myEvection");

		System.out.println("流程定义的ID:" + instance.getProcessDefinitionId());
		System.out.println("流程实例的ID:" + instance.getId());
		System.out.println("当前活动的ID:" + instance.getActivityId());

	}

	/**
	 * 查询个人待执行的任务
	 */
	@Test
	public void testFindPersonalTaskList() {
		// 1 获取流程引擎
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

		// 2 获取taskService
		TaskService taskService = processEngine.getTaskService();
		// 3 根据流程的key和任务的负责人 查询任务
		List<Task> list = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("zhangsan")
				.list();

		// 4 输出
		for (Task task : list) {
			System.out.println("流程实例的ID=" + task.getProcessInstanceId());
			System.out.println("任务的ID=" + task.getId());
			System.out.println("任务负责人=" + task.getAssignee());
			System.out.println("任务名称=" + task.getName());
		}

	}

	/**
	 * 完成个人任务
	 */
	@Test
	public void completTask() {
		// 1 获取流程引擎
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

		// 2 获取taskService
		TaskService taskService = processEngine.getTaskService();

		// 3 根据任务id完成任务
		taskService.complete("2505");

	}


	/**
	 * 历史审批流程
	 */
	@Test
	public void test2() {
		// 创建ProcessEngineConfiguration对象
		ProcessEngineConfiguration configuration = ProcessEngineConfiguration
				.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
		// 获取ProcessEngine对象
		ProcessEngine processEngine = configuration.buildProcessEngine();
		// 获取HistoryService对象
		HistoryService historyService = processEngine.getHistoryService();
		// 获取HistoricActivityInstanceQuery查询对象
		HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService
				.createHistoricActivityInstanceQuery();
		List<HistoricActivityInstance> historicActivityInstanceList = historicActivityInstanceQuery.list();
		for (HistoricActivityInstance historicActivityInstance : historicActivityInstanceList) {
			String activityId = historicActivityInstance.getActivityId();
			System.out.println("activityId = " + activityId);
			String activityName = historicActivityInstance.getActivityName();
			System.out.println("activityName = " + activityName);
			String processDefinitionId = historicActivityInstance.getProcessDefinitionId();
			System.out.println("processDefinitionId = " + processDefinitionId);
			String processInstanceId = historicActivityInstance.getProcessInstanceId();
			System.out.println("processInstanceId = " + processInstanceId);
			
			System.out.println("----------------");
		}

	}

	@Test
	public void test() {
		System.out.println("Test");

	}

}

猜你喜欢

转载自blog.csdn.net/u011628753/article/details/121393528