From 37acb8358f5602a9013ee29c04a45e33483c2329 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期四, 09 四月 2026 15:21:40 +0800
Subject: [PATCH] fix: 修复PLC字符串解析和任务处理逻辑

---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs |  150 ++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 138 insertions(+), 12 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs
index 2d4332c..b060189 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs
@@ -1,11 +1,5 @@
 锘縰sing SqlSugar;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using WIDESEAWCS_Common;
-using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.BaseServices;
 using WIDESEAWCS_Core.Enums;
@@ -53,6 +47,121 @@
                 cacheKey,
                 _ => BaseDal.QueryData(x => x.InOutType == routeType)
             );
+        }
+
+        /// <summary>
+        /// 娓呴櫎鎵�鏈夎矾鐢辩紦瀛橈紙鍏ュ彛鍜屽嚭鍙g被鍨嬶級
+        /// </summary>
+        public void ClearRouterCache()
+        {
+            _cacheService.Remove("Router:AllRouters:In");
+            _cacheService.Remove("Router:AllRouters:Out");
+        }
+
+        /// <summary>
+        /// 鏍规嵁璁惧缂栧彿鏌ヨ缁忚繃璇ヨ澶囩殑鎵�鏈夎矾鐢憋紙鍚堝苟鍏ュ彛+鍑哄彛绫诲瀷锛�
+        /// </summary>
+        /// <param name="deviceCode">璁惧缂栧彿</param>
+        /// <returns>缁忚繃璇ヨ澶囩殑璺敱鍒楄〃</returns>
+        public List<Dt_Router> QueryRoutersByDeviceCode(string deviceCode)
+        {
+            // 浠庣紦瀛樿幏鍙栧叆鍙g被鍨嬪拰鍑哄彛绫诲瀷鐨勫叏閲忚矾鐢辨暟鎹�
+            List<Dt_Router> inRouters = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
+            List<Dt_Router> outRouters = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
+            // 鍚堝苟鍚庣瓫閫夊嚭缁忚繃鎸囧畾璁惧鐨勮矾鐢憋紙ChildPosiDeviceCode鍖归厤锛�
+            return inRouters.Concat(outRouters)
+                .Where(x => x.ChildPosiDeviceCode == deviceCode)
+                .ToList();
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇涓ょ偣涔嬮棿鏄惁瀛樺湪璺敱锛堝叏绫诲瀷锛�
+        /// </summary>
+        public bool ExistsRouter(string startPosi, string endPosi)
+        {
+            // 浠庣紦瀛樿幏鍙栧叆鍙g被鍨嬪拰鍑哄彛绫诲瀷鐨勫叏閲忚矾鐢辨暟鎹苟鍚堝苟
+            List<Dt_Router> inRouters = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
+            List<Dt_Router> outRouters = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
+            var allRouters = inRouters.Concat(outRouters).ToList();
+            // 鍦ㄥ唴瀛樹腑鏌ユ壘浠庤捣鐐瑰埌缁堢偣鐨勮矾鐢�
+            var routes = FindRoutesInMemory(startPosi, endPosi, allRouters, null);
+            return routes.Count > 0;
+        }
+
+        /// <summary>
+        /// 鍒ゆ柇涓ょ偣涔嬮棿鏄惁瀛樺湪鎸囧畾绫诲瀷鐨勮矾鐢�
+        /// </summary>
+        public bool ExistsRouter(string startPosi, string endPosi, int routeType)
+        {
+            // 浠庣紦瀛樿幏鍙栨寚瀹氱被鍨嬬殑鍏ㄩ噺璺敱鏁版嵁
+            List<Dt_Router> allRouters = GetAllRoutersFromCache(routeType);
+            // 鍦ㄥ唴瀛樹腑鏌ユ壘浠庤捣鐐瑰埌缁堢偣鐨勮矾鐢�
+            var routes = FindRoutesInMemory(startPosi, endPosi, allRouters, routeType);
+            return routes.Count > 0;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍏ㄩ噺璺敱鏁伴噺锛堝叆鍙�+鍑哄彛鍚堣锛�
+        /// </summary>
+        public int GetRouterCount()
+        {
+            // 鍒嗗埆鑾峰彇鍏ュ彛绫诲瀷鍜屽嚭鍙g被鍨嬬殑璺敱鏁伴噺骞剁浉鍔�
+            int inCount = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt()).Count;
+            int outCount = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt()).Count;
+            return inCount + outCount;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎸囧畾绫诲瀷璺敱鏁伴噺
+        /// </summary>
+        public int GetRouterCount(int routeType)
+        {
+            // 鑾峰彇鎸囧畾绫诲瀷鐨勫叏閲忚矾鐢辨暟鎹苟杩斿洖鏁伴噺
+            return GetAllRoutersFromCache(routeType).Count;
+        }
+
+        /// <summary>
+        /// 鎵归噺鍒犻櫎鎸囧畾ID鐨勮矾鐢憋紝鍒犻櫎鍚庡悓姝ユ竻闄ゅ搴旂被鍨嬬殑缂撳瓨
+        /// </summary>
+        /// <param name="routerIds">寰呭垹闄ょ殑璺敱ID鍒楄〃</param>
+        /// <returns>杩斿洖澶勭悊缁撴灉</returns>
+        public WebResponseContent DeleteRouters(List<long> routerIds)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                if (routerIds == null || routerIds.Count == 0)
+                {
+                    return content = WebResponseContent.Instance.Error("寰呭垹闄ょ殑璺敱ID鍒楄〃涓嶈兘涓虹┖");
+                }
+
+                // 鏌ヨ寰呭垹闄よ矾鐢辩殑绫诲瀷锛堢敤浜庡悗缁竻闄ょ紦瀛橈級
+                var routersToDelete = BaseDal.QueryData(x => routerIds.Contains(x.Id));
+                if (routersToDelete.Count == 0)
+                {
+                    return content = WebResponseContent.Instance.Error("鏈壘鍒板緟鍒犻櫎鐨勮矾鐢�");
+                }
+
+                // 璁板綍娑夊強鐨勭被鍨嬶紙鍘婚噸锛�
+                var affectedTypes = routersToDelete.Select(x => x.InOutType).Distinct().ToList();
+
+                // 鎵ц鎵归噺鍒犻櫎
+                BaseDal.DeleteData(routersToDelete);
+
+                // 娓呴櫎鍙楀奖鍝嶇被鍨嬬殑缂撳瓨
+                foreach (var routeType in affectedTypes)
+                {
+                    string cacheKey = $"Router:AllRouters:{(routeType == RouterInOutType.In.ObjToInt() ? "In" : "Out")}";
+                    _cacheService.Remove(cacheKey);
+                }
+
+                content = WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                content = WebResponseContent.Instance.Error(ex.Message);
+            }
+            return content;
         }
 
         /// <summary>
@@ -409,20 +518,21 @@
                     // 杩斿洖鍘婚噸鍚庣殑浣嶇疆鍒楄〃
                     return positions.GroupBy(x => x).Select(x => x.Key).ToList();
                 }
-                catch
+                catch (Exception ex)
                 {
-
+                    ConsoleHelper.WriteErrorLine($"RouterService.QueryAllPositions 鏌ヨ澶辫触: {ex.Message}");
                 }
                 finally
                 {
                     _cacheService.TryAdd($"{RedisPrefix.System}:{RedisName.DevicePositions}:{deviceCode}", positions);
                 }
             }
-            else 
+            else
                 positions = device;
             // 杩斿洖浣嶇疆鍒楄〃
             return positions;
         }
+
         /// <summary>
         /// 鑾峰彇璺敱琛ㄤ腑鎵�鏈夊畬鏁寸殑璺敱淇℃伅(鍓嶇璋冪敤灞曠ず鏁版嵁)銆�
         /// </summary>
@@ -430,8 +540,10 @@
         public List<object> GetAllWholeRouters()
         {
             List<object> data = new List<object>();
-            // 鏌ヨ鎵�鏈夎矾鐢�
-            List<Dt_Router> allRouters = BaseDal.QueryData(x => true);
+            // 浠庣紦瀛樺姞杞藉叆鍙g被鍨嬪拰鍑哄彛绫诲瀷鐨勫叏閲忚矾鐢辨暟鎹苟鍚堝苟
+            List<Dt_Router> inRouters = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
+            List<Dt_Router> outRouters = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
+            List<Dt_Router> allRouters = inRouters.Concat(outRouters).ToList();
             // 鏌ヨ鎵�鏈夌粨鏉熺殑璺敱锛屽苟鎸塈d鎺掑簭
             List<Dt_Router> dt_Routers = allRouters.Where(x => x.IsEnd).OrderBy(x => x.Id).ToList();
 
@@ -602,6 +714,20 @@
 
                 // 娣诲姞鏂扮殑璺敱淇℃伅
                 BaseDal.AddData(routers);
+
+                // 閲嶆柊鏌ヨ鍏ㄩ噺璺敱锛堟鏃舵墠鍖呭惈鏂板鐨勮矾鐢憋級锛屽啀鍐欏叆缂撳瓨
+                List<Dt_Router> updatedRouters = BaseDal.QueryData(x => x.InOutType == routerType);
+                string cacheKey = $"Router:AllRouters:{(routerType == RouterInOutType.In.ObjToInt() ? "In" : "Out")}";
+
+                try
+                {
+                    _cacheService.AddOrUpdate(cacheKey, updatedRouters);
+                }
+                catch
+                {
+                    // 缂撳瓨鏇存柊澶辫触鏃堕潤榛樺拷鐣ワ紝涓嬫鏌ヨ浼氫粠DB鑷姩閲嶅缓缂撳瓨
+                }
+
                 content = WebResponseContent.Instance.OK();
             }
             catch (Exception ex)
@@ -611,4 +737,4 @@
             return content;
         }
     }
-}
+}
\ No newline at end of file

--
Gitblit v1.9.3