Springboot +Flowable,流程表单应用之外置表单(JSON形式)(二)

news/2024/10/30 23:14:33/

一.简介

整体上来说,我们可以将Flowable 的表单分为三种不同的类型:

  1. 动态表单
    这种表单定义方式我们可以配置表单中每一个字段的可读性、可写性、是否必填等信息,不过不能定义完整的表单页面。
  2. 外置表单
    外置表单我们只需要定义一下表单的 key,至于这个 key 对应的表单是什么样子,则由开发者自己去维护。
  3. 内置表单
    这是内置的表单定义以及渲染引擎,

另外需要注意的,Flowable 中有很多不同类型的节点,但是只有开始节点和任务节点是支持表单定义的,其他节点均不支持表单定义

在前面的案例中,定义的表单使用了 HTML,实际上这个表单不仅可以使用 HTML,也可以使用 JSON 来定义表单

二.默认规则

使用 JSON 来定义 Flowable 表单,可以利用 Spring Boot 中的默认机制,即将表单文件置于 classpath:forms 目录下,那么在系统启动的时候,表单文件就会被自动部署。并且默认情况下,表单文件的后缀是 .form。

不过对于默认的表单文件位置和表单文件后缀,也可以通过在 application.properties 配置文件中添加如下内容进行修改,代码如下:

# 默认的表单文件后缀
flowable.form.resource-suffixes=**.form
# 默认的表单文件位置
flowable.form.resource-location=classpath*:/forms/

三.创建表单

还是以请假请求为例,创建一个表单文件,文件名为 application_form.form,代码如下:

{"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"}]
}

这个 key 就是表单的唯一标识符,当有多个表单的时候,这个该值不可以重复,name 是表单是名称,fields 则定义了具体的字段,这里一共有四个。

在每一个 filed 的定义中,id 表示字段名,name 则是字段的中文名称,type 表示字段的类型,require 则表示这个字段是否是必填字段,placeholder 不用多说,跟我们日常使用的 input 标签中的 placeholder 的含义一致。

现在就创建好了。

注意:
由于 .form 文件,在 IDEA 中,默认会被当成 Swing 里边的 form 去处理,所以需要提前先用其他的编辑器写好 .form 文件,然后再拷贝到 IDEA 中即可。

四.创建流程

接下来创建一个流程图,流程中引用这个表单。流程图如下:
在这里插入图片描述
在流程图的三个 UserTask 中,分别通过如下方式去配置表单的标识:
在这里插入图片描述

最后下载这个流程图,将之放在 Spring Boot 项目的 classpath:/processes/ 目录下,这样当项目启动的时候,这个流程图会被自动部署。

五.测试

接下来,启动 Spring Boot 项目,启动之后,流程和表单都会被自动部署好,执行如下代码启动一个流程实例:

@Test
void contextLoads() {runtimeService.startProcessInstanceByKey("askforleave");
}

流程启动成功之后,进入到 提交请假申请 环节,该环节有一个表单需要填写,可以先通过如下代码来查看需要填写的表单内容:

@Test
void test01() {Task task = taskService.createTaskQuery().singleResult();FormInfo formInfo = taskService.getTaskFormModel(task.getId());SimpleFormModel formModel = (SimpleFormModel) formInfo.getFormModel();System.out.println("formInfo.getId() = " + formInfo.getId());System.out.println("formInfo.getName() = " + formInfo.getName());System.out.println("formInfo.getKey() = " + formInfo.getKey());List<FormField> fields = formModel.getFields();for (FormField field : fields) {System.out.println("field.getId() = " + field.getId());System.out.println("field.getName() = " + field.getName());System.out.println("field.getValue() = " + field.getValue());System.out.println("field.getType() = " + field.getType());System.out.println("===============");}
}

打印出来的内容如下:

formInfo.getId() = a5b1306a-5ab0-11ed-b35b-acde48001122
formInfo.getName() = 经理审批表单
formInfo.getKey() = application_form.form
field.getId() = days
field.getName() = 请假天数
field.getValue() = null
field.getType() = text
===============
field.getId() = reason
field.getName() = 请假原因
field.getValue() = null
field.getType() = text
===============
field.getId() = startTime
field.getName() = 开始时间
field.getValue() = null
field.getType() = date
===============
field.getId() = endTime
field.getName() = 结束时间
field.getValue() = null
field.getType() = date

打印出来的 value 都是 null,这是因为还没有填写表单。接下来先来完成提交请假申请 这一任务,代码如下:

@Test
void test02() {Task task = taskService.createTaskQuery().singleResult();Map<String, Object> vars = new HashMap<>();vars.put("days", 10);vars.put("reason", "玩一下");vars.put("startTime", "2022-10-10");vars.put("endTime", "2022-11-10");taskService.complete(task.getId(),vars);
}

完成之后,此时任务进入到 组长审批 这一环节,现在再去执行 test01 方法,此时查询的就是 组长审批 这个任务的表单信息,打印出来日志如下:

formInfo.getId() = a5b1306a-5ab0-11ed-b35b-acde48001122
formInfo.getName() = 经理审批表单
formInfo.getKey() = application_form.form
field.getId() = days
field.getName() = 请假天数
field.getValue() = 10
field.getType() = text
===============
field.getId() = reason
field.getName() = 请假原因
field.getValue() = 玩一下
field.getType() = text
===============
field.getId() = startTime
field.getName() = 开始时间
field.getValue() = 2022-10-10
field.getType() = date
===============
field.getId() = endTime
field.getName() = 结束时间
field.getValue() = 2022-11-10
field.getType() = date

此时都有对应的 value 了。


http://www.ppmy.cn/news/67775.html

相关文章

postman工具使用中,遇到的简单疑问

post请求和get请求有什么区别&#xff1f; GET请求和POST请求都是HTTP协议中的两种常见请求方式&#xff0c;主要区别如下&#xff1a; GET请求在请求URL的后面附带参数&#xff0c;而POST请求则将参数包含在请求体中。 GET请求的数据是以查询字符串的形式传递的&#xff0c;而…

软件兼容性测试知识分享,兼容性测试有什么作用?

一、软件兼容性测试是什么? 软件兼容性测试是指检查软件之间能否正确地进行交互和共享信息。随着用户对来自各种类型软件之间共享数据能力和充分利用空间同时执行多个程序能力的要求&#xff0c;测试软件之间能否协作变得越来越重要。软件兼容性测试工作的目标是保证软件按照用…

容器技术Docker

什么是容器 Linux容器是与系统其他部分隔离开的一系列进程&#xff0c;从另一个系统镜像运行&#xff0c;并由该镜像提供支持进程所需的全部文件。 容器镜像包含了应用的所有依赖项&#xff0c;因而在从开发到测试再到生产的整个过程中&#xff0c;它都具有可移植性和一致性。…

最新DNDC模型在土地利用变化、未来气候变化下的建模方法及温室气体时空动态模拟

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…

代理IP技术的介绍及应用指南

一、代理IP的概念 代理IP&#xff0c;又称代理服务器&#xff0c;是一种充当客户端与目标服务器之间中间层的服务器。代理服务器接收客户端发送的请求&#xff0c;然后将请求转发给目标服务器&#xff0c;并将目标服务器的响应返回给客户端。在这个过程中&#xff0c;代理服务器…

云渲染是什么?云渲染和传统渲染农场有什么区别?

云渲染是什么&#xff1f;云渲染和传统渲染农场有什么区别&#xff1f; 今天云渲染小编就来和大家说一说云渲染以及它和传统渲染农场的区别。 一、什么是云渲染&#xff1f;云渲染什么意思&#xff1f; 首先云渲染云渲染是一种依托于云计算的云端服务&#xff0c;用户将本地…

cmake文件中SHARED和MODULE库在MacOS上的差异

cmake文件中SHARED和MODULE 在cmake中可以使用add_library函数生成静态库&#xff08;STATIC&#xff09;、动态库&#xff08;SHARED&#xff09;和模块库&#xff08;MODULE&#xff09;三种。在MacOS上&#xff0c;对应生成的文件类型分别为&#xff1a;.a .dylib .so 动态…

浅谈三次数学危机——费马大定理

浅谈三次数学危机——费马大定理 19世纪末20世纪初&#xff0c;随着非欧几里得几何、无穷小分析等领域的迅速发展&#xff0c;数学界面临着前所未有的挑战。这场关于数学基础的争论&#xff0c;被称为“数学危机”。数学危机起源于对数学的基础概念和公理系统的重新审视&#x…