using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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
{
///
/// 路由配置业务层
///
public class RouterService : ServiceBase, IRouterService
{
private readonly IDeviceProtocolRepository _deviceProtocolRepository;
private readonly IDeviceInfoRepository _deviceInfoRepository;
///
/// 路由配置业务层
///
///
///
///
public RouterService(IRouterRepository BaseDal, IDeviceProtocolRepository deviceProtocolRepository, IDeviceInfoRepository deviceInfoRepository) : base(BaseDal)
{
_deviceProtocolRepository = deviceProtocolRepository;
_deviceInfoRepository = deviceInfoRepository;
}
///
/// 根据起点/当前位置、终点获取下一个子节点。
///
/// 起点/当前位置。
/// 终点。
/// 返回路由实体集合。
public List QueryNextRoutes(string startPosi, string endPosi)
{
//todo 方法需优化
List routers = new List();
try
{
//查询下一个路由信息
List dt_Routers = BaseDal.QueryData(x => (x.NextPosi == endPosi || x.ChildPosi == endPosi), new Dictionary { { 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 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;
}
///
/// 根据起点/当前位置、终点获取下一个子节点。
///
/// 起点/当前位置。
/// 终点。
/// 路由类型。
/// 返回路由实体集合。
public List QueryNextRoutes(string startPosi, string endPosi, int routeType)
{
//todo 方法需优化
List routers = new List();
try
{
//查询下一个路由信息
List dt_Routers = BaseDal.QueryData(x => (x.NextPosi == endPosi || x.ChildPosi == endPosi) && x.InOutType == routeType, new Dictionary { { 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 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;
}
///
/// 根据设备编号获取对应的路由点位编号(输送线站台编号)信息
///
/// 设备编号
/// 返回路由点位编号(输送线站台编号)集合
// 根据设备编码查询所有位置
public List QueryAllPositions(string deviceCode)
{
// 创建一个字符串列表,用于存储所有位置
List positions = new List();
try
{
// 查询所有进入路由器的位置
List inRouterPositions = BaseDal.QueryData(x => x.ChildPosiDeviceCode == deviceCode && x.InOutType == RouterInOutType.In.ObjToInt()).GroupBy(x => x.StartPosi).Select(x => x.Key).ToList();
// 查询所有离开路由器的位置
List 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();
}
catch
{
}
// 返回位置列表
return positions;
}
///
/// 获取路由表中所有完整的路由信息(前端调用展示数据)。
///
/// 匿名对象集合。
public List