96 lines
3.9 KiB
Java
96 lines
3.9 KiB
Java
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;
|
||
|
||
/**
|
||
* 医嘱(订单)数据访问层
|
||
*
|
||
* 修复说明:
|
||
* 住院发退药业务中,发药明细(his_dispense_detail)与发药汇总单(his_dispense_summary)在
|
||
* 同一事务内完成,但原有的 SQL 只更新了明细表,导致汇总单的状态延迟更新,出现
|
||
* “发药明细触发时机早于发药汇总单” 的业务脱节风险(Bug #503)。
|
||
*
|
||
* 为了保证两张表的状态同步更新,新增了统一的批量更新方法 {@link #updateDispenseStatusBatch}
|
||
* 通过一次 SQL 同时更新明细表和汇总表的状态、操作人及更新时间。业务层只需调用该方法即可
|
||
* 保证数据一致性。
|
||
*
|
||
* 同时保留原有的单表更新方法,以兼容其他业务场景。
|
||
*/
|
||
@Mapper
|
||
public interface OrderMapper {
|
||
|
||
/** PRD 中定义的医嘱取消状态 */
|
||
String ORDER_STATUS_CANCELLED = "CANCELLED";
|
||
|
||
/** PRD 中定义的已支付状态 */
|
||
String ORDER_STATUS_PAID = "PAID";
|
||
|
||
/** PRD 中定义的已退回状态 */
|
||
String ORDER_STATUS_RETURNED = "RETURNED";
|
||
|
||
/**
|
||
* 根据医嘱 ID 查询完整医嘱信息(用于状态校验)。
|
||
*
|
||
* @param orderId 医嘱主键
|
||
* @return 包含医嘱所有字段的 Map,若不存在返回 null
|
||
*/
|
||
@Select("SELECT * FROM his_order WHERE id = #{orderId}")
|
||
Map<String, Object> selectOrderById(@Param("orderId") Long orderId);
|
||
|
||
/**
|
||
* 将医嘱状态更新为指定状态(常用于 CANCELLED、PAID、RETURNED 等)。
|
||
*
|
||
* @param orderId 医嘱主键
|
||
* @param status 目标状态,建议使用常量 {@link #ORDER_STATUS_CANCELLED}、{@link #ORDER_STATUS_PAID} 等
|
||
* @param operator 操作人姓名
|
||
*/
|
||
@Update("UPDATE his_order SET status = #{status}, updated_by = #{operator}, updated_time = NOW() " +
|
||
"WHERE id = #{orderId}")
|
||
int updateOrderStatus(@Param("orderId") Long orderId,
|
||
@Param("status") String status,
|
||
@Param("operator") String operator);
|
||
|
||
/**
|
||
* 批量更新住院发药明细表和发药汇总单表的状态、操作人及更新时间。
|
||
*
|
||
* 业务说明:
|
||
* - 当发药完成或退药时,需要同时修改 his_dispense_detail 与 his_dispense_summary 两张表。
|
||
* - 通过一次 SQL 同时更新两张表,避免因事务提交顺序导致的状态不一致。
|
||
*
|
||
* @param dispenseIds 需要更新的发药明细 ID 列表(对应 his_dispense_detail.id)
|
||
* @param summaryIds 对应的发药汇总单 ID 列表(对应 his_dispense_summary.id)
|
||
* @param status 目标状态,例如 'DISPENSED'、'RETURNED' 等
|
||
* @param operator 操作人姓名
|
||
* @return 受影响的行数(明细表 + 汇总表)
|
||
*/
|
||
@Update({
|
||
"<script>",
|
||
"UPDATE his_dispense_detail",
|
||
"SET status = #{status}, updated_by = #{operator}, updated_time = NOW()",
|
||
"WHERE id IN",
|
||
"<foreach collection='dispenseIds' item='id' open='(' separator=',' close=')'>",
|
||
" #{id}",
|
||
"</foreach>;",
|
||
"",
|
||
"UPDATE his_dispense_summary",
|
||
"SET status = #{status}, updated_by = #{operator}, updated_time = NOW()",
|
||
"WHERE id IN",
|
||
"<foreach collection='summaryIds' item='sid' open='(' separator=',' close=')'>",
|
||
" #{sid}",
|
||
"</foreach>",
|
||
"</script>"
|
||
})
|
||
int updateDispenseStatusBatch(@Param("dispenseIds") List<Long> dispenseIds,
|
||
@Param("summaryIds") List<Long> summaryIds,
|
||
@Param("status") String status,
|
||
@Param("operator") String operator);
|
||
|
||
// 其余已有方法保持不变
|
||
}
|