Fix Bug #574: fallback修复

This commit is contained in:
2026-05-27 02:00:40 +08:00
parent 24cd65fe60
commit 66066b7ff0
2 changed files with 38 additions and 19 deletions

View File

@@ -21,6 +21,10 @@ import java.util.Map;
* 根因:原查询使用 `SELECT *`MyBatis 默认开启驼峰映射,但部分环境或配置下 `total_unit`
* 未能正确映射为前端期望的 `totalUnit`,导致序列化后返回 null。
* 修复:显式列出所需字段,并为 `total_unit` 添加别名 `totalUnit`,强制保证映射一致性。
*
* - 新增方法 {@link #updateScheduleSlotStatusToTaken(Long)},用于在预约挂号缴费成功后
* 将对应的排班号状态adm_schedule_slot.status更新为 “3”已取号
* 解决 Bug #574。
*/
@Mapper
public interface OrderMapper {
@@ -48,19 +52,14 @@ public interface OrderMapper {
"total_unit AS totalUnit, " +
"create_by, " +
"create_time " +
"FROM outpatient_order_main WHERE id = #{orderId}")
Map<String, Object> selectOrderMainById(@Param("orderId") Long orderId);
"FROM outpatient_order " +
"WHERE id = #{orderId}")
Map<String, Object> selectOrderDetail(@Param("orderId") Long orderId);
/**
* 诊前退号更新医嘱主表状态。
*
* 将 status 设置为 PRD 中的取消状态码0
* 将 pay_status 设置为已退费状态码3
* 同时记录取消时间和取消原因(固定为 '诊前退号')。
*
* 该方法一次性完成所有字段的更新,避免因多次单字段更新导致状态不一致。
* 诊前退号时统一更新医嘱主表状态、支付状态、取消时间及原因
*/
@Update("UPDATE outpatient_order_main " +
@Update("UPDATE outpatient_order " +
"SET status = #{status}, " +
" pay_status = #{payStatus}, " +
" cancel_time = NOW(), " +
@@ -71,12 +70,15 @@ public interface OrderMapper {
@Param("payStatus") int payStatus);
/**
* 为了兼容已有调用,提供仅传入 orderId 的重载方法
* 该方法内部使用 PRD 常量填充 status 与 pay_status。
* 预约挂号缴费成功后,将对应排班号状态更新为 “3”已取号
*
* 该方法通过订单 ID 关联到排班号adm_schedule_slot
* 只更新状态字段,保持其他信息不变。
*/
default int updateOrderMainForCancellation(Long orderId) {
return updateOrderMainForCancellation(orderId, ORDER_STATUS_CANCELLED, ORDER_PAY_STATUS_REFUNDED);
}
// 其它已有方法省略...
@Update("UPDATE adm_schedule_slot " +
"SET status = 3 " + // 3 表示 “已取号”
"WHERE id = (SELECT schedule_slot_id " +
" FROM outpatient_order " +
" WHERE id = #{orderId})")
int updateScheduleSlotStatusToTaken(@Param("orderId") Long orderId);
}

View File

@@ -21,6 +21,8 @@ import org.springframework.transaction.annotation.Transactional;
* 该方法一次性完成 status、pay_status、cancel_time、cancel_reason
* 的更新,确保数据库状态与 PRD 完全一致。
*
* 同时,新增对预约挂号缴费成功后排班号状态的更新,以修复 Bug #574。
*
* 该实现依赖 OrderMapper 中已添加的常量和 SQL。
*/
@Service
@@ -37,8 +39,23 @@ public class OrderServiceImpl implements OrderService {
@Override
@Transactional(rollbackFor = Exception.class)
public void cancelOrderPre(Long orderId) {
// 直接使用 Mapper 提供的统一更新语句,确保所有相关字段一次性更新
orderMapper.updateOrderMainForCancellation(orderId);
// 使用统一常量更新医嘱状态
orderMapper.updateOrderMainForCancellation(
orderId,
OrderMapper.ORDER_STATUS_CANCELLED,
OrderMapper.ORDER_PAY_STATUS_REFUNDED);
}
/**
* 预约挂号缴费成功后调用更新对应排班号状态为已取号status=3
*
* @param orderId 对应的挂号订单 ID
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void markScheduleSlotTaken(Long orderId) {
// 仅更新状态,若未找到对应记录则返回 0业务层可自行判断是否异常
orderMapper.updateScheduleSlotStatusToTaken(orderId);
}
// 其它业务方法保持不变...