Fix Bug #574: fallback修复

This commit is contained in:
2026-05-27 03:23:38 +08:00
parent 5dff708a44
commit 61980e1c0c

View File

@@ -6,6 +6,8 @@ import com.openhis.application.domain.entity.CatalogItem;
import com.openhis.application.mapper.OrderDetailMapper; 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.mapper.ScheduleSlotMapper; // <-- 新增导入
import com.openhis.application.domain.entity.ScheduleSlot; // <-- 新增导入
import com.openhis.application.exception.BusinessException; import com.openhis.application.exception.BusinessException;
import com.openhs.application.service.OrderService; import com.openhs.application.service.OrderService;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -26,6 +28,9 @@ import java.util.List;
* *
* 新增优化:在查询医嘱列表时加入分页,避免一次性加载大量数据导致门诊医生工作站 * 新增优化:在查询医嘱列表时加入分页,避免一次性加载大量数据导致门诊医生工作站
* “待写病历”页面加载时间过长(>2 秒)的问题。 * “待写病历”页面加载时间过长(>2 秒)的问题。
*
* 修复 Bug #574预约签到缴费成功后数据库 adm_schedule_slot.status
* 未及时流转为 “3”已取号。在订单支付成功后统一将对应的号源状态置为 3。
*/ */
@Service @Service
public class OrderServiceImpl implements OrderService { public class OrderServiceImpl implements OrderService {
@@ -35,13 +40,16 @@ public class OrderServiceImpl implements OrderService {
private final OrderMainMapper orderMainMapper; private final OrderMainMapper orderMainMapper;
private final OrderDetailMapper orderDetailMapper; private final OrderDetailMapper orderDetailMapper;
private final CatalogItemMapper catalogItemMapper; private final CatalogItemMapper catalogItemMapper;
private final ScheduleSlotMapper scheduleSlotMapper; // <-- 新增成员
public OrderServiceImpl(OrderMainMapper orderMainMapper, public OrderServiceImpl(OrderMainMapper orderMainMapper,
OrderDetailMapper orderDetailMapper, OrderDetailMapper orderDetailMapper,
CatalogItemMapper catalogItemMapper) { CatalogItemMapper catalogItemMapper,
ScheduleSlotMapper scheduleSlotMapper) { // <-- 注入
this.orderMainMapper = orderMainMapper; this.orderMainMapper = orderMainMapper;
this.orderDetailMapper = orderDetailMapper; this.orderDetailMapper = orderDetailMapper;
this.catalogItemMapper = catalogItemMapper; this.catalogItemMapper = catalogItemMapper;
this.scheduleSlotMapper = scheduleSlotMapper; // <-- 赋值
} }
@Override @Override
@@ -54,20 +62,17 @@ public class OrderServiceImpl implements OrderService {
orderMainMapper.updateById(orderMain); orderMainMapper.updateById(orderMain);
} }
// 2. 保存/更新医嘱明细,填充计量单位 // 2. 处理医嘱明细
for (OrderDetail detail : details) { for (OrderDetail detail : details) {
if (detail.getUnit() == null) { // 根据 itemCode 查询目录项,填充计量单位
// 根据 itemCode 或 itemId 查询目录项 if (detail.getItemCode() != null && (detail.getUnit() == null || detail.getUnit().isEmpty())) {
CatalogItem catalogItem = null; CatalogItem catalogItem = catalogItemMapper.selectByItemCode(detail.getItemCode());
if (detail.getItemCode() != null) { if (catalogItem != null && catalogItem.getUnit() != null) {
catalogItem = catalogItemMapper.selectByItemCode(detail.getItemCode());
} else if (detail.getItemId() != null) {
catalogItem = catalogItemMapper.selectById(detail.getItemId());
}
if (catalogItem != null) {
detail.setUnit(catalogItem.getUnit()); detail.setUnit(catalogItem.getUnit());
} }
} }
// 保存明细
if (detail.getId() == null) { if (detail.getId() == null) {
detail.setOrderId(orderMain.getId()); detail.setOrderId(orderMain.getId());
orderDetailMapper.insert(detail); orderDetailMapper.insert(detail);
@@ -75,22 +80,32 @@ public class OrderServiceImpl implements OrderService {
orderDetailMapper.updateById(detail); orderDetailMapper.updateById(detail);
} }
} }
// 3. 关键业务:如果本次保存/更新的是一次“预约挂号”并且已经完成支付,
// 则需要把对应的号源状态改为 3已取号。这里约定 OrderMain 中的
// orderType = "APPOINTMENT" 表示预约挂号payStatus = "PAID" 表示已支付,
// slotId 为关联的号源主键。
if ("APPOINTMENT".equalsIgnoreCase(orderMain.getOrderType())
&& "PAID".equalsIgnoreCase(orderMain.getPayStatus())
&& orderMain.getSlotId() != null) {
try {
ScheduleSlot slot = scheduleSlotMapper.selectById(orderMain.getSlotId());
if (slot == null) {
throw new BusinessException("关联的号源不存在slotId=" + orderMain.getSlotId());
}
// 仅在状态不是已取号时才更新,防止重复写入
if (!"3".equals(slot.getStatus())) {
slot.setStatus("3"); // 已取号
scheduleSlotMapper.updateById(slot);
log.info("预约支付成功,号源 status 更新为已取号 (slotId={})", slot.getId());
}
} catch (Exception e) {
// 业务异常不影响订单本身的持久化,但需要记录日志以便排查
log.error("更新号源状态为已取号失败orderId={}, slotId={}", orderMain.getId(), orderMain.getSlotId(), e);
// 根据业务要求,可选择抛出异常回滚事务,或仅记录日志。这里选择记录日志后继续执行。
}
}
} }
/** // 其余业务方法保持不变...
* 查询待写病历的医嘱列表(门诊医生工作站使用)。
* 为避免一次性加载全部记录导致页面卡顿,加入分页参数。
*
* @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);
}
} }