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;
}
}
}