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} 的三处差异,别混:
*
* - 开关在**列项顶层**,不在 {@code __config__} 里;
* - 字段编码取 {@code prop}(表单侧取 {@code __vModel__})——前端设计文档
* 「服务端接入建议」第 3 条明确了这两套口径;
* - {@code columnList} 是平铺数组,没有布局容器嵌套,**不递归**。
*
*
* 纯静态、无依赖、永不抛异常:解析失败一律返回 {@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;
}
}
}