feat: 收款认领推送金蝶定时任务增加single-flight分布式锁及Nacos配置

This commit is contained in:
刘泉佳
2026-09-29 12:12:59 +08:00
parent 78e7ee7239
commit a9eb1d82d4
4 changed files with 59 additions and 6 deletions
@@ -63,8 +63,10 @@ import org.springblade.transport.pojo.entity.ReceiptFlowRecord;
import org.springblade.transport.pojo.vo.ReceiptFlowVO;
import org.springblade.transport.service.IFormalSettlementService;
import org.springblade.transport.service.IReceiptFlowService;
import org.springblade.transport.support.KingdeeSyncLockSupport;
import org.springblade.transport.support.TransportBusinessSupport;
import org.springblade.transport.wrapper.ReceiptFlowWrapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;
@@ -115,6 +117,10 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl<KingdeeReceiptFlowMa
*/
private static final DateTimeFormatter BFI_DATE_TIME_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/**
* 定时推送收款认领 single-flight 锁键前缀(多副本定时任务共用)
*/
private static final String RECEIPT_CLAIM_PUSH_LOCK_PREFIX = "transport:receipt-flow:kingdee-claim-push:";
private final ReceiptClaimMapper claimMapper;
private final ReceiptClaimSettlementMapper claimSettlementMapper;
@@ -124,6 +130,14 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl<KingdeeReceiptFlowMa
private final IBfiService bfiService;
private final BfiProperties bfiProperties;
private final TransactionTemplate transactionTemplate;
private final KingdeeSyncLockSupport kingdeeSyncLockSupport;
/**
* 定时推送收款认领 single-flight 锁租约秒数,须大于最坏一轮耗时(逐认领人远程查公告 + 逐条推送),
* 否则租约到期后另一副本会并发起跑;进程异常退出时锁在租约到期后自动释放
*/
@Value("${thirdParty.bfi.receiptClaimPush.lockLeaseSeconds:1800}")
private long receiptClaimPushLockLeaseSeconds;
@Override
public IPage<ReceiptFlowVO> selectPage(IPage<KingdeeReceiptFlow> page, ReceiptFlowVO query) {
@@ -691,15 +705,27 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl<KingdeeReceiptFlowMa
}
/**
* 定时推送金蝶:扫描认领完成且未推送过的流水,按认领人姓名串行处理——
* 先重查该认领人的 A301-2 最新公告并推完其名下全部流水,再到下一个认领人。
* <p>
* A301-2 的 claimusers 必填且为单个用户姓名,定时任务无登录人上下文,
* 故按认领人逐人查询公告,按公告id(bill_id)匹配流水。
* 单条流水推送失败独立消化,不影响同批其他流水。
* 定时推送金蝶:扫描认领完成且未推送过的流水,按认领人姓名分组重查 A301-2 最新公告后逐条推送。
* 多副本部署下由 single-flight 分布式锁保证同一轮全局最多一份在跑,已有轮次进行中则本轮跳过。
*
* @return 执行摘要
*/
@Override
public String pushClaimByTask() {
return kingdeeSyncLockSupport.runSingleFlight(RECEIPT_CLAIM_PUSH_LOCK_PREFIX, receiptClaimPushLockLeaseSeconds,
"定时推送收款认领", this::executeReceiptClaimPush);
}
/**
* 定时推送收款认领主体:按认领人姓名串行处理——
* 先重查该认领人的 A301-2 最新公告并推完其名下全部流水,再到下一个认领人。
* A301-2 的 claimusers 必填且为单个用户姓名,定时任务无登录人上下文,
* 故按认领人逐人查询公告,按公告id(bill_id)匹配流水。
* 单条流水推送失败独立消化,不影响同批其他流水。
*
* @return 执行摘要
*/
private String executeReceiptClaimPush() {
List<KingdeeReceiptFlow> candidates = list(Wrappers.<KingdeeReceiptFlow>lambdaQuery()
.isNotNull(KingdeeReceiptFlow::getBillId)
.in(KingdeeReceiptFlow::getPushStatus, List.of(
+9
View File
@@ -164,6 +164,15 @@ thirdParty:
syncEnabled: ${BFI_PAY_RESULT_SYNC_ENABLED:true}
# 调度 cron,默认每10分钟
cron: ${BFI_PAY_RESULT_CRON:0 */10 * * * ?}
# 收款认领推送金蝶定时任务(A301-3 收款认领结果推送)
receiptClaimPush:
# 推送任务开关,默认关闭(联调稳定后开启)
syncEnabled: ${BFI_RECEIPT_CLAIM_PUSH_SYNC_ENABLED:false}
# 调度 cron,默认每10分钟
cron: ${BFI_RECEIPT_CLAIM_PUSH_CRON:0 */10 * * * ?}
# single-flight 分布式锁租约秒数,须大于最坏一轮耗时(逐认领人远程查公告+逐条推送),
# 进程异常退出时锁在租约到期后自动释放
lockLeaseSeconds: ${BFI_RECEIPT_CLAIM_PUSH_LOCK_LEASE_SECONDS:1800}
#百度OCR配置,API Key和Secret Key请通过环境变量注入
baidu:
+9
View File
@@ -135,6 +135,15 @@ thirdParty:
syncEnabled: ${BFI_PAY_RESULT_SYNC_ENABLED:true}
# 调度 cron,默认每10分钟
cron: ${BFI_PAY_RESULT_CRON:0 */10 * * * ?}
# 收款认领推送金蝶定时任务(A301-3 收款认领结果推送)
receiptClaimPush:
# 推送任务开关,默认关闭(联调稳定后开启)
syncEnabled: ${BFI_RECEIPT_CLAIM_PUSH_SYNC_ENABLED:false}
# 调度 cron,默认每10分钟
cron: ${BFI_RECEIPT_CLAIM_PUSH_CRON:0 */10 * * * ?}
# single-flight 分布式锁租约秒数,须大于最坏一轮耗时(逐认领人远程查公告+逐条推送),
# 进程异常退出时锁在租约到期后自动释放
lockLeaseSeconds: ${BFI_RECEIPT_CLAIM_PUSH_LOCK_LEASE_SECONDS:1800}
#百度OCR配置,API Key和Secret Key请通过环境变量注入
baidu:
+9
View File
@@ -64,3 +64,12 @@ thirdParty:
syncEnabled: ${BFI_PAY_RESULT_SYNC_ENABLED:true}
# 调度 cron,默认每10分钟
cron: ${BFI_PAY_RESULT_CRON:0 */10 * * * ?}
# 收款认领推送金蝶定时任务(A301-3 收款认领结果推送)
receiptClaimPush:
# 推送任务开关,默认关闭(联调稳定后开启)
syncEnabled: ${BFI_RECEIPT_CLAIM_PUSH_SYNC_ENABLED:false}
# 调度 cron,默认每10分钟
cron: ${BFI_RECEIPT_CLAIM_PUSH_CRON:0 */10 * * * ?}
# single-flight 分布式锁租约秒数,须大于最坏一轮耗时(逐认领人远程查公告+逐条推送),
# 进程异常退出时锁在租约到期后自动释放
lockLeaseSeconds: ${BFI_RECEIPT_CLAIM_PUSH_LOCK_LEASE_SECONDS:1800}