5.3.1-拾取任务操作:
//拾取任务 @Test public void claimTask(){ // Task task=taskService.createTaskQuery().taskId("").singleResult(); taskService.claim("","bajie"); }
我们可以看到在我们给候选任务分配了执行人之后,任务节点就已经产生.并且查询其他没有被分配的执行人时可以看到都是没有的.
5.3.2-退还任务操作:
//退还任务 @Test public void setTaskAssignee(){ taskService.setAssignee("",null);//退任务 }
可以看到我们是接着上一步操作的,我们直接将任务退回之后,接着分别取我们分配的三个执行人下面查找,发现三个人都是没有改任务节点的,并且直接查找任务节点列表也是显示为空,这就表示我们的任务的确已经退回成功.
5.3.3-交办任务操作:
//交办任务 @Test public void setTaskAssignee(){ taskService.setAssignee("","wukong");//交办任务 }
以看到我们还是接着上一步,我们先是给我们已经退回的任务重新先分配了一个执行人bajie,然后再重新把任务交办给执行人wukong的,之后我们先是查找bajie下面的任务节点,发现是没有的,之后我们再去查找wukong下面的任务节点,发现是有的,这样我们的任务就已经交办成功了.
并且其实大家看完上述三个操作之后可以发现,其实这三者操作的代码是类似的,只不过是修改执行人的名称即可,所以其实这三部的代码是完全可以放在一个方法里面执行的,只要稍微注意一下情况的区分即可,比如说如果没有任务节点那么显然就是拾取操作,剩下的操作就是退还与交办了.
6.HistoricTaskInstance-历史任务:
关于历史任务,主要就是操作下面这几张表
act_hi_actinst:历史节点表,存放流程实例运转的各个节点信息(包含开始、结束等非任务节点);
act_hi_attachment:历史附件表,存放历史节点上传的附件信息(不常用);
act_hi_comment:历史意见表,可改造用于保存节点审批意见、备注;
act_hi_detail:历史详情表,存储节点运转的一些信息(不常用);
act_hi_identitylink:历史流程人员表,存储流程各节点候选、办理人员信息,常用于查询某人或部门的已办任务;
act_hi_procinst:历史流程实例表,存储流程实例历史数据(包含正在运行的流程实例);
act_hi_taskinst:历史流程任务表,存储历史任务节点;
act_hi_varinst:流程历史变量表,存储流程历史节点的变量信息;
6.1-HistoricTaskInstance根据执行人查询历史信息操作:
@Autowired private HistoryService historyService; //根据执行人查询历史任务信息 @Test public void HistoricTaskInstanceByAssignee(){ List<HistoricTaskInstance> historicTaskInstances=historyService.createHistoricTaskInstanceQuery() .orderByHistoricTaskInstanceEndTime().asc() .taskAssignee("bajie") .list(); for(HistoricTaskInstance historicTaskInstance:historicTaskInstances){ System.out.println("Id:"+historicTaskInstance.getId()); System.out.println("Assignee:"+historicTaskInstance.getAssignee()); System.out.println("ProcessInstanceId:"+historicTaskInstance.getProcessInstanceId()); System.out.println("EndTime:"+historicTaskInstance.getEndTime()); System.out.println("Name:"+historicTaskInstance.getName()); } }
运行完成之后我们可以看到bajie所执行的所有历史历史任务了
6.2-HistoricTaskInstance根据流程实例ID查询历史信息操作:
//根据流程实例ID查询历史任务信息 @Test public void HistoricTaskInstanceByProcessInstanceId(){ List<HistoricTaskInstance> historicTaskInstances=historyService.createHistoricTaskInstanceQuery() .processInstanceId("") .list(); for(HistoricTaskInstance historicTaskInstance:historicTaskInstances){ System.out.println("Id:"+historicTaskInstance.getId()); System.out.println("Assignee:"+historicTaskInstance.getAssignee()); System.out.println("ProcessInstanceId:"+historicTaskInstance.getProcessInstanceId()); System.out.println("EndTime:"+historicTaskInstance.getEndTime()); System.out.println("Name:"+historicTaskInstance.getName()); } }
7.UEL表达式:
7.1-UEL-传递执行人:
${变量名}
我们重新创建一个BPMN文件:
我们重新创建了一个BPMN文件,并且这次我们并没有给他直接分配执行人,而是通过通过UEL表达式进行动态的分配的.
//启动流程实例带参数--执行人 @Test public void initProcessInstanceWithArgs(){ //流程实例变量 Map<String,Object> map=new HashMap<>(); map.put("Staff","wukong"); // map.put("Staff1",""); // map.put("Staff2",""); ProcessInstance processInstance=runtimeService.startProcessInstanceByKey("myProcess_UEL_V1","test001",map); System.out.println("ID:"+processInstance.getId()); System.out.println("Name:"+processInstance.getName()); System.out.println("ProcessDefinitionId:"+processInstance.getProcessDefinitionId()); }
这里我们首先显示部署我们刚才生成的BPMN文件,之后我们便去实例化我们的流程实例,并且在这个过程中我们同事赋予该流程实例的执行人是wukong,之后我们便去查询wukong下的所有任务节点可以发现wukong下面的确多出来一个任务节点.说明我们赋予执行人的操作已经成功执行了.
7.2-UEL-传递流程变量:
我们在创建一个BPMN文件:
我们这里定义了一个条件转移过程,如果报销费用小于等于100的话就由悟空审核,超过100的话就由唐僧审核,这个费用的变量值就是在八戒的任务节点产生,并且直接判断之后转移到下一个任务节点.
@Test public void CompletetaskWithArgs(){ Map<String,Object> map=new HashMap<>(); map.put("pay","120"); taskService.complete("a61d9134-3f49-11eb-97e4-3c58c24c1a1b",map); System.out.println("该任务节点已经处理完毕"); }
我们可以看我们首先先将我们刚才定义的BPMN文件部署号,之后我们再去创建该流程定义的流程实例,之后我们先去查询一下tangseng下面时候有任务节点,应该是没有的,因为我们之前就没有给他分配过任务.
之后我们再去获取该流程实例生成的关于bajie的任务节点的ID号,这样我们才能去执行我们的任务节点,执行完任务节点之后,按道理这时候任务节点就已经转接到tangseng的任务节点了.这时候我们再去查询tangseng的任务节点我们就能发现的确是已经将任务节点流转到tangseng这里了,这就说明我们关于传递流程变量的操作已经成功执行了.
7.3-UEL-传递实体类的流程变量以及候选任务的执行人:
还是先来看看我们的BPMN文件:
这次可以看到我们的任务节点中的变量不再是我们直接定义的变量名了,而是换成了我们定义的实体类的一个属性,注意这里要注意,实体类的属性只能使用小写字母,不能使用大写字母,否则会出错.
接着就是我们的候选任务了,其实这里的变量定义和我们之前的定义是一样不一样的是我们之后为这个变量赋值的时候需要注意一下.
接着就是我们的代码了:
我们先看变量是实体类:
//启动流程实例带参数--实体类 @Test public void initProcessInstanceWithClassArgs(){ UELDao uelDao=new UELDao(); uelDao.setStaff("wukong"); //流程实例变量 Map<String,Object> map=new HashMap<>(); map.put("uel",uelDao); // map.put("Staff1",""); // map.put("Staff2",""); ProcessInstance processInstance=runtimeService.startProcessInstanceByKey("myProcess_UEL_V3","test001",map); System.out.println("ID:"+processInstance.getId()); System.out.println("Name:"+processInstance.getName()); System.out.println("ProcessDefinitionId:"+processInstance.getProcessDefinitionId()); }
这其中我们定义的实体类必须要实现序列化,否则也是不会生效的.
为了节省时间我们就不重复录制部署的过程了,直接开始我们赋予实体类流程变量的过程,之后就是查看该角色下的任务节点时候有一个叫做 “实体类任务” 的任务节点,可以发现的确有这样一个任务节点,说明我们通过实体类赋值的操作已经执行成功了.
接下来就是赋予候选人执行人:
//任务执行完成后赋予候选任务节点多个候选人 @Test public void initTaskWithCandiDateArgs(){ Map<String,Object>map=new HashMap<>(); map.put("staffs","bajie,shaseng,tangseng"); taskService.complete("",map); System.out.println("任务节点已完成,候选任务执行人变量已赋予,带拾取"); }
这里面我们主要需要注意一点就是多位候选人中间需要通过英文状态下的,隔开,否则不会生效的.
这里我们将我们的实体类任务执行完成的同时将候选任务的执行人变量赋予,之后我们再去查找所有的任务节点会发现有一个任务节点的执行人为null.为null就和我们上面的候选任务一样,只有在我们已经对该任务进行拾取操作之后才会显示执行人,否则是会显示为null的,很明显我在设置的时候使用的是中文状态的标点符号,所以他把整体都算成是一个执行人了.这里大家一定要注意.