feat: 收票单A302-6指定应付自动补偿增加开关并默认关闭改人工兜底

This commit is contained in:
刘泉佳
2026-11-02 20:31:33 +08:00
parent a650737de1
commit 6c5169eae5
3 changed files with 23 additions and 3 deletions
@@ -264,6 +264,13 @@ public class BfiProperties {
* 回写任务开关,默认关闭(联调稳定后开启)
*/
private boolean syncEnabled = false;
/**
* A302-6 指定应付自动补偿开关:pushed 且已认领的收票单是否由本回写任务自动重发指定应付,
* 默认关闭(安全兜底),不自动推送指定应付,pushed 单据由人工入口
* (发票登记推送 / 认领发票重推按钮)触发指定;置 true 开启自动补偿
*/
private boolean assignCompensationEnabled = false;
}
/**
@@ -1116,6 +1116,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
* 按购方单位分组在时间窗口内反查金蝶收票单结果,一体推进三类补偿场景:
* ① 异常回收——金蝶侧发票状态异常时回收推送状态为 failed 并记同步流水,提示人工删除/解除指定后重推;
* ② 指定补偿——pushed 且已认领(有应付单防重键)按预组装的应付单防重键重发 A302-6 指定应付(重试引擎),未认领跳过;
* 受 {@code thirdParty.bfi.receivedInvoiceResult.assignCompensationEnabled} 开关控制,关闭后 pushed 单据由人工入口(发票登记推送/重推按钮)指定;
* ③ 单号补登——assigned 终态缺失金蝶收票单号(保存成功但响应丢失的历史数据)时仅补登单号,不改变状态。
* <p>匹配与容错说明:
* ① 匹配键为收票登记 id,与 A303-2 落库的 awrp_src_code 同源,按发票号匹配将永远查不到自推单据;
@@ -1128,6 +1129,7 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
*/
private String executeReceivedInvoiceResultSync() {
long startMillis = System.currentTimeMillis();
boolean assignCompensationEnabled = bfiProperties.getReceivedInvoiceResult().isAssignCompensationEnabled();
List<InvoiceReceipt> pendingReceipts = list(Wrappers.<InvoiceReceipt>lambdaQuery()
.in(InvoiceReceipt::getKingdeePushStatus, KingdeeBfiConstant.RECEIVED_PUSH_PUSHED,
KingdeeBfiConstant.RECEIVED_PUSH_ASSIGNED)
@@ -1142,14 +1144,17 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
.filter(receipt -> KingdeeBfiConstant.RECEIVED_PUSH_PUSHED.equals(receipt.getKingdeePushStatus())).count();
log.info("金蝶收票单结果回写开始:待回写收票登记{}笔(pushed待指定补偿 {} 笔,assigned待单号补登 {} 笔)",
pendingReceipts.size(), pushedCount, pendingReceipts.size() - pushedCount);
if (!assignCompensationEnabled) {
log.info("A302-6 指定应付自动补偿已关闭,pushed 单据由人工入口(发票登记推送/重推按钮)指定");
}
List<Long> mirrorIds = pendingReceipts.stream().map(InvoiceReceipt::getKingdeeInvoicePoolId)
.filter(Objects::nonNull).distinct().toList();
Map<Long, KingdeeInvoicePool> mirrorById = invoicePoolMapper.selectBatchIds(mirrorIds).stream()
.collect(Collectors.toMap(KingdeeInvoicePool::getId, Function.identity(), (first, second) -> first));
// pushed(保存成功后中断、指定未完成)集合:批量预组装应付单防重键供指定补偿
List<Long> pushedIds = pendingReceipts.stream()
// pushed(保存成功后中断、指定未完成)集合:批量预组装应付单防重键供指定补偿(补偿关闭时跳过组装)
List<Long> pushedIds = assignCompensationEnabled ? pendingReceipts.stream()
.filter(receipt -> KingdeeBfiConstant.RECEIVED_PUSH_PUSHED.equals(receipt.getKingdeePushStatus()))
.map(InvoiceReceipt::getId).toList();
.map(InvoiceReceipt::getId).toList() : List.of();
Map<Long, String> apSrcCodeByReceiptId = pushedIds.isEmpty() ? Map.of()
: resolveApBillSrcCodesForWriteBack(pushedIds);
Map<String, List<InvoiceReceipt>> receiptsByBuyer = new LinkedHashMap<>();
@@ -1191,6 +1196,11 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
continue;
}
if (KingdeeBfiConstant.RECEIVED_PUSH_PUSHED.equals(receipt.getKingdeePushStatus())) {
if (!assignCompensationEnabled) {
// 补偿开关关闭:不自动重发 A302-6,pushed 保持现状由人工入口指定
log.info("收票登记[{}]指定应付自动补偿已关闭,跳过 A302-6 重发", receipt.getInvoiceNo());
continue;
}
reassignPushedReceivedInvoice(receipt, row, apSrcCodeByReceiptId.get(receipt.getId()));
reassigned++;
continue;
+3
View File
@@ -105,6 +105,9 @@ thirdParty:
syncEnabled: ${BFI_RECEIVED_INVOICE_RESULT_SYNC_ENABLED:false}
# 调度 cron,默认每10分钟(:08 起步,错峰避让其他金蝶任务)
cron: ${BFI_RECEIVED_INVOICE_RESULT_CRON:0 8/10 * * * ?}
# A302-6 指定应付自动补偿开关:pushed 且已认领的收票单自动重发指定应付;
# 默认关闭(安全兜底),不自动推送指定应付,由人工入口(发票登记推送/认领发票重推按钮)触发
assignCompensationEnabled: ${BFI_RECEIVED_INVOICE_RESULT_ASSIGN_COMPENSATION_ENABLED:false}
# 收款认领推送金蝶定时任务(A301-3 收款认领结果推送)
receiptClaimPush:
# 推送任务开关,默认关闭(联调稳定后开启)