feat: 付款申请金蝶推送失败原因落库并随列表返回
This commit is contained in:
+2
@@ -117,6 +117,8 @@ public class PaymentApplication extends TenantEntity {
|
||||
private String kingdeeBillId;
|
||||
/** 金蝶同步状态:unsynced 未生成 / synced 已生成 / paying 付款中 / paid 已付款 / closed 已关闭 / failed 生成失败 */
|
||||
private String kingdeeStatus;
|
||||
/** 金蝶推送失败原因(仅 failed 态展示;重推成功转 synced 后残留原因不再回显) */
|
||||
private String kingdeeFailReason;
|
||||
/** 附件信息JSON */
|
||||
private String attachmentsJson;
|
||||
/** 备注 */
|
||||
|
||||
+4
-3
@@ -72,12 +72,13 @@ public interface IPaymentApplicationService extends BaseService<PaymentApplicati
|
||||
String doSyncKingdee(Long id, KingdeeSyncContext context);
|
||||
|
||||
/**
|
||||
* 独立事务落"生成失败"状态(在推送事务回滚、行锁释放后执行);
|
||||
* 独立事务落"生成失败"状态与失败原因(在推送事务回滚、行锁释放后执行);
|
||||
* 仅更新审批通过的单据,未审批/已删除单据自动跳过,保持原状态
|
||||
*
|
||||
* @param id 付款申请id
|
||||
* @param id 付款申请id
|
||||
* @param reason 失败原因(异常信息,展示在列表状态悬浮提示)
|
||||
*/
|
||||
void markKingdeeSyncFailed(Long id);
|
||||
void markKingdeeSyncFailed(Long id, String reason);
|
||||
|
||||
/**
|
||||
* 重推金蝶生成失败(kingdeeStatus=failed 且审批通过)的付款申请:逐单独立成败,失败不中断。
|
||||
|
||||
+10
-5
@@ -551,12 +551,12 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl<PaymentApplic
|
||||
kingdeeBillId = self().doSyncKingdee(id, context);
|
||||
} catch (ServiceException exception) {
|
||||
log.error("付款申请[{}]推送金蝶付款申请单异常", id, exception);
|
||||
// 推送事务已回滚、行锁已释放,此处独立事务落"生成失败"状态
|
||||
self().markKingdeeSyncFailed(id);
|
||||
// 推送事务已回滚、行锁已释放,此处独立事务落"生成失败"状态与失败原因
|
||||
self().markKingdeeSyncFailed(id, exception.getMessage());
|
||||
throw exception;
|
||||
} catch (Exception exception) {
|
||||
log.error("付款申请[{}]推送金蝶付款申请单异常", id, exception);
|
||||
self().markKingdeeSyncFailed(id);
|
||||
self().markKingdeeSyncFailed(id, exception.getMessage());
|
||||
throw new ServiceException("推送金蝶付款申请失败:" + exception.getMessage());
|
||||
}
|
||||
// 主单事务提交后锁定金蝶付款申请单(lockBusiData):一张付款申请对一张金蝶付款申请单,接口1对1;
|
||||
@@ -735,13 +735,17 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl<PaymentApplic
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void markKingdeeSyncFailed(Long id) {
|
||||
public void markKingdeeSyncFailed(Long id, String reason) {
|
||||
if (id == null) return;
|
||||
// 失败原因截断留档,与列长 varchar(500) 对齐,不抛错
|
||||
String failReason = Func.toStrWithEmpty(reason, "未知异常");
|
||||
// 条件更新:仅审批通过的单据落"生成失败"状态,未审批/已删除单据自动跳过保持原状态
|
||||
baseMapper.update(null, Wrappers.<PaymentApplication>lambdaUpdate()
|
||||
.eq(PaymentApplication::getId, id)
|
||||
.eq(PaymentApplication::getApprovalStatus, TransportBusiConstant.APPROVED)
|
||||
.set(PaymentApplication::getKingdeeStatus, KingdeeBfiConstant.KINGDEE_STATUS_FAILED));
|
||||
.set(PaymentApplication::getKingdeeStatus, KingdeeBfiConstant.KINGDEE_STATUS_FAILED)
|
||||
.set(PaymentApplication::getKingdeeFailReason,
|
||||
failReason.length() > 500 ? failReason.substring(0, 500) : failReason));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -793,6 +797,7 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl<PaymentApplic
|
||||
.eq(PaymentApplication::getId, id)
|
||||
.in(PaymentApplication::getKingdeeStatus, KingdeeBfiConstant.KINGDEE_STATUS_SYNCED, KingdeeBfiConstant.KINGDEE_STATUS_PAYING)
|
||||
.set(PaymentApplication::getKingdeeStatus, KingdeeBfiConstant.KINGDEE_STATUS_FAILED)
|
||||
.set(PaymentApplication::getKingdeeFailReason, "金蝶侧单据已删除解锁(" + source + "),等待重新推送")
|
||||
.set(PaymentApplication::getKingdeeBillId, null)
|
||||
.set(PaymentApplication::getKingdeeBillNo, null));
|
||||
// 金蝶单据已删除/解锁重推:联动作废提前建档的预付记录,重推生成新单后重新建档
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
-- 付款管理:金蝶推送失败原因留档展示
|
||||
-- 新增 kingdee_fail_reason:markKingdeeSyncFailed 落"生成失败"时同步落失败原因,
|
||||
-- 列表"金蝶单据状态"列悬浮提示展示;重推成功转 synced 后残留原因不再回显
|
||||
|
||||
-- 以下结构升级支持重复执行
|
||||
SET @ddl_sql = (
|
||||
SELECT IF(COUNT(*) = 0,
|
||||
'ALTER TABLE `blade_payment_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_payment_application'
|
||||
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