1.流程定义id : 就是指向特定的流程,版本,和一个随机数. 就是指向了某一个流程的确定版本
2.流程实例id : 就是一个流程被创建之后,会生成一个id. 就是指向了一个具体的流程
3.流程任务id : 就是一个正在执行的任务,流程进行到任何一步都会生成一个id, 就是记录了一个流程实例执行到了哪一步;谁是执行人
4.活动id: 就是执行流程过程中,记录了流程所处的活动位置(这个活动位置可能并不是任务);
请假流程:
----->填写一张请假单,保存到leavesheet表中,可以增删改查
部署流程----->编写一个流程bpmn,保存到activiti的相关表中,真正的bpmn文件内容是保存在:act_ge_bytearray表中;
@Test
public void deploy(){
//取得流程引擎对象
//ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
//获取仓库服务 :管理流程定义
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment()//创建一个部署的构建器
.addClasspathResource("diagrams/LeaveBill.bpmn")//从类路径中添加资源,一次只能添加一个资源
.addClasspathResource("diagrams/LeaveBill.png")//从类路径中添加资源,一次只能添加一个资源
.name("请求单流程")//设置部署的名称
.category("办公类别")//设置部署的类别
.deploy();
System.out.println("部署的id"+deploy.getId());
System.out.println("部署的名称"+deploy.getName());
}
开启任务----->提交到流程,使用"流程引擎"获得"运行时服务",使用"运行时服务"开启流程实例:
String processDefiKey="leaveBill";
//取运行时服务
RuntimeService runtimeService = processEngine.getRuntimeService();
//取得流程实例
ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey);//通过流程定义的key 来执行流程
查询任务----->此时,在activiti的23张表中相关表中就产生了数据,每个用户可以根据用户名来查询自己的任务(list):
//任务的办理人
String assignee="王五";
//取得任务服务
TaskService taskService = processEngine.getTaskService();
//创建一个任务查询对象
TaskQuery taskQuery = taskService.createTaskQuery();
//办理人的任务列表
List
.list();
完成任务-----> 每个人都可以根据 任务id来完成任务:
//执行任务
@Test
public void compileTask(){
String taskId="502";
//taskId:任务id
processEngine.getTaskService().complete(taskId);
System.out.println("当前任务执行完毕");
}
任务流转----->每个人完成了任务,流程引擎会查询 act_ge_bytearray 表中的bpmn文件,查找下一个节点,并将节信息更新到"运行任务表";
关于流程变量:
1.有两种服务可以设置流程变量:
//TaskService taskService = processEngine.getTaskService();
//RuntimeService runtimeService = processEngine.getRuntimeService();
2.每个服务都有三种设置流程变量的方式:
1.通过 runtimeService 来设置流程变量
* exxcutionId: 执行对象
* variableName:变量名
* values:变量值
*/
// runtimeService.getVariableLocalVariable(exxcutionId, variableName, values);
// runtimeService.setVariableLocal(executionId, variableName, values);
//设置本执行对象的变量 ,该变量的作用域只在当前的execution对象
// runtimeService.setVariables(exxcutionId, variables);
//可以设置多个变量 放在 Map
2. 通过TaskService来设置流程变量
* taskId:任务id
*/
// taskService.setVariable(taskId, variableName, values);
// taskService.setVariableLocal(taskId, variableName, values);
设置本执行对象的变量 ,该变量的作用域只在当前的execution对象
// taskService.setVariables(taskId, variables); //设置的是Map
3. 流程变量设置的两个特殊时机(1.流程启动时; 2.任务完成时;):
3. 当流程开始执行的时候,设置变量参数
* processDefiKey: 流程定义的key
* variables: 设置多个变量 Map
*/
// processEngine.getRuntimeService()
// .startProcessInstanceByKey(processDefiKey, variables)
4. 当执行任务时候,可以设置流程变量
* taskId:任务id
* variables: 设置多个变量 Map
*/
// processEngine.getTaskService().complete(taskId, variables);
4. 获取流程变量的两种服务:
5. 通过RuntimeService取变量值
* exxcutionId: 执行对象
*
*/
// runtimeService.getVariable(exxcutionId, variableName);//取变量
// runtimeService.getVariableLocal(exxcutionId, variableName);//取本执行对象的某个变量
// runtimeService.getVariables(variablesName);//取当前执行对象的所有变量
6. 通过TaskService取变量值
* TaskId: 执行对象
*
*/
// taskService.getVariable(taskId, variableName);//取变量
// taskService.getVariableLocal(taskId, variableName);//取本执行对象的某个变量
// taskService.getVariables(taskId);//取当前执行对象的所有变量
关于用TaskService设置的流程变量: Variable和VariableLocal的区别:
setVariable 是执行对象的公用变量,每一个任务对象都可以获得并修改其值;属于公共变量;
setVariableLocal 是当前任务的私用变量,只对当前任务可用;其他任务对象可以有同名变量,用任务id区别;
getVariable 是获取公有变量; 也可以获得当前私有变量(因为getVariable方法执行时要传入任务id,所以当前任务的私有变量
它可以拿到)
getVariableLocal 是获取私有变量,没法获得公共变量;
上边都是逻辑理解,但本质上是这样的:
当使用TaskService来设置变量时,
它的流程id(例如1301),执行id(例如1301)都是确定的:
当使用setVariable,它是直接存储了一个变量,
使用: 流程id(例如1301)+执行id(例如1301)+变量名 来确定
当使用setVariableLocal, 它是直接存储一个变量,同时存储一个任务id(例如1304),所以这个变量用:
使用: 流程id(例如1301)+执行id(例如1301)+任务id(例如1304)+变量名 来确定
当使用TaskService来获取变量时,
它的流程id(例如1301),执行id(例如1301)都是确定的:
当使用getVariable,它是直接存储了一个变量,
使用: 流程id(例如1301)+执行id(例如1301)+变量名 来确定
当使用getVariableLocal, 它是直接存储一个变量,同时存储一个任务id(例如1304),所以这个变量用:
使用: 流程id(例如1301)+执行id(例如1301)+任务id(例如1304)+变量名 来确定
所以 当使用getVariable来获得变量时,是可以获得 setVariableLocal方法定义的变量;
请假流程分析:
1.前端页面: (modelid----指向了---->js类------>指向了一个业务类)
1.在模块菜单表中配置模块,前端就有了模块按钮 (与modelID绑定)
2.在操作表中配置按钮, 前端就有了按钮(通过modelid 与js中的特定方法绑定)
3.在tab_col表中配置列,在grid表中就显示响应的列;
2.后端
js--->调action--->...
3.请假流程分析:
---->在操作表中配置 "流程提交" 按钮,并与js中submit()方法绑定
---->点击提交按钮,读取请假表中的数据填充 "流程变量" 并complete()任务;
---->下一个节点执行人进入请假模块界面,会查询到当前流到他的任务, 在后端配置"审核" 按钮;
并且在后端 my_act_flow 表中配置 "审核菜单" 中的按钮: "批准", "发回修改", "取消流程"等选项;
同时给这些按钮配置相应的值: 用来填充决定流程走向的 "流程变量"; 当点击"审核"按钮时,会调用js类
中的 "审核方法" ,该方法会调用action到数据库中查询 my_act_task 表,获得数据给弹窗生成提供支持,
同时还会查询 my_act_flow 表,来给弹窗添加 流程转向按钮; 我们点击提交以后, 会调用complete()方法,
任务流转;
---->后边的节点任务流转同上;
---->
现在流程要增加节点:
1.首先要重新画流程图;
2.这样前端在提交
我们假设没有指定任务执行人 asignee没有赋值,默认所有人都可以看到所有的grid数据,然后给有权限的人分配
"审核" 按钮的权限,那么可以审核的人就可以在grid中选中一条申请,打开审核窗口,就会依据这条申请信息