9 BOS项目第09天
今天开始学习工作流activity
9.1 工作流概念
- 类似于流程图,完成业务的自动化
9.2 Activity简单介绍
- 现在最新版本已经是activiti6了,工作中追求稳定,而不是追求新
- activiti是一个工作流引擎,Activiti工作的核心,负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
9.3 在IDEA安装acti插件
9.4 Eclipse中activity工作流插件安装
9.4.1 网络安装activity插件
9.4.2 离线下载安装
9.5 了解activity的目录结构
9.6 activiti的入门教程
9.6.1 导入activiti所需要的数据表
-
这里使用mysql,所以导入database文件夹下面三个sql文件,创建23张表
9.6.2 了解数据库表前缀代表的函数
- Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
- ACT_RE_: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源*(图片,规则,等等。
- ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
- ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
- ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
- ACT_GE_*: 通用数据, 用于不同场景下。
9.6.3 使用框架自动生成表(不建议)
- 创建一个java项目
- 导入activiti中wars程序的所有jar包
- 导入mysql的数据库驱动
- 提供一个配置文件,文件名必需为activiti-context.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 1.流程引擎配置对象 -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///activiti_day1"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="root"/>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
<!-- 2.使用工厂创建流程引擎对象 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
</beans>
- 写一个单元测试
- 只要获取流程引擎对象,就会自动创建表
- 可以添加示例程序的log4j.properties来查看日志里更多信息输出
- 在activiti-engine-5.13.jar有数据库sql文件,用于自动创建数据库表
@Test
public void test1(){
//1.获取默认的流程引擎对象
ProcessEngine pe = ProcessEngines.getDefaultProcessEngine();
}
9.6.4 设计一个请假流程图
- 在Eclipse中,利用activiti插件创建一个请假流程图
-
在每一个任务中,找到Main config的Assignee中,先固定每个任务的受理人
9.6.5 部署流程定义
- 就是把流程存入数据库,写个单元测试代码
- 流程定义部署完后,会在act_re_deployment和act_re_procdef两张表存储数据,
- deployment的ID每次增加100
- 同一个流程的procdef表的version是递增的
@Test
public void test2(){
//1.把流程图保存到数据库
ProcessEngine pe = ProcessEngines.getDefaultProcessEngine();
//2.获取仓库
RepositoryService rs = pe.getRepositoryService();
//3.获取一个部署的构造器对象
DeploymentBuilder db = rs.createDeployment();
db.addClasspathResource("qjlc.bpmn");
db.addClasspathResource("qjlc.jpg");
//4.部署
db.deploy();
}
8.6.6 查询流程定义
@Test
public void test3(){
ProcessEngine pe = ProcessEngines.getDefaultProcessEngine();
ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();
List<ProcessDefinition> list = query.list();
for(ProcessDefinition pd : list){
System.out.print("ResourceName-" +pd.getResourceName() + ": ");
System.out.print("id-" + pd.getId() + ": ");
System.out.print("key-" + pd.getKey() + ": ");
System.out.print("name-" + pd.getName() + ": ");
System.out.println();
}
}
8.6.7 根据流程定义启动流程实例
- 就是把第一个请假申请任务跑
- 内部会操作act_re_execution和act_re_task两张表
@Test
public void test5(){
ProcessInstance pi = pe.getRuntimeService().startProcessInstanceById("myProcess_1:4:304");
System.out.println("流程实例:" + pi.getProcessInstanceId());
System.out.println("流程实例:" + pi.getId());
}
8.6.8 查询个人任务
@Test
public void test7(){
//查询个人任务
TaskQuery tq = pe.getTaskService().createTaskQuery();
tq.taskAssignee("zhangsan");
tq.orderByTaskCreateTime().desc();//时间排序
List<Task> tasks = tq.listPage(0, 10);//分页查询
for(Task task : tasks){
System.out.println("=================================");
System.out.println("taskId:" + task.getId());
System.out.println("taskName:" + task.getName());
System.out.println("executionId:" + task.getExecutionId());
}
}
8.6.9 办理个人任务
- 请求申请需要被处理,处理中会操作act_re_task和act_hi_taskinst表
- 处理事,会进入下一个任务,往task表插入下一个流程的任务,比如请假申请后,下一个任务就是项目经理审批任务
@Test
public void test6(){
//lisi审核任务
String taskId = "602";
pe.getTaskService().complete(taskId);
}
8.6.10 部署流程定义的另一种方式zip文件
- 把流程和jpg打包成zip文件
@Test
public void test8() throws FileNotFoundException {
//创建部署构建器对象
DeploymentBuilder db = pe.getRepositoryService().createDeployment();
File file = new File("C:\\process.zip");
FileInputStream fis = new FileInputStream(file);
ZipInputStream zis = new ZipInputStream(fis);
db.addZipInputStream(zis);
//部署定义流程
Deployment deployment = db.deploy();
System.out.println(deployment.getId());
}
8.6.11 删除流程定义
@Test
public void test8(){
//pe.getRepositoryService().deleteDeployment("901");
//加个true,删除process表相关记录,如果启动流程了实例,用下面的方法删除
pe.getRepositoryService().deleteDeployment("901", true);
}
8.6.12 6.12.查询部署对应的流程定义文件名称和输入流
@Test
public void test10(){
String deploymentId = "301";
List<String> names = pe.getRepositoryService().getDeploymentResourceNames(deploymentId);
for (String name : names) {
System.out.println(names);
//可以还原成文件,默认流程定义文件存在了act_ge_bytearr表
//InputStream in = pe.getRepositoryService().getResourceAsStream(deploymentId, name);
}
}
8.6.13 查询部署对应的流程定义图表
@Test
public void test11() throws IOException{
String processDefinitionId = "qjlc:1:304";//流程定义id
InputStream pngStream = pe.getRepositoryService().getProcessDiagram(processDefinitionId);
FileUtils.copyInputStreamToFile(pngStream, new File("c:\\t\\abc.png"));
}
8.6.14 删除流程实例
@Test
public void test12(){
String processInstanceId = "401";
String deleteReason = "不请假了";
pe.getRuntimeService().deleteProcessInstance(processInstanceId , deleteReason );
}