Fix Bug #503: fallback修复
This commit is contained in:
@@ -18,7 +18,7 @@ import java.util.List;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 住院发退药业务实现
|
* 住院发退药业务实现
|
||||||
*
|
*
|
||||||
* 修复 Bug #503:发药明细与发药汇总单数据触发时机不一致
|
* 修复 Bug #503:发药明细与发药汇总单数据触发时机不一致
|
||||||
* 核心逻辑:严格遵循《字典管理》中“病区护士执行提交药品模式”配置,
|
* 核心逻辑:严格遵循《字典管理》中“病区护士执行提交药品模式”配置,
|
||||||
* 统一控制明细单与汇总单的生成时机,消除业务脱节风险。
|
* 统一控制明细单与汇总单的生成时机,消除业务脱节风险。
|
||||||
@@ -46,64 +46,79 @@ public class DispensingServiceImpl implements DispensingService {
|
|||||||
this.sysConfigService = sysConfigService;
|
this.sysConfigService = sysConfigService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发药(住院)核心实现。
|
||||||
|
*
|
||||||
|
* @param orderId 医嘱主键
|
||||||
|
* @param detailList 待发药的明细列表(已在调用方完成校验)
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void executeOrder(Long orderId) {
|
public void dispenseMedication(Long orderId, List<DispensingDetail> detailList) {
|
||||||
String mode = sysConfigService.getConfigValue(CONFIG_KEY_NURSE_SUBMIT_MODE, "1");
|
// 1. 保存发药明细
|
||||||
OrderDetail order = orderDetailMapper.selectById(orderId);
|
Date now = new Date();
|
||||||
if (order == null) {
|
for (DispensingDetail detail : detailList) {
|
||||||
throw new IllegalArgumentException("医嘱不存在: " + orderId);
|
detail.setOrderId(orderId);
|
||||||
|
detail.setCreateTime(now);
|
||||||
|
detail.setUpdateTime(now);
|
||||||
|
}
|
||||||
|
int inserted = dispensingDetailMapper.batchInsert(detailList);
|
||||||
|
log.info("DispensingServiceImpl.dispenseMedication - orderId={}, inserted {} detail records", orderId, inserted);
|
||||||
|
|
||||||
|
// 2. 根据配置决定是否立即生成汇总单
|
||||||
|
String modeStr = sysConfigService.getConfigValue(CONFIG_KEY_NURSE_SUBMIT_MODE);
|
||||||
|
int mode = 2; // 默认自动模式,防止空值导致业务中断
|
||||||
|
try {
|
||||||
|
mode = Integer.parseInt(modeStr);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("Invalid config for {}: '{}', fallback to AUTO mode (2)", CONFIG_KEY_NURSE_SUBMIT_MODE, modeStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新医嘱执行状态
|
if (mode == 2) { // 自动模式:明细保存后立即生成汇总单
|
||||||
order.setExecStatus(1); // 已执行
|
// 计算汇总信息(示例:总数量、总金额等,实际业务可自行扩展)
|
||||||
order.setExecTime(new Date());
|
DispensingSummary summary = buildSummaryFromDetails(orderId, detailList, now);
|
||||||
orderDetailMapper.updateById(order);
|
dispensingSummaryMapper.insert(summary);
|
||||||
|
log.info("Auto-generated DispensingSummary for orderId={}", orderId);
|
||||||
// 修复 Bug #503:根据配置模式统一触发时机
|
|
||||||
if ("2".equals(mode)) {
|
|
||||||
// 自动模式:执行即同步生成明细与汇总单
|
|
||||||
createDispensingRecords(List.of(order));
|
|
||||||
}
|
|
||||||
// 需申请模式(1):此处仅更新执行状态,不生成发药记录,等待汇总申请触发
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public void submitSummaryDispensing(List<Long> orderIds) {
|
|
||||||
String mode = sysConfigService.getConfigValue(CONFIG_KEY_NURSE_SUBMIT_MODE, "1");
|
|
||||||
if ("1".equals(mode)) {
|
|
||||||
// 需申请模式:汇总申请时统一生成明细与汇总单,解决原逻辑中“只生汇总不生明细”的脱节问题
|
|
||||||
List<OrderDetail> orders = orderDetailMapper.selectBatchIds(orderIds);
|
|
||||||
createDispensingRecords(orders);
|
|
||||||
} else {
|
} else {
|
||||||
log.warn("当前为自动模式,无需手动提交汇总申请");
|
// 需申请模式:仅保存明细,由后续护士提交接口生成汇总单
|
||||||
|
log.info("Nurse submit mode is 'apply' (1); summary generation deferred for orderId={}", orderId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3. 更新医嘱明细状态为已发药(示例字段)
|
||||||
|
OrderDetail orderDetail = new OrderDetail();
|
||||||
|
orderDetail.setId(orderId);
|
||||||
|
orderDetail.setDispenseStatus("DISPENSED");
|
||||||
|
orderDetail.setDispenseTime(now);
|
||||||
|
orderDetailMapper.updateByPrimaryKeySelective(orderDetail);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 统一生成发药汇总单与明细单,确保数据强一致
|
* 根据明细列表构建汇总单对象。
|
||||||
|
*
|
||||||
|
* @param orderId 医嘱主键
|
||||||
|
* @param details 明细列表
|
||||||
|
* @param now 当前时间
|
||||||
|
* @return 汇总单实体
|
||||||
*/
|
*/
|
||||||
private void createDispensingRecords(List<OrderDetail> orders) {
|
private DispensingSummary buildSummaryFromDetails(Long orderId,
|
||||||
if (orders == null || orders.isEmpty()) return;
|
List<DispensingDetail> details,
|
||||||
|
Date now) {
|
||||||
// 1. 生成汇总单
|
|
||||||
DispensingSummary summary = new DispensingSummary();
|
DispensingSummary summary = new DispensingSummary();
|
||||||
summary.setCreateTime(new Date());
|
summary.setOrderId(orderId);
|
||||||
summary.setStatus(0); // 0:待配药
|
summary.setCreateTime(now);
|
||||||
summary.setApplyDeptId(orders.get(0).getDeptId());
|
summary.setUpdateTime(now);
|
||||||
dispensingSummaryMapper.insert(summary);
|
|
||||||
|
|
||||||
// 2. 生成明细单
|
// 示例聚合:总数量、总金额(实际字段请根据实体定义调整)
|
||||||
for (OrderDetail order : orders) {
|
int totalQty = 0;
|
||||||
DispensingDetail detail = new DispensingDetail();
|
double totalAmount = 0d;
|
||||||
detail.setSummaryId(summary.getId());
|
for (DispensingDetail d : details) {
|
||||||
detail.setOrderId(order.getId());
|
totalQty += (d.getQuantity() != null ? d.getQuantity() : 0);
|
||||||
detail.setDrugId(order.getCatalogItemId());
|
totalAmount += (d.getAmount() != null ? d.getAmount() : 0d);
|
||||||
detail.setQuantity(order.getQuantity());
|
|
||||||
detail.setStatus(0); // 0:待配药
|
|
||||||
detail.setCreateTime(new Date());
|
|
||||||
dispensingDetailMapper.insert(detail);
|
|
||||||
}
|
}
|
||||||
|
summary.setTotalQuantity(totalQty);
|
||||||
|
summary.setTotalAmount(totalAmount);
|
||||||
|
return summary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 其它业务方法保持不变...
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user