yxh
6 天以前 68ff33beff11310e830b0615b5a81f83fad0f683
jh-module-ecg/jh-module-ecg-api/src/main/java/cn/lihu/jh/module/ecg/enums/ErrorCodeConstants.java
@@ -17,16 +17,63 @@
    ErrorCode APPOINTMENT_EXIST_TODAY = new ErrorCode(1_010_001_020, "当天预约已存在");
    ErrorCode APPOINTMENT_HAVE_QUEUED = new ErrorCode(1_010_001_030, "您已经在排队中了");
    ErrorCode APPOINTMENT_NOT_BILLING = new ErrorCode(1_010_001_040, "查询不到开单信息");
    ErrorCode APPOINTMENT_CREATE_FAIL = new ErrorCode(1_010_001_050, "申请单创建失败");
    ErrorCode APPOINTMENT_UPDATE_FAIL = new ErrorCode(1_010_001_060, "申请单更新失败");
    ErrorCode APPOINTMENT_STATUS_UPDATE_FAIL = new ErrorCode(1_010_001_070, "申请单状态更新失败");
    ErrorCode APPOINTMENT_STATUS_REGISTER_UPDATE_FAIL = new ErrorCode(1_010_001_080, "申请单登记状态更新失败");
    // ========== HIS 通用接口(/ecg/external/generalInterface)新增错误码 ==========
    // 目的:原实现把所有异常统一压成 APPOINTMENT_CREATE_FAIL,
    // 导致 HIS 侧无法区分问题类型(本次排障成本即来自此)。以下按时段细分。
    ErrorCode HIS_ACTION_NOT_SUPPORTED = new ErrorCode(1_010_001_090, "不支持的服务代码(action),请核对接口文档交易编号");
    ErrorCode HIS_MESSAGE_PARSE_FAIL = new ErrorCode(1_010_001_100, "报文解析失败,请核对报文结构与必填字段");
    ErrorCode HIS_APPLY_NO_MISSING = new ErrorCode(1_010_001_110, "报文缺少申请单号");
    ErrorCode HIS_APPOINTMENT_NOT_FOUND = new ErrorCode(1_010_001_120, "未找到对应的预约记录");
    ErrorCode HIS_STATUS_INVALID = new ErrorCode(1_010_001_130, "检查状态编码不在编码表范围内");
    ErrorCode HIS_NOT_ECG_ORDER = new ErrorCode(1_010_001_140, "非心电业务单,已跳过处理");
    ErrorCode ROOM_NOT_EXISTS = new ErrorCode(1_010_002_000, "诊室和诊疗床不存在");
    ErrorCode ROOM_NOT_SIT = new ErrorCode(1_010_002_001, "请重新就座");
    ErrorCode ROOM_INVALID_STATUS = new ErrorCode(1_010_002_001, "诊室和诊疗床状态异常");
    /**
     * 入座被拒:该工位已被**其他医生**占用(本次新增)。
     *
     * <p>背景:原来这种情况也返回 {@link #ROOM_INVALID_STATUS}("诊室和诊疗床状态异常"),
     * 现场看到这句话无法判断是"工位被人占了"还是"状态不对",排障成本高。
     * 独立成码后,前端可直接提示"该工位已由其他医生操作中",并刷新列表。
     */
    ErrorCode ROOM_OCCUPIED_BY_OTHER = new ErrorCode(1_010_002_002,
            "该工位已由其他医生操作中,不能入座;请刷新后选择空闲工位");
    /**
     * 围观模式:当前登录人不是该工位的主人,不能执行**写**操作(本次新增)。
     *
     * <p>背景:引入"围观"后任何登录用户都能查看任意已开放工位的数据(只读),
     * 但叫号、过号、完成检查、确费、领用、装机等写操作只能由该工位主人执行。
     * 前端禁用按钮只是界面约定,服务端由 {@code @RequireBedOwner} 切面统一拦截。
     */
    ErrorCode ROOM_NOT_OWNER = new ErrorCode(1_010_002_003,
            "当前工位由其他医生操作中,您处于围观模式,不能执行该操作");
    ErrorCode QUEUE_NOT_EXISTS = new ErrorCode(1_010_003_000, "排队不存在");
    ErrorCode QUEUE_BED_NOT_EXIST = new ErrorCode(1_010_003_001, "工位队列不存在");
    ErrorCode QUEUE_BED_EXIST = new ErrorCode(1_010_003_002, "工位队列已存在");
    ErrorCode QUEUE_HAVE_PATIENT = new ErrorCode(1_010_003_003, "队列中有患者");
    ErrorCode QUEUE_NOT_READY_PATIENT = new ErrorCode(1_010_003_004, "没有准备中的患者");
    ErrorCode QUEUE_RECALL_INSTALL_NOT_CUR_ROOM = new ErrorCode(1_010_003_005, "不能召回其他诊室的安装患者");
    /**
     * 「停止候诊」功能未就绪。
     * <p>
     * 触发条件:数据库尚未执行 `_prep/11_需求升级_汇总SQL.sql`(缺 `clinic_room.stop_ready` 列)。
     * 用独立错误码而非把原始 SQL 异常抛给前端,便于现场快速定位部署遗漏。
     */
    ErrorCode QUEUE_STOP_READY_NOT_CONFIGURED = new ErrorCode(1_010_003_006,
            "停止候诊功能未配置,请先执行数据库升级脚本(clinic_room.stop_ready)");
    /** 手工"拉入排队患者"时:该患者已不在「排队中」(被别的工位拉走/已叫号) */
    ErrorCode QUEUE_NOT_WAITING = new ErrorCode(1_010_003_007,
            "该患者已不在排队中(可能已被其他工位拉入),请刷新后重试");
    /** 手工"拉入排队患者"时:检查项目不在本工位开展范围内 */
    ErrorCode QUEUE_CHECK_TYPE_NOT_MATCH = new ErrorCode(1_010_003_008,
            "该患者的检查项目不在本工位开展范围内,不能拉入");
    ErrorCode PATIENT_NOT_EXISTS = new ErrorCode(1_010_004_000, "患者不存在");
@@ -34,6 +81,7 @@
    ErrorCode DEVICE_NOT_EXISTS = new ErrorCode(1_010_005_001,  "设备不存在");
    ErrorCode DEVICE_NOT_FREE = new ErrorCode(1_010_005_002,  "设备非空闲或不存在");
    ErrorCode DEVICE_NOT_RECEIVED = new ErrorCode(1_010_005_003,  "设备未领用或不存在");
    ErrorCode DEVICE_NOT_PAT_RECEIVED = new ErrorCode(1_010_005_004,  "不是该患者领用的设备");
    ErrorCode DEV_INSTALL_NOT_EXISTS = new ErrorCode(1_010_006_000, "装机不存在");
    ErrorCode DEV_INSTALL_EXCEPTION = new ErrorCode(1_010_006_001, "装机内部错误");
@@ -54,4 +102,20 @@
    ErrorCode CALL_NOT_EXISTS = new ErrorCode(1_010_008_000, "叫号不存在");
    ErrorCode CHECK_TYPE_NOT_EXISTS = new ErrorCode(1_010_009_000, "检查类型不存在");
    ErrorCode QUEUE_SEQUENCE_NOT_EXISTS = new ErrorCode(1_010_010_000, "当天序号不存在");
    ErrorCode QUEUE_SEQUENCE_TIMESLOT_FULL = new ErrorCode(1_010_010_002, "本时段序号已满");
    ErrorCode QUEUE_SEQUENCE_TIMESLOT_EXCEPTION = new ErrorCode(1_010_010_002, "本时段序号异常");
    ErrorCode QUEUE_SEQUENCE_TIMESLOT_VIP_FULL = new ErrorCode(1_010_010_003, "本时段VIP序号已满");
    ErrorCode QUEUE_SEQUENCE_TIMESLOT_VIP_EXCEPTION = new ErrorCode(1_010_010_003, "本时段VIP序号异常");
    /**
     * 预约时段重复:同一检查类型下同一个时段只能有一条规则。
     * <p>
     * 表上**没有** (check_type, time_slot) 唯一约束(历史遗留),而取号 SQL
     * {@code select queue_no ... where check_type=? and time_slot=? ... for update}
     * 期望只命中一行;若存在重复行,取号行为不可预期。故在维护入口处拦截。
     */
    ErrorCode QUEUE_SEQUENCE_TIMESLOT_DUPLICATE = new ErrorCode(1_010_010_004,
            "该检查类型的此时段规则已存在,请勿重复添加");
}