From 94ad631d316da04c46266ddb1fc6e63e6f8f2fae Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期二, 17 三月 2026 17:34:15 +0800
Subject: [PATCH] feat: 同步协议处理、前端交互与业务联调改动
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs | 515 ++++++++++++++++++++++++++++++++++++++++++---------------
1 files changed, 379 insertions(+), 136 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs
index 2feada3..8be09ba 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs
@@ -11,6 +11,8 @@
using WIDESEAWCS_DTO.BasicInfo;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Repository;
+using WIDESEAWCS_Common;
+using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
namespace WIDESEAWCS_QuartzJob.Service
{
@@ -21,6 +23,7 @@
{
private readonly IDeviceProtocolRepository _deviceProtocolRepository;
private readonly IDeviceInfoRepository _deviceInfoRepository;
+ private readonly ICacheService _cacheService;
/// <summary>
/// 璺敱閰嶇疆涓氬姟灞�
@@ -28,10 +31,11 @@
/// <param name="BaseDal"></param>
/// <param name="deviceProtocolRepository"></param>
/// <param name="deviceInfoRepository"></param>
- public RouterService(IRouterRepository BaseDal, IDeviceProtocolRepository deviceProtocolRepository, IDeviceInfoRepository deviceInfoRepository) : base(BaseDal)
+ public RouterService(IRouterRepository BaseDal, IDeviceProtocolRepository deviceProtocolRepository, IDeviceInfoRepository deviceInfoRepository, ICacheService cacheService) : base(BaseDal)
{
_deviceProtocolRepository = deviceProtocolRepository;
_deviceInfoRepository = deviceInfoRepository;
+ _cacheService = cacheService;
}
/// <summary>
@@ -42,46 +46,23 @@
/// <returns>杩斿洖璺敱瀹炰綋闆嗗悎銆�</returns>
public List<Dt_Router> QueryNextRoutes(string startPosi, string endPosi)
{
- //todo 鏂规硶闇�浼樺寲
List<Dt_Router> routers = new List<Dt_Router>();
try
{
- //鏌ヨ涓嬩竴涓矾鐢变俊鎭�
- List<Dt_Router> dt_Routers = BaseDal.QueryData(x => (x.NextPosi == endPosi || x.ChildPosi == endPosi), new Dictionary<string, OrderByType> { { nameof(Dt_Router.IsEnd), OrderByType.Desc } });
- if (dt_Routers.Count > 0)
+ // 涓�娆℃�ф煡璇㈡墍鏈夎矾鐢辨暟鎹埌鍐呭瓨
+ List<Dt_Router> allRouters = BaseDal.QueryData(x => true);
+
+ // 鍦ㄥ唴瀛樹腑杩涜璺緞鎼滅储
+ routers = FindRoutesInMemory(startPosi, endPosi, allRouters, null);
+
+ if (routers.Count == 0)
{
- foreach (var item in dt_Routers)
- {
- //濡傛灉涓嬩竴涓矾鐢辩殑璧风偣鍜岀粓鐐归兘鍖归厤锛屽垯娣诲姞鍒拌矾鐢卞垪琛ㄤ腑
- if (item.StartPosi == startPosi && !routers.Any(x => x.Id == item.Id))
- {
- routers.Add(item);
- }
- else
- {
- //鍚﹀垯锛岄�掑綊鏌ヨ涓嬩竴涓矾鐢辩殑璧风偣
- List<Dt_Router> tempRouters = QueryNextRoutes(startPosi, item.StartPosi);
- foreach (var router in tempRouters)
- {
- //濡傛灉涓嬩竴涓矾鐢辩殑璧风偣鍜岀粓鐐归兘鍖归厤锛屽垯娣诲姞鍒拌矾鐢卞垪琛ㄤ腑
- if (router.StartPosi == startPosi && !routers.Any(x => x.Id == router.Id))
- {
- routers.Add(router);
- }
- }
- }
- }
- }
- else
- {
- //濡傛灉鏌ヨ涓嶅埌涓嬩竴涓矾鐢变俊鎭紝鍒欐姏鍑哄紓甯�
throw new Exception($"璇ヨ矾寰勬湭閰嶇疆鎴栭厤缃敊璇�,璇锋鏌ヨ澶囪矾鐢变俊鎭�,璧风偣:銆恵startPosi}銆�,缁堢偣:銆恵endPosi}銆�");
}
}
catch (Exception ex)
{
- //throw new Exception(ex.Message);
- //璁板綍閿欒淇℃伅
+ // 璁板綍閿欒淇℃伅
}
return routers;
}
@@ -95,48 +76,292 @@
/// <returns>杩斿洖璺敱瀹炰綋闆嗗悎銆�</returns>
public List<Dt_Router> QueryNextRoutes(string startPosi, string endPosi, int routeType)
{
- //todo 鏂规硶闇�浼樺寲
List<Dt_Router> routers = new List<Dt_Router>();
try
{
- //鏌ヨ涓嬩竴涓矾鐢变俊鎭�
- List<Dt_Router> dt_Routers = BaseDal.QueryData(x => (x.NextPosi == endPosi || x.ChildPosi == endPosi) && x.InOutType == routeType, new Dictionary<string, OrderByType> { { nameof(Dt_Router.IsEnd), OrderByType.Desc } });
- if (dt_Routers.Count > 0)
+ // 涓�娆℃�ф煡璇㈡寚瀹氱被鍨嬬殑鎵�鏈夎矾鐢辨暟鎹埌鍐呭瓨
+ List<Dt_Router> allRouters = BaseDal.QueryData(x => x.InOutType == routeType);
+
+ // 鍦ㄥ唴瀛樹腑杩涜璺緞鎼滅储
+ routers = FindRoutesInMemory(startPosi, endPosi, allRouters, routeType);
+
+ if (routers.Count == 0)
{
- foreach (var item in dt_Routers)
- {
- //濡傛灉涓嬩竴涓矾鐢辩殑璧风偣鍜岀粓鐐归兘鍖归厤锛屽垯娣诲姞鍒拌矾鐢卞垪琛ㄤ腑
- if (item.StartPosi == startPosi && !routers.Any(x => x.Id == item.Id))
- {
- routers.Add(item);
- }
- else
- {
- //鍚﹀垯锛岄�掑綊鏌ヨ涓嬩竴涓矾鐢辩殑璧风偣
- List<Dt_Router> tempRouters = QueryNextRoutes(startPosi, item.StartPosi, routeType);
- foreach (var router in tempRouters)
- {
- //濡傛灉涓嬩竴涓矾鐢辩殑璧风偣鍜岀粓鐐归兘鍖归厤锛屽垯娣诲姞鍒拌矾鐢卞垪琛ㄤ腑
- if (router.StartPosi == startPosi && !routers.Any(x => x.Id == router.Id))
- {
- routers.Add(router);
- }
- }
- }
- }
- }
- else
- {
- //濡傛灉鏌ヨ涓嶅埌涓嬩竴涓矾鐢变俊鎭紝鍒欐姏鍑哄紓甯�
throw new Exception($"璇ヨ矾寰勬湭閰嶇疆鎴栭厤缃敊璇�,璇锋鏌ヨ澶囪矾鐢变俊鎭�,璧风偣:銆恵startPosi}銆�,缁堢偣:銆恵endPosi}銆�");
}
}
catch (Exception ex)
{
- //throw new Exception(ex.Message);
- //璁板綍閿欒淇℃伅
+ // 璁板綍閿欒淇℃伅
}
return routers;
+ }
+
+ /// <summary>
+ /// 鍦ㄥ唴瀛樹腑鏌ユ壘浠庤捣鐐瑰埌缁堢偣鐨勬墍鏈夎矾鐢�
+ /// </summary>
+ /// <param name="startPosi">璧风偣浣嶇疆</param>
+ /// <param name="endPosi">缁堢偣浣嶇疆</param>
+ /// <param name="allRouters">鎵�鏈夎矾鐢辨暟鎹�</param>
+ /// <param name="routeType">璺敱绫诲瀷锛堝彲閫夛級</param>
+ /// <returns>绗﹀悎鏉′欢鐨勮矾鐢卞垪琛�</returns>
+ private List<Dt_Router> FindRoutesInMemory(string startPosi, string endPosi, List<Dt_Router> allRouters, int? routeType)
+ {
+ List<Dt_Router> result = new List<Dt_Router>();
+ HashSet<int> addedIds = new HashSet<int>();
+
+ // 鏋勫缓绱㈠紩锛氫互 NextPosi 鍜� ChildPosi 涓洪敭鐨勫瓧鍏革紝鍔犻�熸煡鎵�
+ var routersByNext = allRouters
+ .GroupBy(r => r.NextPosi)
+ .ToDictionary(g => g.Key, g => g.ToList());
+
+ var routersByChild = allRouters
+ .GroupBy(r => r.ChildPosi)
+ .ToDictionary(g => g.Key, g => g.ToList());
+
+ // 鎵惧埌鎵�鏈夋寚鍚戠粓鐐圭殑璺敱锛堢粓鐐圭殑鐖惰妭鐐癸級
+ List<Dt_Router> endRouters = new List<Dt_Router>();
+ if (routersByNext.ContainsKey(endPosi))
+ endRouters.AddRange(routersByNext[endPosi]);
+ if (routersByChild.ContainsKey(endPosi))
+ endRouters.AddRange(routersByChild[endPosi].Where(r => !endRouters.Any(e => e.Id == r.Id)));
+
+ // 鎸� IsEnd 闄嶅簭鎺掑簭
+ endRouters = endRouters.OrderByDescending(r => r.IsEnd).ToList();
+
+ // 浣跨敤闃熷垪杩涜骞垮害浼樺厛鎼滅储
+ Queue<(Dt_Router router, List<Dt_Router> path)> queue = new Queue<(Dt_Router, List<Dt_Router>)>();
+
+ // 灏嗘墍鏈夌粓鐐硅矾鐢卞姞鍏ラ槦鍒�
+ foreach (var endRouter in endRouters)
+ {
+ queue.Enqueue((endRouter, new List<Dt_Router> { endRouter }));
+ }
+
+ // 骞垮害浼樺厛鎼滅储
+ while (queue.Count > 0)
+ {
+ var (currentRouter, currentPath) = queue.Dequeue();
+
+ // 濡傛灉褰撳墠璺敱鐨勮捣鐐瑰氨鏄洰鏍囪捣鐐癸紝鎵惧埌瀹屾暣璺緞
+ if (currentRouter.StartPosi == startPosi)
+ {
+ // 灏嗚矾寰勪腑鐨勬墍鏈夎矾鐢辨坊鍔犲埌缁撴灉涓紙鍘婚噸锛�
+ foreach (var router in currentPath)
+ {
+ if (!addedIds.Contains(router.Id))
+ {
+ result.Add(router);
+ addedIds.Add(router.Id);
+ }
+ }
+ continue;
+ }
+
+ // 鏌ユ壘褰撳墠璺敱璧风偣鐨勭埗璺敱
+ List<Dt_Router> parentRouters = new List<Dt_Router>();
+ if (routersByNext.ContainsKey(currentRouter.StartPosi))
+ parentRouters.AddRange(routersByNext[currentRouter.StartPosi]);
+ if (routersByChild.ContainsKey(currentRouter.StartPosi))
+ parentRouters.AddRange(routersByChild[currentRouter.StartPosi].Where(r => !parentRouters.Any(p => p.Id == r.Id)));
+
+ // 灏嗙埗璺敱鍔犲叆闃熷垪
+ foreach (var parentRouter in parentRouters)
+ {
+ // 閬垮厤寰幆寮曠敤
+ if (!currentPath.Any(p => p.Id == parentRouter.Id))
+ {
+ var newPath = new List<Dt_Router>(currentPath) { parentRouter };
+ queue.Enqueue((parentRouter, newPath));
+ }
+ }
+ }
+
+ return result;
+ }
+
+ /// <summary>
+ /// 鏍规嵁璧风偣鑾峰彇涓嬩竴涓崟涓瓙鑺傜偣璺敱
+ /// </summary>
+ /// <param name="startPosi">璧风偣/褰撳墠浣嶇疆</param>
+ /// <returns>杩斿洖涓嬩竴涓矾鐢辫妭鐐癸紝濡傛灉娌℃湁鍒欒繑鍥瀗ull</returns>
+ public Dt_Router QueryNextRoute(string startPosi)
+ {
+ try
+ {
+ // 鏌ヨ浠庤捣鐐瑰嚭鍙戠殑鎵�鏈夎矾鐢�
+ List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi,
+ new Dictionary<string, OrderByType> { { nameof(Dt_Router.IsEnd), OrderByType.Desc } });
+
+ // 杩斿洖绗竴涓矾鐢�
+ return routes.FirstOrDefault();
+ }
+ catch (Exception ex)
+ {
+ // 璁板綍閿欒淇℃伅
+ return null;
+ }
+ }
+
+ /// <summary>
+ /// 鏍规嵁璧风偣鍜岃矾鐢辩被鍨嬭幏鍙栦笅涓�涓崟涓瓙鑺傜偣璺敱
+ /// </summary>
+ /// <param name="startPosi">璧风偣/褰撳墠浣嶇疆</param>
+ /// <param name="routeType">璺敱绫诲瀷</param>
+ /// <returns>杩斿洖涓嬩竴涓矾鐢辫妭鐐癸紝濡傛灉娌℃湁鍒欒繑鍥瀗ull</returns>
+ public Dt_Router QueryNextRoute(string startPosi, int routeType)
+ {
+ try
+ {
+ // 鏌ヨ浠庤捣鐐瑰嚭鍙戠殑鎸囧畾绫诲瀷璺敱
+ List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi && x.InOutType == routeType,
+ new Dictionary<string, OrderByType> { { nameof(Dt_Router.IsEnd), OrderByType.Desc } });
+
+ // 杩斿洖绗竴涓矾鐢�
+ return routes.FirstOrDefault();
+ }
+ catch (Exception ex)
+ {
+ // 璁板綍閿欒淇℃伅
+ return null;
+ }
+ }
+
+ /// <summary>
+ /// 鏍规嵁璧风偣銆佺粓鐐规柟鍚戝拰璺敱绫诲瀷鑾峰彇涓嬩竴涓崟涓瓙鑺傜偣璺敱锛堟櫤鑳介�夋嫨鏈濆悜缁堢偣鐨勮矾鐢憋級
+ /// </summary>
+ /// <param name="startPosi">璧风偣/褰撳墠浣嶇疆</param>
+ /// <param name="endPosi">缁堢偣浣嶇疆锛堢敤浜庢柟鍚戝垽鏂級</param>
+ /// <param name="routeType">璺敱绫诲瀷</param>
+ /// <returns>杩斿洖涓嬩竴涓矾鐢辫妭鐐癸紝浼樺厛杩斿洖鏈濆悜缁堢偣鐨勮矾鐢憋紝濡傛灉娌℃湁鍒欒繑鍥瀗ull</returns>
+ public Dt_Router QueryNextRoute(string startPosi, string endPosi, int routeType)
+ {
+ try
+ {
+ // 鏌ヨ浠庤捣鐐瑰嚭鍙戠殑鎸囧畾绫诲瀷璺敱
+ List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi && x.InOutType == routeType,
+ new Dictionary<string, OrderByType> { { nameof(Dt_Router.IsEnd), OrderByType.Desc } });
+
+ if (routes.Count == 0)
+ return null;
+
+ // 浼樺厛閫夋嫨鐩存帴鎸囧悜缁堢偣鐨勮矾鐢�
+ Dt_Router directRoute = routes.FirstOrDefault(x => x.NextPosi == endPosi || x.ChildPosi == endPosi);
+ if (directRoute != null)
+ return directRoute;
+
+ // 濡傛灉娌℃湁鐩存帴璺敱锛屼娇鐢ㄦ煡鎵剧畻娉曟壘鍒版湞鍚戠粓鐐圭殑璺敱
+ List<Dt_Router> allRouters = BaseDal.QueryData(x => x.InOutType == routeType);
+ foreach (var route in routes)
+ {
+ // 妫�鏌ヤ粠杩欎釜璺敱鐨勪笅涓�涓綅缃槸鍚﹁兘鍒拌揪缁堢偣
+ var pathToEnd = FindRoutesInMemory(route.NextPosi, endPosi, allRouters, routeType);
+ if (pathToEnd.Count > 0)
+ return route;
+ }
+
+ // 濡傛灉閮戒笉鑳藉埌杈剧粓鐐癸紝杩斿洖绗竴涓矾鐢�
+ return routes.FirstOrDefault();
+ }
+ catch (Exception ex)
+ {
+ // 璁板綍閿欒淇℃伅
+ return null;
+ }
+ }
+
+ /// <summary>
+ /// 鏍规嵁璧风偣銆佺粓鐐规柟鍚戝拰璺敱绫诲瀷鑾峰彇涓嬩竴涓崟涓瓙鑺傜偣璺敱锛堟櫤鑳介�夋嫨鏈濆悜缁堢偣鐨勮矾鐢憋級
+ /// </summary>
+ /// <param name="startPosi">璧风偣/褰撳墠浣嶇疆</param>
+ /// <param name="endPosi">缁堢偣浣嶇疆锛堢敤浜庢柟鍚戝垽鏂級</param>
+ /// <returns>杩斿洖涓嬩竴涓矾鐢辫妭鐐癸紝浼樺厛杩斿洖鏈濆悜缁堢偣鐨勮矾鐢憋紝濡傛灉娌℃湁鍒欒繑鍥瀗ull</returns>
+ public Dt_Router QueryNextRoute(string startPosi, string endPosi)
+ {
+ try
+ {
+ // 鏌ヨ浠庤捣鐐瑰嚭鍙戠殑鎸囧畾绫诲瀷璺敱
+ List<Dt_Router> routes = BaseDal.QueryData(x => x.StartPosi == startPosi,
+ new Dictionary<string, OrderByType> { { nameof(Dt_Router.IsEnd), OrderByType.Desc } });
+
+ if (routes.Count == 0)
+ return null;
+
+ // 浼樺厛閫夋嫨鐩存帴鎸囧悜缁堢偣鐨勮矾鐢�
+ Dt_Router directRoute = routes.FirstOrDefault(x => x.NextPosi == endPosi || x.ChildPosi == endPosi);
+ if (directRoute != null)
+ return directRoute;
+
+ //// 濡傛灉娌℃湁鐩存帴璺敱锛屼娇鐢ㄦ煡鎵剧畻娉曟壘鍒版湞鍚戠粓鐐圭殑璺敱
+ //List<Dt_Router> allRouters = BaseDal.QueryData(x => x.InOutType == routeType);
+ //foreach (var route in routes)
+ //{
+ // // 妫�鏌ヤ粠杩欎釜璺敱鐨勪笅涓�涓綅缃槸鍚﹁兘鍒拌揪缁堢偣
+ // var pathToEnd = FindRoutesInMemory(route.NextPosi, endPosi, allRouters, routeType);
+ // if (pathToEnd.Count > 0)
+ // return route;
+ //}
+
+ // 濡傛灉閮戒笉鑳藉埌杈剧粓鐐癸紝杩斿洖绗竴涓矾鐢�
+ return routes.FirstOrDefault();
+ }
+ catch (Exception ex)
+ {
+ // 璁板綍閿欒淇℃伅
+ return null;
+ }
+ }
+
+ /// <summary>
+ /// 鑾峰彇浠庤捣鐐瑰埌缁堢偣鐨勫畬鏁磋矾寰勶紙鎸夐『搴忚繑鍥炴瘡涓瓙鑺傜偣璺敱锛�
+ /// </summary>
+ /// <param name="startPosi">璧风偣浣嶇疆</param>
+ /// <param name="endPosi">缁堢偣浣嶇疆</param>
+ /// <param name="routeType">璺敱绫诲瀷</param>
+ /// <returns>杩斿洖鏈夊簭鐨勮矾鐢卞垪琛紝濡傛灉鎵句笉鍒拌矾寰勫垯杩斿洖绌哄垪琛�</returns>
+ public List<Dt_Router> QueryRoutePath(string startPosi, string endPosi, int routeType)
+ {
+ List<Dt_Router> path = new List<Dt_Router>();
+ string currentPosi = startPosi;
+ HashSet<string> visitedPositions = new HashSet<string>();
+
+ try
+ {
+ while (currentPosi != endPosi)
+ {
+ if (visitedPositions.Contains(currentPosi))
+ {
+ break;
+ }
+ visitedPositions.Add(currentPosi);
+
+ Dt_Router nextRoute = QueryNextRoute(currentPosi, endPosi, routeType);
+
+ if (nextRoute == null)
+ {
+ break;
+ }
+
+ path.Add(nextRoute);
+ currentPosi = nextRoute.NextPosi;
+
+ if (path.Count > 1000)
+ {
+ break;
+ }
+ }
+
+ if (currentPosi != endPosi)
+ {
+ return new List<Dt_Router>();
+ }
+ }
+ catch (Exception ex)
+ {
+ return new List<Dt_Router>();
+ }
+
+ return path;
}
/// <summary>
@@ -144,29 +369,38 @@
/// </summary>
/// <param name="deviceCode">璁惧缂栧彿</param>
/// <returns>杩斿洖璺敱鐐逛綅缂栧彿(杈撻�佺嚎绔欏彴缂栧彿)闆嗗悎</returns>
- // 鏍规嵁璁惧缂栫爜鏌ヨ鎵�鏈変綅缃�
public List<string> QueryAllPositions(string deviceCode)
{
// 鍒涘缓涓�涓瓧绗︿覆鍒楄〃锛岀敤浜庡瓨鍌ㄦ墍鏈変綅缃�
List<string> positions = new List<string>();
- try
+ var device = _cacheService.Get<List<string>>($"{RedisPrefix.System}:{RedisName.DevicePositions}:{deviceCode}");
+ if (device.IsNullOrEmpty())
{
- // 鏌ヨ鎵�鏈夎繘鍏ヨ矾鐢卞櫒鐨勪綅缃�
- List<string> inRouterPositions = BaseDal.QueryData(x => x.ChildPosiDeviceCode == deviceCode && x.InOutType == RouterInOutType.In.ObjToInt()).GroupBy(x => x.StartPosi).Select(x => x.Key).ToList();
+ try
+ {
+ // 鏌ヨ鎵�鏈夎繘鍏ヨ矾鐢卞櫒鐨勪綅缃�
+ List<string> inRouterPositions = BaseDal.QueryData(x => x.ChildPosiDeviceCode == deviceCode && x.InOutType == RouterInOutType.In.ObjToInt()).GroupBy(x => x.StartPosi).Select(x => x.Key).ToList();
- // 鏌ヨ鎵�鏈夌寮�璺敱鍣ㄧ殑浣嶇疆
- List<string> outRouterPositions = BaseDal.QueryData(x => x.ChildPosiDeviceCode == deviceCode && x.InOutType == RouterInOutType.Out.ObjToInt()).GroupBy(x => x.ChildPosi).Select(x => x.Key).ToList();
+ // 鏌ヨ鎵�鏈夌寮�璺敱鍣ㄧ殑浣嶇疆
+ List<string> outRouterPositions = BaseDal.QueryData(x => x.ChildPosiDeviceCode == deviceCode && x.InOutType == RouterInOutType.Out.ObjToInt()).GroupBy(x => x.ChildPosi).Select(x => x.Key).ToList();
- // 灏嗚繘鍏ュ拰绂诲紑璺敱鍣ㄧ殑浣嶇疆娣诲姞鍒板垪琛ㄤ腑
- positions.AddRange(inRouterPositions);
- positions.AddRange(outRouterPositions);
- // 杩斿洖鍘婚噸鍚庣殑浣嶇疆鍒楄〃
- return positions.GroupBy(x => x).Select(x => x.Key).ToList();
+ // 灏嗚繘鍏ュ拰绂诲紑璺敱鍣ㄧ殑浣嶇疆娣诲姞鍒板垪琛ㄤ腑
+ positions.AddRange(inRouterPositions);
+ positions.AddRange(outRouterPositions);
+ // 杩斿洖鍘婚噸鍚庣殑浣嶇疆鍒楄〃
+ return positions.GroupBy(x => x).Select(x => x.Key).ToList();
+ }
+ catch
+ {
+
+ }
+ finally
+ {
+ _cacheService.TryAdd($"{RedisPrefix.System}:{RedisName.DevicePositions}:{deviceCode}", positions);
+ }
}
- catch
- {
-
- }
+ else
+ positions = device;
// 杩斿洖浣嶇疆鍒楄〃
return positions;
}
@@ -185,34 +419,24 @@
// 閬嶅巻鎵�鏈夌粨鏉熺殑璺敱
foreach (var item in dt_Routers)
{
- // 鑾峰彇褰撳墠璺敱鐨勫瓙璺敱
- string routes = $"{item.NextPosi},";
- // 鑾峰彇褰撳墠璺敱鐨勭埗璺敱
- string str = GetPreviousRoutes(item.StartPosi, allRouters, item.InOutType);
- // 濡傛灉鐖惰矾鐢变笉涓虹┖
- if (!string.IsNullOrEmpty(str))
+ // 鑾峰彇鎵�鏈夊彲鑳界殑瀹屾暣璺緞
+ List<List<string>> allPaths = GetAllPaths(item.StartPosi, item.NextPosi, allRouters, item.InOutType);
+
+ // 涓烘瘡鏉$嫭绔嬭矾寰勭敓鎴愮粨鏋�
+ foreach (var path in allPaths)
{
- // 鍘绘帀鏈�鍚庝竴涓�楀彿
- if (str.EndsWith(","))
- str = str.Substring(0, str.Length - 1);
- // 灏嗙埗璺敱娣诲姞鍒板瓙璺敱涓�
- routes += str;
- }
- // 濡傛灉褰撳墠璺敱鏄叆鍙�
- if (item.InOutType == RouterInOutType.In.ObjToInt())
- {
- // 灏嗗瓙璺敱鍙嶈浆骞舵坊鍔犲埌data涓�
- List<string> itemRouters = routes.Split(",").Reverse().ToList();
- object obj = new { type = RouterInOutType.In, routes = itemRouters };
- data.Add(obj);
- }
- // 濡傛灉褰撳墠璺敱鏄嚭鍙�
- else
- {
- // 灏嗗瓙璺敱鍙嶈浆骞舵坊鍔犲埌data涓�
- List<string> itemRouters = routes.Split(",").Reverse().ToList();
- object obj = new { type = RouterInOutType.Out, routes = itemRouters };
- data.Add(obj);
+ // 濡傛灉褰撳墠璺敱鏄叆鍙�
+ if (item.InOutType == RouterInOutType.In.ObjToInt())
+ {
+ object obj = new { type = RouterInOutType.In, routes = path };
+ data.Add(obj);
+ }
+ // 濡傛灉褰撳墠璺敱鏄嚭鍙�
+ else
+ {
+ object obj = new { type = RouterInOutType.Out, routes = path };
+ data.Add(obj);
+ }
}
}
@@ -220,42 +444,61 @@
return data;
}
- private string GetPreviousRoutes(string startPosi, List<Dt_Router> allRouters, int routerType)
+ /// <summary>
+ /// 鑾峰彇浠庤捣鐐瑰埌缁堢偣鐨勬墍鏈夊畬鏁磋矾寰�
+ /// </summary>
+ /// <param name="startPosi">褰撳墠璧峰浣嶇疆</param>
+ /// <param name="endPosi">缁堢偣浣嶇疆</param>
+ /// <param name="allRouters">鎵�鏈夎矾鐢辨暟鎹�</param>
+ /// <param name="routerType">璺敱绫诲瀷</param>
+ /// <returns>鎵�鏈夊畬鏁磋矾寰勫垪琛紝姣忔潯璺緞鏄粠璧风偣鍒扮粓鐐圭殑浣嶇疆鍒楄〃</returns>
+ private List<List<string>> GetAllPaths(string startPosi, string endPosi, List<Dt_Router> allRouters, int routerType)
{
- // 瀹氫箟涓�涓┖瀛楃涓瞨outers
- string routers = string.Empty;
- // 鍒ゆ柇startPosi鏄惁涓虹┖
- if (!string.IsNullOrEmpty(startPosi))
+ List<List<string>> result = new List<List<string>>();
+
+ // 浠庣粓鐐瑰紑濮嬪弽鍚戞煡鎵炬墍鏈夎矾寰�
+ List<List<string>> reversePaths = new List<List<string>>();
+ BuildReversePaths(startPosi, new List<string> { endPosi, startPosi }, allRouters, routerType, reversePaths);
+
+ // 灏嗗弽鍚戣矾寰勮浆涓烘鍚戯紙浠庤捣鐐瑰埌缁堢偣锛�
+ foreach (var reversePath in reversePaths)
{
- // 鍒ゆ柇routers鏄惁浠ラ�楀彿缁撳熬
- if (!routers.EndsWith(","))
- // 濡傛灉涓嶆槸锛屽垯灏唖tartPosi娣诲姞鍒皉outers涓紝骞跺湪鍚庨潰鍔犱笂閫楀彿
- routers += $"{startPosi},";
- else
- // 濡傛灉鏄紝鍒欏皢startPosi娣诲姞鍒皉outers涓�
- routers += $"{startPosi}";
+ result.Add(reversePath.AsEnumerable().Reverse().ToList());
}
- // 浠巃llRouters涓瓫閫夊嚭NextPosi绛変簬startPosi涓擨nOutType绛変簬routerType鐨勫厓绱狅紝骞惰浆鎹负List
- List<Dt_Router> preRouters = allRouters.Where(x => x.NextPosi == startPosi && x.InOutType == routerType).ToList();
- // 閬嶅巻preRouters涓殑姣忎釜鍏冪礌
- foreach (var item in preRouters)
+
+ return result;
+ }
+
+ /// <summary>
+ /// 閫掑綊鏋勫缓鍙嶅悜璺緞锛堜粠缁堢偣鍚戣捣鐐规煡鎵撅級
+ /// </summary>
+ /// <param name="currentStartPosi">褰撳墠鑺傜偣鐨勮捣濮嬩綅缃�</param>
+ /// <param name="currentPath">褰撳墠宸叉瀯寤虹殑璺緞锛堝弽鍚戯紝浠庣粓鐐瑰紑濮嬶級</param>
+ /// <param name="allRouters">鎵�鏈夎矾鐢辨暟鎹�</param>
+ /// <param name="routerType">璺敱绫诲瀷</param>
+ /// <param name="result">鏀堕泦鎵�鏈夊畬鏁磋矾寰�</param>
+ private void BuildReversePaths(string currentStartPosi, List<string> currentPath, List<Dt_Router> allRouters, int routerType, List<List<string>> result)
+ {
+ // 鏌ユ壘褰撳墠鑺傜偣鐨勫墠缃妭鐐癸紙NextPosi绛変簬褰撳墠StartPosi鐨勮矾鐢憋級
+ List<Dt_Router> preRouters = allRouters.Where(x => x.NextPosi == currentStartPosi && x.InOutType == routerType).ToList();
+
+ // 濡傛灉娌℃湁鍓嶇疆鑺傜偣锛岃鏄庡凡缁忓埌杈捐矾寰勮捣鐐癸紝淇濆瓨褰撳墠璺緞
+ if (preRouters.Count == 0)
{
- // 璋冪敤GetPreviousRoutes鏂规硶锛屼紶鍏tem.StartPosi銆乤llRouters鍜宺outerType锛屽苟灏嗚繑鍥炲�艰祴缁檚tr
- string str = GetPreviousRoutes(item.StartPosi, allRouters, routerType);
- // 鍒ゆ柇str鏄惁涓虹┖
- if (!string.IsNullOrEmpty(str))
- {
- // 鍒ゆ柇routers鏄惁浠ラ�楀彿缁撳熬
- if (routers.EndsWith(","))
- // 濡傛灉鏄紝鍒欏皢str娣诲姞鍒皉outers涓�
- routers += $"{str}";
- else
- // 濡傛灉涓嶆槸锛屽垯灏唖tr娣诲姞鍒皉outers涓紝骞跺湪鍚庨潰鍔犱笂閫楀彿
- routers += $"{str},";
- }
+ result.Add(new List<string>(currentPath));
+ return;
}
- // 杩斿洖routers
- return routers;
+
+ // 瀵规瘡涓墠缃妭鐐癸紝鍒涘缓鏂扮殑璺緞鍒嗘敮
+ foreach (var preRouter in preRouters)
+ {
+ // 鍒涘缓鏂扮殑璺緞鍓湰
+ List<string> newPath = new List<string>(currentPath);
+ newPath.Add(preRouter.StartPosi);
+
+ // 閫掑綊鏌ユ壘鍓嶇疆鑺傜偣
+ BuildReversePaths(preRouter.StartPosi, newPath, allRouters, routerType, result);
+ }
}
/// <summary>
--
Gitblit v1.9.3