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);
|
}
|
}
|