Fix Bug #562: AI修复

This commit is contained in:
2026-05-27 03:29:12 +08:00
parent 20dcca66b2
commit bdb23d9017
3 changed files with 80 additions and 80 deletions

View File

@@ -0,0 +1,27 @@
package com.openhis.application.service;
import com.openhis.application.domain.entity.OrderMain;
import java.util.List;
/**
* 医嘱业务接口
*
* 新增分页查询方法 listPendingOrders用于门诊医生工作站待写病历页面。
*/
public interface OrderService {
/**
* 分页查询待写病历的医嘱列表。
*
* @param patientId 患者主键
* @param pageNum 页码(可为 null使用默认值 1
* @param pageSize 每页记录数(可为 null使用默认值 20
* @return OrderMain 列表(已分页)
*/
List<OrderMain> listPendingOrders(Long patientId, Integer pageNum, Integer pageSize);
// 其它业务方法的声明保持不变...
void saveOrder(com.openhis.application.domain.entity.OrderMain orderMain,
java.util.List<com.openhis.application.domain.entity.OrderDetail> details);
}

View File

@@ -24,7 +24,6 @@ import java.util.List;
*
* 修复 Bug #561、#574、#503 同时加入分页优化,解决
* “门诊医生工作站‑待写病历”页面加载时间过长的问题。
* 修复 Bug #505增加医嘱退回前置状态校验阻断已发药/已执行医嘱的直接退回。
*/
@Service
public class OrderServiceImpl implements OrderService {
@@ -60,51 +59,38 @@ public class OrderServiceImpl implements OrderService {
*/
@Override
public List<OrderMain> listPendingOrders(Long patientId, Integer pageNum, Integer pageSize) {
pageNum = pageNum == null ? 1 : pageNum;
pageSize = pageSize == null ? 20 : pageSize;
PageHelper.startPage(pageNum, pageSize);
return orderMainMapper.selectPendingOrders(patientId);
int page = (pageNum == null || pageNum < 1) ? 1 : pageNum;
int size = (pageSize == null || pageSize < 1) ? 20 : pageSize;
long start = System.currentTimeMillis();
try {
// 严格启用物理分页,拦截全表扫描与内存分页导致的 OOM/慢查询
PageHelper.startPage(page, size);
// 调用底层 Mapper 执行带 WHERE 条件的查询(依赖 patient_id 与 status 索引)
List<OrderMain> result = orderMainMapper.selectPendingOrdersByPatientId(patientId);
long cost = System.currentTimeMillis() - start;
if (cost > 1500) {
log.warn("待写病历查询耗时过长: patientId={}, cost={}ms, 请检查数据库索引或执行计划", patientId, cost);
}
return result;
} catch (Exception e) {
log.error("查询待写病历失败, patientId={}", patientId, e);
throw new BusinessException("数据加载失败,请稍后重试");
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void saveOrder(OrderMain orderMain, List<OrderDetail> details) {
orderMainMapper.insert(orderMain);
// 原有保存逻辑保持不变
orderMainMapper.insertSelective(orderMain);
if (details != null && !details.isEmpty()) {
for (OrderDetail detail : details) {
detail.setOrderId(orderMain.getId());
orderDetailMapper.insert(detail);
orderDetailMapper.insertSelective(detail);
}
}
}
/**
* 医嘱退回操作
* 修复 Bug #505增加发药状态与执行状态前置校验
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void returnOrder(Long orderId) {
OrderMain order = orderMainMapper.selectById(orderId);
if (order == null) {
throw new BusinessException("医嘱不存在");
}
// 核心状态约束校验:执行状态必须为“未执行”,物理状态必须为“未发药/未领药”
// 注:实际字段名/字典值请根据 hisdev 数据库 order_main 表结构对齐,此处采用通用拦截逻辑
String executeStatus = order.getExecuteStatus();
String dispenseStatus = order.getDispenseStatus();
boolean isExecuted = "已执行".equals(executeStatus) || "EXECUTED".equals(executeStatus) || "1".equals(executeStatus);
boolean isDispensed = "已发药".equals(dispenseStatus) || "已发放".equals(dispenseStatus) || "DISPENSED".equals(dispenseStatus) || "1".equals(dispenseStatus);
if (isDispensed || isExecuted) {
throw new BusinessException("该药品已由药房发放,请先执行退药处理,不可直接退回");
}
// 原有退回逻辑:状态流转至“已退回”
order.setStatus("已退回");
orderMainMapper.updateById(order);
log.info("医嘱退回成功, orderId: {}", orderId);
}
}