工作流Activiti5入门(下)
看了工作流上和中的人,相信已经在慢慢入门了,因为本教程也只是致力于做一个入门而已,然后在用的过程中再慢慢学习,用来工作也许是一点问题都没有了,如果没有看过请看这篇和这篇,所以本没有必要再写下了,但实在感觉留下一个小尾巴:数据库还没有给大家介绍,这个入门实在是太过简陋,所以今天就把这篇文章来一个扫尾,下面先看最后一个想用的task
六. 组任务
1. 分配组任务方式一(直接指定办理人)
具体配置:
完成任务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | /**查询当前人的个人任务*/ @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); } |
2. 分配组任务方式二(使用流程变量)
具体配置:
完成任务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | // 2 启动流程 //启动流程实例,同时设置流程变量,用来指定组任务的办理人 Map<String, Object> variables = new HashMap<String, Object>(); variables.put( "userIDs" , "大大,小小,中中" ); ProcessInstance pi = processEngine.getRuntimeService() // .startProcessInstanceByKey( "taskProcess" ,variables); System.out.println( "pid:" + pi.getId()); } //查询我的个人任务列表 @Test public void findMyTaskList(){ String userId = "大大" ; List<Task> list = processEngine.getTaskService() // .createTaskQuery() // .taskAssignee(userId) //指定个人任务查询 .list(); for (Task task:list ){ System.out.println( "id=" +task.getId()); System.out.println( "name=" +task.getName()); System.out.println( "assinee=" +task.getAssignee()); System.out.println( "assinee=" +task.getCreateTime()); System.out.println( "executionId=" +task.getExecutionId()); } } //查询组任务列表 @Test public void findGroupList(){ String userId = "大大" ; List<Task> list = processEngine.getTaskService() // .createTaskQuery() // .taskCandidateUser(userId) //指定组任务查询 .list(); for (Task task:list ){ System.out.println( "id=" +task.getId()); System.out.println( "name=" +task.getName()); System.out.println( "assinee=" +task.getAssignee()); System.out.println( "assinee=" +task.getCreateTime()); System.out.println( "executionId=" +task.getExecutionId()); System.out.println( "##################################" ); } } //查询组任务成员列表 @Test public void findGroupUser(){ String taskId = "3709" ; List<IdentityLink> list = processEngine.getTaskService() // .getIdentityLinksForTask(taskId); for (IdentityLink identityLink:list ){ System.out.println( "userId=" +identityLink.getUserId()); System.out.println( "taskId=" +identityLink.getTaskId()); System.out.println( "piId=" +identityLink.getProcessInstanceId()); System.out.println( "######################" ); } } //查询组任务成员历史列表 @Test public void findGroupHisUser(){ String taskId = "3709" ; List<HistoricIdentityLink> list = processEngine.getHistoryService() // .getHistoricIdentityLinksForTask(taskId); for (HistoricIdentityLink identityLink:list ){ System.out.println( "userId=" +identityLink.getUserId()); System.out.println( "taskId=" +identityLink.getTaskId()); System.out.println( "piId=" +identityLink.getProcessInstanceId()); System.out.println( "######################" ); } } //完成任务 @Test public void completeTask(){ String taskId = "3709" ; processEngine.getTaskService() // .complete(taskId); // System.out.println( "完成任务" ); } /**将组任务分配给个人任务,拾取任务*/ //由1个人去完成任务 @Test public void claim(){ //任务ID String taskId = "5908" ; //分配的办理人 String userId = "小B" ; processEngine.getTaskService() // .claim(taskId, userId); } |
七. 数据库
Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
ACT_RE_*: ‘RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: ‘RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: ‘ID’表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: ‘HI’表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。
再具体的各个表结构操作如下,至于各个表的每个字段什么含义,就靠读者自己学习了:
1:资源库流程规则表
act_re_deployment 部署信息表
act_re_model 流程设计模型部署表
act_re_procdef 流程定义数据表
2:运行时数据库表
act_ru_execution 运行时流程执行实例表
act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
act_ru_task 运行时任务节点表
act_ru_variable 运行时流程变量数据表
3:历史数据库表
act_hi_actinst 历史节点表
act_hi_attachment 历史附件表
act_hi_comment 历史意见表
act_hi_identitylink 历史流程人员表
act_hi_detail 历史详情表,提供历史变量的查询
act_hi_procinst 历史流程实例表
act_hi_taskinst 历史任务实例表
act_hi_varinst 历史变量表
4:组织机构表
act_id_group 用户组信息表
act_id_info 用户扩展信息表
act_id_membership 用户与用户组对应信息表
act_id_user 用户信息表
这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
5:通用数据表
act_ge_bytearray 二进制数据表
act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,
至于这些表的ER图,则如下:
写到这里,工作流activiti的一个基本教程就完了,因为这几篇博客,是老夫随性所写,并无一个整体的计划,所以很散漫,但老夫相信看完这个系列的教程,读者对activiti一定有了一个初步的概念,聪明如读者,再加上自己的使用过程中的自学,在工作中一定可以如鱼得水
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/233
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
近期评论