基于jeecgboot的flowable流程支持定时边界事件

news2025/4/17 23:11:48

Flowable事件

  事件(event)通常用于为流程生命周期中发生的事情建模。事件总是图形化为圆圈。在BPMN 2.0中,有两种主要的事件分类:*捕获(catching)抛出(throwing)*事件。

  • 捕获: 当流程执行到达这个事件时,会等待直到触发器动作。触发器的类型由其中的图标,或者说XML中的类型声明而定义。捕获事件与抛出事件显示上的区别,是其内部的图标没有填充(即是白色的)。
  • 抛出: 当流程执行到达这个事件时,会触发一个触发器。触发器的类型,由其中的图标,或者说XML中的类型声明而定义。抛出事件与捕获事件显示上的区别,是其内部的图标填充为黑色。

  定时触发的相关事件,包括定时器启动事件,定时器捕获中间件事件,定时器边界事件

      这次只涉及到定时器边界事件处理,其它 定时器启动事件,定时器捕获中间件事件等以后有空的时候再处理。

      因为目前对于定时边界事件流程设计器没有相关的属性配置与实现,所以主要是要实现这样的功能。

    1、增加边界事件处理文件BoundaryEvent.vue

     代码如下:

      主要实现对于定时边界事件的属性增加

<template>
  <div class="panel-tab__content">
    <!--目前只处理定时边界事件 -->
    <el-form size="mini" label-width="90px" @submit.native.prevent v-if="this.businessObject.eventDefinitions[0].$type.indexOf('TimerEventDefinition') !== -1">
      <el-form-item label="事件类型">
        <el-select v-model="timeDefinitionType" @change="changeTimerType">
          <!--bpmn:TimerEventDefinition-->
          <el-option label="指定时间" value="timeDate" />
          <el-option label="持续时间" value="timeDuration" />
          <el-option label="周期执行" value="timeCycle" />
        </el-select>
      </el-form-item>
      <template v-if="timeDefinitionType != ''">
        <el-form-item label="时间设置" required>
            <el-tooltip>
              <div slot="content">
                事件类型配置说明<br>
                1.指定时间(timeDate):触发事件的时间,如:2022-12-16T11:12:16 <br>
                2.持续时间(timeDuration):指定时器之前需等待多长时间,使用ISO 8601规定的格式<br>
                 (由BPMN 2.0规定),如PT5M(等待5分钟),也支持表达式${duration},<br>
                 这样你就可以通过流程变量来影响定时器定义<br>
                3.周期执行(timeCycle):指定重复执行的间隔,可以用来定期启动流程实例,<br>
                或为超时时间发送多个提醒。timeCycle元素可以使用两种格式。<br>
                第一种是 ISO 8601 标准的格式。示例值(R3/PT5M)(重复3次,<br>
                每次间隔5分钟),或也可以用cron表达式指定timeCycle,如从整点开始,<br>
                每10分钟执行一次(0 0/10 * * * ?)<br>
              </div>
              <el-input size="mini" type="string" v-model="FormalExpression" @change="updateTimeValue"></el-input>
            </el-tooltip>
        </el-form-item>
      </template>
    </el-form>
  </div>
</template>

<script>
export default {
  name: "BoundaryEvent",
  props: {
    businessObject: Object,
    type: String
  },
  inject: {
    prefix: "prefix"
  },
  data() {
    return {
      timeDefinitionType: "",
      FormalExpression:'',
    }; 
  },
  watch: {
    businessObject: {
      immediate: true,
      handler(val) {
        this.bpmnElement = window.bpmnInstances.bpmnElement;
        this.getElementLoop(val);
      }
    }
  },
  methods: {
    getElementLoop(businessObject) {//获取定时边界事件原有值
      console.log("getElementLoop businessObject=",businessObject)
      console.log("window.bpmnInstances.bpmnElement.businessObject=",window.bpmnInstances.bpmnElement.businessObject);
      if(businessObject.hasOwnProperty('eventDefinitions') && businessObject.eventDefinitions.length>0){
        if(businessObject.eventDefinitions[0].$type == 'bpmn:TimerEventDefinition') {
          if(businessObject.eventDefinitions[0].hasOwnProperty('timeDuration')) {
            this.timeDefinitionType = "timeDuration"
            this.FormalExpression = businessObject.eventDefinitions[0].timeDuration.body
          }
          else if(businessObject.eventDefinitions[0].hasOwnProperty('timeDate')) {
            this.timeDefinitionType = "timeDate"
            this.FormalExpression = businessObject.eventDefinitions[0].timeDate.body
          }
          else if(businessObject.eventDefinitions[0].hasOwnProperty('timeCycle')) {
            this.timeDefinitionType = "timeCycle"
            this.FormalExpression = businessObject.eventDefinitions[0].timeCycle.body
            
          }
        }
      }
    },
    changeTimerType(type) {
      this.timeDefinitionType = type
    },
    //
    updateTimeValue(value) {
      console.log("updateTimeValue value=",value);
      this.updateTime(this.timeDefinitionType,value);
      console.log("updateTimeValue this.bpmnElement=",this.bpmnElement);
    },
    //时间事件定义类型修改
    updateTime(type,value){
      //获取节点的子节点 timerEventDefinition
      console.log("updatetime type=",type)
      let timerEventDef = this.bpmnElement.businessObject.eventDefinitions[0]
      const timeCycle = window.bpmnInstances.moddle.create("bpmn:FormalExpression", { body:value });
      const timeDate = window.bpmnInstances.moddle.create("bpmn:FormalExpression", { body:value });
      const timeDuration = window.bpmnInstances.moddle.create("bpmn:FormalExpression", { body:value });
      if (type == 'timeCycle') {
        window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement,timerEventDef,{timeDate:null})
        window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement,timerEventDef,{timeDuration:null})
        window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement,timerEventDef,{timeCycle })
      }
      else if (type == 'timeDate') {
        window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement,timerEventDef,{timeCycle:null})
        window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement,timerEventDef,{timeDuration:null})
        window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement,timerEventDef,{ timeDate })
      }
      else if (type == 'timeDuration') {
        window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement,timerEventDef,{timeDate:null})
        window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement,timerEventDef,{timeCycle:null})
        window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement,timerEventDef,{ timeDuration })
      }  
      
    },
    beforeDestroy() {
      this.bpmnElement = null;
    },
  }  
};
</script>

2、效果如下:

3、主要后端数据库act_ru_timer_job表里会增加相应的数据,同时处理好后会自动删除相应的记录。

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

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

相关文章

【Linux】——权限理解

目录 1.Linux权限的概念 Linux权限管理 1.文件访问者的分类&#xff08;人的属性&#xff09; 2.文件类型和访问权限&#xff08;事物属性&#xff09; 2.1文件类型 2.2基本权限 2.3文件权限值的表示方法 2.4文件访问权限的相关设置方法 file指令 目录的权限 默认权限…

2000-2019年省级农业绿色全要素生产率原始测算数据和结果数据

2000-2019年省级农业绿色全要素生产率原始测算数据和结果数据 1、时间&#xff1a;2000-2019年 2、范围&#xff1a;包括30个省份 3、方法&#xff1a;使用的方法为SBM-GML指数、SBM-BML指数、SBM-ML指数和全局SBM&#xff08;静态&#xff09;。 同时&#xff0c;还提供了…

抗反射蛾眼结构的严格分析与设计

摘要 对于许多光学应用来说需要减少表面反射。控制表面反射的一种非常有效的方法是使用抗反射的纳米或微米结构&#xff0c;启发来源于自然界&#xff08;蛾眼&#xff09;。这些具有亚波长范围特征尺寸的结构表现出关于波长和角度依赖性的独特性质。在本文中&#xff0c;介绍了…

SSM校园报修系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 1、学生功能&#xff1a; (1)学生登录&#xff1a;学生通过管理员下发的初始账号和密码&#xff0c;可以登录系统进行申…

git diff 命令6种使用场景

目录 一、背景&目标 二、git三个区了解 三、git diff 6种场景介绍 3.1 工作区和暂存区差异对比 3.2 工作区和版本库之间差异 3.3 暂存区和版本库之间差异对比 3.4 本地版本库之间提交记录对比 3.5 不同分支对比 3.6 不同分支下同一文件对比 四、git diff 中 -x1,y…

非零基础自学Golang 第12章 接口与类型 12.3 接口嵌入

非零基础自学Golang 文章目录非零基础自学Golang第12章 接口与类型12.3 接口嵌入第12章 接口与类型 12.3 接口嵌入 接口嵌入&#xff0c;也叫接口组合&#xff0c;在其他语言中&#xff0c;这种接口的组合叫作继承&#xff1b;Go语言舍弃了繁杂的继承体系&#xff0c;但继承这…

48页智慧城市大数据可视化平台建设方案

目 录 1. 概述 1.1 需求分析 1.2 采取策略 1.3 方案目标 2. 智慧城市解决方案 2.1 架构说明 2.1.1 整体架构 2.1.2 规划架构 2.1.3 云平台架构 2.2 建设内容 2.2.1 云计算公共支撑平台 2.2.2 智慧规划 2.2.3 智慧管网 2.2.4 智能政务 2.2.5 智慧交通 2.2.6 智慧…

两台笔记本之间快速传输文件,两台电脑之间快速传输大量文件

想用自己的笔记本电脑给同事的电脑传文件&#xff0c;却发现自己和同事都没有带U盘和数据线&#xff0c;怎么办&#xff1f;两台笔记本之间快速传输文件&#xff1f;接下来介绍的方法你可能用得到。 方案一、微信、QQ传输文件 简单的方法就是两台电脑都登陆聊天工具&#xff0…

小学生C++编程基础 课程7(B)

904.等差数列 (课程7) 登录 905.双等差数列 (课程7) 登录 906.打印数列1 (课程7) 登录 907.打印数列2 (课程7) 难度&#xff1a;1 登录 908.对称数列 (课程7) 登录 909.个位数是7 &#xff08;课程7&#xff09; 登录 910.打印数列3 &#xff08;课程7&#xff09; 登录…

【AI理论学习】n-gram语言模型和神经网络语言模型

n-gram语言模型和神经网络语言模型什么是语言模型语言模型的计算什么是n-gram模型n-gram平滑技术什么是神经网络语言模型&#xff08;NNLM&#xff09;&#xff1f;基于前馈神经网络的模型基于循环神经网络的模型语言模型评价指标总结参考资料什么是语言模型 语言模型是自然语…

重磅!张文宏最新防治指南来了!

文 | 闲欢来源&#xff1a;Python 技术「ID: pythonall」最近全国各地最热门的话题恐怕都是跟“羊”有关的了。混乱时期两周之前&#xff0c;在所有人猝不及防的情况下&#xff0c;国家宣布放开疫情防控。从此我们再也不用每天排队做核酸&#xff0c;上班或者出去完也不用处处设…

二维Poisson方程五点差分格式与Python实现

最近没怎么写新文章&#xff0c;主要在学抽象代数下学期还有凸分析好累的一学期哦对&#xff0c;我不是数学系的&#xff0c;我是物理系的。而且博主需要澄清一下&#xff0c;博主没有对象&#xff0c;至少现在还没有。好&#xff0c;兄弟们&#xff0c;好习惯&#xff0c;先上…

SSM鹊巢大连分公司分销商管理系统

开发工具(eclipse/idea/vscode等)&#xff1a;idea 数据库(sqlite/mysql/sqlserver等)&#xff1a;mysql 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;、主要功能 一、&#xff1a;人员管理&#xff1a;自己派遣到各个地区的员工&#xff0c;也就是分销商&#xf…

Java平衡树之红黑树代码实现过程详解(2)

红黑树 前面介绍了2-3树&#xff0c;可以看到2-3树能保证在插入元素之后&#xff0c;树依然保持平衡状态&#xff0c;它的最坏情况下所有子结点都是2-结点&#xff0c;树的高度为lgN,相比于我们普通的二叉查找树&#xff0c;最坏情况下树的高度为N&#xff0c;确实保证了最坏情…

药学专业转行软件测试,真的可以月薪过万吗?

转行原因 我在大学里学的是药学专业&#xff0c;毕业之后也顺利从事了对口的工作——药物分析。工作很稳定&#xff0c;但是内容很繁琐&#xff0c;薪资也一般&#xff0c;但从我自己内心来说从来没有开心过&#xff0c;因为我不想从事这样枯草并且一眼就可以看到老的人生。 …

常见的DDoS攻击方式和预防方法

DDoS攻击指分布式拒绝服务攻击&#xff0c;即处于不同位置的多个攻击者同时向一个或数个目标发动攻击&#xff0c;或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。以下是三种常见的DDoS攻击方式&#xff1a; 1.TCP洪水攻击&#xff08;SYN …

ADI Blackfin DSP处理器-BF533的开发详解65:JPEG解码(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了将 480*272 尺寸的 JPEG 数据解码为 RGB888 数据功能&#xff0c;调用了 JPEG 解码库函数。 JPEG 图像数据以.dat 文件…

FineReport报表工具制作图表-JS实现下拉框选择后复选框默认全选

1. 概述 1.1 预期效果 参数联动查询时&#xff0c;希望下拉框选择后&#xff0c;复选框可以跟着选中全部所有参数值&#xff0c;效果如下图所示&#xff1a; 1.2 实现思路 参数联动查询时&#xff0c;希望下拉框选择后&#xff0c;复选框可以跟着选中全部所有参数值给下拉框添…

六、http模块

HTTP —— 超文本传输协议&#xff0c;用于规范客户端浏览器和服务端以何种格式进行通信和数据交互&#xff1b;HTTP由请求和响应构成的&#xff0c;是一个标准的客服端服务器模型。 HTTP请求响应过程 先简单的来了解以下HTTP的请求响应过程&#xff1a;1.地址解析&#xff1a…

深度学习实验(四)——卷积神经网络编程

深度学习实验四:卷积神经网络编程 本次实验练习使用torch.nn中的类设计一个卷积神经网络进行MNIST手写体数字图像分类。 name x#填写你的姓名 sid B02014152#填写你的学号print(姓名:%s, 学号:%s%(name, sid))姓名:x, 学号:B02014152import torch import torch.nn as nn im…