wanshenmean
2026-02-26 3de39066b5894850d0f0dc311b60cc09f599a025
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs
@@ -363,34 +363,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 };
                        object obj = new { type = RouterInOutType.In, routes = path };
                    data.Add(obj);
                }
                // 如果当前路由是出口
                else
                {
                    // 将子路由反转并添加到data中
                    List<string> itemRouters = routes.Split(",").Reverse().ToList();
                    object obj = new { type = RouterInOutType.Out, routes = itemRouters };
                        object obj = new { type = RouterInOutType.Out, routes = path };
                    data.Add(obj);
                    }
                }
            }
@@ -398,42 +388,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)
        {
            // 定义一个空字符串routers
            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(","))
                    // 如果不是,则将startPosi添加到routers中,并在后面加上逗号
                    routers += $"{startPosi},";
                else
                    // 如果是,则将startPosi添加到routers中
                    routers += $"{startPosi}";
                result.Add(reversePath.AsEnumerable().Reverse().ToList());
            }
            // 从allRouters中筛选出NextPosi等于startPosi且InOutType等于routerType的元素,并转换为List
            List<Dt_Router> preRouters = allRouters.Where(x => x.NextPosi == startPosi && x.InOutType == routerType).ToList();
            // 遍历preRouters中的每个元素
            foreach (var item in preRouters)
            {
                // 调用GetPreviousRoutes方法,传入item.StartPosi、allRouters和routerType,并将返回值赋给str
                string str = GetPreviousRoutes(item.StartPosi, allRouters, routerType);
                // 判断str是否为空
                if (!string.IsNullOrEmpty(str))
                {
                    // 判断routers是否以逗号结尾
                    if (routers.EndsWith(","))
                        // 如果是,则将str添加到routers中
                        routers += $"{str}";
                    else
                        // 如果不是,则将str添加到routers中,并在后面加上逗号
                        routers += $"{str},";
            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)
            {
                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>