|  | @@ -322,6 +322,55 @@ public class MzPharmacyController {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              resultMap = mzPharmacyService.refundMedicineProcessing(mzRefundMedicineVos, tokenUser.getUserIdCode());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            // ================= 新增:根据药品类型区分处理追溯码转移 =================
 | 
	
		
			
				|  |  | +            // 目的:拆零药品追溯码转移失败不报错,不拆零药品追溯码转移失败正常报错
 | 
	
		
			
				|  |  | +            // 判断逻辑:serial="01"为拆零药品,serial="99"为不拆零药品
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 按药品类型分组处理
 | 
	
		
			
				|  |  | +            List<MzRefundMedicineVo> splitDrugList = new ArrayList<>(); // 拆零药品
 | 
	
		
			
				|  |  | +            List<MzRefundMedicineVo> nonSplitDrugList = new ArrayList<>(); // 不拆零药品
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            for (MzRefundMedicineVo refundVo : mzRefundMedicineVos) {
 | 
	
		
			
				|  |  | +                if ("01".equals(refundVo.getSerial())) {
 | 
	
		
			
				|  |  | +                    // 拆零药品
 | 
	
		
			
				|  |  | +                    splitDrugList.add(refundVo);
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    // 不拆零药品
 | 
	
		
			
				|  |  | +                    nonSplitDrugList.add(refundVo);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 处理拆零药品(容错处理)
 | 
	
		
			
				|  |  | +            if (!splitDrugList.isEmpty()) {
 | 
	
		
			
				|  |  | +                try {
 | 
	
		
			
				|  |  | +                    mzDrugTracCodgService.changeDrugCodgDataToTy(splitDrugList);
 | 
	
		
			
				|  |  | +                    log.info("拆零药品追溯码转移成功,退药处理完成 - 拆零药品数量: {}, 操作人: {}", 
 | 
	
		
			
				|  |  | +                            splitDrugList.size(), tokenUser.getUserIdCode());
 | 
	
		
			
				|  |  | +                } catch (Exception e) {
 | 
	
		
			
				|  |  | +                    // 拆零药品追溯码转移失败,记录详细错误信息,但不影响退药主流程
 | 
	
		
			
				|  |  | +                    StringBuilder refundInfo = new StringBuilder();
 | 
	
		
			
				|  |  | +                    for (MzRefundMedicineVo refundVo : splitDrugList) {
 | 
	
		
			
				|  |  | +                        refundInfo.append("病人ID:").append(refundVo.getPatientId())
 | 
	
		
			
				|  |  | +                                 .append(",处方号:").append(refundVo.getOrderNo())
 | 
	
		
			
				|  |  | +                                 .append(",药品编码:").append(refundVo.getChargeCode())
 | 
	
		
			
				|  |  | +                                 .append(";");
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    
 | 
	
		
			
				|  |  | +                    log.error("拆零药品追溯码转移失败,但不影响退药主流程 - 拆零药品: {}, 错误信息: {}, 操作人: {}", 
 | 
	
		
			
				|  |  | +                            refundInfo.toString(), e.getMessage(), tokenUser.getUserIdCode(), e);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 处理不拆零药品(原有逻辑,正常报错)
 | 
	
		
			
				|  |  | +            if (!nonSplitDrugList.isEmpty()) {
 | 
	
		
			
				|  |  | +                mzDrugTracCodgService.changeDrugCodgDataToTy(nonSplitDrugList);
 | 
	
		
			
				|  |  | +                log.info("不拆零药品追溯码转移成功,退药处理完成 - 不拆零药品数量: {}, 操作人: {}", 
 | 
	
		
			
				|  |  | +                        nonSplitDrugList.size(), tokenUser.getUserIdCode());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            // ================= 新增结束 =================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // ================= 原方案3代码(已隐藏,可能复用) =================
 | 
	
		
			
				|  |  | +            /*
 | 
	
		
			
				|  |  |              // ================= 方案3:追溯码转移容错逻辑 =================
 | 
	
		
			
				|  |  |              // 目的:确保追溯码转移失败不影响退药主流程,避免医保接口报错
 | 
	
		
			
				|  |  |              // 问题:如果追溯码重复,数据库会报主键冲突错误,导致医保接口调用时追溯码为空
 | 
	
	
		
			
				|  | @@ -350,6 +399,8 @@ public class MzPharmacyController {
 | 
	
		
			
				|  |  |                  // 3. 需要在前端或医保接口层面做额外处理
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              // ================= 方案3结束 =================
 | 
	
		
			
				|  |  | +            */
 | 
	
		
			
				|  |  | +            // ================= 原方案3代码结束 =================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // ================= 原代码(已隐藏,可能复用) =================
 | 
	
		
			
				|  |  |              /*
 | 
	
	
		
			
				|  | @@ -410,6 +461,45 @@ public class MzPharmacyController {
 | 
	
		
			
				|  |  |                  resultMap.put("message", "撤销退药记录状态成功");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            // ================= 新增:根据药品类型区分处理撤销退药追溯码转移 =================
 | 
	
		
			
				|  |  | +            // 目的:拆零药品追溯码转移失败不报错,不拆零药品追溯码转移失败正常报错
 | 
	
		
			
				|  |  | +            // 判断逻辑:serial="01"为拆零药品,serial="99"为不拆零药品
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 注意:撤销退药时,需要先查询退药表中的追溯码数据,然后根据药品类型分别处理
 | 
	
		
			
				|  |  | +            // 由于撤销退药是单个操作,这里使用容错处理,但记录详细的药品类型信息
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            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);
 | 
	
		
			
				|  |  | +                
 | 
	
		
			
				|  |  | +                // 使用service方法进行追溯码转移
 | 
	
		
			
				|  |  | +                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代码(已隐藏,可能复用) =================
 | 
	
		
			
				|  |  | +            /*
 | 
	
		
			
				|  |  |              // ================= 方案3:撤销退药追溯码转移容错逻辑 =================
 | 
	
		
			
				|  |  |              // 目的:确保追溯码转移失败不影响撤销退药主流程,避免医保接口报错
 | 
	
		
			
				|  |  |              // 问题:如果追溯码重复,数据库会报主键冲突错误,导致医保接口调用时追溯码为空
 | 
	
	
		
			
				|  | @@ -440,6 +530,8 @@ public class MzPharmacyController {
 | 
	
		
			
				|  |  |                  // 3. 需要在前端或医保接口层面做额外处理
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              // ================= 方案3结束 =================
 | 
	
		
			
				|  |  | +            */
 | 
	
		
			
				|  |  | +            // ================= 原方案3代码结束 =================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // ================= 原代码(已隐藏,可能复用) =================
 | 
	
		
			
				|  |  |              /*
 | 
	
	
		
			
				|  | @@ -928,6 +1020,55 @@ public class MzPharmacyController {
 | 
	
		
			
				|  |  |                      .collect(java.util.stream.Collectors.toList());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  if (!validTracCodgList.isEmpty()) {
 | 
	
		
			
				|  |  | +                    // ================= 新增:根据药品类型区分处理追溯码 =================
 | 
	
		
			
				|  |  | +                    // 目的:拆零药品追溯码重复不报错,不拆零药品追溯码重复正常报错
 | 
	
		
			
				|  |  | +                    // 判断逻辑:serial="01"为拆零药品,serial="99"为不拆零药品
 | 
	
		
			
				|  |  | +                    
 | 
	
		
			
				|  |  | +                    // 按药品类型分组处理
 | 
	
		
			
				|  |  | +                    List<MzDrugTracCodg> splitDrugList = new ArrayList<>(); // 拆零药品
 | 
	
		
			
				|  |  | +                    List<MzDrugTracCodg> nonSplitDrugList = new ArrayList<>(); // 不拆零药品
 | 
	
		
			
				|  |  | +                    
 | 
	
		
			
				|  |  | +                    for (MzDrugTracCodg tracCodg : validTracCodgList) {
 | 
	
		
			
				|  |  | +                        if ("01".equals(tracCodg.getSerial())) {
 | 
	
		
			
				|  |  | +                            // 拆零药品
 | 
	
		
			
				|  |  | +                            splitDrugList.add(tracCodg);
 | 
	
		
			
				|  |  | +                        } else {
 | 
	
		
			
				|  |  | +                            // 不拆零药品
 | 
	
		
			
				|  |  | +                            nonSplitDrugList.add(tracCodg);
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    
 | 
	
		
			
				|  |  | +                    // 处理拆零药品(容错处理)
 | 
	
		
			
				|  |  | +                    if (!splitDrugList.isEmpty()) {
 | 
	
		
			
				|  |  | +                        try {
 | 
	
		
			
				|  |  | +                            mzDrugTracCodgService.saveMzDrugTracCodgData(splitDrugList, tokenUser);
 | 
	
		
			
				|  |  | +                            log.info("拆零药品追溯码插入成功 - 病人ID: {}, 处方号: {}, 流水号: {}, 追溯码数量: {}, 操作人: {}", 
 | 
	
		
			
				|  |  | +                                    mzChargeDetail.getPatientId(), mzChargeDetail.getOrderNo(), mzChargeDetail.getRealNo(), 
 | 
	
		
			
				|  |  | +                                    splitDrugList.size(), tokenUser.getUserIdCode());
 | 
	
		
			
				|  |  | +                        } catch (Exception e) {
 | 
	
		
			
				|  |  | +                            // 拆零药品追溯码插入失败,记录详细错误信息,但不影响发药主流程
 | 
	
		
			
				|  |  | +                            StringBuilder tracCodgInfo = new StringBuilder();
 | 
	
		
			
				|  |  | +                            for (MzDrugTracCodg tracCodg : splitDrugList) {
 | 
	
		
			
				|  |  | +                                tracCodgInfo.append(tracCodg.getDrugTracCodg()).append(",");
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                            
 | 
	
		
			
				|  |  | +                            log.error("拆零药品追溯码插入失败,但不影响发药主流程 - 病人ID: {}, 处方号: {}, 流水号: {}, 追溯码: {}, 错误信息: {}, 操作人: {}", 
 | 
	
		
			
				|  |  | +                                    mzChargeDetail.getPatientId(), mzChargeDetail.getOrderNo(), mzChargeDetail.getRealNo(),
 | 
	
		
			
				|  |  | +                                    tracCodgInfo.toString(), e.getMessage(), tokenUser.getUserIdCode(), e);
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    
 | 
	
		
			
				|  |  | +                    // 处理不拆零药品(原有逻辑,正常报错)
 | 
	
		
			
				|  |  | +                    if (!nonSplitDrugList.isEmpty()) {
 | 
	
		
			
				|  |  | +                        mzDrugTracCodgService.saveMzDrugTracCodgData(nonSplitDrugList, tokenUser);
 | 
	
		
			
				|  |  | +                        log.info("不拆零药品追溯码插入成功 - 病人ID: {}, 处方号: {}, 流水号: {}, 追溯码数量: {}, 操作人: {}", 
 | 
	
		
			
				|  |  | +                                mzChargeDetail.getPatientId(), mzChargeDetail.getOrderNo(), mzChargeDetail.getRealNo(), 
 | 
	
		
			
				|  |  | +                                nonSplitDrugList.size(), tokenUser.getUserIdCode());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    // ================= 新增结束 =================
 | 
	
		
			
				|  |  | +                    
 | 
	
		
			
				|  |  | +                    // ================= 原方案3代码(已隐藏,可能复用) =================
 | 
	
		
			
				|  |  | +                    /*
 | 
	
		
			
				|  |  |                      // ================= 方案3:追溯码处理容错逻辑 =================
 | 
	
		
			
				|  |  |                      // 目的:确保追溯码插入失败不影响发药主流程,避免医保接口报错
 | 
	
		
			
				|  |  |                      // 问题:如果追溯码重复,数据库会报主键冲突错误,导致医保接口调用时追溯码为空
 | 
	
	
		
			
				|  | @@ -956,6 +1097,8 @@ public class MzPharmacyController {
 | 
	
		
			
				|  |  |                          // 3. 需要在前端或医保接口层面做额外处理
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      // ================= 方案3结束 =================
 | 
	
		
			
				|  |  | +                    */
 | 
	
		
			
				|  |  | +                    // ================= 原方案3代码结束 =================
 | 
	
		
			
				|  |  |                      
 | 
	
		
			
				|  |  |                      // ================= 原代码(已隐藏,可能复用) =================
 | 
	
		
			
				|  |  |                      /*
 | 
	
	
		
			
				|  | @@ -1064,6 +1207,55 @@ public class MzPharmacyController {
 | 
	
		
			
				|  |  |                  return resultMap;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            // ================= 新增:根据药品类型区分处理追溯码 =================
 | 
	
		
			
				|  |  | +            // 目的:拆零药品追溯码重复不报错,不拆零药品追溯码重复正常报错
 | 
	
		
			
				|  |  | +            // 判断逻辑:serial="01"为拆零药品,serial="99"为不拆零药品
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 按药品类型分组处理
 | 
	
		
			
				|  |  | +            List<MzDrugTracCodg> splitDrugList = new ArrayList<>(); // 拆零药品
 | 
	
		
			
				|  |  | +            List<MzDrugTracCodg> nonSplitDrugList = new ArrayList<>(); // 不拆零药品
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            for (MzDrugTracCodg tracCodg : list) {
 | 
	
		
			
				|  |  | +                if ("01".equals(tracCodg.getSerial())) {
 | 
	
		
			
				|  |  | +                    // 拆零药品
 | 
	
		
			
				|  |  | +                    splitDrugList.add(tracCodg);
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    // 不拆零药品
 | 
	
		
			
				|  |  | +                    nonSplitDrugList.add(tracCodg);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 处理拆零药品(容错处理)
 | 
	
		
			
				|  |  | +            if (!splitDrugList.isEmpty()) {
 | 
	
		
			
				|  |  | +                try {
 | 
	
		
			
				|  |  | +                    mzDrugTracCodgService.saveMzDrugTracCodgData(splitDrugList, tokenUser);
 | 
	
		
			
				|  |  | +                    log.info("配药拆零药品追溯码保存成功 - 病人ID: {}, 处方号: {}, 次数: {}, 追溯码数量: {}, 操作人: {}", 
 | 
	
		
			
				|  |  | +                            list.get(0).getPatientId(), list.get(0).getOrderNo(), list.get(0).getTimes(), 
 | 
	
		
			
				|  |  | +                            splitDrugList.size(), tokenUser.getUserIdCode());
 | 
	
		
			
				|  |  | +                } catch (Exception e) {
 | 
	
		
			
				|  |  | +                    // 拆零药品追溯码保存失败,记录详细错误信息,但不影响配药主流程
 | 
	
		
			
				|  |  | +                    StringBuilder tracCodgInfo = new StringBuilder();
 | 
	
		
			
				|  |  | +                    for (MzDrugTracCodg tracCodg : splitDrugList) {
 | 
	
		
			
				|  |  | +                        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);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 处理不拆零药品(原有逻辑,正常报错)
 | 
	
		
			
				|  |  | +            if (!nonSplitDrugList.isEmpty()) {
 | 
	
		
			
				|  |  | +                mzDrugTracCodgService.saveMzDrugTracCodgData(nonSplitDrugList, tokenUser);
 | 
	
		
			
				|  |  | +                log.info("配药不拆零药品追溯码保存成功 - 病人ID: {}, 处方号: {}, 次数: {}, 追溯码数量: {}, 操作人: {}", 
 | 
	
		
			
				|  |  | +                        list.get(0).getPatientId(), list.get(0).getOrderNo(), list.get(0).getTimes(), 
 | 
	
		
			
				|  |  | +                        nonSplitDrugList.size(), tokenUser.getUserIdCode());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            // ================= 新增结束 =================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // ================= 原方案3代码(已隐藏,可能复用) =================
 | 
	
		
			
				|  |  | +            /*
 | 
	
		
			
				|  |  |              // ================= 方案3:配药追溯码保存容错逻辑 =================
 | 
	
		
			
				|  |  |              // 目的:确保追溯码保存失败不影响配药主流程,避免医保接口报错
 | 
	
		
			
				|  |  |              // 问题:如果追溯码重复,数据库会报主键冲突错误,导致医保接口调用时追溯码为空
 | 
	
	
		
			
				|  | @@ -1092,6 +1284,8 @@ public class MzPharmacyController {
 | 
	
		
			
				|  |  |                  // 3. 需要在前端或医保接口层面做额外处理
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              // ================= 方案3结束 =================
 | 
	
		
			
				|  |  | +            */
 | 
	
		
			
				|  |  | +            // ================= 原方案3代码结束 =================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // ================= 原代码(已隐藏,可能复用) =================
 | 
	
		
			
				|  |  |              /*
 |