学习activiti,就是学习使用java代码操作25张表; java代码中我们调用Activiti的工具类;
service名称 | service作用 |
---|---|
RepositoryService | activiti的资源管理类 |
RuntimeService | activiti的流程运行管理类 |
TaskService | activiti的任务管理类 |
HistoryService | activiti的历史管理类 |
ManagerService | activiti的引擎管理类 |
我们创建了一个工作流引擎对象,里面最主要的就是以上的9个方法
代码操作25张表,我们需要拿到25张表整体的一个对象,使用对象里面的各种各样的方法进行操作25张表;这个最原始的,最开始的一个大的对象,创建方法是
1 默认创建方式
将activiti.cfg.xml文件名及路径固定,
且activiti.cfg.xml文件中有 processEngineConfiguration的配置,
可以使用如下代码创建processEngine:
//直接使用工具类 ProcessEngines,使用classpath下的activiti.cfg.xml中的配置创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
2 一般创建方式
//先构建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();
以上获取的processEngine对象,这个对象里面有好多的方法,利用这些方法就可以操作25张表了
这个对象里面,一共有15个方法进行操作25张表
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
操作act_hi_taskinst这个表
// 创建历史任务实例对象
HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery();
得到这个对象,我们可以理解为,得到了act_hi_taskinst这个表的对象;这个对象里面有好多的方法,可以操作这个表
HistoricTaskInstanceQuery这个对象里面有这个方法,这个方法就是可以限制查询哪个流程定义,参数是流程定义的key
HistoricTaskInstanceQuery qingjia1 = historicTaskInstanceQuery.processDefinitionKey("qingjia");
根据用户id,查询属于当前用户的任务,参数是前端传过来的用户的id
HistoricTaskInstanceQuery qingjia1 = historicTaskInstanceQuery.taskAssignee(id + "");
act_hi_taskinst这个表里面有一个name字段,当前任务的名称,我们可以根据这个字段进行模糊查询
HistoricTaskInstanceQuery qingjia1 = historicTaskInstanceQuery.taskNameLike("%审批%");
分页查询act_hi_taskinst这个表里面的数据
List<HistoricTaskInstance> historicTaskInstances = historicTaskInstanceQuery.listPage(page, rows);
之后就可以变量这个list集合,拿到的就是这个表里面一行一行的数据对象
查询已经完成的任务,就是endTime字段有值的数据,相当于查询已经审核完成的数据
HistoricTaskInstanceQuery finished =
historicTaskInstanceQuery.finished();
act_hi_taskinst这个表里面有个endTime字段,完成的任务,这个字段就有值,可以根据这个字段进行排序
List<HistoricTaskInstance> historicTaskInstances = historicTaskInstanceQuery.orderByHistoricTaskInstanceEndTime().asc().listPage(page, rows);
// 查询历史流程实例对象
HistoricProcessInstanceQuery hisquery = processEngine.getHistoryService().createHistoricProcessInstanceQuery();
拿到这个对象,就可以操作act_hi_procinst这个表
根据流程定义的id查询创建的流程实例
HistoricProcessInstanceQuery qingjia3 = hisquery.processDefinitionKey("qingjia");
根据业务id,查询当前业务下创建的流程实例
// 根据流程定义id,流程BusinessKey的业务值,获取当前业务单的审批流程
HistoricProcessInstanceQuery qingjia3 = hisquery.processInstanceBusinessKey(id + "");
查询有多少个流程实例
List<HistoricProcessInstance> qingjia2 = hisquery.processDefinitionKey("qingjia").processInstanceBusinessKey(id + "").list();
判断当前流程实例是否已经走完;为null就是没有走完; 这个获取的就是当前流程结束的节点的活动id
for(HistoricProcessInstance item: qingjia2){
// getEndActivityId 判断当前流程实例是否完成,如果没有完成,不能创建
if(item.getEndActivityId() == null){
System.out.println("不能重复提交申请单");
}
}
拿到操作act_hi_actinst 这个表的对象,这个表里面的各个节点都有
HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
根据查询出来的流程结束的节点id,查询最后一个数据
HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery().activityId(endActivityId);
// 根据最后节点的id,获取任务 ,其实只有一个,但是这里使用了list,是没有找到获取单个的方法
List<HistoricActivityInstance> list1 = historyService.createHistoricActivityInstanceQuery().activityId(endActivityId).list();
HistoricActivityInstance historicActivityInstance = list1.get(0);
获取act_hi_actinst 这个表的name字段,获取最后节点的名称
String activityName = historicActivityInstance.getActivityName();//获取最后节点的名称
这个类里面一共有46个方法,需要我们学习
使用这个方法获取到RepositoryService对象,用这个对象里面的各种各样的方法操作25张表
// 获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
创建查询部署的对象,可以理解为查询 act_re_deployment
DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
创建查询部署的对象,可以理解为查询 act_re_deployment
List<Deployment> list = repositoryService.createDeploymentQuery().list();
for(Deployment dep : list){
System.out.println("Id:"+dep.getId());
System.out.println("Name:"+dep.getName());
System.out.println("DeploymentTime:"+dep.getDeploymentTime());
System.out.println("Key:"+dep.getKey());
}
使用这个方法,创建流程定义对象; 相当于操作这个表act_re_procdef
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
.list();
这个类里面一共有100个方法,需要我们学习
使用这个方法获取到RuntimeService对象,用这个对象里面的各种各样的方法操作25张表
// 1、得到ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、得到RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
根据runtimeService对象,创建流程实例,就是根据这个方法
//初始化流程实例
@Test
public void initProcessInstance(){
//1、获取页面表单填报的内容,请假时间,请假事由,String fromData
//2、fromData 写入业务表,返回业务表主键ID==businessKey
//3、把业务数据与Activiti7流程数据关联
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_claim","bKey002");
System.out.println("流程实例ID:"+processInstance.getProcessDefinitionId());
}
获取流程实例查询对象
ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();
List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().list();
获取流程实例list集合
挂起流程实例,传参是流程实例的id
runtimeService.suspendProcessInstanceById("73f0fb9a-ce5b-11ea-bf67-dcfb4875e032");
激活流程实例,传参是流程实例的id
runtimeService.activateProcessInstanceById("73f0fb9a-ce5b-11ea-bf67-dcfb4875e032");
删除流程实例
//删除流程实例
@Test
public void delProcessInstance(){
runtimeService.deleteProcessInstance("45b8b797-ba0c-11ec-8af3-e02be94c81b8","删着玩");
System.out.println("删除流程实例");
}
其他数据会删除,但是会在历史表保存
这个类里面一共有88个方法,需要我们学习
使用这个方法获取到TaskService对象,用这个对象里面的各种各样的方法操作act_ru_task这个表,就是操作运行的任务表
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取操作任务的服务 TaskService
TaskService taskService = processEngine.getTaskService();
创建查询对象
TaskQuery taskQuery = taskService.createTaskQuery();
act_ru_task这个表里面根据任务id查询数据
//根据任务id查询任务表
TaskQuery taskQuery1 = taskQuery.taskId(taskid + "");
获取单个数据
Task task = taskQuery1.singleResult();
获取act_ru_task这个表单个数据的操作人
// 获取当前任务的 处理人
String assignee = task.getAssignee();
// 添加审批意见
// 设置审批意见的审批人, 这个必须写
Authentication.setAuthenticatedUserId(userid+"");
// 添加审批意见
taskService.addComment(taskid+"",task.getProcessInstanceId(),comment);;
第一个参数是当前任务的id 第二个参数是当前任务的流程实例id 第三个参数是前端传过来的审批意见
评论会写到act_hi_comment这个表,谁评论的也会在这个表里面设置
第一个是任务id,第二个是当前任务里面的变量需要设置值,所以使用map给变量设置值
Map<String, Object> map = new HashMap<String, Object>();
map.put("agree",agree);
taskService.complete(taskid+"",map);
拾取任务,第一个参数是任务id,第二个参数是候选人名字
//拾取任务
@Test
public void claimTask(){
Task task = taskService.createTaskQuery().taskId("f5c87a6e-ba27-11ec-89da-e02be94c81b8").singleResult();
taskService.claim("f5c87a6e-ba27-11ec-89da-e02be94c81b8","wukong");
}
其实就是设置候选人,这个候选人不一定是在流程图里面设置的,随便一个人就可以;
//归还与交办任务
@Test
public void setTaskAssignee(){
Task task = taskService.createTaskQuery().taskId("f5c87a6e-ba27-11ec-89da-e02be94c81b8").singleResult();
//归还候选任务
taskService.setAssignee("f5c87a6e-ba27-11ec-89da-e02be94c81b8",null);
//交办,其实就是设置执行人
// taskService.setAssignee("f5c87a6e-ba27-11ec-89da-e02be94c81b8","wukong");
}