From c1aabd3aaa92b072591fc368d81ab2cc37a0aa14 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期五, 27 三月 2026 17:33:25 +0800
Subject: [PATCH] 路由变更

---
 Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-service-audit.md |  324 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 324 insertions(+), 0 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-service-audit.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-service-audit.md
new file mode 100644
index 0000000..bf28dd8
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-service-audit.md
@@ -0,0 +1,324 @@
+# RouterService 閫昏緫淇涓庢柊鏂规硶瀹炵幇璁″垝
+
+> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
+
+**Goal:** 淇 RouterService 涓殑 3 涓�昏緫闂锛屾柊澧� 7 涓矾鐢辨煡璇�/绠$悊鏂规硶锛屽苟鏇存柊鎺ュ彛灞傘��
+
+**Architecture:** 鍦ㄧ幇鏈� RouterService 鍩虹涓婃柊澧炵紦瀛樼鐞嗘柟娉曞拰璺敱鏌ヨ澧炲己鏂规硶锛屼繚鎸佺幇鏈� HybridCacheService 缂撳瓨鏋舵瀯涓嶅彉銆�
+
+**Tech Stack:** ASP.NET Core 6.0, HybridCacheService, SqlSugar ORM
+
+---
+
+## 鏂囦欢鍙樻洿姒傝
+
+**淇敼鏂囦欢锛�**
+- `WIDESEAWCS_QuartzJob/Service/RouterService.cs` 鈥� 閫昏緫淇 + 鏂板鏂规硶瀹炵幇
+- `WIDESEAWCS_QuartzJob/Service/IRouterService.cs` 鈥� 鎺ュ彛鏂板鏂规硶绛惧悕 + 鍘绘帀澶氫綑 `public` 淇グ绗�
+
+---
+
+## Task 1: 淇 AddRouters 缂撳瓨涓�鑷存�ч棶棰�
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:605-613`
+
+**鍘熶唬鐮侊細**
+```csharp
+BaseDal.AddData(routers);
+
+List<Dt_Router> updatedRouters = BaseDal.QueryData(x => x.InOutType == routerType);
+string cacheKey = $"Router:AllRouters:{(routerType == RouterInOutType.In.ObjToInt() ? "In" : "Out")}";
+_cacheService.AddOrUpdate(cacheKey, updatedRouters);
+
+content = WebResponseContent.Instance.OK();
+```
+
+**鏀逛负锛�**
+```csharp
+// 娣诲姞鏂扮殑璺敱淇℃伅
+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();
+```
+
+**璇存槑**锛氱敤 try-catch 鍖呰9缂撳瓨鏇存柊鎿嶄綔锛岄槻姝㈢紦瀛樺啓鍏ュけ璐ユ椂寮傚父閫冮�稿埌澶栧眰琚綋浣滈敊璇繑鍥炪�侱B 宸插啓鍏ユ垚鍔燂紝缂撳瓨澶辫触涓嶅奖鍝嶄笟鍔℃纭�с��
+
+---
+
+## Task 2: 淇 QueryAllPositions 绌� catch 鍧�
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:412-415`
+
+**鍘熶唬鐮侊細**
+```csharp
+catch
+{
+
+}
+```
+
+**鏀逛负锛�**
+```csharp
+catch (Exception ex)
+{
+    ConsoleHelper.WriteErrorLine($"RouterService.QueryAllPositions 鏌ヨ澶辫触: {ex.Message}");
+}
+```
+
+**璇存槑**锛氬鍔犻敊璇棩蹇楄褰曪紝渚夸簬鎺掓煡闂銆傝繑鍥炲�间粛涓虹┖鍒楄〃锛岃皟鐢ㄦ柟琛屼负涓嶅彉銆�
+
+---
+
+## Task 3: 淇 IRouterService 鎺ュ彛 public 淇グ绗� + 鏂板鏂规硶绛惧悕
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/IRouterService.cs`
+
+鍘绘帀浠ヤ笅琛岀殑 `public` 淇グ绗︼細
+- 绗�40琛岋細`public Dt_Router QueryNextRoute(string startPosi);` 鈫� `Dt_Router QueryNextRoute(string startPosi);`
+- 绗�48琛�
+- 绗�57琛�
+- 绗�65琛�
+- 绗�74琛�
+
+鍚屾椂鍦ㄦ帴鍙f湯灏炬柊澧炰互涓嬫柟娉曠鍚嶏細
+
+```csharp
+/// <summary>
+/// 娓呴櫎璺敱缂撳瓨
+/// </summary>
+void ClearRouterCache();
+
+/// <summary>
+/// 鏍规嵁璁惧缂栧彿鏌ヨ缁忚繃璇ヨ澶囩殑鎵�鏈夎矾鐢�
+/// </summary>
+List<Dt_Router> QueryRoutersByDeviceCode(string deviceCode);
+
+/// <summary>
+/// 鍒ゆ柇涓ょ偣涔嬮棿鏄惁瀛樺湪璺敱锛堝叏绫诲瀷锛�
+/// </summary>
+bool ExistsRouter(string startPosi, string endPosi);
+
+/// <summary>
+/// 鍒ゆ柇涓ょ偣涔嬮棿鏄惁瀛樺湪鎸囧畾绫诲瀷鐨勮矾鐢�
+/// </summary>
+bool ExistsRouter(string startPosi, string endPosi, int routeType);
+
+/// <summary>
+/// 鑾峰彇鍏ㄩ噺璺敱鏁伴噺锛堝悎骞跺叆鍙�+鍑哄彛锛�
+/// </summary>
+int GetRouterCount();
+
+/// <summary>
+/// 鑾峰彇鎸囧畾绫诲瀷璺敱鏁伴噺
+/// </summary>
+int GetRouterCount(int routeType);
+
+/// <summary>
+/// 鎵归噺鍒犻櫎璺敱
+/// </summary>
+WebResponseContent DeleteRouters(List<long> routerIds);
+```
+
+---
+
+## Task 4: 瀹炵幇 ClearRouterCache()
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
+
+鍦� `GetAllRoutersFromCache` 鏂规硶涔嬪悗鏂板锛�
+
+```csharp
+/// <summary>
+/// 娓呴櫎鎵�鏈夎矾鐢辩紦瀛橈紙鍏ュ彛鍜屽嚭鍙g被鍨嬶級
+/// </summary>
+public void ClearRouterCache()
+{
+    _cacheService.Remove("Router:AllRouters:In");
+    _cacheService.Remove("Router:AllRouters:Out");
+}
+```
+
+---
+
+## Task 5: 瀹炵幇 QueryRoutersByDeviceCode
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
+
+鍦� `ClearRouterCache` 涔嬪悗鏂板锛�
+
+```csharp
+/// <summary>
+/// 鏍规嵁璁惧缂栧彿鏌ヨ缁忚繃璇ヨ澶囩殑鎵�鏈夎矾鐢憋紙鍚堝苟鍏ュ彛+鍑哄彛绫诲瀷锛�
+/// </summary>
+/// <param name="deviceCode">璁惧缂栧彿</param>
+/// <returns>缁忚繃璇ヨ澶囩殑璺敱鍒楄〃</returns>
+public List<Dt_Router> QueryRoutersByDeviceCode(string deviceCode)
+{
+    List<Dt_Router> inRouters = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
+    List<Dt_Router> outRouters = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
+    return inRouters.Concat(outRouters)
+        .Where(x => x.ChildPosiDeviceCode == deviceCode)
+        .ToList();
+}
+```
+
+---
+
+## Task 6: 瀹炵幇 ExistsRouter锛堜袱涓噸杞斤級
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
+
+鍦� `QueryRoutersByDeviceCode` 涔嬪悗鏂板锛�
+
+```csharp
+/// <summary>
+/// 鍒ゆ柇涓ょ偣涔嬮棿鏄惁瀛樺湪璺敱锛堝叏绫诲瀷锛�
+/// </summary>
+public bool ExistsRouter(string startPosi, string endPosi)
+{
+    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;
+}
+```
+
+---
+
+## Task 7: 瀹炵幇 GetRouterCount锛堜袱涓噸杞斤級
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
+
+鍦� `ExistsRouter` 涔嬪悗鏂板锛�
+
+```csharp
+/// <summary>
+/// 鑾峰彇鍏ㄩ噺璺敱鏁伴噺锛堝叆鍙�+鍑哄彛鍚堣锛�
+/// </summary>
+public int GetRouterCount()
+{
+    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;
+}
+```
+
+---
+
+## Task 8: 瀹炵幇 DeleteRouters
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
+
+鍦� `AddRouters` 鏂规硶涔嬪悗鏂板锛�
+
+```csharp
+/// <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;
+}
+```
+
+---
+
+## Task 9: 缂栬瘧楠岃瘉
+
+**楠岃瘉鍛戒护锛�**
+```bash
+dotnet build WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj
+```
+
+棰勬湡锛�0 errors
+
+---
+
+## 瀹炴柦椤哄簭
+
+1. Task 1 鈥� 淇 AddRouters 缂撳瓨涓�鑷存��
+2. Task 2 鈥� 淇 QueryAllPositions 绌� catch 鍧�
+3. Task 3 鈥� 淇 IRouterService 鎺ュ彛锛堝幓鎺� public + 鏂板绛惧悕锛�
+4. Task 4 鈥� 瀹炵幇 ClearRouterCache
+5. Task 5 鈥� 瀹炵幇 QueryRoutersByDeviceCode
+6. Task 6 鈥� 瀹炵幇 ExistsRouter 涓や釜閲嶈浇
+7. Task 7 鈥� 瀹炵幇 GetRouterCount 涓や釜閲嶈浇
+8. Task 8 鈥� 瀹炵幇 DeleteRouters
+9. Task 9 鈥� 缂栬瘧楠岃瘉
+

--
Gitblit v1.9.3