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 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; using DevExpress.Mvvm.Native; namespace XdCxRhDW.App.Controllers { /// /// 结果查询相关接口 /// public class ResultController : BaseController { /// /// 根据时间范围查询参估结果 /// /// 查询参数 /// /// [HttpPost] public async Task>> GetCgResByTimeRange(CgResQueryDto dto) { List cgRes = null; try { var start = dto.BeginTime.ToString("yyyy-MM-dd HH:mm:ss"); var end = dto.EndTime.ToString("yyyy-MM-dd HH:mm:ss"); using (MySqlContext db = new MySqlContext()) { string sql = $"select a.*,b.SatTxLon,b.SatTxLat,b.CdbTxLon,b.CdbTxLat,b.CxLon,b.CxLat,b.RefLon,b.RefLat from cgres a left join stationres b on a.StationResID=b.ID and b.SigTime>='{start}' and b.SigTime<='{end}' where a.SigTime>='{start}' and a.SigTime<='{end}' and a.Deleted=0 and a.TaskID={dto.TaskInfoID} "; if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0) sql = $"{sql} and TarFreqUp={dto.TarFrequpHz.Value} "; sql = $"{sql} order by SigTime desc "; cgRes = await db.SqlQueryAsync(sql); } return Success(cgRes); } catch (TaskCanceledException) { string msg = $"参估结果时间范围查询超时.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}"; XdCxRhDW.Framework.LogHelper.Error(msg); return Error>("参估结果时间范围查询超时"); } catch (Exception ex) { string msg = $"参估结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}"; XdCxRhDW.Framework.LogHelper.Error(msg, ex); return Error>("参估结果时间范围查询异常"); } } /// /// 获取指定任务的所有上行频点 /// /// 任务频点查询模型 /// 任务所有频点信息 /// [HttpPost] public async Task>> GetTaskFreqs(TaskFreqQueryDto dto) { List posList = null; try { using (MySqlContext db = new MySqlContext()) { posList = await db.PosRes.Where(p => p.Deleted == 0 && p.TaskInfoID == dto.TaskInfoID).Select(p => p.FreqUpHz).Distinct().ToListAsync(); } var res = posList.Select(p => new TaskFreqResDto() { FreqUpHz = p }).OrderBy(o => o.FreqUpHz).ToList(); return Success(res); } catch (Exception ex) { string msg = $"任务上行频点查询异常-任务编号:{dto.TaskInfoID}"; XdCxRhDW.Framework.LogHelper.Error(msg, ex); return Error>("任务上行频点查询异常"); } } /// /// 获取所有执行中的任务 /// [HttpPost] public async Task>> GetRunningTasks() { try { using (MySqlContext db = new MySqlContext()) { 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 = $"查询执行中的任务异常"; XdCxRhDW.Framework.LogHelper.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 posRes = null; try { DateTime start = dto.BeginTime; DateTime end = dto.EndTime; List targets; using (MySqlContext db = new MySqlContext()) { var startStr = dto.BeginTime.ToString("yyyy-MM-dd HH:mm:ss"); var endStr = dto.EndTime.ToString("yyyy-MM-dd HH:mm:ss"); string sql = $"select a.*,b.UserName,b.PosCheckType,c.Snr1,c.Snr2,c.SnrCdb from posres a left join checkres b on a.CheckResID=b.ID and b.SigTime>='{startStr}' and b.SigTime<='{endStr}' left JOIN cgres c on a.CgResID=c.ID and c.SigTime>='{startStr}' and c.SigTime<='{endStr}' where a.SigTime>='{startStr}' and a.SigTime<='{endStr}' and a.Deleted=0 and a.TaskInfoID={dto.TaskInfoID} "; if (!dto.IncludeInvalidate) sql = $"{sql} and PosLon!=999 "; if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0) sql = $"{sql} and FreqUpHz={dto.TarFrequpHz.Value} "; sql = $"{sql} order by SigTime desc "; posRes = await db.SqlQueryAsync(sql); if (posRes.Any()) { targets = await db.TargetInfos.ToListAsync(); foreach (var itemPos in posRes) { if (itemPos.TargetInfoID > 0) { var find = targets.FirstOrDefault(p => p.ID == itemPos.TargetInfoID); itemPos.TargetName = find?.TargetName; itemPos.ColorKey = find?.TargeColor; } if (itemPos.Snr2 == null && itemPos.SnrCdb != null) { itemPos.Snr2 = itemPos.SnrCdb; } } } } return Success(posRes); } catch (Exception ex) { string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}"; XdCxRhDW.Framework.LogHelper.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; 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 (MySqlContext db = new MySqlContext()) { targets = await db.TargetInfos.ToListAsync(); } foreach (var item in list) { var dayFile = Path.Combine(dir, item); using (MySqlContext db = new MySqlContext()) { if (db == null) continue; var query = db.PosRes.Where(p => p.Deleted == 0 && 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}"; XdCxRhDW.Framework.LogHelper.Error(msg, ex); return Error>("定位结果时间范围查询异常"); } } /// /// 查询最后X小时的的定位结果(此方法内部调用) /// /// 查询参数 /// /// [HttpPost] [Obsolete] public async Task>> GetPosResByLastHoursObsolete(PosRequestByLastRangeDto dto) { List posList = new List(); try { DateTime? max = null; using (MySqlContext db = new MySqlContext()) { string sql = $"select max(SigTime) from PosRes where TaskInfoID={dto.TaskInfoID} and Deleted=0 "; var query = db.PosRes.Where(p => p.TaskInfoID == dto.TaskInfoID && p.Deleted == 0); if (!dto.IncludeInvalidate) { sql = $"{sql} and PosLon!=999 "; } if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0) { sql = $"{sql} and FreqUpHz={dto.TarFrequpHz} "; } max = await db.SqlQueryOneAsync(sql); } if (max == null) return Success(posList); DateTime min = max.Value.AddHours(-dto.Hours); var res = await GetPosResByTimeRangeObsolete(new PosRequestByTimeRangeDto() { TaskInfoID = dto.TaskInfoID, BeginTime = min, EndTime = max.Value, IncludeInvalidate = dto.IncludeInvalidate, TarFrequpHz = dto.TarFrequpHz, }); return res; } catch (Exception ex) { string msg = $"定位结果查询最新数据异常-任务编号:{dto.TaskInfoID},Hours:{dto.Hours}"; XdCxRhDW.Framework.LogHelper.Error(msg, ex); return Error>("定位结果查询最新数据异常"); } } #endregion private PosResDto MapDto(ModelPosRes res) { var item = new PosResDto() { ID = res.ID, FreqUpHz = res.FreqUpHz, SigTime = res.SigTime, TaskInfoID = res.TaskInfoID, TarName = res.TargetName, PosLon = res.PosLon, PosLat = res.PosLat, MirrLon = res.MirrLon, MirrLat = res.MirrLat, CheckType = res.PosCheckType?.GetEnumDisplayName(), TargetState = (EnumTargetStateDto)res.TargetState, PosResType = (EnumPosResTypeDto)res.PosResType, Confidence = res.Confidence, CreateTime = res.CreateTime, UserName = res.UserName, Snr1 = res.Snr1, Snr2 = res.Snr2, }; return item; } } }