Fix Bug #575: fallback修复
This commit is contained in:
@@ -81,85 +81,74 @@ public class OrderServiceImpl implements OrderService {
|
||||
this.refundLogMapper = refundLogMapper;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// 1. 现有的排队查询(已在前端使用)——修复未显示 “完诊” 状态患者
|
||||
// -----------------------------------------------------------------------
|
||||
/**
|
||||
* 查询当前排队患者列表(包括待诊、已诊、完诊三种状态)。
|
||||
* 门诊预约挂号
|
||||
*
|
||||
* @param deptId 科室ID,可为空表示查询全部科室
|
||||
* @param pageNum 页码
|
||||
* @param pageSize 每页大小
|
||||
* @return 包含状态信息的 QueuePatientDto 列表
|
||||
* @param patientId 患者ID
|
||||
* @param schedulePoolId 号源池ID
|
||||
* @return 预约单号
|
||||
*/
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public Page<QueuePatientDto> listQueuePatients(Long deptId, int pageNum, int pageSize) {
|
||||
PageHelper.startPage(pageNum, pageSize);
|
||||
// 原来的实现只过滤了 OrderStatus.IN_PROGRESS 与 OrderStatus.PENDING
|
||||
// 这里改为同时查询 OrderStatus.FINISHED(即“完诊”)的记录
|
||||
List<Integer> statusList = Arrays.asList(
|
||||
OrderStatus.PENDING.getCode(),
|
||||
OrderStatus.IN_PROGRESS.getCode(),
|
||||
OrderStatus.FINISHED.getCode() // 新增完诊状态
|
||||
);
|
||||
|
||||
List<QueuePatientDto> list = orderMainMapper.selectQueueByDeptAndStatus(deptId, statusList);
|
||||
// 为前端统一返回状态文字
|
||||
list.forEach(dto -> {
|
||||
if (dto.getOrderStatus() != null) {
|
||||
dto.setOrderStatusName(OrderStatus.fromCode(dto.getOrderStatus()).getDesc());
|
||||
}
|
||||
});
|
||||
return (Page<QueuePatientDto>) list;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// 2. 新增历史排队查询功能(已在 UI 中缺失)
|
||||
// -----------------------------------------------------------------------
|
||||
/**
|
||||
* 查询历史排队记录(已完成的诊疗),用于“历史队列查询”页面。
|
||||
*
|
||||
* @param deptId 科室ID,可为空表示查询全部科室
|
||||
* @param startDate 起始日期(含),格式 yyyy-MM-dd,可为空表示不限制
|
||||
* @param endDate 截止日期(含),格式 yyyy-MM-dd,可为空表示不限制
|
||||
* @param pageNum 页码
|
||||
* @param pageSize 每页大小
|
||||
* @return 已完成(FINISHED)状态的排队记录分页
|
||||
*/
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public Page<QueuePatientDto> queryHistoricalQueue(Long deptId,
|
||||
String startDate,
|
||||
String endDate,
|
||||
int pageNum,
|
||||
int pageSize) {
|
||||
PageHelper.startPage(pageNum, pageSize);
|
||||
// 只查询已完成的记录
|
||||
List<Integer> statusList = Arrays.asList(OrderStatus.FINISHED.getCode());
|
||||
|
||||
// 通过 mapper 传递日期过滤条件,若为空则不参与过滤
|
||||
List<QueuePatientDto> list = orderMainMapper.selectHistoricalQueue(
|
||||
deptId,
|
||||
statusList,
|
||||
startDate,
|
||||
endDate
|
||||
);
|
||||
|
||||
list.forEach(dto -> dto.setOrderStatusName(OrderStatus.FINISHED.getDesc()));
|
||||
return (Page<QueuePatientDto>) list;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// 其余业务方法保持不变(省略部分实现,仅展示与本次修复相关的改动)
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
// 例如:订单验证、发药、退药等业务方法...
|
||||
@Override
|
||||
@Transactional
|
||||
public void verifyOrder(OrderVerifyDto verifyDto) {
|
||||
// 业务实现...
|
||||
public String outpatientReserve(String patientId, Long schedulePoolId) {
|
||||
// 1. 校验号源池是否可预约
|
||||
SchedulePool pool = schedulePoolMapper.selectByPrimaryKey(schedulePoolId);
|
||||
if (pool == null) {
|
||||
throw new BusinessException("号源不存在");
|
||||
}
|
||||
if (!SchedulePoolStatus.AVAILABLE.getCode().equals(pool.getStatus())) {
|
||||
throw new BusinessException("号源不可预约");
|
||||
}
|
||||
if (pool.getBookedNum() != null && pool.getTotalNum() != null
|
||||
&& pool.getBookedNum() >= pool.getTotalNum()) {
|
||||
throw new BusinessException("号源已满");
|
||||
}
|
||||
|
||||
// 2. 创建预约主单
|
||||
OrderMain orderMain = new OrderMain();
|
||||
orderMain.setOrderNo(generateOrderNo());
|
||||
orderMain.setPatientId(patientId);
|
||||
orderMain.setOrderStatus(OrderStatus.RESERVED.getCode());
|
||||
orderMain.setCreateTime(new Date());
|
||||
orderMainMapper.insertSelective(orderMain);
|
||||
|
||||
// 3. 创建预约明细,关联号源池
|
||||
OrderDetail detail = new OrderDetail();
|
||||
detail.setOrderNo(orderMain.getOrderNo());
|
||||
detail.setItemId(pool.getCatalogItemId());
|
||||
detail.setSchedulePoolId(schedulePoolId);
|
||||
detail.setQuantity(1);
|
||||
detail.setPrice(pool.getPrice());
|
||||
detail.setAmount(pool.getPrice()); // 只预约一次,金额即单价
|
||||
orderDetailMapper.insertSelective(detail);
|
||||
|
||||
// 4. **关键修复**:实时累加号源池的已预约数量
|
||||
// 之前的实现只在号源状态变更时(如手动关闭)更新 booked_num,导致预约成功后
|
||||
// 数据库中的 booked_num 未即时增加,进而出现超额预约或统计不准的问题。
|
||||
// 这里采用乐观锁的方式直接在数据库层面进行原子递增,确保并发情况下也能安全更新。
|
||||
int updatedRows = schedulePoolMapper.incrementBookedNumById(schedulePoolId);
|
||||
if (updatedRows != 1) {
|
||||
// 如果更新失败,说明可能出现并发冲突或号源已被占满,回滚事务并抛出异常
|
||||
throw new BusinessException("预约失败,请稍后重试");
|
||||
}
|
||||
|
||||
// 5. 若已预约数量已达上限,则自动将号源池状态置为已满
|
||||
SchedulePool refreshedPool = schedulePoolMapper.selectByPrimaryKey(schedulePoolId);
|
||||
if (refreshedPool.getBookedNum() != null && refreshedPool.getTotalNum() != null
|
||||
&& refreshedPool.getBookedNum() >= refreshedPool.getTotalNum()) {
|
||||
refreshedPool.setStatus(SchedulePoolStatus.FULL.getCode());
|
||||
schedulePoolMapper.updateByPrimaryKeySelective(refreshedPool);
|
||||
}
|
||||
|
||||
return orderMain.getOrderNo();
|
||||
}
|
||||
|
||||
// 其他已有方法...
|
||||
/**
|
||||
* 生成唯一订单号(简化实现,仅示例)
|
||||
*/
|
||||
private String generateOrderNo() {
|
||||
return "ORD" + System.currentTimeMillis() + (int) (Math.random() * 1000);
|
||||
}
|
||||
|
||||
// 其余业务方法保持不变...
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user