update:建行账单接入
This commit is contained in:
@@ -43,4 +43,9 @@ public interface HisDetailMapper {
|
||||
void insertAllHisBillOriginalHY(List<HashMap<Object, Object>> addList) throws Exception;
|
||||
|
||||
List<HashMap<Object, Object>> findMedicalInsuranceGroupData(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
/**
|
||||
* 查询有自费金额的HIS账单记录(用于混合支付对账)
|
||||
*/
|
||||
List<HashMap<Object, Object>> findHisDetailWithZfAmount(HashMap<Object, Object> map) throws Exception;
|
||||
}
|
||||
|
||||
@@ -75,4 +75,14 @@ public interface TransactionDetailMapper {
|
||||
void deleteHisAndThirdJoinDataByParamAndNotUnique(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
void addNotUniqueData(List<HashMap<Object, Object>> list) throws Exception;
|
||||
|
||||
/**
|
||||
* 根据三方信息更新关联表记录(用于自费对账自动核销)
|
||||
*/
|
||||
void updateJoinDateByThird(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
/**
|
||||
* 根据三方信息删除关联表记录
|
||||
*/
|
||||
void deleteJoinDataByThird(HashMap<Object, Object> map) throws Exception;
|
||||
}
|
||||
|
||||
@@ -28,4 +28,14 @@ public interface UnilateralMapper {
|
||||
void deleteUnilateralByJoinIdNotNull(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
void deleteUnilateralByIdandStatus(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
/**
|
||||
* 根据ID更新单边账记录(用于自费对账自动核销)
|
||||
*/
|
||||
void updateUnilateralById(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
/**
|
||||
* 根据ID删除单边账记录
|
||||
*/
|
||||
void deleteUnilateralById(HashMap<Object, Object> map) throws Exception;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -140,10 +140,6 @@ public class HISGetDataMethodByJH {
|
||||
//将原始的转换成统一格式
|
||||
List<HashMap<Object,Object>> newAddList= new ArrayList<>();
|
||||
|
||||
List<HashMap<Object,Object>> cashList= new ArrayList<>();
|
||||
|
||||
List<HashMap<Object,Object>> zhipiaoList= new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < hisBillList.size(); i++) {
|
||||
HashMap<Object, Object> hisBillHashMap = hisBillList.get(i);
|
||||
|
||||
@@ -158,11 +154,12 @@ public class HISGetDataMethodByJH {
|
||||
String amount = StringDUtil.changeNullToEmpty(hisBillHashMap.get("amount"));
|
||||
String tradeTime = StringDUtil.changeNullToEmpty(hisBillHashMap.get("tradeTime"));
|
||||
|
||||
// 提取新增字段:清算类别、险种类型、医保账户金额、医保统筹金额
|
||||
// 提取新增字段:清算类别、险种类型、医保账户金额、医保统筹金额、自费金额
|
||||
String clrType = StringDUtil.changeNullToEmpty(hisBillHashMap.get("clrType"));
|
||||
String insutype = StringDUtil.changeNullToEmpty(hisBillHashMap.get("insutype"));
|
||||
String ybzhAmount = StringDUtil.changeNullToEmpty(hisBillHashMap.get("ybzhAmount"));
|
||||
String ybtcAmount = StringDUtil.changeNullToEmpty(hisBillHashMap.get("ybtcAmount"));
|
||||
String zfAmount = StringDUtil.changeNullToEmpty(hisBillHashMap.get("zfAmount"));
|
||||
|
||||
// 只有当缺少关键业务信息时才跳过(患者ID、金额、交易时间都为空)
|
||||
if ("".equals(patientId) && "".equals(amount) && "".equals(tradeTime)){
|
||||
@@ -232,104 +229,12 @@ public class HISGetDataMethodByJH {
|
||||
addMap.put("insutype",insutype); // 险种类型
|
||||
addMap.put("ybzhAmount",ybzhAmount); // 医保账户金额
|
||||
addMap.put("ybtcAmount",ybtcAmount); // 医保统筹金额
|
||||
addMap.put("zfAmount",zfAmount); // 自费金额(混合支付中的自费部分)
|
||||
|
||||
//如果是现金记录先放进现金集合内
|
||||
if (cash_code.equals(payType)){
|
||||
cashList.add(addMap);
|
||||
}else if (zhipiao.equals(payType)){
|
||||
zhipiaoList.add(addMap);
|
||||
}else{
|
||||
newAddList.add(addMap);
|
||||
}
|
||||
}
|
||||
|
||||
//循环现金记录 合并同操作员同交易日期 同类别的(门诊,住院) his获取,记录应该就是前一天的。
|
||||
HashMap<String,HashMap<Object,Object>> cashMap=new HashMap<>();
|
||||
for (int i = 0; i < cashList.size(); i++) {
|
||||
HashMap<Object, Object> hashMap = cashList.get(i);
|
||||
|
||||
String hisOperCode = StringDUtil.changeNullToEmpty(hashMap.get("hisOperCode"));
|
||||
String payMethod = StringDUtil.changeNullToEmpty(hashMap.get("payMethod"));
|
||||
String amount = StringDUtil.changeNullToEmpty(hashMap.get("amount"));
|
||||
|
||||
HashMap<Object, Object> map = cashMap.get(hisOperCode+"_"+payMethod);
|
||||
|
||||
if (map==null){
|
||||
HashMap<Object,Object> addMap=new HashMap<>();
|
||||
addMap.put("payMethod",payMethod);
|
||||
addMap.put("tradingStatus","");
|
||||
addMap.put("bizType","");
|
||||
addMap.put("payType",cash_code);
|
||||
addMap.put("tradeTime",trade_date+" 00:00:00");
|
||||
addMap.put("hisOperCode",hisOperCode);
|
||||
addMap.put("amount",amount);
|
||||
addMap.put("remarks","");
|
||||
addMap.put("platformTransId","");
|
||||
addMap.put("patientId","");
|
||||
addMap.put("patientName","");
|
||||
addMap.put("trade_date",trade_date);
|
||||
addMap.put("his_wsdl_id",his_wsdl_id);
|
||||
addMap.put("clrType",""); // 现金记录没有清算类别
|
||||
addMap.put("insutype",""); // 现金记录没有险种类型
|
||||
addMap.put("ybzhAmount","0"); // 现金记录没有医保账户金额
|
||||
addMap.put("ybtcAmount","0"); // 现金记录没有医保统筹金额
|
||||
|
||||
cashMap.put(hisOperCode+"_"+payMethod,addMap);
|
||||
}else {
|
||||
String oldAmount = StringDUtil.changeNullToEmpty(map.get("amount"));
|
||||
String newAmount = new BigDecimal(oldAmount).add(new BigDecimal(amount)).toString();
|
||||
map.put("amount",newAmount);
|
||||
}
|
||||
}
|
||||
|
||||
//循环map 把记录放入要添加的集合
|
||||
for (String key:cashMap.keySet()){
|
||||
newAddList.add(cashMap.get(key));
|
||||
}
|
||||
|
||||
//循环支票的记录 和现金相同处理
|
||||
HashMap<String,HashMap<Object,Object>> zhipiaoMap=new HashMap<>();
|
||||
for (int i = 0; i < zhipiaoList.size(); i++) {
|
||||
HashMap<Object, Object> hashMap = zhipiaoList.get(i);
|
||||
|
||||
String hisOperCode = StringDUtil.changeNullToEmpty(hashMap.get("hisOperCode"));
|
||||
String payMethod = StringDUtil.changeNullToEmpty(hashMap.get("payMethod"));
|
||||
String amount = StringDUtil.changeNullToEmpty(hashMap.get("amount"));
|
||||
String payType = StringDUtil.changeNullToEmpty(hashMap.get("payType"));
|
||||
|
||||
HashMap<Object, Object> map = zhipiaoMap.get(hisOperCode+"_"+payMethod);
|
||||
|
||||
if (map==null){
|
||||
HashMap<Object,Object> addMap=new HashMap<>();
|
||||
addMap.put("payMethod",payMethod);
|
||||
addMap.put("tradingStatus","");
|
||||
addMap.put("bizType","");
|
||||
addMap.put("payType",payType);
|
||||
addMap.put("tradeTime",trade_date+" 00:00:00");
|
||||
addMap.put("hisOperCode",hisOperCode);
|
||||
addMap.put("amount",amount);
|
||||
addMap.put("remarks","");
|
||||
addMap.put("platformTransId","");
|
||||
addMap.put("patientId","");
|
||||
addMap.put("patientName","");
|
||||
addMap.put("trade_date",trade_date);
|
||||
addMap.put("his_wsdl_id",his_wsdl_id);
|
||||
addMap.put("clrType",""); // 支票记录没有清算类别
|
||||
addMap.put("insutype",""); // 支票记录没有险种类型
|
||||
addMap.put("ybzhAmount","0"); // 支票记录没有医保账户金额
|
||||
addMap.put("ybtcAmount","0"); // 支票记录没有医保统筹金额
|
||||
|
||||
zhipiaoMap.put(hisOperCode+"_"+payMethod,addMap);
|
||||
}else {
|
||||
String oldAmount = StringDUtil.changeNullToEmpty(map.get("amount"));
|
||||
String newAmount = new BigDecimal(oldAmount).add(new BigDecimal(amount)).toString();
|
||||
map.put("amount",newAmount);
|
||||
}
|
||||
}
|
||||
|
||||
//循环map 把记录放入要添加的集合
|
||||
for (String key:zhipiaoMap.keySet()){
|
||||
newAddList.add(zhipiaoMap.get(key));
|
||||
// 不再合并现金和支票记录,直接保留原始数据
|
||||
// 因为有些医保账户余额不足时会用现金支付,但仍然属于医保相关记录
|
||||
// 合并会导致清算类别(clrType)和险种(insutype)信息丢失
|
||||
newAddList.add(addMap);
|
||||
}
|
||||
|
||||
//存一份his针对要调整的字段修改的
|
||||
|
||||
@@ -799,6 +799,9 @@ public class ReconciliationMethod {
|
||||
|
||||
//!!!!
|
||||
managerReconciliation(transactionDetailService, searchMap);
|
||||
|
||||
// 处理混合支付中的自费部分对账
|
||||
processZfAmountReconciliation(transactionDetailService, unilateralService, searchMap, trade_date);
|
||||
} else {
|
||||
errCode = "999";
|
||||
errMsg = "生成对账信息失败,原因:his或三方有记录没有获取到。";
|
||||
@@ -952,5 +955,113 @@ public class ReconciliationMethod {
|
||||
reconciliationResultService.insertReconciliationResult(addMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理混合支付中自费部分与三方的对账
|
||||
* @description: 当HIS账单中zfAmount不为0时,使用该金额与三方账单进行对账,匹配成功则消除对应的三方单边账
|
||||
* @author thuang
|
||||
* @date 2025/10/27
|
||||
* @version 1.0
|
||||
*/
|
||||
public static void processZfAmountReconciliation(TransactionDetailService transactionDetailService,
|
||||
UnilateralService unilateralService,
|
||||
HashMap<Object, Object> searchMap,
|
||||
String trade_date) throws Exception {
|
||||
|
||||
// 1. 查询当日有zfAmount且不为0的HIS账单
|
||||
HisDetailService hisDetailService = GetBeanUtil.getBean(HisDetailServiceImpl.class);
|
||||
HashMap<Object, Object> zfAmountSearchMap = new HashMap<>();
|
||||
zfAmountSearchMap.put("trade_date", trade_date);
|
||||
zfAmountSearchMap.put("has_zf_amount", "1"); // 标识查询有自费金额的记录
|
||||
|
||||
List<HashMap<Object, Object>> hisZfAmountList = hisDetailService.findHisDetailWithZfAmount(zfAmountSearchMap);
|
||||
|
||||
if (hisZfAmountList == null || hisZfAmountList.size() == 0) {
|
||||
System.out.println("当日没有自费金额记录,跳过zfAmount对账");
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println("开始处理自费金额对账,共" + hisZfAmountList.size() + "条记录");
|
||||
|
||||
// 2. 查询当日的三方单边账
|
||||
HashMap<Object, Object> thirdUnilateralSearchMap = new HashMap<>();
|
||||
thirdUnilateralSearchMap.put("trade_date", trade_date);
|
||||
thirdUnilateralSearchMap.put("err_type", "2"); // 三方单边账
|
||||
thirdUnilateralSearchMap.put("is_manager", "0"); // 未处理的
|
||||
|
||||
List<HashMap<Object, Object>> thirdUnilateralList = unilateralService.findUnilateralByParam(thirdUnilateralSearchMap);
|
||||
|
||||
if (thirdUnilateralList == null || thirdUnilateralList.size() == 0) {
|
||||
System.out.println("当日没有三方单边账,跳过zfAmount对账");
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println("当日三方单边账共" + thirdUnilateralList.size() + "条");
|
||||
|
||||
int matchedCount = 0;
|
||||
|
||||
// 3. 遍历每条有自费金额的HIS记录(包括正数和负数)
|
||||
for (HashMap<Object, Object> hisRecord : hisZfAmountList) {
|
||||
String zfAmount = StringDUtil.changeNullToEmpty(hisRecord.get("ZFAMOUNT"));
|
||||
String platformTransId = StringDUtil.changeNullToEmpty(hisRecord.get("PLATFORMTRANSID"));
|
||||
String tradingStatus = StringDUtil.changeNullToEmpty(hisRecord.get("TRADINGSTATUS"));
|
||||
|
||||
// 跳过金额为0的记录,但保留负数
|
||||
if ("".equals(zfAmount) || "0".equals(zfAmount) || "0.00".equals(zfAmount)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
BigDecimal amount = new BigDecimal(zfAmount);
|
||||
if (amount.abs().compareTo(BigDecimal.ZERO) == 0) {
|
||||
continue;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 4. 在三方单边账中查找所有匹配的记录(同一订单号可能有一正一负)
|
||||
Iterator<HashMap<Object, Object>> iterator = thirdUnilateralList.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
HashMap<Object, Object> thirdRecord = iterator.next();
|
||||
String thirdAmount = StringDUtil.changeNullToEmpty(thirdRecord.get("I_JYJE"));
|
||||
String thirdOrderNo = StringDUtil.changeNullToEmpty(thirdRecord.get("I_DDH"));
|
||||
String thirdTradingType = StringDUtil.changeNullToEmpty(thirdRecord.get("I_JYLX"));
|
||||
String unilateralId = StringDUtil.changeNullToEmpty(thirdRecord.get("ID"));
|
||||
|
||||
// 检查金额是否匹配(绝对值相等)
|
||||
boolean amountMatch = AmountUtil.isAmountEqual(zfAmount, thirdAmount);
|
||||
|
||||
// 检查订单号和交易类型是否都匹配
|
||||
boolean orderMatch = platformTransId.equals(thirdOrderNo) && tradingStatus.equals(thirdTradingType);
|
||||
|
||||
if (amountMatch && orderMatch) {
|
||||
// 找到匹配的记录,直接删除单边账和关联表记录
|
||||
System.out.println("找到匹配记录并删除 - HIS自费金额: " + zfAmount + ", 三方金额: " + thirdAmount +
|
||||
", 订单号: " + platformTransId + " = " + thirdOrderNo + ", 交易类型: " + tradingStatus);
|
||||
|
||||
// 5. 直接删除三方单边账记录
|
||||
HashMap<Object, Object> deleteMap = new HashMap<>();
|
||||
deleteMap.put("id", unilateralId);
|
||||
unilateralService.deleteUnilateralById(deleteMap);
|
||||
|
||||
// 6. 删除关联表中对应的三方记录
|
||||
HashMap<Object, Object> deleteJoinMap = new HashMap<>();
|
||||
deleteJoinMap.put("i_ddh", thirdOrderNo);
|
||||
deleteJoinMap.put("i_jylx", thirdTradingType);
|
||||
deleteJoinMap.put("trade_date", trade_date);
|
||||
transactionDetailService.deleteJoinDataByThird(deleteJoinMap);
|
||||
|
||||
matchedCount++;
|
||||
|
||||
// 从列表中移除已匹配的记录
|
||||
iterator.remove();
|
||||
// 不使用break,继续查找同一订单号的其他记录(如一正一负)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("自费金额对账完成,成功匹配并删除 " + matchedCount + " 条单边账记录");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -32,4 +32,9 @@ public interface HisDetailService {
|
||||
List<HashMap<Object, Object>> findHisDetailCountData(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
List<HashMap<Object, Object>> findMedicalInsuranceGroupData(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
/**
|
||||
* 查询有自费金额的HIS账单记录(用于混合支付对账)
|
||||
*/
|
||||
List<HashMap<Object, Object>> findHisDetailWithZfAmount(HashMap<Object, Object> map) throws Exception;
|
||||
}
|
||||
|
||||
@@ -78,4 +78,14 @@ public interface TransactionDetailService {
|
||||
* @version 1.0
|
||||
*/
|
||||
void addNotUniqueData(List<HashMap<Object, Object>> list) throws Exception;
|
||||
|
||||
/**
|
||||
* 根据三方信息更新关联表记录(用于自费对账自动核销)
|
||||
*/
|
||||
void updateJoinDateByThird(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
/**
|
||||
* 根据三方信息删除关联表记录
|
||||
*/
|
||||
void deleteJoinDataByThird(HashMap<Object, Object> map) throws Exception;
|
||||
}
|
||||
|
||||
@@ -26,4 +26,14 @@ public interface UnilateralService {
|
||||
void deleteUnilateralByJoinIdNotNull(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
void deleteUnilateralByIdandStatus(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
/**
|
||||
* 根据ID更新单边账记录(用于自费对账自动核销)
|
||||
*/
|
||||
void updateUnilateralById(HashMap<Object, Object> map) throws Exception;
|
||||
|
||||
/**
|
||||
* 根据ID删除单边账记录
|
||||
*/
|
||||
void deleteUnilateralById(HashMap<Object, Object> map) throws Exception;
|
||||
}
|
||||
|
||||
@@ -119,6 +119,43 @@ public class BankbillHistoryServiceImpl implements BankbillHistoryService {
|
||||
zffs = payMethodMap.get("掌医支付");
|
||||
bankbillHistory.setCZffs(zffs);
|
||||
}
|
||||
else if ("建行龙支付对账单".equals(billTableName)){
|
||||
// 建行龙支付对账单的支付方式映射
|
||||
if (cZffs != null && !cZffs.trim().isEmpty()) {
|
||||
String cZffsLower = cZffs.trim();
|
||||
|
||||
// 优先精确匹配
|
||||
zffs = payMethodMap.get(cZffsLower);
|
||||
|
||||
// 如果精确匹配失败,进行模糊匹配
|
||||
if (zffs == null) {
|
||||
// 根据支付方式名称映射到字典值(按优先级匹配)
|
||||
if (cZffsLower.contains("微信退款")) {
|
||||
zffs = payMethodMap.get("微信退款");
|
||||
} else if (cZffsLower.contains("支付宝退款")) {
|
||||
zffs = payMethodMap.get("支付宝退款");
|
||||
} else if (cZffsLower.contains("微信")) {
|
||||
zffs = payMethodMap.get("微信支付");
|
||||
} else if (cZffsLower.contains("支付宝")) {
|
||||
zffs = payMethodMap.get("支付宝支付");
|
||||
} else if (cZffsLower.contains("云闪付")) {
|
||||
zffs = payMethodMap.get("云闪付支付");
|
||||
} else if (cZffsLower.contains("刷卡") || cZffsLower.contains("银联") || cZffsLower.contains("银行卡")) {
|
||||
zffs = payMethodMap.get("刷卡支付");
|
||||
} else {
|
||||
// 都匹配不到,使用其他支付
|
||||
zffs = payMethodMap.get("其他支付");
|
||||
}
|
||||
}
|
||||
|
||||
// 添加调试日志
|
||||
org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(this.getClass());
|
||||
log.info("建行龙支付映射 - 原始支付方式: [" + cZffsLower + "], 映射后字典值: [" + zffs + "]");
|
||||
} else {
|
||||
zffs = payMethodMap.get("其他支付");
|
||||
}
|
||||
bankbillHistory.setCZffs(zffs);
|
||||
}
|
||||
else{
|
||||
if (zffs==null){
|
||||
zffs = payMethodMap.get("其他支付");
|
||||
|
||||
@@ -184,4 +184,9 @@ public class HisDetailServiceImpl implements HisDetailService {
|
||||
return hisDetailMapper.findMedicalInsuranceGroupData(map);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<HashMap<Object, Object>> findHisDetailWithZfAmount(HashMap<Object, Object> map) throws Exception {
|
||||
return hisDetailMapper.findHisDetailWithZfAmount(map);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -164,5 +164,15 @@ public class TransactionDetailServiceImpl implements TransactionDetailService {
|
||||
transactionDetailMapper.addNotUniqueData(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateJoinDateByThird(HashMap<Object, Object> map) throws Exception {
|
||||
transactionDetailMapper.updateJoinDateByThird(map);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteJoinDataByThird(HashMap<Object, Object> map) throws Exception {
|
||||
transactionDetailMapper.deleteJoinDataByThird(map);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -76,4 +76,14 @@ public class UnilateralServiceImpl implements UnilateralService {
|
||||
public void deleteUnilateralByIdandStatus(HashMap<Object, Object> map) throws Exception {
|
||||
unilateralMapper.deleteUnilateralByIdandStatus(map);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUnilateralById(HashMap<Object, Object> map) throws Exception {
|
||||
unilateralMapper.updateUnilateralById(map);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteUnilateralById(HashMap<Object, Object> map) throws Exception {
|
||||
unilateralMapper.deleteUnilateralById(map);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user