基于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、演示图片如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/28942.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

easyui01(基本布局)

一.概述 1.What&#xff1f; jQuery EasyUI是一组基于jQuery的UI插件集合体&#xff0c;能帮助web开发者更轻松的打造出功能丰富并且美观的UI界面 2.Why&#xff1f; ①.使用easyui 不需要写很多代码&#xff0c;只需要编写一些简单 HTML 标记&#xff0c;就可以定义用户界…

使用docker部署ELK实战

目录 什么是ELKELK简介ElasticsearchLogstashKibana docker安装ELK安装es安装 Kibana安装logstash 什么是ELK ELK是一个开源的数据分析平台&#xff0c;由三个开源项目Elasticsearch、Logstash和Kibana组成&#xff0c;因此被称为ELK Stack。ELK Stack主要用于处理和分析大量的…

pytorch实现图像分类器

pytorch实现图像分类器 一、定义LeNet网络模型1&#xff0c;卷积 Conv2d2&#xff0c;池化 MaxPool2d3&#xff0c;Tensor的展平&#xff1a;view()4&#xff0c;全连接 Linear5&#xff0c;代码&#xff1a;定义 LeNet 网络模型 二、训练并保存网络参数1&#xff0c;数据预处理…

Exception in thread “main“ java.lang.UnsupportedClassVersionError 50报错处理

之间正常走jenkinsdocker自动化部署的项目&#xff0c;今天改了一个文件&#xff0c;点了一下&#xff0c;竟然没有部署上去&#xff0c;提示如上&#xff0c;如下 Exception in thread "main" java.lang.UnsupportedClassVersionError: com/coocaa/tsp/sys/user/Use…

采用UWB定位技术开发的室内定位系统源码

UWB精准定位系统源码 UWB是什么&#xff1f; UWB(Ultra Wideband)超宽带技术是一种全新的、与传统通信技术有极大差异的通信新技术。它不需要使用传统通信体制中的载波&#xff0c;而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据&#xff0c;实现精准定位。 技术…

机器鸟实现摆动尾巴功能

1. 功能说明 本文示例将实现R329样机机器鸟摆动尾巴的功能。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09;‍ 扩展板 Bigfish2.1扩展板‍ 电池7.4V锂电池 电路连接…

【头歌-Python】9.1 X射线衍射曲线绘制(project)第1~2关

第1关&#xff1a;X 射线衍射曲线 任务描述 本关任务&#xff1a;读文件中的数据绘制线图形。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.python 读取文件 2.使用 matplotlib 绘制图形 python 读取文件 python读取文件可以用以下函数实现&#xff1…

chatgpt赋能python:Python收费介绍

Python收费介绍 什么是Python? Python是一种高级的、解释性、面向对象、纯粹的动态语言&#xff0c;多用于快速应用程序开发、脚本编写、系统管理任务等。它有一个简单直观优美的语法&#xff0c;非常容易学习。 Python的收费形式 Python语言本身是免费的&#xff0c;任何…

如何使用Jmeter进行http接口测试?

目录 前言&#xff1a; 一、开发接口测试案例的整体方案&#xff1a; 二、接口自动化适用场景&#xff1a; 三、接口测试环境准备 四、创建工程&#xff1a; 总结&#xff1a; 前言&#xff1a; 本文主要针对http接口进行测试&#xff0c;使用Jmeter工具实现。 Jmter工具设…

1.2 Scala变量与数据类型

一、变量声明 (一&#xff09;、利用val声明变量 案例演示 &#xff08;二&#xff09;利用var声明变量 案例演示 &#xff08;三&#xff09;换行输入语句&#xff08;续行&#xff09; &#xff08;四&#xff09;同时声明多个变量 Scala还可以将多个变量放在一起…

射频电路layout总结

射频电路板设计由于在理论上还有很多不确定性&#xff0c;因此常被形容为一种“黑色艺术”&#xff0c;但这个观点只有部分正确&#xff0c;RF电路板设计也有许多可以遵循的准则和不应该被忽视的法则。在实际设计时&#xff0c;真正实用的技巧是当这些准则和法则因各种设计约束…

RTU遥测终端机的应用场景有哪些?

遥测终端机又称智能RTU遥测终端机&#xff0c;是一种用于采集、传输和处理遥测数据的设备。在现代科技的发展中&#xff0c;遥测终端机扮演着重要的角色。它是一种能够实现远程监测和控制的关键设备&#xff0c;广泛应用于各个领域&#xff0c;包括水文水利、环境监测、工业自动…

创新案例|专注在线 协作平台 设计产品中国首家PLG独角兽企业蓝湖如何实现98%的头部企业渗透率

蓝湖起步于2015年&#xff0c;是一款服务于产品经理、设计师、工程师的产品设计研发在线协作工具&#xff0c; 2021年10月&#xff0c;蓝湖宣布完成C轮融资&#xff0c;融资额高达10亿人民币&#xff0c;称为中国2B市场中首家采用PLG发展的独角兽企业&#xff0c;并实现了从100…

Web 自动化测试Selenium 之PO 模型

目录 1. po 模型介绍 2. PageObject 设计模式 3. PO 的核心要素 4. 非PO 实现 5. PO 实现 6. 总结 7. PO 模式的特点 总结&#xff1a; 1. po 模型介绍 在自动化中&#xff0c;Selenium 自动化测试中有一个名字经常被提及 PageObject (思想与面向对象的特征相同)&#x…

MySQL数据库高级操作

目录 MySQL中6种常见的约束克隆表清空表的数据记录临时表创建外键约束&#xff0c;保证数据的完整性和一致性。 MySQL中6种常见的约束 主键约束&#xff08;primary key&#xff09;外键约束&#xff08;foreign key&#xff09;非空约束&#xff08;not null&#xff09;唯一…

安卓端Google隐私沙盒归因报告聚焦

自2022年2月Google首次提出将推出隐私沙盒至今已一年有余。现在&#xff0c;安卓端的隐私沙盒Beta测试已针对特定Android13设备正式开始。作为早期测试者&#xff0c;Adjust很高兴与 Google一同迈出增强用户隐私的第一步&#xff0c;并在接下来的旅程中继续携手同行。为帮助移动…

opencv初学记录

准备工作&#xff1a; 1.找一张图片 2.准备python运行环境&#xff0c;并导入库&#xff0c;pip install opencv-python 读取文件&#xff0c;并打印维度 import cv2 #为什么是cv2不是cv呢&#xff0c;这个2指的是c的api&#xff0c;是为了兼容老板&#xff0c;cv指的就是c&am…

今天面了一个来字节要求月薪23K,明显感觉他背了很多面试题...

最近有朋友去字节面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

ChatGPT/InstructGPT详解

前言 GPT系列是OpenAI的一系列预训练文章&#xff0c;GPT的全称是Generative Pre-Trained Transformer&#xff0c;顾名思义&#xff0c;GPT的目的就是通过Transformer为基础模型&#xff0c;使用预训练技术得到通用的文本模型。目前已经公布论文的有文本预训练GPT-1&#xff…

【操作系统】计算机操作系统知识点总结

文章目录 前言一、操作系统的概念与发展二、操作系统的结构与功能1、操作系统的结构2、操作系统的功能 三、进程管理1、进程2、进程的创建3、进程管理的实现4、进程控制块 四、内存管理1、内存2、内存管理3、内存管理的实现 五、文件系统1、文件系统2、文件系统的主要任务3、文…