demand: TMS系统 - 客户账单管理 - 财务开票处理-定制导出性能优化

committer: heyu
This commit is contained in:
aike 2025-11-05 15:24:21 +08:00
parent 92f6077844
commit 631fb74377
3 changed files with 173 additions and 35 deletions

View File

@ -157,4 +157,12 @@ public interface EmisSettlePayRecordMapper extends BaseMapper<EmisSettlePayRecor
* @return 账单开票状态映射
*/
List<Map<String, Object>> getBillOpenStatusByPayIds(@Param("list") List<String> payIds);
/**
* 根据支付ID列表批量查询收款记录(只查询收款类型recType=1的记录)
*
* @param payIds 支付ID列表
* @return 收款记录列表
*/
List<EmisSettlePayRecord> selectEmisSettlePayRecordListByPayIds(@Param("payIds") List<String> payIds);
}

View File

@ -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<EmisSettleInvoiceRecord> invoiceRecordList = emisSettleInvoiceRecordMapper
.selectEmisSettleInvoiceRecordList(emisSettleInvoiceRecord);
if (CollectionUtils.isEmpty(invoiceRecordList)) {
return new ArrayList<>();
}
List<EmisSettleInvoiceRecordExportVO> exportList = new ArrayList<>();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
// 第一步:收集所有需要批量查询的数据
Set<String> allSettleBillNoSet = new HashSet<>(); // 所有账单号
Set<String> allPayIdSet = new HashSet<>(); // 所有支付ID
Set<String> 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<String, List<EmisSettlePayRel>> settleBillNoToPayRelListMap = new HashMap<>();
// 建立 payId -> Set<settleBillNo> 的映射关系
Map<String, Set<String>> payIdToSettleBillNoSetMap = new HashMap<>();
if (!allSettleBillNoSet.isEmpty()) {
// 一次性查询所有支付关联记录(合并所有settleBillNo)
String allSettleBillNoStr = String.join(",", allSettleBillNoSet);
List<EmisSettlePayRel> 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<EmisSettlePayBillRel> payBillRelList = emisSettlePayBillRelMapper
.selectEmisSettlePayBillRelList(queryPayBillRel);
// 建立 payId -> Set<settleBillNo> 的映射(只处理相关的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<String> recordSettleBillNoSet = new HashSet<>();
String[] settleBillNoArr = record.getSettleBillNo().split(",");
for (String settleBillNo : settleBillNoArr) {
if (StringUtils.isNotBlank(settleBillNo)) {
recordSettleBillNoSet.add(settleBillNo.trim());
}
}
// 过滤出属于该记录的payRelList
List<EmisSettlePayRel> recordPayRelList = new ArrayList<>();
for (EmisSettlePayRel payRel : allPayRelList) {
if (StringUtils.isNotBlank(payRel.getPayId())) {
Set<String> 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<String, EmisSettleBill> settleBillMap = new HashMap<>();
if (!allSettleBillNoSet.isEmpty()) {
List<String> settleBillNoList = new ArrayList<>(allSettleBillNoSet);
List<EmisSettleBill> settleBillList = emisSettleBillMapper
.selectSettleBillBySettleBillNoList(settleBillNoList);
for (EmisSettleBill settleBill : settleBillList) {
if (StringUtils.isNotBlank(settleBill.getSettleBillNo())) {
settleBillMap.put(settleBill.getSettleBillNo(), settleBill);
}
}
}
// 批量查询收款记录
Map<String, EmisSettlePayRecord> payRecordMap = new HashMap<>();
if (!allPayIdSet.isEmpty()) {
List<String> payIdList = new ArrayList<>(allPayIdSet);
List<EmisSettlePayRecord> payRecordList = emisSettlePayRecordMapper
.selectEmisSettlePayRecordListByPayIds(payIdList);
for (EmisSettlePayRecord payRecord : payRecordList) {
if (StringUtils.isNotBlank(payRecord.getPayId())) {
// 如果同一个payId有多条记录,取第一条(已按create_time desc排序)
payRecordMap.putIfAbsent(payRecord.getPayId(), payRecord);
}
}
}
// 批量查询运单信息
Map<String, EmisWaybill> waybillMap = new HashMap<>();
if (!allBillNoSet.isEmpty()) {
List<String> billNoList = new ArrayList<>(allBillNoSet);
List<EmisWaybill> 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<EmisSettlePayRel> payRelList = emisSettlePayRelMapper
.selectHasPayListBySettleBillNo(record.getSettleBillNo());
// 从缓存中获取该记录对应的支付关联记录
List<EmisSettlePayRel> payRelList = settleBillNoToPayRelListMap.get(record.getSettleBillNo());
if (CollectionUtils.isEmpty(payRelList)) {
// 如果缓存中没有,则查询(这种情况应该不会发生,但为了安全保留)
payRelList = emisSettlePayRelMapper.selectHasPayListBySettleBillNo(record.getSettleBillNo());
}
if (!CollectionUtils.isEmpty(payRelList)) {
// 获取所有payId
Set<String> payIdSet = payRelList.stream()
.map(EmisSettlePayRel::getPayId)
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.toSet());
// 按payId查询收款记录,建立payId到payRecord的映射
Map<String, EmisSettlePayRecord> payRecordMap = new HashMap<>();
for (String payId : payIdSet) {
EmisSettlePayRecord queryPayRecord = new EmisSettlePayRecord();
queryPayRecord.setPayId(payId);
queryPayRecord.setDelFlag("0");
List<EmisSettlePayRecord> 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;

View File

@ -843,4 +843,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
group by espbr.pay_id
</select>
<!-- 根据支付ID列表批量查询收款记录(只查询收款类型recType=1的记录) -->
<select id="selectEmisSettlePayRecordListByPayIds" parameterType="java.util.List" resultMap="EmisSettlePayRecordResult">
<include refid="selectEmisSettlePayRecordVo"/>
where a.del_flag='0' and a.rec_type='1'
and a.pay_id in
<foreach collection="payIds" item="payId" open="(" separator="," close=")">
#{payId}
</foreach>
order by a.create_time desc
</select>
</mapper>