一. 工作流
1.1 工作流介绍
工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者 之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标, 或者促使此目标的实现”。
1.2 工作流系统
一个软件系统中具有工作流的功能,我们把它称为工作流系统,一个系统中工作流的功能是什 么?就是对系统的业务流程进行自动化管理,所以工作流是建立在业务流程的基础上,所以一个软 件的系统核心根本上还是系统的业务流程,工作流只是协助进行业务流程管理。即使没有工作流业 务系统也可以开发运行,只不过有了工作流可以更好的管理业务流程,提高系统的可扩展性。
1.2.1 适用行业
消费品行业,制造业,电信服务业,银证险等金融服务业,物流服务业,物业服务业,物业管理, 大中型进出口贸易公司,政府事业机构,研究院所及教育服务业等,特别是大的跨国企业和集团公 司。1.2.2 具体应用
- 关键业务流程:订单、报价处理、合同审核、客户电话处理、供应链管理等
- 行政管理类:出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报 周报等凡是原来手工流转处理的行政表单。
- 人事管理类:员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。
- 财务相关类:付款请求、应收款处理、日常报销处理、出差报销、预算和计划申请等。
- 客户服务类:客户信息管理、客户投诉、请求处理、售后服务管理等。
- 特殊服务类:ISO 系列对应流程、质量管理对应流程、产品数据信息管理、贸易公司报关处理、物流公司货物跟踪处理等各种通过表单逐步手工流转完成的任务均可应用工作流软件自动规范 地实施。
1.3 工作流实现方式
在没有专门的工作流引擎之前,我们之前为了实现流程控制,通常的做法就是采用状态字段的值来 跟踪流程的变化情况。这样不用角色的用户,通过状态字段的取值来决定记录是否显示。
针对有权限可以查看的记录,当前用户根据自己的角色来决定审批是否合格的操作。如果合格将状 态字段设置一个值,来代表合格;当然如果不合格也需要设置一个值来代表不合格的情况。
这是一种最为原始的方式。通过状态字段虽然做到了流程控制,但是当我们的流程发生变更的时候, 这种方式所编写的代码也要进行调整。
那么有没有专业的方式来实现工作流的管理呢?并且可以做到业务流程变化之后,我们的程序可以 不用改变,如果可以实现这样的效果,那么我们的业务系统的适应能力就得到了极大提升。
1.4 工作流实现原理分析
如何可以做到我们在业务流程发生变更后,我们的业务系统代码可以不发生改变?此时我们就来分 析一下原理。
二. Activiti
2.1 Activiti7操作流程:
1.部署Activiti,一般将Activiti和业务部署到一起
2.定义流程图
3.通过Activiti提供API生成流程定义的内容
4.用户查看待办流程
5.用户处理
6.流程结束
2.2 安装Activiti Designer 流程设计器:
idea插件官网:https://plugins.jetbrains.com/
打开IDEA工具,选择file---->settings---->plugins
方案一:搜索actiBPM插件,如果能搜索到的情况下右侧有下载链接
方案二:进入IDEA插件官网,搜索actiBPM,点击Get获取,选择最新版本进行下载,下载完成是一个jar包
重复上面的动作打开IDEA工具,选择file---->settings---->plugins,点击小齿轮设置,选择第三项Install Plugin from disk
选择对应Jar包,然后就可以看到对应的actiBMP,点击Restart重启IDEA
2.3 BPMN:
BPMN(Business Process Model And Notation)- 业务流程模型和符号 是由 BPMI(Business Process Management Initiative)开发的一套标准的业务流程建模符号,使用BPMN 提供的符号可以创建业务流程。 2004 年 5 月发布了 BPMN1.0 规范.BPMI 于 2005 年 9 月并入 OMG(The Object Management Group 对象管理组织)组织。OMG 于 2011 年 1 月发布BPMN2.0 的最终版本。
编写流程图:
创建一个bpmn文件,通过每一个流程控制内容书写流程
2.4 搭建Activiti开发环境:
步骤一:导入依赖
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-model</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-converter</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-json-converter</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-bpmn-layout</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>org.activiti.cloud</groupId> <artifactId>activiti-cloud-services-api</artifactId> <version>7.0.0.Beta1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- log start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- log end --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency>
步骤二:创建Activiti配置文件activiti.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--数据源--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/activiti"/> <property name="username" value="root"/> <property name="password" value="123"/> </bean> <!--配置Activiti使用的processEngine对象 默认命名为processEngineConfiguration--> <bean id="processEngineConfiguration01" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <!--注入数据源--> <property name="dataSource" ref="dataSource"/> <!--配置数据源方式二:--> <!--<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>--> <!--指定数据库生成策略--> <property name="databaseSchemaUpdate" value="true"/> </bean> </beans>
步骤三:创建一个测试类,加载对应配置文件即可
public static void main(String[] args) { //加载配置 ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); //获取ProcessEngine对象 ProcessEngine processEngine = configuration.buildProcessEngine(); }
或
public static void main(String[] args) { //获取ProcessEngine对象,默认根据activiti.cfg.xml文件加载配置文件 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
}
执行创建数据库表
public static void main(String[] args) { //加载配置 默认查找bean的id为processEngineConfiguration,可以更改 ProcessEngineConfiguration configuration = ProcessEngineConfiguration. createProcessEngineConfigurationFromResource("activiti.cfg.xml","processEngineConfiguration01");//红字代表beanName ProcessEngine processEngine = configuration.buildProcessEngine(); }
2.5 Activiti数据库构成:
Activiti数据库构成:
ACT_RE_*: 'RE'表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片, 规则,等等)。
ACT_RU_*: 'RU'表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务, 等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_HI_*: 'HI'表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: GE 表示general。通用数据, 用于不同场景下。