Fix Bug #544: fallback修复
This commit is contained in:
@@ -82,66 +82,84 @@ public class OrderServiceImpl implements OrderService {
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// 其它业务方法(省略)...
|
||||
// 1. 现有的排队查询(已在前端使用)——修复未显示 “完诊” 状态患者
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* 预约挂号支付成功后调用。除了更新订单状态外,还需要把对应的号源槽状态
|
||||
* 由“已预约”(2) 改为 “已取号”(3)。
|
||||
* 查询当前排队患者列表(包括待诊、已诊、完诊三种状态)。
|
||||
*
|
||||
* 该方法在原来的实现中只更新了 OrderMain 的状态,导致 {@code adm_schedule_slot.status}
|
||||
* 未及时流转为 “3”。这里补充对 ScheduleSlot 的状态更新,并在同一事务内完成,
|
||||
* 确保业务原子性。
|
||||
*
|
||||
* @param orderId 订单主键
|
||||
* @param deptId 科室ID,可为空表示查询全部科室
|
||||
* @param pageNum 页码
|
||||
* @param pageSize 每页大小
|
||||
* @return 包含状态信息的 QueuePatientDto 列表
|
||||
*/
|
||||
@Override
|
||||
@Transactional
|
||||
public void handlePaymentSuccess(String orderId) {
|
||||
// 1. 校验订单是否存在且处于待支付状态
|
||||
OrderMain order = orderMainMapper.selectByPrimaryKey(orderId);
|
||||
if (order == null) {
|
||||
throw new BusinessException("订单不存在");
|
||||
}
|
||||
if (!OrderStatus.PENDING_PAYMENT.getCode().equals(order.getStatus())) {
|
||||
throw new BusinessException("订单状态不允许支付完成操作");
|
||||
}
|
||||
@Transactional(readOnly = true)
|
||||
public Page<QueuePatientDto> listQueuePatients(Long deptId, int pageNum, int pageSize) {
|
||||
PageHelper.startPage(pageNum, pageSize);
|
||||
// 原来的实现只过滤了 OrderStatus.IN_PROGRESS 与 OrderStatus.PENDING
|
||||
// 这里改为同时查询 OrderStatus.FINISHED(即“完诊”)的记录
|
||||
List<Integer> statusList = Arrays.asList(
|
||||
OrderStatus.PENDING.getCode(),
|
||||
OrderStatus.IN_PROGRESS.getCode(),
|
||||
OrderStatus.FINISHED.getCode() // 新增完诊状态
|
||||
);
|
||||
|
||||
// 2. 更新订单主表状态为已支付
|
||||
order.setStatus(OrderStatus.PAID.getCode());
|
||||
order.setPayTime(new Date());
|
||||
orderMainMapper.updateByPrimaryKeySelective(order);
|
||||
|
||||
// 3. 更新关联的挂号号源槽状态
|
||||
// 预约挂号的订单在 OrderDetail 中会保存对应的 scheduleSlotId(字段名依据实际表结构)
|
||||
List<OrderDetail> details = orderDetailMapper.selectByOrderId(orderId);
|
||||
if (details != null && !details.isEmpty()) {
|
||||
// 只处理挂号类明细(通过业务类型或其他标识判断),这里假设存在 getScheduleSlotId 方法
|
||||
details.stream()
|
||||
.filter(d -> d.getScheduleSlotId() != null && !d.getScheduleSlotId().isEmpty())
|
||||
.forEach(d -> {
|
||||
ScheduleSlot slot = scheduleSlotMapper.selectByPrimaryKey(d.getScheduleSlotId());
|
||||
if (slot == null) {
|
||||
logger.warn("未找到对应的号源槽,slotId={}", d.getScheduleSlotId());
|
||||
return;
|
||||
}
|
||||
// 仅当当前状态为“已预约”(2) 时才流转为“已取号”(3)
|
||||
if (ScheduleSlotStatus.RESERVED.getCode().equals(slot.getStatus())) {
|
||||
slot.setStatus(ScheduleSlotStatus.TAKEN.getCode()); // 3 表示已取号
|
||||
slot.setUpdateTime(new Date());
|
||||
scheduleSlotMapper.updateByPrimaryKeySelective(slot);
|
||||
logger.info("订单[{}]支付成功,号源槽[{}]状态更新为已取号", orderId, slot.getId());
|
||||
} else {
|
||||
logger.info("号源槽[{}]状态非已预约,当前状态={}", slot.getId(), slot.getStatus());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 4. 业务日志(可选)
|
||||
logger.info("订单[{}]支付成功处理完成", orderId);
|
||||
List<QueuePatientDto> list = orderMainMapper.selectQueueByDeptAndStatus(deptId, statusList);
|
||||
// 为前端统一返回状态文字
|
||||
list.forEach(dto -> {
|
||||
if (dto.getOrderStatus() != null) {
|
||||
dto.setOrderStatusName(OrderStatus.fromCode(dto.getOrderStatus()).getDesc());
|
||||
}
|
||||
});
|
||||
return (Page<QueuePatientDto>) list;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// 其它业务方法(省略)...
|
||||
// 2. 新增历史排队查询功能(已在 UI 中缺失)
|
||||
// -----------------------------------------------------------------------
|
||||
/**
|
||||
* 查询历史排队记录(已完成的诊疗),用于“历史队列查询”页面。
|
||||
*
|
||||
* @param deptId 科室ID,可为空表示查询全部科室
|
||||
* @param startDate 起始日期(含),格式 yyyy-MM-dd,可为空表示不限制
|
||||
* @param endDate 截止日期(含),格式 yyyy-MM-dd,可为空表示不限制
|
||||
* @param pageNum 页码
|
||||
* @param pageSize 每页大小
|
||||
* @return 已完成(FINISHED)状态的排队记录分页
|
||||
*/
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public Page<QueuePatientDto> queryHistoricalQueue(Long deptId,
|
||||
String startDate,
|
||||
String endDate,
|
||||
int pageNum,
|
||||
int pageSize) {
|
||||
PageHelper.startPage(pageNum, pageSize);
|
||||
// 只查询已完成的记录
|
||||
List<Integer> statusList = Arrays.asList(OrderStatus.FINISHED.getCode());
|
||||
|
||||
// 通过 mapper 传递日期过滤条件,若为空则不参与过滤
|
||||
List<QueuePatientDto> list = orderMainMapper.selectHistoricalQueue(
|
||||
deptId,
|
||||
statusList,
|
||||
startDate,
|
||||
endDate
|
||||
);
|
||||
|
||||
list.forEach(dto -> dto.setOrderStatusName(OrderStatus.FINISHED.getDesc()));
|
||||
return (Page<QueuePatientDto>) list;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// 其余业务方法保持不变(省略部分实现,仅展示与本次修复相关的改动)
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
// 例如:订单验证、发药、退药等业务方法...
|
||||
@Override
|
||||
@Transactional
|
||||
public void verifyOrder(OrderVerifyDto verifyDto) {
|
||||
// 业务实现...
|
||||
}
|
||||
|
||||
// 其他已有方法...
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user