package cn.iocoder.yudao.module.qcreport.engine.render; import cn.iocoder.yudao.module.qcreport.engine.JsValues; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * GrapesJS 项目数据节点。 *

* 只声明渲染需要的字段,直接读原始 Map:{@code components} 既可能是数组也可能是字符串, * 用 POJO 反序列化要额外处理联合类型,不如按需取值来得直白,也省一次拷贝。 */ public final class RenderNode { private final Map data; private RenderNode(Map data) { this.data = data; } /** 不是对象节点时返回 null(如数组里混入了字符串) */ @SuppressWarnings("unchecked") public static RenderNode of(Object raw) { return raw instanceof Map ? new RenderNode((Map) raw) : null; } public String type() { return text(data.get("type")); } public String tagName() { return text(data.get("tagName")); } /** 只在 content 本身是字符串时返回,与前端 {@code typeof node.content === 'string'} 一致 */ public String content() { return data.get("content") instanceof String content ? content : null; } /** 取一个属性值,取不到返回 null */ public String attribute(String name) { return attributes().get(name); } /** 属性表,值统一成文本 */ public Map attributes() { Map result = new LinkedHashMap<>(); if (data.get("attributes") instanceof Map attributes) { for (Map.Entry entry : attributes.entrySet()) { result.put(String.valueOf(entry.getKey()), JsValues.asText(entry.getValue())); } } return result; } /** 行内样式表,值统一成文本 */ public Map style() { Map result = new LinkedHashMap<>(); if (data.get("style") instanceof Map style) { for (Map.Entry entry : style.entrySet()) { result.put(String.valueOf(entry.getKey()), JsValues.asText(entry.getValue())); } } return result; } /** 子组件;components 是字符串(旧数据/纯文本组件)时返回空列表 */ public List children() { List result = new ArrayList<>(); if (data.get("components") instanceof List components) { for (Object raw : components) { RenderNode child = of(raw); if (child != null) { result.add(child); } } } return result; } private static String text(Object value) { return value == null ? null : String.valueOf(value); } }