package cn.lihu.jh.module.ecg.enums; import lombok.AllArgsConstructor; import lombok.Getter; import java.util.Arrays; import java.util.List; /** * HIS 报文 header 中 action 的取值枚举。 * *

关于 PACS / ECG 的 action 区分

* 院方《交互服务通用接口文档》中,同一服务在不同系统下使用**不同的交易编号**: *
 *   6.4 检查预约状态新增:S050401(pacs) / S050402(ECG)
 *   6.5 检查预约状态更新:S050501(pacs) / S050502(ECG)
 * 
* *

实测结论(2026-09-17 日志,共 1753 条请求):实际到达的 action 只有 * {@code S0405}、{@code S050401}、{@code S0201ECG}、{@code S0202ECG}、 * {@code S050501}、{@code S040501HIS} 六种,其中 * {@code S050402} 与 {@code S050502} 出现 0 次。 * 即院方当前走的是 pacs 编号,ECG 专属编号尚未启用。 * *

为了在院方切换编号时不丢消息,这里**同时注册两种编号**(主动兼容), * 并额外兼容申请单新增/更新的无后缀写法 {@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; /** * 根据类型获取枚举。 *

* 兼容处理:入参先去除首尾空白;若未命中,再尝试忽略大小写匹配, * 避免因 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 APPLY_CREATE_ACTIONS = Arrays.asList(S0201ECG, S0201); /** 申请单更新类 action(含无后缀兼容写法) */ public static final List APPLY_UPDATE_ACTIONS = Arrays.asList(S0202ECG, S0202); /** 申请单状态更新类 action(全院通用) */ public static final List APPLY_STATUS_ACTIONS = Arrays.asList(S040501HIS, S0405HIS, S0405); /** 检查预约状态新增类 action(pacs + ECG) */ public static final List APPOINTMENT_STATUS_CREATE_ACTIONS = Arrays.asList(S050401, S050402); /** 检查预约状态更新类 action(pacs + ECG) */ public static final List 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); } }