diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettlePayRecordMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettlePayRecordMapper.java index 201087adb..ab572dcbe 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettlePayRecordMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisSettlePayRecordMapper.java @@ -157,4 +157,12 @@ public interface EmisSettlePayRecordMapper extends BaseMapper> getBillOpenStatusByPayIds(@Param("list") List payIds); + + /** + * 根据支付ID列表批量查询收款记录(只查询收款类型recType=1的记录) + * + * @param payIds 支付ID列表 + * @return 收款记录列表 + */ + List selectEmisSettlePayRecordListByPayIds(@Param("payIds") List payIds); } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java index 8583a5f70..71f916662 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleInvoiceRecordServiceImpl.java @@ -22,6 +22,7 @@ import com.xdadan.erp.emis.mapper.EmisSettleSubBillMapper; import com.xdadan.erp.emis.mapper.EmisCustomerInvoiceInfoMapper; import com.xdadan.erp.emis.mapper.EmisWaybillMapper; import com.xdadan.erp.emis.mapper.EmisSettlePayRelMapper; +import com.xdadan.erp.emis.mapper.EmisSettlePayBillRelMapper; import com.xdadan.erp.emis.service.EmisBaseService; import com.xdadan.erp.emis.service.IEmisSettleBillService; import com.xdadan.erp.emis.utils.WaybillHelper; @@ -79,6 +80,9 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen @Autowired private EmisSettlePayRelMapper emisSettlePayRelMapper; + @Autowired + private EmisSettlePayBillRelMapper emisSettlePayBillRelMapper; + /** * 查询开票记录表 * @@ -403,9 +407,149 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen List invoiceRecordList = emisSettleInvoiceRecordMapper .selectEmisSettleInvoiceRecordList(emisSettleInvoiceRecord); + if (CollectionUtils.isEmpty(invoiceRecordList)) { + return new ArrayList<>(); + } + List exportList = new ArrayList<>(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); + // 第一步:收集所有需要批量查询的数据 + Set allSettleBillNoSet = new HashSet<>(); // 所有账单号 + Set allPayIdSet = new HashSet<>(); // 所有支付ID + Set allBillNoSet = new HashSet<>(); // 所有运单号 + + // 收集所有账单号 + for (EmisSettleInvoiceRecord record : invoiceRecordList) { + if (StringUtils.isNotBlank(record.getSettleBillNo())) { + String[] settleBillNoArr = record.getSettleBillNo().split(","); + for (String settleBillNo : settleBillNoArr) { + if (StringUtils.isNotBlank(settleBillNo)) { + allSettleBillNoSet.add(settleBillNo.trim()); + } + } + } + } + + // 批量查询所有支付关联记录(一次性查询所有settleBillNo对应的支付关联记录) + Map> settleBillNoToPayRelListMap = new HashMap<>(); + // 建立 payId -> Set 的映射关系 + Map> payIdToSettleBillNoSetMap = new HashMap<>(); + + if (!allSettleBillNoSet.isEmpty()) { + // 一次性查询所有支付关联记录(合并所有settleBillNo) + String allSettleBillNoStr = String.join(",", allSettleBillNoSet); + List allPayRelList = emisSettlePayRelMapper + .selectHasPayListBySettleBillNo(allSettleBillNoStr); + + // 收集所有payId和billNo + for (EmisSettlePayRel payRel : allPayRelList) { + if (StringUtils.isNotBlank(payRel.getPayId())) { + allPayIdSet.add(payRel.getPayId()); + } + if (StringUtils.isNotBlank(payRel.getBillNo())) { + allBillNoSet.add(payRel.getBillNo()); + } + } + + // 查询 payId 到 settleBillNo 的映射关系 + if (!allPayIdSet.isEmpty()) { + // 查询所有相关的支付账单关联记录(只查询del_flag='0'的记录) + EmisSettlePayBillRel queryPayBillRel = new EmisSettlePayBillRel(); + queryPayBillRel.setDelFlag("0"); + List payBillRelList = emisSettlePayBillRelMapper + .selectEmisSettlePayBillRelList(queryPayBillRel); + + // 建立 payId -> Set 的映射(只处理相关的payId和settleBillNo) + for (EmisSettlePayBillRel payBillRel : payBillRelList) { + if (StringUtils.isNotBlank(payBillRel.getPayId()) + && StringUtils.isNotBlank(payBillRel.getSettleBillNo()) + && allPayIdSet.contains(payBillRel.getPayId()) + && allSettleBillNoSet.contains(payBillRel.getSettleBillNo())) { + payIdToSettleBillNoSetMap.computeIfAbsent(payBillRel.getPayId(), k -> new HashSet<>()) + .add(payBillRel.getSettleBillNo()); + } + } + } + + // 根据每个记录的settleBillNo过滤对应的payRelList + for (EmisSettleInvoiceRecord record : invoiceRecordList) { + if (StringUtils.isNotBlank(record.getSettleBillNo())) { + // 解析该记录的settleBillNo(可能是逗号分隔的多个) + Set recordSettleBillNoSet = new HashSet<>(); + String[] settleBillNoArr = record.getSettleBillNo().split(","); + for (String settleBillNo : settleBillNoArr) { + if (StringUtils.isNotBlank(settleBillNo)) { + recordSettleBillNoSet.add(settleBillNo.trim()); + } + } + + // 过滤出属于该记录的payRelList + List recordPayRelList = new ArrayList<>(); + for (EmisSettlePayRel payRel : allPayRelList) { + if (StringUtils.isNotBlank(payRel.getPayId())) { + Set payRelSettleBillNoSet = payIdToSettleBillNoSetMap.get(payRel.getPayId()); + if (payRelSettleBillNoSet != null) { + // 判断该payRel的payId关联的settleBillNo是否包含在当前记录的settleBillNo中 + boolean belongsToRecord = false; + for (String settleBillNo : recordSettleBillNoSet) { + if (payRelSettleBillNoSet.contains(settleBillNo)) { + belongsToRecord = true; + break; + } + } + if (belongsToRecord) { + recordPayRelList.add(payRel); + } + } + } + } + settleBillNoToPayRelListMap.put(record.getSettleBillNo(), recordPayRelList); + } + } + } + + // 第二步:批量查询所有数据 + // 批量查询账单 + Map settleBillMap = new HashMap<>(); + if (!allSettleBillNoSet.isEmpty()) { + List settleBillNoList = new ArrayList<>(allSettleBillNoSet); + List settleBillList = emisSettleBillMapper + .selectSettleBillBySettleBillNoList(settleBillNoList); + for (EmisSettleBill settleBill : settleBillList) { + if (StringUtils.isNotBlank(settleBill.getSettleBillNo())) { + settleBillMap.put(settleBill.getSettleBillNo(), settleBill); + } + } + } + + // 批量查询收款记录 + Map payRecordMap = new HashMap<>(); + if (!allPayIdSet.isEmpty()) { + List payIdList = new ArrayList<>(allPayIdSet); + List payRecordList = emisSettlePayRecordMapper + .selectEmisSettlePayRecordListByPayIds(payIdList); + for (EmisSettlePayRecord payRecord : payRecordList) { + if (StringUtils.isNotBlank(payRecord.getPayId())) { + // 如果同一个payId有多条记录,取第一条(已按create_time desc排序) + payRecordMap.putIfAbsent(payRecord.getPayId(), payRecord); + } + } + } + + // 批量查询运单信息 + Map waybillMap = new HashMap<>(); + if (!allBillNoSet.isEmpty()) { + List billNoList = new ArrayList<>(allBillNoSet); + List waybillList = emisWaybillMapper.selectEmisWaybillListByBillCodes(billNoList); + for (EmisWaybill waybill : waybillList) { + if (StringUtils.isNotBlank(waybill.getBillCode())) { + waybillMap.put(waybill.getBillCode(), waybill); + } + } + } + + // 第三步:处理每个开票记录,组装导出数据 for (EmisSettleInvoiceRecord record : invoiceRecordList) { EmisSettleInvoiceRecordExportVO exportVO = new EmisSettleInvoiceRecordExportVO(); // 基础字段 @@ -454,8 +598,7 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen exportVO.setBillNos(record.getSettleBillNo()); for (String settleBillNo : settleBillNoArr) { if (StringUtils.isNotBlank(settleBillNo)) { - EmisSettleBill settleBill = emisSettleBillService - .selectEmisSettleBillBySettleBillNo(settleBillNo.trim()); + EmisSettleBill settleBill = settleBillMap.get(settleBillNo.trim()); if (settleBill != null && StringUtils.isNotBlank(settleBill.getSettleType())) { if ("1".equals(settleBill.getSettleType())) { settleTypeSet.add("现金账单"); @@ -475,38 +618,14 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen // 直接使用settleBillNo(多个用逗号分隔)查询支付关联记录 if (StringUtils.isNotBlank(record.getSettleBillNo())) { - // 根据settleBillNo查询支付关联记录 - List payRelList = emisSettlePayRelMapper - .selectHasPayListBySettleBillNo(record.getSettleBillNo()); + // 从缓存中获取该记录对应的支付关联记录 + List payRelList = settleBillNoToPayRelListMap.get(record.getSettleBillNo()); + if (CollectionUtils.isEmpty(payRelList)) { + // 如果缓存中没有,则查询(这种情况应该不会发生,但为了安全保留) + payRelList = emisSettlePayRelMapper.selectHasPayListBySettleBillNo(record.getSettleBillNo()); + } if (!CollectionUtils.isEmpty(payRelList)) { - // 获取所有payId - Set payIdSet = payRelList.stream() - .map(EmisSettlePayRel::getPayId) - .filter(StringUtils::isNotBlank) - .distinct() - .collect(Collectors.toSet()); - - // 按payId查询收款记录,建立payId到payRecord的映射 - Map payRecordMap = new HashMap<>(); - for (String payId : payIdSet) { - EmisSettlePayRecord queryPayRecord = new EmisSettlePayRecord(); - queryPayRecord.setPayId(payId); - queryPayRecord.setDelFlag("0"); - List payRecordList = emisSettlePayRecordMapper - .selectEmisSettlePayRecordList(queryPayRecord); - if (!CollectionUtils.isEmpty(payRecordList)) { - // 只处理收款记录(recType = "1"),不包括退款 - EmisSettlePayRecord payRecord = payRecordList.stream() - .filter(pr -> "1".equals(pr.getRecType())) - .findFirst() - .orElse(null); - if (payRecord != null) { - payRecordMap.put(payId, payRecord); - } - } - } - // 遍历支付关联记录,按billNo查询waybill,按cust_name和trade_date/create_time分组 for (EmisSettlePayRel payRel : payRelList) { if (payRel.getPayMoney() == null @@ -519,9 +638,9 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen continue; } - // 查询waybill获取客户名称 + // 从缓存中获取waybill信息 String custName = ""; - EmisWaybill waybill = emisWaybillMapper.selectWaybillBaseInfoByBillCode(billNo); + EmisWaybill waybill = waybillMap.get(billNo); if (waybill != null && StringUtils.isNotBlank(waybill.getCustName())) { custName = waybill.getCustName(); // 收集客户名称 @@ -530,7 +649,7 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen } } - // 获取对应的收款记录 + // 从缓存中获取对应的收款记录 EmisSettlePayRecord payRecord = payRecordMap.get(payRel.getPayId()); if (payRecord == null) { continue; diff --git a/emis-biz/src/main/resources/mapper/EmisSettlePayRecordMapper.xml b/emis-biz/src/main/resources/mapper/EmisSettlePayRecordMapper.xml index 27275f133..be3282d31 100644 --- a/emis-biz/src/main/resources/mapper/EmisSettlePayRecordMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisSettlePayRecordMapper.xml @@ -843,4 +843,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" group by espbr.pay_id + + +