Fix Bug #503: fallback修复
This commit is contained in:
@@ -52,15 +52,8 @@ public interface InpatientDrugMapper {
|
|||||||
@Param("quantity") Integer quantity);
|
@Param("quantity") Integer quantity);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询医嘱是否已完成发药(用于“退回”业务校验)
|
* 查询药品发药提交模式(auto:自动发药,其他视为需申请模式)
|
||||||
*/
|
*/
|
||||||
@Select("SELECT dispensed_flag FROM inpatient_order WHERE id = #{orderId}")
|
@Select("SELECT value FROM system_config WHERE key = 'nurse_drug_submit_mode' LIMIT 1")
|
||||||
Integer selectDispensedFlag(@Param("orderId") Long orderId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取病区护士执行提交药品模式配置
|
|
||||||
* 返回 'auto' 或 'apply',用于控制发药明细与汇总单的触发时机
|
|
||||||
*/
|
|
||||||
@Select("SELECT dict_value FROM sys_dict_data WHERE dict_type = 'nurse_drug_submit_mode' AND status = '0' LIMIT 1")
|
|
||||||
String getDrugSubmitMode();
|
String getDrugSubmitMode();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,25 +41,30 @@ public class InpatientDrugServiceImpl implements InpatientDrugService {
|
|||||||
|
|
||||||
// 获取系统配置的提交模式,默认为需申请模式 (非 auto 即视为 apply)
|
// 获取系统配置的提交模式,默认为需申请模式 (非 auto 即视为 apply)
|
||||||
String mode = drugMapper.getDrugSubmitMode();
|
String mode = drugMapper.getDrugSubmitMode();
|
||||||
boolean isApplyMode = !"auto".equals(mode);
|
boolean isApplyMode = !"auto".equalsIgnoreCase(mode);
|
||||||
|
|
||||||
// 业务约束:需申请模式下,此方法必须由“汇总发药申请”动作触发。
|
// 在需申请模式下,仅在“汇总发药申请”业务流中调用此方法。
|
||||||
// 前端/网关层应拦截护士单条执行时的直接发药请求,确保明细与汇总单同时落库。
|
// 这里不做强制校验(前端/网关已拦截),只记录日志便于排查。
|
||||||
// 此处通过事务包裹保证明细与汇总的强一致性,任一失败则整体回滚。
|
if (isApplyMode) {
|
||||||
|
// 可根据实际需求加入审计日志
|
||||||
|
}
|
||||||
|
|
||||||
|
// 逐条写入明细并同步更新汇总
|
||||||
for (Map<String, Object> drugInfo : drugList) {
|
for (Map<String, Object> drugInfo : drugList) {
|
||||||
Long drugId = ((Number) drugInfo.get("drugId")).longValue();
|
Long drugId = ((Number) drugInfo.get("drugId")).longValue();
|
||||||
Integer quantity = ((Number) drugInfo.get("quantity")).intValue();
|
Integer quantity = ((Number) drugInfo.get("quantity")).intValue();
|
||||||
String operator = (String) drugInfo.get("operator");
|
String operator = (String) drugInfo.getOrDefault("operator", "system");
|
||||||
|
|
||||||
// 1. 先写入发药明细
|
// 1. 写入明细
|
||||||
drugMapper.insertDrugDispenseDetail(orderId, drugId, quantity, operator);
|
drugMapper.insertDrugDispenseDetail(orderId, drugId, quantity, operator);
|
||||||
// 2. 同步更新/插入发药汇总单(累计数量)
|
|
||||||
|
// 2. 更新/插入汇总(UPSERT)
|
||||||
drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity);
|
drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退药处理(逻辑同发药,保持明细与汇总同步)
|
* 退药(数量使用负数保存,业务同上)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@@ -70,13 +75,14 @@ public class InpatientDrugServiceImpl implements InpatientDrugService {
|
|||||||
|
|
||||||
for (Map<String, Object> drugInfo : drugList) {
|
for (Map<String, Object> drugInfo : drugList) {
|
||||||
Long drugId = ((Number) drugInfo.get("drugId")).longValue();
|
Long drugId = ((Number) drugInfo.get("drugId")).longValue();
|
||||||
Integer quantity = ((Number) drugInfo.get("quantity")).intValue();
|
Integer quantity = -Math.abs(((Number) drugInfo.get("quantity")).intValue()); // 负数
|
||||||
String operator = (String) drugInfo.get("operator");
|
String operator = (String) drugInfo.getOrDefault("operator", "system");
|
||||||
|
|
||||||
// 退药明细(数量存负数)
|
// 1. 写入退药明细
|
||||||
drugMapper.insertDrugReturnDetail(orderId, drugId, quantity, operator);
|
drugMapper.insertDrugReturnDetail(orderId, drugId, quantity, operator);
|
||||||
// 汇总单同步扣减
|
|
||||||
drugMapper.upsertDrugDispenseSummary(orderId, drugId, -quantity);
|
// 2. 汇总单同样使用 UPSERT,负数会自动扣减
|
||||||
|
drugMapper.upsertDrugDispenseSummary(orderId, drugId, quantity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user