lei zou 1 год назад
Родитель
Сommit
56d97cd1db

+ 0 - 265
XdCxRhDW.App/Controllers/PosController.cs

@@ -2127,271 +2127,6 @@ namespace XdCxRhDW.App.Controllers
         }
         #endregion
 
-        #region 定位结果查询接口
-        /// <summary>
-        /// 根据时间范围查询定位结果
-        /// </summary>
-        /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
-        /// <returns></returns>
-        /// <exception cref="Exception"></exception>
-        [HttpPost]
-        public async Task<AjaxResult<List<PosResDto>>> GetPosResByTimeRange(PosRequestByTimeRangeDto dto)
-        {
-#pragma warning disable CS0612 // 类型或成员已过时
-            var response = (await GetPosResByTimeRangeObsolete(dto));
-#pragma warning restore CS0612 // 类型或成员已过时
-            if (response.code == 200)
-            {
-                var listDto = response.data?.Select(p => MapDto(p)).ToList();
-                return Success(listDto);
-            }
-            else
-            {
-                return Error<List<PosResDto>>(response.msg);
-            }
-        }
-
-        /// <summary>
-        /// 查询最后X小时的的定位结果
-        /// </summary>
-        /// <param name="dto"><see cref="PosRequestByLastRangeDto"/>查询参数</param>
-        /// <returns></returns>
-        /// <exception cref="Exception"></exception>
-        [HttpPost]
-        public async Task<AjaxResult<List<PosResDto>>> GetPosResByLastHours(PosRequestByLastRangeDto dto)
-        {
-#pragma warning disable CS0612 // 类型或成员已过时
-            var response = (await GetPosResByLastHoursObsolete(dto));
-#pragma warning restore CS0612 // 类型或成员已过时
-            if (response.code == 200)
-            {
-                var listDto = response.data?.Select(p => MapDto(p)).ToList();
-                return Success(listDto);
-            }
-            else
-            {
-                return Error<List<PosResDto>>(response.msg);
-            }
-        }
-
-        /// <summary>
-        /// 根据时间范围查询定位结果(此方法内部调用)
-        /// </summary>
-        /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
-        /// <returns></returns>
-        /// <exception cref="Exception"></exception>
-        [HttpPost]
-        [Obsolete]
-        public async Task<AjaxResult<List<PosRes>>> GetPosResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
-        {
-            List<PosRes> posList = new List<PosRes>();
-            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<string> list = new List<string>();
-                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<TargetInfo> 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)
-                            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<List<PosRes>>("定位结果时间范围查询异常");
-            }
-        }
-        /// <summary>
-        /// 根据时间范围查询定位结果(此方法内部调用)
-        /// </summary>
-        /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
-        /// <returns></returns>
-        /// <exception cref="Exception"></exception>
-        [HttpPost]
-        [Obsolete]
-        public async Task<AjaxResult<List<RePosRes>>> GetPosCgResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
-        {
-            List<RePosRes> posList = new List<RePosRes>();
-            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<string> list = new List<string>();
-                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<TargetInfo> 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)
-                            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<List<RePosRes>>("定位结果时间范围查询异常");
-            }
-        }
-        /// <summary>
-        /// 查询最后X小时的的定位结果(此方法内部调用)
-        /// </summary>
-        /// <param name="dto"><see cref="PosRequestByLastRangeDto"/>查询参数</param>
-        /// <returns></returns>
-        /// <exception cref="Exception"></exception>
-        [HttpPost]
-        [Obsolete]
-        public async Task<AjaxResult<List<PosRes>>> GetPosResByLastHoursObsolete(PosRequestByLastRangeDto dto)
-        {
-            List<PosRes> posList = new List<PosRes>();
-            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)
-                            {
-                                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<List<PosRes>>("定位结果查询最新数据异常");
-            }
-        }
-        #endregion
-
         private PosResDto MapDto(PosRes res)
         {
             return new PosResDto()

+ 441 - 0
XdCxRhDW.App/Controllers/ResultController.cs

@@ -0,0 +1,441 @@
+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
+{
+    /// <summary>
+    /// 结果查询相关接口
+    /// </summary>
+    public class ResultController : BaseController
+    {
+
+        /// <summary>
+        /// 根据时间范围查询参估结果
+        /// </summary>
+        /// <param name="dto"><see cref="CgResQueryDto"/>查询参数</param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        [HttpPost]
+        public async Task<AjaxResult<List<CgResDto>>> GetCgResByTimeRange(CgResQueryDto dto)
+        {
+            List<CgResDto> cgList = new List<CgResDto>();
+            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<string> list = new List<string>();
+                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<List<CgResDto>>("参估结果时间范围查询超时");
+            }
+            catch (Exception ex)
+            {
+                string msg = $"参估结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
+                Serilog.Log.Error(ex, msg);
+                return Error<List<CgResDto>>("参估结果时间范围查询异常");
+            }
+        }
+
+
+        #region 定位结果查询接口
+        /// <summary>
+        /// 根据时间范围查询定位结果
+        /// </summary>
+        /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        [HttpPost]
+        public async Task<AjaxResult<List<PosResDto>>> 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<List<PosResDto>>(response.msg);
+            }
+        }
+
+        /// <summary>
+        /// 查询最后X小时的的定位结果
+        /// </summary>
+        /// <param name="dto"><see cref="PosRequestByLastRangeDto"/>查询参数</param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        [HttpPost]
+        public async Task<AjaxResult<List<PosResDto>>> 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<List<PosResDto>>(response.msg);
+            }
+        }
+
+        /// <summary>
+        /// 根据时间范围查询定位结果(此方法内部调用)
+        /// </summary>
+        /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        [HttpPost]
+        [Obsolete]
+        public async Task<AjaxResult<List<PosRes>>> GetPosResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
+        {
+            List<PosRes> posList = new List<PosRes>();
+            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<string> list = new List<string>();
+                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<TargetInfo> 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<List<PosRes>>("定位结果时间范围查询异常");
+            }
+        }
+        /// <summary>
+        /// 根据时间范围查询定位结果(此方法内部调用)
+        /// </summary>
+        /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        [HttpPost]
+        [Obsolete]
+        public async Task<AjaxResult<List<RePosRes>>> GetPosCgResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
+        {
+            List<RePosRes> posList = new List<RePosRes>();
+            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<string> list = new List<string>();
+                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<TargetInfo> 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<List<RePosRes>>("定位结果时间范围查询异常");
+            }
+        }
+        /// <summary>
+        /// 查询最后X小时的的定位结果(此方法内部调用)
+        /// </summary>
+        /// <param name="dto"><see cref="PosRequestByLastRangeDto"/>查询参数</param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        [HttpPost]
+        [Obsolete]
+        public async Task<AjaxResult<List<PosRes>>> GetPosResByLastHoursObsolete(PosRequestByLastRangeDto dto)
+        {
+            List<PosRes> posList = new List<PosRes>();
+            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<List<PosRes>>("定位结果查询最新数据异常");
+            }
+        }
+        #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<CgResDto> MapCgDto(List<CgRes> listCg)
+        {
+            List<CgResDto> list = new List<CgResDto>();
+            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;
+
+        }
+    }
+}

+ 3 - 3
XdCxRhDW.App/UserControl/CtrlHome.cs

@@ -702,7 +702,7 @@ namespace XdCxRhDW.App.UserControl
                     DxHelper.MsgBoxHelper.ShowError($"停止任务异常.{ex.Message}");
                 }
             }
-            gridView1.RefreshData();
+            gridView1.RefreshRow(gridView1.FocusedRowHandle);
             var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
             var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
             btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
@@ -808,7 +808,7 @@ namespace XdCxRhDW.App.UserControl
                         IncludeInvalidate = btnIncludeInvalidate.Checked
 
                     };
-                    var res = await HttpHelper.PostRequestAsync<List<ModelPosRes>>(SysConfig.GetUrl("Pos/GetPosResByTimeRangeObsolete"), dto, token: ct);
+                    var res = await HttpHelper.PostRequestAsync<List<ModelPosRes>>(SysConfig.GetUrl("Result/GetPosResByTimeRangeObsolete"), dto, token: ct);
                     if (res.code == 200)
                     {
                         if (res.msg.Length > 10)
@@ -835,7 +835,7 @@ namespace XdCxRhDW.App.UserControl
                     {
                         dto.TarFrequpHz = Convert.ToInt64(txtFrequpMHz.EditValue);
                     }
-                    var res = await HttpHelper.PostRequestAsync<List<ModelPosRes>>(SysConfig.GetUrl("Pos/GetPosResByLastHoursObsolete"), dto, token: ct);
+                    var res = await HttpHelper.PostRequestAsync<List<ModelPosRes>>(SysConfig.GetUrl("Result/GetPosResByLastHoursObsolete"), dto, token: ct);
                     if (res.code == 200)
                     {
                         if (res.msg.Length > 10)

+ 1 - 0
XdCxRhDW.App/XdCxRhDW.App.csproj

@@ -158,6 +158,7 @@
     <Compile Include="Basic\BindingData.cs" />
     <Compile Include="Basic\IOverlayFormService.cs" />
     <Compile Include="Controllers\DetectCgController.cs" />
+    <Compile Include="Controllers\ResultController.cs" />
     <Compile Include="Controllers\PosController.cs" />
     <Compile Include="Controllers\SvrReportController.cs" />
     <Compile Include="Controllers\TxController.cs" />

+ 1 - 2
XdCxRhDW.WebApi/05.XdCxRhDW.WebApi.csproj

@@ -23,8 +23,7 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
-    <DocumentationFile>
-    </DocumentationFile>
+    <DocumentationFile>bin\Debug\XdCxRhDW.WebApi.xml</DocumentationFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>

+ 3 - 0
XdCxRhDW.WebApi/AutofacUtil.cs

@@ -1,5 +1,8 @@
 using Autofac;
 
+/// <summary>
+/// 
+/// </summary>
 public class AutofacUtil
 {
     /// <summary>

+ 3 - 1
XdCxRhDW.WebApi/BaseController.cs

@@ -39,7 +39,9 @@ namespace XdCxRhDW.WebApi
         {
             return Path.Combine(this.uploadFolder, fileName);
         }
-
+        /// <summary>
+        /// 获取客户端IP地址
+        /// </summary>
         protected string RemoteIp
         {
             get

+ 1 - 1
XdCxRhDW.WebApi/FileController.cs

@@ -57,7 +57,7 @@ namespace XdCxRhDW.WebApi
         /// <summary>
         /// 批量删除文件
         /// </summary>
-        /// <param name="files">上传后返回的一个或多个文件集合</param>
+        /// <param name="dto">参数文件参数模型</param>
         /// <returns>返回删除成功的文件个数</returns>
         [HttpPost]
         public AjaxResult<int> DeleteFiles(FileDeleteDto dto)

+ 35 - 27
XdCxRhDW.WebApi/Startup.cs

@@ -61,6 +61,7 @@ namespace XdCxRhDW.WebApi
         /// <param name="port"></param>
         /// <param name="controllerXmlName">controller所在程序集xml文件名称</param>
         /// <param name="dtoXmlName">dto所在程序集xml文件名称</param>
+        /// <param name="timeZoneUtc">时区</param>
         public static void Start(int port, string controllerXmlName, string dtoXmlName, string timeZoneUtc = "UTC+08:00")
         {
             //不要删除这句代码,VS引用优化检测到没有使用Microsoft.Owin.Host.HttpListener.dll则可能不会将此dll复制到本地导致http服务启动失败
@@ -199,7 +200,8 @@ namespace XdCxRhDW.WebApi
                  c.PrettyPrint();//漂亮缩进
                  c.SingleApiVersion("v1", $"{exeName}Http接口");
                  c.ApiKey("123456");
-
+                 var webApiXmlPath0 = $"{AppDomain.CurrentDomain.BaseDirectory}{System.Reflection.Assembly.GetAssembly(typeof(Startup)).GetName().Name}.xml";
+                 c.IncludeXmlComments(webApiXmlPath0);//WebApi模型描述
                  var webApiXmlPath1 = $"{AppDomain.CurrentDomain.BaseDirectory}{Path.GetFileNameWithoutExtension(_dtoXmlName)}.xml";
                  c.IncludeXmlComments(webApiXmlPath1);//dto模型描述
                  var webApiXmlPath2 = $"{AppDomain.CurrentDomain.BaseDirectory}{Path.GetFileNameWithoutExtension(_controllerXmlName)}.xml";
@@ -208,8 +210,8 @@ namespace XdCxRhDW.WebApi
                  c.IncludeXmlComments(webApiXmlPath3);//返回值描述
 
                  //控制器本身描述
-                 string controllerXmlPath = $"{AppDomain.CurrentDomain.BaseDirectory}{Path.GetFileNameWithoutExtension(_controllerXmlName)}.xml";
-                 c.CustomProvider(defaultProvider => new SwaggerControllerDescProvider(defaultProvider, controllerXmlPath));
+                 string controllerXmlPath1 = $"{AppDomain.CurrentDomain.BaseDirectory}{Path.GetFileNameWithoutExtension(_controllerXmlName)}.xml";
+                 c.CustomProvider(defaultProvider => new SwaggerControllerDescProvider(defaultProvider,new string[] { webApiXmlPath0, controllerXmlPath1 }));
                  c.OperationFilter<FileUploadOperation>();
                  c.SchemaFilter<SwaggerEnumFilter>();
                  c.SchemaFilter<SwaggerDefalutValueFilter>();
@@ -315,13 +317,13 @@ namespace XdCxRhDW.WebApi
         {
             private readonly ISwaggerProvider _swaggerProvider;
             private static ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>();
-            private readonly string _xml;
+            private readonly string[] _xml;
             /// <summary>
             /// 
             /// </summary>
             /// <param name="swaggerProvider"></param>
             /// <param name="xml">xml文档路径</param>
-            public SwaggerControllerDescProvider(ISwaggerProvider swaggerProvider, string xml)
+            public SwaggerControllerDescProvider(ISwaggerProvider swaggerProvider, string[] xml)
             {
                 _swaggerProvider = swaggerProvider;
                 _xml = xml;
@@ -349,38 +351,44 @@ namespace XdCxRhDW.WebApi
             /// <returns>所有控制器描述</returns>
             public ConcurrentDictionary<string, string> GetControllerDesc()
             {
-                string xmlpath = _xml;
                 ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
-                if (File.Exists(xmlpath))
+                if (_xml != null)
                 {
-                    XmlDocument xmldoc = new XmlDocument();
-                    xmldoc.Load(xmlpath);
-                    string type = string.Empty, path = string.Empty, controllerName = string.Empty;
-
-                    string[] arrPath;
-                    int length = -1, cCount = "Controller".Length;
-                    XmlNode summaryNode = null;
-                    foreach (XmlNode node in xmldoc.SelectNodes("//member"))
+                    foreach (var item in _xml)
                     {
-                        type = node.Attributes["name"].Value;
-                        if (type.StartsWith("T:"))
+                        if (File.Exists(item))
                         {
-                            //控制器
-                            arrPath = type.Split('.');
-                            length = arrPath.Length;
-                            controllerName = arrPath[length - 1];
-                            if (controllerName.EndsWith("Controller"))
+                            XmlDocument xmldoc = new XmlDocument();
+                            xmldoc.Load(item);
+                            string type = string.Empty, path = string.Empty, controllerName = string.Empty;
+
+                            string[] arrPath;
+                            int length = -1, cCount = "Controller".Length;
+                            XmlNode summaryNode = null;
+                            foreach (XmlNode node in xmldoc.SelectNodes("//member"))
                             {
-                                //获取控制器注释
-                                summaryNode = node.SelectSingleNode("summary");
-                                string key = controllerName.Remove(controllerName.Length - cCount, cCount);
-                                if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))
+                                type = node.Attributes["name"].Value;
+                                if (type.StartsWith("T:"))
                                 {
-                                    controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
+                                    //控制器
+                                    arrPath = type.Split('.');
+                                    length = arrPath.Length;
+                                    controllerName = arrPath[length - 1];
+                                    if (controllerName.EndsWith("Controller"))
+                                    {
+                                        //获取控制器注释
+                                        summaryNode = node.SelectSingleNode("summary");
+                                        string key = controllerName.Remove(controllerName.Length - cCount, cCount);
+                                        if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))
+                                        {
+                                            controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
+                                        }
+                                    }
                                 }
                             }
                         }
                     }
+                    
                 }
                 return controllerDescDict;
             }

+ 2 - 0
XdCxRhDw.Dto/02.XdCxRhDW.Dto.csproj

@@ -55,8 +55,10 @@
     <Compile Include="Attribute\Pow2Attribute.cs" />
     <Compile Include="Attribute\RangeAttribute.cs" />
     <Compile Include="CafResultDto.cs" />
+    <Compile Include="CgResDto.cs" />
     <Compile Include="CpuCgMultiDto.cs" />
     <Compile Include="ImageResultDto.cs" />
+    <Compile Include="CgResQueryDto.cs" />
     <Compile Include="SigDelayDto.cs" />
     <Compile Include="SignalProcResDto.cs" />
     <Compile Include="SignalProcDto.cs" />

+ 311 - 0
XdCxRhDw.Dto/CgResDto.cs

@@ -0,0 +1,311 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDW.Dto
+{
+    /// <summary>
+    /// 参数估计结果模型
+    /// </summary>
+    public class CgResDto 
+    {
+        /// <summary>
+        /// 参估编号
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 任务编号
+        /// </summary>
+        public int TaskID { get; set; }
+
+        /// <summary>
+        /// 上行频点Hz
+        /// </summary>
+        public long FreqUpHz { get; set; }
+
+        /// <summary>
+        /// 信号时刻
+        /// </summary>
+        public DateTime SigTime { get; set; }
+
+        /// <summary>
+        /// 主邻1时差(us)
+        /// </summary>
+        public double? Dto1 { get; set; }
+
+        /// <summary>
+        /// 主邻1频差(Hz)
+        /// </summary>
+        public double? Dfo1 { get; set; }
+
+        /// <summary>
+        /// 主邻1信噪比(dB)
+        /// </summary>
+        public double? Snr1 { get; set; }
+
+        /// <summary>
+        /// 主邻2时差(us)
+        /// </summary>
+        public double? Dto2 { get; set; }
+
+        /// <summary>
+        /// 主邻2频差(Hz)
+        /// </summary>
+        public double? Dfo2 { get; set; }
+
+        /// <summary>
+        /// 主邻2信噪比(dB)
+        /// </summary>
+        public double? Snr2 { get; set; }
+
+        /// <summary>
+        /// 主星超短时差(us)
+        /// </summary>
+        public double? DtoCdb { get; set; }
+
+        /// <summary>
+        /// 主星超短频差 (Hz)
+        /// </summary>
+        public double? DfoCdb { get; set; }
+
+        /// <summary>
+        /// 主星超短信噪比(dB)
+        /// </summary>
+        public double? SnrCdb { get; set; }
+
+        /// <summary>
+        /// 样本主星时差(us)
+        /// </summary>
+        public double? YbMainDto { get; set; }
+
+        /// <summary>
+        /// 样本主星频差(Hz)
+        /// </summary>
+        public double? YbMainDfo { get; set; }
+
+        /// <summary>
+        /// 样本主星信噪比(dB)
+        /// </summary>
+        public double? YbMainSnr { get; set; }
+
+        /// <summary>
+        /// 样本邻星1时差(us)
+        /// </summary>
+        public double? YbAdja1Dto { get; set; }
+
+        /// <summary>
+        /// 样本邻星1频差(Hz)
+        /// </summary>
+        public double? YbAdja1Dfo { get; set; }
+
+        /// <summary>
+        /// 样本邻星1信噪比(dB)
+        /// </summary>
+        public double? YbAdja1Snr { get; set; }
+
+        /// <summary>
+        /// 样本邻星2时差(us)
+        /// </summary>
+        public double? YbAdja2Dto { get; set; }
+
+        /// <summary>
+        /// 样本邻星1频差(Hz)
+        /// </summary>
+        public double? YbAdja2Dfo { get; set; }
+
+        /// <summary>
+        /// 样本邻星2信噪比(dB)
+        /// </summary>
+        public double? YbAdja2Snr { get; set; }
+
+        /// <summary>
+        /// 目标上行频点(Hz)
+        /// </summary>
+        public double? TarFreqUp { get; set; }
+
+        /// <summary>
+        /// 目标下行频点(Hz)
+        /// </summary>
+        public double? TarFreqDown { get; set; }
+
+        /// <summary>
+        /// 参考上行频点(Hz)
+        /// </summary>
+        public double? RefFreqUp { get; set; }
+
+        /// <summary>
+        /// 参考下行频点(Hz)
+        /// </summary>
+        public double? RefFreqDown { get; set; }
+
+        /// <summary>
+        /// 主星编号
+        /// </summary>
+        public int? MainCode { get; set; }
+
+        /// <summary>
+        /// 邻星1编号
+        /// </summary>
+        public int? Adja1Code { get; set; }
+
+        /// <summary>
+        /// 邻星2编号
+        /// </summary>
+        public int? Adja2Code { get; set; }
+
+        /// <summary>
+        /// 主星星历发布时刻
+        /// </summary>
+        public DateTime? MainXlTime { get; set; }
+
+        /// <summary>
+        /// 邻星1星历发布时刻
+        /// </summary>
+        public DateTime? Adja1XlTime { get; set; }
+
+        /// <summary>
+        /// 邻星2星历发布时刻
+        /// </summary>
+        public DateTime? Adja2XlTime { get; set; }
+
+        /// <summary>
+        /// 主星坐标X
+        /// </summary>
+        public double? MainX { get; set; }
+
+        /// <summary>
+        /// 主星坐标Y
+        /// </summary>
+        public double? MainY { get; set; }
+
+        /// <summary>
+        /// 主星坐标Z
+        /// </summary>
+        public double? MainZ { get; set; }
+
+        /// <summary>
+        /// 主星速度Vx(m/s)
+        /// </summary>
+        public double? MainVx { get; set; }
+
+        /// <summary>
+        /// 主星速度Vy(m/s)
+        /// </summary>
+        public double? MainVy { get; set; }
+
+        /// <summary>
+        /// 主星速度Vz(m/s)
+        /// </summary>
+        public double? MainVz { get; set; }
+
+        /// <summary>
+        /// 邻星1坐标X
+        /// </summary>
+        public double? Adja1X { get; set; }
+
+        /// <summary>
+        /// 邻星1坐标Y
+        /// </summary>
+        public double? Adja1Y { get; set; }
+
+        /// <summary>
+        /// 邻星1坐标Z
+        /// </summary>
+        public double? Adja1Z { get; set; }
+
+        /// <summary>
+        /// 邻星1速度Vx(m/s)
+        /// </summary>
+        public double? Adja1Vx { get; set; }
+
+        /// <summary>
+        /// 邻星1速度Vy(m/s)
+        /// </summary>
+        public double? Adja1Vy { get; set; }
+
+        /// <summary>
+        /// 邻星1速度Vz(m/s)
+        /// </summary>
+        public double? Adja1Vz { get; set; }
+
+        /// <summary>
+        /// 邻星2坐标X
+        /// </summary>
+        public double? Adja2X { get; set; }
+
+        /// <summary>
+        /// 邻星2坐标Y
+        /// </summary>
+        public double? Adja2Y { get; set; }
+
+        /// <summary>
+        /// 邻星2坐标Z
+        /// </summary>
+        public double? Adja2Z { get; set; }
+
+        /// <summary>
+        /// 邻星2速度Vx(m/s)
+        /// </summary>
+        public double? Adja2Vx { get; set; }
+
+        /// <summary>
+        /// 邻星2速度Vy(m/s)
+        /// </summary>
+        public double? Adja2Vy { get; set; }
+
+        /// <summary>
+        /// 邻星2速度Vz(m/s)
+        /// </summary>
+        public double? Adja2Vz { get; set; }
+
+        /// <summary>
+        /// 卫星接收天线经度
+        /// </summary>
+        public double SatTxLon { get; set; }
+
+        /// <summary>
+        /// 卫星接收天线纬度
+        /// </summary>
+        public double SatTxLat { get; set; }
+
+        /// <summary>
+        /// 超短波接收天线经度
+        /// </summary>
+        public double? CdbTxLon { get; set; }
+
+        /// <summary>
+        /// 超短波接收天线纬度
+        /// </summary>
+        public double? CdbTxLat { get; set; }
+
+        /// <summary>
+        /// 测向站经度
+        /// </summary>
+        public double? CxLon { get; set; }
+
+        /// <summary>
+        /// 测向站纬度
+        /// </summary>
+        public double? CxLat { get; set; }
+
+        /// <summary>
+        /// 参考站经度
+        /// </summary>
+        public double? RefLon { get; set; }
+
+        /// <summary>
+        /// 参考站纬度
+        /// </summary>
+        public double? RefLat { get; set; }
+
+        /// <summary>
+        /// 数据创建时间
+        /// </summary>
+        public DateTime CreateTime { get; set; }
+    }
+}

+ 57 - 0
XdCxRhDw.Dto/CgResQueryDto.cs

@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDW.Dto
+{
+    /// <summary>
+    /// 参估结果时间范围查询参数模型
+    /// </summary>
+    public class CgResQueryDto : IValidatableObject
+    {
+        /// <summary>
+        /// 任务编号
+        /// </summary>
+        [RangeInt(0)]
+        public int TaskInfoID { get; set; }
+
+        /// <summary>
+        /// 目标上行频点(Hz),为空值时查询所有频点的结果
+        /// </summary>
+        [RangeLong(0,IncludeMin =true)]
+        public long? TarFrequpHz { get; set; }
+
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime BeginTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime EndTime { get; set; }
+
+
+        /// <summary>
+        /// 是否包含无效结果(无定位结果的参估结果)
+        /// </summary>
+        public bool IncludeInvalidate { get; set; } = false;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="validationContext"></param>
+        /// <returns></returns>
+        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
+        {
+            if (BeginTime > EndTime)
+                yield return new ValidationResult("开始时间不能大于结束时间!", new[] { nameof(BeginTime), nameof(EndTime) });
+        }
+    }
+
+    
+}

+ 4 - 0
XdCxRhDw.Dto/PosResDto.cs

@@ -78,5 +78,9 @@ namespace XdCxRhDW.Dto
         /// </summary>
         public int Confidence { get; set; }
 
+        /// <summary>
+        /// 数据创建时间
+        /// </summary>
+        public DateTime CreateTime { get; set; }
     }
 }