demand: TMS系统 - 客户账单管理 - 财务开票处理-定制导出性能优化
committer: heyu
This commit is contained in:
parent
92f6077844
commit
631fb74377
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user