| | |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.BaseServices; |
| | | using WIDESEAWCS_Core.Enums; |
| | | using WIDESEAWCS_Core.Helper; |
| | | using WIDESEAWCS_DTO.BasicInfo; |
| | | using WIDESEAWCS_QuartzJob.Models; |
| | | using WIDESEAWCS_QuartzJob.Repository; |
| | | |
| | | namespace WIDESEAWCS_QuartzJob.Service |
| | | { |
| | | /// <summary> |
| | | /// 路由配置业务层 |
| | | /// </summary> |
| | | public class RouterService : ServiceBase<Dt_Router, IRouterRepository>, IRouterService |
| | | { |
| | | private readonly IDeviceProtocolRepository _deviceProtocolRepository; |
| | | private readonly IDeviceInfoRepository _deviceInfoRepository; |
| | | |
| | | /// <summary> |
| | | /// 路由配置业务层 |
| | | /// </summary> |
| | | /// <param name="BaseDal"></param> |
| | | /// <param name="deviceProtocolRepository"></param> |
| | | /// <param name="deviceInfoRepository"></param> |
| | | public RouterService(IRouterRepository BaseDal, IDeviceProtocolRepository deviceProtocolRepository, IDeviceInfoRepository deviceInfoRepository) : base(BaseDal) |
| | | { |
| | | _deviceProtocolRepository = deviceProtocolRepository; |
| | |
| | | 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 } }); |
| | | 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) |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 根据起点/当前位置、终点获取下一个子节点。 |
| | | /// </summary> |
| | | /// <param name="startPosi">起点/当前位置。</param> |
| | | /// <param name="endPosi">终点。</param> |
| | | /// <param name="routeType">路由类型。</param> |
| | | /// <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) |
| | | { |
| | | 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="deviceCode">设备编号</param> |
| | |
| | | try |
| | | { |
| | | // 查询所有进入路由器的位置 |
| | | List<string> inRouterPositions = BaseDal.QueryData(x => x.ChildPosiDeviceCode == deviceCode && x.InOutType == RouterInOutType.In).GroupBy(x => x.StartPosi).Select(x => x.Key).ToList(); |
| | | 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).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); |
| | |
| | | routes += str; |
| | | } |
| | | // 如果当前路由是入口 |
| | | if (item.InOutType == RouterInOutType.In) |
| | | if (item.InOutType == RouterInOutType.In.ObjToInt()) |
| | | { |
| | | // 将子路由反转并添加到data中 |
| | | List<string> itemRouters = routes.Split(",").Reverse().ToList(); |
| | |
| | | return data; |
| | | } |
| | | |
| | | private string GetPreviousRoutes(string startPosi, List<Dt_Router> allRouters, RouterInOutType routerType) |
| | | private string GetPreviousRoutes(string startPosi, List<Dt_Router> allRouters, int routerType) |
| | | { |
| | | // 定义一个空字符串routers |
| | | string routers = string.Empty; |
| | |
| | | ChildPosi = routersAddDTOs[i + 1].PositionCode, |
| | | ChildPosiDeviceCode = obj.DeviceCode, |
| | | Depth = 1, |
| | | InOutType = (RouterInOutType)routerType, |
| | | InOutType = routerType, |
| | | NextPosi = routersAddDTOs[i + 1].PositionCode, |
| | | SrmColumn = string.IsNullOrEmpty(routersAddDTOs[i].SCColumn) ? int.TryParse(routersAddDTOs[i + 1].SCColumn, out int col) ? col : null : int.TryParse(routersAddDTOs[i].SCColumn, out int col2) ? col2 : null, |
| | | SrmLayer = string.IsNullOrEmpty(routersAddDTOs[i].SCLayer) ? int.TryParse(routersAddDTOs[i + 1].SCLayer, out int lay) ? lay : null : int.TryParse(routersAddDTOs[i].SCLayer, out int lay2) ? lay2 : null, |
| | |
| | | return content = WebResponseContent.Instance.Error("输入数据起点位置编号与终点位置编号相同"); |
| | | } |
| | | // 查询数据库中已有的路由信息 |
| | | List<Dt_Router> dt_Routers = BaseDal.QueryData(x => x.InOutType == (RouterInOutType)routerType); |
| | | List<Dt_Router> dt_Routers = BaseDal.QueryData(x => x.InOutType == routerType); |
| | | |
| | | // 移除重复的路由信息 |
| | | dt_Routers.ForEach(x => |