Flowable6.8-表单的数据回显

上一篇我们了解了表单以及表单的数据存储。意义上表单就是一个页面,用户自定义的一个表单,其中重要的就是元素key,用户输入的值就是value,在流程启动的时候会存储至act_ru_variable表中。不仅仅是表单的值会存储,流程中设计的条件表达式也会存储至其中等等。

以下就是一个表单

用户根据可自定义填写数据发起流程。

流程启动后我们可以查看到历史表单的数据。

1.数据回显

图中标红部分是我用流程监听器(监听器在之前的文章中写到过)做的一些业务数据。

通过接口我们可以看到表单的数据是存储在widgetFormList集合中的

图中箭头所指的就是表单的值,该值可以在表单元素中设置,如果用户没有填写值,则取表单的默认值。此处用户填写了所以就是用户的数据。

之所以用户填写后就会取用户值,是因为我之前多次提到过表单就是一个Map集合,map的特性就是无序、不可重复、没有下标。由于不可重复,所以用户填写后去查询数据库,有值就直接覆盖其value。

2.接口Vo对象

该接口的返回值对象

@Data
public class WfDetailVo {
    /**
     * 任务表单信息
     */
    private FormConf taskFormData;

    /**
     * 历史流程节点信息
     */
    private List<WfProcNodeVo> historyProcNodeList;
    /**
     * 流程表单列表
     */
    private List<FormConf> processFormList;
    private List<ReactFromConf> reactFromConfList;
    private ReactFromConf taskReactFromConf;
    /**
     * 流程XML
     */
    private String bpmnXml;
    private WfViewerVo flowViewer;
    /**
     * 是否存在任务表单信息
     * @return true:存在;false:不存在
     */
    public Boolean isExistTaskForm() {
        return ObjectUtil.isNotEmpty(this.taskFormData);
    }
}

其中的ReactFromConf就是这个表单对象

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class ReactFromConf {
    /**
     * 标题
     */
    private String title;

    /**
     * 表单值
     */
    private List<Map<String, Object>> widgetFormList;
    private Map<String,Object> selectWidgetItem;
    private Map<Object, Object> globalConfig;
    private Map<String, Object> formConfig;
}

想必你们肯定会疑惑为什么要这样设计表单对象。接下来我们看一看表单生成的json就可以看出来了。

我复制至文本中查看

收缩后发现这就是一个json对象,该json对象就是一个表单的各种属性,其中的widgetFormList就是表单元素值。

图中红色框是表单元素名称,绿色框是元素的默认值。

3.获取历史节点表单信息

// 查询任务节点参数,并转换成Map
variables = historyService.createHistoricVariableInstanceQuery()
        .processInstanceId(historicProcIns.getId())
        .taskId(activityInstance.getTaskId())
        .list()
        .stream()
        .collect(Collectors.toMap(HistoricVariableInstance::getVariableName, HistoricVariableInstance::getValue));

获取到历史节点信息就是从act_hi_varinst中根据流程业务实例Id(PROC_INST_ID_)获取到该流程存储的所有变量值。

Collectors.toMap(HistoricVariableInstance::getVariableName, HistoricVariableInstance::getValue)

此处就是将变量转化为Map<VariableName,VariableValue>。我们看一下表就是看出来了

根据表,我们可以很清晰的看到我们是根据PROC_INST_ID_来获取NAME_TEXT_的值

接下来就是遍历当前表单元素并且将获取的历史节点的值塞进其中

4.数据回显

【请详细看注释】

/**
 * 填充表单项内容
 *
 * @param reactFromConf React的表单配置信息
 * @param data          表单内容,也就是上文中我们获取的历史流程map集合
 * @param flag          该布尔值是为了区分获取的是当前流程表单还是历史流程表单
 */
public static void fillFormData(ReactFromConf reactFromConf, Map<String, Object> data,boolean flag) {
    for (Map<String, Object> field : reactFromConf.getWidgetFormList()) {
        recursiveFillField(field, data,flag);
    }
}

该方法中的field就是一个个的表单元素,请注意看key

/**
     * 赋值
     *
     * @param field
     * @param data
     */
    private static void recursiveFillField(final Map<String, Object> field, final Map<String, Object> data,boolean flag) {
        if (!field.containsKey(FORM_ITEM_CONFIG)) {
            return;
        }
        Map<String, Object> formItemConfigMap = (Map<String, Object>) field.get(FORM_ITEM_CONFIG);
        String modelKey = Convert.toStr(field.get(KEY));
        Object value = data.get(modelKey);
        if (value != null) {
            formItemConfigMap.put("initialValue", value);
        }
        if (flag) {
            Map<String, Object> configMap = (Map<String, Object>) field.get(CONFIG);
            if (!configMap.isEmpty()) {
                configMap.put("disabled", true);
            }
        }
    }
}

上述代码中,我标记了红色的布尔变量。此处是为了给表单对象中的值赋true,也就是disabled禁用为true,这样表单就不会被修改了,只能给用户展示历史表单信息。

给表单的config元素的disabled设置为true,则当前表单元素禁用,为了给审批人回显历史节点表单所使用

上述就是表单的数据回显,只涉及了【流程历史详情接口】的1/5左右

相关代码繁多,如有需要可私信我(无偿

### Flowable 6.8 表单配置教程及API使用方法 #### 表单概述 表单用于将简单的业务数据存储在整个流程中,能够随时获取、修改和展示这些数据表单不仅可以独立存在以显示用户信息,还可以通过条件表达式与其他流程组件互动[^3]。 #### 创建动态表单 为了在Flowable 6.8版本中定义一个动态表单,可以通过`FormService`来实现。此服务允许创建基于JSON结构化的表单字段描述符,并将其关联到特定的任务或进程中: ```java // 获取 Form Service 实例 FormService formService = processEngine.getFormService(); // 定义表单属性 Map<String, String> properties = new HashMap<>(); properties.put("name", "text"); properties.put("age", "integer"); // 将表单与启动过程实例相关联 formService.submitStartFormData(processDefinitionId, properties); ``` #### 设置静态表单键 对于更复杂的场景,比如当希望直接链接HTML页面或其他类型的外部资源作为表单时,则应指定表单键(form key)。这使得能够在运行时加载预定义好的界面文件而无需编程逻辑处理: ```xml <userTask id="task1" name="Submit Expense Report"> <extensionElements> <!-- 指定表单URL --> <flowable:formField id="expenseReportUrl" type="string" defaultValue="/forms/submit-expense-report.html"/> </extensionElements> </userTask> ``` 上述XML片段展示了如何在一个用户任务节点内声明名为`expenseReportUrl`的扩展元素,它指向了一个具体的Web地址,在实际应用环境中该路径会解析为相应的HTML模板[^2]。 #### 利用API操作表单 除了以上提到的方式外,开发者还能利用丰富的Java API接口来进行更加灵活的操作。例如查询已提交过的表单数据记录或是更新现有条目中的某些字段值等动作都可以借助于`HistoricFormInstanceQuery`类完成: ```java // 查询历史表单实例 List<HistoricFormInstance> historicForms = historyService.createHistoricFormInstanceQuery() .listPage(0, 10); for (HistoricFormInstance hfi : historicForms) { System.out.println(hfi.getId() + ": " + hfi.getProcessInstanceId()); } ``` 这段代码示范了怎样从数据库检索最近十条已完成的历史表单实例及其对应的工作流ID信息[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值