SpringBoot2.0 + Activiti6.0集成

文章目录

        • 1.pom.xml文件配置
        • 2.配置application-dev.yml文件
        • 3.activiti的 7 大服务接口
        • 4.生成的表的意义
        • 5.测试代码

1.pom.xml文件配置

引进mysql和activiti的jar包

       <dependency>
           <groupId>org.activitigroupId>
           <artifactId>activiti-spring-boot-starter-basicartifactId>
           <version>6.0.0version>
       dependency>
       <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
        dependency>

2.配置application-dev.yml文件

配置mysql,并为activiti配置数据源(mysql)

spring:
  activiti:
    database-schema-update: true
    #关闭activiti自动部署(因为我们使用流程设计器部署,不使用具体文件访问方式)
    check-process-definitions: false
  application:
    name: withpath_oa #这是项目名
  data:
    mongodb:
      uri: mongodb://192.168.6.242:28017/withpath_oa
  datasource:
    app:
      driverClassName: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
      username: root
      password: 123456

3.activiti的 7 大服务接口

SpringBoot2.0 + Activiti6.0集成_第1张图片
ps:图片来源于网络,侵删!!!

repositoryService:管理流程定义
activiti是不能直接识别xml格式的流程图的,流程图文件必须被部署到activiti中才能被activiti识别并使用。而这个过程就是使用repositoryService来完成的,流程图被导入后,会放到act_re_打头的几个表中。repositoryService提供了若干个接口,既可以部署xml文件到数据库中,也可以从数据库检索特定流程图供处理。

runtimeService:执行管理,包括启动、推进、删除
activiti最重要的一个服务,基本上所有的关于流程的操作都是通过此服务来执行的。例如启动流程、审批、会签等等。
formService:工作流的设计思路之一就是将每个节点需要显示的数据直接绑定到此节点。而formService就是专门为此服务的,使用formService可以获取某个节点绑定的表单数据。当然,如果没有表单绑定到此节点,此服务就没有任何用处。

identityService:组织机构管理
activiti自带的用于管理自身的组织机构的服务。activiti自身的组织机构包括user和group两大类,而user、group以及user和group的关系都是通过自服务来维护的。因此如果需要使用activiti自身的组织机构的,就会使用到此服务。不过通常情况下我们都是是用的框架中的身份认证和组织机构,所以此服务使用频率也不高。

taskService:任务管理
任务是activiti的核心功能之一,所有涉及到任务的操作都是通过此服务来完成的。例如任务的查询、分配、认领、完成等。

historyService:历史管理
所有流程实例的信息都会被保存的历史信息中,当一个流程实例结束之前,它是被保存在runtime和history两个地方,当它结束后,就只有history里了。

managementService
提供对activiti数据库的直接访问,因此通常情况下使用不到此服务。

4.生成的表的意义

ACT_RE_: 'RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_
: 'RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_: 'ID’表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_
: 'HI’表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。

5.测试代码

package com.realrainy.oa;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ActivitiTest {
	@Autowired
	private ProcessEngine processEngine;

	/**
	 * 创建28张表
	 * 创建完成后会在act_ge_property表中生成你的Activiti版本信息
	 */
	@Test
	public void createActivitiEngine() {

		/*
		 * 通过代码形式创建 - 取得ProcessEngineConfiguration对象 - 设置数据库连接属性 - 设置创建表的策略
		 * (当没有表时,自动创建表) - 通过ProcessEngineConfiguration对象创建 ProcessEngine 对象
		 */

		// 取得ProcessEngineConfiguration对象
		ProcessEngineConfiguration engineConfiguration = ProcessEngineConfiguration
				.createStandaloneProcessEngineConfiguration();
		// 设置数据库连接属性
		engineConfiguration.setJdbcDriver("com.mysql.cj.jdbc.Driver");
		engineConfiguration.setJdbcUrl(
				"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC");
		engineConfiguration.setJdbcUsername("root");
		engineConfiguration.setJdbcPassword("123456");

		// 设置创建表的策略 (当没有表时,自动创建表)
		// public static final java.lang.String DB_SCHEMA_UPDATE_FALSE =
		// "false";//不会自动创建表,没有表,则抛异常
		// public static final java.lang.String DB_SCHEMA_UPDATE_CREATE_DROP =
		// "create-drop";//先删除,再创建表
		// public static final java.lang.String DB_SCHEMA_UPDATE_TRUE =
		// "true";//假如没有表,则自动创建
		engineConfiguration.setDatabaseSchemaUpdate("true");
		// 通过ProcessEngineConfiguration对象创建 ProcessEngine 对象
		System.out.println("流程引擎创建成功!");
	}

	/**
	 * 部署工作流程定义 
	 * 部署完成后会在act_re_procdef、act_re_deployment、act_ge_bytearray表中部署相关信息
	 */
	@Test
	public void deploy() {
		// 获取仓库服务 :管理流程定义
		RepositoryService repositoryService = processEngine.getRepositoryService();

		Deployment deploy = repositoryService.createDeployment()// 创建一个部署的构建器
				.addClasspathResource("leave.bpmn")// 从类路径中添加资源,一次只能添加一个资源
				.name("员工请假流程")// 设置部署的名称
				.deploy();

//		DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
//		deploymentBuilder.name("请假流程");
//		deploymentBuilder.addClasspathResource("leave.bpmn");
//		Deployment deployment = deploymentBuilder.deploy();

		System.out.println("部署的id:" + deploy.getId());
		System.out.println("部署的名称:" + deploy.getName());
	}

	/**
	 * 查询部署的流程定义
	 */
	@Test
	public void queryDeploy() {
		RepositoryService repositoryService = processEngine.getRepositoryService();

		List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave")
				.orderByProcessDefinitionVersion().desc().list();
		for (ProcessDefinition p : list) {
			System.out.println("------------------------");
			System.out.println("流程部署id:" + p.getDeploymentId());
			System.out.println("流程定义id:" + p.getId());
			System.out.println("流程定义名称:" + p.getName());
			System.out.println("流程定义key:" + p.getKey());
			System.out.println("流程定义版本:" + p.getVersion());
		}
	}

	/**
	 * 删除部署的流程定义
	 */
	@Test
	public void deleteDeploy() {
		RepositoryService repositoryService = processEngine.getRepositoryService();

		// 下面的参数是 DeploymentId
		repositoryService.deleteDeployment("90001"); // 根据部署的id来删除
	}

	/**
	 * 创建流程实例开始执行工作流
	 * hi为历史信息
	 * 会在act_hi_actinst表中生成当前实例所经过的活动结点
	 * 会在act_hi_identitylink表中生成当前实例本省属性的相关信息
	 * 会在act_hi_taskinst生成任务结点
	 * 会在act_hi_varinst中存放流程变量信息
	 * ru运行时信息
	 * 会在act_ru_task存放任务相关信息
	 * 会在act_ru_variable存放流程变量
	 */
	@Test
	public void startProcess() {
		// 取运行时服务
		RuntimeService runtimeService = processEngine.getRuntimeService();

		// 创建流程变量,有两种方式,启动时添加和办理任务时添加。
		String name = "大狗子";
		Integer days = 3;
		String date = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分").format(new Date());
		String reason = "公园那么大,我想去溜溜!!!";
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("请假人姓名:", name);
		map.put("请假天数:", days);
		map.put("请假开始时间:", date);
		map.put("请假原因:", reason);

		// 取得流程实例
		ProcessInstance pi = runtimeService.startProcessInstanceByKey("leave", map);// 通过流程定义的key 来执行流程
		System.out.println("流程执行实例ID:" + pi.getId());
		System.out.println("流程活动节点:" + pi.getActivityId());
		System.out.println("流程定义KEY:" + pi.getProcessDefinitionId());
		System.out.println("流程实例ID:" + pi.getProcessInstanceId());

	}

	/**
	 * 查询正在运行的流程实例
	 */
	@Test
	public void queryRunntime() {
		RuntimeService runtimeService = processEngine.getRuntimeService();
		ProcessInstanceQuery processInstanceKey = runtimeService.createProcessInstanceQuery()
				.processDefinitionKey("leave");
		List<ProcessInstance> list = processInstanceKey.list();
		if (list != null && list.size() != 0) {
			for (ProcessInstance processInstance : list) {
				System.out.println("------------------------");
				System.out.println("流程活动节点:" + processInstance.getActivityId());
				System.out.println("流程定义KEY:" + processInstance.getProcessDefinitionId());
				System.out.println("流程实例ID:" + processInstance.getProcessInstanceId());
				System.out.println("流程执行实例ID:" + processInstance.getId());
				System.out.println("该实例是否执行完成:" + processInstance.isEnded());
				System.out.println("是否暂停:" + processInstance.isSuspended());
			}
		}
	}

	/**
	 * 获取流程变量
	 */
	@Test
	public void getProcessVariables() {
		String processInstanceId = "2501"; // 当前实例id
		TaskService taskService = processEngine.getTaskService();

		TaskQuery taskAssignee = taskService.createTaskQuery().processInstanceId(processInstanceId);

		Task task = taskAssignee.singleResult();
		String name = (String) taskService.getVariable(task.getId(), "请假人姓名:");
		Integer days = (Integer) taskService.getVariable(task.getId(), "请假天数:");
		String date = (String) taskService.getVariable(task.getId(), "请假开始时间:");
		String reason = (String) taskService.getVariable(task.getId(), "请假原因:");
		System.out.println("------------------------");
		System.out.println("请假人姓名:" + name);
		System.out.println("请假天数:" + days);
		System.out.println("请假开始时间:" + date);
		System.out.println("请假原因:" + reason);
		System.out.println("------------------------");
	}

	/**
	 * 查询所有未完成的任务
	 */
	@Test
	public void queryTask() {
		// 取得任务服务
		TaskService taskService = processEngine.getTaskService();
		// 创建一个任务查询对象
		TaskQuery taskQuery = taskService.createTaskQuery();
		// 查询
//		List list = taskQuery.taskAssignee("黄奇齐").list();	// 指定办理人
		List<Task> list = taskQuery.processDefinitionKey("leave").list(); // 查询所有任务

		// 遍历任务列表
		if (list != null && list.size() > 0) {
			for (Task task : list) {
				System.out.println("------------------------");
				System.out.println("任务的办理人:" + task.getAssignee());
				System.out.println("任务的id:" + task.getId());
				System.out.println("任务的名称:" + task.getName());
			}
		}
	}

	/**
	 * 查询指定实例目前正处于哪个任务环节
	 */
	@Test
	public void queryInstanceTask() {
		String processInstanceId = "2501"; // 当前实例id
		TaskService taskService = processEngine.getTaskService();
		TaskQuery taskAssignee = taskService.createTaskQuery().processInstanceId(processInstanceId);
		Task task = taskAssignee.singleResult();

		System.out.println("------------------------");
		System.out.println("任务的办理人:" + task.getAssignee());
		System.out.println("任务的id:" + task.getId());
		System.out.println("任务的名称:" + task.getName());
	}

	/**
	 * 处理指定id的任务
	 */
	@Test
	public void compileTask() {
		// 任务id
		String taskId = "7503";

		// 创建流程变量,有两种方式,启动时添加和办理任务时添加。
		String remark = "狗子,好好看家,哪都别去!!!";
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("领导建议:", remark);

//		//在任务的办理过程中设置流程变量
//		processEngine.getTaskService().setVariables(taskId, map);

		// 在任务完成时设置流程变量
//		processEngine.getTaskService().complete(taskId, map);

		processEngine.getTaskService().complete(taskId);

		System.out.println("当前任务执行完毕");
	}

	/**
	 * 查询已结束的流程实例
	 */
	@Test
	public void queryFinishedProcess() {
		List<HistoricProcessInstance> list = processEngine.getHistoryService().createHistoricProcessInstanceQuery()
				.processDefinitionKey("leave").finished() // 只查询已经结束的流程
				.list();
		if (list != null && list.size() > 0) {
			for (HistoricProcessInstance historicProcessInstance : list) {
				System.out.println("------------------------");
				System.out.println("流程定义id:" + historicProcessInstance.getProcessDefinitionId());
				System.out.println("流程实例id:" + historicProcessInstance.getId());
				System.out.println("开始时间:" + historicProcessInstance.getStartTime());
				System.out.println("结束时间:" + historicProcessInstance.getEndTime());
				System.out.println("持续时长:" + historicProcessInstance.getDurationInMillis());
			}
		}
	}

	/**
	 * 查询历史执行流程实例信息,包括完成和未完成的
	 */
	@Test
	public void queryHistoryProcInst() {
		List<HistoricProcessInstance> list = processEngine.getHistoryService().createHistoricProcessInstanceQuery()
				.processDefinitionKey("leave") // 如果没有下面指定的id,就查询出所有的流程实例
//				.processInstanceId("87501") // 指定流程实例id
				.list();
		if (list != null && list.size() > 0) {
			for (HistoricProcessInstance temp : list) {
				System.out.println("------------------------");
				System.out.println("流程实例id:" + temp.getId());
				System.out.println("流程实例名称:" + temp.getName());
				System.out.println("流程实例开始时间:" + temp.getStartTime());
				System.out.println("流程实例结束时间:" + temp.getEndTime());
				System.out.println("持续时长:" + temp.getDurationInMillis());
			}
		}
	}

}

可以看看这个博主写的!!!

你可能感兴趣的:(其他)