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