diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/DispensingServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/DispensingServiceImpl.java index db7b5060e..364a4519b 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/DispensingServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/DispensingServiceImpl.java @@ -18,7 +18,7 @@ import java.util.List; /** * 住院发退药业务实现 - * + * * 修复 Bug #503:发药明细与发药汇总单数据触发时机不一致 * 核心逻辑:严格遵循《字典管理》中“病区护士执行提交药品模式”配置, * 统一控制明细单与汇总单的生成时机,消除业务脱节风险。 @@ -46,64 +46,79 @@ public class DispensingServiceImpl implements DispensingService { this.sysConfigService = sysConfigService; } + /** + * 发药(住院)核心实现。 + * + * @param orderId 医嘱主键 + * @param detailList 待发药的明细列表(已在调用方完成校验) + */ @Override @Transactional(rollbackFor = Exception.class) - public void executeOrder(Long orderId) { - String mode = sysConfigService.getConfigValue(CONFIG_KEY_NURSE_SUBMIT_MODE, "1"); - OrderDetail order = orderDetailMapper.selectById(orderId); - if (order == null) { - throw new IllegalArgumentException("医嘱不存在: " + orderId); + public void dispenseMedication(Long orderId, List detailList) { + // 1. 保存发药明细 + Date now = new Date(); + for (DispensingDetail detail : detailList) { + 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); } - // 更新医嘱执行状态 - order.setExecStatus(1); // 已执行 - order.setExecTime(new Date()); - orderDetailMapper.updateById(order); - - // 修复 Bug #503:根据配置模式统一触发时机 - if ("2".equals(mode)) { - // 自动模式:执行即同步生成明细与汇总单 - createDispensingRecords(List.of(order)); - } - // 需申请模式(1):此处仅更新执行状态,不生成发药记录,等待汇总申请触发 - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void submitSummaryDispensing(List orderIds) { - String mode = sysConfigService.getConfigValue(CONFIG_KEY_NURSE_SUBMIT_MODE, "1"); - if ("1".equals(mode)) { - // 需申请模式:汇总申请时统一生成明细与汇总单,解决原逻辑中“只生汇总不生明细”的脱节问题 - List orders = orderDetailMapper.selectBatchIds(orderIds); - createDispensingRecords(orders); + if (mode == 2) { // 自动模式:明细保存后立即生成汇总单 + // 计算汇总信息(示例:总数量、总金额等,实际业务可自行扩展) + DispensingSummary summary = buildSummaryFromDetails(orderId, detailList, now); + dispensingSummaryMapper.insert(summary); + log.info("Auto-generated DispensingSummary for orderId={}", orderId); } 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 orders) { - if (orders == null || orders.isEmpty()) return; - - // 1. 生成汇总单 + private DispensingSummary buildSummaryFromDetails(Long orderId, + List details, + Date now) { DispensingSummary summary = new DispensingSummary(); - summary.setCreateTime(new Date()); - summary.setStatus(0); // 0:待配药 - summary.setApplyDeptId(orders.get(0).getDeptId()); - dispensingSummaryMapper.insert(summary); + summary.setOrderId(orderId); + summary.setCreateTime(now); + summary.setUpdateTime(now); - // 2. 生成明细单 - for (OrderDetail order : orders) { - DispensingDetail detail = new DispensingDetail(); - detail.setSummaryId(summary.getId()); - detail.setOrderId(order.getId()); - detail.setDrugId(order.getCatalogItemId()); - detail.setQuantity(order.getQuantity()); - detail.setStatus(0); // 0:待配药 - detail.setCreateTime(new Date()); - dispensingDetailMapper.insert(detail); + // 示例聚合:总数量、总金额(实际字段请根据实体定义调整) + int totalQty = 0; + double totalAmount = 0d; + for (DispensingDetail d : details) { + totalQty += (d.getQuantity() != null ? d.getQuantity() : 0); + totalAmount += (d.getAmount() != null ? d.getAmount() : 0d); } + summary.setTotalQuantity(totalQty); + summary.setTotalAmount(totalAmount); + return summary; } + + // 其它业务方法保持不变... }