因业务需要,所以对此做下记录
挂起、激活流程定义的所有流程实例
/**
* 通过流程定义对流程实例进行批量挂起或激活操作
*/
public void suspendAllPeocessInstance(){
//获取流程定义id
final ProcessDefinition myEve = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myEve").singleResult();
//获取流程定义状态
final boolean suspended = myEve.isSuspended();
//获取流程定义id
final String definitionId = myEve.getId();
//如果当前状态为挂起则激活 反之挂起
if(suspended){
repositoryService.activateProcessDefinitionById(definitionId,true,null);
}else{
repositoryService.suspendProcessDefinitionById(definitionId,true,null);
}
}
repositoryService
此过程操作activiti表中的以下表:
ACT_RE_PROCDEF //流程实例表
SUSPENSION_STATE_ 流程挂起状态 1.激活 2.挂起
ACT_RU_EXECUTION // 流程任务启动执行表
SUSPENSION_STATE_ 流程挂起状态 1.激活 2.挂起
ACT_RU_TASK //流程任务启动表
SUSPENSION_STATE_ 流程挂起状态 1.激活 2.挂起
挂起、激活单个流程实例
/**
* 挂起、激活单个流程实例
*/
public void suspendSingleProcessIntance(){
//获取流程实例id
final ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processDefinitionId("27501").singleResult();
//获取流程实例状态
final boolean suspended = processInstance.isSuspended();
//获取流程实例id
final String instanceId = processInstance.getId();
if(suspended){
//激活
runtimeService.activateProcessInstanceById(instanceId);
}else {
//挂起
runtimeService.suspendProcessInstanceById(instanceId);
}
}
runtimeService
此过程操作activiti表中的以下表:
ACT_RU_EXECUTION // 流程任务启动执行表
SUSPENSION_STATE_ 流程挂起状态 1.激活 2.挂起
ACT_RU_TASK //流程任务启动表
SUSPENSION_STATE_ 流程挂起状态 1.激活 2.挂起
流程任务完成
/**
* 挂起后的任务不能被执行
* 完成个人任务
*/
public void completTask(){
//使用taskService获取任务
final Task task = taskService.createTaskQuery()
.processInstanceId("27501")
.taskAssignee("zhangsan")
.singleResult();
System.out.println("流程定义id"+task.getProcessDefinitionId());
System.out.println("流程任务id"+task.getId());
System.out.println("流程实例id"+task.getProcessInstanceId());
System.out.println("负责人"+task.getAssignee());
System.out.println("任务名称"+task.getName());
//根据任务id完成任务
taskService.complete(task.getId());
}
使用的Service为taskService
(当流程中的审批人,不固定为某个人或某些人时(即部门),可采用候选人方式,不设定任务节点的操作人,用候选人去 拾取任务后,进行完成)
获取任务候选人
/**
*
*@User :Test
*@date :2014-6-27 上午09:38:36
*@return :Set
*@userFor :获得任务中的办理候选人
*/
private Set getTaskCandidate(String taskId) {
Set users = new HashSet();
List identityLinkList = taskService.getIdentityLinksForTask(taskId);
if (identityLinkList != null && identityLinkList.size() > 0) {
for (Iterator iterator = identityLinkList.iterator(); iterator
.hasNext();) {
IdentityLink identityLink = (IdentityLink) iterator.next();
if (identityLink.getUserId() != null) {
User user = getUser(identityLink.getUserId());
if (user != null)
users.add(user);
}
if (identityLink.getGroupId() != null) {
// 根据组获得对应人员
List userList = identityService.createUserQuery()
.memberOfGroup(identityLink.getGroupId()).list();
if (userList != null && userList.size() > 0)
users.addAll(userList);
}
}
}
return users;
}
private User getUser(String userId) {
User user = (User) identityService.createUserQuery().userId(userId)
.singleResult();
return user;
}
拾取组任务
@Autowired
TaskService taskService;
/**
* 候选人拾取任务
* 根据任务id及候选人查询任务
* 拾取任务
*/
public void cliamTask(){
String taskId = "6234";
String userId = "lisi";
final Task task = taskService.createTaskQuery().taskId(taskId).taskCandidateUser(userId).singleResult();
if(task != null){
taskService.claim(taskId,userId);//拾取任务
}
}
归还任务
/**
* 归还任务
* 任务必须是自己名下的才可归还
* 归还任务就是将任务的负责人设置为null
*/
public void testAssigneeToGroupTask(){
String taskId = "6234";
String userId = "lisi";
//根据key和负责人来查询任务
final Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(userId).singleResult();
if(task != null){
taskService.setAssignee(taskId,null);//归还任务
}
}
交接任务 改变负责人
taskService.setAssignee(taskId,userId2);//交接任务
网关
排他网关 (ExclusiveGateway)
使用排他网关的优点在于,当程序执行条件分支时,没有符合的条件,如果没有排他网关则任务就会被结束,二使用后排他网关会给我们抛出异常然后处理即可。
并行网关
1.并行网关 会执行其下面的所有分支去执行,即使并行网关分支上存在条件,也会被忽略。
2.并行网关的设计,一般都会是前后都存在。后面的叫汇聚。如果并行网关存在一个处理完成,则需要等待所有的子模块都处理完成才可流向汇聚网关之后的节点。如下图:
包含网关
实则是排他网关和并行网关的汇总,如下图:
分支上的条件需要满足,并且必须将所有分支都执行结束,方可执行下一步。