Fix Bug #503: fallback修复
This commit is contained in:
@@ -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);
|
||||
|
||||
// 其它已有方法保持不变...
|
||||
// 其余已有方法保持不变
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user