⚡ A801-1 全票池发票查询改为 pageNo/pageSize 透传分页

- IBfiService.queryInvoicePool 改为单页查询返回 BfiPageVO,BfiServiceImpl 移除 queryAllPages 全量翻页
- 正式结算单认领查询透传 current/size,多取 1 条探测 hasMore 并合成 total,前端 R<IPage> 契约不变
- 移除内存作废过滤(rim 无对应查询条件,透传分页下会产生页内空洞)
- 同步更新 BfiUtil 技术文档 A801-1 说明与使用方清单
This commit is contained in:
刘泉佳
2026-09-20 21:08:42 +08:00
parent f9433cbc78
commit 7ec3b2adbc
5 changed files with 47 additions and 40 deletions
@@ -25,6 +25,7 @@ import org.springblade.thirdparty.bfi.pojo.dto.BfiInvoicePoolQueryDTO;
import org.springblade.thirdparty.bfi.pojo.dto.BfiInvoicePoolQueryDataDTO;
import org.springblade.thirdparty.bfi.pojo.vo.BfiInvoicePoolItemVO;
import org.springblade.thirdparty.bfi.pojo.vo.BfiInvoicePoolVO;
import org.springblade.thirdparty.bfi.pojo.vo.BfiPageVO;
import org.springblade.thirdparty.bfi.service.IBfiService;
import org.springblade.transport.mapper.FormalSettlementDetailMapper;
import org.springblade.transport.mapper.FormalSettlementDetailFeeMapper;
@@ -1387,16 +1388,19 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
@Override
public IPage<FormalSettlementInvoicePoolVO> invoicePoolQuery(FormalSettlementInvoicePoolQueryDTO query) {
long pageNo = Math.max(query.getCurrent() == null ? 1 : query.getCurrent(), 1);
long pageSize = Math.min(Math.max(query.getSize() == null ? 10 : query.getSize(), 1), 500);
// 上限 499:预留 1 条给 hasMore 探测,单次远程请求不超过 rim 契约 pageSize 上限 500
long pageSize = Math.min(Math.max(query.getSize() == null ? 10 : query.getSize(), 1), 499);
String invoiceNo = query.getInvoiceNo();
String invoiceDateStart = query.getInvoiceDateStart();
String invoiceDateEnd = query.getInvoiceDateEnd();
String salerTaxNo = query.getSalerTaxNo();
String buyerTaxNo = query.getBuyerTaxNo();
String expenseStatus = query.getExpenseStatus();
// A801-1 不返回总数:单次按最大页大小全量翻页拉取后,在内存中做精确分页
// A801-1 rim 契约不支持全量且不返回总数:透传 pageNo/pageSize 单页查询,
// 多取 1 条探测是否还有下一页,total 合成为当前已知的最小精确值供前端分页器翻页
BfiInvoicePoolQueryDataDTO data = new BfiInvoicePoolQueryDataDTO();
data.setPageSize((int) pageSize);
data.setPageNo((int) pageNo);
data.setPageSize((int) pageSize + 1);
if (StringUtil.isNotBlank(invoiceNo)) {
data.setInvoiceNo(invoiceNo.trim());
}
@@ -1417,20 +1421,19 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
}
BfiInvoicePoolQueryDTO param = new BfiInvoicePoolQueryDTO();
param.setQueryParam(data);
List<BfiInvoicePoolVO> poolInvoices = bfiService.queryInvoicePool(param);
List<FormalSettlementInvoicePoolVO> invoices = poolInvoices.stream()
.filter(poolInvoice -> !"1".equals(poolInvoice.getDelete()))
BfiPageVO<BfiInvoicePoolVO> poolPage = bfiService.queryInvoicePool(param);
List<FormalSettlementInvoicePoolVO> invoices = poolPage.getRows() == null ? List.of()
: poolPage.getRows().stream()
.map(this::toInvoicePoolVO)
.toList();
log.info("正式结算单认领查询 全票池原始 {} 条,过滤作废后 {} 条,返回第 {} 页 {} 条/页",
poolInvoices.size(), invoices.size(), pageNo, pageSize);
// 内存精确分页:total 为过滤后精确总数,请求页超出范围时返回空records
int from = (int) ((pageNo - 1) * pageSize);
int to = (int) Math.min(from + pageSize, invoices.size());
List<FormalSettlementInvoicePoolVO> records = from >= invoices.size() ? List.of() : invoices.subList(from, to);
// 多取的 1 条仅用于 hasMore 判断,不返回给前端
boolean hasMore = invoices.size() > pageSize;
List<FormalSettlementInvoicePoolVO> records = hasMore ? invoices.subList(0, (int) pageSize) : invoices;
long total = hasMore ? pageNo * pageSize + 1 : (pageNo - 1) * pageSize + records.size();
log.info("正式结算单认领查询 全票池第 {} 页 {} 条/页,返回 {} 条,hasMore:{}", pageNo, pageSize, records.size(), hasMore);
Page<FormalSettlementInvoicePoolVO> page = new Page<>(pageNo, pageSize);
page.setRecords(records);
page.setTotal(invoices.size());
page.setTotal(total);
return page;
}