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/SignalR/UserIdsStore.cs |   90 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 88 insertions(+), 2 deletions(-)

diff --git a/VueWebCoreApi/SignalR/UserIdsStore.cs b/VueWebCoreApi/SignalR/UserIdsStore.cs
index 4090d89..518f115 100644
--- a/VueWebCoreApi/SignalR/UserIdsStore.cs
+++ b/VueWebCoreApi/SignalR/UserIdsStore.cs
@@ -6,10 +6,96 @@
 namespace VueWebCoreApi.SignalR
 {
     /// <summary>
-    /// 鐢ㄦ埛id闆嗗悎
+    /// 鐢ㄦ埛杩炴帴ID涓庣敤鎴风紪鐮佹槧灏勫瓨鍌紙绾跨▼瀹夊叏鐗堬級
+    /// 瑙e喅澶氱嚎绋嬪苟鍙戣鍐欏鑷寸殑瀛楀吀鏁版嵁閿欎贡闂
     /// </summary>
     public static class UserIdsStore
     {
-        public static Dictionary<string, string> Ids = new Dictionary<string, string>();
+        // 鏇挎崲涓虹嚎绋嬪畨鍏ㄧ殑骞跺彂瀛楀吀
+        private static readonly Dictionary<string, string> _ids = new Dictionary<string, string>();
+        // 鍔犻攣淇濊瘉瀛楀吀鎿嶄綔鐨勫師瀛愭�э紙姣擟oncurrentDictionary鏇寸伒娲绘帶鍒舵壒閲忔搷浣滐級
+        private static readonly object _lockObj = new object();
+
+        /// <summary>
+        /// 瀵瑰鏆撮湶鐨勮繛鎺ユ槧灏勶紙鍙锛岄伩鍏嶅閮ㄧ洿鎺ヤ慨鏀癸級
+        /// </summary>
+        public static IReadOnlyDictionary<string, string> Ids
+        {
+            get
+            {
+                lock (_lockObj)
+                {
+                    // 杩斿洖鏂板瓧鍏革紝閬垮厤澶栭儴鎷垮埌寮曠敤鍚庝慨鏀�
+                    return new Dictionary<string, string>(_ids);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 娣诲姞/鏇存柊鐢ㄦ埛杩炴帴锛堝師瀛愭搷浣滐級
+        /// </summary>
+        /// <param name="connectionId">SignalR杩炴帴ID</param>
+        /// <param name="userCode">鐢ㄦ埛缂栫爜</param>
+        public static void AddOrUpdateUser(string connectionId, string userCode)
+        {
+            if (string.IsNullOrEmpty(connectionId) || string.IsNullOrEmpty(userCode))
+                throw new ArgumentNullException("杩炴帴ID鍜岀敤鎴风紪鐮佷笉鑳戒负绌�");
+
+            lock (_lockObj)
+            {
+                // 鍏堢Щ闄よ鐢ㄦ埛鐨勬棫杩炴帴锛堜竴涓敤鎴峰彧淇濈暀鏈�鏂扮殑杩炴帴锛�
+                var oldConnIds = _ids.Where(kv => kv.Value == userCode).Select(kv => kv.Key).ToList();
+                foreach (var oldConnId in oldConnIds)
+                {
+                    _ids.Remove(oldConnId);
+                }
+                // 娣诲姞鏂拌繛鎺ワ紙瑕嗙洊鍚屽悕connectionId锛岄伩鍏嶉噸澶嶏級
+                if (_ids.ContainsKey(connectionId))
+                {
+                    _ids[connectionId] = userCode;
+                }
+                else
+                {
+                    _ids.Add(connectionId, userCode);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 绉婚櫎鎸囧畾杩炴帴ID鐨勬槧灏�
+        /// </summary>
+        /// <param name="connectionId">SignalR杩炴帴ID</param>
+        public static void RemoveUser(string connectionId)
+        {
+            if (string.IsNullOrEmpty(connectionId))
+                return;
+
+            lock (_lockObj)
+            {
+                if (_ids.ContainsKey(connectionId))
+                {
+                    _ids.Remove(connectionId);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁鐢ㄦ埛缂栫爜鑾峰彇鎵�鏈夊湪绾胯繛鎺D锛堜竴涓敤鎴峰彲鑳藉绔櫥褰曟椂杩斿洖澶氫釜锛�
+        /// </summary>
+        /// <param name="userCodes">鐢ㄦ埛缂栫爜鍒楄〃</param>
+        /// <returns>杩炴帴ID鍒楄〃</returns>
+        public static List<string> GetConnectionIdsByUserCodes(List<string> userCodes)
+        {
+            if (userCodes == null || userCodes.Count == 0)
+                return new List<string>();
+
+            lock (_lockObj)
+            {
+                return _ids.Where(kv => userCodes.Contains(kv.Value))
+                           .Select(kv => kv.Key)
+                           .Distinct() // 鍘婚噸锛岄伩鍏嶉噸澶嶆帹閫�
+                           .ToList();
+            }
+        }
     }
 }

--
Gitblit v1.9.3