activiti初体验(四) 基本操作

流程图


流程图的常用元素很简单,开启,结束为必要的。
一个完生的流程图如下所示:

左边为开始(startEvent),右边为结束(endEvent),中间为活动(任务Task),箭头的线 (SequenceFlow)
开发之前我们需要给eclipse安装activiti插件,个人建议使用eclipse,感觉idea对流程图的插件支持不是很好。
安装插件以及画流程图这里不再陈述,大家可以自己百度。

由于设计开发中activiti提供的用户相关的表很难满足我们项目的需要,一般使用项目本身的角色信息表。
而且在开发中审批人甚少指定为某一个人,一般为角色。
在之前的工作中使用的为分离式的流程引擎,配置角色生产与测试经常要维护两个表,不方便,这里提供了自己的一个实现逻辑。

简单配置


配置流程


点击空白处—-》eclipse窗口会出现属性的配置:配置id(流程图的id)与name(流程图的名称)


配置人


点击请假审批的task,填写id与name(当前活动的id与name),再点击Main config,再assiness框中填写任务代理人,图片中的表达式为获取该流程中的变量,变量的属性为:createLoginName


设置审批【副总】的审批人,此时使用的为角色,查询待办时,是根据登录人查询出角色再次进行查询待办任务的。



流程发布


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 @Test
public void deplomentActiviti() {
String folderPath = "study/activiti/diagrams/leaveBill";
HashMap<String, String> map = new HashMap<>();
map.put("name", "请假流程");// 名称
map.put("id", "leaveBill");// id
map.put("category", "办公流程");// 类别
activitiService.devlopActiviti(folderPath, map);
}

@Override
public boolean devlopActiviti(String folderPath, HashMap<String, String> map) {
Deployment deploy = repositoryService.createDeployment()// 创建一个部署构建器
.addClasspathResource(folderPath + File.separator + map.get("id") + ".bpmn")// 从类路径一次只能添加一个文件
.addClasspathResource(folderPath + File.separator + map.get("id") + ".png")// 流程图片
.name(map.get("name")).category(map.get("category")).deploy();

LOGGER.info("流程名称【 {}】", deploy.getName());
LOGGER.info("流程id【{}】", deploy.getId());
LOGGER.info("流程类别【{}】", deploy.getCategory());

return true;
}

日志


1
2
3
[18:18:11:735] [INFO] - wsylp.service.impl.ActivitiServiceImpl.devlopActiviti(ActivitiServiceImpl.java:95) - 流程名称【 请假流程】
[18:18:11:735] [INFO] - wsylp.service.impl.ActivitiServiceImpl.devlopActiviti(ActivitiServiceImpl.java:96) - 流程id【1
[18:18:11:735] [INFO] - wsylp.service.impl.ActivitiServiceImpl.devlopActiviti(ActivitiServiceImpl.java:97) - 流程类别【办公流程】

数据库



开启流程


由于第一个工作项审批人Assignee为“#{createLoginName}”,在进行开启任务的时候需要设置createLoginName参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Test
public void startActiviti() {
String processDefinitionKey = "leaveBill";
String orgCode = "070067801";
// 设置变量
HashMap<String, Object> map = new HashMap<>();
map.put("createLoginName", "0003");
map.put("orgCode", orgCode);
activitiService.startActivitiAndFinsh(processDefinitionKey, map);
}
@Override
public boolean startActivitiAndFinsh(String processDefinitionKey, HashMap<String, Object> map) {
// 取得流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, map);

LOGGER.info("流程(流程执行对象实例)id【{}】", processInstance.getId());// execution对象
LOGGER.info("流程实例id:【{}】", processInstance.getProcessInstanceId());// processInstance对象
LOGGER.info("流程定义id【{}】", processInstance.getProcessDefinitionId());// 默认为最新的id
LOGGER.info("流程实例id【{}】", processInstance.getSuperExecutionId());
List<Task> tasks = this.getTaskByDeploymentId(processInstance.getDeploymentId(), processDefinitionKey,
processInstance.getId(), (String) map.get("createLoginName"));

for (Task task : tasks) {
this.finshTask(task.getId());
}
return true;
}

上面代码中:processInstance.getId()也就是executionId的id(该流程的id)


日志


1
2
3
4
5
6

[19:27:55:914] [INFO] - wsylp.service.impl.ActivitiServiceImpl.startActivitiAndFinsh(ActivitiServiceImpl.java:132) - 流程(流程执行对象实例)id【2501】
[19:27:55:914] [INFO] - wsylp.service.impl.ActivitiServiceImpl.startActivitiAndFinsh(ActivitiServiceImpl.java:133) - 流程实例id:【2501】
[19:27:55:914] [INFO] - wsylp.service.impl.ActivitiServiceImpl.startActivitiAndFinsh(ActivitiServiceImpl.java:134) - 流程定义id【leaveBill:1:4】
[19:27:55:914] [INFO] - wsylp.service.impl.ActivitiServiceImpl.startActivitiAndFinsh(ActivitiServiceImpl.java:135) - 流程实例id【null】
[19:29:33:040] [DEBUG] - org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:33) -

查询任务


查询任务的方法有很多,这里只是用几个简单的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 @Override
public boolean getTasks() {
TaskQuery taskQuery = taskService.createTaskQuery();
// 任务列表
List<Task> list = taskQuery.list();

for (Task task : list) {
LOGGER.info("任务处理人【{}】,任务id【{}】,任务名称【{}】,任务流程定义id【{}】, 流程定义key【{}】,任务拥有者【{}】 ", task.getAssignee(),
task.getId(), task.getName(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(),
task.getOwner());
}
return true;
}

@Override
public List<Task> getTaskByDeploymentId(String deploymentId, String processDefinitionKey, String executionId,
String loginName) {
List<Task> list = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey)
.deploymentId(deploymentId).taskAssignee(loginName).executionId(executionId).list();
// 获取当前人的
return list;
}

@Override
public boolean getTaskByLoginName(String processDefinitionKey, String loginName) {
TaskQuery taskQuery = taskService.createTaskQuery();
// 查询登录人所在角色,在根据角色进行查询
List<Role> roleList = userService.getRolesByLoginName(loginName);
for (Role role : roleList) {
// 任务列表
List<Task> list = taskQuery.processDefinitionKey(processDefinitionKey).taskAssignee(role.getRoleCode())
// . taskCandidateUser(assignee)
.list();// 组任务的办理人查询

for (Task task : list) {
LOGGER.info("任务处理人【{}】", task.getAssignee());
LOGGER.info("流程名称【{}】", task.getName());
LOGGER.info("任务id【{}】", task.getId());
LOGGER.info("流程定义id【{}】", task.getProcessDefinitionId());
LOGGER.info("执行对象id【{}】", task.getExecutionId());
}

}

return true;
}

我们调用查询所有的任务getTasks进行查看,结果如下:

1
2
3
4
@Test
public void getTasks() {
activitiService.getTasks();
}

日志


1
wsylp.service.impl.ActivitiServiceImpl.getTasks(ActivitiServiceImpl.java:166) - 任务处理人【fzjl】,任务id【2513】,任务名称【审批[副总]】,任务流程定义id【leaveBill:1:4】, 流程定义key【fzsp】,任务拥有者【null

此时根据登录号进行调用,查看该用户是否能查到任务

1
2
3
4
5
6
7
8
9
[19:47:33:515] [DEBUG] - org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:40) - --- TaskQueryImpl finished --------------------------------------------------------
[19:47:33:515] [DEBUG] - org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:41) -

[19:47:33:515] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getTaskByLoginName(ActivitiServiceImpl.java:185) - 任务处理人【fzjl】
[19:47:33:515] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getTaskByLoginName(ActivitiServiceImpl.java:186) - 流程名称【审批[副总]】
[19:47:33:515] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getTaskByLoginName(ActivitiServiceImpl.java:187) - 任务id【2513
[19:47:33:515] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getTaskByLoginName(ActivitiServiceImpl.java:188) - 流程定义id【leaveBill:1:4
[19:47:33:515] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getTaskByLoginName(ActivitiServiceImpl.java:189) - 执行对象id【2501
[19:47:33:515] [INFO] - wsylp.log.MyLog.logAfter(MyLog.java:29) - @AfterReturning:wsylp.service.ActivitiService.getTaskByLoginName end.

与上文的结果一致


数据库信息:



完成任务


1
2
3
4
5
6
7
8
9
10
11
@Test
public void finshTask() {
String taskId = "2513";
activitiService.finshTask(taskId);
}
@Override
public boolean finshTask(String taskId) {
taskService.complete(taskId);
LOGGER.info("完成任务【{}】", taskId);
return true;
}

日志


1
[19:52:19:571] [INFO] - wsylp.service.impl.ActivitiServiceImpl.finshTask(ActivitiServiceImpl.java:148) - 完成任务【2513】

查询流程信息


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Test
public void getProcessDefin() {
String processDefinitionKey = "leaveBill";
activitiService.getProcessDefin(processDefinitionKey);
}

@Override
public boolean getProcessDefin(String processDefinitionKey) {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
// .processDefinitionId(processDefinitionId)//流程定义id
// BuyBill:1:10004 组成,proDefiKey(流程定义的key) + version(版本) + 自动生成的id
.processDefinitionKey(processDefinitionKey)// 流程定义的key
// .processDefinitionName(processDefinitionName)//流程定义名称
// .processDefinitionVersion(processDefinitionVersion)//流程定义版本
// .latestVersion()//最新版本
// .orderByProcessDefinitionName().desc()//安装版本降序排序
// .count()//统计结果
// .listPage(firstResult, maxResults)//分页查询
.list();
// 遍历结果
for (ProcessDefinition processDefinition : list) {
LOGGER.info("流程定义id【{}】", processDefinition.getId());
LOGGER.info("流程定义的key【{}】", processDefinition.getKey());
LOGGER.info("流程部署id【{}】", processDefinition.getDeploymentId());
LOGGER.info("流程定义的版本【{}】", processDefinition.getVersion());
LOGGER.info("流程资源名称【{}】", processDefinition.getResourceName());
}
return true;
}

日志


1
2
3
4
5
[19:56:53:960] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getProcessDefin(ActivitiServiceImpl.java:221) - 流程定义id【leaveBill:1:4】
[19:56:53:960] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getProcessDefin(ActivitiServiceImpl.java:222) - 流程定义的key【leaveBill】
[19:56:53:960] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getProcessDefin(ActivitiServiceImpl.java:223) - 流程部署id【1】
[19:56:53:960] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getProcessDefin(ActivitiServiceImpl.java:224) - 流程定义的版本【1】
[19:56:53:960] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getProcessDefin(ActivitiServiceImpl.java:225) - 流程资源名称【study/activiti/diagrams/leaveBill\leaveBill.bpmn】

流程图


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Test
public void getProcessImage() {
String deploymentId = "1";
activitiService.getProcessImage(deploymentId);

}
@Override
public boolean getProcessImage(String deploymentId) {
List<String> resourceNames = repositoryService.getDeploymentResourceNames(deploymentId);
for (String resourceName : resourceNames) {
if (resourceName.endsWith(".png")) {
LOGGER.info("流程资源名称【{}】", resourceName);

/**
* 读取资源
*
* @params deploymentId 部署id
* @params resourceName 资源文件名
*/
try {
InputStream resourceAsStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
// 把流写入到文件中
String pathName = "E:/" + resourceName;
File file = new File(pathName);
FileUtils.copyInputStreamToFile(resourceAsStream, file);
LOGGER.info("输出完成");
} catch (Exception e) {
LOGGER.error(e.getMessage());
}
}
}
return true;
}

日志


1
[19:59:51:558] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getProcessImage(ActivitiServiceImpl.java:235) - 流程资源名称【study/activiti/diagrams/leaveBill\leaveBill.png】

流程状态


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
public void getProcessInstanceStateByProcessInstanceId() {
String processInstanceId = "2501";
activitiService.getProcessInstanceStateByProcessInstanceId(processInstanceId);
}
@Override
public void getProcessInstanceStateByProcessInstanceId(String processInstanceId) {
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId)
.singleResult();// 返回数据结果,要么单行,要么是空,其他情况报错;

if (pi != null) {
LOGGER.info("该流程实例【{}】正在运行.....", processInstanceId);
LOGGER.info("当前活动的任务【{}】,名称为", pi.getActivityId());
} else {
LOGGER.info("该任务已经结束。。。");
}

}

日志


1
2
 [20:05:13:657] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getProcessInstanceStateByProcessInstanceId(ActivitiServiceImpl.java:344) - 该流程实例【2501】正在运行.....
[20:05:13:657] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getProcessInstanceStateByProcessInstanceId(ActivitiServiceImpl.java:345) - 当前活动的任务【zglsp】,名称为

历史流程实例


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 @Test
public void getHistoryProcinst() {
activitiService.getHistoryProcinst();
}
@Override
public void getHistoryProcinst() {
List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().list();
if (list != null && list.size() > 0) {
for (HistoricProcessInstance m : list) {
LOGGER.info("历史的流程实例【{}】", m.getId());
LOGGER.info("历史流程定义id【{}】", m.getProcessDefinitionId());
LOGGER.info("历史流程实例开始时间{}----结束时间:{}--->", m.getStartTime(), m.getEndTime());
}
}

}

日志


1
2
3
 [20:08:24:169] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryProcinst(ActivitiServiceImpl.java:357) - 历史的流程实例【2501】
[20:08:24:169] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryProcinst(ActivitiServiceImpl.java:358) - 历史流程定义id【leaveBill:1:4】
[20:08:24:169] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryProcinst(ActivitiServiceImpl.java:359) - 历史流程实例开始时间2018-06-17T19:27:55.742+0800----结束时间:null--->

查询历史任务


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
public void getHistoryTaskByProcessInstanceId() {
String processInstanceId = "2501";
activitiService.getHistoryTaskByProcessInstanceId(processInstanceId);
}
@Override
public void getHistoryTaskByProcessInstanceId(String processInstanceId) {
List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId).list();

if (list != null && list.size() > 0) {
for (HistoricTaskInstance m : list) {
LOGGER.info("历史的流程任务【{}】", m.getId());
LOGGER.info("历史流程定义id【{}】", m.getProcessDefinitionId());
LOGGER.info("历史任务名称【{}】", m.getName());
LOGGER.info("历史任务实例处理人【{}】", m.getAssignee());
}
}

}

日志


1
2
3
4
5
6
7
8
9
10
11
12
13

[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:372) - 历史的流程任务【2510
[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:373) - 历史流程定义id【leaveBill:1:4
[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:374) - 历史任务名称【请假申请】
[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:375) - 历史任务实例处理人【0003
[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:372) - 历史的流程任务【2513
[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:373) - 历史流程定义id【leaveBill:1:4
[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:374) - 历史任务名称【审批[副总]】
[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:375) - 历史任务实例处理人【fzjl】
[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:372) - 历史的流程任务【5002
[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:373) - 历史流程定义id【leaveBill:1:4
[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:374) - 历史任务名称【审批[总经理]】
[20:11:51:095] [INFO] - wsylp.service.impl.ActivitiServiceImpl.getHistoryTaskByProcessInstanceId(ActivitiServiceImpl.java:375) - 历史任务实例处理人【zjl】

删除流程定义


删除一般选择级联删除,否则如果路ice好难过定义已经启动就会报错

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void deleteDeploment() {
String deploymentId = "1";
boolean cascade = true;
activitiService.deleteDeployment(deploymentId, cascade);
// activitiService.deleteDeployment(deploymentId);
}
@Override
public boolean deleteDeployment(String deploymentId, boolean cascade) {
repositoryService.deleteDeployment(deploymentId, cascade);
return true;
}

github地址:https://github.com/wsylp/gms.git

本文标题:activiti初体验(四) 基本操作

文章作者:wsylp

发布时间:2018年06月01日 - 13:06

最后更新:2020年01月02日 - 10:01

原始链接:http://wsylp.top/2018/06/01/activiti初体验-四-基本操作/

许可协议: 本文为 wsylp 版权所有 转载请保留原文链接及作者。

-------------本文结束感谢阅读-------------