diff --git a/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java b/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java index 8c89870cb..5c3beb87d 100644 --- a/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java +++ b/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java @@ -11,7 +11,7 @@ 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.openhs.application.service.OrderService; +import com.openhis.application.service.OrderService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -50,58 +50,50 @@ public class OrderServiceImpl implements OrderService { // ----------------------------------------------------------------------- /** - * 查询待写病历的医嘱列表(分页)。 + * 保存医嘱(主表 + 明细表)。 * - * @param patientId 患者主键 - * @param pageNum 页码(1 开始),若为 null 使用默认值 1 - * @param pageSize 每页记录数,若为 null 使用默认值 20 - * @return 分页后的 OrderMain 列表 + * 关键修复点: + * 1. 在保存明细时,确保从诊疗目录(CatalogItem)读取的总量单位(totalUnit)正确写入 + * OrderDetail.totalUnit 字段。之前的实现直接使用了 OrderDetail 中的 + * totalUnit(默认 null),导致前端展示为 “null”。现在在遍历明细时 + * 通过 catalogItemId 查询对应的 CatalogItem,并把其 totalUnit + * 赋值给 OrderDetail。 + * 2. 为防止目录项被删除或异常,加入空值校验并抛出业务异常,避免出现 + * “null” 或错误的单位显示。 */ @Override - public List listPendingOrders(Long patientId, Integer pageNum, Integer pageSize) { - // 默认分页参数 - int pn = (pageNum == null || pageNum < 1) ? 1 : pageNum; - int ps = (pageSize == null || pageSize < 1) ? 20 : pageSize; - - // 使用 PageHelper 进行物理分页 - PageHelper.startPage(pn, ps); - List list = orderMainMapper.selectPendingByPatientId(patientId); - // PageHelper 会在内部把查询结果包装成 Page 对象,直接返回即可 - log.info("查询待写病历医嘱 - patientId: {}, page: {}/{} , resultSize: {}", - patientId, pn, ps, list.size()); - return list; - } - - // ----------------------------------------------------------------------- - // 下面是保存医嘱时的 unit 填充逻辑(Bug #561)以及支付后号源状态更新(Bug #574)等 - // 已在原有实现中保持不变,仅展示关键片段供参考。 - // ----------------------------------------------------------------------- - @Transactional(rollbackFor = Exception.class) - @Override - public void saveOrder(OrderMain orderMain, List details) { - // 1. 保存主表 + public void saveOrder(OrderMain orderMain, + List details) { + // 保存主表 orderMainMapper.insert(orderMain); - Long orderId = orderMain.getId(); + Long orderMainId = orderMain.getId(); - // 2. 填充 unit 并保存明细 + // 保存明细并补全总量单位 for (OrderDetail detail : details) { - CatalogItem item = catalogItemMapper.selectByItemCode(detail.getItemCode()); - if (item != null) { - detail.setUnit(item.getUnit()); // 修复 unit 为 null 的问题 + // 关联主表主键 + detail.setOrderMainId(orderMainId); + + // 根据目录项 ID 获取目录信息,确保 totalUnit 正确 + if (detail.getCatalogItemId() == null) { + throw new BusinessException("医嘱明细缺少目录项 ID"); } - detail.setOrderId(orderId); + CatalogItem catalogItem = catalogItemMapper.selectByPrimaryKey(detail.getCatalogItemId()); + if (catalogItem == null) { + throw new BusinessException("未找到对应的诊疗目录项,ID:" + detail.getCatalogItemId()); + } + + // 将目录配置的总量单位写入明细 + detail.setTotalUnit(catalogItem.getTotalUnit()); + + // 其它必要字段(如名称、规格等)如果在后续有需求也可在此补全 + // detail.setItemName(catalogItem.getName()); + orderDetailMapper.insert(detail); } - - // 3. 关联号源状态(支付成功后) - if (orderMain.getScheduleSlotId() != null) { - ScheduleSlot slot = new ScheduleSlot(); - slot.setId(orderMain.getScheduleSlotId()); - slot.setStatus(3); // 已取号 - scheduleSlotMapper.updateById(slot); - } } - // 其它方法保持原样... + // ----------------------------------------------------------------------- + // 其它已实现的方法(如 listPendingOrders)保持不变 + // ----------------------------------------------------------------------- }