feat: 开票申请与结算单金蝶推送失败原因落库并随列表返回
This commit is contained in:
+4
@@ -160,6 +160,10 @@ public class FormalSettlement extends TenantEntity {
|
|||||||
* 金蝶同步状态:unsynced-未同步 synced-已同步 failed-同步失败
|
* 金蝶同步状态:unsynced-未同步 synced-已同步 failed-同步失败
|
||||||
*/
|
*/
|
||||||
private String kingdeeSyncStatus;
|
private String kingdeeSyncStatus;
|
||||||
|
/**
|
||||||
|
* 金蝶推送失败原因(仅 failed 态展示;重推成功转 synced 后残留原因不再回显)
|
||||||
|
*/
|
||||||
|
private String kingdeeFailReason;
|
||||||
/**
|
/**
|
||||||
* 附件JSON
|
* 附件JSON
|
||||||
*/
|
*/
|
||||||
|
|||||||
+4
@@ -167,6 +167,10 @@ public class InvoiceApplication extends TenantEntity {
|
|||||||
* 金蝶同步状态:unsynced-未同步 synced-已同步 failed-同步失败 invoiced-开票完成(终态)
|
* 金蝶同步状态:unsynced-未同步 synced-已同步 failed-同步失败 invoiced-开票完成(终态)
|
||||||
*/
|
*/
|
||||||
private String kingdeeStatus;
|
private String kingdeeStatus;
|
||||||
|
/**
|
||||||
|
* 金蝶推送失败原因(仅 failed 态展示;重推成功转 synced 后残留原因不再回显)
|
||||||
|
*/
|
||||||
|
private String kingdeeFailReason;
|
||||||
/**
|
/**
|
||||||
* 同步金蝶时间
|
* 同步金蝶时间
|
||||||
*/
|
*/
|
||||||
|
|||||||
+2
@@ -30,6 +30,8 @@ public class SettlementAdjustment extends TenantEntity {
|
|||||||
private String currentNode;
|
private String currentNode;
|
||||||
private String currentProcessor;
|
private String currentProcessor;
|
||||||
private String kingdeeSyncStatus;
|
private String kingdeeSyncStatus;
|
||||||
|
/** 金蝶推送失败原因(随结算单推送失败落库,仅 failed 态展示) */
|
||||||
|
private String kingdeeFailReason;
|
||||||
/**
|
/**
|
||||||
* 金蝶单据号(未推送场景回填原结算单金蝶单号;重推场景回填新单金蝶单号)
|
* 金蝶单据号(未推送场景回填原结算单金蝶单号;重推场景回填新单金蝶单号)
|
||||||
*/
|
*/
|
||||||
|
|||||||
+6
-3
@@ -872,13 +872,16 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
|
|||||||
.ne(FormalSettlement::getKingdeeSyncStatus, KingdeeBfiConstant.KINGDEE_STATUS_SYNCED)
|
.ne(FormalSettlement::getKingdeeSyncStatus, KingdeeBfiConstant.KINGDEE_STATUS_SYNCED)
|
||||||
.set(FormalSettlement::getKingdeeSyncStatus, KingdeeBfiConstant.KINGDEE_STATUS_FAILED));
|
.set(FormalSettlement::getKingdeeSyncStatus, KingdeeBfiConstant.KINGDEE_STATUS_FAILED));
|
||||||
if (updated > 0) {
|
if (updated > 0) {
|
||||||
// 结算调整单回填:未推送场景审批通过后自动推送失败,调整单置 failed 供「推送金蝶」重试
|
// 失败原因截断留档,与列长 varchar(500) 对齐
|
||||||
|
String failReason = Func.toStrWithEmpty(reason, "未知异常");
|
||||||
|
String columnReason = failReason.length() > 500 ? failReason.substring(0, 500) : failReason;
|
||||||
|
// 结算调整单回填:未推送场景审批通过后自动推送失败,调整单置 failed + 失败原因供「推送金蝶」重试
|
||||||
settlementAdjustmentMapper.update(null, Wrappers.<SettlementAdjustment>lambdaUpdate()
|
settlementAdjustmentMapper.update(null, Wrappers.<SettlementAdjustment>lambdaUpdate()
|
||||||
.eq(SettlementAdjustment::getFormalSettlementId, id)
|
.eq(SettlementAdjustment::getFormalSettlementId, id)
|
||||||
.eq(SettlementAdjustment::getApprovalStatus, TransportBusiConstant.APPROVED)
|
.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, "调整",
|
saveChange(id, "结算单基本信息", null, "调整",
|
||||||
"同步金蝶失败:" + (failReason.length() > 200 ? failReason.substring(0, 200) : failReason), null);
|
"同步金蝶失败:" + (failReason.length() > 200 ? failReason.substring(0, 200) : failReason), null);
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-3
@@ -639,17 +639,19 @@ public class InvoiceApplicationServiceImpl extends BaseServiceImpl<InvoiceApplic
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void markKingdeeSyncFailed(Long id, String reason) {
|
public void markKingdeeSyncFailed(Long id, String reason) {
|
||||||
if (id == null) return;
|
if (id == null) return;
|
||||||
// 条件更新:仅审批通过且未同步/未开票的单据落"生成失败"状态,其余自动跳过保持原状态
|
String failReason = truncateReason(reason);
|
||||||
|
// 条件更新:仅审批通过且未同步/未开票的单据落"生成失败"状态与失败原因,其余自动跳过保持原状态
|
||||||
int updated = baseMapper.update(null, Wrappers.<InvoiceApplication>lambdaUpdate()
|
int updated = baseMapper.update(null, Wrappers.<InvoiceApplication>lambdaUpdate()
|
||||||
.eq(InvoiceApplication::getId, id)
|
.eq(InvoiceApplication::getId, id)
|
||||||
.eq(InvoiceApplication::getApprovalStatus, TransportBusiConstant.APPROVED)
|
.eq(InvoiceApplication::getApprovalStatus, TransportBusiConstant.APPROVED)
|
||||||
.notIn(InvoiceApplication::getKingdeeStatus, KingdeeBfiConstant.KINGDEE_STATUS_SYNCED,
|
.notIn(InvoiceApplication::getKingdeeStatus, KingdeeBfiConstant.KINGDEE_STATUS_SYNCED,
|
||||||
KingdeeBfiConstant.KINGDEE_STATUS_INVOICED)
|
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) {
|
if (updated > 0) {
|
||||||
// 失败原因写操作流水留档(推送事务已回滚,此处独立事务)
|
// 失败原因写操作流水留档(推送事务已回滚,此处独立事务)
|
||||||
record(id, "sync", "同步金蝶失败", TransportBusiConstant.APPROVED, TransportBusiConstant.APPROVED,
|
record(id, "sync", "同步金蝶失败", TransportBusiConstant.APPROVED, TransportBusiConstant.APPROVED,
|
||||||
truncateReason(reason), null);
|
failReason, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
Reference in New Issue
Block a user