flowable定时任务和表单

news2025/1/18 6:59:30

在这里插入图片描述
流程定义定时激活 : act_re_procdef 的 suspension_status

        ClassPathResource classPathResource = new ClassPathResource("hehe/HistoryDemo01.bpmn20.xml");
        repositoryService.createDeployment().addInputStream(classPathResource.getFilename(),classPathResource.getInputStream())
                // 定时激活
        .activateProcessDefinitionsOn(new Date(System.currentTimeMillis()+120*1000)).deploy();
// 定时挂起
repositoryService.suspendProcessDefinitionByKey("HistoryDemo01",true,new Date(System.currentTimeMillis()+120*1000));

// 定时激活   null 表示立马激活
repositoryService.activateProcessDefinitionByKey("HistoryDemo01",true,null);

act_ru_time_job : 定时任务
act_ru_job : 被扫描到后会立马执行
act_ru_deadletter_job

   //  移动到 act_ru_deadletter_job  中 取消定时任务
        managementService.moveJobToDeadLetterJob("54a99b79-9b94-11ed-9a24-f0b61e94ce8e");
    // 移动到 act_ru_job   定时任务立即执行
        managementService.moveTimerToExecutableJob("54a99b79-9b94-11ed-9a24-f0b61e94ce8e");

对于移动到 死信队列中的任务,也可以再次移动会 act_ru_job ,会立马执行,无论时间到没到

  // 移动 act_ru_deadletter_job  到  act_ru_job  ,, 重试3次
  managementService.moveDeadLetterJobToExecutableJob("jobId",3);

表单

内置表单

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
查询启动节点的表单定义:

获取表单的属性: 可以知道,当启动流程的时候需要填哪些表单信息

    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("DynamicFormDemo").latestVersion().singleResult();
        // 开始节点上的 表单定义信息
        StartFormData startFormData = formService.getStartFormData(processDefinition.getId());
        // 表单的属性
        List<FormProperty> formProperties = startFormData.getFormProperties();
        for (FormProperty fp : formProperties) {
            FormType type = fp.getType();
            Object info = "";
            // 对于日期和枚举类型,还可以获取该字段的额外信息
            if (type instanceof EnumFormType){
                // 枚举类型
                info = type.getInformation("values");
            }else  if (type instanceof DateFormType){
                // 日期类型
                info = type.getInformation("datePattern");
            }

            System.out.println(fp.getId()+"--"+fp.getName()+"--"+fp.getValue()+"--"+fp.getType().getName()+"--"+info);
        }

启动流程时 传入表单变量:

  // 将表单实例当作 普通变量对待
        HashMap<String, Object> map = new HashMap<>();
        map.put("days",10);
        map.put("reason","hehe");
        map.put("startTime","2023-1-24");
        map.put("type","请假");
        Authentication.setAuthenticatedUserId("ww");
        runtimeService.startProcessInstanceByKey("DynamicFormDemo", map);

formService传入表单属性:

   ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("DynamicFormDemo").latestVersion().singleResult();

        // 将表单实例当作 普通变量对待
        HashMap<String, String> map = new HashMap<>();
        map.put("days","10");
        map.put("reason","hehe");
        map.put("startTime","2023-1-24");
        map.put("endTime","2023-2-24");
        map.put("type","askforleave");
        Authentication.setAuthenticatedUserId("ww");

        // 提交表单,,启动一个新的流程    表单提交会进行约束  对提交的数据进行限制,,required,无效的enum
        formService.submitStartFormData(processDefinition.getId(),map);
查找UserTask上的内置表单信息
     Task task = taskService.createTaskQuery().singleResult();
        // 根据taskId 查找 表单属性
        TaskFormData taskFormData = formService.getTaskFormData(task.getId());

        List<FormProperty> formProperties = taskFormData.getFormProperties();
        for (FormProperty fp : formProperties) {
            FormType type = fp.getType();
            Object info = "";
            // 对于日期和枚举类型,还可以获取该字段的额外信息
            if (type instanceof EnumFormType){
                // 枚举类型
                info = type.getInformation("values");
            }else  if (type instanceof DateFormType){
                // 日期类型
                info = type.getInformation("datePattern");
            }

            System.out.println(fp.getId()+"--"+fp.getName()+"--"+fp.getValue()+"--"+fp.getType().getName()+"--"+info);
        }

完成一个表单 : 修改表单数据,,,不会去完成任务,只是修改表单数据,,也可以使用 taskService.complete()

      Task task = taskService.createTaskQuery().singleResult();
        // 修改 task 的form .. 会进行数据校验 ,,, 日期填写错误不会报错,会存入null
        Map<String, String> map = new HashMap<>();
        map.put("days","20");
        map.put("reason","hehe");
        map.put("startTime","2023-1-24");
        map.put("endTime","2023-2-24");
        map.put("type","askforleave");
        // 保存表单数据
        formService.saveFormData(task.getId(),map);

外置表单

提前有一个准备好的html文件,这个文件作为 外置表单

在这里插入图片描述
开始节点的时候,,提交表单数据
创建两个表单,一个发送数据,一个回填数据:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
表单和流程 一起部署,有相同的部署id,,,不然找不到表单

在这里插入图片描述

部署有外置表单的流程:

    DeploymentBuilder builder = repositoryService.createDeployment().name("名字").category("分类").key("自定义工作流的key");
        ClassPathResource ext = new ClassPathResource("hehe/ExtFormDemo.bpmn20.xml");
        ClassPathResource askLeave = new ClassPathResource("hehe/askleave.html");
        ClassPathResource leaderApproval = new ClassPathResource("hehe/leader_approval.html");
        // 流程实例 和 外置表单一起部署,,使用同一个  部署id
        builder.addInputStream(ext.getFilename(),ext.getInputStream())
                .addInputStream(askLeave.getFilename(),askLeave.getInputStream())
                .addInputStream(leaderApproval.getFilename(),leaderApproval.getInputStream());


        builder.deploy();

查看流程的 外置表单信息:

        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("ExtFormDemo").singleResult();
        // 查询启动节点上,,外置表单的key
        String startFormKey = formService.getStartFormKey(processDefinition.getId());
        System.out.println("startFormKey = " + startFormKey);

        // 查询启动节点上,渲染之后的流程表单,,这个方法主要针对外置表单来使用
        String renderedStartForm = (String) formService.getRenderedStartForm(processDefinition.getId());
        System.out.println("renderedStartForm = " + renderedStartForm);

查找表单内容是在 act_ge_bytearray查询,,根据流程的部署ID,,deployment_id ,所以表单和流程 一定要 一起部署

  ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("ExtFormDemo").latestVersion().singleResult();
        Map<String, String> map = new HashMap<>();
        map.put("days","30");
        map.put("reason","hehe");
        map.put("startTime","2023-1-24");
        map.put("endTime","2023-2-24");
        // 开启一个流程,,传入表单数据
        formService.submitStartFormData(processDefinition.getId(),map);

查找userTask的 外置表单渲染后的内容:

 Task task = taskService.createTaskQuery().singleResult();
        // 获取被渲染后的 外置表单,,这里会自动读取流程变量,并且将表单中的值渲染出来
        String renderedTaskForm = (String) formService.getRenderedTaskForm(task.getId());
        System.out.println("renderedTaskForm = " + renderedTaskForm);

完成当前UserTask,并修改表单数据:

        Task task = taskService.createTaskQuery().singleResult();
        Map<String, String> map = new HashMap<>();
        map.put("days","40");
        map.put("reason","hehe");
        map.put("startTime","2023-1-24");
        map.put("endTime","2023-2-24");
        // 流程审批 并修改表单内容
        formService.submitTaskFormData(task.getId(),map);
外置表单 json类型

创建一个名字是application_form.form的json表单

{
	"key":"application_form.form",
	"name":"请假审批表单",
	"fields":[
		{
			"id":"days",
			"name":"请假天数",
			"type":"string",
			"required":true,
			"placeholder":"empty"
		},
		{
			"id":"reason",
			"name":"请假理由",
			"type":"string",
			"required":true,
			"placeholder":"empty"
		},
		{
			"id":"startTime",
			"name":"开始时间",
			"type":"date",
			"required":true,
			"placeholder":"empty"
		},
		{
			"id":"endTime",
			"name":"结束时间",
			"type":"date",
			"required":true,
			"placeholder":"empty"
		}
	]
}

springboot配置文件:

# 表单资源位置
flowable.form.resource-location=classpath*:/forms/
flowable.form.resource-suffixes=**.form

去部署流程定义,,启动一个流程实例,,
获取表单信息通过task:

    Task task = taskService.createTaskQuery().singleResult();
        // 获取UserTask 上的表单信息
        FormInfo formInfo = taskService.getTaskFormModel(task.getId());
        String key = formInfo.getKey();
        String id = formInfo.getId();
        String name = formInfo.getName();
        String description = formInfo.getDescription();
        int version = formInfo.getVersion();
        System.out.println(key+"---"+name+"---"+description+"---"+version);

        // 获取表单的 字段
        SimpleFormModel formModel = (SimpleFormModel) formInfo.getFormModel();
        List<FormField> fields = formModel.getFields();
        for (FormField field : fields) {
            String type = field.getType();
            Object value = field.getValue();
            String name1 = field.getName();
            String id1 = field.getId();
            String placeholder = field.getPlaceholder();
            System.out.println(id1+"---"+name1+"---"+value+"---"+type+"---"+placeholder);
        }

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

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

相关文章

【HBase入门】3. HBase数据模型

简介 在HBASE中&#xff0c;数据存储在具有行和列的表中。这是看起来关系数据库(RDBMS)一样&#xff0c;但将HBASE表看成是多个维度的Map结构更容易理解。 { “zzzzz” : “woot”, “xyz” : “hello”, “aaaab” : “world”, “1” : “x”, “aaaaa” : “y” } 术语 表…

MCAL系列介绍05-ICU

本文框架1. 前言2. 基本概念3. ICU采集过程3.1 获取周期占空比3.2 获取边沿数量3.3 获取时间戳4. Autosar系列文章快速链接1. 前言 ICU驱动器是使用Input Capture Uint模块&#xff08;ICU&#xff09;解调PWM信号、计数脉冲、测量频率和占空比、生成简单中断以及唤醒中断的模…

ROS学习寄录之知识学习

1 ROS核心概念 1.1 节点&#xff08;Node&#xff09; &#xff08;1&#xff09;执行具体任务的进程、独立运行的可执行文件 &#xff08;2&#xff09;不同节点可以使用不同的语言&#xff0c;可分布式运行在不同的主机 &#xff08;3&#xff09;节点在系统中的名称必须…

HTML总结

web开发是创建Web页面或App等前端界面呈现给用户的过程。web开发开发是从网页制作演变而来&#xff0c;早期网站主要内容都是静态&#xff0c;用户使用网站的行为也以浏览为主。随着互联网技术的发展&#xff0c;各种终端设备应用程序与用户沟通交互的界面&#xff0c;都是由We…

Java基础 Stream流方法引用异常文件

Stream流 引例 需求&#xff1a;按照下面要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 1. 把所有以“曹”开头的元素存储到新集合中 2. 把曹开头&#xff0c;长度为3的元素存储到新集合中 List<String> list List.of("曹操", "…

关于2倍图的理解

在电脑端1个css像素1个物理像素 所以一个长宽都是100px的照片&#xff0c;需要100✖100px的物理像素 而在移动端存在多倍图的关系&#xff0c;假如是2倍图的关系 即&#xff1a;1个css像素需要2个物理发光点 假如现在有一个长宽都是100px像素的照片 放在手机上也是长宽也是100…

TCP/IP IP地址概念与应用

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.什么是IP地址 二.IP地址的组成 三.IP地址分类 A类IP地址 …

雅睿生物在创业板IPO终止:安信证券为保荐人,曾计划募资7.5亿元

近日&#xff0c;深圳证券交易所创业板披露的信息显示&#xff0c;苏州雅睿生物技术股份有限公司&#xff08;下称“雅睿生物”&#xff09;提交了关于撤回首次公开发行股票并在创业板上市申请文件的申请&#xff0c;保荐人提交了撤回保荐的申请。 据贝多财经了解&#xff0c;雅…

Heatmap关键点检测算法

** Heatmap 方法汇总 高斯热图与坐标回归方法探讨 L1与 L2 Loss的对比分析 关键点之热力图Heatmap与坐标FC回归 Heatmap-based和Regression-based 一般来说&#xff0c;我们可以把姿态估计任务分成两个流派&#xff1a;Heatmap-based和Regression-based。 其主要区别在于监…

GROMACS 教程--水中的溶菌酶

GROMACS 教程–水中的溶菌酶 中文教程&#xff1a;http://jerkwin.github.io/ 英文教程&#xff1a;http://www.mdtutorials.com 此示例将指导新用户完成模拟系统的设置过程&#xff0c;该模拟系统在一盒水和离子中包含蛋白质&#xff08;溶菌酶&#xff09;。每个步骤都将包含…

学习3dmax多边形建模挤出操作

新建一个长方体&#xff0c;右键&#xff0c;转换为可编辑多边形&#xff1b; 右键以后&#xff0c;这个Convert To菜单&#xff0c;有时有有时没有&#xff0c;我还没弄清&#xff0c; 操作层级选中如下&#xff0c; 选中挤出命令&#xff0c;Extrude&#xff0c; 挤了一下&a…

元宇宙3D设计系统【构思与展望】

Metaverse 似乎是一个迷人的未来主义命题&#xff0c;“有一天”我们将拥有数十亿人愿意“生活在其中”的虚拟世界。 显然&#xff0c;我们还没有看到真正的“元宇宙”产品&#xff0c;3-5 年内也不太可能看到这样的产品。 那么&#xff0c;是什么阻碍了元宇宙在短期内成为现实…

ccflow 代码分析

ccflow 代码分析目录概述需求&#xff1a;设计思路实现思路分析1.参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happ…

线段树的原理和应用

目录 一、前言 二、线段树的概念 1、区间最值问题RMQ (Range Minimum/Maximum Query) &#xff08;1&#xff09;暴力法 &#xff08;2&#xff09;高效的办法&#xff1a;线段树 &#xff08;3&#xff09;把数列放在二叉树上 &#xff08;4&#xff09;查询最小值的复…

反向放大电路并联电容与积分电路并联电阻的区别?

运放反相比例放大电路中反馈电阻两端经常并联一个电容&#xff0c;而运放积分电路的反馈电容上常常并联一个电阻&#xff0c;两者电路结构相似&#xff0c;如下所示&#xff08;隐去阻容值&#xff09;&#xff0c;二者有何区别呢&#xff1f;电阻、电容分别又起到什么作用&…

djangorestframework全解

这里写目录标题drf安装与使用ApiView继承自原生View的基类基本使用源码分析drf的Request对象响应模块&#xff08;一般不用管&#xff09;内置渲染器局部使用全局使用解析器&#xff08;一般不用管&#xff09;全局使用解析器局部使用解析器同时使用多个解析器&#xff08;默认…

雅克比行列式补充和曲面的参数方程求导表示法向量

接上篇的雅克比行列式部分。其实对于任何变量x,y, dxdy描述的是一个抽象的“面积”。比如&#xff0c;如果x是力F&#xff0c;y是时间t&#xff0c;那么“面积”Ft其实就是做功。所以我们可以认识到&#xff0c;对于dxdy和dudv之间&#xff0c;如果自变量u&#xff0c;v的改变量…

【网络安全】ip地址、公网、私网

一、IP地址 ip地址相当于收发快递时的收货地址和发货地址 IPV4的地址&#xff1a;192.168.0.1 11000000.10101000.00000000.00000001 windows使用>ipconfig&#xff1b;linux使用ifconfig 可以看到IPV4地址/inet旁边的就是IP地址 IP地址的分类 IP地址有32位&#xff0…

React事件和原生事件的执行顺序

React在内部对事件做了统一的处理&#xff0c;合成事件是一个比较大的概念 为什么要有合成事件 在传统的事件里&#xff0c;不同的浏览器需要兼容不同的写法&#xff0c;在合成事件中React提供统一的事件对象&#xff0c;抹平了浏览器的兼容性差异React通过顶层监听的形式&am…

ROS学习寄录之环境搭建

1 创建ROS工作空间 1.1 创建工作空间 &#xff08;1&#xff09;创建工作空间 mkdir catkin_ws &#xff08;2&#xff09;进入catkin_ws文件夹&#xff0c;然后创建一个src文件夹 cd catkin_ws mkdir src &#xff08;3&#xff09;进入src文件夹&#xff0c;生成CMakeL…