1)、概念
工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。
2)、工作流系统
一个软件系统中具有工作流的功能,我们把它称为工作流系统,一个系统中工作流的功能是什么?就是对系统的业务流程进行自动化管理,所以工作流是建立在业务流程的基础上,所以一个软件的系统核心根本上还是系统的业务流程,工作流只是协助进行业务流程管理。即使没有工作流业务系统也可以开发运行,只不过有了工作流可以更好的管理业务流程,提高系统的可扩展性。
3)、适用行业
消费品行业,制造业,电信服务业,银证险等金融服务业,物流服务业,物业服务业,物业管理,大中型进出口贸易公司,政府事业机构,研究院所及教育服务业等,特别是大的跨国企业和集团公司。
4)、具体应用
1、关键业务流程: 订单、报价处理、合同审核、客户电话处理、供应链管理等
2、行政管理类: 出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报周报等凡是原来手工流转处理的行政表单。
3、人事管理类: 员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。
4、财务相关类: 付款请求、应收款处理、日常报销处理、出差报销、预算和计划申请等。
5、客户服务类: 客户信息管理、客户投诉、请求处理、售后服务管理等。
6、特殊服务类: ISO系列对应流程、质量管理对应流程、产品数据信息管理、贸易公司报关处理、物流公司货物跟踪处理等各种通过表单逐步手工流转完成的任务均可应用工作流软件自动规范地实施。
5)、实现方式
在没有专门的工作流引擎之前,我们之前为了实现流程控制,通常的做法就是采用状态字段的值来跟踪流程的变化情况。这样不同角色的用户,通过状态字段的取值来决定记录是否显示。
针对有权限可以查看的记录,当前用户根据自己的角色来决定审批是否合格的操作。如果合格将状态字段设置一个值,来代表合格;当然如果不合格也需要设置一个值来代表不合格的情况。
这是一种最为原始的方式。通过状态字段虽然做到了流程控制,但是当我们的流程发生变更的时候,这种方式所编写的代码也要进行调整。
那么有没有专业的方式来实现工作流的管理呢?并且可以做到业务流程变化之后,我们的程序可以不用改变,如果可以实现这样的效果,那么我们的业务系统的适应能力就得到了极大提升。
Alfresco软件在2010年5月17日宣布Activiti业务流程管理(BPM)开源项目的正式启动,其首席架构师由业务流程管理BPM的专家 Tom Baeyens担任,Tom Baeyens就是原来jbpm的架构师,而jbpm是一个非常有名的工作流引擎,当然activiti也是一个工作流引擎。
Activiti是一个工作流引擎, activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。
官方网站:
Open Source Business Automation | Activiti
经历的版本:
2)、BPM
BPM(Business Process Management),即业务流程管理,是一种规范化的构造端到端的业务流程,以持续的提高组织业务效率。常见商业管理教育如EMBA、MBA等均将BPM包含在内。
3)、BPM软件
BPM软件就是根据企业中业务环境的变化,推进人与人之间、人与系统之间以及系统与系统之间的整合及调整的经营方法与解决方案的IT工具。
通过BPM软件对企业内部及外部的业务流程的整个生命周期进行建模、自动化、管理监控和优化,使企业成本降低,利润得以大幅提升。
BPM软件在企业中应用领域广泛,凡是有业务流程的地方都可以BPM软件进行管理,比如企业人事办公管理、采购流程管理、公文审批流程管理、财务管理等。
4)、 BPMN
BPMN(Business Process Model AndNotation)- 业务流程模型和符号 是由BPMI(BusinessProcess Management Initiative)开发的一套标准的业务流程建模符号,使用BPMN提供的符号可以创建业务流程。
2004年5月发布了BPMN1.0规范.BPMI于2005年9月并入OMG(The Object Management Group对象管理组织)组织。OMG于2011年1月发布BPMN2.0的最终版本。
BPMN 是目前被各 BPM 厂商广泛接受的 BPM 标准。Activiti 就是使用 BPMN 2.0 进行流程建模、流程执行管理,它包括很多的建模符号,比如:Event
Bpmn图形其实是通过xml表示业务流程,上边的.bpmn文件使用文本编辑器打开:
1)、部署activiti
Activiti是一个工作流引擎(其实就是一堆jar包API),业务系统访问(操作)activiti的接口,就可以方便的操作流程相关数据,这样就可以把工作流环境与业务系统的环境集成在一起。
2)、流程定义
使用activiti流程建模工具(activity-designer)定义业务流程(.bpmn文件) 。
.bpmn文件就是业务流程定义文件,通过xml定义业务流程。
3)、流程定义部署
activiti部署业务流程定义(.bpmn文件)。
使用activiti提供的api把流程定义内容存储起来,在Activiti执行过程中可以查询定义的内容
Activiti执行把流程定义内容存储在数据库中
4)、启动一个流程实例
流程实例也叫:ProcessInstance
启动一个流程实例表示开始一次业务流程的运行。
在员工请假流程定义部署完成后,如果张三要请假就可以启动一个流程实例,如果李四要请假也启动一个流程实例,两个流程的执行互相不影响。
5)、用户查询待办任务(Task)
因为现在系统的业务流程已经交给activiti管理,通过activiti就可以查询当前流程执行到哪了,当前用户需要办理什么任务了,这些activiti帮我们管理了,而不需要开发人员自己编写在sql语句查询。
6)、用户办理任务
用户查询待办任务后,就可以办理某个任务,如果这个任务办理完成还需要其它用户办理,比如采购单创建后由部门经理审核,这个过程也是由activiti帮我们完成了。
7)、流程结束
当任务办理完成没有下一个任务结点了,这个流程实例就完成了。
1)、添加maven依赖
org.activiti
activiti-engine
5.22.0
org.activiti
activiti-spring
5.22.0
2)、拷贝springActiviti.xml
注意:要在spring.xml文件放开工作流相关的注释,如下图:
3)、安装IDEA插件
搜索 bpmn
4)、在resources目录创建一个目录activiti目录
@Autowired
RepositoryService repositoryService;
@Autowired
RuntimeService runtimeService;
@Autowired
TaskService taskService;
/***
* @description 部署流程
* @params
* @return java.lang.String
* @author
* @date 2023/10/21 18:55
*/
@GetMapping(value = "/deploy")
public String deploy() {
repositoryService.createDeployment()
.addClasspathResource("activiti/test1.bpmn20.xml")
.addClasspathResource("activiti/test1.bpmn20.png")
.deploy();
return "OK";
}
/***
* @description 获取流程列表
* @params
* @return java.lang.String
* @author
* @date 2023/10/21 19:01
*/
@GetMapping(value = "/bpmnList")
public String bpmnList() {
List list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition processDefinition : list) {
System.out.println(processDefinition.getName());
}
return "OK";
}
/***
* @description 开启一个流程
* @params
* @return java.lang.String
* @author huahua
* @date 2023/10/21 20:36
*/
@GetMapping(value = "/start")
public String start() {
//-- 启动流程的参数
// 1、流程的KEY:流程的唯一标识 key=test1
// 2、第三方系统的唯一ID(标识)与第三方系统结合
// 3、传入流程变量
String key = UUID.randomUUID().toString();
HashMap map = new HashMap<>();
map.put("user1", "老田");
map.put("user2", "王院");
ProcessInstance test1 = runtimeService.startProcessInstanceByKey("test1", key, map);
System.out.println("start:"+test1.toString());
return "OK";
}
/***
* @description 查询正在进行的流程
* @params
* @return java.lang.String
* @author huahua
* @date 2023/10/21 20:40
*/
@GetMapping(value = "/processList")
public String processList() {
List list = runtimeService.createProcessInstanceQuery().processDefinitionKey("test1").list();
for (ProcessInstance processInstance : list) {
System.out.println(processInstance.getName());
}
return "OK";
}
/***
* @description 查询流程实例节点
* @params
* @return java.lang.String
* @author huahua
* @date 2023/10/21 23:38
*/
@GetMapping(value = "/taskList")
public String taskList(String pid) {
List list = taskService.createTaskQuery().processInstanceId(pid).list();
for (Task task : list) {
System.out.println(task.toString());
String taskId = task.getId();
System.out.println("taskId:" + taskId);
}
return "OK";
}
/***
* @description 执行任务(也就是执行流程实例下的任务节点)
* @return java.lang.String
* @author huahua
* @date 2023/10/22 8:43
*/
@GetMapping(value = "/taskStep")
public String taskStep(String pid, String taskId) {
// 查询实例流程
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(pid).singleResult();
if(processInstance == null) {
return "流程实例不存在";
}
//-- 完成下一步的流程
taskService.complete(taskId);
//-- 查询流程是否为最后一步审批
ProcessInstance lastProcess = runtimeService.createProcessInstanceQuery().processInstanceId(pid).singleResult();
if(lastProcess == null) {
// 发送通知邮件或者短信
System.out.println("发送邮件通知用户");
System.out.println("修改审核状态:审核通过");
}
return "OK";
}