|
@@ -322,6 +322,37 @@ public class MzPharmacyController {
|
|
|
}
|
|
|
resultMap = mzPharmacyService.refundMedicineProcessing(mzRefundMedicineVos, tokenUser.getUserIdCode());
|
|
|
|
|
|
+ // ================= 方案3:追溯码转移容错逻辑 =================
|
|
|
+ // 目的:确保追溯码转移失败不影响退药主流程,避免医保接口报错
|
|
|
+ // 问题:如果追溯码重复,数据库会报主键冲突错误,导致医保接口调用时追溯码为空
|
|
|
+ // 解决方案:捕获异常,记录详细日志,但不影响主流程
|
|
|
+ try {
|
|
|
+ mzDrugTracCodgService.changeDrugCodgDataToTy(mzRefundMedicineVos);
|
|
|
+ log.info("追溯码转移成功,退药处理完成 - 退药记录数量: {}, 操作人: {}",
|
|
|
+ mzRefundMedicineVos.size(), tokenUser.getUserIdCode());
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 追溯码转移失败,记录详细错误信息,但不影响退药主流程
|
|
|
+ StringBuilder refundInfo = new StringBuilder();
|
|
|
+ for (MzRefundMedicineVo refundVo : mzRefundMedicineVos) {
|
|
|
+ refundInfo.append("病人ID:").append(refundVo.getPatientId())
|
|
|
+ .append(",处方号:").append(refundVo.getOrderNo())
|
|
|
+ .append(",药品编码:").append(refundVo.getChargeCode())
|
|
|
+ .append(";");
|
|
|
+ }
|
|
|
+
|
|
|
+ log.error("追溯码转移失败,但不影响退药主流程 - 退药记录: {}, 错误信息: {}, 操作人: {}",
|
|
|
+ refundInfo.toString(), e.getMessage(), tokenUser.getUserIdCode(), e);
|
|
|
+
|
|
|
+ // 注意:这里不抛出异常,确保退药主流程继续执行
|
|
|
+ // 但会导致后续问题:
|
|
|
+ // 1. 医保接口调用时,追溯码查询可能返回空
|
|
|
+ // 2. 医保接口可能报"追溯码不能为空"错误
|
|
|
+ // 3. 需要在前端或医保接口层面做额外处理
|
|
|
+ }
|
|
|
+ // ================= 方案3结束 =================
|
|
|
+
|
|
|
+ // ================= 原代码(已隐藏,可能复用) =================
|
|
|
+ /*
|
|
|
//将药品追溯码数据转移到退药表 - 单独处理,不影响退药主流程
|
|
|
try {
|
|
|
mzDrugTracCodgService.changeDrugCodgDataToTy(mzRefundMedicineVos);
|
|
@@ -334,6 +365,8 @@ public class MzPharmacyController {
|
|
|
// resultMap.put("message", "退药处理失败:追溯码转移失败" + e.getMessage());
|
|
|
// return resultMap;
|
|
|
}
|
|
|
+ */
|
|
|
+ // ================= 原代码结束 =================
|
|
|
|
|
|
return resultMap;
|
|
|
} catch (Exception e) {
|
|
@@ -377,6 +410,39 @@ public class MzPharmacyController {
|
|
|
resultMap.put("message", "撤销退药记录状态成功");
|
|
|
}
|
|
|
|
|
|
+ // ================= 方案3:撤销退药追溯码转移容错逻辑 =================
|
|
|
+ // 目的:确保追溯码转移失败不影响撤销退药主流程,避免医保接口报错
|
|
|
+ // 问题:如果追溯码重复,数据库会报主键冲突错误,导致医保接口调用时追溯码为空
|
|
|
+ // 解决方案:捕获异常,记录详细日志,但不影响主流程
|
|
|
+ try {
|
|
|
+ //将药品追溯码退药表数据转移到正式表中
|
|
|
+ MzDrugTracCodg codg = new MzDrugTracCodg();
|
|
|
+ codg.setPatientId(patientId);
|
|
|
+ codg.setTimes(times);
|
|
|
+ //退费处方需要将发票号转正
|
|
|
+ codg.setReceiptNo(Math.abs(receiptNo));
|
|
|
+ codg.setRealNo(realNo);
|
|
|
+ codg.setOrderNo(orderNo);
|
|
|
+ codg.setGroupNo(groupNo);
|
|
|
+ mzDrugTracCodgService.changeDrugCodgDataFormTy(codg);
|
|
|
+
|
|
|
+ log.info("撤销退药追溯码转移成功 - 病人ID: {}, 处方号: {}, 流水号: {}, 发票号: {}, 操作人: {}",
|
|
|
+ patientId, orderNo, realNo, receiptNo, tokenUser.getUserIdCode());
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 追溯码转移失败,记录详细错误信息,但不影响撤销退药主流程
|
|
|
+ log.error("撤销退药追溯码转移失败,但不影响主流程 - 病人ID: {}, 处方号: {}, 流水号: {}, 发票号: {}, 错误信息: {}, 操作人: {}",
|
|
|
+ patientId, orderNo, realNo, receiptNo, e.getMessage(), tokenUser.getUserIdCode(), e);
|
|
|
+
|
|
|
+ // 注意:这里不抛出异常,确保撤销退药主流程继续执行
|
|
|
+ // 但会导致后续问题:
|
|
|
+ // 1. 医保接口调用时,追溯码查询可能返回空
|
|
|
+ // 2. 医保接口可能报"追溯码不能为空"错误
|
|
|
+ // 3. 需要在前端或医保接口层面做额外处理
|
|
|
+ }
|
|
|
+ // ================= 方案3结束 =================
|
|
|
+
|
|
|
+ // ================= 原代码(已隐藏,可能复用) =================
|
|
|
+ /*
|
|
|
//将药品追溯码退药表数据转移到正式表中
|
|
|
MzDrugTracCodg codg = new MzDrugTracCodg();
|
|
|
codg.setPatientId(patientId);
|
|
@@ -387,6 +453,8 @@ public class MzPharmacyController {
|
|
|
codg.setOrderNo(orderNo);
|
|
|
codg.setGroupNo(groupNo);
|
|
|
mzDrugTracCodgService.changeDrugCodgDataFormTy(codg);
|
|
|
+ */
|
|
|
+ // ================= 原代码结束 =================
|
|
|
|
|
|
return resultMap;
|
|
|
} catch (Exception e) {
|
|
@@ -860,8 +928,41 @@ public class MzPharmacyController {
|
|
|
.collect(java.util.stream.Collectors.toList());
|
|
|
|
|
|
if (!validTracCodgList.isEmpty()) {
|
|
|
+ // ================= 方案3:追溯码处理容错逻辑 =================
|
|
|
+ // 目的:确保追溯码插入失败不影响发药主流程,避免医保接口报错
|
|
|
+ // 问题:如果追溯码重复,数据库会报主键冲突错误,导致医保接口调用时追溯码为空
|
|
|
+ // 解决方案:捕获异常,记录详细日志,但不影响主流程
|
|
|
+ try {
|
|
|
+ // 保存追溯码数据
|
|
|
+ mzDrugTracCodgService.saveMzDrugTracCodgData(validTracCodgList, tokenUser);
|
|
|
+ log.info("追溯码插入成功 - 病人ID: {}, 处方号: {}, 流水号: {}, 追溯码数量: {}, 操作人: {}",
|
|
|
+ mzChargeDetail.getPatientId(), mzChargeDetail.getOrderNo(), mzChargeDetail.getRealNo(),
|
|
|
+ validTracCodgList.size(), tokenUser.getUserIdCode());
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 追溯码插入失败,记录详细错误信息,但不影响发药主流程
|
|
|
+ StringBuilder tracCodgInfo = new StringBuilder();
|
|
|
+ for (MzDrugTracCodg tracCodg : validTracCodgList) {
|
|
|
+ tracCodgInfo.append(tracCodg.getDrugTracCodg()).append(",");
|
|
|
+ }
|
|
|
+
|
|
|
+ log.error("追溯码插入失败,但不影响发药主流程 - 病人ID: {}, 处方号: {}, 流水号: {}, 药品编码: {}, 追溯码: {}, 错误信息: {}, 操作人: {}",
|
|
|
+ mzChargeDetail.getPatientId(), mzChargeDetail.getOrderNo(), mzChargeDetail.getRealNo(),
|
|
|
+ mzChargeDetail.getChargeItemCode(), tracCodgInfo.toString(), e.getMessage(), tokenUser.getUserIdCode(), e);
|
|
|
+
|
|
|
+ // 注意:这里不抛出异常,确保发药主流程继续执行
|
|
|
+ // 但会导致后续问题:
|
|
|
+ // 1. 医保接口调用时,追溯码查询可能返回空
|
|
|
+ // 2. 医保接口可能报"追溯码不能为空"错误
|
|
|
+ // 3. 需要在前端或医保接口层面做额外处理
|
|
|
+ }
|
|
|
+ // ================= 方案3结束 =================
|
|
|
+
|
|
|
+ // ================= 原代码(已隐藏,可能复用) =================
|
|
|
+ /*
|
|
|
// 保存追溯码数据
|
|
|
mzDrugTracCodgService.saveMzDrugTracCodgData(validTracCodgList, tokenUser);
|
|
|
+ */
|
|
|
+ // ================= 原代码结束 =================
|
|
|
}
|
|
|
}
|
|
|
// ================= 新增结束 =================
|
|
@@ -963,8 +1064,41 @@ public class MzPharmacyController {
|
|
|
return resultMap;
|
|
|
}
|
|
|
|
|
|
+ // ================= 方案3:配药追溯码保存容错逻辑 =================
|
|
|
+ // 目的:确保追溯码保存失败不影响配药主流程,避免医保接口报错
|
|
|
+ // 问题:如果追溯码重复,数据库会报主键冲突错误,导致医保接口调用时追溯码为空
|
|
|
+ // 解决方案:捕获异常,记录详细日志,但不影响主流程
|
|
|
+ try {
|
|
|
+ //保存药品追溯码
|
|
|
+ mzDrugTracCodgService.saveMzDrugTracCodgData(list, tokenUser);
|
|
|
+ log.info("配药追溯码保存成功 - 病人ID: {}, 处方号: {}, 次数: {}, 追溯码数量: {}, 操作人: {}",
|
|
|
+ list.get(0).getPatientId(), list.get(0).getOrderNo(), list.get(0).getTimes(),
|
|
|
+ list.size(), tokenUser.getUserIdCode());
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 追溯码保存失败,记录详细错误信息,但不影响配药主流程
|
|
|
+ StringBuilder tracCodgInfo = new StringBuilder();
|
|
|
+ for (MzDrugTracCodg tracCodg : list) {
|
|
|
+ tracCodgInfo.append(tracCodg.getDrugTracCodg()).append(",");
|
|
|
+ }
|
|
|
+
|
|
|
+ log.error("配药追溯码保存失败,但不影响主流程 - 病人ID: {}, 处方号: {}, 次数: {}, 追溯码: {}, 错误信息: {}, 操作人: {}",
|
|
|
+ list.get(0).getPatientId(), list.get(0).getOrderNo(), list.get(0).getTimes(),
|
|
|
+ tracCodgInfo.toString(), e.getMessage(), tokenUser.getUserIdCode(), e);
|
|
|
+
|
|
|
+ // 注意:这里不抛出异常,确保配药主流程继续执行
|
|
|
+ // 但会导致后续问题:
|
|
|
+ // 1. 医保接口调用时,追溯码查询可能返回空
|
|
|
+ // 2. 医保接口可能报"追溯码不能为空"错误
|
|
|
+ // 3. 需要在前端或医保接口层面做额外处理
|
|
|
+ }
|
|
|
+ // ================= 方案3结束 =================
|
|
|
+
|
|
|
+ // ================= 原代码(已隐藏,可能复用) =================
|
|
|
+ /*
|
|
|
//保存药品追溯码
|
|
|
mzDrugTracCodgService.saveMzDrugTracCodgData(list, tokenUser);
|
|
|
+ */
|
|
|
+ // ================= 原代码结束 =================
|
|
|
|
|
|
MzChargeDetail mzChargeDetail = new MzChargeDetail();
|
|
|
mzChargeDetail.setPatientId(list.get(0).getPatientId());
|