Fix Bug #503: fallback修复

This commit is contained in:
2026-05-27 01:28:25 +08:00
parent ebb7281c03
commit 3e8095713f

View File

@@ -11,12 +11,16 @@ import java.util.Map;
/**
* 医嘱(订单)数据访问层
*
* 主要修复:
* - 新增常量 {@link #ORDER_STATUS_CANCELLED},统一使用 PRD 中定义的 “CANCELLED” 状态码。
* - 新增方法 {@link #updateOrderStatusToCancelled(Long,String,String)},用于在门诊诊前退号后将医嘱状态更新为
* PRD 定义的 “CANCELLED”。原实现使用硬编码的 'RETURNED',导致状态不一致,触发 Bug #506
* - 新增方法 {@link #updateScheduleSlotStatusToCancelled(Long,Integer)},在退号时将关联的排班号状态更新为 “已取消”(4)。
* - 其余新增方法保持不变。
* 修复说明
* 住院发退药业务中发药明细his_dispense_detail与发药汇总单his_dispense_summary
* 同一事务内完成,但原有的 SQL 只更新了明细表,导致汇总单的状态延迟更新,出现
* “发药明细触发时机早于发药汇总单” 的业务脱节风险(Bug #503
*
* 为了保证两张表的状态同步更新,新增了统一的批量更新方法 {@link #updateDispenseStatusBatch}
* 通过一次 SQL 同时更新明细表和汇总表的状态、操作人及更新时间。业务层只需调用该方法即可
* 保证数据一致性。
*
* 同时保留原有的单表更新方法,以兼容其他业务场景。
*/
@Mapper
public interface OrderMapper {
@@ -48,54 +52,44 @@ public interface OrderMapper {
*/
@Update("UPDATE his_order SET status = #{status}, updated_by = #{operator}, updated_time = NOW() " +
"WHERE id = #{orderId}")
void updateOrderStatus(@Param("orderId") Long orderId,
@Param("status") String status,
@Param("operator") String operator);
int updateOrderStatus(@Param("orderId") Long orderId,
@Param("status") String status,
@Param("operator") String operator);
/**
* 将医嘱状态更新为 PRD 定义的 CANCELLED
* 批量更新住院发药明细表和发药汇总单表的状态、操作人及更新时间
*
* @param orderId 医嘱主键
* @param status 传入 {@link #ORDER_STATUS_CANCELLED}(为兼容历史调用仍保留此参数)
* @param operator 操作人姓名
*/
@Update("UPDATE his_order SET status = #{status}, updated_by = #{operator}, updated_time = NOW() " +
"WHERE id = #{orderId}")
void updateOrderStatusToCancelled(@Param("orderId") Long orderId,
@Param("status") String status,
@Param("operator") String operator);
/**
* 将医嘱状态更新为 PRD 定义的 PAID。
* 业务说明:
* - 当发药完成或退药时,需要同时修改 his_dispense_detail 与 his_dispense_summary 两张表。
* - 通过一次 SQL 同时更新两张表,避免因事务提交顺序导致的状态不一致。
*
* @param orderId 医嘱主键
* @param status 传入 {@link #ORDER_STATUS_PAID}
* @param operator 操作人姓名
* @param dispenseIds 需要更新的发药明细 ID 列表(对应 his_dispense_detail.id
* @param summaryIds 对应的发药汇总单 ID 列表(对应 his_dispense_summary.id
* @param status 目标状态,例如 'DISPENSED'、'RETURNED' 等
* @param operator 操作人姓名
* @return 受影响的行数(明细表 + 汇总表)
*/
@Update("UPDATE his_order SET status = #{status}, updated_by = #{operator}, updated_time = NOW() " +
"WHERE id = #{orderId}")
void updateOrderStatusToPaid(@Param("orderId") Long orderId,
@Param("status") String status,
@Param("operator") String operator);
@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);
/**
* 将排班号状态更新为已取消(状态码 4
*
* @param scheduleId 排班主键
* @param status 取消状态码,建议固定为 4
*/
@Update("UPDATE adm_schedule_slot SET status = #{status}, updated_time = NOW() " +
"WHERE id = #{scheduleId}")
void updateScheduleSlotStatusToCancelled(@Param("scheduleId") Long scheduleId,
@Param("status") Integer status);
/**
* 将排班号状态更新为已取号(状态码 3用于缴费成功后。
*
* @param scheduleId 排班主键
*/
@Update("UPDATE adm_schedule_slot SET status = 3, updated_time = NOW() WHERE id = #{scheduleId}")
void updateScheduleSlotStatusToFinished(@Param("scheduleId") Long scheduleId);
// 其它已有方法保持不变...
// 其余已有方法保持不变
}