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
package cn.lihu.jh.module.ecg.enums;
 
import lombok.AllArgsConstructor;
import lombok.Getter;
 
import java.util.Objects;
 
/**
 * HIS 检查状态编码。
 *
 * <h3>来源</h3>
 * 院方《检查状态编码表》:
 * <pre>
 *   1  申请单开立      2  申请单撤销      3  检查登记
 *   4  取消检查        5  检查开始        6  给造影剂
 *   7  检查结束        8  报告生成        9  报告撤销
 *   10 报告审核
 *   21 标本送检(病理用)  22 取消标本送检(病理用)  23 已缴费(病理用)
 * </pre>
 * 其中 21/22/23 为**病理专用,心电系统不涉及**,本枚举不包含。
 *
 * <h3>为什么需要归一化</h3>
 * HIS 报文中同一个状态会以不同字面形式出现,实测日志中存在:
 * <pre>
 *   processStep.code = "3" / "03" / "7" / "08" / "10"
 * </pre>
 * 即**前导零是否存在并不稳定**(接口文档示例给的是 {@code code="01"})。
 * 若直接写入数据库,会产生 "3" 与 "03" 两种值,导致状态判断错乱。
 * 因此统一经 {@link #normalize(String)} 归一化为无前导零的标准编码后再入库。
 *
 * @author 心电排队装机系统
 */
@Getter
@AllArgsConstructor
public enum HisCheckStatusEnum {
 
    APPLY_CREATED(1, "申请单开立"),
    APPLY_CANCELLED(2, "申请单撤销"),
    REGISTERED(3, "检查登记"),
    CHECK_CANCELLED(4, "取消检查"),
    CHECK_STARTED(5, "检查开始"),
    CONTRAST_GIVEN(6, "给造影剂"),
    CHECK_FINISHED(7, "检查结束"),
    REPORT_GENERATED(8, "报告生成"),
    REPORT_CANCELLED(9, "报告撤销"),
    REPORT_REVIEWED(10, "报告审核");
 
    /** 标准编码(无前导零) */
    private final Integer code;
    /** 状态名称 */
    private final String name;
 
    /**
     * 归一化 HIS 报文中的状态编码字符串。
     * <p>
     * 处理内容:去空白、去前导零、校验是否在编码表内。
     *
     * @param raw 报文原始值,如 "3"、"03"、" 10 "
     * @return 归一化后的标准编码字符串(如 "3"、"10");无法识别时返回 null
     */
    public static String normalize(String raw) {
        if (raw == null) {
            return null;
        }
        String trimmed = raw.trim();
        if (trimmed.isEmpty()) {
            return null;
        }
        // 仅接受数字,避免把非数字内容写入 status
        if (!trimmed.matches("\\d+")) {
            return null;
        }
        // 去前导零:"03" -> "3";"0" -> "0"
        String stripped = trimmed.replaceFirst("^0+(?=\\d)", "");
        int code;
        try {
            code = Integer.parseInt(stripped);
        } catch (NumberFormatException e) {
            return null;
        }
        // 只接受编码表内的值
        return contains(code) ? String.valueOf(code) : null;
    }
 
    /** 判断编码是否属于本编码表(不含病理专用状态) */
    public static boolean contains(Integer code) {
        if (code == null) {
            return false;
        }
        for (HisCheckStatusEnum item : values()) {
            if (Objects.equals(item.code, code)) {
                return true;
            }
        }
        return false;
    }
 
    /** 按编码取状态名称,未匹配返回 null */
    public static String getNameByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (HisCheckStatusEnum item : values()) {
            if (Objects.equals(item.code, code)) {
                return item.name;
            }
        }
        return null;
    }
}