基于jeecg-boot的flowable流程自定义业务退回撤回或驳回到发起人后的再次流程提交

news2024/11/29 0:50:28

更多nbcio-boot功能请看演示系统

gitee源代码地址

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

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

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

     主要用户有些需求,需要自定义业务退回或撤回或驳回到发起人后能再次进行流程的提交,所以今天就解决这个问题。

    1、前端

      前端主要提供一个可以让用户进行选择再次提交的方法,同时检测是否是退回或撤回或驳回到发起人的节点

  

<style lang="less">
</style>
<template>
    <span>
      <a-button :type="btnType" @click="applySubmit()">{{text}}</a-button>
      <a-modal :z-index="100" :title="firstInitiatorTitle" @cancel="firstInitiatorOpen = false" :visible.sync="firstInitiatorOpen"
        :width="'50%'" append-to-body>
         <a-descriptions bordered layout="vertical">
           <a-descriptions-item :span="3">
                 <a-badge status="processing" text="选择提醒" />
            </a-descriptions-item>
            <a-descriptions-item label="重新发起新流程按钮" labelStyle="{ color: '#fff', fontWeight: 'bold', fontSize='18px'}"> 
              重新发起新流程会删除之前发起的任务,重新开始.
            </a-descriptions-item>
            <a-descriptions-item label="继续发起老流程按钮"> 
              继续发起流程就在原来流程基础上继续流转.
            </a-descriptions-item>
         </a-descriptions>   
        <span slot="footer" class="dialog-footer">
          <el-button type="primary" @click="StartByDataId(true)">重新发起新流程</el-button>
          <el-button type="primary" @click="StartByDataId(false)">继续发起老流程</el-button>
          <el-button @click="firstInitiatorOpen = false">取 消</el-button>
        </span>
      </a-modal>
    </span>
</template>

<script>
  import {
    definitionStartByDataId,
    isFirstInitiator,
    deleteActivityAndJoin
  } from "@views/flowable/api/definition";

  export default {
    name: 'ActApplyBtn',
    components: {},
    props: {
      btnType: {
        type: String,
        default: 'link',
        required: false
      },
      /**/
      dataId: {
        type: String,
        default: '',
        required: true
      },
      serviceName: {
        type: String,
        default: '',
        required: true
      },
      variables: {
        type: Object,
        default: {},
      },
      text: {
        type: String,
        default: '提交申请',
        required: false
      }

    },
    data() {
      return {
        modalVisible: false,
        submitLoading: false,
        form: {},
        firstInitiatorOpen: false,
        firstInitiatorTitle: '',
      };
    },
    created() {},
    watch: {},
    methods: {
      StartByDataId(isNewFlow) {
          if(isNewFlow) {
            this.submitLoading = true;
            deleteActivityAndJoin(this.dataId,this.variables)
            .then(res => {
              if (res.success && res.result) { //若删除成功
                var params = Object.assign({
                  dataId: this.dataId
                }, this.variables);
                definitionStartByDataId(this.dataId, this.serviceName, params)
                  .then(res => {
                    if (res.success) {
                      this.firstInitiatorOpen = false;
                      this.$message.success(res.message);
                      this.$emit('success');
                    } else {
                      this.$message.error(res.message);
                    }
                  })
              }
            })
            .finally(() => (this.submitLoading = false));
          }     
          else {//继续原有流程流转,跳到流程处理界面上
            console.log("this.variables",this.variables);
            this.$router.push({ path: '/flowable/task/record/index',
              query: {
                procInsId: this.variables.processInstanceId,
                deployId: this.variables.deployId,
                taskId: this.variables.taskId,
                businessKey: this.dataId,
                nodeType: "",
                category: "zdyyw",
                finished: true
              }})
          }
      },
      applySubmit() {
        if (this.dataId && this.dataId.length < 1) {
          this.error = '必须传入参数dataId';
          this.$message.error(this.error);
          return;
        }
        if (this.serviceName && this.serviceName.length < 1) {
          this.error = '必须传入参数serviceName';
          this.$message.error(this.error);
          return;
        } else {
          this.error = '';
        }
        //对于自定义业务,判断是否是驳回或退回的第一个发起人节点
        this.submitLoading = true;
        isFirstInitiator(this.dataId, this.variables)
          .then(res => {
            if (res.success && res.result) { //若是,弹出窗口选择重新发起新流程还是继续老流程
              this.firstInitiatorTitle = "根据自己需要进行选择"
              this.firstInitiatorOpen = true;
            }
            else {
              this.submitLoading = true;
              var params = Object.assign({
                dataId: this.dataId
              }, this.variables);
              definitionStartByDataId(this.dataId, this.serviceName, params)
                .then(res => {
                  if (res.success) {
                    this.$message.success(res.message);
                    this.$emit('success');
                  } else {
                    this.$message.error(res.message);
                  }
                })
                .finally(() => (this.submitLoading = false));
            }
          })
          .finally(() => (this.submitLoading = false));
      }
    }

  };
</script>

效果如下:

2、后端代码

   

 /**
    * 判断当前节点是否是第一个发起人节点(目前只针对自定义业务的驳回、撤回和退回操作)
    *
    * @param processInstanceId, actStatusType
    */
    @Override
	public boolean isFirstInitiator(String processInstanceId, String actStatusType) {
    	
    	if(StringUtils.equalsAnyIgnoreCase(actStatusType, ActStatus.reject) ||
    	    	   StringUtils.equalsAnyIgnoreCase(actStatusType, ActStatus.recall) ||
    	    	   StringUtils.equalsAnyIgnoreCase(actStatusType, ActStatus.retrun) ) {
    		if(StringUtils.isNotEmpty(processInstanceId)) {
    		    //  获取当前任务
                Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
	    		BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
		        //  获取当前活动节点
		        FlowNode currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(task.getTaskDefinitionKey());
		        // 输入连线
		        List<SequenceFlow> inFlows = currentFlowNode.getIncomingFlows();
		        for (SequenceFlow sequenceFlow : inFlows) {
		        	FlowElement sourceFlowElement = sequenceFlow.getSourceFlowElement();
		        	// 如果上个节点为开始节点
		            if (sourceFlowElement instanceof StartEvent) {
		            	log.info("当前节点为发起人节点,上个节点为开始节点:id=" + sourceFlowElement.getId() + ",name=" + sourceFlowElement.getName());
		                return true;
		            }
		        }
    		}
    	}
		return false;	
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神仙级python入门教程(非常详细),从0到精通,从看这篇开始!

毫无疑问&#xff0c;Python 是当下最火的编程语言之一。对于许多未曾涉足计算机编程的领域「小白」来说&#xff0c;深入地掌握 Python 看似是一件十分困难的事。其实&#xff0c;只要掌握了科学的学习方法并制定了合理的学习计划&#xff0c;Python 从 入门到精通只需要一个月…

骨传导和入耳式哪个危害大一点?入耳式和骨传导哪种好?

骨传导和入耳式这两种耳机虽然都存在一定的危害&#xff0c;但是入耳式耳机对人体的危害要更大一点。 入耳式耳机直接塞进耳朵这种佩戴方式&#xff0c;会阻塞外部声音的进入&#xff0c;长时间使用可能会导致耳道感染&#xff0c;还可能对听力造成损伤&#xff0c;而骨传导耳…

RecyclerView源码解析(二):结合LinearLayout分析绘制流程

RecyclerView源码解析&#xff08;二&#xff09;:结合LinearLayout分析绘制流程 封面&#xff1a; 导言 上篇文章中主要已经介绍了RecyclerView的View的三大工作流程&#xff08;onMeasure&#xff0c;onLayout&#xff0c;onDraw&#xff09;&#xff0c;实际上看了上篇文章…

数学思维导图怎么绘制?这个详细绘制方法了解一下

数学思维导图怎么绘制&#xff1f;数学思维导图是数学学习中的一种重要辅助工具。在复杂的数学问题中&#xff0c;思维导图可以帮助学生更好地理解和组织各个知识点&#xff0c;从而更好地解决问题。在绘制数学思维导图时&#xff0c;有很多工具可供选择&#xff0c;下面就给大…

港陆证券:政策累积效应催生A股普涨行情 北证50指数创最大单日涨幅

周一&#xff0c;在活泼资本商场政策继续推出、不断累积的布景下&#xff0c;A股商场迎来久别的普涨行情。金融、白酒与资源类板块集体发力&#xff0c;带动沪深主板指数高开高走。北交所商场体现更为亮眼&#xff0c;北证50指数收盘大涨5.92%&#xff0c;创该指数前史最大单日…

CSS中图片旋转超出父元素解决办法

下面的两种解决办法都会导致图片缩小&#xff0c;可以给图片进行初始化的宽高设置 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">…

NIO原理浅析(三)

epoll 首先认识一下epoll的几个基础函数 int s socket(AF_INET, SOCK_STREAM, 0); bind(s, ...); listen(s, ...);int epfd epoll_create(...) epoll_ctl(epfd, ...); //将所有需要监听的socket添加到epfd中while(1) {int n epoll_wait(...);for(接受到数据的socket) {//处…

el-table 垂直表头

效果如下&#xff1a; 代码如下&#xff1a; <template><div class"vertical_head"><el-table style"width: 100%" :data"getTblData" :show-header"false"><el-table-columnv-for"(item, index) in getHe…

【javascript】禁止浏览器调试前端页面

目录 为啥要禁止&#xff1f;无限 debugger基础禁止调试解决对策 为啥要禁止&#xff1f; 由于前端页面会调用很多接口&#xff0c;有些接口会被别人爬虫分析&#xff0c;破解后获取数据&#xff0c;为了杜绝这种情况&#xff0c;最简单的方法就是禁止人家调试自己的前端代码 …

成都瀚网科技有限公司:抖店怎么开通直播?

随着互联网和移动支付的快速发展&#xff0c;越来越多的人选择开设自己的抖音商店。抖音作为国内最受欢迎的短视频平台之一&#xff0c;拥有庞大的用户基础&#xff0c;成为众多创业者青睐的平台。那么&#xff0c;如何经营自己的抖音店铺呢&#xff1f;下面将从几个方面为您介…

C# 中什么是重写(子类改写父类方法)

方法重写是指在继承关系中&#xff0c;子类重新实现父类或基类的某个方法。这种方法允许子类根据需要修改或扩展父类或基类的方法功能。在面向对象编程中&#xff0c;方法重写是一种多态的表现形式&#xff0c;它使得子类可以根据不同的需求和场景提供不同的方法实现。 方法重…

设计实现QSPI Flash的下载算法

mm32-2nd-bootloader技术白皮书&#xff08;3&#xff09;——设计实现QSPI Flash的下载算法 mm32-2nd-bootloader技术白皮书&#xff08;3&#xff09;——设计实现QSPI Flash的下载算法 | MCU加油站 cathy 发布于&#xff1a;周一, 03/20/2023 - 15:29 &#xff0c;关键词&a…

变压器智能在线监测

变压器智能在线监测是一种先进的变压器状态监测方式&#xff0c;采用了先进的技术手段&#xff0c;能够对变压器运行状态进行实时、在线、自动的监测和分析。可以在变压器运行过程中&#xff0c;对其电压、电流、温度、局放等参数进行实时监测&#xff0c;及时发现异常情况并进…

为何跨境界如此看重黑色星期五?这一点是关键

黑色星期五通常会利用折扣和独一无二的优惠为电子商务商店带来大量新客户。黑色星期五可能会给您的在线商店带来丰厚的利润&#xff0c;如果无法留住这些客户&#xff0c;您就会损失巨大。通过对电子商务客户服务策略进行一些调整&#xff0c;您可以将这些黑色星期五客户转变为…

2023最新多功能XL软件库APP源码+PHP后端系统源码/功能强大/软件库自带后台管理系统

2023最新多功能XL软件库APP源码PHP后端系统源码/功能强大/软件库自带后台管理系统31xl软件库最新可以正常使用版: https://url11.ctfile.com/d/25976711-57801726-b66bb0?p6724 &#xff08;访问密码&#xff1a;6724&#xff09; 多功能软件库&#xff0c;支持自定义对接易支…

LiveGBS流媒体平台GB/T28181功能-支持数据库切换为高斯数据库信创瀚高数据信创数据库

LiveGBS流媒体平台GB/T28181功能-支持数据库切换为高斯数据库信创瀚高数据信创数据库 1、如何配置切换高斯数据库&#xff1f;2、如何配置切换信创瀚高数据库&#xff1f;3、搭建GB28181视频直播平台 1、如何配置切换高斯数据库&#xff1f; livecms.ini -> [db]下面添加配…

JavaScript - 好玩的打字动画

效果预览&#xff1a; &#x1f680;HTML版本 <!DOCTYPE html> <html> <head><title>打字动画示例</title><style>.typewriter {color: #000;overflow: hidden; /* 隐藏溢出的文本 */white-space: nowrap; /* 不换行 */border-right: .…

macOS通过钥匙串访问找回WiFi密码的详细教程

如果您忘记了Mac电脑上的WiFi密码&#xff0c;可以通过钥匙串访问来找回它。具体步骤如下&#xff1a; 1.打开Mac电脑的“启动台”&#xff0c;然后在其他文件中找到“钥匙串访问”。 2.运行“钥匙串访问”应用程序&#xff0c;点击左侧的“系统”&#xff0c;然后在右侧找到…

FT232RL国产替代芯片GP232RL无需软硬件修改资料

GP232RL是最新加入 ftdi 系列 usb 接口集成电路设备的设备。 GP232RL是一个 usb 到串行 uart 接口&#xff0c;带有可选的时钟发生器输出&#xff0c;以及新的 ftdichip-idTM 安全加密器特性。此外&#xff0c;还提供了异步和同步位崩接口模式。 通过将外部 eeprom、时钟电路和…

Android Studio更新新版本后无法创建flutter项目

最新更新了AndroidStudio版本&#xff0c;发现无法创建flutter项目。 dart和flutter插件确认都已安装&#xff0c;该有的环境配置都已配置。 最后与同事的插件作比较发现是Android APK Support这个插件没勾选。 勾选后&#xff0c;点击右下角的apply&#xff0c;重启AndroidS…