工作流Activiti5入门(下)

看了工作流上和中的人,相信已经在慢慢入门了,因为本教程也只是致力于做一个入门而已,然后在用的过程中再慢慢学习,用来工作也许是一点问题都没有了,如果没有看过请看这篇和这篇,所以本没有必要再写下了,但实在感觉留下一个小尾巴:数据库还没有给大家介绍,这个入门实在是太过简陋,所以今天就把这篇文章来一个扫尾,下面先看最后一个想用的task 六. 组任务 流程图: 其实和用户任务看起来并无差别,下面看实现 分配组任务方式一(直接指定办理人) 具体配置: 完成任务: /*\*查询当前人的个人任务\*/ @Test public void findMyPersonalTask(){ String assignee = "小A"; List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service .createTaskQuery()//创建任务查询对象 /*\*查询条件(where部分)\*/ .taskAssignee(assignee)//指定个人任务查询,指定办理人 // .taskCandidateUser(candidateUser)//组任务的办理人查询 /*\*排序\*/ .orderByTaskCreateTime().asc()//使用创建时间的升序排列 /*\*返回结果集\*/ .list();//返回列表 if(list!=null && list.size()>0){ for(Task task:list){ System.out.println("任务ID:"+task.getId()); System.out.println("任务名称:"+task.getName()); System.out.println("任务的创建时间:"+task.getCreateTime()); System.out.println("任务的办理人:"+task.getAssignee()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("执行对象ID:"+task.getExecutionId()); System.out.println("流程定义ID:"+task.getProcessDefinitionId()); System.out.println("########################################################"); } } } /*\*查询当前人的组任务\*/ @Test public void findMyGroupTask(){ String candidateUser = "大大"; List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service .createTaskQuery()//创建任务查询对象 /*\*查询条件(where部分)\*/ .taskCandidateUser(candidateUser)//组任务的办理人查询 /*\*排序\*/ .orderByTaskCreateTime().asc()//使用创建时间的升序排列 /*\*返回结果集\*/ .list();//返回列表 if(list!=null && list.size()>0){ for(Task task:list){ System.out.println("任务ID:"+task.getId()); System.out.println("任务名称:"+task.getName()); System.out.println("任务的创建时间:"+task.getCreateTime()); System.out.println("任务的办理人:"+task.getAssignee()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("执行对象ID:"+task.getExecutionId()); System.out.println("流程定义ID:"+task.getProcessDefinitionId()); System.out.println("########################################################"); } } } /*\*完成我的任务\*/ @Test public void completeMyPersonalTask(){ //任务ID String taskId = "6905"; processEngine.getTaskService()//与正在执行的任务管理相关的Service .complete(taskId); System.out.println("完成任务:任务ID:"+taskId); } /*\*查询正在执行的任务办理人表\*/ @Test public void findRunPersonTask(){ //任务ID String taskId = "6204"; List<IdentityLink> list = processEngine.getTaskService()// .getIdentityLinksForTask(taskId); if(list!=null && list.size()>0){ for(IdentityLink identityLink:list){ System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId()); } } } /*\*查询历史任务的办理人表\*/ @Test public void findHistoryPersonTask(){ //流程实例ID String processInstanceId = "6201"; List<HistoricIdentityLink> list = processEngine.getHistoryService()// .getHistoricIdentityLinksForProcessInstance(processInstanceId); if(list!=null && list.size()>0){ for(HistoricIdentityLink identityLink:list){ System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId()); } } } /*\*拾取任务,将组任务分给个人任务,指定任务的办理人字段\*/ @Test public void claim(){ //将组任务分配给个人任务 //任务ID String taskId = "6905"; //分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员) String userId = "大大"; processEngine.getTaskService()// .claim(taskId, userId); } /*\*将个人任务回退到组任务,前提,之前一定是个组任务\*/ @Test public void setAssigee(){ //任务ID String taskId = "6204"; processEngine.getTaskService()// .setAssignee(taskId, null); } /*\*向组任务中添加成员\*/ @Test public void addGroupUser(){ //任务ID String taskId = "6204"; //成员办理人 String userId = "大H"; processEngine.getTaskService()// .addCandidateUser(taskId, userId); } /*\*从组任务中删除成员\*/ @Test public void deleteGroupUser(){ //任务ID String taskId = "6204"; //成员办理人 String userId = "小B"; processEngine.getTaskService()// .deleteCandidateUser(taskId, userId); } 分配组任务方式二(使用流程变量) 具体配置: ...

November 29, 2015 · 3 min · 455 words · Bridge Li

工作流Activiti5入门(中)

时光匆匆,没想到转眼离上次写工作流Activiti5入门(上)已经过去快四个月了,上次主要写了有关环境的搭建、工作流的部署、启动、查询、认领、完成任务以及查询流程状态和删除流程等,今天我们看看一些更高级也是非常经常用到的一些功能。 一. 连线 一个流程图不可能都是一些孤立的点,点和点之间需要一些线连接,那么这些线该如何连接呢? 一个活动中可以指定一个或多个SequenceFlow。 开始活动中有一个SequenceFlow 。 结束活动中没有SequenceFlow 。 其他活动中有1条或多条SequenceFlow 如果只有一个,则可以不使用流程变量设置codition的名称; 如果有多个,则需要使用流程变量设置codition的名称。message表示流程变量的名称,‘不重要’表示流程变量的值,${}中间的内容要使用boolean类型的表达式,用来判断应该执行的连线。例如可以这样,如果${}成立,则会按照这个方向走 流程图 完成任务 /*\*完成我的任务\*/ @Test public void completeMyPersonalTask(){ //任务ID String taskId = "3103"; //完成任务的同时,设置流程变量,使用流程变量用来指定完成任务后,下一个连线,对应sequenceFlow.bpmn文件中${message==&#8217;不重要&#8217;} Map<String, Object> variables = new HashMap<String, Object>(); variables.put("message", "重要"); processEngine.getTaskService()//与正在执行的任务管理相关的Service .complete(taskId,variables); System.out.println("完成任务:任务ID:"+taskId); } 连线比较简单,既不多做介绍了 二. 排他网关 一个排他网关对应一个以上的顺序流 由排他网关流出的顺序流都有个conditionExpression元素,在内部维护返回boolean类型的决策结果。 决策网关只会返回一条结果。当流程执行到排他网关时,流程引擎会自动检索网关出口,从上到下检索如果发现第一条决策结果为true或者没有设置条件的(默认为成立),则流出。 如果没有任何一个出口符合条件,则抛出异常 使用流程变量,设置连线的条件,并按照连线的条件执行工作流,如果没有条件符合的条件,则以默认的连线离开。 流程图 完成个人任务 /*\*完成我的任务\*/ @Test public void completeMyPersonalTask(){ //任务ID String taskId = "3904"; //完成任务的同时,设置流程变量,使用流程变量用来指定完成任务后,下一个连线,对应exclusiveGateWay.bpmn文件中${money>1000} Map<String, Object> variables = new HashMap<String, Object>(); variables.put("money", 200); processEngine.getTaskService()//与正在执行的任务管理相关的Service .complete(taskId,variables); System.out.println("完成任务:任务ID:"+taskId); } 三. 并行网关 ...

November 22, 2015 · 2 min · 379 words · Bridge Li