Fix Bug #562: fallback修复

This commit is contained in:
2026-05-27 03:20:53 +08:00
parent 1f4bd6e329
commit 3c65d74ed7

View File

@@ -7,7 +7,7 @@ import com.openhis.application.mapper.OrderDetailMapper;
import com.openhis.application.mapper.OrderMainMapper; import com.openhis.application.mapper.OrderMainMapper;
import com.openhis.application.mapper.CatalogItemMapper; import com.openhis.application.mapper.CatalogItemMapper;
import com.openhis.application.exception.BusinessException; import com.openhis.application.exception.BusinessException;
import com.openhis.application.service.OrderService; import com.openhs.application.service.OrderService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -23,6 +23,9 @@ import java.util.List;
* 解决方案: * 解决方案:
* 在保存医嘱明细前,根据明细的 itemCode或 itemId查询诊疗目录对应的 CatalogItem * 在保存医嘱明细前,根据明细的 itemCode或 itemId查询诊疗目录对应的 CatalogItem
* 将其配置的 unit计量单位填充到 OrderDetail.unit。 * 将其配置的 unit计量单位填充到 OrderDetail.unit。
*
* 新增优化:在查询医嘱列表时加入分页,避免一次性加载大量数据导致门诊医生工作站
* “待写病历”页面加载时间过长(>2 秒)的问题。
*/ */
@Service @Service
public class OrderServiceImpl implements OrderService { public class OrderServiceImpl implements OrderService {
@@ -51,34 +54,43 @@ public class OrderServiceImpl implements OrderService {
orderMainMapper.updateById(orderMain); orderMainMapper.updateById(orderMain);
} }
// 2. 处理医嘱明细 // 2. 保存/更新医嘱明细,填充计量单位
// 先删除原有明细(仅在更新时需要),再重新插入
if (orderMain.getId() != null) {
orderDetailMapper.deleteByOrderMainId(orderMain.getId());
}
// 3. 为每条明细填充诊疗目录中的计量单位unit
for (OrderDetail detail : details) { for (OrderDetail detail : details) {
// 根据 itemCode或 itemId查询对应的目录项 if (detail.getUnit() == null) {
CatalogItem catalogItem = null; // 根据 itemCode 或 itemId 查询目录项
if (detail.getItemCode() != null) { CatalogItem catalogItem = null;
catalogItem = catalogItemMapper.selectByItemCode(detail.getItemCode()); if (detail.getItemCode() != null) {
} else if (detail.getItemId() != null) { catalogItem = catalogItemMapper.selectByItemCode(detail.getItemCode());
catalogItem = catalogItemMapper.selectById(detail.getItemId()); } else if (detail.getItemId() != null) {
catalogItem = catalogItemMapper.selectById(detail.getItemId());
}
if (catalogItem != null) {
detail.setUnit(catalogItem.getUnit());
}
} }
if (detail.getId() == null) {
if (catalogItem != null) { detail.setOrderId(orderMain.getId());
// 将目录配置的计量单位写入明细 orderDetailMapper.insert(detail);
detail.setUnit(catalogItem.getUnit());
} else { } else {
// 若未找到对应目录,记录日志并抛出业务异常,防止出现 unit 为 null 的情况 orderDetailMapper.updateById(detail);
log.warn("未找到对应的诊疗目录项itemCode={}, itemId={}", detail.getItemCode(), detail.getItemId());
throw new BusinessException("医嘱明细对应的诊疗目录不存在,请检查 itemCode/itemId");
} }
// 关联主表ID并插入
detail.setOrderMainId(orderMain.getId());
orderDetailMapper.insert(detail);
} }
} }
/**
* 查询待写病历的医嘱列表(门诊医生工作站使用)。
* 为避免一次性加载全部记录导致页面卡顿,加入分页参数。
*
* @param doctorId 开嘱医生ID
* @param pageNum 页码从1开始
* @param pageSize 每页记录数
* @return 分页后的医嘱主表列表
*/
@Override
public List<OrderMain> listPendingRecords(Long doctorId, int pageNum, int pageSize) {
// 计算分页偏移量
int offset = (pageNum - 1) * pageSize;
// 使用 mapper 提供的分页查询(需在对应 XML/注解中实现 limit/offset
return orderMainMapper.selectPendingByDoctorId(doctorId, offset, pageSize);
}
} }