转向问题需要注意的是每次转向到其他节点时要把其他Transition给删掉,任务完成后要把删掉的Transition还原回去。
/**
*
* @author Test
* @createDate 2014-6-1下午10:58:16
* @params 任务
* @return void
* @useFor 从当前节点转向另一个节点
*/
public void oneActivity2Another(Task task, String flowName,
Map<String, Object> map, String userid) {
ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
.getDeployedProcessDefinition(task.getProcessDefinitionId());
// 获得当前执行实例从而得到当前运行节点ID
ExecutionEntity executionEntity = (ExecutionEntity) runtimeService
.createExecutionQuery().executionId(task.getExecutionId())
.singleResult();
String activitiId = executionEntity.getActivityId();
System.out.println("当前运行节点id值:" + activitiId);
List<ActivityImpl> activitiList = new ArrayList<ActivityImpl>();
// 所有流程节点信息
activitiList = processDefinition.getActivities();
// 获取当前流程执行节点
ActivityImpl srcActivity = findActivity(activitiList, activitiId);
ActivityImpl endActivity = null;
TransitionImpl transitionImpl = null;
// 获取当前节点所有执行路径
List<PvmTransition> pvmTransitionList = srcActivity
.getOutgoingTransitions();
for (PvmTransition pvmTransition : pvmTransitionList) {
// 强转为TransitionImpl
transitionImpl = (TransitionImpl) pvmTransition;
// 判断箭头指向名称是否相等
if (flowName.equals(transitionImpl.getProperty("name"))) {
endActivity = transitionImpl.getDestination();
}
}
List<PvmTransition> oriPvmTransitionList = new ArrayList<PvmTransition>();
oriPvmTransitionList.addAll(pvmTransitionList);
// 先清空其他Transition
pvmTransitionList.clear();
pvmTransitionList.add((PvmTransition) transitionImpl);
// 从一个节点执行到另一个节点
transitionImpl.setDestination(endActivity);
taskService.claim(task.getId(), userid);
// 执行任务
taskService.complete(task.getId(), map);
// 还原删除了的Transitions
pvmTransitionList.clear();
pvmTransitionList.addAll(oriPvmTransitionList);
}
/**
*
* @CreateUser:xxx
* @ReturnType:ActivityImpl
* @param activitiList
* @param activitiId
* @return
* @CreateDate:2014-6-1下午5:48:09
* @UseFor :根据节点id获得流程图的节点信息
*/
public ActivityImpl findActivity(List<ActivityImpl> activitiList,
String activitiId) {
for (ActivityImpl activityImpl : activitiList) {
String id = activityImpl.getId();
if (id.equals(activitiId)) {
return activityImpl;
}
}
return null;
}