| | |
| | | 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; |
| | |
| | | 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 |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 从缓存获取指定类型的全量路由数据,缓存不存在时自动从数据库加载并写入缓存 |
| | | /// </summary> |
| | | /// <param name="routeType">路由类型(入口/出口)</param> |
| | | /// <returns>该类型的全部路由列表</returns> |
| | | private List<Dt_Router> GetAllRoutersFromCache(int routeType) |
| | | { |
| | | // 根据路由类型构建缓存Key,In类型对应"In",Out类型对应"Out" |
| | | string cacheKey = $"Router:AllRouters:{(routeType == RouterInOutType.In.ObjToInt() ? "In" : "Out")}"; |
| | | // 通过缓存服务获取数据,缓存未命中时调用工厂方法从数据库查询并写入缓存 |
| | | return _cacheService.GetOrAdd( |
| | | cacheKey, |
| | | _ => BaseDal.QueryData(x => x.InOutType == routeType) |
| | | ); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 根据起点/当前位置、终点获取下一个子节点。 |
| | | /// </summary> |
| | | /// <param name="startPosi">起点/当前位置。</param> |
| | |
| | | List<Dt_Router> routers = new List<Dt_Router>(); |
| | | try |
| | | { |
| | | // 一次性查询所有路由数据到内存 |
| | | List<Dt_Router> allRouters = BaseDal.QueryData(x => true); |
| | | // 从缓存加载入口类型的所有路由数据 |
| | | List<Dt_Router> allRouters = GetAllRoutersFromCache(RouterInOutType.In.ObjToInt()); |
| | | // 从缓存加载出口类型的所有路由数据 |
| | | List<Dt_Router> outRouters = GetAllRoutersFromCache(RouterInOutType.Out.ObjToInt()); |
| | | // 合并入口和出口路由数据 |
| | | allRouters.AddRange(outRouters); |
| | | |
| | | // 在内存中进行路径搜索 |
| | | routers = FindRoutesInMemory(startPosi, endPosi, allRouters, null); |
| | |
| | | List<Dt_Router> routers = new List<Dt_Router>(); |
| | | try |
| | | { |
| | | // 一次性查询指定类型的所有路由数据到内存 |
| | | List<Dt_Router> allRouters = BaseDal.QueryData(x => x.InOutType == routeType); |
| | | // 从缓存加载指定类型的所有路由数据 |
| | | List<Dt_Router> allRouters = GetAllRoutersFromCache(routeType); |
| | | |
| | | // 在内存中进行路径搜索 |
| | | routers = FindRoutesInMemory(startPosi, endPosi, allRouters, routeType); |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 根据起点、终点方向和路由类型获取下一个单个子节点路由(智能选择朝向终点的路由) |
| | | /// </summary> |
| | | /// <param name="startPosi">起点/当前位置</param> |
| | | /// <param name="endPosi">终点位置(用于方向判断)</param> |
| | | /// <returns>返回下一个路由节点,优先返回朝向终点的路由,如果没有则返回null</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> |