最近接到一个用户需求:
要求在流程部署完成后可通过手动配置各用户任务的处理候选组,来控制流程走向。
解决此需求要解决以下问题:
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;
}
由以上代码可以获取到所有的用户任务,剩下的就是把这些信息存到数据库中,然后写一个配置页面,配置用户任务的处理组是什么就OK了。
下面是ProcessTaskVO
public class ProcessTaskVO extends BaseVO {
/**
*
*/
private static final long serialVersionUID = 940722257892628250L;
//流程实例ID
private String processInsId;
private String processDefinitionId;
//任务名称
private String taskName;
//任务key
private String taskKey;
//任务ID
private String taskId;
private UserVO handleUser;
//认领时间
private Date claimTime;
private Date startTime;
private Date endTime;
private Map<String, Object> processVariables;
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public String getTaskKey() {
return taskKey;
}
public void setTaskKey(String taskKey) {
this.taskKey = taskKey;
}
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public String getProcessInsId() {
return processInsId;
}
public void setProcessInsId(String processInsId) {
this.processInsId = processInsId;
}
public Date getClaimTime() {
return claimTime;
}
public void setClaimTime(Date claimTime) {
this.claimTime = claimTime;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public Map<String, Object> getProcessVariables() {
return processVariables;
}
public void setProcessVariables(Map<String, Object> processVariables) {
this.processVariables = processVariables;
}
public String getProcessDefinitionId() {
return processDefinitionId;
}
public void setProcessDefinitionId(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
}
public UserVO getHandleUser() {
return handleUser;
}
public void setHandleUser(UserVO handleUser) {
this.handleUser = handleUser;
}
}
下面是用户任务与处理组的对应关系表:
CREATE TABLE `xxx_process_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`task_key` varchar(255) DEFAULT NULL COMMENT '用户任务业务主键',
`task_name` varchar(255) DEFAULT NULL COMMENT '用户任务名称',
`timeout` int(11) DEFAULT NULL COMMENT '此任务的超时时间',
`role_id` int(11) DEFAULT NULL COMMENT '此任务所分配的角色ID',
`processdefinition_id` varchar(255) DEFAULT NULL COMMENT '流程定义ID',
`create_date` date DEFAULT NULL COMMENT '创建时间',
`create_user` varchar(50) DEFAULT NULL COMMENT '创建人',
`update_date` date DEFAULT NULL COMMENT '更新时间',
`update_user` varchar(50) DEFAULT NULL COMMENT '更新人',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
编码过程中的问题:
在使用任务监听器过程中,发现监听器中无法自动注入自己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());
}
}
}
}
转载于:https://blog.51cto.com/bluehumor/1956007