using DW5S.DTO;
using DW5S.Entity;
using DW5S.Repostory;
using DW5S.WebApi;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Serilog;
using System.Linq;
namespace DW5S.Controllers
{
///
/// 结果查询相关接口
///
public class ResultController : BaseController
{
ILogger logger { get; set; }
IUnitOfWork unitOfWork { get; set; }
///
/// 根据时间范围查询参估结果
///
/// 查询参数
///
///
[HttpPost]
public async Task>> GetCgResByTimeRange(CgResQueryDto dto)
{
List cgList = new List();
try
{
DateTime start = dto.BeginTime;
DateTime end = dto.EndTime;
var repsPosRes = unitOfWork.OfLong();
var query = repsPosRes.AsQueryable().Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskID == dto.TaskInfoID);
if (!dto.IncludeInvalidate)
query = query.Where(p => p.PosLon != 999);
if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
query = query.Where(p => p.FrequpHz == dto.TarFrequpHz.Value);
var cgRes = await query.Include(p => p.CgRes).Select(t => t.CgRes).Include(t => t.StationRes).OrderByDescending(p => p.SigTime).ToListAsync();
var listDto = MapCgDto(cgRes);
cgList.AddRange(listDto);
return Success(cgList);
}
catch (TaskCanceledException)
{
string msg = $"参估结果时间范围查询超时.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
logger.Error(msg);
return Error>("参估结果时间范围查询超时");
}
catch (Exception ex)
{
string msg = $"参估结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
logger.Error(msg, ex);
return Error>("参估结果时间范围查询异常");
}
}
///
/// 获取指定任务的所有上行频点
///
/// 任务频点查询模型
/// 任务所有频点信息
///
[HttpPost]
public async Task>> GetTaskFreqs(TaskFreqQueryDto dto)
{
var posList = new List();
try
{
var repsPosRes = unitOfWork.OfLong();
var listFrequp = await repsPosRes.AsQueryable().Where(p => p.TaskID == dto.TaskInfoID).Select(p => p.FrequpHz).Distinct().ToListAsync();
foreach (var item in listFrequp)
{
if (!posList.Contains(item))
posList.Add(item);
}
var res = posList.Select(p => new TaskFreqResDto() { FreqUpHz = p }).ToList();
var res2 = (await unitOfWork.Of().FindAsync(p => p.TaskInfoID == dto.TaskInfoID))
.Select(p => new TaskFreqResDto() { FreqUpHz = p.FreqUpHz });
res.AddRange(res2);
res= res.DistinctBy(p=>p.FreqUpHz).OrderBy(p => p.FreqUpHz).ToList();
return Success(res);
}
catch (Exception ex)
{
string msg = $"定位结果查询异常-任务编号:{dto.TaskInfoID}";
logger.Error(msg, ex);
return Error>("定位结果查询异常");
}
}
///
/// 获取所有执行中的任务
///
[HttpPost]
public async Task>> GetRunningTasks()
{
try
{
var repsTask = unitOfWork.Of();
var tasks = await repsTask.AsQueryable().Where(p => p.TaskState == EnumTaskState.Running).ToListAsync();
var res = tasks.Select(t => new TaskQueryResDto()
{
TaskID = t.Id,
PosType = (EnumPosTypeDto)(int)t.PosType,
TaskType = (EnumTaskTypeDto)(int)t.TaskType,
});
return Success(res.ToList());
}
catch (Exception ex)
{
string msg = $"查询执行中的任务异常";
logger.Error(msg, ex);
return Error>("查询执行中的任务异常");
}
}
#region 定位结果查询接口
///
/// 根据时间范围查询定位结果
///
/// 查询参数
///
///
[HttpPost]
public async Task>> GetPosResByTimeRange(PosRequestByTimeRangeDto dto)
{
var response = (await GetPosResByTimeRangeObsolete(dto));
if (response.code == 200)
{
var listDto = response.data?.Select(p => MapDto(p)).ToList();
return Success(listDto);
}
else
{
return Error>(response.msg);
}
}
///
/// 查询最后X小时的的定位结果
///
/// 查询参数
///
///
[HttpPost]
public async Task>> GetPosResByLastHours(PosRequestByLastRangeDto dto)
{
var response = (await GetPosResByLastHoursObsolete(dto));
if (response.code == 200)
{
var listDto = response.data?.Select(p => MapDto(p)).ToList();
return Success(listDto);
}
else
{
return Error>(response.msg);
}
}
///
/// 根据时间范围查询定位结果(此方法内部调用)
///
/// 查询参数
///
///
[HttpPost]
[Obsolete]
public async Task>> GetPosResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
{
List posList = new List();
try
{
DateTime start = dto.BeginTime;
DateTime end = dto.EndTime;
List targets;
var repsTarget = unitOfWork.Of();
targets = repsTarget.GetAllAsync().Result.ToList();
var repsPosRes = unitOfWork.OfLong();
var query = repsPosRes.AsQueryable().Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskID == dto.TaskInfoID);
if (!dto.IncludeInvalidate)
query = query.Where(p => p.PosLon != 999);
if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
query = query.Where(p => p.FrequpHz == dto.TarFrequpHz.Value);
var posRes = await query.Include(p => p.CheckRes).OrderByDescending(p => p.SigTime).ToListAsync();
foreach (var itemPos in posRes)
{
if (itemPos.TargetInfoID > 0)
{
itemPos.TargetInfo = targets.FirstOrDefault(p => p.Id == itemPos.TargetInfoID);
}
}
posList.AddRange(posRes);
return Success(posList);
}
catch (Exception ex)
{
string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
logger.Error(msg, ex);
return Error>("定位结果时间范围查询异常");
}
}
///
/// 根据时间范围查询定位结果(此方法内部调用)
///
/// 查询参数
///
///
[HttpPost]
[Obsolete]
public async Task>> GetPosCgResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
{
List posList = new List();
try
{
DateTime start = dto.BeginTime;
DateTime end = dto.EndTime;
List targets;
var repsTarget = unitOfWork.Of();
targets = repsTarget.GetAllAsync().Result.ToList();
var repsPosRes = unitOfWork.OfLong();
var query = repsPosRes.AsQueryable().Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskID == dto.TaskInfoID);
if (!dto.IncludeInvalidate)
query = query.Where(p => p.PosLon != 999);
if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
query = query.Where(p => p.FrequpHz == dto.TarFrequpHz.Value);
var posRes = await query.OrderByDescending(p => p.SigTime).ToListAsync();
foreach (var itemPos in posRes)
{
var repos = new RePosResDto();
repos.Id = itemPos.Id;
repos.SigTime = itemPos.SigTime;
repos.PosLon = itemPos.PosLon;
repos.PosLat = itemPos.PosLat;
repos.MirrLon = itemPos.MirrLon;
repos.MirrLat = itemPos.MirrLat;
repos.TaskInfoID = itemPos.TaskID;
repos.FreqUpHz = itemPos.FrequpHz;
repos.StationResID = itemPos.StationResID;
repos.CxResID = itemPos.CxResID;
repos.CgResID = itemPos.CgResID;
repos.CheckResID = itemPos.CheckResID;
repos.PosResType = (EnumPosTypeDto)itemPos.PosResType;
//repos.TargetState = itemPos.TargetState;
var target = targets?.FirstOrDefault(p => p.Id == itemPos.TargetInfoID);
if (target != null)
{
repos.TargetInfo = target.To();
}
if (itemPos.TargetInfo != null && !string.IsNullOrWhiteSpace(itemPos.TargetInfo.TargeColor))
{
repos.ColorKey = itemPos.TargetInfo.TargeColor;
}
repos.BaseTargetName = itemPos.TargetInfo?.TargetName;
var repsCheckRes = unitOfWork.OfLong();
var checkRes = await repsCheckRes.FirstOrDefaultAsync(p => p.Id == itemPos.CheckResID);
if (checkRes != null)
{
repos.CheckRes = checkRes.To();
}
repos.BaseCheckType = itemPos.CheckRes?.PosCheckType?.GetEnumDisplayName();
var repsCgRes = unitOfWork.OfLong();
var cgRes = await repsCgRes.FirstOrDefaultAsync(p => p.Id == itemPos.CgResID);
if (cgRes != null)
{
repos.CgRes = cgRes.To();
}
var repsCxRes = unitOfWork.OfLong();
var cxRes = await repsCxRes.FirstOrDefaultAsync(p => p.Id == itemPos.CxResID);
if (cxRes != null)
{
repos.CxRes = cxRes.To();
}
var repsstationRes = unitOfWork.OfLong();
var stationRes = await repsstationRes.FirstOrDefaultAsync(p => p.Id == itemPos.StationResID);
if (stationRes != null)
{
repos.StationRes = cxRes.To();
}
posList.Add(repos);
}
return Success(posList);
}
catch (Exception ex)
{
string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
logger.Error(msg, ex);
return Error>("定位结果时间范围查询异常");
}
}
///
/// 查询最后X小时的的定位结果(此方法内部调用)
///
/// 查询参数
///
///
[HttpPost]
[Obsolete]
public async Task>> GetPosResByLastHoursObsolete(PosRequestByLastRangeDto dto)
{
List posList = new List();
try
{
DateTime max = DateTime.MinValue;
var repsPosRes = unitOfWork.OfLong();
var query = repsPosRes.AsQueryable().Where(p => p.TaskID == dto.TaskInfoID);
if (!dto.IncludeInvalidate)
{
query = query.Where(p => p.PosLon != 999);
}
if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
{
query = query.Where(p => p.FrequpHz == dto.TarFrequpHz);
}
bool any = await query.AnyAsync();
if (any)
max = await query.MaxAsync(p => p.SigTime);
if (max == DateTime.MinValue) return Success(posList);
DateTime min = max.AddHours(-dto.Hours);
var res = await GetPosResByTimeRangeObsolete(new PosRequestByTimeRangeDto()
{
TaskInfoID = dto.TaskInfoID,
BeginTime = min,
EndTime = max,
IncludeInvalidate = dto.IncludeInvalidate,
TarFrequpHz = dto.TarFrequpHz,
});
return res;
}
catch (Exception ex)
{
string msg = $"定位结果查询最新数据异常-任务编号:{dto.TaskInfoID},Hours:{dto.Hours}";
logger.Error(msg, ex);
return Error>("定位结果查询最新数据异常");
}
}
#endregion
private PosResDto MapDto(PosRes res)
{
return new PosResDto()
{
ID = res.Id,
FreqUpHz = res.FrequpHz,
SigTime = res.SigTime,
TaskInfoID = res.TaskID,
TarName = res.TargetInfo?.TargetName,
PosLon = res.PosLon,
PosLat = res.PosLat,
MirrLon = res.MirrLon,
MirrLat = res.MirrLat,
CheckType = res.CheckRes?.PosCheckType == null ? "" : res.CheckRes?.PosCheckType?.GetEnumDisplayName(),
//TargetState = (EnumTargetStateDto)res.TargetState,
PosResType = (EnumPosResTypeDto)res.PosResType,
Confidence = res.Confidence,
CreateTime = res.CreateTime,
};
}
private List MapCgDto(List listCg)
{
List list = new List();
foreach (CgRes cgRes in listCg)
{
var dto = new CgResDto()
{
ID = cgRes.Id,
TaskID = cgRes.TaskID,
FreqUpHz = cgRes.FrequpHz,
SigTime = cgRes.SigTime,
Dto1 = cgRes.Dto1,
Dfo1 = cgRes.Dfo1,
Snr1 = cgRes.Snr1,
Dto2 = cgRes.Dto2,
Dfo2 = cgRes.Dfo2,
//Snr2 = cgRes.Snr2,
//DtoCdb = cgRes.DtoCdb,
//DfoCdb = cgRes.DfoCdb,
//SnrCdb = cgRes.SnrCdb,
//YbMainDto = cgRes.YbMainDto,
//YbMainDfo = cgRes.YbMainDfo,
//YbMainSnr = cgRes.YbMainSnr,
//YbAdja1Dto = cgRes.YbAdja1Dto,
//YbAdja1Dfo = cgRes.YbAdja1Dfo,
//YbAdja1Snr = cgRes.YbAdja1Snr,
//YbAdja2Dfo = cgRes.YbAdja2Dfo,
//YbAdja2Dto = cgRes.YbAdja2Dto,
//YbAdja2Snr = cgRes.YbAdja2Snr,
//TarFreqUp = cgRes.TarFreqUp,
//TarFreqDown = cgRes.TarFreqDown,
//RefFreqUp = cgRes.RefFreqUp,
//RefFreqDown = cgRes.RefFreqDown,
MainCode = cgRes.MainCode,
Adja1Code = cgRes.Adja1Code,
Adja2Code = cgRes.Adja2Code,
MainXlTime = cgRes.MainXlTime,
Adja1XlTime = cgRes.Adja1XlTime,
//Adja2XlTime = cgRes.Adja2XlTime,
MainX = cgRes.MainX,
MainY = cgRes.MainY,
MainZ = cgRes.MainZ,
Adja1X = cgRes.Adja1X,
Adja1Y = cgRes.Adja1Y,
//Adja1Z = cgRes.Adja1Z,
//Adja2X = cgRes.Adja2X,
//Adja2Y = cgRes.Adja2Y,
//Adja2Z = cgRes.Adja2Z,
//Adja2Vx = cgRes.Adja2Vx,
//Adja2Vy = cgRes.Adja2Vy,
//Adja2Vz = cgRes.Adja2Vz,
SatTxLon = cgRes.StationRes.SatTxLon,
SatTxLat = cgRes.StationRes.SatTxLat,
CdbTxLon = cgRes.StationRes.CdbTxLon,
CdbTxLat = cgRes.StationRes.CdbTxLat,
CxLon = cgRes.StationRes.CxLon,
CxLat = cgRes.StationRes.CxLat,
RefLon = cgRes.StationRes.RefLon,
RefLat = cgRes.StationRes.RefLat,
CreateTime = cgRes.CreateTime,
};
list.Add(dto);
}
return list;
}
}
}