流程图如下:
接下来我们通过代码方式来模拟一下基本流程
1.简历流程图bpmn:
assignee:代理人、指定人、处理人
2.创建流程引擎以及工作流数据表:
数据库及表可以自动创建,可以在配置数据库连接时,实现自动创建数据库和表
3.部署流程:
所影响的表
-- 部署表:id是由act_ge_property的 next_dbid决定
SELECT * FROM act_re_deployment;
-- 流程定义表:该表的key属性是bpmn的id决定
-- 该表的name属性 是bpmn 的name 属性决定
SELECT * FROM act_re_procdef;
-- 通用属性表
SELECT * FROM act_ge_property;
-- 开启流程: 执行对象,流程实例,流程对象
SELECT * FROM act_ru_execution;
-- 任务表
SELECT * FROM act_ru_task;
首先获取默认activiti.cfg.xml文件:
private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
文件配置如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 配置 ProcessEngineConfiguration -->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- 配置数据库连接 -->
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activitiDB?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="aini1314"></property>
<!-- 配置创建表策略 :没有表时,自动创建 -->
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
然后我们部署流程:
/**
* 部署流程定义
*/
@Test
public void deploy(){
//取得路程引擎对象
//获取仓库服务:管理流程定义
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment() //创建一个部署服务器
.addClasspathResource("diagrams/LevalBill.bpmn") //从类路径中添加资源,一次只能添加一个资源
.addClasspathResource("diagrams/LevalBill.png")
.name("请假单流程") //设置部署的名称
.category("办公类型")
.deploy();
System.out.println("部署的id:" + deployment.getId());
System.out.println("部署的名字:" + deployment.getName());
System.out.println("部署的类型:" + deployment.getCategory());
}
这时我们可以发现以上那几张表上便有了数据:
创建了
4.执行流程:
接下来我们开始执行流程:一开始会到第一个流程上去
/**
* 执行流程
*/
@Test
public void startProcess(){
String processDefiKey="myProcess";
//取运行时服务
RuntimeService runtimeService = processEngine.getRuntimeService();
//取得流程实例
ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey);
System.out.println("流程实例id:" + pi.getId());
System.out.println("流程定义id:" + pi.getProcessDefinitionId());
}
5.查询任务:
我们可以查询任务,看看任务的进度:
/**
* 查询任务
*/
@Test
public void queryTask(){
//任务代理人
String assignee = "王五";
//取得任务服务
TaskService taskService = processEngine.getTaskService();
//创建一个任务查询对象
TaskQuery taskQuery = taskService.createTaskQuery();
//办理人的任务列表
List<Task> list = taskQuery.taskAssignee(assignee) //指定代理人
.list();
//遍历任务列表
for (Task task : list) {
System.out.println("任务的id:" + task.getId());
System.out.println("任务的代理人:" + task.getAssignee());
System.out.println("任务的名字:" + task.getName());
}
}
同时我们在数据库中查找任务表:
由于我之前执行过了,所以流程是走到了这里。
接下来我们允许任务通过:
6.完成任务:
/**
* 完成任务
*/
@Test
public void compileTask(){
String taskId = "302";
//task:任务的id
processEngine.getTaskService().complete(taskId);
System.out.println("任务" + taskId + "执行完毕");
}
我们的流程通过了:
所以任务表的数据也没了
如果不是最后一个流程,那么它会继续往下一个流程走