看了工作流上和中的人,相信已经在慢慢入门了,因为本教程也只是致力于做一个入门而已,然后在用的过程中再慢慢学习,用来工作也许是一点问题都没有了,如果没有看过请看这篇这篇,所以本没有必要再写下了,但实在感觉留下一个小尾巴:数据库还没有给大家介绍,这个入门实在是太过简陋,所以今天就把这篇文章来一个扫尾,下面先看最后一个想用的task

六. 组任务

流程图:
9
其实和用户任务看起来并无差别,下面看实现

  1. 分配组任务方式一(直接指定办理人)

具体配置:

11

完成任务:


/*\*查询当前人的个人任务\*/  
@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);  
}
  1. 分配组任务方式二(使用流程变量)

具体配置:

13

完成任务:


// 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图,则如下:

acticiti_er_1

activiti_er_2
写到这里,工作流activiti的一个基本教程就完了,因为这几篇博客,是老夫随性所写,并无一个整体的计划,所以很散漫,但老夫相信看完这个系列的教程,读者对activiti一定有了一个初步的概念,聪明如读者,再加上自己的使用过程中的自学,在工作中一定可以如鱼得水