From 10ca4fae063cfa63500c965af9250b119ecc3818 Mon Sep 17 00:00:00 2001 From: Yuan <1450637472@qq.com> Date: Fri, 21 Nov 2025 10:06:18 +0800 Subject: [PATCH] =?UTF-8?q?bugfix=EF=BC=9A=E4=B8=89=E6=96=B9=E4=B8=80?= =?UTF-8?q?=E5=AF=B9=E5=A4=9Ahis=E5=9C=BA=E6=99=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/TransactionDetailMapper.java | 10 ++ .../jobMethod/ReconciliationMethod.java | 162 +++++++++++++++++- .../service/TransactionDetailService.java | 10 ++ .../impl/TransactionDetailServiceImpl.java | 10 ++ .../mapper/HisbillsHistoryMapper.xml | 9 +- .../mapper/TransactionDetailMapper.xml | 29 ++++ 6 files changed, 218 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/saye/hospitalgd/mapper/TransactionDetailMapper.java b/src/main/java/com/saye/hospitalgd/mapper/TransactionDetailMapper.java index e03b5b0..8779fd9 100644 --- a/src/main/java/com/saye/hospitalgd/mapper/TransactionDetailMapper.java +++ b/src/main/java/com/saye/hospitalgd/mapper/TransactionDetailMapper.java @@ -76,6 +76,16 @@ public interface TransactionDetailMapper { void deleteThirdUnilateralByIddh(HashMap map) throws Exception; + /** + * 根据订单号删除third_join_his中所有相关记录(用于一对多场景) + */ + void deleteThirdJoinDataByI_DDH(HashMap map) throws Exception; + + /** + * 更新third_join_his中的银行单边记录,补充HIS数据(用于一对多场景) + */ + void updateThirdJoinDataWithHisData(HashMap map) throws Exception; + void addNotUniqueData(List> list) throws Exception; /** diff --git a/src/main/java/com/saye/hospitalgd/scheduler/jobMethod/ReconciliationMethod.java b/src/main/java/com/saye/hospitalgd/scheduler/jobMethod/ReconciliationMethod.java index 146f5ec..5560237 100644 --- a/src/main/java/com/saye/hospitalgd/scheduler/jobMethod/ReconciliationMethod.java +++ b/src/main/java/com/saye/hospitalgd/scheduler/jobMethod/ReconciliationMethod.java @@ -288,6 +288,121 @@ public class ReconciliationMethod { } } } else if ("1".equals(check_result) && "2".equals(err_type)) { + //三方单边账 先检查是否是一对多的情况(HIS端有多条记录,金额累加等于银行金额) + boolean isManyToOneMatched = false; + if (!"".equals(i_ddh)) { + // 查询HIS端是否有相同订单号的记录(使用PlatformTransId查询) + HashMap manyToOneSearchMap = new HashMap<>(); + manyToOneSearchMap.put("platformTransId", i_ddh); // 使用银行订单号作为PlatformTransId查询HIS记录 + manyToOneSearchMap.put("h_jylx", i_jylx); + manyToOneSearchMap.put("trade_date", thistrade_date); + manyToOneSearchMap.put("orderby_je", "true"); + + List> hisList = hisbillsHistoryService.findHisDetailByParam(manyToOneSearchMap); + + // 如果HIS端有多条记录,检查金额累加是否等于银行金额 + if (hisList != null && hisList.size() > 1) { + System.out.println("找到一对多场景:银行订单号=" + i_ddh + ", HIS记录数=" + hisList.size()); + java.math.BigDecimal hisTotal = java.math.BigDecimal.ZERO; + for (HashMap hisItem : hisList) { + String amountStr = StringDUtil.changeNullToEmpty(hisItem.get("AMOUNT")); + if (!"".equals(amountStr)) { + try { + hisTotal = hisTotal.add(AmountUtil.toBigDecimal(amountStr)); + } catch (Exception e) { + hisTotal = null; + break; + } + } + } + + if (hisTotal != null) { + java.math.BigDecimal hisTotalDecimal = AmountUtil.toBigDecimal(hisTotal.toString()); + java.math.BigDecimal bankAmtDecimal = AmountUtil.toBigDecimal(i_jyje); + + if (AmountUtil.isAmountEqual(hisTotalDecimal, bankAmtDecimal)) { + System.out.println("一对多金额匹配成功:银行金额=" + i_jyje + ", HIS总金额=" + hisTotal.toString()); + // 找到一对多匹配,构造完整记录并更新third_join_his + HashMap firstHisRecord = hisList.get(0); + + String aggregatedAmount = hisTotal.toString(); + String hJylx = StringDUtil.changeNullToEmpty(firstHisRecord.get("TRADINGSTATUS")); + String tradeTimeForManyToOne = StringDUtil.changeNullToEmpty(firstHisRecord.get("TRADETIME")); + String payTypeForManyToOne = StringDUtil.changeNullToEmpty(firstHisRecord.get("PAYTYPE")); + String hisopernumForManyToOne = StringDUtil.changeNullToEmpty(firstHisRecord.get("HISOPERCODE")); + String bizTypeForManyToOne = StringDUtil.changeNullToEmpty(firstHisRecord.get("BIZTYPE")); + String patientidForManyToOne = StringDUtil.changeNullToEmpty(firstHisRecord.get("PATIENTID")); + String patientnameForManyToOne = StringDUtil.changeNullToEmpty(firstHisRecord.get("PATIENTNAME")); + + HashMap addMap = new HashMap<>(); + addMap.put("jysj", jysj); + addMap.put("i_ddh", i_ddh); + addMap.put("i_jyje", i_jyje); + addMap.put("i_jylx", i_jylx); + addMap.put("i_jyqd", i_jyqd); + addMap.put("tradeTime", tradeTimeForManyToOne); + addMap.put("tranID", i_ddh); // 使用银行订单号作为TranID + addMap.put("BizType", bizTypeForManyToOne); + addMap.put("h_jylx", hJylx); + addMap.put("amount", aggregatedAmount); + addMap.put("payType", payTypeForManyToOne); + addMap.put("hisOperNum", hisopernumForManyToOne); + addMap.put("patientid", patientidForManyToOne); + addMap.put("patientname", patientnameForManyToOne); + addMap.put("sort_date", tradeTimeForManyToOne); + addMap.put("trade_date", thistrade_date); + // 更新现有记录,补充HIS数据(不删除,保持记录ID不变,不影响统计) + HashMap updateMap = new HashMap<>(); + updateMap.put("trade_date", thistrade_date); + updateMap.put("i_ddh", i_ddh); + updateMap.put("tradeTime", tradeTimeForManyToOne); + updateMap.put("tranID", i_ddh); + updateMap.put("BizType", bizTypeForManyToOne); + updateMap.put("h_jylx", hJylx); + updateMap.put("amount", aggregatedAmount); + updateMap.put("payType", payTypeForManyToOne); + updateMap.put("hisOperNum", hisopernumForManyToOne); + updateMap.put("patientid", patientidForManyToOne); + updateMap.put("patientname", patientnameForManyToOne); + updateMap.put("sort_date", tradeTimeForManyToOne); + updateMap.put("err_type", ""); + updateMap.put("check_result", "0"); + + System.out.println("主循环:更新third_join_his记录,补充HIS数据:trade_date=" + thistrade_date + ", i_ddh=" + i_ddh + ", amount=" + aggregatedAmount + ", check_result=0"); + // 先查询是否存在该记录 + HashMap checkBeforeUpdate = new HashMap<>(); + checkBeforeUpdate.put("trade_date", thistrade_date); + checkBeforeUpdate.put("i_ddh", i_ddh); + List> beforeUpdate = transactionDetailService.findHisAndThirdJoinDataByParam(checkBeforeUpdate); + System.out.println("主循环:更新前查询到记录数=" + (beforeUpdate != null ? beforeUpdate.size() : 0)); + + transactionDetailService.updateThirdJoinDataWithHisData(updateMap); + + // 更新后再次查询确认 + List> afterUpdate = transactionDetailService.findHisAndThirdJoinDataByParam(checkBeforeUpdate); + System.out.println("主循环:更新后查询到记录数=" + (afterUpdate != null ? afterUpdate.size() : 0)); + if (afterUpdate != null && afterUpdate.size() > 0) { + String checkResult = StringDUtil.changeNullToEmpty(afterUpdate.get(0).get("CHECK_RESULT")); + System.out.println("主循环:更新后check_result=" + checkResult); + } + + // 清除单边账表中的记录 + HashMap delBankUnilateralMap = new HashMap<>(); + delBankUnilateralMap.put("trade_date", thistrade_date); + delBankUnilateralMap.put("i_ddh", i_ddh); + unilateralService.deleteBankUnilateralByI_DDH(delBankUnilateralMap); + + isManyToOneMatched = true; + } + } + } + } + + // 如果已经处理了一对多的情况,跳过后续的单边账处理 + if (isManyToOneMatched) { + continue; + } + //三方单边账 查询历史单边账表是否已有记录 有不动 没有添加 List> unilateralList = null; @@ -600,14 +715,45 @@ public class ReconciliationMethod { addMap.put("is_active", "1"); addMap.put("join_id", ""); - // 删除第三方单边账记录(third_join_his 中 err_type = '2') - HashMap delThirdMap = new HashMap<>(); - delThirdMap.put("trade_date", trade_date); - delThirdMap.put("i_ddh", i_ddh); - transactionDetailService.deleteThirdUnilateralByIddh(delThirdMap); - - // 立即写入聚合后的正常对账记录 - transactionDetailService.addNotUniqueData(Collections.singletonList(addMap)); + // 先检查是否已经有对平的记录(check_result='0'),如果有则只更新,不删除 + HashMap checkMap = new HashMap<>(); + checkMap.put("trade_date", trade_date); + checkMap.put("i_ddh", i_ddh); + checkMap.put("check_result", "0"); + List> existingRecords = transactionDetailService.findHisAndThirdJoinDataByParam(checkMap); + + System.out.println("notUniqueList循环:检查已对平记录,i_ddh=" + i_ddh + ", 找到记录数=" + (existingRecords != null ? existingRecords.size() : 0)); + + if (existingRecords != null && existingRecords.size() > 0) { + // 如果已经有对平的记录,只更新它(确保数据完整,不删除记录) + System.out.println("notUniqueList循环:发现已对平记录,只更新不删除:i_ddh=" + i_ddh); + HashMap updateMap = new HashMap<>(); + updateMap.put("trade_date", trade_date); + updateMap.put("i_ddh", i_ddh); + updateMap.put("tradeTime", tradeTime); + updateMap.put("tranID", tranid); + updateMap.put("BizType", bizType); + updateMap.put("h_jylx", hJylx); + updateMap.put("amount", amount); + updateMap.put("payType", payType); + updateMap.put("hisOperNum", hisopernum); + updateMap.put("patientid", patientid); + updateMap.put("patientname", patientname); + updateMap.put("sort_date", tradeTime); + updateMap.put("err_type", ""); + updateMap.put("check_result", "0"); + transactionDetailService.updateThirdJoinDataWithHisData(updateMap); + } else { + // 如果没有已对平的记录,才删除并重新插入(这种情况不应该发生,因为主循环应该已经处理了) + System.out.println("notUniqueList循环:未找到已对平记录,删除并重新插入:i_ddh=" + i_ddh); + HashMap delThirdMap = new HashMap<>(); + delThirdMap.put("trade_date", trade_date); + delThirdMap.put("i_ddh", i_ddh); + transactionDetailService.deleteThirdJoinDataByI_DDH(delThirdMap); + + // 立即写入聚合后的正常对账记录(包含完整的HIS和银行数据) + transactionDetailService.addNotUniqueData(Collections.singletonList(addMap)); + } // 清除因银行单边账先生成而残留的记录 HashMap delBankUnilateralMap = new HashMap<>(); diff --git a/src/main/java/com/saye/hospitalgd/service/TransactionDetailService.java b/src/main/java/com/saye/hospitalgd/service/TransactionDetailService.java index ad928ed..25c87c5 100644 --- a/src/main/java/com/saye/hospitalgd/service/TransactionDetailService.java +++ b/src/main/java/com/saye/hospitalgd/service/TransactionDetailService.java @@ -73,6 +73,16 @@ public interface TransactionDetailService { void deleteThirdUnilateralByIddh(HashMap map) throws Exception; + /** + * 根据订单号删除third_join_his中所有相关记录(用于一对多场景) + */ + void deleteThirdJoinDataByI_DDH(HashMap map) throws Exception; + + /** + * 更新third_join_his中的银行单边记录,补充HIS数据(用于一对多场景) + */ + void updateThirdJoinDataWithHisData(HashMap map) throws Exception; + /** * @description: 添加处理后的非唯一记录回数据 * @author thuang diff --git a/src/main/java/com/saye/hospitalgd/service/impl/TransactionDetailServiceImpl.java b/src/main/java/com/saye/hospitalgd/service/impl/TransactionDetailServiceImpl.java index f5aaff0..8ae8ce8 100644 --- a/src/main/java/com/saye/hospitalgd/service/impl/TransactionDetailServiceImpl.java +++ b/src/main/java/com/saye/hospitalgd/service/impl/TransactionDetailServiceImpl.java @@ -164,6 +164,16 @@ public class TransactionDetailServiceImpl implements TransactionDetailService { transactionDetailMapper.deleteThirdUnilateralByIddh(map); } + @Override + public void deleteThirdJoinDataByI_DDH(HashMap map) throws Exception { + transactionDetailMapper.deleteThirdJoinDataByI_DDH(map); + } + + @Override + public void updateThirdJoinDataWithHisData(HashMap map) throws Exception { + transactionDetailMapper.updateThirdJoinDataWithHisData(map); + } + @Override public void addNotUniqueData(List> list) throws Exception { transactionDetailMapper.addNotUniqueData(list); diff --git a/src/main/resources/mapper/HisbillsHistoryMapper.xml b/src/main/resources/mapper/HisbillsHistoryMapper.xml index 0c888ef..d6c03b3 100644 --- a/src/main/resources/mapper/HisbillsHistoryMapper.xml +++ b/src/main/resources/mapper/HisbillsHistoryMapper.xml @@ -48,14 +48,12 @@ ,TradeTime ,Amount ,PlatformTransId - ,HisTransId - ,PatientID + ,PatientId as PatientID ,PatientName - ,source ,trade_date - from hisbills_history + from hisbill_history where trade_date=#{trade_date} and PayMethod != '2' @@ -73,6 +71,9 @@ and HisTransId=#{tranID} + + and PlatformTransId=#{platformTransId} + and TradingStatus=#{h_jylx} diff --git a/src/main/resources/mapper/TransactionDetailMapper.xml b/src/main/resources/mapper/TransactionDetailMapper.xml index 43d8b39..2f867c7 100644 --- a/src/main/resources/mapper/TransactionDetailMapper.xml +++ b/src/main/resources/mapper/TransactionDetailMapper.xml @@ -601,6 +601,7 @@ from third_join_his where trade_date = #{trade_date} and TranID != '' + and check_result != '0' group by TranID, H_JYLX having count(TranID) > 1 @@ -612,6 +613,7 @@ where trade_date = #{trade_date} and TranID = #{tranID} and H_JYLX = #{h_jylx} + and check_result != '0' @@ -622,6 +624,33 @@ and err_type = '2' + + + delete + from third_join_his + where trade_date = #{trade_date} + and I_DDH = #{i_ddh} + + + + + update third_join_his + set TradeTime = #{tradeTime}, + TranID = #{tranID}, + BizType = #{BizType}, + H_JYLX = #{h_jylx}, + Amount = #{amount}, + PayType = #{payType}, + HisOperNum = #{hisOperNum}, + PatientID = #{patientid}, + PatientName = #{patientname}, + sort_date = #{sort_date}, + err_type = #{err_type}, + check_result = #{check_result} + where trade_date = #{trade_date} + and I_DDH = #{i_ddh} + + insert into third_join_his(JYSJ