From c6735cc98dd55e4e0bbd1a5a76bdc91c5fbb35cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Wed, 28 Oct 2026 17:00:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BC=80=E7=A5=A8=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=E4=B8=8E=E7=BB=93=E7=AE=97=E5=8D=95=E9=87=91=E8=9D=B6=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E5=A4=B1=E8=B4=A5=E5=8E=9F=E5=9B=A0=E8=90=BD=E5=BA=93?= =?UTF-8?q?=E5=B9=B6=E9=9A=8F=E5=88=97=E8=A1=A8=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/entity/FormalSettlement.java | 4 ++ .../pojo/entity/InvoiceApplication.java | 4 ++ .../pojo/entity/SettlementAdjustment.java | 2 + .../impl/FormalSettlementServiceImpl.java | 9 ++-- .../impl/InvoiceApplicationServiceImpl.java | 8 ++-- .../02_blade_kingdee_fail_reason_20261028.sql | 43 +++++++++++++++++++ 6 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 doc/sql/transport/lqj/20261028/02_blade_kingdee_fail_reason_20261028.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/FormalSettlement.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/FormalSettlement.java index 20c42775..66fbf13d 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/FormalSettlement.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/FormalSettlement.java @@ -160,6 +160,10 @@ public class FormalSettlement extends TenantEntity { * 金蝶同步状态:unsynced-未同步 synced-已同步 failed-同步失败 */ private String kingdeeSyncStatus; + /** + * 金蝶推送失败原因(仅 failed 态展示;重推成功转 synced 后残留原因不再回显) + */ + private String kingdeeFailReason; /** * 附件JSON */ diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceApplication.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceApplication.java index 60ede7e1..6b85f353 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceApplication.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/InvoiceApplication.java @@ -167,6 +167,10 @@ public class InvoiceApplication extends TenantEntity { * 金蝶同步状态:unsynced-未同步 synced-已同步 failed-同步失败 invoiced-开票完成(终态) */ private String kingdeeStatus; + /** + * 金蝶推送失败原因(仅 failed 态展示;重推成功转 synced 后残留原因不再回显) + */ + private String kingdeeFailReason; /** * 同步金蝶时间 */ diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/SettlementAdjustment.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/SettlementAdjustment.java index 888fcce8..700c7b88 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/SettlementAdjustment.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/SettlementAdjustment.java @@ -30,6 +30,8 @@ public class SettlementAdjustment extends TenantEntity { private String currentNode; private String currentProcessor; private String kingdeeSyncStatus; + /** 金蝶推送失败原因(随结算单推送失败落库,仅 failed 态展示) */ + private String kingdeeFailReason; /** * 金蝶单据号(未推送场景回填原结算单金蝶单号;重推场景回填新单金蝶单号) */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java index 34795cdb..9e9f1b1e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java @@ -872,13 +872,16 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl 0) { - // 结算调整单回填:未推送场景审批通过后自动推送失败,调整单置 failed 供「推送金蝶」重试 + // 失败原因截断留档,与列长 varchar(500) 对齐 + String failReason = Func.toStrWithEmpty(reason, "未知异常"); + String columnReason = failReason.length() > 500 ? failReason.substring(0, 500) : failReason; + // 结算调整单回填:未推送场景审批通过后自动推送失败,调整单置 failed + 失败原因供「推送金蝶」重试 settlementAdjustmentMapper.update(null, Wrappers.lambdaUpdate() .eq(SettlementAdjustment::getFormalSettlementId, id) .eq(SettlementAdjustment::getApprovalStatus, TransportBusiConstant.APPROVED) - .set(SettlementAdjustment::getKingdeeSyncStatus, KingdeeBfiConstant.KINGDEE_STATUS_FAILED)); + .set(SettlementAdjustment::getKingdeeSyncStatus, KingdeeBfiConstant.KINGDEE_STATUS_FAILED) + .set(SettlementAdjustment::getKingdeeFailReason, columnReason)); // 失败原因写变更记录留档(推送事务已回滚,此处独立事务);原因过长截断留档,不抛错 - String failReason = Func.toStrWithEmpty(reason, "未知异常"); saveChange(id, "结算单基本信息", null, "调整", "同步金蝶失败:" + (failReason.length() > 200 ? failReason.substring(0, 200) : failReason), null); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceApplicationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceApplicationServiceImpl.java index 5de8ea1e..46af949b 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceApplicationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/InvoiceApplicationServiceImpl.java @@ -639,17 +639,19 @@ public class InvoiceApplicationServiceImpl extends BaseServiceImpllambdaUpdate() .eq(InvoiceApplication::getId, id) .eq(InvoiceApplication::getApprovalStatus, TransportBusiConstant.APPROVED) .notIn(InvoiceApplication::getKingdeeStatus, KingdeeBfiConstant.KINGDEE_STATUS_SYNCED, KingdeeBfiConstant.KINGDEE_STATUS_INVOICED) - .set(InvoiceApplication::getKingdeeStatus, KingdeeBfiConstant.KINGDEE_STATUS_FAILED)); + .set(InvoiceApplication::getKingdeeStatus, KingdeeBfiConstant.KINGDEE_STATUS_FAILED) + .set(InvoiceApplication::getKingdeeFailReason, failReason)); if (updated > 0) { // 失败原因写操作流水留档(推送事务已回滚,此处独立事务) record(id, "sync", "同步金蝶失败", TransportBusiConstant.APPROVED, TransportBusiConstant.APPROVED, - truncateReason(reason), null); + failReason, null); } } diff --git a/doc/sql/transport/lqj/20261028/02_blade_kingdee_fail_reason_20261028.sql b/doc/sql/transport/lqj/20261028/02_blade_kingdee_fail_reason_20261028.sql new file mode 100644 index 00000000..ccf684c3 --- /dev/null +++ b/doc/sql/transport/lqj/20261028/02_blade_kingdee_fail_reason_20261028.sql @@ -0,0 +1,43 @@ +-- 开票申请 / 正式结算单 / 结算调整单:金蝶推送失败原因留档展示 +-- markKingdeeSyncFailed 落"同步失败"时同步落失败原因,列表"金蝶单据状态"列悬浮提示展示; +-- 重推成功转 synced 后残留原因不再回显。付款管理 blade_payment_application 已单独处理(20261028) + +-- 以下结构升级支持重复执行(三张表逐一判断) +SET @ddl_sql = ( + SELECT IF(COUNT(*) = 0, + 'ALTER TABLE `blade_invoice_application` ADD COLUMN `kingdee_fail_reason` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶推送失败原因'' AFTER `kingdee_status`', + 'SELECT 1') + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'blade_invoice_application' + AND COLUMN_NAME = 'kingdee_fail_reason' +); +PREPARE ddl_stmt FROM @ddl_sql; +EXECUTE ddl_stmt; +DEALLOCATE PREPARE ddl_stmt; + +SET @ddl_sql = ( + SELECT IF(COUNT(*) = 0, + 'ALTER TABLE `blade_formal_settlement` ADD COLUMN `kingdee_fail_reason` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶推送失败原因'' AFTER `kingdee_sync_status`', + 'SELECT 1') + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'blade_formal_settlement' + AND COLUMN_NAME = 'kingdee_fail_reason' +); +PREPARE ddl_stmt FROM @ddl_sql; +EXECUTE ddl_stmt; +DEALLOCATE PREPARE ddl_stmt; + +SET @ddl_sql = ( + SELECT IF(COUNT(*) = 0, + 'ALTER TABLE `blade_settlement_adjustment` ADD COLUMN `kingdee_fail_reason` varchar(500) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ''金蝶推送失败原因'' AFTER `kingdee_sync_status`', + 'SELECT 1') + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'blade_settlement_adjustment' + AND COLUMN_NAME = 'kingdee_fail_reason' +); +PREPARE ddl_stmt FROM @ddl_sql; +EXECUTE ddl_stmt; +DEALLOCATE PREPARE ddl_stmt;