package jnpf.bizcommon.audit.service.title; import jnpf.util.JsonUtil; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; /** * 从已发布列表 JSON({@code base_visual_release.F_COLUMN_DATA})解析 * {@code columnList[].biz_log_enabled} 勾选。 * *

与 {@link AuditTitleSpecParser} 的三处差异,别混: *

* *

纯静态、无依赖、永不抛异常:解析失败一律返回 {@link AuditTitleSpec#EMPTY}—— * 标题缺席可以,「这次删过」不能缺。 * *

列表侧没有子表概念,故 {@link AuditTitleSpec#subTables()} 恒为空。 */ public final class AuditListTitleSpecParser { private AuditListTitleSpecParser() { } @SuppressWarnings("rawtypes") public static AuditTitleSpec parse(String columnDataJson) { if (columnDataJson == null || columnDataJson.trim().isEmpty()) { return AuditTitleSpec.EMPTY; } try { Map root = JsonUtil.stringToMap(columnDataJson); if (root == null) { return AuditTitleSpec.EMPTY; } Object raw = root.get("columnList"); if (!(raw instanceof List)) { return AuditTitleSpec.EMPTY; } List main = new ArrayList(); for (Object item : (List) raw) { if (!(item instanceof Map)) { continue; } Map col = (Map) item; if (!Boolean.TRUE.equals(col.get("biz_log_enabled"))) { continue; } Object prop = col.get("prop"); if (prop == null) { continue; } String field = String.valueOf(prop).trim(); // 主表字段口径与 AuditTitleSpec.mainFields() 一致:小写 if (!field.isEmpty() && !main.contains(field.toLowerCase(Locale.ROOT))) { main.add(field.toLowerCase(Locale.ROOT)); } } if (main.isEmpty()) { return AuditTitleSpec.EMPTY; } return new AuditTitleSpec(main, new ArrayList()); } catch (Throwable t) { // 同 AuditTitleSpecParser:不记日志,每次操作都会走到这里,报错会刷爆日志 return AuditTitleSpec.EMPTY; } } }