基于Jeecg-boot的flowable流程支持拒绝同意流程操作

简介: 基于Jeecg-boot的flowable流程支持拒绝同意流程操作

更多功能看演示系统

gitee源代码地址

后端代码: https://gitee.com/nbacheng/nbcio-boot

前端代码:https://gitee.com/nbacheng/nbcio-vue.git

在线演示(包括H5) : http://122.227.135.243:9888

       因为看很多朋友需要这种同意拒绝的排它网关流程,所以这次先支持这种操作,但这个还不支持的第一个发起人后面的这种排它网关操作。

     1、增加下面一个接口,以便控制拒绝按钮是否可用

@ApiOperation(value = "获取下一节点的通用同意拒绝排它网关")
    @PostMapping(value = "/nextApprovedEG")
    public Result nextApprovedEG(@RequestParam(name="taskId",required=true) String taskId) {
        return Result.OK(flowTaskService.getNextApprovedExclusiveGateway(taskId));
    }

2、FlowTaskVo增加下面的一个参

@ApiModelProperty("下一个网关是否是同意拒绝通用网关")
    private boolean approved; //网关条件是${approved}或${!approved}

3、IFlowTaskService增加下面方法

/**
     * 获取下个节点信息,对排它网关的通用同意拒绝做特殊处理
     *  add by nbacheng
     *           
     * @param FlowTaskVo taskVo
     *           
     * @return
     */
    boolean getNextApprovedExclusiveGateway(String taskId);

4、FlowTaskServiceImpl增加下面方法

/**
   * 获取下个节点信息,目前只对排它网关的${approved}做特殊处理
   *  add by nbacheng
   *           
   * @param FlowTaskVo taskVo
   *           
   * @return
   */
    
  @Override
  public boolean getNextApprovedExclusiveGateway(String taskId) {
    //当前节点
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(task.getProcessDefinitionId()).singleResult();
        BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId());
        String key = task.getTaskDefinitionKey();
        FlowElement flowElement = bpmnModel.getFlowElement(key);
        //获取Task的出线信息--可以拥有多个
        List<SequenceFlow> outGoingFlows = null;
        if (flowElement instanceof UserTask) {
            outGoingFlows = ((UserTask) flowElement).getOutgoingFlows();
        }
        //遍历返回下一个节点信息,只考虑后面排它网关是${approved}参数
        for (SequenceFlow outgoingFlow : outGoingFlows) {
            //类型自己判断(获取下个节点是网关还是节点)
            FlowElement targetFlowElement = outgoingFlow.getTargetFlowElement();
            //下个是节点
           if(targetFlowElement instanceof ExclusiveGateway){// 
             boolean existApproved =  GetExclusiveGatewayExpression(targetFlowElement);//对表达式里有${approved}做特殊处理,就是对同意或拒绝(类似通过或不通过)
             if(existApproved) {
               return true;
             }
             break;
            }
        }
    return false;
        
  }
  
   /**
     * 获取排他网关分支名称、分支表达式是否存在${approved}
     * @param flowElement
     * @param 
     * add by nbacheng
     */
    private boolean GetExclusiveGatewayExpression(FlowElement flowElement) {
      // 获取所有网关分支
        List<SequenceFlow> targetFlows=((ExclusiveGateway)flowElement).getOutgoingFlows();
        // 循环每个网关分支
        for(SequenceFlow sequenceFlow : targetFlows){
            // 获取下一个网关和节点数据
            FlowElement targetFlowElement=sequenceFlow.getTargetFlowElement();
            // 网关数据不为空
            if (StringUtils.isNotBlank(sequenceFlow.getConditionExpression())) {
                // 获取网关判断条件
              String expression = sequenceFlow.getConditionExpression();
              if(expression.contains("${approved}")) {
                return true;
              }
            }
        }    
      return false;     
    }

5、taskFormComplete修改如下:

/**
     * 任务节点有表单的操作
     *
     * @param taskVo
     */
    private void taskFormComplete(FlowTaskVo taskVo) {
      Map<String , Object> approved = new HashMap<String , Object>();
      boolean existApprovedEG =  getNextApprovedExclusiveGateway(taskVo.getTaskId());//检测下个否是是判断同意拒绝网关,是要做特殊处理
      
      if(taskVo.getValues() !=null && taskVo.getValues().containsKey("taskformvalues")) {//有任务节点表单
        @SuppressWarnings("unchecked")
      Map<String , Object> taskformvalues = (Map<String, Object>) taskVo.getValues().get("taskformvalues");
        taskService.setVariableLocal(taskVo.getTaskId(), "taskformvalues", taskformvalues);
        taskService.complete(taskVo.getTaskId(),taskformvalues);//保存taskformvalues到变量表里
      }
      else if (existApprovedEG) {//是${approved}拒绝同意网关
        if (taskVo.isApproved()) {
          approved.put("approved", true);
        }
        else {
          approved.put("approved", false);
        }
        taskService.complete(taskVo.getTaskId(),approved);//保存approved到变量表里
      }
      else {
        taskService.complete(taskVo.getTaskId());
      }
    }

6、增加一个拒绝按钮

<el-button type="primary" @click="taskComplete">确 定</el-button>

7、增加一个按钮判断方法

//获取下一个通用拒绝同意排它网关
      getNextApprovedEG(taskId) {
        nextApprovedEG({taskId: taskId}).then(res => {
          if(res.success) {
            const data = res.result;
            console.log("getNextApprovedEG",data)
            this.bapproved = data;
          }
         
          
        });  
      },

8、taskComplete(approved)增加一个变量,以区分是同意还是拒绝。

9、演示图片如下:

 

相关文章
|
存储 XML Java
Flowable工作流-高级篇
Flowable工作流-高级篇
10287 1
|
移动开发 前端开发
基于Jeecg-boot的flowable流程支持拒绝同意流程操作(二)
基于Jeecg-boot的flowable流程支持拒绝同意流程操作(二)
650 0
|
XML 数据可视化 Java
|
移动开发 前端开发 Java
Flowable 任务监听器与执行监听器的介绍
Flowable 任务监听器与执行监听器的介绍
4503 1
|
XML 前端开发 Java
SpringBoot整合Flowable【04】- 通过代码控制流程流转
本文介绍了如何使用Flowable的Java API控制流程流转,基于前文构建的绩效流程模型。首先,通过Flowable-UI导出模型文件并部署到Spring Boot项目中。接着,详细讲解了如何通过代码部署、启动和审批流程,涉及`RepositoryService`、`RuntimeService`和`TaskService`等核心服务类的使用。最后,通过实际操作演示了流程从部署到完成的全过程,并简要说明了相关数据库表的变化。本文帮助读者初步掌握Flowable在实际业务中的应用,后续将深入探讨更多高级功能。
2676 0
SpringBoot整合Flowable【04】-  通过代码控制流程流转
|
存储 Java 数据安全/隐私保护
SpringBoot整合Flowable【03】- 通过Flowable-UI体验一个简单流程
本文介绍了如何使用Flowable 7.0以下版本的flowable-ui进行流程建模、发布和执行。首先,通过解压并启动flowable-ui war包,访问http://localhost:8080/flowable-ui/idm/#/login登录系统。接着,创建并绘制一个简单的绩效流程模型,包含开始节点、任务节点(自评、上级评、隔级评)和结束节点,并为各节点分配处理人。然后,创建应用并发布绩效流程。最后,通过创建a、b、c三个用户分别完成各节点任务,演示了整个流程的执行过程。本文旨在帮助读者理解Flowable的基本操作和流程元素,后续将介绍通过Java代码控制流程的方法。
5211 2
SpringBoot整合Flowable【03】- 通过Flowable-UI体验一个简单流程
|
JSON JavaScript 前端开发
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
1976 0
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
|
消息中间件 存储 监控
深度写作:深入源码理解MQ长轮询优化机制
【11月更文挑战第22天】在分布式系统中,消息队列(Message Queue, MQ)扮演着至关重要的角色。MQ不仅实现了应用间的解耦,还提供了异步消息处理、流量削峰等功能。而在MQ的众多特性中,长轮询(Long Polling)机制因其能有效提升消息处理的实时性和效率,备受关注。
759 12
|
网络协议 算法 数据库
OSPF协议详解:工作原理与实现机制
OSPF协议详解:工作原理与实现机制
1994 0

热门文章

最新文章