From ecad98aa74a1284a036572fa364bcc352480149c Mon Sep 17 00:00:00 2001
From: yl <ykxkd@outlook.com>
Date: 星期一, 11 五月 2026 08:01:35 +0800
Subject: [PATCH] 1.车间综合看板接口调整 2.报工记录子表和不良记录表写入报工人员,班组编码 3.修改调整定时任务写入到数据库,并实现消息推送

---
 VueWebCoreApi/Quartz/HttpResultfulJob.cs |  150 +++++++++++++++++++++++++++++++++++++------------
 1 files changed, 112 insertions(+), 38 deletions(-)

diff --git a/VueWebCoreApi/Quartz/HttpResultfulJob.cs b/VueWebCoreApi/Quartz/HttpResultfulJob.cs
index c3aa4e5..5fecec2 100644
--- a/VueWebCoreApi/Quartz/HttpResultfulJob.cs
+++ b/VueWebCoreApi/Quartz/HttpResultfulJob.cs
@@ -12,83 +12,157 @@
 using VueWebCoreApi.Extensions;
 using VueWebCoreApi.SignalR;
 using VueWebCoreApi.Tools;
+using static VueWebCoreApi.Quartz.HttpManager;
 
 namespace VueWebCoreApi.Quartz
 {
+    /// <summary>
+    /// 瀹氭椂浠诲姟鎵ц绫伙細Quartz鍒版椂闂村悗锛岃嚜鍔ㄨ繍琛岃繖涓被鐨凟xecute鏂规硶
+    /// 浣滅敤锛氬彂閫丠TTP璇锋眰銆佽褰曚换鍔℃棩蹇椼�佹帹閫佹墽琛岀粨鏋�
+    /// </summary>
     public class HttpResultfulJob : IJob
     {
-        private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(ChatHub));
+        // 鏃ュ織璁板綍宸ュ叿锛坙og4net锛�
+        private readonly ILog _log = LogManager.GetLogger(Startup.repository.Name, typeof(ChatHub));
+        // SignalR 瀹炴椂鎺ㄩ�佸伐鍏凤紙缁欏墠绔帹閫佹秷鎭級
         private readonly IHubContext<ChatHub, IChatClient> _hubContext;
+        // HttpClient 宸ュ巶锛氱敤浜庡彂閫� HTTP 璇锋眰
+        private readonly IHttpClientFactory _httpClientFactory;
+        // 鏁版嵁搴撲粨鍌細鐢ㄤ簬璁板綍浠诲姟杩愯鏃ュ織銆佹洿鏂版渶鍚庢墽琛屾椂闂�
+        private readonly QuartzRepository _quartzRepo;
 
-        readonly IHttpClientFactory httpClientFactory;
         /// <summary>
-        /// 2020.05.31澧炲姞鏋勯�犳柟娉�
+        /// 鏋勯�犲嚱鏁帮細渚濊禆娉ㄥ叆锛堣嚜鍔ㄨ祴鍊兼墍鏈夐渶瑕佺殑鏈嶅姟锛�
         /// </summary>
-        /// <param name="serviceProvider"></param>
-        /// <param name="httpClientFactory"></param>
-        public HttpResultfulJob(IServiceProvider serviceProvider, IHttpClientFactory httpClientFactory, IHubContext<ChatHub, IChatClient> hubContext)
+        public HttpResultfulJob(IServiceProvider serviceProvider,
+                                IHttpClientFactory httpClientFactory,
+                                IHubContext<ChatHub, IChatClient> hubContext,
+                                QuartzRepository quartzRepo)
         {
-            this.httpClientFactory = httpClientFactory;
+            _httpClientFactory = httpClientFactory;
             _hubContext = hubContext;
-            //serviceProvider.GetService()
+            _quartzRepo = quartzRepo;
         }
+
+        /// <summary>
+        /// 銆愭牳蹇冩柟娉曘��
+        /// Quartz 璋冨害鍣ㄦ牴鎹� Cron 琛ㄨ揪寮忥紝鍒版椂闂村悗**鑷姩璋冪敤**杩欎釜鏂规硶
+        /// 浣滅敤锛氭墽琛屽叿浣撶殑浠诲姟閫昏緫锛堝彂閫丠TTP璇锋眰锛�
+        /// </summary>
         public async Task Execute(IJobExecutionContext context)
         {
-            DateTime dateTime = DateTime.Now;
-            TaskOptions taskOptions = context.GetTaskOptions();
-            string httpMessage = "";
-            AbstractTrigger trigger = (context as JobExecutionContextImpl).Trigger as AbstractTrigger;
+            // 璁板綍浠诲姟寮�濮嬫墽琛屾椂闂�
+            var beginTime = DateTime.Now;
+            // 浠� Quartz 涓婁笅鏂囪幏鍙栧綋鍓嶈鎵ц鐨勪换鍔¢厤缃紙鍚嶇О銆佸垎缁勩�乁RL銆丆ron绛夛級
+            var taskOptions = context.GetTaskOptions();
+            // 瀛樺偍 HTTP 璇锋眰杩斿洖鐨勭粨鏋滀俊鎭�
+            string httpMessage = string.Empty;
+            HttpResult result = new HttpResult();
+
+            // ==========================================
+            // 绗竴姝ワ細鏍¢獙浠诲姟鏄惁瀛樺湪
+            // ==========================================
             if (taskOptions == null)
             {
-                FileHelper.WriteFile(FileQuartz.LogPath + trigger.Group, $"{trigger.Name}.txt", "鏈埌鎵句綔涓氭垨鍙兘琚Щ闄�", true);
+                // 濡傛灉浠诲姟涓虹┖锛岃褰曢敊璇棩蹇楀埌鏁版嵁搴�
+                var trigger = context.Trigger;
+                await _quartzRepo.AddJobRunLogAsync(trigger.Key.Name, trigger.Key.Group, beginTime, DateTime.Now, "鏈壘鍒颁綔涓氭垨鍙兘琚Щ闄�", taskOptions.MessagePush, taskOptions.PushUserCode);
                 return;
             }
-            Console.WriteLine($"浣滀笟[{taskOptions.TaskName}]寮�濮�:{ DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss")}");
+            // 绯荤粺鏃ュ織杈撳嚭锛氫换鍔″紑濮嬫墽琛�
+            _log.Info($"浣滀笟[{taskOptions.TaskName}]寮�濮�:{beginTime:yyyy-MM-dd HH:mm:ss}");
+
+            // ==========================================
+            // 绗簩姝ワ細鏍¢獙浠诲姟鏄惁閰嶇疆浜嗚姹傚湴鍧�
+            // ==========================================
             if (string.IsNullOrEmpty(taskOptions.ApiUrl) || taskOptions.ApiUrl == "/")
             {
-                FileHelper.WriteFile(FileQuartz.LogPath + trigger.Group, $"{trigger.Name}.txt", $"{ DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss")}鏈厤缃畊rl,", true);
+                // 鏈厤缃瓵PI鍦板潃锛岃褰曟棩蹇�
+                await _quartzRepo.AddJobRunLogAsync(taskOptions.TaskName, taskOptions.GroupName, beginTime, DateTime.Now, "鏈厤缃甎RL", taskOptions.MessagePush, taskOptions.PushUserCode);
                 return;
             }
-
+            // ==========================================
+            // 绗笁姝ワ細鍙戦�� HTTP 璇锋眰锛堟牳蹇冧笟鍔★級
+            // ==========================================
             try
             {
-                Dictionary<string, string> header = new Dictionary<string, string>();
+                // 瀛樺偍璇锋眰澶达紙韬唤楠岃瘉淇℃伅锛�
+                var headers = new Dictionary<string, string>();
+                // 濡傛灉閰嶇疆浜� AuthKey 鍜� AuthValue锛屾坊鍔犲埌璇锋眰澶�
                 if (!string.IsNullOrEmpty(taskOptions.AuthKey) && !string.IsNullOrEmpty(taskOptions.AuthValue))
                 {
-                    header.Add(taskOptions.AuthKey.Trim(), taskOptions.AuthValue.Trim());
+                    headers.Add(taskOptions.AuthKey.Trim(), taskOptions.AuthValue.Trim());
                 }
-
-                httpMessage = await httpClientFactory.HttpSendAsync(taskOptions.RequestType?.ToLower() == "get" ? HttpMethod.Get : HttpMethod.Post, taskOptions.ApiUrl, header);
+                // 鍒ゆ柇璇锋眰鏂瑰紡锛欸ET 鎴� POST锛堥粯璁OST锛�
+                var method = taskOptions.RequestType?.ToLower() == "get" ? HttpMethod.Get : HttpMethod.Post;
+                // 璋冪敤宸ュ叿绫伙紝鍙戦�� HTTP 璇锋眰锛屽苟鑾峰彇杩斿洖缁撴灉
+                result = await _httpClientFactory.HttpSendAsync(method, taskOptions.ApiUrl, taskOptions.RequestParameters, headers);
             }
             catch (Exception ex)
             {
-                httpMessage = ex.Message;
+                // 濡傛灉璇锋眰寮傚父锛堢綉缁滈敊璇�佹帴鍙f姤閿欙級锛岃褰曞紓甯镐俊鎭�
+                result.ErrorMsg = ex.Message;
+                _log.Error($"浣滀笟[{taskOptions.TaskName}]鎵ц寮傚父:{ex.Message}", ex);
             }
 
             try
             {
-                string logContent = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}_{dateTime.ToString("yyyy-MM-dd HH:mm:ss")}_{(string.IsNullOrEmpty(httpMessage) ? "OK" : httpMessage)}\r\n";
-                FileHelper.WriteFile(FileQuartz.LogPath + taskOptions.GroupName + "\\", $"{taskOptions.TaskName}.txt", logContent, true);
-                //await _hubContext.Clients.All.SendAsync("SendMessage绯荤粺閫氱煡:"+$"鏈�鏂版秷鎭瘂DateTime.Now}");
-                //await _hubContext.Clients.All.SendAll(logContent);
-                //鏌ユ壘绯荤粺鐢ㄦ埛
-                var sql = @"select usercode as code,username as name
-                            from TUser 
-                            where  is_delete='0' and enable='Y' and password='123'";
-                var data = DapperHelper.selecttable(sql);
-                var departmentIDs = data.AsEnumerable().Select(x => x.Field<string>("code")).ToList();//鑾峰彇鎺ㄩ�佷汉鍛樼紪鐮�
-                var FindPublicBaseDic = UserIdsStore.Ids.Where(d => departmentIDs.Contains(d.Value)).Select(x => x.Key).ToList(); //鍖归厤宸茬粡鐧诲綍鐨勬帹閫佷汉鍛榗onnectionIds
-                if (FindPublicBaseDic.Count > 0)
+                // 1. 鎶婃湰娆℃墽琛岃褰曞啓鍏� SQL Server 鏁版嵁搴擄紙浠诲姟杩愯鏃ュ織琛級
+                await _quartzRepo.AddJobRunLogAsync(taskOptions.TaskName, taskOptions.GroupName, beginTime, DateTime.Now,result.StatusCode==200?result.Content.ToString():result.ErrorMsg, taskOptions.MessagePush, taskOptions.PushUserCode);
+                // 2. 鏇存柊浠诲姟琛ㄤ腑鐨勩�愭渶鍚庢墽琛屾椂闂淬��
+                await _quartzRepo.UpdateTaskLastRunTimeAsync(taskOptions.TaskName, taskOptions.GroupName, beginTime);
+
+                // ==========================================
+                // 浠ヤ笅鏄� SignalR 瀹炴椂鎺ㄩ�侊紙缁欏墠绔〉闈㈠彂娑堟伅锛�
+                // ==========================================
+                //鍒ゆ柇璇锋眰鏄惁鎴愬姛
+                if (result.IsSuccess)
                 {
-                    //鎺ㄩ�佹寚瀹氱敤鎴�
-                    await _hubContext.Clients.Clients(FindPublicBaseDic).SendCustomUserMessage(logContent);
+                    //鍐欏叆浠诲姟瀛愯〃
+                }
+                if (taskOptions.MessagePush == "N"||taskOptions.PushUserCode==null) //鏄惁闇�瑕佹帹閫�
+                {
+                    _log.Info($"浣滀笟[{taskOptions.TaskName}]鏃犻渶瑕佹帹閫佺殑鐢ㄦ埛锛岃烦杩嘢ignalR鎺ㄩ��");
+                    return;
+                }
+                //姝ラ2锛氭彁鍙栫敤鎴风紪鐮侊紙鍘婚噸 + 绌哄�艰繃婊わ級
+                var departmentIDs = taskOptions.PushUserCode.Split(',').ToList();
+
+                if (departmentIDs.Count == 0)
+                {
+                    _log.Info($"浣滀笟[{taskOptions.TaskName}]鏌ヨ鍒扮殑鐢ㄦ埛缂栫爜涓虹┖锛岃烦杩嘢ignalR鎺ㄩ��");
+                    return;
+                }
+                // 姝ラ3锛氳幏鍙栧湪绾跨敤鎴风殑杩炴帴ID锛堜娇鐢ㄧ嚎绋嬪畨鍏ㄦ柟娉曪級
+                var targetConnIds = UserIdsStore.GetConnectionIdsByUserCodes(departmentIDs);
+                if (targetConnIds.Count == 0)
+                {
+                    _log.Info($"浣滀笟[{taskOptions.TaskName}]鐩爣鐢ㄦ埛鍧囦笉鍦ㄧ嚎锛岃烦杩嘢ignalR鎺ㄩ��");
+                    return;
+                }
+                // 姝ラ4锛氭瀯閫犳帹閫佹秷鎭紙鏍囧噯鍖栨牸寮忥級
+                var logContent = $"銆恵taskOptions.TaskName}銆戞墽琛岀粨鏋滐細{beginTime:yyyy-MM-dd HH:mm:ss} 鑷� {DateTime.Now:yyyy-MM-dd HH:mm:ss} | 缁撴灉锛歿(string.IsNullOrEmpty(httpMessage) ? "鎵ц鎴愬姛" : httpMessage)}";
+                // 姝ラ5锛氭壒閲忔帹閫侊紙澧炲姞瓒呮椂+寮傚父鎹曡幏锛�
+                _log.Info($"浣滀笟[{taskOptions.TaskName}]寮�濮嬪悜[{targetConnIds.Count}]涓湪绾胯繛鎺ユ帹閫佹秷鎭細{logContent}");
+                // 璁剧疆鎺ㄩ�佽秴鏃舵椂闂达紙閬垮厤闀挎椂闂撮樆濉烇級
+                var pushTask = _hubContext.Clients.Clients(targetConnIds).SendCustomUserMessage(logContent);
+                if (await Task.WhenAny(pushTask, Task.Delay(5000)) == pushTask)
+                {
+                    await pushTask; // 鎺ㄩ�佹垚鍔�
+                    _log.Info($"浣滀笟[{taskOptions.TaskName}]SignalR鎺ㄩ�佸畬鎴愶紝鐩爣杩炴帴鏁帮細{targetConnIds.Count}");
+                }
+                else
+                {
+                    _log.Warn($"浣滀笟[{taskOptions.TaskName}]SignalR鎺ㄩ�佽秴鏃讹紙5绉掞級锛岀洰鏍囪繛鎺ユ暟锛歿targetConnIds.Count}");
                 }
             }
-            catch (Exception)
+            catch (Exception ex)
             {
+                // 璁板綍鏃ュ織鍐欏叆鎴栨帹閫佸け璐ョ殑寮傚父
+                _log.Error($"浣滀笟[{taskOptions.TaskName}]鏃ュ織鍐欏叆/SignalR鎺ㄩ�佸紓甯�:{ex.Message}", ex);
             }
-            Console.WriteLine(trigger.FullName + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss") + " " + httpMessage);
-            return;
+            // 绯荤粺鏃ュ織杈撳嚭锛氫换鍔℃墽琛岀粨鏉�
+            _log.Info($"浣滀笟[{taskOptions.TaskName}]缁撴潫:{DateTime.Now:yyyy-MM-dd HH:mm:ss} 缁撴灉:{result.ErrorMsg}");
         }
     }
 }

--
Gitblit v1.9.3