返回介绍

9.2. 表单参数

发布于 2023-09-17 23:40:35 字数 5219 浏览 0 评论 0 收藏 0

所有与业务流程相关的信息,要么包含在流程变量里,要么可以通过流程变量引用。Flowable也支持将复杂的Java对象,以Serializable对象、JPA实体,或整个XML文档存储为String等方式,存储为流程变量。

启动流程与完成用户任务是用户参与流程的地方,所以需要使用UI界面渲染表单。为了简化UI设计,可以在流程定义中,将流程变量中的复杂的Java对象转换为Map<String,String>格式的参数

这样UI就可以使用Flowable API方法,在这些参数的基础上构建表单。这些参数可看做是专用(也更受限)的流程变量视图。可以使用FormData返回值,获取用于显示表单的参数。如

StartFormData FormService.getStartFormData(String processDefinitionId)

TaskFormData FormService.getTaskFormData(String taskId)

默认情况下,内建表单引擎能够“看到”参数与流程变量。因此如果任务表单参数一对一对应流程变量,则不需要专门进行声明。例如,对于如下声明:

<startEvent />

当执行到达startEvent时,所有流程变量都可用。但

formService.getStartFormData(String processDefinitionId).getFormProperties()

将为空,因为并未指定映射。

在上面的例子中,所有提交的参数都存储为流程变量。也就是说,只要简单地在表单中添加输入框,就可以存储新变量。

参数从流程变量衍生而来,但并不是必须存储为流程变量。例如,流程变量可以是Address类的JPA实体。而UI使用的StreetName表单参数,则通过#{address.street}表达式获取。

类似的,表单中用户需要提交的参数,可以存储为流程变量,也可以使用UEL值表达式,保存至某个流程变量的参数。如#{address.street}

除非使用formProperty声明,否则提交参数时,默认将其存储为流程变量。

在表单参数与流程变量的处理过程中,也可以进行类型转换。

例如:

<userTask>
  <extensionElements>
  <flowable:formProperty />
  <flowable:formProperty type="long"/>
  <flowable:formProperty variable="SpeakerName" writable="false" />
  <flowable:formProperty expression="#{address.street}" required="true" />
  </extensionElements>
</userTask>
  • room表单参数将作为String,映射为room流程变量

  • duration表单参数将作为java.lang.Long,映射为duration流程变量

  • speaker表单参数将被映射为SpeakerName流程变量。将只在TaskFormData对象中可用。若提交了speaker参数,将抛出FlowableException。对应地,使用readable="false"属性,参数可以提交,但不会在FormData中提供。

  • street表单参数将作为String,映射为address流程变量的Java bean参数street。如果在提交时没有提供这个字段,required="true"将抛出异常。

StartFormData FormService.getStartFormData(String processDefinitionId)TaskFormdata FormService.getTaskFormData(String taskId)方法返回的FormData同样提供类型元数据。

支持下列表单参数类型:

  • string (org.flowable.engine.impl.form.StringFormType

  • long (org.flowable.engine.impl.form.LongFormType)

  • double (org.flowable.engine.impl.form.DoubleFormType)

  • enum (org.flowable.engine.impl.form.EnumFormType)

  • date (org.flowable.engine.impl.form.DateFormType)

  • boolean (org.flowable.engine.impl.form.BooleanFormType)

可以通过List<FormProperty> formService.getStartFormData(String processDefinitionId).getFormProperties()List<FormProperty> formService.getTaskFormData(String taskId).getFormProperties()方法,获取每个表单参数的下列FormProperty信息:

public interface FormProperty {
  /**
   * 在{@link FormService#submitStartFormData(String, java.util.Map)}
   * 或{@link FormService#submitTaskFormData(String, java.util.Map)}
   * 中提交参数时使用的key
   */
  String getId();

  /** 显示标签 */
  String getName();

  /** 在本接口中定义的类型,例如{@link #TYPE_STRING} */
  FormType getType();

  /** 可选。这个参数需要显示的值 */
  String getValue();

  /** 这个参数是否可以读取:在表单中显示,并可通过
   * {@link FormService#getStartFormData(String)}
   * 与{@link FormService#getTaskFormData(String)}
   * 方法访问。
   */
  boolean isReadable();

  /** 用户提交表单时是否可以包含这个参数? */
  boolean isWritable();

  /** 输入框中是否必填这个参数 */
  boolean isRequired();
}

例如:

<startEvent>
  <extensionElements>
  <flowable:formProperty
    name="Speaker"
    variable="SpeakerName"
    type="string" />

  <flowable:formProperty
    type="date"
    datePattern="dd-MMM-yyyy" />

  <flowable:formProperty type="enum">
    <flowable:value name="Go Left" />
    <flowable:value name="Go Right" />
    <flowable:value name="Go Up" />
    <flowable:value name="Go Down" />
  </flowable:formProperty>

  </extensionElements>
</startEvent>

所有这些信息都可以通过API获取:用formProperty.getType().getName()获取类型名、formProperty.getType().getInformation("datePattern")获取日期格式、formProperty.getType().getInformation("values")获取枚举值。

下面的XML代码片段

<startEvent>
  <extensionElements>
  <flowable:formProperty name="Number of days" value="${numberOfDays}" type="long" required="true"/>
  <flowable:formProperty name="First day of holiday (dd-MM-yyy)" value="${startDate}" datePattern="dd-MM-yyyy hh:mm" type="date" required="true" />
  <flowable:formProperty name="Motivation" value="${vacationMotivation}" type="string" />
  </extensionElements>
</userTask>

可以在自定义应用中用于渲染流程启动表单。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文