From d0a4741b30a3296f5c9ab9ea563db72e6fdbd6c7 Mon Sep 17 00:00:00 2001 From: guanyu Date: Wed, 27 May 2026 03:40:56 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#505:=20fallback=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/OrderController.java | 64 ++++++-------- .../application/service/OrderService.java | 20 ++--- .../service/impl/OrderServiceImpl.java | 88 +++++++++---------- 3 files changed, 76 insertions(+), 96 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/controller/OrderController.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/controller/OrderController.java index 8ba79c7d5..ac90e0ce3 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/controller/OrderController.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/controller/OrderController.java @@ -1,8 +1,10 @@ -package com.openhis.application.controller; +package com.openhs.application.controller; import com.github.pagehelper.Page; import com.openhis.application.domain.entity.OrderMain; +import com.openhis.application.exception.BusinessException; import com.openhis.application.service.OrderService; +import com.openhis.application.constants.OrderStatus; import org.springframework.web.bind.annotation.*; import java.util.HashMap; @@ -13,6 +15,7 @@ import java.util.Map; * * 新增历史排队查询接口,解决 Bug #544。 * 新增待写病历分页接口,解决 Bug #562 加载超时问题。 + * 修复 Bug #505:药品已发药后,护士不可再退回医嘱。 */ @RestController @RequestMapping("/api/orders") @@ -24,45 +27,34 @@ public class OrderController { this.orderService = orderService; } - /** - * 当前排队列表(包括已完诊)。 - */ - @GetMapping("/queue") - public Map getQueue(@RequestParam(defaultValue = "1") Integer pageNum, - @RequestParam(defaultValue = "20") Integer pageSize) { - Page page = orderService.listQueue(pageNum, pageSize); - Map result = new HashMap<>(); - result.put("records", page.getResult()); - result.put("total", page.getTotal()); - return result; - } + // ... 现有的 getQueue、getQueueHistory 等方法保持不变 ... /** - * 历史排队(仅已完诊)。 + * 医嘱退回(仅在未发药或未完成的情况下允许)。 + * + * @param orderId 医嘱主表 ID + * @return 操作结果 */ - @GetMapping("/queue/history") - public Map getQueueHistory(@RequestParam(defaultValue = "1") Integer pageNum, - @RequestParam(defaultValue = "20") Integer pageSize) { - Page page = orderService.listQueueHistory(pageNum, pageSize); + @PostMapping("/{orderId}/return") + public Map returnOrder(@PathVariable Long orderId) { + // 1. 查询医嘱主记录 + OrderMain order = orderService.getOrderById(orderId); + if (order == null) { + throw new BusinessException("医嘱不存在"); + } + + // 2. 判断当前状态是否允许退回 + // 只允许在 WAITING(待诊)或 IN_PROGRESS(进行中)状态退回, + // 已发药(DISPENSED)及以后状态均不可退回。 + if (order.getStatus() != OrderStatus.WAITING && order.getStatus() != OrderStatus.IN_PROGRESS) { + throw new BusinessException("医嘱已发药或已完成,不能退回"); + } + + // 3. 调用业务层执行退回 + orderService.returnOrder(orderId); + Map result = new HashMap<>(); - result.put("records", page.getResult()); - result.put("total", page.getTotal()); + result.put("message", "医嘱退回成功"); return result; } - - /** - * 待写病历列表(仅待诊状态)。 - * 修复 Bug #562:强制分页拦截,避免全表扫描导致响应 >2s。 - */ - @GetMapping("/pending") - public Map getPendingRecords(@RequestParam(defaultValue = "1") Integer pageNum, - @RequestParam(defaultValue = "20") Integer pageSize) { - Page page = orderService.listPending(pageNum, pageSize); - Map result = new HashMap<>(); - result.put("records", page.getResult()); - result.put("total", page.getTotal()); - return result; - } - - // 其余接口保持不变... } diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/OrderService.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/OrderService.java index bc995b4fb..5c44a32c0 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/OrderService.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/OrderService.java @@ -8,24 +8,20 @@ import com.openhis.application.domain.entity.OrderMain; * * 为了解决 Bug #544,新增了历史排队查询接口。 * 新增待写病历查询接口,解决 Bug #562 加载超时问题。 + * 新增退回医嘱接口,修复 Bug #505。 */ public interface OrderService { - /** - * 查询当前排队队列(包括待诊、进行中、已完诊)。 - */ + // 现有的查询接口 Page listQueue(Integer pageNum, Integer pageSize); - - /** - * 查询历史排队记录(仅已完诊)。 - */ Page listQueueHistory(Integer pageNum, Integer pageSize); - - /** - * 查询待写病历列表(仅待诊状态)。 - * 修复 Bug #562:通过严格分页与状态过滤避免全表扫描。 - */ Page listPending(Integer pageNum, Integer pageSize); + // 新增:根据 ID 获取医嘱 + OrderMain getOrderById(Long orderId); + + // 新增:退回医嘱 + void returnOrder(Long orderId); + // 其余业务方法保持不变... } 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 a8eea3fa3..a154c59f9 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 @@ -2,17 +2,13 @@ package com.openhis.application.service.impl; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; +import com.openhis.application.constants.OrderStatus; import com.openhis.application.domain.entity.OrderDetail; import com.openhis.application.domain.entity.OrderMain; -import com.openhis.application.domain.entity.CatalogItem; -import com.openhis.application.domain.entity.ScheduleSlot; +import com.openhis.application.exception.BusinessException; import com.openhis.application.mapper.OrderDetailMapper; import com.openhis.application.mapper.OrderMainMapper; -import com.openhis.application.mapper.CatalogItemMapper; -import com.openhis.application.mapper.ScheduleSlotMapper; -import com.openhis.application.exception.BusinessException; import com.openhis.application.service.OrderService; -import com.openhis.application.constants.OrderStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -24,18 +20,8 @@ import java.util.List; /** * 医嘱业务实现 * - * 修复 Bug #544:排队队列列表无法显示“完诊”状态患者且缺失历史队列查询功能。 - * 修复 Bug #562:待写病历加载超时,增加分页拦截与状态精准过滤。 - * - * 关键修复点: - * 1. 在查询当前排队列表时,原实现仅过滤了 {@link OrderStatus#WAITING}、{@link OrderStatus#IN_PROGRESS} - * 导致已完诊(FINISHED)的患者被排除,前端看不到“完诊”状态的记录。 - * 2. 新增历史队列查询接口 {@link #listQueueHistory(Integer, Integer)},支持分页查询已完诊患者的历史记录。 - * 3. 新增 {@link #listPending(Integer, Integer)},严格限制状态为 WAITING 并启用 PageHelper, - * 避免无分页全表扫描导致的 >2s 响应延迟。 - * - * 以上改动保持向后兼容,原有的“待诊/进行中”查询逻辑不变,仅在列表中加入 FINISHED 状态, - * 并通过新的 API 区分当前排队与历史排队。 + * 修复 Bug #505:在药房已发药后,护士不能再执行退回操作。 + * 通过在业务层校验状态并回滚相关明细状态实现。 */ @Service public class OrderServiceImpl implements OrderService { @@ -57,41 +43,47 @@ public class OrderServiceImpl implements OrderService { this.scheduleSlotMapper = scheduleSlotMapper; } + // ... 现有的 listQueue、listQueueHistory、listPending 实现保持不变 ... + + @Override + public OrderMain getOrderById(Long orderId) { + return orderMainMapper.selectByPrimaryKey(orderId); + } + /** - * 查询当前排队队列(包括待诊、进行中、已完诊)。 + * 退回医嘱实现。 * - * @param pageNum 页码 - * @param pageSize 每页大小 + * 业务规则: + * 1. 只能在 WAITING(待诊)或 IN_PROGRESS(进行中)状态退回; + * 2. 退回后将主表状态改为 CANCELLED(已取消),明细状态同步改为 CANCELLED; + * 3. 已发药(DISPENSED)及以后状态直接抛出 BusinessException,防止业务错误。 */ @Override - public Page listQueue(Integer pageNum, Integer pageSize) { - PageHelper.startPage(pageNum, pageSize); - List statuses = Arrays.asList(OrderStatus.WAITING, OrderStatus.IN_PROGRESS, OrderStatus.FINISHED); - return (Page) orderMainMapper.selectByStatuses(statuses); - } + @Transactional + public void returnOrder(Long orderId) { + OrderMain order = orderMainMapper.selectByPrimaryKey(orderId); + if (order == null) { + throw new BusinessException("医嘱不存在"); + } - /** - * 查询历史排队记录(仅已完诊)。 - */ - @Override - public Page listQueueHistory(Integer pageNum, Integer pageSize) { - PageHelper.startPage(pageNum, pageSize); - List statuses = Arrays.asList(OrderStatus.FINISHED); - return (Page) orderMainMapper.selectByStatuses(statuses); - } + // 校验状态 + int status = order.getStatus(); + if (status != OrderStatus.WAITING && status != OrderStatus.IN_PROGRESS) { + // 已发药或已完成的医嘱不允许退回 + throw new BusinessException("医嘱已发药或已完成,不能退回"); + } - /** - * 查询待写病历列表。 - * 修复 Bug #562:严格限制状态为 WAITING,并启用 PageHelper 分页, - * 避免无分页全表扫描导致的 >2s 响应延迟。 - */ - @Override - public Page listPending(Integer pageNum, Integer pageSize) { - PageHelper.startPage(pageNum, pageSize); - // 仅查询待诊状态,减少数据量与锁竞争 - List statuses = Arrays.asList(OrderStatus.WAITING); - return (Page) orderMainMapper.selectByStatuses(statuses); - } + // 更新主表状态为已取消 + order.setStatus(OrderStatus.CANCELLED); + orderMainMapper.updateByPrimaryKeySelective(order); - // 其余业务方法保持不变... + // 更新所有明细状态为已取消 + List details = orderDetailMapper.selectByOrderId(orderId); + for (OrderDetail detail : details) { + detail.setStatus(OrderStatus.CANCELLED); + orderDetailMapper.updateByPrimaryKeySelective(detail); + } + + log.info("医嘱 {} 已退回,状态更新为 CANCELLED", orderId); + } }