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-cache.md | 239 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 239 insertions(+), 0 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-cache.md b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-cache.md
new file mode 100644
index 0000000..8c65dee
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Server/docs/superpowers/plans/2026-03-27-router-cache.md
@@ -0,0 +1,239 @@
+# 璺敱缂撳瓨瀹炵幇璁″垝
+
+> **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 涓紩鍏� HybridCacheService 娣峰悎缂撳瓨锛岀涓�娆℃煡璇㈠姞杞藉叏閲忚矾鐢卞埌缂撳瓨锛屽悗缁煡璇㈢洿鎺ヤ粠缂撳瓨璇诲彇锛孉ddRouters 鍐欏叆鍚庡悓姝ユ洿鏂扮紦瀛樸��
+
+**Architecture:** 鎸� InOutType 鍒嗗紑缂撳瓨涓や唤锛堝叆鍙�/鍑哄彛锛夛紝GetOrAdd 鎳掑姞杞斤紝鍐欑┛鏇存柊缂撳瓨锛屽崟瀹炰緥閮ㄧ讲鏃犲箍鎾渶姹傘��
+
+**Tech Stack:** ASP.NET Core 6.0, HybridCacheService, SqlSugar ORM
+
+---
+
+## 鏂囦欢鍙樻洿姒傝
+
+**淇敼鏂囦欢锛�**
+- `WIDESEAWCS_QuartzJob/Service/RouterService.cs` 鈥� 鍏ㄩ儴缂撳瓨閫昏緫鏀瑰姩
+
+**涓嶅彉锛�**
+- `FindRoutesInMemory` 鈥� 鍙敼璋冪敤鏂癸紝绠楁硶閫昏緫涓嶅彉
+- `QueryAllPositions` 鈥� 宸叉湁鐙珛缂撳瓨锛屼笉渚濊禆鏈柟妗�
+
+---
+
+## Task 1: 鏂板 GetAllRoutersFromCache 绉佹湁鏂规硶
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs`
+
+鍦ㄧ被鎴愬憳鍙橀噺澹版槑鍖轰箣鍚庛�佺幇鏈夋柟娉曚箣鍓嶏紝鏂板浠ヤ笅绉佹湁鏂规硶锛�
+
+```csharp
+/// <summary>
+/// 浠庣紦瀛樿幏鍙栨寚瀹氱被鍨嬬殑鍏ㄩ噺璺敱鏁版嵁锛岀紦瀛樹笉瀛樺湪鏃惰嚜鍔ㄤ粠鏁版嵁搴撳姞杞藉苟鍐欏叆缂撳瓨
+/// </summary>
+/// <param name="routeType">璺敱绫诲瀷锛堝叆鍙�/鍑哄彛锛�</param>
+/// <returns>璇ョ被鍨嬬殑鍏ㄩ儴璺敱鍒楄〃</returns>
+private List<Dt_Router> GetAllRoutersFromCache(int routeType)
+{
+ string cacheKey = $"Router:AllRouters:{(routeType == RouterInOutType.In.ObjToInt() ? "In" : "Out")}";
+ return _cacheService.GetOrAdd(
+ cacheKey,
+ () => BaseDal.QueryData(x => x.InOutType == routeType)
+ );
+}
+
+---
+
+## Task 2: 鏀归�� QueryNextRoutes 閲嶈浇锛�2涓柟娉曪級
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:48-98`
+
+### QueryNextRoutes(string, string) 鈥� 绗�48-69琛�
+
+鍘熶唬鐮侊細
+```csharp
+List<Dt_Router> allRouters = BaseDal.QueryData(x => true);
+routers = FindRoutesInMemory(startPosi, endPosi, allRouters, null);
+```
+
+鏀逛负锛�
+```csharp
+List<Dt_Router> allRouters = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
+// 鍏ュ彛+鍑哄彛閮藉姞杞斤紝FindRoutesInMemory 鍐呴儴鎸� routeType==null 涓嶅仛杩囨护
+List<Dt_Router> outRouters = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
+allRouters.AddRange(outRouters);
+routers = FindRoutesInMemory(startPosi, endPosi, allRouters, null);
+```
+
+### QueryNextRoutes(string, string, int) 鈥� 绗�78-99琛�
+
+鍘熶唬鐮侊細
+```csharp
+List<Dt_Router> allRouters = BaseDal.QueryData(x => x.InOutType == routeType);
+routers = FindRoutesInMemory(startPosi, endPosi, allRouters, routeType);
+```
+
+鏀逛负锛�
+```csharp
+List<Dt_Router> allRouters = GetAllRoutersFromCache(routeType);
+routers = FindRoutesInMemory(startPosi, endPosi, allRouters, routeType);
+```
+
+---
+
+## Task 3: 鏀归�� QueryNextRoute 閲嶈浇锛�4涓柟娉曪級
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:189-314`
+
+### QueryNextRoute(string) 鈥� 绗�189-205琛�
+
+鍘熶唬鐮侊細
+```csharp
+List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi, ...);
+return routes.FirstOrDefault();
+```
+
+鏀逛负锛�
+```csharp
+List<Dt_Router> routes = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt())
+ .Where(x => x.StartPosi == startPosi)
+ .ToList();
+routes = routes.OrderByDescending(x => x.IsEnd).ToList();
+return routes.FirstOrDefault();
+```
+
+### QueryNextRoute(string, int) 鈥� 绗�213-229琛�
+
+鍘熶唬鐮侊細
+```csharp
+List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi && x.InOutType == routeType, ...);
+return routes.FirstOrDefault();
+```
+
+鏀逛负锛�
+```csharp
+List<Dt_Router> routes = GetAllRoutersFromCache(routeType)
+ .Where(x => x.StartPosi == startPosi)
+ .ToList();
+routes = routes.OrderByDescending(x => x.IsEnd).ToList();
+return routes.FirstOrDefault();
+```
+
+### QueryNextRoute(string, string, int) 鈥� 绗�238-272琛�
+
+鍘熶唬鐮侊紙绗�255琛岋級锛�
+```csharp
+List<Dt_Router> allRouters = BaseDal.QueryData(x => x.InOutType == routeType);
+```
+
+鏀逛负锛�
+```csharp
+List<Dt_Router> allRouters = GetAllRoutersFromCache(routeType);
+```
+
+鍏朵綑鐩存帴璺敱鍒ゆ柇鍜� `FindRoutesInMemory` 璋冪敤閫昏緫涓嶅彉銆�
+
+### QueryNextRoute(string, string) 鈥� 绗�280-314琛�
+
+鍘熶唬鐮侊紙绗�285琛岋級锛�
+```csharp
+List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi, ...);
+```
+
+鏀逛负锛堝悎骞跺叆鍙�+鍑哄彛涓や唤缂撳瓨锛屼笌鍘熸柟娉曞叏閲忔煡璇㈣涔変竴鑷达級锛�
+```csharp
+List<Dt_Router> inRoutes = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
+List<Dt_Router> outRoutes = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
+List<Dt_Router> routes = inRoutes.Concat(outRoutes)
+ .Where(x => x.StartPosi == startPosi)
+ .ToList();
+routes = routes.OrderByDescending(x => x.IsEnd).ToList();
+```
+
+鐒跺悗澶嶇敤宸叉湁鐨勭洿鎺ヨ矾鐢卞垽鏂�昏緫銆�
+
+---
+
+## Task 4: 鏀归�� QueryRoutePath
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:323-366`
+
+绗�355琛岄檮杩戯紝鍘熶唬鐮佷腑 `while` 寰幆閲屾瘡娆¤皟鐢� `QueryNextRoute` 鐨勯�昏緫**涓嶉渶瑕佹敼鍔�**锛堝洜涓� `QueryNextRoute` 宸茬粡鍦� Task3 涓敼閫犱簡锛夈�傛湰浠诲姟鐨勬敼鍔ㄤ粎纭 `QueryRoutePath` 鏂规硶鏈韩涓嶅啀鐩存帴璋冪敤 `BaseDal.QueryData`锛屽嵆涓嶉渶瑕佷换浣曟敼鍔� 鈥斺�� 瀹冭皟鐢ㄧ殑鏄� `QueryNextRoute`锛岃�屽悗鑰呭凡琚敼閫犮��
+
+**楠岃瘉锛�** 纭 `QueryRoutePath` 鏂规硶浣撳唴娌℃湁鐩存帴璋冪敤 `BaseDal.QueryData`锛屽彧鏈夊 `QueryNextRoute` 鐨勮皟鐢ㄣ��
+
+---
+
+## Task 5: 鏀归�� GetAllWholeRouters
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:412-446`
+
+鍘熶唬鐮侊細
+```csharp
+List<Dt_Router> allRouters = BaseDal.QueryData(x => true);
+```
+
+鏀逛负锛�
+```csharp
+List<Dt_Router> inRouters = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt());
+List<Dt_Router> outRouters = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt());
+List<Dt_Router> allRouters = inRouters.Concat(outRouters).ToList();
+```
+
+鍚庣画閬嶅巻 `dt_Routers`锛堝彇 `IsEnd == true` 鐨勮矾鐢憋級鐨勯�昏緫涓嶅彉銆�
+
+---
+
+## Task 6: 鏀归�� AddRouters锛屽啓鍏� DB 鍚庢洿鏂扮紦瀛�
+
+**鏂囦欢:**
+- Modify: `WIDESEAWCS_QuartzJob/Service/RouterService.cs:511-594`
+
+鍦ㄧ568琛岄檮杩戯紝鎵惧埌锛�
+```csharp
+// 鏌ヨ鏁版嵁搴撲腑宸叉湁鐨勮矾鐢变俊鎭�
+List<Dt_Router> dt_Routers = BaseDal.QueryData(x => x.InOutType == routerType);
+```
+
+杩欎釜 `dt_Routers` 鏄�**娣诲姞涔嬪墠**鐨勫凡鏈夋暟鎹紝涓嶅寘鍚湰娆℃柊澧炵殑璺敱銆傚湪绗�586琛� `BaseDal.AddData(routers)` **涔嬪悗**銆乣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")}";
+_cacheService.Set(cacheKey, updatedRouters);
+
+content = WebResponseContent.Instance.OK();
+```
+
+---
+
+## Task 7: 缂栬瘧楠岃瘉
+
+**楠岃瘉鍛戒护锛�**
+```bash
+dotnet build WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj
+```
+
+棰勬湡锛氭棤缂栬瘧閿欒锛圕S0103/CS0019 绛夌被鍨�/璇硶閿欒鍏ㄩ儴淇鍚庯級
+
+---
+
+## 瀹炴柦椤哄簭
+
+1. Task 1 鈥� 鏂板 `GetAllRoutersFromCache` 绉佹湁鏂规硶
+2. Task 2 鈥� 鏀归�� `QueryNextRoutes` 涓や釜閲嶈浇
+3. Task 3 鈥� 鏀归�� `QueryNextRoute` 鍥涗釜閲嶈浇
+4. Task 4 鈥� 纭 `QueryRoutePath` 鏃犻渶鏀瑰姩锛堝畠渚濊禆宸叉敼閫犵殑 `QueryNextRoute`锛�
+5. Task 5 鈥� 鏀归�� `GetAllWholeRouters`
+6. Task 6 鈥� 鏀归�� `AddRouters` 鏇存柊缂撳瓨
+7. Task 7 鈥� 缂栬瘧楠岃瘉
+
--
Gitblit v1.9.3