刘光辉
昨天 bb638871a7fb692d80f1b7a758f991dc0879002c
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package jnpf.bizcommon.audit.service.value;
 
import jnpf.bizcommon.audit.entity.model.AuditFieldDiffViewVO;
 
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
/** 请验单四类引用的批量收集、展示和技术字段标记探针。 */
public final class LimsQingyandanFieldValueResolverProbe {
 
    private static int passed;
    private static int failed;
 
    public static void main(String[] args) {
        CountingLookup lookup = new CountingLookup();
        LimsQingyandanFieldValueResolver resolver = new LimsQingyandanFieldValueResolver(lookup);
        List<AuditFieldDiffViewVO> fields = Arrays.asList(
                field("jiance_xiangmu", "", "[\"p1\",\"p2\"]"),
                field("jianyan_biaozhun", "", "s1"),
                field("qingyan_ren", "", "u1"),
                field("chanpin_id", "", "c1"),
                field("biz_status", "", "created"),
                field("biz_type", "", "CP"),
                field("jiance_fangshi", "", "quanjian"));
        fields.get(0).setValueType("multiEnum");
        fields.get(1).setComponentType("relationForm");
 
        resolver.resolve(new AuditFieldValueContext("lims_qingyandan", "tenant-a", null), fields);
 
        check("检测项目整批查询一次", lookup.projectCalls == 1, String.valueOf(lookup.projectCalls));
        check("检验标准整批查询一次", lookup.standardCalls == 1, String.valueOf(lookup.standardCalls));
        check("人员整批查询一次", lookup.userCalls == 1, String.valueOf(lookup.userCalls));
        check("产品整批查询一次", lookup.productCalls == 1, String.valueOf(lookup.productCalls));
        check("租户边界透传到全部批量查询", lookup.tenantCalls == 4, String.valueOf(lookup.tenantCalls));
        check("项目名称保持请求顺序且单项失败安全回落",
                "含量测定A、名称暂不可用".equals(fields.get(0).getNewDisplay()),
                fields.get(0).getNewDisplay());
        check("标准显示编号和名称", "GB2 · 阿莫西林胶囊".equals(fields.get(1).getNewDisplay()),
                fields.get(1).getNewDisplay());
        check("人员显示事件目录名称", "管理员".equals(fields.get(2).getNewDisplay()),
                fields.get(2).getNewDisplay());
        check("产品 ID 解析后仍标记 technical", Boolean.TRUE.equals(fields.get(3).getTechnical())
                && "阿莫西林胶囊(A1)".equals(fields.get(3).getNewDisplay()),
                String.valueOf(fields.get(3).getTechnical()));
        check("事件值类型优先于显式解析器", "multiEnum".equals(fields.get(0).getValueType()),
                fields.get(0).getValueType());
        check("事件控件类型优先于显式解析器", "relationForm".equals(fields.get(1).getComponentType()),
                fields.get(1).getComponentType());
        check("显式业务解析器解析 created/CP/quanjian",
                "已创建".equals(fields.get(4).getNewDisplay())
                        && "成品".equals(fields.get(5).getNewDisplay())
                        && "全检".equals(fields.get(6).getNewDisplay())
                        && "enum".equals(fields.get(4).getValueType())
                        && "enum".equals(fields.get(5).getValueType())
                        && "enum".equals(fields.get(6).getValueType()),
                fields.get(4).getNewDisplay() + "/" + fields.get(5).getNewDisplay()
                        + "/" + fields.get(6).getNewDisplay());
 
        resolver.resolve(new AuditFieldValueContext("lims_qingyandan", "", null),
                Collections.singletonList(field("qingyan_ren", "", "other-user")));
        check("空租户引用解析 fail-closed", lookup.userCalls == 1,
                String.valueOf(lookup.userCalls));
 
        System.out.println("=== 请验单批量引用断言:" + passed + " 通过 / " + failed + " 失败 ===");
        System.exit(failed == 0 ? 0 : 1);
    }
 
    private static AuditFieldDiffViewVO field(String name, String oldData, String newData) {
        AuditFieldDiffViewVO field = new AuditFieldDiffViewVO();
        field.setField(name);
        field.setOldData(oldData);
        field.setNewData(newData);
        return field;
    }
 
    private static final class CountingLookup implements LimsQingyandanFieldValueResolver.ReferenceLookup {
        private int projectCalls;
        private int standardCalls;
        private int userCalls;
        private int productCalls;
        private int tenantCalls;
 
        @Override
        public Map<String, String> projects(String tenantId, Set<String> ids) {
            projectCalls++;
            tenant(tenantId);
            check("检测项目 ID 一次完整收集", ids.size() == 2 && ids.contains("p1") && ids.contains("p2"),
                    ids.toString());
            return Collections.singletonMap("p1", "含量测定A");
        }
 
        @Override
        public Map<String, String> standards(String tenantId, Set<String> ids) {
            standardCalls++;
            tenant(tenantId);
            return Collections.singletonMap("s1", "GB2 · 阿莫西林胶囊");
        }
 
        @Override
        public Map<String, String> users(String tenantId, Set<String> ids) {
            userCalls++;
            tenant(tenantId);
            return Collections.singletonMap("u1", "管理员");
        }
 
        @Override
        public Map<String, String> products(String tenantId, Set<String> ids) {
            productCalls++;
            tenant(tenantId);
            Map<String, String> result = new LinkedHashMap<>();
            result.put("c1", "阿莫西林胶囊(A1)");
            return result;
        }
 
        private void tenant(String tenantId) {
            if ("tenant-a".equals(tenantId)) {
                tenantCalls++;
            }
        }
    }
 
    private static void check(String name, boolean ok, String detail) {
        if (ok) {
            passed++;
            System.out.println("  [PASS] " + name);
        } else {
            failed++;
            System.out.println("  [FAIL] " + name + " -- " + detail);
        }
    }
 
    private LimsQingyandanFieldValueResolverProbe() {
    }
}