activiti6升级activiti7流程审批陷入死循环

项目场景:

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));
    }

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值