From e5a1ca1f68de14caac01d7272d454e885bf01729 Mon Sep 17 00:00:00 2001
From: tengyufan <1532636164@qq.com>
Date: Fri, 21 Aug 2026 16:48:37 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=B6=E7=9B=8A=E4=BA=92=E6=8D=A2OA?=
=?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=AE=A1=E6=89=B9=E6=94=B9=E4=B8=BA=E5=86=85?=
=?UTF-8?q?=E9=83=A8=E5=AE=9A=E6=97=B6=E8=BD=AE=E8=AF=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 复用 HostedTaskService 定时器轮询待处理的 OA 移动审批状态
- 增加单实例防重入控制,避免同一进程内重复同步
- 新增 Erp.TradeApprovalOaSyncIntervalSeconds 配置,默认 30 秒
- 支持在 Admin 全局配置页修改查询间隔,保存后立即生效,无需重启
- 补充 AppConfig 初始化 SQL,不再依赖 PowerJob 或 XXL-JOB 外部调度
---
.../Configuration/Abstract/IErpConfig.cs | 5 +++
.../Configuration/ProjectSettings.cs | 5 +++
YLErpWeb/App/HostedTaskService.cs | 45 +++++++++++++++++++
3 files changed, 55 insertions(+)
diff --git a/Framework/YLErp.Core/Configuration/Abstract/IErpConfig.cs b/Framework/YLErp.Core/Configuration/Abstract/IErpConfig.cs
index 5e597013..6a10b28a 100644
--- a/Framework/YLErp.Core/Configuration/Abstract/IErpConfig.cs
+++ b/Framework/YLErp.Core/Configuration/Abstract/IErpConfig.cs
@@ -596,6 +596,11 @@ namespace YLErp.Configuration
///
int ExternalAPIForCustomCalcTimeOut { get; set; }
+ ///
+ /// 收益互换 OA 移动审批状态查询间隔(秒)。
+ ///
+ int TradeApprovalOaSyncIntervalSeconds { get; set; }
+
bool IsForwardTradeToBuy { get; set; }
///
/// 是否需要计算实时预警
diff --git a/Framework/YLErp.Core/Configuration/ProjectSettings.cs b/Framework/YLErp.Core/Configuration/ProjectSettings.cs
index 7b4fe8ca..102145fd 100644
--- a/Framework/YLErp.Core/Configuration/ProjectSettings.cs
+++ b/Framework/YLErp.Core/Configuration/ProjectSettings.cs
@@ -702,6 +702,11 @@ namespace YLErp
///
public int ExternalAPIForCustomCalcTimeOut { get; set; }
+ ///
+ /// 收益互换 OA 移动审批状态查询间隔(秒)。
+ ///
+ public int TradeApprovalOaSyncIntervalSeconds { get; set; } = 30;
+
public bool IsForwardTradeToBuy { get; set; }
///
/// 是否需要实时预警
diff --git a/YLErpWeb/App/HostedTaskService.cs b/YLErpWeb/App/HostedTaskService.cs
index 025420b8..9bbad9d4 100644
--- a/YLErpWeb/App/HostedTaskService.cs
+++ b/YLErpWeb/App/HostedTaskService.cs
@@ -6,6 +6,7 @@ using YLErp.Modules.EodModule.SettlementModule;
using YLErp.Modules.RiskEngine;
using YLErp.Modules.RiskModule;
using YLErp.Modules.SuperviseReportModule.SAC.Service;
+using YLErp.Modules.TradeModule;
using YLErp.Modules.TradeRiskCalcModule;
namespace YLErp.Web.App
@@ -17,6 +18,9 @@ namespace YLErp.Web.App
public class HostedTaskService : IHostedService
{
Timer _timer, _timerMonitor;
+ private int _tradeApprovalOaSyncRunning;
+ private DateTime _lastTradeApprovalOaSyncTime = DateTime.MinValue;
+ private readonly IYcLogger _logger = LogFactory.GetLogger();
private readonly IServer server;
private readonly IHostApplicationLifetime hostApplicationLifetime;
@@ -44,6 +48,8 @@ namespace YLErp.Web.App
});
}
+ TrySyncTradeApprovalOaStatus();
+
if (AppHelper.RunTradeRiskCalcV2)
{
Task.Run(() =>
@@ -86,6 +92,45 @@ namespace YLErp.Web.App
});
}
+ private void TrySyncTradeApprovalOaStatus()
+ {
+ var intervalSeconds = PS.Config?.ErpElement.TradeApprovalOaSyncIntervalSeconds ?? 30;
+ if (intervalSeconds <= 0)
+ {
+ intervalSeconds = 30;
+ }
+
+ if (_lastTradeApprovalOaSyncTime != DateTime.MinValue
+ && DateTime.Now - _lastTradeApprovalOaSyncTime < TimeSpan.FromSeconds(intervalSeconds))
+ {
+ return;
+ }
+
+ if (Interlocked.CompareExchange(ref _tradeApprovalOaSyncRunning, 1, 0) != 0)
+ {
+ return;
+ }
+
+ Task.Run(() =>
+ {
+ try
+ {
+ var results = new TradeApprovalOAService(new OptUserInfo(0, "系统移动审批同步", OptUserFrom.System))
+ .SyncPendingStatuses();
+ _logger.Info($"OA 移动审批状态定时同步完成,处理数量:{results.Count}");
+ }
+ catch (Exception ex)
+ {
+ _logger.Error("OA 移动审批状态定时同步失败", ex);
+ }
+ finally
+ {
+ _lastTradeApprovalOaSyncTime = DateTime.Now;
+ Interlocked.Exchange(ref _tradeApprovalOaSyncRunning, 0);
+ }
+ });
+ }
+
public Task StartAsync(CancellationToken cancellationToken)
{
object _state = System.Diagnostics.Debugger.IsAttached ? null : this;