using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; using System.Web.Http; using Serilog; using XdCxRhDW.Dto; using XdCxRhDW.Repostory; using System.IO; using XdCxRhDW.Entity; using XdCxRhDW.Api; using XdCxRhDW.WebApi; using DPP_YH_Core.Extensions; using XdCxRhDW.App.Model; using System.Diagnostics; using System.Configuration; namespace XdCxRhDW.App.Controllers { /// /// 结果查询相关接口 /// public class ResultController : BaseController { /// /// 根据时间范围查询参估结果 /// /// 查询参数 /// /// [HttpPost] public async Task>> GetCgResByTimeRange(CgResQueryDto dto) { List cgList = new List(); try { DateTime start = dto.BeginTime; DateTime end = dto.EndTime; var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart"); if (!Directory.Exists(dir)) return Success(cgList); List list = new List(); DateTime tempStart = new DateTime(start.Year, start.Month, start.Day); while (end >= tempStart) { list.Add(end.ToString("yyyy") + "\\" + end.ToString("MMdd") + ".db"); end = end.AddDays(-1); } end = dto.EndTime; foreach (var item in list) { var dayFile = Path.Combine(dir, item); using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile)) { if (db == null) continue; var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == 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}"; Serilog.Log.Error(msg); return Error>("参估结果时间范围查询超时"); } catch (Exception ex) { string msg = $"参估结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}"; Serilog.Log.Error(ex, msg); return Error>("参估结果时间范围查询异常"); } } /// /// 获取指定任务的所有上行频点 /// /// 任务频点查询模型 /// 任务所有频点信息 /// [HttpPost] public async Task>> GetTaskFreqs(TaskFreqQueryDto dto) { var posList = new List(); try { var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart"); if (!Directory.Exists(dir)) return Success(new List()); var yearDirs = Directory.EnumerateDirectories(dir).OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name));//年目录,倒叙排列 DateTime max = DateTime.MinValue; foreach (var yearDir in yearDirs) { if (max != DateTime.MinValue) break; //每一天的db文件,倒序排列 var dayFiles = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, yearDir), "*.db").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name.Substring(0, 4))); foreach (var dayFile in dayFiles) { using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile)) { if (db == null) continue; var listFrequp = await db.PosRes.Where(p => p.TaskInfoID == 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 }).OrderBy(o => o.FreqUpHz).ToList(); return Success(res); } catch (Exception ex) { string msg = $"定位结果查询异常-任务编号:{dto.TaskInfoID}"; Serilog.Log.Error(ex, msg); return Error>("定位结果查询异常"); } } /// /// 获取所有执行中的任务 /// [HttpPost] public async Task>> GetRunningTasks() { try { using (RHDWContext db = new RHDWContext()) { var tasks = await db.TaskInfos.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 = $"查询执行中的任务异常"; Serilog.Log.Error(ex, msg); 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; var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart"); if (!Directory.Exists(dir)) return Success(posList); List list = new List(); DateTime tempStart = new DateTime(start.Year, start.Month, start.Day); while (end >= tempStart) { list.Add(end.ToString("yyyy") + "\\" + end.ToString("MMdd") + ".db"); end = end.AddDays(-1); } end = dto.EndTime; List targets; using (RHDWContext dbBasic = new RHDWContext()) { targets = await dbBasic.TargetInfos.ToListAsync(); } foreach (var item in list) { var dayFile = Path.Combine(dir, item); using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile)) { if (db == null) continue; var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == 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); if (itemPos.TargetInfo != null && !string.IsNullOrWhiteSpace(itemPos.TargetInfo.TargeColor)) itemPos.ColorKey = itemPos.TargetInfo.TargeColor; } } posList.AddRange(posRes); } } return Success(posList); } catch (Exception ex) { string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}"; Serilog.Log.Error(ex, msg); return Error>("定位结果时间范围查询异常"); } } /// /// 根据时间范围查询定位结果(此方法内部调用) /// /// 查询参数 /// /// [HttpPost] [Obsolete] public async Task>> GetPosCgResByTimeRangeObsolete(PosRequestByTimeRangeDto dto) { List posList = new List(); try { DateTime start = dto.BeginTime; DateTime end = dto.EndTime; var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart"); if (!Directory.Exists(dir)) return Success(posList); List list = new List(); DateTime tempStart = new DateTime(start.Year, start.Month, start.Day); while (end >= tempStart) { list.Add(end.ToString("yyyy") + "\\" + end.ToString("MMdd") + ".db"); end = end.AddDays(-1); } end = dto.EndTime; List targets; using (RHDWContext dbBasic = new RHDWContext()) { targets = await dbBasic.TargetInfos.ToListAsync(); } foreach (var item in list) { var dayFile = Path.Combine(dir, item); using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile)) { if (db == null) continue; var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == 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 RePosRes(); 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.TaskInfoID; repos.FreqUpHz = itemPos.FreqUpHz; repos.StationResID = itemPos.StationResID; repos.CxResID = itemPos.CxResID; repos.CgResID = itemPos.CgResID; repos.CheckResID = itemPos.CheckResID; repos.PosResType = itemPos.PosResType; repos.TargetState = itemPos.TargetState; repos.TargetInfo = targets?.FirstOrDefault(p => p.ID == itemPos.TargetInfoID); if (itemPos.TargetInfo != null && !string.IsNullOrWhiteSpace(itemPos.TargetInfo.TargeColor)) { repos.ColorKey = itemPos.TargetInfo.TargeColor; } repos.BaseTargetName = itemPos.TargetInfo?.TargetName; repos.CheckRes = await db.CheckRes.FirstOrDefaultAsync(p => p.ID == itemPos.CheckResID); repos.BaseCheckType = itemPos.CheckRes?.PosCheckType?.GetEnumDisplayName(); repos.CgRes = await db.CgRes.FirstOrDefaultAsync(p => p.ID == itemPos.CgResID); repos.CxRes = await db.CxRes.FirstOrDefaultAsync(p => p.ID == itemPos.CxResID); repos.StationRes = await db.StationRes.FirstOrDefaultAsync(p => p.ID == itemPos.StationResID); posList.Add(repos); } } } return Success(posList); } catch (Exception ex) { string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}"; Serilog.Log.Error(ex, msg); return Error>("定位结果时间范围查询异常"); } } /// /// 查询最后X小时的的定位结果(此方法内部调用) /// /// 查询参数 /// /// [HttpPost] [Obsolete] public async Task>> GetPosResByLastHoursObsolete(PosRequestByLastRangeDto dto) { List posList = new List(); try { var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart"); if (!Directory.Exists(dir)) return Success(posList); var yearDirs = Directory.EnumerateDirectories(dir).OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name));//年目录,倒叙排列 DateTime max = DateTime.MinValue; foreach (var yearDir in yearDirs) { if (max != DateTime.MinValue) break; //每一天的db文件,倒序排列 var dayFiles = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, yearDir), "*.db").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name.Substring(0, 4))); foreach (var dayFile in dayFiles) { using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile)) { if (db == null) continue; var query = db.PosRes.Where(p => p.TaskInfoID == 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) { break; } } } 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}"; Serilog.Log.Error(ex, msg); return Error>("定位结果查询最新数据异常"); } } #endregion private PosResDto MapDto(PosRes res) { return new PosResDto() { ID = res.ID, FreqUpHz = res.FreqUpHz, SigTime = res.SigTime, TaskInfoID = res.TaskInfoID, 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.TarFreqUp == null ? 0 : (long)(cgRes.TarFreqUp.Value), 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, MainVx = cgRes.MainVx, MainVy = cgRes.MainVy, MainVz = cgRes.MainVz, Adja1X = cgRes.Adja1X, Adja1Y = cgRes.Adja1Y, Adja1Z = cgRes.Adja1Z, Adja1Vx = cgRes.Adja1Vx, Adja1Vy = cgRes.Adja1Vy, Adja1Vz = cgRes.Adja1Vz, 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; } } }