工作流(workflow)系统
具有工作流的系统,使用的专门的建模语言(BPMN)定义
通过计算机对业务流程自动化执行管理
使用传统方式实现
代码工作量大,若流程发生改变的话,编写 的代码也会发生响应的改变
工作流引擎
按照BPMN规范进行部署,将业务和节点的流程进行分离
没有Activiti的开发流程
1.创建数据表
2.用户发起申请
3.审批过程中,更新状态,生成历史记录
4.结束
Activiti7的工作流程
activiti是一个工作流引擎
1.业务流程图本质上就是一个XML文件,而XML可以存放所要的数据。
2.读取业务流程图的过程就是解析XML文件的过程。
3.读取一个业务流程图的结点就相当于解析一个XML的结点,进一步将数据插入到MySQL表中,形成一条记录。
4.将一个业务流程图的所有节点都读取并存入到MySQL表中。
5.后面只要读取MySQL表中的记录就相当于读取业务流程图的一个节点。
6.业务流程的推进,后面就转换为读取表中的数据,并且处理数据,结束的时候这一行数据就可以删除了。历史不能删除
Activiti的使用
1.将Activiti和业务系统环境继承到一起
2.业务流程建模(画图):创建一个配置文件,通过绘制图像的方式,自动生成xml代码
3.部署业务流程:做流程的定义,
4.启动流程实例:根据定义创建实例
5.查询代办任务:
6.处理代办任务
7.结束:删除没用的实例
如何集成Activiti
ProcessEngine所需要的jar包,包括:
1.activiti-engine-7.0.0.GA.jar
2.activiti依赖的jar包:mybatis、slf4j、log4j等
3.activiti依赖的spring的jar包
4.数据库驱动
5.第三方数据库连接池druid
6.单元测试junit
spring配置文件的名字必须是activity.cgf.xml
**1.绘制流程图
2.并赋予每个流程图名称和分配角色
3.在空白地方点击后,给该流程图赋值id和name
4.修改文件的名字,并选择另一个视图进行打开
5.将该图片进行保存
1.开启流程引擎,创建25张表
此时表中是没有数据的
@Test
public void test() {
//开启处理流程的引擎
//会创建好Activiti的25张表
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
System.out.println(engine);
}
2.将流程图的步骤加入进去,即部署流程
使用xml文件中的name名字进行部署
@Test
public void testDeployment(){
//获取流程引擎对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//获取RepositoryService
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
//部署bpmn和png两个对象
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
deploymentBuilder.addClasspathResource("bpmn/leave.bpmn") //流程定义的文件
.addClasspathResource("bpmn/leave/leave.png")//流程定义的图片
.name("请假流程");//部署的名字
Deployment deployment = deploymentBuilder.deploy();
System.out.println("deployment.getId() = " + deployment.getId());
System.out.println("deployment.getName() = " + deployment.getName());
}
3.启动流程,使用流程图xml文件中的id作为启动的key
//启动流程
@Test
public void testProcessInstance(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
//根据流程定义的key启动流程实例,这个key是在定义bpmn的时候设置的
ProcessInstance leaveProcess = runtimeService.startProcessInstanceByKey("leaveProcess");
//获取流程实例的相关信息
System.out.println("流程定义的id= " + leaveProcess.getProcessDefinitionId());
System.out.println("流程实例的id = " + leaveProcess.getProcessInstanceId());
}
4.查询待办信息
@Test
public void testTask(){
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService
TaskService taskService = defaultProcessEngine.getTaskService();
TaskQuery taskQuery = taskService.createTaskQuery();
//设置查询条件
taskQuery.processDefinitionKey("leaveProcess")
.taskAssignee("张三");//处理流程的对象
//获取任务集合
List<Task> list = taskQuery.list();
//遍历集合
for (Task task : list) {
System.out.println("流程定义id = " + task.getProcessDefinitionId());
System.out.println("流程实例的id= " + task.getProcessInstanceId());
System.out.println("任务id = " + task.getId());
System.out.println("任务名称= " + task.getName());
}
}
4.处理代办信息
@Test
public void testCompleteTask(){
//获取TaskService
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = defaultProcessEngine.getTaskService();
TaskQuery taskQuery = taskService.createTaskQuery();
taskQuery.processDefinitionKey("leaveProcess")
.taskAssignee("张三");
//获取任务集合
List<Task> list = taskQuery.list();
//遍历集合
for (Task task : list) {
//使用taskService.complete去处理流程
taskService.complete(task.getId());
}}
5.添加审批意见
@Test
public void testAddComment(){
//获取TaskService
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = defaultProcessEngine.getTaskService();
TaskQuery taskQuery = taskService.createTaskQuery();
taskQuery.processDefinitionKey("leaveProcess")
.taskAssignee("李四");
//获取任务集合
List<Task> list = taskQuery.list();
//遍历集合
for (Task task : list) {
//添加审批意见
taskService.addComment(task.getId(),task.getProcessInstanceId(),"李四审批通过");
//使用taskService.complete去处理流程
taskService.complete(task.getId());
}}
6.查询历史审批意见
@Test
public void testGetComment(){
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//获取historyService对象
HistoryService historyService = defaultProcessEngine.getHistoryService();
//获取taskService
TaskService taskService = defaultProcessEngine.getTaskService();
HistoricActivityInstanceQuery query = historyService.createHistoricActivityInstanceQuery();
query.activityType("userTask");//活动节点的类型(userTask/startEvent/EndEvent
query.processInstanceId("2501");//流程实例的id,根据表中的流程实例id填写
//query.taskAssignee("李四");//任务负责人,可以加上,否则就是查询的所有
query.finished();
//获取历史审核信息,包含审核人等所有的信息
List<HistoricActivityInstance> list = query.list();
for (HistoricActivityInstance instance : list) {
String taskId = instance.getTaskId();
//获取审核批注信息,即审核人审核的信息
List<Comment> taskComments = taskService.getTaskComments(taskId);
for (Comment taskComment : taskComments) {
System.out.println("taskComment.getFullMessage() = " + taskComment.getFullMessage());
}
}
数据库表的命名规则
-
ACT_RE_*
:'RE’表示Repository。这个前缀的表包含了流程定义和流程静态资源(图片、规则等等)。 -
ACT_RU_*
:'RU’表示Runtime。这些运行时的表,包含流程实例,任务、变量,异步任务等运行中的数据。Activiti只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。这些运行时表可以一直很小并且速度很快。 -
ACT_HI_*
:'HI’表示History。这些表包含历史数据,比如历史流程实例,变量,任务等等。 -
ACT_GE_*
:'GE’表示General。通用数据,用于不同场景下。
ProcessInstanceId:流程实例id
comment:评语
Deployment:流程
Deploymentid:流程id,在表re_procdef
task:任务
excution:执行实例
businessKey:业务标识
这些运行时表可以一直很小并且速度很快。
- `