package com.openhis.web.outpatient.mapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.util.List; import java.util.Map; /** * 检验申请(实验室)数据访问层 * * 修复 Bug #571: * 在检验申请执行“撤回”操作时,原实现直接调用 {@link #updateStatus(Long, String)} 并硬编码 * 为 'RETURNED',导致前端提示 “撤回失败,请检查状态”。实际业务中撤回应将状态改为 * PRD 中统一定义的 “CANCELLED”。同时需要在撤回前校验当前状态只能是 “APPLIED”(已申请) 或 * “PENDING”(待处理),否则抛出明确异常,前端可捕获并展示友好提示。 * * 为此做了以下改动: * 1. 新增常量 {@link #STATUS_CANCELLED},统一使用 PRD 中的取消状态码。 * 2. 新增方法 {@link #withdrawLabApply(Long)},在内部完成状态合法性校验并将状态更新为 * {@link #STATUS_CANCELLED}。 * 3. 将原有的 {@code updateStatus} 方法的 Javadoc 说明为通用状态更新,供内部使用。 */ @Mapper public interface LabApplyMapper { /** 检验申请已撤回(取消)状态 */ String STATUS_CANCELLED = "CANCELLED"; /** 检验申请已申请状态(可撤回) */ String STATUS_APPLIED = "APPLIED"; /** 检验申请待处理状态(可撤回) */ String STATUS_PENDING = "PENDING"; /** * 根据 ID 查询检验申请的完整信息(用于状态校验)。 * * @param applyId 检验申请主键 * @return 包含所有字段的 Map,若不存在返回 null */ @Select("SELECT * FROM his_lab_apply WHERE id = #{applyId}") Map selectApplyById(@Param("applyId") Long applyId); /** * 通用状态更新(内部使用)。 * * @param applyId 检验申请主键 * @param status 新状态码 */ @Update("UPDATE his_lab_apply SET status = #{status}, update_time = NOW() WHERE id = #{applyId}") void updateStatus(@Param("applyId") Long applyId, @Param("status") String status); /** * 撤回检验申请。 * *

业务规则: *

* * @param applyId 检验申请主键 */ default void withdrawLabApply(Long applyId) { Map apply = selectApplyById(applyId); if (apply == null) { throw new RuntimeException("检验申请不存在"); } String currentStatus = (String) apply.get("status"); if (!STATUS_APPLIED.equals(currentStatus) && !STATUS_PENDING.equals(currentStatus)) { throw new RuntimeException("仅在已申请或待处理状态下才能撤回,当前状态为 " + currentStatus); } // 更新为取消状态 updateStatus(applyId, STATUS_CANCELLED); } // 其他已有查询方法保持不变 @Select("SELECT id, patient_id, item_name, status, apply_time FROM his_lab_apply WHERE patient_id = #{patientId}") List> selectByPatientId(@Param("patientId") Long patientId); }