有关activiti的部署已经实现详情见上一篇,接下来进行流程定义
- 一、流程定义
首先选中存放图形的目录(本次我们选择 resources 下的 diagram 目录),点击菜单:New-BpmnFile,如下图所示:
名称定义为holiday(默认扩展名为 bpmn),就可以看到进入了流程设计页面,如图所示:
拖动右侧菜单栏菜单,绘制流程图,如下图所示,
我们可以根据自己的流程将其改为相应的汉字,如下图所示:
将图标连接起来,流程id设置为holiday,name为请假流程,如下图所示:
指定任务的负责人,选定节点后设置Assignee值,如下图所示:
画完图后会发现没有png文件,这时我们需要将bpmn文件重命名为xml文件,把后缀改成xml,如下图所示:
重命名完成后,右击如下图所示:
然后保存到与刚才创建文件的一个文件夹内就可以了
保存图片后,发现图片中文乱码,解决方法:
找到IDEA的安装目录,找到bin目录
比如我的路径:D:\develop\IntelliJ IDEA 2018.3\bin
找到这两个文件
具体要修改哪个文件,由你安装的IDEA的版本来决定,如果你安装了64位版本的IDEA,那么就修改2,具体修改方法:在文件后面追加一条命令:
-Dfile.encoding=UTF-8
注意:不要有任何空格,否则重启IDEA时会打不开,重启IDEA,把原来的png图片删掉,再重新生成,即可解决乱码问题。
- 二、接下来编写代码部署流程定义
部署流程定义就是要将上边绘制的图形即流程定义(.bpmn)部署在工作流程引擎 activiti 中,方法如下:
public static void main(String[] args) {
// 1、获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取RepositoryService资源
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、部署流程
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("请假流程")
.deploy();
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
运行程序,部署完成后activiti操作的表如下
act_re_deployment: 部署信息
act_re_procdef :流程定义的一些信息
act_ge_bytearray: 流程定义的bpmn文件以及png文件
- 三、部署流程实例
流程定义部署在 activiti 后就可以通过工作流管理业务流程了,也就是说上边部署的请假申请流程可以使用了。针对该流程,启动一个流程表示发起一个新的请假申请单,这就相当于 java 类与 java 对象的关系,类定义好后需要 new 创建一个对象使用,当然可以 new 多个对象。对于请假申请流程,张三发起一个请假申请单需要启动一个流程实例,请假申请单发起一个请假单也需要启动一个流程实例。代码如下:
// 1、获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取RuntimeService资源
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3、创建流程实例ProcessInstance
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidays");
System.out.println("部署流程ID:"+processInstance.getDeploymentId());
System.out.println("流程实例ID:"+processInstance.getId());
System.out.println("活动ID:"+processInstance.getActivityId());
运行程序,启动流程实例完成后activiti操作的表
act_hi_actinst: 已完成的活动信息
act_hi_identitylink: 参与者信息
act_hi_procinst: 流程实例
act_hi_taskinst: 任务实例
act_ru_execution: 执行表
act_ru_identitylink: 参与者信息
act_ru_task: 任务
- 四、任务查询
流程启动后,各个任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
/**
- 任务查询
*/
public class ActivitiTaskQuery {
public static void main(String[] args) {
// 1、获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取TaskService资源
TaskService taskService = processEngine.getTaskService();
// 3、根据流程定义的key、负责人assignee来实现当前用户的任务列表查询
List<Task> taskList = taskService.createTaskQuery().
processDefinitionKey("holidays").
taskAssignee("zhangsan").list();
for (Task task : taskList) {
System.out.println("流程实例ID:"+task.getProcessDefinitionId());
System.out.println("任务ID:"+task.getId());
System.out.println("任务负责人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
}
执行程序,运行结果如下:得到任务ID
- 五、任务处理
任务负责人查询出待办任务,选择任务进行处理,完成任务。
/**
* 完成任务
*
* 处理当前用户的任务activiti操作的表
* act_hi_actinst 已完成的活动信息
* act_hi_identitylink 参与者信息
* act_hi_procinst 流程实例
* act_hi_taskinst 任务实例
* act_ru_execution 执行表
* act_ru_identitylink 参与者信息
* act_ru_task 任务
*/
public class ActivitiTaskComplete {
public static void main(String[] args) {
// 1、获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取TaskService资源
TaskService taskService = processEngine.getTaskService();
// 3、处理任务,结合当前用户任务列表的查询的任务ID2505
taskService.complete("2505");
}
}
以此类推,我们可以根据查询出来的任务ID完成完整的任务流程。另外,部署流程的时候有可能是zip压缩包格式的,这时采用以下方式:
//压缩包方式实现流程的部署
public static void main(String[] args) {
// 1、获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取RepositoryService资源
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、转换出InputStream流对象
InputStream inputStream = ActivitiLiuChengBuShu.class.getClassLoader()
.getResourceAsStream("diagram/diagramBPMN.zip");
// 4、将InputStream流转换成ZipInputStream流
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
// 5、部署流程
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.name("请假流程")
.deploy();
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
ProcessEngineConfiguration类,主要作用是加载activiti.cfg.xml配置文件
ProcessEngine类,只要作用是帮助我们可以快速得到各个Service接口,并且可以生成activiti工作环境。