fix: 修复收票单推送金蝶防重键不匹配导致指定应付和幂等预检失败

A303-2保存收票单时awrp_src_code使用receipt.getId(),但A302-6指定应付
和A801-3幂等预检误用receipt.getInvoiceNo(),导致:
1. A302-6指定应付传入发票号而非收票登记ID,金蝶报收票单不存在
2. A801-3预检用发票号匹配金蝶awrp_src_code(收票登记ID),永远匹配不到
   已存在的收票单,重推时重复调A303-2被金蝶拒绝(已审核不允许修改)

修复:统一使用receipt.getId()作为收票单防重键
- assignApBill入参改为receipt.getId()(含补偿方法)
- queryKingdeeReceivedInvoiceRows传入receipt.getId()
- kingdeeRows.get()的key改为receipt.getId()
- 更正assignApBill方法注释
This commit is contained in:
刘泉佳
2026-09-23 19:00:02 +08:00
parent 0c064f06c9
commit 243d5be580
2 changed files with 9 additions and 9 deletions
@@ -664,7 +664,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
if (!failures.isEmpty()) {
summary = summary + ",失败 " + failures.size() + " 笔:" + String.join(";", failures);
}
log.info("{}", summary);
log.info("推送金蝶收票单返回信息{}", summary);
return summary;
}
@@ -695,7 +695,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
+ "未生成财务应付单");
}
String billNo;
BfiReceivedInvoiceVO kingdeeRow = kingdeeRows.get(receipt.getInvoiceNo());
BfiReceivedInvoiceVO kingdeeRow = kingdeeRows.get(String.valueOf(receipt.getId()));
if (kingdeeRow != null) {
if (kingdeeReceivedInvoiceSyncSupport.isAbnormalInvoiceStatus(kingdeeRow.getInvoicestatus())) {
String abnormalReason = truncatePushMsg("金蝶侧收票单发票状态异常("
@@ -736,7 +736,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
applyReceivedInvoicePushResult(receipt, billNo, KingdeeBfiConstant.RECEIVED_PUSH_PUSHED, null, false);
try {
log.info("收票登记[{}]开始 A302-6 指定应付:应付单防重键={}", receipt.getInvoiceNo(), apBillSrcCode);
kingdeeReceivedInvoiceSyncSupport.assignApBill(receipt.getInvoiceNo(), apBillSrcCode);
kingdeeReceivedInvoiceSyncSupport.assignApBill(String.valueOf(receipt.getId()), apBillSrcCode);
} catch (RuntimeException assignException) {
log.warn("收票登记[{}]A302-6 指定应付失败:{}", receipt.getInvoiceNo(), assignException.getMessage());
applyReceivedInvoicePushResult(receipt, billNo, KingdeeBfiConstant.RECEIVED_PUSH_FAILED,
@@ -798,8 +798,8 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
if (plan.blockedReason() != null) {
continue;
}
invoiceNosByBuyer.computeIfAbsent(Func.toStrWithEmpty(plan.mirror().getReceiverName(), ""),
key -> new LinkedHashSet<>()).add(plan.receipt().getInvoiceNo());
invoiceNosByBuyer.computeIfAbsent(Func.toStrWithEmpty(plan.mirror().getReceiverName(), ""),
key -> new LinkedHashSet<>()).add(String.valueOf(plan.receipt().getId()));
}
Map<String, BfiReceivedInvoiceVO> rows = new LinkedHashMap<>();
LocalDateTime windowEnd = LocalDateTime.now();
@@ -956,7 +956,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
throw new ServiceException("收票单指定应付补偿失败:分摊关系不满足一票一应付");
}
try {
kingdeeReceivedInvoiceSyncSupport.assignApBill(receipt.getInvoiceNo(), apBillSrcCode);
kingdeeReceivedInvoiceSyncSupport.assignApBill(String.valueOf(receipt.getId()), apBillSrcCode);
} catch (RuntimeException assignException) {
applyReceivedInvoicePushResult(receipt, row.getBillno(), KingdeeBfiConstant.RECEIVED_PUSH_FAILED,
truncatePushMsg("收票单指定应付补偿失败:" + assignException.getMessage()), true);
@@ -263,11 +263,11 @@ public class KingdeeReceivedInvoiceSyncSupport {
// ==================== A302-6 收票指定应付 ====================
/**
* 收票单指定财务应付单(A302-6,一票一应付):按「收票单防重键(发票号码)↔ 财务应付单防重键
* 收票单指定财务应付单(A302-6,一票一应付):按「收票单防重键(收票登记ID)↔ 财务应付单防重键
* (正式结算单号_结算明细单据号拼接)」建立绑定;金蝶侧解除指定(unassign)不自动执行,人工处理后重推
*
* @param invoiceSrcCode 收票单防重键(发票号码,即 A303-2 的 awrp_src_code)
* @param apBillSrcCode 财务应付单防重键
* @param invoiceSrcCode 收票单防重键(收票登记ID,即 A303-2 的 awrp_src_code = receipt.getId())
* @param apBillSrcCode 财务应付单防重键(即 A102-2 的 awrp_src_code = 正式结算单号_结算明细单据号拼接)
*/
public void assignApBill(String invoiceSrcCode, String apBillSrcCode) {
BfiInvoiceAssignItemDTO item = new BfiInvoiceAssignItemDTO();