yxh
7 天以前 68ff33beff11310e830b0615b5a81f83fad0f683
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
package cn.lihu.jh.module.ecg.enums;
 
import lombok.AllArgsConstructor;
import lombok.Getter;
 
/**
 * His的Check_type类型枚举(按 HIS 传来的**检查项目名称**映射本地 check_type)
 *
 * <p>注意:同一个检查在 HIS 侧可能有多个叫法,本枚举用「一个值挂多个名称」的方式兼容。
 * 实测 2026-10-04/05:运动试验这一项 HIS 侧改名过——
 * 「平板运动心电」(旧)→「平板运动试验」(现),而本地 check_type 一直是 400。
 * 名称映射不到时,{@code handleAppointmentCreate} 会退回按 HIS 检查代码映射
 * ({@link HisCheckCodeEnum}),两条路任一条通即可,避免再出现 book_check_type 为空。</p>
 *
 * <p>实测 2026-10-07 又发现血压类同样的问题:HIS 发的是「24小时动态血压监测」,
 * 而枚举里当时只有「动态血压」,精确匹配失败(日志:
 * {@code [handleAppointmentCreate][体检患者检查项目名称无法映射] checkName=24小时动态血压监测})。
 * 现已补齐别名;同时 {@link #getByName(String)} 增加一层**规范化兜底匹配**,
 * 用于吸收 HIS 侧「有无「24小时」前缀」「全/半角括号」「多余空格」这类无意义差异,
 * 避免每换一种叫法就要改一次代码。</p>
 */
@Getter
@AllArgsConstructor
public enum HisCheckNameEnum {
    Y691133607("常规心电图", "100"),
    Y201605("24小时动态心电图", "200"),
    Y201606("24小时动态心电监测", "200"),
    // 同一检查(本地 check_type=200 动态心电)的其它叫法。
    // 实测报文里该项的 code 存在两种形态:Y201605(带Y前缀)与 201605(不带),
    // 而 HisCheckCodeEnum 只登记了 201605,故带 Y 的那种必须靠名称映射兜住。
    Y201605_ALIAS1("动态心电图", "200"),
    Y201605_ALIAS2("24小时动态心电", "200"),
    Y201605_ALIAS3("动态心电监测", "200"),
    Y200327("动态血压", "300"),
    // 同一检查(本地 check_type=300 动态血压)的其它叫法。
    // 实测 2026-10-07:HIS 实际下发的是「24小时动态血压监测」(jcxmcode=Y200327),
    // 当时枚举只有「动态血压」→ 名称匹配失败,且代码兜底也对不上(代码是 Y200327,表里记的是 200327)。
    Y200327_ALIAS1("24小时动态血压监测", "300"),
    Y200327_ALIAS2("24小时动态血压", "300"),
    Y200327_ALIAS3("动态血压监测", "300"),
    Y201652("平板运动心电", "400"),
    // 同一检查(本地 check_type=400)的其它叫法:枚举常量名不能重复,故加后缀
    Y201652_ALIAS1("平板运动试验", "400"),
    Y201652_ALIAS2("心电图运动试验", "400"),
    Y502490914("动脉硬化检测", "500"),
    Y419562119("食道电生理", "600"),
    Y201604("心电图药物负荷试验", "700"),
    Y1202042("频谱心电图", "800"),
    Y1202058("心室晚电位", "900"),
    Y1202065("床边心电图(常规+频谱)", "1000"),
    Y559542128("常规心电图-心电向量图", "1100");
 
    /**
     * 类型
     */
    private final String name;
    /**
     * 描述
     */
    private final String value;
 
    /**
     * 根据名称获取本地检查类型:先精确匹配,再规范化兜底匹配。
     *
     * @param name HIS 传来的检查项目名称
     * @return 本地 check_type 字符串;都匹配不到返回 null
     */
    public static String getByName(String name) {
        if (name == null) {
            return null;
        }
        // ① 精确匹配(保持原有行为)
        for (HisCheckNameEnum value : values()) {
            if (value.getName().equals(name)) {
                return value.getValue();
            }
        }
        // ② 规范化后再匹配:吸收「24小时」前缀、全/半角括号、空格、大小写等无意义差异,
        //    避免 HIS 每换一种叫法就漏映射(例如「24小时动态血压监测」vs「动态血压监测」)
        String normalized = normalizeName(name);
        if (normalized.isEmpty()) {
            return null;
        }
        for (HisCheckNameEnum value : values()) {
            String enumNormalized = normalizeName(value.getName());
            if (enumNormalized.equals(normalized)) {
                return value.getValue();
            }
            // ③ 去掉「24小时」后再比一次:HIS 侧有无该前缀都可能出现
            if (strip24Hour(enumNormalized).equals(strip24Hour(normalized)) && !strip24Hour(normalized).isEmpty()) {
                return value.getValue();
            }
        }
        return null;
    }
 
    /** 规范化项目名称:去空白、统一大小写、全角括号→半角、去掉「24小时」前缀 */
    private static String normalizeName(String name) {
        if (name == null) {
            return "";
        }
        return name.trim()
                .replace(" ", "")
                .replace("\u3000", "")
                .replace("(", "(")
                .replace(")", ")")
                .replace("24", "24")
                .toLowerCase();
    }
 
    /** 去掉「24小时」/「24h」前缀,用于比较同义名称 */
    private static String strip24Hour(String normalizedName) {
        String v = normalizedName;
        if (v.startsWith("24小时")) {
            v = v.substring("24小时".length());
        }
        if (v.startsWith("24h")) {
            v = v.substring("24h".length());
        }
        return v;
    }
 
    /**
     * 根据类型获取枚举
     *
     * @param val 值类型
     * @return 枚举
     */
    public static String getByValue(String val) {
        for (HisCheckNameEnum value : values()) {
            if (value.getValue().equals(val)) {
                return value.getName();
            }
        }
        return null;
    }
}