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;