From f288ccc545f8cc32bc922c96dfb3cab9a1f92ec6 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期一, 20 四月 2026 00:49:55 +0800
Subject: [PATCH] feat: 初始化WMS前端项目并实现基础功能

---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotStateManager.cs |  167 ++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 104 insertions(+), 63 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotStateManager.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotStateManager.cs
index 9500fd7..4aaae62 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotStateManager.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotStateManager.cs
@@ -1,123 +1,164 @@
+using Microsoft.Extensions.Logging;
 using Newtonsoft.Json;
-using WIDESEAWCS_Common;
-using WIDESEAWCS_Core.Caches;
-using WIDESEAWCS_QuartzJob;
+using WIDESEAWCS_Core.LogHelper;
+using WIDESEAWCS_ITaskInfoRepository;
+using WIDESEAWCS_Model.Models;
 
 namespace WIDESEAWCS_Tasks
 {
     /// <summary>
-    /// 鏈烘鎵嬬姸鎬佺鐞嗗櫒 - 璐熻矗RobotSocketState鐨勫畨鍏ㄦ洿鏂板拰鍏嬮殕
+    /// 鏈烘鎵嬬姸鎬佺鐞嗗櫒 - 璐熻矗 RobotSocketState 鐨勭嚎绋嬪畨鍏ㄦ洿鏂板拰鍏嬮殕
     /// </summary>
+    /// <remarks>
+    /// 鏍稿績鍔熻兘鏄�氳繃 IRobotStateRepository 绠$悊鏁版嵁搴撲腑鐨勬満姊版墜鐘舵�併��
+    /// 鎻愪緵涔愯骞跺彂鎺у埗锛岄�氳繃 Version 瀛楁闃叉骞跺彂鏇存柊鏃剁殑鏁版嵁瑕嗙洊闂銆�
+    /// </remarks>
     public class RobotStateManager
     {
-        private readonly ICacheService _cache;
+        /// <summary>
+        /// 浠撳偍鏈嶅姟瀹炰緥锛岀敤浜庤鍐欐暟鎹簱涓殑鐘舵�佹暟鎹�
+        /// </summary>
+        private readonly IRobotStateRepository _repository;
 
-        public RobotStateManager(ICacheService cache)
+        /// <summary>
+        /// 鏃ュ織璁板綍鍣�
+        /// </summary>
+        private readonly ILogger _logger;
+
+        /// <summary>
+        /// 鏋勯�犲嚱鏁�
+        /// </summary>
+        /// <param name="repository">浠撳偍鏈嶅姟瀹炰緥</param>
+        /// <param name="logger">鏃ュ織璁板綍鍣�</param>
+        public RobotStateManager(IRobotStateRepository repository, ILogger logger)
         {
-            _cache = cache;
+            _repository = repository;
+            _logger = logger;
         }
 
         /// <summary>
-        /// 瀹夊叏鏇存柊RobotSocketState缂撳瓨锛岄槻姝㈠苟鍙戣鐩�
+        /// 瀹夊叏鏇存柊 RobotSocketState锛岄槻姝㈠苟鍙戣鐩�
         /// </summary>
-        /// <param name="ipAddress">璁惧IP鍦板潃</param>
-        /// <param name="updateAction">鏇存柊鐘舵�佺殑濮旀墭锛堜紶鍏ュ綋鍓嶇姸鎬侊紝杩斿洖淇敼鍚庣殑鏂扮姸鎬侊級</param>
-        /// <returns>鏄惁鏇存柊鎴愬姛</returns>
+        /// <remarks>
+        /// 浣跨敤涔愯骞跺彂妯″紡锛氬厛璇诲彇褰撳墠 Version锛屾墽琛屾洿鏂版椂妫�鏌ョ増鏈槸鍚︿竴鑷淬��
+        /// 濡傛灉 Version 涓嶅尮閰嶏紙璇存槑鏈夊叾浠栫嚎绋嬪凡鏇存柊锛夛紝鍒欐洿鏂板け璐ヨ繑鍥� false銆�
+        /// </remarks>
+        /// <param name="ipAddress">璁惧 IP 鍦板潃</param>
+        /// <param name="updateAction">鏇存柊鐘舵�佺殑濮旀墭鍑芥暟锛屼紶鍏ュ綋鍓嶇姸鎬佸壇鏈紝杩斿洖淇敼鍚庣殑鏂扮姸鎬�</param>
+        /// <returns>鏄惁鏇存柊鎴愬姛锛沠alse 琛ㄧず鐗堟湰鍐茬獊鎴栫姸鎬佷笉瀛樺湪</returns>
         public bool TryUpdateStateSafely(string ipAddress, Func<RobotSocketState, RobotSocketState> updateAction)
         {
-            var cacheKey = GetCacheKey(ipAddress);
-            var currentState = _cache.Get<RobotSocketState>(cacheKey);
+            // 浠庢暟鎹簱鑾峰彇褰撳墠瀛樺偍鐨勭姸鎬�
+            var currentEntity = _repository.GetByIp(ipAddress);
 
-            if (currentState == null)
+            if (currentEntity == null)
             {
                 return false;
             }
 
-            // 浣跨敤褰撳墠瀛樺偍鐨勭増鏈彿浣滀负鏈熸湜鐗堟湰
-            var expectedVersion = currentState.Version;
+            // 璁板綍褰撳墠瀛樺偍鐨� Version锛屼綔涓烘洿鏂版椂鐨勬湡鏈涚増鏈�
+            var expectedVersion = currentEntity.Version;
 
-            // 鍒涘缓鐘舵�佸壇鏈繘琛屼慨鏀癸紙閬垮厤淇敼鍘熷璞″紩鐢級
-            var stateCopy = CloneState(currentState);
+            // 鍒涘缓鐘舵�佺殑娣辨嫹璐濆壇鏈紙浣跨敤 JSON 搴忓垪鍖栧疄鐜帮級
+            var stateCopy = CloneState(_repository.ToSocketState(currentEntity));
+
+            // 鎵ц璋冪敤鑰呮彁渚涚殑鏇存柊閫昏緫锛屼紶鍏ュ壇鏈姸鎬侊紝鑾峰彇鏂扮殑鐘舵�佸璞�
             var newState = updateAction(stateCopy);
-            newState.Version = DateTime.UtcNow.Ticks;
 
-            return _cache.TrySafeUpdate(
-                cacheKey,
-                newState,
-                expectedVersion,
-                s => s.Version
-            );
+            // 灏嗘柊鐘舵�佽浆鎹负鏁版嵁搴撳疄浣�
+            var newEntity = _repository.ToEntity(newState);
+            newEntity.Id = currentEntity.Id;
+            newEntity.Version = expectedVersion + 1; // 鐗堟湰鑷
+
+            // 璋冪敤浠撳偍鐨勫畨鍏ㄦ洿鏂版柟娉曪紝浼犲叆鏈熸湜 Version
+            // 濡傛灉 Version 涓嶄竴鑷达紙宸茶鍏朵粬绾跨▼鏇存柊锛夛紝鍒欐洿鏂板け璐�
+            return _repository.TryUpdate(ipAddress, newEntity, expectedVersion);
         }
 
         /// <summary>
-        /// 瀹夊叏鏇存柊RobotSocketState缂撳瓨锛堢畝鍗曠増鏈級
+        /// 瀹夊叏鏇存柊 RobotSocketState 鐨勯噸杞界増鏈紙鐩存帴浼犲叆鏂扮姸鎬侊級
         /// </summary>
-        /// <param name="ipAddress">璁惧IP鍦板潃</param>
-        /// <param name="newState">鏂扮姸鎬侊紙浼氳鏇存柊Version瀛楁锛�</param>
-        /// <returns>鏄惁鏇存柊鎴愬姛</returns>
+        /// <remarks>
+        /// 涓庝笂涓�涓噸杞界殑鍖哄埆锛氭鏂规硶鐩存帴鎺ユ敹瀹屾暣鐨勬柊鐘舵�佸璞★紝鑰屼笉鏄洿鏂板鎵樸��
+        /// 濡傛灉鏁版嵁搴撲腑涓嶅瓨鍦ㄨ璁惧鐨勭姸鎬侊紝鍒欏垱寤烘柊璁板綍銆�
+        /// </remarks>
+        /// <param name="ipAddress">璁惧 IP 鍦板潃</param>
+        /// <param name="newState">鏂扮姸鎬佸璞�</param>
+        /// <returns>鏄惁鏇存柊鎴愬姛锛涙柊寤鸿缃负 true</returns>
         public bool TryUpdateStateSafely(string ipAddress, RobotSocketState newState)
         {
-            var cacheKey = GetCacheKey(ipAddress);
-            var currentState = _cache.Get<RobotSocketState>(cacheKey);
+            // 浠庢暟鎹簱鑾峰彇褰撳墠瀛樺偍鐨勭姸鎬�
+            var currentEntity = _repository.GetByIp(ipAddress);
 
-            if (currentState == null)
+            // 濡傛灉褰撳墠涓嶅瓨鍦ㄨ璁惧鐨勭姸鎬侊紝鍒涘缓鏂拌褰�
+            if (currentEntity == null)
             {
-                // 褰撳墠涓嶅瓨鍦紝鐩存帴娣诲姞
-                newState.Version = DateTime.UtcNow.Ticks;
-                _cache.AddObject(cacheKey, newState);
+                _repository.GetOrCreate(newState.IPAddress, newState.RobotCrane ?? new RobotCraneDevice());
+                _logger.LogDebug("TryUpdateStateSafely锛氬垱寤烘柊鐘舵�侊紝IP: {IpAddress}", ipAddress);
+                QuartzLogger.Debug($"鍒涘缓鏂扮姸鎬侊紝IP: {ipAddress}", ipAddress);
                 return true;
             }
 
-            // 浣跨敤褰撳墠瀛樺偍鐨勭増鏈彿浣滀负鏈熸湜鐗堟湰
-            var expectedVersion = currentState.Version;
+            // 褰撳墠瀛樺湪鐘舵�侊紝璁板綍鏈熸湜 Version 鐢ㄤ簬涔愯閿佹鏌�
+            var expectedVersion = currentEntity.Version;
 
-            // 鏇存柊鏂扮姸鎬佺殑鐗堟湰鍙蜂负鏈�鏂版椂闂存埑
-            newState.Version = DateTime.UtcNow.Ticks;
+            // 灏嗘柊鐘舵�佽浆鎹负鏁版嵁搴撳疄浣�
+            var newEntity = _repository.ToEntity(newState);
+            newEntity.Id = currentEntity.Id;
+            newEntity.Version = expectedVersion + 1; // 鐗堟湰鑷
 
-            return _cache.TrySafeUpdate(
-                cacheKey,
-                newState,
-                expectedVersion,
-                s => s.Version
-            );
+            // 灏濊瘯瀹夊叏鏇存柊锛屽鏋滅増鏈啿绐佸垯杩斿洖 false
+            bool success = _repository.TryUpdate(ipAddress, newEntity, expectedVersion);
+
+            if (!success)
+            {
+                _logger.LogWarning("TryUpdateStateSafely锛氱増鏈啿绐侊紝鏇存柊澶辫触锛孖P: {IpAddress}锛屾湡鏈涚増鏈�: {ExpectedVersion}", ipAddress, expectedVersion);
+                QuartzLogger.Warn($"鐗堟湰鍐茬獊锛屾洿鏂板け璐ワ紝IP: {ipAddress}", ipAddress);
+            }
+
+            return success;
         }
 
         /// <summary>
-        /// 鍏嬮殕RobotSocketState瀵硅薄锛堝垱寤烘繁鎷疯礉锛�
+        /// 鍏嬮殕 RobotSocketState 瀵硅薄锛堟繁鎷疯礉锛�
         /// </summary>
+        /// <remarks>
+        /// 浣跨敤 JSON 搴忓垪鍖�/鍙嶅簭鍒楀寲瀹炵幇娣辨嫹璐濄��
+        /// 杩欐牱鍙互纭繚鏂板璞′笌鍘熷璞″畬鍏ㄧ嫭绔嬶紝淇敼鏂板璞′笉浼氬奖鍝嶅師瀵硅薄銆�
+        /// </remarks>
+        /// <param name="source">婧愮姸鎬佸璞�</param>
+        /// <returns>鏂扮殑鐘舵�佸璞★紝鏄簮瀵硅薄鐨勬繁鎷疯礉</returns>
         public RobotSocketState CloneState(RobotSocketState source)
         {
-            // 浣跨敤搴忓垪鍖�/鍙嶅簭鍒楀寲杩涜娣辨嫹璐�
             var json = JsonConvert.SerializeObject(source);
             return JsonConvert.DeserializeObject<RobotSocketState>(json) ?? new RobotSocketState { IPAddress = source.IPAddress };
         }
 
         /// <summary>
-        /// 鑾峰彇Redis缂撳瓨閿�
+        /// 浠庢暟鎹簱鑾峰彇鏈烘鎵嬬姸鎬�
         /// </summary>
-        public static string GetCacheKey(string ipAddress)
-        {
-            return $"{RedisPrefix.Code}:{RedisName.SocketDevices}:{ipAddress}";
-        }
-
-        /// <summary>
-        /// 浠庣紦瀛樿幏鍙栫姸鎬�
-        /// </summary>
+        /// <param name="ipAddress">璁惧 IP 鍦板潃</param>
+        /// <returns>濡傛灉瀛樺湪鍒欒繑鍥炵姸鎬佸璞★紝鍚﹀垯杩斿洖 null</returns>
         public RobotSocketState? GetState(string ipAddress)
         {
-            return _cache.Get<RobotSocketState>(GetCacheKey(ipAddress));
+            var entity = _repository.GetByIp(ipAddress);
+            return entity != null ? _repository.ToSocketState(entity) : null;
         }
 
         /// <summary>
-        /// 鑾峰彇鎴栧垱寤虹姸鎬�
+        /// 鑾峰彇鎴栧垱寤烘満姊版墜鐘舵��
         /// </summary>
+        /// <remarks>
+        /// 濡傛灉鏁版嵁搴撲腑宸插瓨鍦ㄨ璁惧鐨勭姸鎬侊紝鐩存帴杩斿洖銆�
+        /// 濡傛灉涓嶅瓨鍦紝鍒欏垱寤烘柊鐨勭姸鎬佽褰曞苟杩斿洖銆�
+        /// </remarks>
+        /// <param name="ipAddress">璁惧 IP 鍦板潃</param>
+        /// <param name="robotCrane">鏈哄櫒浜鸿澶囦俊鎭紝鐢ㄤ簬鍒濆鍖栨柊鐘舵��</param>
+        /// <returns>璇ヨ澶囩殑鐘舵�佸璞�</returns>
         public RobotSocketState GetOrCreateState(string ipAddress, RobotCraneDevice robotCrane)
         {
-            return _cache.GetOrAdd(GetCacheKey(ipAddress), _ => new RobotSocketState
-            {
-                IPAddress = ipAddress,
-                RobotCrane = robotCrane
-            });
+            var entity = _repository.GetOrCreate(ipAddress, robotCrane);
+            return _repository.ToSocketState(entity);
         }
     }
 }

--
Gitblit v1.9.3