package jnpf.bizcommon.audit.service.title; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 一张在线表单上「哪些字段进操作记录标题」的解析结果。 * *

主表字段与子表字段**必须分开**:标题的形态是「主表一行 + 子表每条记录各一行」, * 混在一起就拼不出来。这也是本类不复用 {@code AuditFormRegistry} 内部那套拍平式 * {@code collectFields} 的原因。 * *

不可变。{@link #EMPTY} 是所有"取不到/解析不了"路径的统一返回值—— * 取不到勾选配置时应当**不产出标题**,而不是猜一个。 */ public final class AuditTitleSpec { public static final AuditTitleSpec EMPTY = new AuditTitleSpec(Collections.emptyList(), Collections.emptyList()); private final List mainFields; private final List subTables; public AuditTitleSpec(List mainFields, List subTables) { this.mainFields = mainFields == null || mainFields.isEmpty() ? Collections.emptyList() : Collections.unmodifiableList(new ArrayList(mainFields)); this.subTables = subTables == null || subTables.isEmpty() ? Collections.emptyList() : Collections.unmodifiableList(new ArrayList(subTables)); } /** 主表上勾选的字段名(小写),按表单出现顺序。 */ public List mainFields() { return mainFields; } /** 每个 {@code jnpfKey=table} 子表控件一条。 */ public List subTables() { return subTables; } public boolean isEmpty() { return mainFields.isEmpty() && subTables.isEmpty(); } /** 一个子表控件在标题里的取值口径。 */ public static final class SubTableSpec { private final String vModel; private final String tableName; private final List fields; public SubTableSpec(String vModel, String tableName, List fields) { this.vModel = vModel; this.tableName = tableName; this.fields = fields == null || fields.isEmpty() ? Collections.emptyList() : Collections.unmodifiableList(new ArrayList(fields)); } /** 事件 newData 里装这批子记录的键,如 {@code tableField6da682}。 */ public String vModel() { return vModel; } /** 子表物理表名,如 {@code lims_jianyan_xiang};表单没配时为 null。 */ public String tableName() { return tableName; } /** 子表内勾选的字段名(小写),按表单出现顺序。 */ public List fields() { return fields; } } }