项目场景:
activiti7审批,使用排他网关控制分支流转。
问题描述
问题流程如下:
审批通过:${purchaseauditi=='true'}
审批拒绝:${purchaseauditi=='false'}
问题复现:
首次提交=》采购经理审批拒绝=》调整后重新申请=》采购经理审批(此时点同意时,流程进入调整采购申请),未按预期执行。
多次测试发现,按上述描述操作流程后,采购经理审批关(点击拒绝 反而会进入同意的流程)
原因分析:
问题代码如下:关键代码
taskService.complete(taskId, variables);
public AjaxResult completeTask(@PathVariable("taskId") String taskId, @RequestBody(required=false) Map<String, Object> variables) {
SysUser user = getSysUser();
String username = user.getLoginName();
taskService.setAssignee(taskId, username);
// 查出流程实例id
String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();
if (variables == null) {
taskService.complete(taskId);
} else {
// 添加审批意见
if (variables.get("comment") != null) {
taskService.addComment(taskId, processInstanceId, (String) variables.get("comment"));
variables.remove("comment");
}
taskService.complete(taskId, variables);
}
return AjaxResult.success();
}
代码分析
taskService.complete(taskId, variables); 会将 variables中参数设置为全局变量,及流程全周期内存在 具体可在流程执行时查看表act_ru_variable (运行时流程变量数据表),关键字段 NAME_,TEXT_
解决方案:
taskService.complete(taskId, variables,true); 查看源码可发现如此设置会将变量设置成局部变量,即流程下一节点执行后,变量数据也就删除了。
public void complete(String taskId, Map<String, Object> variables, boolean localScope) {
this.commandExecutor.execute(new CompleteTaskCmd(taskId, variables, localScope));
}