yxh
昨天 fce96ef468291fb9a0e6a4d34ab371315e9485d4
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/enums/ActionTypeEnum.java
@@ -3,19 +3,55 @@
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.List;
/**
 * Action类型枚举
 * 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", "申请单创建"),
    S0202ECG("S0202ECG", "申请单更新"),
    S040501HIS("S040501HIS", "预约更新"),
    S050401("S050401", "检查预约状态新增"),
    S050501("S050501", "检查预约状态修改");
    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(文档定义,当前未启用,主动兼容)
    /**
     * 类型
@@ -27,17 +63,79 @@
    private final String description;
    /**
     * 根据类型获取枚举
     * 根据类型获取枚举。
     * <p>
     * 兼容处理:入参先去除首尾空白;若未命中,再尝试忽略大小写匹配,
     * 避免因 HIS 侧大小写不一致(如 {@code s0201ecg})导致整条消息被拒。
     *
     * @param type 类型
     * @return 枚举
     * @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.getType().equals(type)) {
            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);
    }
}