大家好,又见面了,我是你们的朋友全栈君。
接着上篇博文,我们画一个流程图:
在resources下建一个文件夹,在文件夹中建bpmn绘图文件:
画图区域介绍:
下面我们写一个学生请假流程实例:
建一个bpmn文件,如下:
如下图,一个完整的流程要有开始和结束,所以先制作开始和结束节点,选择startEvent,然后再画图区域画开始圆圈,结束同理:
接着我们建三个任务节点,选工具区的userTask,画三个任务节点:
修改任务名称,如下:
再把各个人物连在一起,最后结果如下:
然后给每个任务分配决策人,什么意思呢,就是每个任务节点都要有对应的执行人。我们想一下学生请假的流程是什么,首先某个学生想请假,于是就提示申请,(这里对于我们上图的学生请假申请任务节点),现实中我们会写张申请单,上面有请假理由,然后把这个单子给班长看看,(对于上图的班长审批)。然后班长把这个单子再给班长任决定批不批准改学生请假(对应上图的班主任审批任务节点)。可以看出每个任务的执行人或说是决策人都不一样,所以这里需要我们去分配。如下:
,对了,还有我们要最好保存流程图片,需要设置一下windows–>preferences–>activiti–>save actions–>打钩:
设置好后,我们再保存流程的时候就会自动生成png结尾的图片了:
打开图片是和我们画的图一样的。
最后我们还要修改一下流程id,点击流程图空白处,修改如下:
下面写流程代码,建个流程包和流程类
package com.xiaoyexinxixn.ActivityLesson.flow;
import static org.junit.Assert.*;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;
public class StudentLeaveProcess {
//获取默认流程引擎实例,会自动读取activiti.cfg.xml ,所以我们要严格定义配置文件的名称
private ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
/**
* 部署流程定义
*/
@Test
public void deploy() {
//获取部署相关service,这些都是activiti封装好的api接口,还有很多,下面也会用到很多
Deployment deployment=processEngine.getRepositoryService()
//创建部署
.createDeployment()
//加载流程图资源文件
.addClasspathResource("diagrams/StudentLeave.bpmn")
//加载流程图片
.addClasspathResource("diagrams/StudentLeave.png")
//流程名称
.name("学生请假流程")
//部署流程
.deploy();
System.out.println("流程部署的ID: "+deployment.getId());
System.out.println("流程部署的Name: "+deployment.getName());
}
}
成功运行代码后会影响数据库的表有:
流程部署表:act_re_deployment
流程定义表:act_re_procdef
资源文件表:act_ge_bytearray
资源配置表:act_ge_property
出现相应数据。
每运行一次上图代码就会生成一次请假流程实例。
下面写启动流程实例代码:
/*
* 启动流程实例
*/
@Test
public void start(){
//运行启动流程的service
ProcessInstance pi=processEngine.getRuntimeService()
//定义流程表的KEY字段值,key值是我们前面定义好的key,可在act_re_procdef表中的key_字段中找到,
.startProcessInstanceByKey("studentLeaveProcess");
System.out.println(pi.getId());
System.out.println(pi.getProcessDefinitionId());
}
启动流程影响到的表有:
执行对象表:act_ru_execution 是正在执行的节点,比如请假流程到班长申批,那么此时的执行对象就是班长
身份联系表:act_ru_identitylink
用户任务表:act_ru_task
活动任务节点历史表:act_hi_actinat
身份联系历史表:ac_hi_identitylink
流程实例表历史:ac_hi_procinst
历史人物表:act_hi_taskinst
这里我遇到点麻烦,汉字在navicat乱码,一时无法解决,所以就把所有的汉字改成了英文和数字:
有两处:
还有一处分配者
然后重新启动流程,
看流程的当前执行者 :
ac_hi_actinst表
这里end_time字段没有值,说明此任务节点还没有结束,同理看上面的开始任务节点已经结束了
下面我们查看任务执行的情况,下面查询的结果数据来自act_ru_task
/**
* 查看任务
*/
@Test
public void findTaskList(){
//获取任务列表的service
List<Task> taskList=processEngine.getTaskService()
//创建任务查询
.createTaskQuery()
//指定任务的执行人
.taskAssignee("xiaoliu001")
.list();
for(Task task:taskList){
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());
}
}
结果:
任务ID:2504
任务名称:leave001
任务创建时间:Thu Apr 19 17:51:01 CST 2018
任务委派人:xiaoliu001
任务流程实例Id2501
/**
* 完成任务
*/
@Test
public void completeTask(){
processEngine.getTaskService().complete("2504");
}
执行上面代码,完成leave001任务节点,2504是任务id,对于上面查询的任务ID
执行完成后,任务的委派人变成了xiaoliu002。
这样任务就到了leave002任务节点。
身份联系历史表也多了一个人
这里再执行xiaoliu001的查看任务方法,会没有输出,因为人物已经给xiaoliu002.
那我们再查询下xiaoliu002的结果如下:
任务ID:5002
任务名称:leave002
任务创建时间:Thu Apr 19 18:44:00 CST 2018
任务委派人:xiaoliu002
任务流程实例Id:2501
接着我们再执行完成任务方法,注意修改任务id为上面查询到的:
/**
* 完成任务
*/
@Test
public void completeTask(){
processEngine.getTaskService().complete("5002");
}
看数据库的任务表act_ru_task:
任务走到了leave003节点,任务委派人也变成了xiaoliu003.
这里说一下上图的usertask3对于的就是流程图的id,如下:
我们再执行下查看任务方法的结果是:
任务ID:7502
任务名称:leave003
任务创建时间:Thu Apr 19 18:56:33 CST 2018
任务委派人:xiaoliu003
任务流程实例Id:2501
最后我们再执行下完成任务方法:
/**
* 完成任务
*/
@Test
public void completeTask(){
processEngine.getTaskService().complete("7502");
}
完了,这样流程就跑完了。我们再看任务表:
都变成空的了
执行完了,后表数据都清空,历史表还是有的。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/106153.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...