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 3950cbb..282429e 100644 --- a/src/main/java/com/saye/hospitalgd/scheduler/jobMethod/ReconciliationMethod.java +++ b/src/main/java/com/saye/hospitalgd/scheduler/jobMethod/ReconciliationMethod.java @@ -507,16 +507,85 @@ public class ReconciliationMethod { searchNotUniqueObjMap.put("orderby_je", "true"); - //todo - //his端重复记录 + // his端重复记录 List> list = hisbillsHistoryService.findHisDetailByParam(searchNotUniqueObjMap); -// hisDetailService.findHisDetailByParam(searchNotUniqueObjMap); - - //三方端重复记录 + // 三方端重复记录 List> list2 = bankbillsHistoryService.findBankbillHistoryByParam(searchNotUniqueObjMap); + // 特殊场景处理: + // HIS 端同一 TranID 有多条记录,bank 端只有一条记录,且 HIS 金额求和 == 银行该笔金额, + // 这种情况视为正常账(不是单边也不是差异),不再拆成单边或差异。 + if (list != null && list.size() > 1 && list2 != null && list2.size() == 1) { + java.math.BigDecimal hisTotal = java.math.BigDecimal.ZERO; + for (HashMap hisDetailMap : list) { + String amountStr = StringDUtil.changeNullToEmpty(hisDetailMap.get("AMOUNT")); + if (!"".equals(amountStr)) { + try { + hisTotal = hisTotal.add(new java.math.BigDecimal(amountStr)); + } catch (Exception e) { + // 金额异常时跳过特殊处理,走原有逻辑 + hisTotal = null; + break; + } + } + } - //循环两个list 如果his端有多的 放入his单边list 能对上的放入true关联集合 最后航端多的银行端单边 + if (hisTotal != null) { + HashMap bankDetailMap = list2.get(0); + String bankAmtStr = StringDUtil.changeNullToEmpty(bankDetailMap.get("I_JYJE")); + + if (AmountUtil.isAmountEqual(hisTotal.toString(), bankAmtStr)) { + // 以第一条 HIS 记录为代表,构造一条正常关联记录 + HashMap hisDetailMap = list.get(0); + + String amount = hisTotal.toString(); + String hJylx = StringDUtil.changeNullToEmpty(hisDetailMap.get("TRADINGSTATUS")); + String tradeTime = StringDUtil.changeNullToEmpty(hisDetailMap.get("TRADETIME")); + String payType = StringDUtil.changeNullToEmpty(hisDetailMap.get("PAYTYPE")); + String hisopernum = StringDUtil.changeNullToEmpty(hisDetailMap.get("HISOPERCODE")); + String bizType = StringDUtil.changeNullToEmpty(hisDetailMap.get("BIZTYPE")); + String patientid = StringDUtil.changeNullToEmpty(hisDetailMap.get("PATIENTID")); + String patientname = StringDUtil.changeNullToEmpty(hisDetailMap.get("PATIENTNAME")); + + String i_jyje = bankAmtStr; + String i_jyrq = StringDUtil.changeNullToEmpty(bankDetailMap.get("I_JYRQ")); + String i_jysj = StringDUtil.changeNullToEmpty(bankDetailMap.get("I_JYSJ")); + String i_jyqd = StringDUtil.changeNullToEmpty(bankDetailMap.get("I_JYQD")); + String i_jylx = StringDUtil.changeNullToEmpty(bankDetailMap.get("I_JYLX")); + String i_ddh = StringDUtil.changeNullToEmpty(bankDetailMap.get("I_DDH")); + + HashMap addMap = new HashMap<>(); + addMap.put("jysj", i_jyrq + " " + i_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", tradeTime); + + addMap.put("tranID", tranid); + addMap.put("BizType", bizType); + addMap.put("h_jylx", hJylx); + addMap.put("amount", amount); + addMap.put("payType", payType); + addMap.put("hisOperNum", hisopernum); + addMap.put("patientid", patientid); + addMap.put("patientname", patientname); + addMap.put("sort_date", tradeTime); + addMap.put("trade_date", trade_date); + addMap.put("err_type", ""); + addMap.put("check_result", "0"); + addMap.put("is_active", "1"); + addMap.put("join_id", ""); + + trueList.add(addMap); + // 已按“合并金额相等”视为正常账,不再按单条金额匹配,直接处理下一组重复 TranID + continue; + } + } + } + + // 循环两个 list: + // 如果 his 端有多的,放入 his 单边 list;能对上的放入 true 关联集合;最后多出的进入银行单边 //最后处理的时候 his单边和银行单边都有的按一对一 变成差异,只有一边有的就是单边 List> hisUnilateralList = new ArrayList<>(); for (int j = 0; j < list.size(); j++) {