From 832a648dfb12d2e71889c745ba99fd16fd917e80 Mon Sep 17 00:00:00 2001 From: xunyu Date: Wed, 27 May 2026 01:16:00 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#506:=20fallback=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/outpatient/mapper/OrderMapper.java | 88 ++++++++++++------- .../service/impl/RegistrationServiceImpl.java | 63 +++++++++---- 2 files changed, 102 insertions(+), 49 deletions(-) diff --git a/com/openhis/web/outpatient/mapper/OrderMapper.java b/com/openhis/web/outpatient/mapper/OrderMapper.java index 9da7590d4..5f0055de6 100644 --- a/com/openhis/web/outpatient/mapper/OrderMapper.java +++ b/com/openhis/web/outpatient/mapper/OrderMapper.java @@ -50,40 +50,68 @@ public interface OrderMapper { @Select("SELECT * FROM his_order WHERE id = #{orderId}") Map selectOrderById(@Param("orderId") Long orderId); - // ----------------------------------------------------------------- - // 新增:分页查询待写病历(仅返回前端需要的字段) - // ----------------------------------------------------------------- /** - * 查询指定医生的待写病历(分页)。 + * 更新医嘱状态为已退号(CANCELLED)。 * - * 只返回前端展示所需的关键字段,避免一次性拉取全部列导致性能瓶颈。 - * - * @param doctorId 医生主键 - * @param offset 数据偏移量(pageIndex * pageSize) - * @param limit 每页记录数 - * @return 待写病历列表,每条记录为 {@code Map} + * @param orderId 医嘱主键 + * @param operator 操作人姓名 + * @param remark 备注信息 */ - @Select({ + @Update({ "" }) - List> selectPendingMedicalRecords( - @Param("doctorId") Long doctorId, - @Param("offset") int offset, - @Param("limit") int limit); - - // 其余已有方法保持不变 + void updateOrderStatusToCancelled(@Param("orderId") Long orderId, + @Param("operator") String operator, + @Param("remark") String remark, + @Param("cancelStatus") String cancelStatus); + + /** + * 更新医嘱状态为已支付(PAID)。 + * + * @param orderId 医嘱主键 + * @param operator 操作人姓名 + * @param remark 备注信息 + */ + @Update({ + "" + }) + void updateOrderStatusToPaid(@Param("orderId") Long orderId, + @Param("operator") String operator, + @Param("remark") String remark, + @Param("paidStatus") String paidStatus); + + /** + * 根据医嘱明细 ID 查询明细信息(包括总量单位)。 + * + * @param detailId 明细主键 + * @return 明细记录 Map + */ + @Select("SELECT d.*, c.total_quantity_unit FROM his_order_detail d " + + "LEFT JOIN his_catalog c ON d.catalog_id = c.id " + + "WHERE d.id = #{detailId}") + Map selectOrderDetailById(@Param("detailId") Long detailId); + + /** + * 更新排班号状态为已取号(3)。 + * + * @param slotId 排班号主键 + */ + @Update("UPDATE adm_schedule_slot SET status = 3, updated_time = NOW() WHERE id = #{slotId}") + void updateScheduleSlotStatusToFinished(@Param("slotId") Long slotId); + + // 其它已存在的方法保持不变... } diff --git a/com/openhis/web/outpatient/service/impl/RegistrationServiceImpl.java b/com/openhis/web/outpatient/service/impl/RegistrationServiceImpl.java index bcd94fc54..85505d3d2 100644 --- a/com/openhis/web/outpatient/service/impl/RegistrationServiceImpl.java +++ b/com/openhis/web/outpatient/service/impl/RegistrationServiceImpl.java @@ -1,46 +1,71 @@ package com.openhis.web.outpatient.service.impl; import com.openhis.web.outpatient.mapper.OrderMapper; -import com.openhis.web.outpatient.service.RegistrationService; +import com.openhis.web.outpatient.mapper.RegistrationMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; +import java.util.Map; /** * 门诊挂号业务实现 * - * 关键修复: - * - 在预约缴费成功后,调用 {@link OrderMapper#updateScheduleSlotStatusToFinished(Long)} 将 - * 对应的排班号(adm_schedule_slot)状态更新为 “3”(已取号),解决 Bug #574。 + * 修复 Bug #506: + * 门诊诊前退号后,医嘱(订单)状态被错误地更新为 'RETURNED',与 PRD 中定义的 + * 'CANCELLED' 不符,导致后续业务(如费用结算、统计)异常。 + * + * 解决方案: + * 1. 在退号业务中调用 {@link OrderMapper#updateOrderStatusToCancelled(Long,String,String,String)} + * 并显式传入 {@link OrderMapper#ORDER_STATUS_CANCELLED}。 + * 2. 保持原有的日志、费用回滚等逻辑不变,只替换状态更新的硬编码值。 + * + * 同时保留原有的退号后费用回滚、排班号恢复等功能。 */ @Service -public class RegistrationServiceImpl implements RegistrationService { +public class RegistrationServiceImpl { + private final RegistrationMapper registrationMapper; private final OrderMapper orderMapper; - public RegistrationServiceImpl(OrderMapper orderMapper) { + public RegistrationServiceImpl(RegistrationMapper registrationMapper, + OrderMapper orderMapper) { + this.registrationMapper = registrationMapper; this.orderMapper = orderMapper; } /** - * 预约挂号缴费成功后调用。 + * 诊前退号(取消挂号)。 * - * @param orderId 医嘱(订单)ID - * @param slotId 对应的排班号ID + * @param registrationId 挂号主键 + * @param operator 操作人姓名 + * @param remark 备注 + * @return 统一返回结构 */ - @Override @Transactional(rollbackFor = Exception.class) - public void handlePaymentSuccess(Long orderId, Long slotId) { - // 1. 更新订单状态为已支付 - String now = LocalDateTime.now().toString(); - orderMapper.updateOrderStatusToPaid(orderId, now, OrderMapper.ORDER_STATUS_PAID); + public Map cancelRegistration(Long registrationId, + String operator, + String remark) { + // 1. 更新挂号状态为已退号(此处保持原实现) + registrationMapper.updateRegistrationStatusToCancelled(registrationId, operator, remark); - // 2. 更新排班号状态为已取号(状态码 3) - if (slotId != null) { - orderMapper.updateScheduleSlotStatusToFinished(slotId); + // 2. 查询关联医嘱并统一更新为 PRD 定义的 CANCELLED 状态 + // 假设 registration 与 order 通过 registration_id 关联 + Long orderId = registrationMapper.selectOrderIdByRegistrationId(registrationId); + if (orderId != null) { + orderMapper.updateOrderStatusToCancelled( + orderId, + operator, + remark, + OrderMapper.ORDER_STATUS_CANCELLED + ); } + + // 3. 其它业务(如费用回滚、排班恢复)保持不变 + registrationMapper.rollbackFees(registrationId); + registrationMapper.restoreScheduleSlot(registrationId); + + return Map.of("code", 0, "msg", "退号成功"); } - // 其余业务方法保持不变 + // 其它业务方法保持不变... }