当前位置: 首页 > 科技观察

使用JSON格式定义Flowable外部表单

时间:2023-03-15 16:03:27 科技观察

在前面的案例中,我们使用HTML定义了表单。其实这个表单不仅可以使用HTML,还可以使用JSON来定义表单。可能有很多小伙伴在网上看到过一些使用JSON定义表单的案例。今天,在这篇文章中,宋哥将与大家分享如何使用JSON来定义Flowable表单。1.默认规则使用JSON来定义Flowable表单。我们可以利用SpringBoot的默认机制,将表单文件放在classpath:forms目录下,系统启动时会自动部署表单文件。默认情况下,表单文件的后缀为.form。不过对于默认的表单文件位置和表单文件后缀,我们也可以修改,在application.properties配置文件中添加如下内容:#默认表单文件后缀flowable.form.resource-suffixes=**.form#Default表单文件位置flowable.form.resource-location=classpath*:/forms/2。创建表单仍然以我们的请假申请为例,我创建一个名为application_form.form的表单文件,如下:{"key":"application_form.form","name":"ManagerApprovalForm","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"}]}这个键是表单的唯一标识符。当有多种形式时,该值不能重复。name是表单的名称,fields定义具体的字段。每个filed中有四个字段的定义,id代表字段名,name是字段的中文名称,type代表字段的类型,require代表字段是否为必填字段。placeholder不用多说,类似于我们日常使用的input标签中的placeholder。意思是一样的。好的,我们的表单现在已经创建了。由于.form文件在IDEA中默认是作为Swing中的表单来处理的,所以需要事先使用其他编辑器编写好.form文件,然后复制到IDEA中。3.创建流程接下来我们创建一个流程图,流程中引用了这个表单。流程图如下:在流程图的三个UserTasks中,表单的标识是通过以下方式配置的:流程图的其他细节这里就不说了,给大家介绍了很多更早。最后我们把这个流程图下载下来,放到SpringBoot项目的classpath:/processes/目录下,这样在项目启动的时候,流程图就会自动部署。4.测试接下来,我们启动SpringBoot项目。启动后会自动部署流程和表单。我们执行以下代码启动一个流程实例:@TestvoidcontextLoads(){runtimeService.startProcessInstanceByKey("askforleave");}process启动成功后,进入提交请假申请的环节。在这个环节中,有一个需要填写的表单,我们可以先通过下面的代码查看需要填写的表单内容:@Testvoidtest01(){Tasktask=taskService.createTaskQuery().singleResult();FormInfoformInfo=taskService.getTaskFormModel(task.getId());SimpleFormModelformModel=(SimpleFormModel)formInfo.getFormModel();System.out.println("formInfo.getId()="+formInfo.getId());System.out.println("formInfo.getName()="+formInfo.getName());System.out.println("formInfo.getKey()="+formInfo.getKey());Listfields=formModel.getFields();for(FormFieldfield: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("字段.getType()="+field.getType());System.out.println("================");}}最终打印出来的内容如下:formInfo...nullfield.getType()=text================field.getId()=reasonfield.getName()=离开的原因field.getValue()=nullfield.getType()=text===============field.getId()=startTimefield.getName()=开始时间field.getValue()=nullfield.getType()=date===============field.getId()=endTimefield.getName()=结束时间field.getValue()=nullfield.getType()=date朋友看到了,打印出来的值都是null,这是因为我们仍然没有填写表格接下来我们来完成提交请假申请的任务:@Testvoidtest02(){Tasktask=taskService.createTaskQuery().singleResult();Mapvars=newHashMap<>();vars.put("天数",10);vars.put("理由","来玩吧");vars.put("开始时间","2022-10-10");vars.put("endTime","2022-11-10");taskService.complete(task.getId(),vars);}任务完成后,任务进入组长审批阶段。现在我们执行test01方法,查询的是组长批准这个任务的表单信息,最后打印出日志如下:formInfo.getId()=a5b1306a-5ab0-11ed-b35b-acde48001122formInfo.getName()=经理审批表formInfo.getKey()=application_form.formfield.getId()=daysfield.getName()=休假天数field.getValue()=10field.getType()=text================field.getId()=reasonfield.getName()=离开的原因field.getValue()=playaroundfield.getType()=text=================field.getId()=startTimefield.getName()=startTimefield.getValue()=2022-10-10field.getType()=date================field.getId()=endTimefield.getName()=结束时间field.getValue()=2022-11-10field.getType()=date可以看到此时有对应的value后面的流程就不用我多说了,大家自己试试吧~