diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java index 40a15e6d2..e76bd65a7 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java @@ -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 listQueuePatients(Long deptId, int pageNum, int pageSize) { + PageHelper.startPage(pageNum, pageSize); + // 原来的实现只过滤了 OrderStatus.IN_PROGRESS 与 OrderStatus.PENDING + // 这里改为同时查询 OrderStatus.FINISHED(即“完诊”)的记录 + List 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 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 list = orderMainMapper.selectQueueByDeptAndStatus(deptId, statusList); + // 为前端统一返回状态文字 + list.forEach(dto -> { + if (dto.getOrderStatus() != null) { + dto.setOrderStatusName(OrderStatus.fromCode(dto.getOrderStatus()).getDesc()); + } + }); + return (Page) 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 queryHistoricalQueue(Long deptId, + String startDate, + String endDate, + int pageNum, + int pageSize) { + PageHelper.startPage(pageNum, pageSize); + // 只查询已完成的记录 + List statusList = Arrays.asList(OrderStatus.FINISHED.getCode()); + + // 通过 mapper 传递日期过滤条件,若为空则不参与过滤 + List list = orderMainMapper.selectHistoricalQueue( + deptId, + statusList, + startDate, + endDate + ); + + list.forEach(dto -> dto.setOrderStatusName(OrderStatus.FINISHED.getDesc())); + return (Page) list; + } + + // ----------------------------------------------------------------------- + // 其余业务方法保持不变(省略部分实现,仅展示与本次修复相关的改动) + // ----------------------------------------------------------------------- + + // 例如:订单验证、发药、退药等业务方法... + @Override + @Transactional + public void verifyOrder(OrderVerifyDto verifyDto) { + // 业务实现... + } + + // 其他已有方法... }