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()) { if (!failures.isEmpty()) {
summary = summary + ",失败 " + failures.size() + " 笔:" + String.join(";", failures); summary = summary + ",失败 " + failures.size() + " 笔:" + String.join(";", failures);
} }
log.info("{}", summary); log.info("推送金蝶收票单返回信息{}", summary);
return summary; return summary;
} }
@@ -695,7 +695,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
+ "未生成财务应付单"); + "未生成财务应付单");
} }
String billNo; String billNo;
BfiReceivedInvoiceVO kingdeeRow = kingdeeRows.get(receipt.getInvoiceNo()); BfiReceivedInvoiceVO kingdeeRow = kingdeeRows.get(String.valueOf(receipt.getId()));
if (kingdeeRow != null) { if (kingdeeRow != null) {
if (kingdeeReceivedInvoiceSyncSupport.isAbnormalInvoiceStatus(kingdeeRow.getInvoicestatus())) { if (kingdeeReceivedInvoiceSyncSupport.isAbnormalInvoiceStatus(kingdeeRow.getInvoicestatus())) {
String abnormalReason = truncatePushMsg("金蝶侧收票单发票状态异常(" String abnormalReason = truncatePushMsg("金蝶侧收票单发票状态异常("
@@ -736,7 +736,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
applyReceivedInvoicePushResult(receipt, billNo, KingdeeBfiConstant.RECEIVED_PUSH_PUSHED, null, false); applyReceivedInvoicePushResult(receipt, billNo, KingdeeBfiConstant.RECEIVED_PUSH_PUSHED, null, false);
try { try {
log.info("收票登记[{}]开始 A302-6 指定应付:应付单防重键={}", receipt.getInvoiceNo(), apBillSrcCode); log.info("收票登记[{}]开始 A302-6 指定应付:应付单防重键={}", receipt.getInvoiceNo(), apBillSrcCode);
kingdeeReceivedInvoiceSyncSupport.assignApBill(receipt.getInvoiceNo(), apBillSrcCode); kingdeeReceivedInvoiceSyncSupport.assignApBill(String.valueOf(receipt.getId()), apBillSrcCode);
} catch (RuntimeException assignException) { } catch (RuntimeException assignException) {
log.warn("收票登记[{}]A302-6 指定应付失败:{}", receipt.getInvoiceNo(), assignException.getMessage()); log.warn("收票登记[{}]A302-6 指定应付失败:{}", receipt.getInvoiceNo(), assignException.getMessage());
applyReceivedInvoicePushResult(receipt, billNo, KingdeeBfiConstant.RECEIVED_PUSH_FAILED, applyReceivedInvoicePushResult(receipt, billNo, KingdeeBfiConstant.RECEIVED_PUSH_FAILED,
@@ -798,8 +798,8 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
if (plan.blockedReason() != null) { if (plan.blockedReason() != null) {
continue; continue;
} }
invoiceNosByBuyer.computeIfAbsent(Func.toStrWithEmpty(plan.mirror().getReceiverName(), ""), invoiceNosByBuyer.computeIfAbsent(Func.toStrWithEmpty(plan.mirror().getReceiverName(), ""),
key -> new LinkedHashSet<>()).add(plan.receipt().getInvoiceNo()); key -> new LinkedHashSet<>()).add(String.valueOf(plan.receipt().getId()));
} }
Map<String, BfiReceivedInvoiceVO> rows = new LinkedHashMap<>(); Map<String, BfiReceivedInvoiceVO> rows = new LinkedHashMap<>();
LocalDateTime windowEnd = LocalDateTime.now(); LocalDateTime windowEnd = LocalDateTime.now();
@@ -956,7 +956,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
throw new ServiceException("收票单指定应付补偿失败:分摊关系不满足一票一应付"); throw new ServiceException("收票单指定应付补偿失败:分摊关系不满足一票一应付");
} }
try { try {
kingdeeReceivedInvoiceSyncSupport.assignApBill(receipt.getInvoiceNo(), apBillSrcCode); kingdeeReceivedInvoiceSyncSupport.assignApBill(String.valueOf(receipt.getId()), apBillSrcCode);
} catch (RuntimeException assignException) { } catch (RuntimeException assignException) {
applyReceivedInvoicePushResult(receipt, row.getBillno(), KingdeeBfiConstant.RECEIVED_PUSH_FAILED, applyReceivedInvoicePushResult(receipt, row.getBillno(), KingdeeBfiConstant.RECEIVED_PUSH_FAILED,
truncatePushMsg("收票单指定应付补偿失败:" + assignException.getMessage()), true); truncatePushMsg("收票单指定应付补偿失败:" + assignException.getMessage()), true);
@@ -263,11 +263,11 @@ public class KingdeeReceivedInvoiceSyncSupport {
// ==================== A302-6 收票指定应付 ==================== // ==================== A302-6 收票指定应付 ====================
/** /**
* 收票单指定财务应付单(A302-6,一票一应付):按「收票单防重键(发票号码)↔ 财务应付单防重键 * 收票单指定财务应付单(A302-6,一票一应付):按「收票单防重键(收票登记ID)↔ 财务应付单防重键
* (正式结算单号_结算明细单据号拼接)」建立绑定;金蝶侧解除指定(unassign)不自动执行,人工处理后重推 * (正式结算单号_结算明细单据号拼接)」建立绑定;金蝶侧解除指定(unassign)不自动执行,人工处理后重推
* *
* @param invoiceSrcCode 收票单防重键(发票号码,即 A303-2 的 awrp_src_code) * @param invoiceSrcCode 收票单防重键(收票登记ID,即 A303-2 的 awrp_src_code = receipt.getId())
* @param apBillSrcCode 财务应付单防重键 * @param apBillSrcCode 财务应付单防重键(即 A102-2 的 awrp_src_code = 正式结算单号_结算明细单据号拼接)
*/ */
public void assignApBill(String invoiceSrcCode, String apBillSrcCode) { public void assignApBill(String invoiceSrcCode, String apBillSrcCode) {
BfiInvoiceAssignItemDTO item = new BfiInvoiceAssignItemDTO(); BfiInvoiceAssignItemDTO item = new BfiInvoiceAssignItemDTO();