2026-06-30 24681c81c09022f584a57006f2534b5f74723414
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java
@@ -25,8 +25,10 @@
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.TaskInfo;
import tools.jackson.databind.JsonNode;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -245,10 +247,10 @@
        }
        // 解析表单配置
        Map<String, BpmFormFieldVO> formFieldsMap = new HashMap<>();
        Map<String, BpmFormFieldVO> formFieldsMap = new LinkedHashMap<>();
        processDefinitionInfo.getFormFields().forEach(formFieldStr -> {
            BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class);
            parseFormField(formField, formFieldsMap);
            JsonNode formFieldNode = JsonUtils.parseObject(formFieldStr, JsonNode.class);
            parseFormField(formFieldNode, formFieldsMap);
        });
        // 情况一:当自定义了摘要
@@ -275,18 +277,32 @@
    /**
     * 递归解析表单字段
     */
    private static void parseFormField(BpmFormFieldVO formField, Map<String, BpmFormFieldVO> formFieldsMap) {
        if (formField == null) {
    private static void parseFormField(JsonNode formFieldNode, Map<String, BpmFormFieldVO> formFieldsMap) {
        if (formFieldNode == null || !formFieldNode.isObject()) {
            return;
        }
        // 如果存在 children -> 说明是布局组件
        if (formField.getChildren() != null && !formField.getChildren().isEmpty()) {
            for (BpmFormFieldVO child : formField.getChildren()) {
        // 如果 children 里存在对象节点,说明是布局组件;字符串节点是分割线、标签、文字等展示组件内容,直接跳过。
        JsonNode children = formFieldNode.get("children");
        if (children != null && children.isArray() && children.size() > 0) {
            boolean hasObjectChild = false;
            for (JsonNode child : children) {
                if (!child.isObject()) {
                    continue;
                }
                hasObjectChild = true;
                parseFormField(child, formFieldsMap);
            }
            return;
            if (hasObjectChild) {
                return;
            }
        }
        // 真实字段才加入 map
        BpmFormFieldVO formField = new BpmFormFieldVO()
                .setType(JsonUtils.getText(formFieldNode, "type"))
                .setField(JsonUtils.getText(formFieldNode, "field"))
                .setTitle(JsonUtils.getText(formFieldNode, "title"));
        if (StrUtil.isNotBlank(formField.getField())) {
            formFieldsMap.put(formField.getField(), formField);
        }