From f3d899dcb8c3d03e1d84d28fdc0d36cc9233b095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 22 Oct 2026 14:42:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=A1=E6=89=B9=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E6=8B=BC=E6=8E=A5=E9=87=91=E8=9D=B6=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=90=8C=E6=AD=A5=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FormalSettlementController.java | 6 ++++- .../InvoiceApplicationController.java | 6 ++++- .../controller/InvoiceReceiptController.java | 6 ++++- .../PaymentApplicationController.java | 6 ++++- .../SettlementAdjustmentController.java | 4 +++ .../listener/KingdeeApprovalSyncListener.java | 26 +++++++++++++++++++ 6 files changed, 50 insertions(+), 4 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java index 01a53d18..82477ac2 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java @@ -202,12 +202,16 @@ public class FormalSettlementController extends BladeController { return approveResponse(); } - /** 审批接口统一响应:审批已生效,自动推送失败原因以警告文案返回(data=false 供前端区分提示样式) */ + /** 审批接口统一响应:审批已生效,自动推送结果(成功单据号/失败原因)一并返回;失败用 data=false 供前端区分提示样式 */ private R approveResponse() { String syncFailure = KingdeeApprovalSyncListener.pollSyncFailure(); + String syncResult = KingdeeApprovalSyncListener.pollSyncResult(); if (syncFailure != null) { return R.data(Boolean.FALSE, "审批通过,但自动同步金蝶失败:" + syncFailure); } + if (syncResult != null) { + return R.success("审批通过,已同步金蝶:" + syncResult); + } return R.success("审批通过"); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceApplicationController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceApplicationController.java index bbe0bcf3..34c74ec3 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceApplicationController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceApplicationController.java @@ -134,12 +134,16 @@ public class InvoiceApplicationController extends BladeController { return approveResponse(); } - /** 审批接口统一响应:审批已生效,自动推送失败原因以警告文案返回(data=false 供前端区分提示样式) */ + /** 审批接口统一响应:审批已生效,自动推送结果(成功单据号/失败原因)一并返回;失败用 data=false 供前端区分提示样式 */ private R approveResponse() { String syncFailure = KingdeeApprovalSyncListener.pollSyncFailure(); + String syncResult = KingdeeApprovalSyncListener.pollSyncResult(); if (syncFailure != null) { return R.data(Boolean.FALSE, "审批通过,但自动同步金蝶失败:" + syncFailure); } + if (syncResult != null) { + return R.success("审批通过,已同步金蝶:" + syncResult); + } return R.success("审批通过"); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceReceiptController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceReceiptController.java index 59eb30b6..c9023ceb 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceReceiptController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/InvoiceReceiptController.java @@ -150,12 +150,16 @@ public class InvoiceReceiptController extends BladeController { return approveResponse(); } - /** 审批接口统一响应:审批已生效,自动推送失败原因以警告文案返回(data=false 供前端区分提示样式) */ + /** 审批接口统一响应:审批已生效,自动推送结果(成功单据号/失败原因)一并返回;失败用 data=false 供前端区分提示样式 */ private R approveResponse() { String syncFailure = KingdeeApprovalSyncListener.pollSyncFailure(); + String syncResult = KingdeeApprovalSyncListener.pollSyncResult(); if (syncFailure != null) { return R.data(Boolean.FALSE, "审批通过,但自动同步金蝶失败:" + syncFailure); } + if (syncResult != null) { + return R.success("审批通过,已同步金蝶:" + syncResult); + } return R.success("审批通过"); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/PaymentApplicationController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/PaymentApplicationController.java index ae6f6796..b24f3980 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/PaymentApplicationController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/PaymentApplicationController.java @@ -99,12 +99,16 @@ public class PaymentApplicationController extends BladeController { return approveResponse(); } - /** 审批接口统一响应:审批已生效,自动推送失败原因以警告文案返回(data=false 供前端区分提示样式) */ + /** 审批接口统一响应:审批已生效,自动推送结果(成功单据号/失败原因)一并返回;失败用 data=false 供前端区分提示样式 */ private R approveResponse() { String syncFailure = KingdeeApprovalSyncListener.pollSyncFailure(); + String syncResult = KingdeeApprovalSyncListener.pollSyncResult(); if (syncFailure != null) { return R.data(Boolean.FALSE, "审批通过,但自动同步金蝶失败:" + syncFailure); } + if (syncResult != null) { + return R.success("审批通过,已同步金蝶:" + syncResult); + } return R.success("审批通过"); } @PostMapping("/return") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/SettlementAdjustmentController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/SettlementAdjustmentController.java index d03d8d1d..86772411 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/SettlementAdjustmentController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/SettlementAdjustmentController.java @@ -39,12 +39,16 @@ public class SettlementAdjustmentController extends BladeController { String hint = service.approve(request); // 未推送场景自动推送失败原因以警告文案返回(data=false 供前端区分提示样式) String syncFailure = KingdeeApprovalSyncListener.pollSyncFailure(); + String syncResult = KingdeeApprovalSyncListener.pollSyncResult(); if (Func.isNotBlank(syncFailure)) { return R.data(Boolean.FALSE, "审批通过,但自动同步金蝶失败:" + syncFailure); } if (Func.isNotBlank(hint)) { return R.data(Boolean.TRUE, "审批通过;" + hint); } + if (Func.isNotBlank(syncResult)) { + return R.success("审批通过,已同步金蝶:" + syncResult); + } return R.success("审批通过"); } @PostMapping("/return") public R returnBill(@RequestBody SettlementAdjustmentStatusRequest request) { service.returnBill(request); return R.success("已驳回"); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java index 50a9ebd0..fbecca86 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/listener/KingdeeApprovalSyncListener.java @@ -68,6 +68,9 @@ public class KingdeeApprovalSyncListener { /** 当前审批请求线程的自动推送失败原因,供 Controller 取走提示前端(见类注释线程说明) */ private static final ThreadLocal SYNC_FAILURE = new ThreadLocal<>(); + /** 当前审批请求线程的自动推送成功结果(金蝶单据号/推送摘要),供 Controller 拼进提示文案 */ + private static final ThreadLocal SYNC_RESULT = new ThreadLocal<>(); + /** * 取走并清除当前审批请求的自动推送失败原因;null 表示推送成功或未触发推送。 * 须在 service.approve 返回后立即调用(监听器在审批事务提交时同步执行完毕)。 @@ -78,6 +81,23 @@ public class KingdeeApprovalSyncListener { return failure; } + /** + * 取走并清除当前审批请求的自动推送成功结果;null 表示推送失败或未触发推送。 + * 与 {@link #pollSyncFailure()} 成对调用,避免线程复用导致结果串单。 + */ + public static String pollSyncResult() { + String result = SYNC_RESULT.get(); + SYNC_RESULT.remove(); + return result; + } + + /** 记录本次自动推送的成功结果,空值不记录(未触发推送/接口无返回) */ + private static void recordResult(String result) { + if (result != null && !result.isBlank()) { + SYNC_RESULT.set(result); + } + } + /** * 事务提交后同步推送。fallbackExecution=true 兜底:approve 未开启事务时事件不再被默认丢弃。 * @@ -86,6 +106,7 @@ public class KingdeeApprovalSyncListener { @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, fallbackExecution = true) public void onBillApproved(KingdeeBillApprovedEvent event) { SYNC_FAILURE.remove(); + SYNC_RESULT.remove(); try { switch (event.bizType()) { case KingdeeBillApprovedEvent.BIZ_FORMAL_SETTLEMENT -> pushSettlement(event.id()); @@ -97,6 +118,7 @@ public class KingdeeApprovalSyncListener { } catch (Exception exception) { // 推送失败只记日志(失败状态已在推送方法内独立事务落库),不影响审批结果,交给重推任务与手动按钮兜底; // 原因暂存线程变量,由审批 Controller 取走提示前端 + SYNC_RESULT.remove(); log.error("审批通过自动同步金蝶失败 bizType={} id={}", event.bizType(), event.id(), exception); String reason = exception.getMessage() == null ? "金蝶接口调用异常" : exception.getMessage(); // 手动按钮同文案已带"推送金蝶失败:"前缀,拼提示时去掉避免重复 @@ -110,6 +132,7 @@ public class KingdeeApprovalSyncListener { } log.info("正式结算单[{}]审批通过自动同步金蝶开始", id); String billNo = formalSettlementService.syncKingdee(id); + recordResult(billNo); log.info("正式结算单[{}]审批通过自动同步金蝶完成:billNo={}", id, billNo); } @@ -128,6 +151,7 @@ public class KingdeeApprovalSyncListener { } log.info("付款申请[{}]审批通过自动同步金蝶开始", id); String kingdeeBillId = paymentApplicationService.syncKingdee(id); + recordResult(kingdeeBillId); log.info("付款申请[{}]审批通过自动同步金蝶完成:kingdeeBillId={}", id, kingdeeBillId); } @@ -137,6 +161,7 @@ public class KingdeeApprovalSyncListener { } log.info("开票申请[{}]审批通过自动同步金蝶开始", id); String billNo = invoiceApplicationService.syncKingdee(id); + recordResult(billNo); log.info("开票申请[{}]审批通过自动同步金蝶完成:billNo={}", id, billNo); } @@ -146,6 +171,7 @@ public class KingdeeApprovalSyncListener { } log.info("收票登记[{}]审批通过自动推送金蝶收票单开始", id); String summary = invoiceReceiptService.pushKingdeeReceivedInvoice(List.of(id), true); + recordResult(summary); log.info("收票登记[{}]审批通过自动推送金蝶收票单完成:{}", id, summary); } }