最近接到一个用户需求:
要求在流程部署完成后可通过手动配置各用户任务的处理候选组,来控制流程走向。
解决此需求要解决以下问题:
1,流程部署完成后,尚未有流程实例,如何获取所有用户任务?
2,设置完各节点的处理候选组后,如何动态分配?
第二个问题好解决,通过设置任务监听器,来获取当前的用户任务KEY,从配置表中获取处理组进行设置。
下面来解决第一个问题,代码如下:
@Override
public List<ProcessTaskVO> findProcessUserTaskByPdId(String processDefinitionId){
List<ProcessTaskVO> processTasks = new ArrayList<ProcessTaskVO>();
if(StringUtils.isEmpty(processDefinitionId)){
return processTasks;
}
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
if(pd == null){
return processTasks;
}else{
return findProcessUserTaskByPd(pd);
}
}
private List<ProcessTaskVO> findProcessUserTaskByPd(ProcessDefinition pd){
List<ProcessTaskVO> processTasks = new ArrayList<ProcessTaskVO>();
ProcessTaskVO processTask = null;
String resName = pd.getResourceName();
InputStream resouceStream =repositoryService.getResourceAsStream(pd.getDeploymentId(), resName);
XMLInputFactory xif = XMLInputFactory.newInstance();
InputStreamReader in;
XMLStreamReader xtr;
try {
in = new InputStreamReader(resouceStream, "UTF-8");
xtr = xif.createXMLStreamReader(in);
BpmnModel model = new BpmnXMLConverter().convertToBpmnModel(xtr);
Collection<FlowElement> flowElements = model.getMainProcess().getFlowElements();
for(FlowElement e : flowElements) {
String clazz = e.getClass().toString();
if(clazz.endsWith("UserTask")){
processTask = new ProcessTaskVO();
processTask.setTaskKey(e.getId());
processTask.setTaskName(e.getName());
processTasks.add(processTask);
}
}
} catch (XMLStreamException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return processTasks;
}编码过程中的问题:
在使用任务监听器过程中,发现监听器中无法自动注入自己service,解决方法:
1,确保包扫描能够扫描到任务监听器
<!-- 扫描所有监听 --> <context:component-scan base-package="com.xxxx.**.listener" />
2,配置任务监听器
其中${applyTaskListener},为任务监听器的bean名称
3,任务监听器写法:
@Service("applyTaskListener")
public class ApplyTaskListener implements TaskListener{
/**
*
*/
private static final long serialVersionUID = -7394227383264070902L;
/**
* 用户查询流程用户任务的处理组的service
*/
@Autowired
private IProcessTaskRoleService processTaskRoleService;
@Override
public void notify(DelegateTask delegateTask) {
String taskKey = delegateTask.getTaskDefinitionKey();
String processDefinitionId = delegateTask.getProcessDefinitionId();
/**
* 此变量含有流程发起人信息
*/
Map<String,Object> variables = delegateTask.getVariables();
ProcessTaskRoleVO processTaskRole = processTaskRoleService.findByTaskKeyAndPdId(taskKey, processDefinitionId);
//如未进行配置则处理人为流程发起人
if(processTaskRole == null){
delegateTask.setAssignee(variables.get("流程发起人在变量MAP中的key").toString());
}else{
RoleVO role = processTaskRole.getRole();
if(role == null){
//如配置的角色不存在则处理人为流程发起人
delegateTask.setAssignee(variables.get("流程发起人在变量MAP中的key").toString());
}else{
delegateTask.addCandidateGroup(role.getId().toString());
}
}
}
}本文出自 “蓝色幽默” 博客,请务必保留此出处http://bluehumor.blog.51cto.com/2148378/1956007
原文地址:http://bluehumor.blog.51cto.com/2148378/1956007