刘磊
2024-12-17 58a5a9af83492c5bbb4fba88b4443f08fa4becfc
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/Service/RouterService.cs
@@ -30,12 +30,74 @@
        /// <param name="startPosi">起点/当前位置。</param>
        /// <param name="endPosi">终点。</param>
        /// <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)
        //        {
        //            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;
        //}
        /// <summary>
        /// 根据起点/当前位置、终点获取下一个子节点。
        /// </summary>
        /// <param name="startPosi">起点/当前位置。</param>
        /// <param name="endPosi">终点。</param>
        /// <returns>返回路由实体集合。</returns>
        public List<Dt_Router> QueryNextRoutes(string startPosi, string endPosi)
        {
            //todo 方法需优化
            // 用于记录已经访问过的起点和终点组合,避免重复访问进入死循环
            HashSet<string> visitedRoutes = new HashSet<string>();
            return QueryNextRoutesInternal(startPosi, endPosi, visitedRoutes);
        }
        private List<Dt_Router> QueryNextRoutesInternal(string startPosi, string endPosi, HashSet<string> visitedRoutes)
        {
            List<Dt_Router> routers = new List<Dt_Router>();
            try
            {
                // 构建一个唯一标识当前起点和终点组合的字符串
                string routeKey = $"{startPosi}_{endPosi}";
                if (visitedRoutes.Contains(routeKey))
                {
                    // 如果已经访问过,直接返回空列表,避免重复进入相同的递归分支
                    return routers;
                }
                visitedRoutes.Add(routeKey);
                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)
                {
@@ -47,7 +109,7 @@
                        }
                        else
                        {
                            List<Dt_Router> tempRouters = QueryNextRoutes(startPosi, item.StartPosi);
                            List<Dt_Router> tempRouters = QueryNextRoutesInternal(startPosi, item.StartPosi, visitedRoutes);
                            foreach (var router in tempRouters)
                            {
                                if (router.StartPosi == startPosi && !routers.Any(x => x.Id == router.Id))
@@ -65,6 +127,7 @@
            }
            catch (Exception ex)
            {
                // 这里可以根据实际需求更好地处理异常,比如记录日志等,目前只是注释掉了直接抛出异常
                //throw new Exception(ex.Message);
                //记录错误信息
            }
@@ -238,5 +301,27 @@
            }
            return content;
        }
        /// <summary>
        /// 根据设备编号获取出库路由点位
        /// </summary>
        /// <param name="deviceCode"></param>
        /// <returns></returns>
        public List<string> QueryOutDeviceCodes(string deviceCode)
        {
            List<string> positions = new List<string>();
            try
            {
                List<string> outRouterPositions = BaseDal.QueryData(x => x.ChildPosiDeviceCode == deviceCode && x.InOutType == RouterInOutType.Out).GroupBy(x => x.ChildPosi).Select(x => x.Key).ToList();
                positions.AddRange(outRouterPositions);
                return positions.GroupBy(x => x).Select(x => x.Key).ToList();
            }
            catch
            {
            }
            return positions;
        }
    }
}