谈Activiti工作流在新能源电站中的应用
2021-07-09王慧敏陈明武
袁 博 王慧敏 李 阳 陈明武
(中国电建集团西北勘测设计研究院有限公司,陕西 西安 710065)
0 引言
目前各个企业在进行数字化转型,新能源电站作为生产单位也需要从数字化的角度看待生产过程的管理,如何减少中间环节、节约成本、简化业务流程等,这些问题都给新能源电站的数字化转型提出了更高的要求。但就目前而言,新能源电站的生产管理工作仍然存在权责不明、过程记录难以跟踪、电子文档缺失等问题,引入Activiti工作流引擎就是为了解决上述问题,通过标准流程、过程文档电子化使每个人权责分明,降低电站生产管理工作复杂程度,进而提高整体工作效率,加快企业数字化转型。
1 技术应用背景
新能源电站大多地处偏远,运行值班人员生活不便,上下班交通安全性差,也不符合企业对新能源电站“无人值班、少人值守”的管理要求。运维一体化的管理模式难以横向对标,无法实现指标最优化。这种情况下电站的运营维护效率低下,无法满足高效管理与高效运维电站的理念。
新能源电站生产管理系统主要实现对下属各电站的远程监视和统一管理,以促进子站维护质量、提高管理和运营效率。新能源电站生产管理系统中使用了Activiti工作流实现对电站维护人员的协同工作提供技术支持,实现了新能源电站生产运行科学管理、流程管理、跟踪管理及目标管理的需求,并达到企业规范化、精细化、数字化和集成化管理的目标。
2 Activiti工作流引擎概述
在了解Activiti之前,我们先看一下什么是工作流。在计算机中,工作流属于计算机支持的协同工作的一部分,是研究一个群体在计算机的辅助下系统工作。工作流协助解决的业务问题是:为了处理多人参与的流程问题,而使用某种预定规则自动传递信息或者任务。Activiti是一个执行BPMN2.0规范的开源引擎,它可以发布设计过程并通过API实现编程。Activiti工作流引入到新能源电站生产管理系统中,可以利用其提供的服务接口,全程监管新能源电站中的生产管理工作。通过Activiti工作流的规范化特性,可以使新能源电站日常业务规范化管理,更加具有条理性,很大程度降低电站日常业务出错率。简单来说,开发人员只需要把业务抽象为BPMN流程图,然后将流程图部署至Activiti工作流引擎按照流程定义逐步流转即可,这样不仅降低了业务的复杂程度,还减少了开发人员的工作量。
3 Activiti工作流引擎的特点
1)数据持久化。
Activiti秉承的设计思想是简单快速。一般来说,应用软件的性能瓶颈主要是如何快速实现与数据库的数据交互,所以Activiti选择MyBatis作为数据持久层框架,保证了数据交换的及时性。
2)引擎service接口。
Activiti核心API共有七个,每一项核心API都以服务接口的方式供相关开发技术人员使用。利用这些接口服务,相关技术开发人员能够实现功能丰富、轻便且并高效的工作流应用程序,这七大核心API内容如表1所示。
表1 Activiti工作流引擎核心API
Activiti工作流引擎最核心的类是ProcessEngine,其他的核心API服务都是通过ProcessEngine获取。Activiti服务架构如图1所示。
3)原生支持Spring。
Activiti能够快速集成Spring,通过Spring实现对Activiti的管理。
4 Activiti工作流引擎在新能源电站生产管理系统中的应用
本节内容以新能源电站生产管理系统中的危险点预控卡业务流程为例,对SpringBoot框架结合Activiti工作流引擎的应用进行解释说明。
4.1 搭建流程引擎
基于Spring Initializr创建一个标准的maven工程,在pom.xml文件中添加SpringBoot,Activiti稳定版,如下所示:
项目启动时,Activiti工作流引擎会自动创建需要的数据表,类型如表2所示。
表2 Activiti工作流引擎数据表类型
Activiti核心API的操作实际上就是对上面这些表的CRUD,而这些表数据的变化实际上代表的是整个流程的运转。
4.2 绘制流程图
绘制流程图的过程就是流程定义,流程定义就是按照BPMN2.0标准去描述业务流程,比如业务的起始节点、审批节点、审批条件等等。Activiti流程图的绘制方法有多种,如:IDEA+Activiti BPMN visualizer(插件)、Eclipse+ Activiti Designer(插件)、Activiti Modeler等,可以根据个人的运行环境自行选择,危险点预控卡流程图如图2所示。
bpmn的根节点是definitions节点,在这个节点中可以定义多个流程定义,但是在实际使用过程中,definitions节点只包含一个流程定义,也就是一个流程文件只包含一个流程定义,这样可以减小维护难度,也使得流程内容清晰明了。bpmndi:BPMNDiagram节点中定义了每个节点在流程图上的位置坐标等信息。
4.3 部署流程图
流程定义好以后需要部署,部署的本质就是将流程定义写入数据库。部署流程图的方法有多种,下面依次介绍。
4.3.1 InputStream部署
InputStream部署的原理是通过类加载器获取流程图文件的数据流,构造DeploymentBuilder实例对象,再调用该实例对象的deploy方法完成流程图部署。
public void deployInputStreamTest() {
// 获取流程图文件流
InputStream inputStream = this.getClass().
getClassLoader().getResourceAsStream("flow/危险点预控卡.bpmn");
String resource = "test.bpmn";
// 构造DeploymentBuilder对象并进行部署操作
repositoryService.createDeployment()
.addInputStream(resource, inputStream)
.deploy();
}
4.3.2 classpath部署
public void deployClasspathTest() {
// 流程图文件位置
String resource = "flow/危险点预控卡.bpmn";
// 构造DeploymentBuilder对象并进行部署操作
repositoryService.createDeployment().addClasspath
Resource(resource).deploy();
}
4.3.3 字符串部署
字符串部署是将文本内容直接作为来源,把文本内容转化为字节流后进行部署。
public void deployStringTest() {
// 字符串
String resource = "
encoding=”UTF-8”?>
";
// 构造DeploymentBuilder对象并进行部署操作
repositoryService.createDeployment()
.addString("test.bpmn", resource)
.deploy();
}
4.3.4 ZipInputStream部署
以上方法都是针对单个流程图文件部署,如果需要一次部署多个流程图文件则需要将全部文件打包为zip或者bar格式的压缩文件,然后再对其进行部署。
public void deployZipTest() {
// 获取压缩文件流
InputStream inputStream//压缩文件流
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
// 构造DeploymentBuilder对象并进行部署操作
repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.deploy();
}
4.4 启动流程
启动流程表示开始一次具体的业务流程,比如请假流程,启动流程表示发起一个新的请假申请,而开始的业务流程就会根据已经部署的流程定义流转。
public ProcessInstance submitApply(ActivitiEntity activiti) {
// 设置启动流程的人员ID identityService.
setAuthenticatedUserId(activiti.getApplicant());
// 启动流程时设置业务 key
ProcessInstance instance = runtimeService.startProcessInstanceByKey(activiti.getProcessKey(), activiti.getBusinessKey(), activiti.getProcessParams());
// 下一节点处理人待办事项
activiti.setInstanceId(instance.getProcessInstanceId());
bizTodoItemService.insertTodoItem(activiti);
return instance;
}
其中,ActivitiEntity实体类部分代码如下:
public class ActivitiEntity extends BaseEntity {
/** 申请事项 */
private String itemName;
/** 申请内容 */
private String itemContent;
/** 申请人 */
private String applicant;
/** 流程实例ID */
private String instanceId;
/** 流程定义key */
private String processKey;
/** 创建人名称 */
private String creatorName;
/** 流程实例状态 1 激活 2 挂起 */
private String suspendState;
/** 流程的业务 key 业务流转 id:统一由业务 key+ id, eg: firstWorkTicket_1001 */
private String businessKey;
private String businessId;
…
}
上述实体类属性最关键的就是businessKey(业务标识),businessKey是Activiti和业务系统整合时的连接点,businessKey相当于业务表中唯一标识。
4.5 待办任务查询
流程启动后,各个任务(节点)的负责人就可以查询自己当前需要处理的待办任务,部分关键代码如下:
public void listPersonalTodoTasks() {
// 任务负责人名称
String username = "jack";
List
// 危险点预控卡
.processDefinitionKey("dangerPrecontrolcCard")
// 任务负责人名称
.taskAssignee(username)
.list();
for (Task task : taskList) {
log.info("流程实例id:" + task.getProcessInstanceId() + ",任务id:" + task.getId() + ",负责人:" + task.getAssignee() + ",名称:" + task.getName());
}
}
4.6 任务处理
任务负责人查询待办任务,选择任务进行处理,完成对应(节点)任务,部分关键代码如下:
public void completeTask() {
// 任务id
String taskId = "3859";
// 完成任务
taskService.complete(taskId);
}
5 结语
新能源电站生产管理系统是完全基于光伏电站的实际业务管理需求而设计的,采用了SpringBoot框架结合Activiti工作流引擎在新能源电站生产管理系统中完成了设计与实现,为新能源电站开展运行管理、设备管理、检修管理、安全管理等提供信息服务和业务支撑平台,提高生产效率和运营效率以及安全可靠性。然后详细写了基于Activiti工作流的新能源电站生产管理业务流程模块的实现。本系统使新能源电站业务流程能轻松进行业务跟踪,解决了新能源电站生产管理工作中权责不明、过程记录难以跟踪、电子文档缺失等问题,实现生产记录全过程跟踪,加强新能源电站生产管理工作的规范化,也使新能源电站业务能在网上轻松处理,使新能源电站业务的自动化和无纸化办公成为现实。改变了以往传统的办公模式,减轻了工作人员的工作压力,为企业各部门工作人员之间工作上的沟通提供了一种新的解决方案,有效提升电站运维人员的工作效率,降低了新能源电站行业的生产成本,进一步加快新能源电站的数字化转型。