刘光辉
15 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package jnpf.bizcommon.audit.service.title;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
/**
 * 一张在线表单上「哪些字段进操作记录标题」的解析结果。
 *
 * <p>主表字段与子表字段**必须分开**:标题的形态是「主表一行 + 子表每条记录各一行」,
 * 混在一起就拼不出来。这也是本类不复用 {@code AuditFormRegistry} 内部那套拍平式
 * {@code collectFields} 的原因。
 *
 * <p>不可变。{@link #EMPTY} 是所有"取不到/解析不了"路径的统一返回值——
 * 取不到勾选配置时应当**不产出标题**,而不是猜一个。
 */
public final class AuditTitleSpec {
 
    public static final AuditTitleSpec EMPTY =
            new AuditTitleSpec(Collections.<String>emptyList(),
                    Collections.<SubTableSpec>emptyList());
 
    private final List<String> mainFields;
    private final List<SubTableSpec> subTables;
 
    public AuditTitleSpec(List<String> mainFields, List<SubTableSpec> subTables) {
        this.mainFields = mainFields == null || mainFields.isEmpty()
                ? Collections.<String>emptyList()
                : Collections.unmodifiableList(new ArrayList<String>(mainFields));
        this.subTables = subTables == null || subTables.isEmpty()
                ? Collections.<SubTableSpec>emptyList()
                : Collections.unmodifiableList(new ArrayList<SubTableSpec>(subTables));
    }
 
    /** 主表上勾选的字段名(小写),按表单出现顺序。 */
    public List<String> mainFields() {
        return mainFields;
    }
 
    /** 每个 {@code jnpfKey=table} 子表控件一条。 */
    public List<SubTableSpec> 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<String> fields;
 
        public SubTableSpec(String vModel, String tableName, List<String> fields) {
            this.vModel = vModel;
            this.tableName = tableName;
            this.fields = fields == null || fields.isEmpty()
                    ? Collections.<String>emptyList()
                    : Collections.unmodifiableList(new ArrayList<String>(fields));
        }
 
        /** 事件 newData 里装这批子记录的键,如 {@code tableField6da682}。 */
        public String vModel() {
            return vModel;
        }
 
        /** 子表物理表名,如 {@code lims_jianyan_xiang};表单没配时为 null。 */
        public String tableName() {
            return tableName;
        }
 
        /** 子表内勾选的字段名(小写),按表单出现顺序。 */
        public List<String> fields() {
            return fields;
        }
    }
}