接上一篇文章,使用创建好的流程图,总结一下activiti发布到查询使用的方法和测试代码
流程图
1. 引用配置文件 activiti.cfg.xml ,不引用或者引用失败的话在创建流引擎的时候会报空指针异常,解决方法:
idea中右键文件夹,选Mark Directory As里的ReSources Root ,将resources设置成Resources Root类型文件夹,将activiti.cfg.xml直接放在resources下
2.引用activiti所需要的jar 我使用的是5.18
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.18.0</version>
</dependency>
3.创建一个测试类,开始测试
首先要创建流程引擎,如果配置文件引用出错,这个地方就会报错
/*创建流程引擎*/
private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
布署流程
/*部署流程定义*/
@Test
public void test1() {
Deployment deployment = processEngine.getRepositoryService()// 获取部署相关Service
.createDeployment()//创建部署
.name("产品审核流程")//声明流程的名称
.addClasspathResource("process/testGroup.bpmn")//加载资源文件
.deploy();
System.out.println("流程部署ID:" + deployment.getId());
System.out.println("流程部署Name:" + deployment.getName());
}
执行后可以查询下面表
流程定义:act_re_procdef
所有流程:act_re_deployment
文件保存表:act_ge_bytearray
启动流程
先把流程逻辑粘出来
<process id="termTest" isClosed="false" isExecutable="true" name="termTest" processType="None">
<startEvent id="start_1" name="StartEvent"/>
<endEvent id="_8" name="EndEvent"/>
<userTask activiti:candidateUsers="${productUsers}" activiti:exclusive="true" id="_9" name="产品审核"/>
<userTask activiti:candidateGroups="${requireGroup}" activiti:exclusive="true" id="_10" name="需求审核"/>
<userTask activiti:assignee="张三" activiti:exclusive="true" id="_11" name="财务审核"/>
<userTask activiti:assignee="${user}" activiti:exclusive="true" id="_12" name="发起人测试"/>
<sequenceFlow id="_13" sourceRef="start_1" targetRef="_9"/>
<sequenceFlow id="_14" sourceRef="_9" targetRef="_10"/>
<sequenceFlow id="_15" sourceRef="_10" targetRef="_11"/>
<sequenceFlow id="_16" sourceRef="_11" targetRef="_12"/>
<sequenceFlow id="_17" sourceRef="_12" targetRef="_8"/>
</process>
第一个节点是产品审核,需要指定参数productUsers,所以启动的时候我们就需要设置上
/*
* 启动流程
* 两种启动方式1 通过key 2 通过id
* 我们通过key的方式启动 key为act_re_procdef表中的key字段值
* */
@Test
public void startTask() {
try {
/*定义参数*/
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("productUsers", "zhangsan,lisi");//为candidateUsers的参数productUsers 指定值,用英文逗号分隔
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("termTest",variables);
System.out.println("流程实例ID:" + pi.getId());
System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
} catch (Exception e) {
e.printStackTrace();
}
}
节点待办任务表 :act_ru_task 会增加一条待办任务
现在待办任务已经形成,此条待办任务属于组任务的一种,通过组任务方法查询该任务
根据用户查询组待办任务
@Test
public void test3() {
String candidateUser = "zhangsan";
List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service
.createTaskQuery()// 创建任务查询对象
/** 查询条件(where部分) */
.taskCandidateUser(candidateUser)// 组任务的办理人查询,不是组成员,查询不到
/** 排序 */
.orderByTaskCreateTime().asc()// 使用创建时间的升序排列
/** 返回结果集 */
.list();
if (list != null && list.size() > 0) {
for (Task task : list) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务名称:" + task.getName());
System.out.println("任务的创建时间:" + task.getCreateTime());
System.out.println("任务的办理人:" + task.getAssignee());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("执行对象ID:" + task.getExecutionId());
System.out.println("流程定义ID:" + task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
结果:
任务ID:37505
任务名称:产品审核
任务的创建时间:Mon Oct 08 18:52:33 CST 2018
任务的办理人:null
流程实例ID:37501
执行对象ID:37501
流程定义ID:termTest:1:35004
########################################################
我们可以看到任务办理人是为null,那么我们就可以在介绍一下组待办任务的认领,我现在指定了zhangsan,lisi两个审核人,但是此节点只需要一个人审批就可以了,组任务需要先认领,在办理
组待办任务认领,和解除认领
/** 组代办任务认领*/
@Test
public void claim() {
//任务ID
String taskId = "37505";
//认领人
String userId = "zhangsan";
processEngine.getTaskService()
.claim(taskId, userId);
}
/** 解除任务认领*/
@Test
public void setAssignee() {
//任务ID
String taskId = "37505";
processEngine.getTaskService()//
.setAssignee(taskId, null);
}
组代办任务被认领,变成个人任务,在根据用户查询组待办任务将将查询不到,使用个人待办任务查询方法可以查询到
查询个人待办任务
/** 查询当前人的个人任务 */
@Test
public void test4() {
String assignee = "zhangsan";
List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service
.createTaskQuery()//创建任务查询对象
/** 查询条件(where部分) */
.taskAssignee(assignee)// 指定个人任务查询,指定办理人
/** 排序 */
.orderByTaskCreateTime().asc()// 使用创建时间的升序排列
/** 返回结果集 */
.list();// 返回列表
if (list != null && list.size() > 0) {
for (Task task : list) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务名称:" + task.getName());
System.out.println("任务的创建时间:" + task.getCreateTime());
System.out.println("任务的办理人:" + task.getAssignee());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("执行对象ID:" + task.getExecutionId());
System.out.println("流程定义ID:" + task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
结果:
任务ID:37505
任务名称:产品审核
任务的创建时间:Mon Oct 08 18:52:33 CST 2018
任务的办理人:zhangsan
流程实例ID:37501
执行对象ID:37501
流程定义ID:termTest:1:35004
########################################################
可以发现,任务办理人已经变成zhangsan了
完成待办任务
完成任务时我们需要考虑下一个节点任务信息,根据流程图,产品审核的下一节点是需求审核,需求审核指定的是组审核
candidateGroups="${requireGroup},需要指定组去办理,candidateUsers和candidateGroups区别已经说过,前者是人,后者是组。
/**
* 完成任务
*/
@Test
public void test5() {
TaskService taskService = processEngine.getTaskService();
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("requireGroup", "requireGroup");//用户组,requireGroup
//添加完成任务信息,可以不要
//taskId,processInstance,message
taskService.addComment("37505", "37501", "产品审核同意--zhangsan");
//完成任务方法
taskService.complete("37505", variables);
}
现在act_ru_task表中产品审核节点已经不存在,新增需求审核节点数据
因为我们有了组,所以需要把用户和组的信息添加进去
用户信息表:act_id_user
用户组信息表:act_id_group
用户与用户组对应信息表:act_id_membership
我只把zhangsan,wangwu添加到requireGroup组中,所以可以根据用户查询组待办任务,但是需要先认领呦
也可以根据用户组名查询待办任务
根据用户组查询待办任务
/*
* 根据用户组名查询
* */
@Test
public void test6() {
//组代办
List<Task> list = processEngine.getTaskService().createTaskQuery().taskCandidateGroup("requireGroup").list();
for (Task task : list) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务名称:" + task.getName());
System.out.println("任务创建时间:" + task.getCreateTime());
System.out.println("任务委派人:" + task.getAssignee());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("########################################################");
}
}
结果:
任务ID:40004
任务名称:需求审核
任务创建时间:Mon Oct 08 19:41:21 CST 2018
任务委派人:null
流程实例ID:37501
########################################################
先把文件上传了
https://download.youkuaiyun.com/download/qq_35463719/10706949
今天就到这了,有时间在总结下面的