yxh
昨天 fce96ef468291fb9a0e6a4d34ab371315e9485d4
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
139
140
141
package cn.lihu.jh.module.ecg.enums;
 
import lombok.AllArgsConstructor;
import lombok.Getter;
 
import java.util.Arrays;
import java.util.List;
 
/**
 * HIS 报文 header 中 action 的取值枚举。
 *
 * <h3>关于 PACS / ECG 的 action 区分</h3>
 * 院方《交互服务通用接口文档》中,同一服务在不同系统下使用**不同的交易编号**:
 * <pre>
 *   6.4 检查预约状态新增:S050401(pacs) / S050402(ECG)
 *   6.5 检查预约状态更新:S050501(pacs) / S050502(ECG)
 * </pre>
 *
 * <p><b>实测结论(2026-09-17 日志,共 1753 条请求)</b>:实际到达的 action 只有
 * {@code S0405}、{@code S050401}、{@code S0201ECG}、{@code S0202ECG}、
 * {@code S050501}、{@code S040501HIS} 六种,其中
 * <b>{@code S050402} 与 {@code S050502} 出现 0 次</b>。
 * 即院方当前走的是 pacs 编号,ECG 专属编号尚未启用。
 *
 * <p>为了在院方切换编号时不丢消息,这里**同时注册两种编号**(主动兼容),
 * 并额外兼容申请单新增/更新的无后缀写法 {@code S0201} / {@code S0202}
 * (文档只定义了无后缀形式,而实测报文带 {@code ECG} 后缀)。
 *
 * @author 心电排队装机系统
 */
@Getter
@AllArgsConstructor
public enum ActionTypeEnum {
 
    // ---------- 6.1 申请单新增(文档为 S0201,实测报文为 S0201ECG,两种都兼容) ----------
    S0201ECG("S0201ECG", "申请单创建"),
    S0201("S0201", "申请单创建"),
 
    // ---------- 6.2 申请单更新(文档为 S0202,实测报文为 S0202ECG) ----------
    S0202ECG("S0202ECG", "申请单更新"),
    S0202("S0202", "申请单更新"),
 
    // ---------- 6.3 申请单状态更新(全院通用,不区分科室) ----------
    S040501HIS("S040501HIS", "预约更新"),
    S0405HIS("S0405HIS", "申请单状态更新"),
    S0405("S0405", "申请单登记状态更新"),
 
    // ---------- 6.4 检查预约状态新增(pacs / ECG 两种编号都接收) ----------
    S050401("S050401", "检查预约状态新增"),   // pacs
    S050402("S050402", "检查预约状态新增"),   // ECG(文档定义,当前未启用,主动兼容)
 
    // ---------- 6.5 检查预约状态更新(pacs / ECG 两种编号都接收) ----------
    S050501("S050501", "检查预约状态修改"),   // pacs
    S050502("S050502", "检查预约状态修改");   // ECG(文档定义,当前未启用,主动兼容)
 
    /**
     * 类型
     */
    private final String type;
    /**
     * 描述
     */
    private final String description;
 
    /**
     * 根据类型获取枚举。
     * <p>
     * 兼容处理:入参先去除首尾空白;若未命中,再尝试忽略大小写匹配,
     * 避免因 HIS 侧大小写不一致(如 {@code s0201ecg})导致整条消息被拒。
     *
     * @param type action 值
     * @return 枚举;无法识别时返回 null
     */
    public static ActionTypeEnum getByType(String type) {
        if (type == null) {
            return null;
        }
        String trimmed = type.trim();
        if (trimmed.isEmpty()) {
            return null;
        }
        // 1. 精确匹配
        for (ActionTypeEnum value : values()) {
            if (value.type.equals(trimmed)) {
                return value;
            }
        }
        // 2. 忽略大小写兜底
        for (ActionTypeEnum value : values()) {
            if (value.type.equalsIgnoreCase(trimmed)) {
                return value;
            }
        }
        return null;
    }
 
    /** 申请单新增类 action(含无后缀兼容写法) */
    public static final List<ActionTypeEnum> APPLY_CREATE_ACTIONS =
            Arrays.asList(S0201ECG, S0201);
 
    /** 申请单更新类 action(含无后缀兼容写法) */
    public static final List<ActionTypeEnum> APPLY_UPDATE_ACTIONS =
            Arrays.asList(S0202ECG, S0202);
 
    /** 申请单状态更新类 action(全院通用) */
    public static final List<ActionTypeEnum> APPLY_STATUS_ACTIONS =
            Arrays.asList(S040501HIS, S0405HIS, S0405);
 
    /** 检查预约状态新增类 action(pacs + ECG) */
    public static final List<ActionTypeEnum> APPOINTMENT_STATUS_CREATE_ACTIONS =
            Arrays.asList(S050401, S050402);
 
    /** 检查预约状态更新类 action(pacs + ECG) */
    public static final List<ActionTypeEnum> APPOINTMENT_STATUS_UPDATE_ACTIONS =
            Arrays.asList(S050501, S050502);
 
    /** 是否为申请单新增 */
    public boolean isApplyCreate() {
        return APPLY_CREATE_ACTIONS.contains(this);
    }
 
    /** 是否为申请单更新 */
    public boolean isApplyUpdate() {
        return APPLY_UPDATE_ACTIONS.contains(this);
    }
 
    /** 是否为申请单状态更新(全院通用流,需要按心电业务过滤) */
    public boolean isApplyStatusUpdate() {
        return APPLY_STATUS_ACTIONS.contains(this);
    }
 
    /** 是否为检查预约状态新增 */
    public boolean isAppointmentStatusCreate() {
        return APPOINTMENT_STATUS_CREATE_ACTIONS.contains(this);
    }
 
    /** 是否为检查预约状态更新 */
    public boolean isAppointmentStatusUpdate() {
        return APPOINTMENT_STATUS_UPDATE_ACTIONS.contains(this);
    }
}