fix: 修复MK流程客商审批通过后未自动推送金蝶

开启MK字典后客商审批走流程回调 approveFromProcess,仅落审批状态不推送金蝶;
新增 syncKingdeeAfterApproval:两个 MK 消息入口审批通过后即时推送,
单飞锁防双入口并发双推,失败仅落推送失败状态不影响审批结果(与页面 /approve 口径一致)。
This commit is contained in:
刘泉佳
2026-11-09 11:37:17 +08:00
parent eb4b0a2bc4
commit 1443c75b56
4 changed files with 36 additions and 1 deletions
@@ -68,7 +68,12 @@ public final class MkProcessBizHandlers {
@Override @Override
public boolean approveFromProcess(Long id, String processorName) { public boolean approveFromProcess(Long id, String processorName) {
return service.approveFromProcess(id, processorName); boolean approved = service.approveFromProcess(id, processorName);
// 审批事务已提交,即时推送金蝶;失败不影响审批结果(与页面 /approve 口径一致)
if (approved) {
service.syncKingdeeAfterApproval(id);
}
return approved;
} }
@Override @Override
@@ -197,6 +197,14 @@ public interface ICustomerArchiveService extends BaseService<CustomerArchive> {
*/ */
CustomerArchive syncKingdee(Long id); CustomerArchive syncKingdee(Long id);
/**
* MK 流程审核通过后即时推送金蝶:单飞锁防双入口消息并发双推,内部吞异常仅记日志;
* 推送失败落 failed 状态供页面展示与手动重推,不影响已生效的审批结果(与页面 /approve 口径一致)
*
* @param id 主键
*/
void syncKingdeeAfterApproval(Long id);
/** /**
* A901-1 按统一社会信用代码查询金蝶供应商编码(新增客商填写信用代码后即时回显用),查不到返回 null * A901-1 按统一社会信用代码查询金蝶供应商编码(新增客商填写信用代码后即时回显用),查不到返回 null
* *
@@ -127,6 +127,8 @@ public class CustomerArchivePublicProcessService {
Long customerId = Long.valueOf(customerIdText); Long customerId = Long.valueOf(customerIdText);
if (approved) { if (approved) {
customerArchiveService.approveFromProcess(customerId, processorName); customerArchiveService.approveFromProcess(customerId, processorName);
// MK 流程审核通过即时推送金蝶;失败仅落推送失败状态,不影响审批结果(与页面 /approve 口径一致)
customerArchiveService.syncKingdeeAfterApproval(customerId);
} else { } else {
customerArchiveService.rejectFromProcess(customerId, processorName); customerArchiveService.rejectFromProcess(customerId, processorName);
} }
@@ -236,6 +236,9 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl<CustomerArchiveM
/** 金蝶客商数据同步 single-flight 锁键前缀(多副本定时任务与手动触发共用) */ /** 金蝶客商数据同步 single-flight 锁键前缀(多副本定时任务与手动触发共用) */
private static final String CUSTOMER_SYNC_LOCK_PREFIX = "transport:customer-archive:kingdee-customer-sync:"; private static final String CUSTOMER_SYNC_LOCK_PREFIX = "transport:customer-archive:kingdee-customer-sync:";
/** 客商审核通过即时推送 single-flight 锁键前缀(拼客商 id,防 MK 双入口消息并发双推) */
private static final String CUSTOMER_APPROVAL_PUSH_LOCK_PREFIX = "transport:customer-archive:kingdee-approval-push:";
@Override @Override
public IPage<CustomerArchiveVO> selectCustomerArchivePage(IPage<CustomerArchiveVO> page, CustomerArchiveVO customer) { public IPage<CustomerArchiveVO> selectCustomerArchivePage(IPage<CustomerArchiveVO> page, CustomerArchiveVO customer) {
List<CustomerArchiveVO> records = baseMapper.selectCustomerArchivePage(page, customer, currentScopeUserId()); List<CustomerArchiveVO> records = baseMapper.selectCustomerArchivePage(page, customer, currentScopeUserId());
@@ -591,6 +594,23 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl<CustomerArchiveM
} }
} }
@Override
public void syncKingdeeAfterApproval(Long id) {
if (id == null) {
return;
}
try {
kingdeeSyncLockSupport.runSingleFlight(CUSTOMER_APPROVAL_PUSH_LOCK_PREFIX + id,
bfiProperties.getCustomer().getLockLeaseSeconds(), "客商审核通过即时推送金蝶", () -> {
this.syncKingdee(id);
return "推送完成";
});
} catch (Exception exception) {
// 失败状态与原因已由 syncKingdee 独立事务落库供页面展示与重推,此处吞异常,不影响已生效的审批结果
log.warn("客商审核通过即时推送金蝶失败 id={} error={}", id, exception.getMessage(), exception);
}
}
/** /**
* 组装 A902-2 报文推送金蝶并回写协同状态;detail 由调用方准备, * 组装 A902-2 报文推送金蝶并回写协同状态;detail 由调用方准备,
* 定时同步批量组装报文数据,避免逐条 detail 查询的 N+1 问题; * 定时同步批量组装报文数据,避免逐条 detail 查询的 N+1 问题;