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 System.Data.Entity.Infrastructure; using XdCxRhDW.Framework; using Org.BouncyCastle.Asn1.X509; namespace XdCxRhDW.App.Controllers { /// /// 定位功能相关接口 /// public class PosController : BaseController { #region 一星一地测向定位 /// /// 一星一地测向带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX1D1Async(X1D1PosDto dto) { TaskInfo runTask; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到一星一地测向带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动一星一地测向定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, CdbTxLon = dto.CdbTxLon, CdbTxLat = dto.CdbTxLat, CxLon = dto.CxLon, CxLat = dto.CxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoCdb = Math.Round(dto.XdDto, 10), DfoCdb = Math.Round(dto.XdDfo, 10), SnrCdb = Math.Round(dto.XdSnr, 1), YbMainDto = Math.Round(dto.MainYbDto, 10), StationResID = StationRes.ID, MainCode = dto.MainCode, TaskID = runTask.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X1D1CX, }; posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } db.Entry(runTask).State = EntityState.Modified; await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, null)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } /// /// 一星一地测向带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX1D1NoXlAsync(X1D1NoXlPosDto dto) { TaskInfo runTask; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到一星一地测向带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动一星一地测向定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime); if (xl1 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!"); return Error($"系统缺少编号{dto.MainCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime }; var ephMain = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); if (ephMain.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}"); return Error($"推算卫星{dto.MainCode}的ECEF星历出错"); } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, CdbTxLon = dto.CdbTxLon, CdbTxLat = dto.CdbTxLat, CxLon = dto.CxLon, CxLat = dto.CxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, DtoCdb = Math.Round(dto.XdDto, 10), DfoCdb = Math.Round(dto.XdDfo, 10), SnrCdb = Math.Round(dto.XdSnr, 1), YbMainDto = Math.Round(dto.MainYbDto, 10), StationResID = StationRes.ID, MainCode = dto.MainCode, MainXlTime = ephMain.data.TleTime, TaskID = runTask.ID, MainX = ephMain.data.X, MainY = ephMain.data.Y, MainZ = ephMain.data.Z, MainVx = ephMain.data.VX, MainVy = ephMain.data.VY, MainVz = ephMain.data.VZ, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CxResID = cxRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X1D1CX, }; posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, null)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } #endregion #region 两星一地定位 /// /// 两星一地带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX2D1Async(X2D1PosDto dto) { TaskInfo runTask; TargetInfo target = null; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到两星一地带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动两星一地定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } if (!string.IsNullOrWhiteSpace(dto.Target)) { using (MySqlContext db = new MySqlContext()) { target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim()); if (target == null) { target = db.TargetInfos.Add(new TargetInfo() { TargetName = dto.Target.Trim(), TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim()) }); await db.SaveChangesAsync(); } } } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, CdbTxLon = dto.CdbTxLon, CdbTxLat = dto.CdbTxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; ckRes = db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.SxDto, 10), Dfo1 = Math.Round(dto.SxDfo, 10), Snr1 = Math.Round(dto.SxSnr, 1), DtoCdb = Math.Round(dto.XdDto, 10), DfoCdb = Math.Round(dto.XdDfo, 10), SnrCdb = Math.Round(dto.XdSnr, 1), YbMainDto = Math.Round(dto.MainYbDto, 10), YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10), StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.AdjaCode, TaskID = runTask.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, Adja1X = dto.AdjaX, Adja1Y = dto.AdjaY, Adja1Z = dto.AdjaZ, MainVx = dto.MainVX, MainVy = dto.MainVY, MainVz = dto.MainVZ, Adja1Vx = dto.AdjaVX, Adja1Vy = dto.AdjaVY, Adja1Vz = dto.AdjaVZ, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); var res = PosApi.X2D1_Pos(cgRes, StationRes, dto.Zone, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X2D1, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); if (target != null) { posRes.TargetInfoID = target.ID; } if (dto.CalcConfidence) { } posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, target)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } /// /// 两星一地带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX2D1NoXlAsync(X2D1NoXlPosDto dto) { TaskInfo runTask; TargetInfo target = null; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到两星一地带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动两星一地定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } if (!string.IsNullOrWhiteSpace(dto.Target)) { using (MySqlContext db = new MySqlContext()) { target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim()); if (target == null) { target = db.TargetInfos.Add(new TargetInfo() { TargetName = dto.Target.Trim(), TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim()) }); await db.SaveChangesAsync(); } } } var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime); if (xl1 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!"); return Error($"系统缺少编号{dto.MainCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime); if (xl2 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!"); return Error($"系统缺少编号{dto.AdjaCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime }; var ephMain = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); if (ephMain.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}"); return Error($"推算卫星{dto.MainCode}的ECEF星历出错"); } var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime }; var ephAdja = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2); if (ephAdja.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}"); return Error($"推算卫星{dto.AdjaCode}的ECEF星历出错"); } //#warning 测试代码 //var tarEcef = PhysicsHelper.GeoToEcef((110, 17, 0)); //var ecefXl1 = (ephMain.data.X, ephMain.data.Y, ephMain.data.Z); //var ecefXl2 = (ephAdja.data.X, ephAdja.data.Y, ephAdja.data.Z); //var ecefCdb = PhysicsHelper.GeoToEcef((dto.CdbTxLon, dto.CdbTxLat, 0)); //var ecefRec = PhysicsHelper.GeoToEcef((dto.SatTxLon, dto.SatTxLat, 0)); //var dt1 = PhysicsHelper.Dto(tarEcef, ecefXl1, ecefRec); //var dt2 = PhysicsHelper.Dto(tarEcef, ecefXl2, ecefRec); //var dt3 = PhysicsHelper.Dto(tarEcef, ecefCdb); //var dto1 = dt1 - dt2; //var dto2 = dt1 - dt3; //dto.SxDto = Math.Round(dto1 * 1e6 + r.Next(-10, 10) + r.NextDouble(), 3); //dto.XdDto = Math.Round(dto2 * 1e6 + r.Next(-10, 10) + r.NextDouble(), 3); //var refEcef = PhysicsHelper.GeoToEcef((dto.RefLon, dto.RefLat, 0)); //var refdt1 = PhysicsHelper.Dto(refEcef, ecefXl1, ecefRec); //var refdt2 = PhysicsHelper.Dto(refEcef, ecefXl2, ecefRec); //dto.MainYbDto = Math.Round(refdt1 * 1e6, 3); //dto.AdjaYbDto = Math.Round(refdt2 * 1e6, 3); using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, CdbTxLon = dto.CdbTxLon, CdbTxLat = dto.CdbTxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.SxDto, 10), Dfo1 = Math.Round(dto.SxDfo, 10), Snr1 = Math.Round(dto.SxSnr, 1), DtoCdb = Math.Round(dto.XdDto, 10), DfoCdb = Math.Round(dto.XdDfo, 10), SnrCdb = Math.Round(dto.XdSnr, 1), YbMainDto = Math.Round(dto.MainYbDto, 10), YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10), StationResID = StationRes.ID, MainCode = dto.MainCode, MainXlTime = ephMain.data.TleTime, Adja1Code = dto.AdjaCode, Adja1XlTime = ephAdja.data.TleTime, TaskID = runTask.ID, MainX = ephMain.data.X, MainY = ephMain.data.Y, MainZ = ephMain.data.Z, MainVx = ephMain.data.VX, MainVy = ephMain.data.VY, MainVz = ephMain.data.VZ, Adja1Vx = ephAdja.data.VX, Adja1Vy = ephAdja.data.VY, Adja1Vz = ephAdja.data.VZ, Adja1X = ephAdja.data.X, Adja1Y = ephAdja.data.Y, Adja1Z = ephAdja.data.Z, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); var res = PosApi.X2D1_Pos(cgRes, StationRes, dto.Zone, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X2D1, }; /* if (posRes.PosLon == 999 || posRes.PosLat == 999)//有参无结果时做无参 { res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence); posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X2D1NoRef, }; } */ if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); if (target != null) { posRes.TargetInfoID = target.ID; } posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, target)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } /// /// 两星一地无参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX2D1NoParAsync(X2D1NoParPosDto dto) { TaskInfo runTask; TargetInfo target = null; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到两星一地无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动两星一地定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } if (!string.IsNullOrWhiteSpace(dto.Target)) { using (MySqlContext db = new MySqlContext()) { target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim()); if (target == null) { target = db.TargetInfos.Add(new TargetInfo() { TargetName = dto.Target.Trim(), TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim()) }); await db.SaveChangesAsync(); } } } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, CdbTxLon = dto.CdbTxLon, CdbTxLat = dto.CdbTxLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.SxDto, 10), Dfo1 = Math.Round(dto.SxDfo, 10), Snr1 = Math.Round(dto.SxSnr, 1), DtoCdb = Math.Round(dto.XdDto, 10), DfoCdb = Math.Round(dto.XdDfo, 10), SnrCdb = Math.Round(dto.XdSnr, 1), StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.AdjaCode, TaskID = runTask.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, Adja1X = dto.AdjaX, Adja1Y = dto.AdjaY, Adja1Z = dto.AdjaZ, MainVx = dto.MainVX, MainVy = dto.MainVY, MainVz = dto.MainVZ, Adja1Vx = dto.AdjaVX, Adja1Vy = dto.AdjaVY, Adja1Vz = dto.AdjaVZ, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); double[] res; res = PosApi.X2D1_PosNoRef_ZL(cgRes, StationRes, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X2D1NoRef, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); if (target != null) { posRes.TargetInfoID = target.ID; } posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, target)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } /// /// 两星一地无参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto) { TaskInfo runTask; TargetInfo target = null; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到两星一地无参定位(无星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动两星一地定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } if (!string.IsNullOrWhiteSpace(dto.Target)) { using (MySqlContext db = new MySqlContext()) { target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim()); if (target == null) { target = db.TargetInfos.Add(new TargetInfo() { TargetName = dto.Target.Trim(), TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim()) }); await db.SaveChangesAsync(); } } } var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime); if (xl1 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!"); return Error($"系统缺少编号{dto.MainCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime); if (xl2 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!"); return Error($"系统缺少编号{dto.AdjaCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime }; var ephMain = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); if (ephMain.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}"); return Error($"推算卫星{dto.MainCode}的ECEF星历出错"); } var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime }; var ephAdja = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2); if (ephAdja.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}"); return Error($"推算卫星{dto.AdjaCode}的ECEF星历出错"); } //#warning 测试代码 //var tarEcef = PhysicsHelper.GeoToEcef((46, 21, 0)); //var ecefXl1 = (ephMain.data.X, ephMain.data.Y, ephMain.data.Z); //var ecefXl2 = (ephAdja.data.X, ephAdja.data.Y, ephAdja.data.Z); //var ecefCdb = PhysicsHelper.GeoToEcef((dto.CdbTxLon, dto.CdbTxLat, 0)); //var ecefRec = PhysicsHelper.GeoToEcef((dto.SatTxLon, dto.SatTxLat, 0)); //var dt1 = PhysicsHelper.Dto(tarEcef, ecefXl1, ecefRec); //var dt2 = PhysicsHelper.Dto(tarEcef, ecefXl2, ecefRec); //var dt3 = PhysicsHelper.Dto(tarEcef, ecefCdb); //var dto1 = dt1 - dt2; //var dto2 = dt1 - dt3; //dto.SxDto = dto1 * 1e6 + r.Next(-10, 10) + Math.Round(r.NextDouble(), 3); //dto.XdDto = dto2 * 1e6 + r.Next(-10, 10) + Math.Round(r.NextDouble(), 3); using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, CdbTxLon = dto.CdbTxLon, CdbTxLat = dto.CdbTxLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.SxDto, 10), Dfo1 = Math.Round(dto.SxDfo, 10), Snr1 = Math.Round(dto.SxSnr, 1), DtoCdb = Math.Round(dto.XdDto, 10), DfoCdb = Math.Round(dto.XdDfo, 10), SnrCdb = Math.Round(dto.XdSnr, 1), StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.AdjaCode, MainXlTime = ephMain.data.TleTime, Adja1XlTime = ephAdja.data.TleTime, TaskID = runTask.ID, MainX = ephMain.data.X, MainY = ephMain.data.Y, MainZ = ephMain.data.Z, Adja1X = ephAdja.data.X, Adja1Y = ephAdja.data.Y, Adja1Z = ephAdja.data.Z, MainVx = ephMain.data.VX, MainVy = ephMain.data.VY, MainVz = ephMain.data.VZ, Adja1Vx = ephAdja.data.VX, Adja1Vy = ephAdja.data.VY, Adja1Vz = ephAdja.data.VZ, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); double[] res; res = PosApi.X2D1_PosNoRef_ZL(cgRes, StationRes, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X2D1NoRef, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); if (target != null) { posRes.TargetInfoID = target.ID; } posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, target)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } #endregion #region 融合定位 /// /// 融合带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosRhAsync(RHPosDto dto) { TaskInfo runTask; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到融合带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动融合定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, CdbTxLon = dto.CdbTxLon, CdbTxLat = dto.CdbTxLat, CxLon = dto.CxLon, CxLat = dto.CxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.SxDto, 10), Dfo1 = Math.Round(dto.SxDfo, 10), Snr1 = Math.Round(dto.SxSnr, 1), DtoCdb = Math.Round(dto.XdDto, 10), DfoCdb = Math.Round(dto.XdDfo, 10), SnrCdb = Math.Round(dto.XdSnr, 1), YbMainDto = Math.Round(dto.MainYbDto, 10), YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10), StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.AdjaCode, TaskID = runTask.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, Adja1X = dto.AdjaX, Adja1Y = dto.AdjaY, Adja1Z = dto.AdjaZ, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var res = PosApi.RH_Pos(cgRes, StationRes, cxRes, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.RH, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, null)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } /// /// 融合带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosRhNoXlAsync(RHNoXlPosDto dto) { TaskInfo runTask; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到融合带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动融合定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime); if (xl1 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!"); return Error($"系统缺少编号{dto.MainCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime); if (xl2 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!"); return Error($"系统缺少编号{dto.AdjaCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime }; var ephMain = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); if (ephMain.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}"); return Error($"推算卫星{dto.MainCode}的ECEF星历出错"); } var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime }; var ephAdja = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2); if (ephAdja.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}"); return Error($"推算卫星{dto.AdjaCode}的ECEF星历出错"); } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, CdbTxLon = dto.CdbTxLon, CdbTxLat = dto.CdbTxLat, CxLon = dto.CxLon, CxLat = dto.CxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.SxDto, 10), Dfo1 = Math.Round(dto.SxDfo, 10), Snr1 = Math.Round(dto.SxSnr, 1), DtoCdb = Math.Round(dto.XdDto, 10), DfoCdb = Math.Round(dto.XdDfo, 10), SnrCdb = Math.Round(dto.XdSnr, 1), YbMainDto = Math.Round(dto.MainYbDto, 10), YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10), StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.AdjaCode, MainXlTime = ephMain.data.TleTime, Adja1XlTime = ephAdja.data.TleTime, TaskID = runTask.ID, MainX = ephMain.data.X, MainY = ephMain.data.Y, MainZ = ephMain.data.Z, MainVx = ephMain.data.VX, MainVy = ephMain.data.VY, MainVz = ephMain.data.VZ, Adja1X = ephAdja.data.X, Adja1Y = ephAdja.data.Y, Adja1Z = ephAdja.data.Z, Adja1Vx = ephAdja.data.VX, Adja1Vy = ephAdja.data.VY, Adja1Vz = ephAdja.data.VZ, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); var cxRes = db.CxRes.Add(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var res = PosApi.RH_Pos(cgRes, StationRes, cxRes, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CxResID = cxRes.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.RH, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, null)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } #endregion #region 三星双时差定位 /// /// 三星双时差带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX3TwoDtoAsync(X3TwoDtoPosDto dto) { TaskInfo runTask; TargetInfo target = null; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到三星双时差带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动三星双时差定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } if (!string.IsNullOrWhiteSpace(dto.Target)) { using (MySqlContext db = new MySqlContext()) { target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim()); if (target == null) { target = db.TargetInfos.Add(new TargetInfo() { TargetName = dto.Target.Trim(), TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim()) }); await db.SaveChangesAsync(); } } } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.Dto1, 10), Dfo1 = Math.Round(dto.Dfo1, 10), Snr1 = Math.Round(dto.Snr1, 1), Dto2 = Math.Round(dto.Dto2, 10), Dfo2 = Math.Round(dto.Dfo2, 10), Snr2 = Math.Round(dto.Snr2, 1), YbMainDto = Math.Round(dto.YbMainDto, 10), YbAdja1Dto = Math.Round(dto.YbAdja1Dto, 10), YbAdja2Dto = Math.Round(dto.YbAdja2Dto, 10), StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.Adja1Code, Adja2Code = dto.Adja2Code, TaskID = runTask.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, MainVx = dto.MainVX, MainVy = dto.MainVY, MainVz = dto.MainVZ, Adja1X = dto.Adja1X, Adja1Y = dto.Adja1Y, Adja1Z = dto.Adja1Z, Adja1Vx = dto.Adja1VX, Adja1Vy = dto.Adja1VY, Adja1Vz = dto.Adja1VZ, Adja2X = dto.Adja2X, Adja2Y = dto.Adja2Y, Adja2Z = dto.Adja2Z, Adja2Vx = dto.Adja2VX, Adja2Vy = dto.Adja2VY, Adja2Vz = dto.Adja2VZ, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); var res = PosApi.X3_Pos(cgRes, StationRes, dto.Zone, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X3, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); if (target != null) { posRes.TargetInfoID = target.ID; } posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, target)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } /// /// 三星双时差带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX3TwoDtoNoXlAsync(X3TwoDtoNoXlPosDto dto) { TaskInfo runTask; TargetInfo target = null; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到三星双时差带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动三星双时差定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } if (!string.IsNullOrWhiteSpace(dto.Target)) { using (MySqlContext db = new MySqlContext()) { target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim()); if (target == null) { target = db.TargetInfos.Add(new TargetInfo() { TargetName = dto.Target.Trim(), TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim()) }); await db.SaveChangesAsync(); } } } var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime); if (xl1 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!"); return Error($"系统缺少编号{dto.MainCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var xl2 = await XlRepository.GetLatestAsync(dto.Adja1Code, dto.SigTime); if (xl2 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!"); return Error($"系统缺少编号{dto.Adja1Code}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var xl3 = await XlRepository.GetLatestAsync(dto.Adja2Code, dto.SigTime); if (xl3 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!"); return Error($"系统缺少编号{dto.Adja2Code}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime }; var ephMain = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); if (ephMain.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}"); return Error($"推算卫星{dto.MainCode}的ECEF星历出错"); } var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime }; var ephAdja1 = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2); if (ephAdja1.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}"); return Error($"推算卫星{dto.Adja1Code}的ECEF星历出错"); } var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime }; var ephAdja2 = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3); if (ephAdja2.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}"); return Error($"推算卫星{dto.Adja2Code}的ECEF星历出错"); } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.Dto1, 10), Dfo1 = Math.Round(dto.Dfo1, 10), Snr1 = Math.Round(dto.Snr1, 1), Dto2 = Math.Round(dto.Dto2, 10), Dfo2 = Math.Round(dto.Dfo2, 10), Snr2 = Math.Round(dto.Snr2, 1), YbMainDto = Math.Round(dto.YbMainDto, 10), YbAdja1Dto = Math.Round(dto.YbAdja1Dto, 10), YbAdja2Dto = Math.Round(dto.YbAdja2Dto, 10), StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.Adja1Code, Adja2Code = dto.Adja2Code, MainXlTime = ephMain.data.TleTime, Adja1XlTime = ephAdja1.data.TleTime, Adja2XlTime = ephAdja2.data.TleTime, TaskID = runTask.ID, MainX = ephMain.data.X, MainY = ephMain.data.Y, MainZ = ephMain.data.Z, MainVx = ephMain.data.VX, MainVy = ephMain.data.VY, MainVz = ephMain.data.VZ, Adja1X = ephAdja1.data.X, Adja1Y = ephAdja1.data.Y, Adja1Z = ephAdja1.data.Z, Adja1Vx = ephAdja1.data.VX, Adja1Vy = ephAdja1.data.VY, Adja1Vz = ephAdja1.data.VZ, Adja2X = ephAdja2.data.X, Adja2Y = ephAdja2.data.Y, Adja2Z = ephAdja2.data.Z, Adja2Vx = ephAdja2.data.VX, Adja2Vy = ephAdja2.data.VY, Adja2Vz = ephAdja2.data.VZ, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); var res = PosApi.X3_Pos(cgRes, StationRes, dto.Zone, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X3, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); if (target != null) { posRes.TargetInfoID = target.ID; } posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, target)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } /// /// 三星双时差无参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX3TwoDtoNoParAsync(X3TwoDtoNoParPosDto dto) { TaskInfo runTask; TargetInfo target = null; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到三星双时差无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动三星双时差定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } if (!string.IsNullOrWhiteSpace(dto.Target)) { using (MySqlContext db = new MySqlContext()) { target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim()); if (target == null) { target = db.TargetInfos.Add(new TargetInfo() { TargetName = dto.Target.Trim(), TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim()) }); await db.SaveChangesAsync(); } } } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.Dto1, 10), Dfo1 = Math.Round(dto.Dfo1, 10), Snr1 = Math.Round(dto.Snr1, 1), Dto2 = Math.Round(dto.Dto2, 10), Dfo2 = Math.Round(dto.Dfo2, 10), Snr2 = Math.Round(dto.Snr2, 1), StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.Adja1Code, Adja2Code = dto.Adja2Code, TaskID = runTask.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, MainVx = dto.MainVX, MainVy = dto.MainVY, MainVz = dto.MainVZ, Adja1X = dto.Adja1X, Adja1Y = dto.Adja1Y, Adja1Z = dto.Adja1Z, Adja1Vx = dto.Adja1VX, Adja1Vy = dto.Adja1VY, Adja1Vz = dto.Adja1VZ, Adja2X = dto.Adja2X, Adja2Y = dto.Adja2Y, Adja2Z = dto.Adja2Z, Adja2Vx = dto.Adja2VX, Adja2Vy = dto.Adja2VY, Adja2Vz = dto.Adja2VZ, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); var res = PosApi.X3_PosNoRef(cgRes, StationRes, dto.Zone, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X3NoRef, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); if (target != null) { posRes.TargetInfoID = target.ID; } posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, target)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } /// /// 三星双时差无参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX3TwoDtoNoXlNoParAsync(X3TwoDtoNoXlNoParPosDto dto) { TaskInfo runTask; TargetInfo target = null; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到三星双时差无参定位(无星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动三星双时差定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } if (!string.IsNullOrWhiteSpace(dto.Target)) { using (MySqlContext db = new MySqlContext()) { target = await db.TargetInfos.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim()); if (target == null) { target = db.TargetInfos.Add(new TargetInfo() { TargetName = dto.Target.Trim(), TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim()) }); await db.SaveChangesAsync(); } } } var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime); if (xl1 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!"); return Error($"系统缺少编号{dto.MainCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var xl2 = await XlRepository.GetLatestAsync(dto.Adja1Code, dto.SigTime); if (xl2 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!"); return Error($"系统缺少编号{dto.Adja1Code}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var xl3 = await XlRepository.GetLatestAsync(dto.Adja2Code, dto.SigTime); if (xl3 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!"); return Error($"系统缺少编号{dto.Adja2Code}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime }; var ephMain = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); if (ephMain.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}"); return Error($"推算卫星{dto.MainCode}的ECEF星历出错"); } var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime }; var ephAdja1 = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2); if (ephAdja1.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}"); return Error($"推算卫星{dto.Adja1Code}的ECEF星历出错"); } var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime }; var ephAdja2 = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3); if (ephAdja2.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}"); return Error($"推算卫星{dto.Adja2Code}的ECEF星历出错"); } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.Dto1, 10), Dfo1 = Math.Round(dto.Dfo1, 10), Snr1 = Math.Round(dto.Snr1, 1), Dto2 = Math.Round(dto.Dto2, 10), Dfo2 = Math.Round(dto.Dfo2, 10), Snr2 = Math.Round(dto.Snr2, 1), StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.Adja1Code, Adja2Code = dto.Adja2Code, MainXlTime = ephMain.data.TleTime, Adja1XlTime = ephAdja1.data.TleTime, Adja2XlTime = ephAdja2.data.TleTime, TaskID = runTask.ID, MainX = ephMain.data.X, MainY = ephMain.data.Y, MainZ = ephMain.data.Z, MainVx = ephMain.data.VX, MainVy = ephMain.data.VY, MainVz = ephMain.data.VZ, Adja1X = ephAdja1.data.X, Adja1Y = ephAdja1.data.Y, Adja1Z = ephAdja1.data.Z, Adja1Vx = ephAdja1.data.VX, Adja1Vy = ephAdja1.data.VY, Adja1Vz = ephAdja1.data.VZ, Adja2X = ephAdja2.data.X, Adja2Y = ephAdja2.data.Y, Adja2Z = ephAdja2.data.Z, Adja2Vx = ephAdja2.data.VX, Adja2Vy = ephAdja2.data.VY, Adja2Vz = ephAdja2.data.VZ, TarFreqUp = dto.FreqUp, TarFreqDown = dto.FreqDown, }); var res = PosApi.X3_PosNoRef(cgRes, StationRes, dto.Zone, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X3NoRef, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); if (target != null) { posRes.TargetInfoID = target.ID; } posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, target)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } #endregion #region 三星双频差定位 /// /// 三星双频差带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX3TwoDfoAsync(X3TwoDfoPosDto dto) { TaskInfo runTask; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X3TwoDfo && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到三星双频差带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动三星双频差定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.Dto1, 10), Dfo1 = Math.Round(dto.Dfo1, 10), Snr1 = Math.Round(dto.Snr1, 1), Dto2 = Math.Round(dto.Dto2, 10), Dfo2 = Math.Round(dto.Dfo2, 10), Snr2 = Math.Round(dto.Snr2, 1), YbMainDfo = Math.Round(dto.YbMainDfo, 10), YbAdja1Dfo = Math.Round(dto.YbAdja1Dfo, 10), YbAdja2Dfo = Math.Round(dto.YbAdja2Dfo, 10), TarFreqUp = dto.TarFreqUp, TarFreqDown = dto.TarFreqDown, RefFreqUp = dto.RefFreqUp, RefFreqDown = dto.RefFreqDown, StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.Adja1Code, Adja2Code = dto.Adja2Code, TaskID = runTask.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, MainVx = dto.MainVx, MainVy = dto.MainVy, MainVz = dto.MainVz, Adja1X = dto.Adja1X, Adja1Y = dto.Adja1Y, Adja1Z = dto.Adja1Z, Adja1Vx = dto.Adja1Vx, Adja1Vy = dto.Adja1Vy, Adja1Vz = dto.Adja1Vz, Adja2X = dto.Adja2X, Adja2Y = dto.Adja2Y, Adja2Z = dto.Adja2Z, Adja2Vx = dto.Adja2Vx, Adja2Vy = dto.Adja2Vy, Adja2Vz = dto.Adja2Vz, }); var res = PosApi.X3_PosTwoDfo(cgRes, StationRes, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X3TwoDfo, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, null)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } /// /// 三星双频差带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX3TwoDfoNoXlAsync(X3TwoDfoNoXlPosDto dto) { TaskInfo runTask; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X3TwoDfo && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到三星双频差带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动三星双频差定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime); if (xl1 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!"); return Error($"系统缺少编号{dto.MainCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var xl2 = await XlRepository.GetLatestAsync(dto.Adja1Code, dto.SigTime); if (xl2 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!"); return Error($"系统缺少编号{dto.Adja1Code}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var xl3 = await XlRepository.GetLatestAsync(dto.Adja2Code, dto.SigTime); if (xl3 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!"); return Error($"系统缺少编号{dto.Adja2Code}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime }; var ephMain = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); if (ephMain.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}"); return Error($"推算卫星{dto.MainCode}的ECEF星历出错"); } var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime }; var ephAdja1 = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2); if (ephAdja1.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}"); return Error($"推算卫星{dto.Adja1Code}的ECEF星历出错"); } var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime }; var ephAdja2 = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3); if (ephAdja2.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}"); return Error($"推算卫星{dto.Adja2Code}的ECEF星历出错"); } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.Dto1, 10), Dfo1 = Math.Round(dto.Dfo1, 10), Snr1 = Math.Round(dto.Snr1, 1), Dto2 = Math.Round(dto.Dto2, 10), Dfo2 = Math.Round(dto.Dfo2, 10), Snr2 = Math.Round(dto.Snr2, 1), YbMainDfo = Math.Round(dto.YbMainDfo, 10), YbAdja1Dfo = Math.Round(dto.YbAdja1Dfo, 10), YbAdja2Dfo = Math.Round(dto.YbAdja2Dfo, 10), TarFreqUp = dto.TarFreqUp, TarFreqDown = dto.TarFreqDown, RefFreqUp = dto.RefFreqUp, RefFreqDown = dto.RefFreqDown, StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.Adja1Code, Adja2Code = dto.Adja2Code, MainXlTime = ephMain.data.TleTime, Adja1XlTime = ephAdja1.data.TleTime, Adja2XlTime = ephAdja2.data.TleTime, TaskID = runTask.ID, MainX = ephMain.data.X, MainY = ephMain.data.Y, MainZ = ephMain.data.Z, MainVx = ephMain.data.VX, MainVy = ephMain.data.VY, MainVz = ephMain.data.VZ, Adja1X = ephAdja1.data.X, Adja1Y = ephAdja1.data.Y, Adja1Z = ephAdja1.data.Z, Adja1Vx = ephAdja1.data.VX, Adja1Vy = ephAdja1.data.VY, Adja1Vz = ephAdja1.data.VZ, Adja2X = ephAdja2.data.X, Adja2Y = ephAdja2.data.Y, Adja2Z = ephAdja2.data.Z, Adja2Vx = ephAdja2.data.VX, Adja2Vy = ephAdja2.data.VY, Adja2Vz = ephAdja2.data.VZ, }); var res = PosApi.X3_PosTwoDfo(cgRes, StationRes, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X3TwoDfo, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, null)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } #endregion #region 双星时频差定位 /// /// 双星时频差带参定位(含星历) /// /// 定位参数 /// [HttpPost] public async Task> PosX2DtoDfoAsync(X2DtoDfoPosDto dto) { TaskInfo runTask; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X2Dfo && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到双星时频差带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动双星时频差定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.Dto, 10), Dfo1 = Math.Round(dto.Dfo, 10), Snr1 = Math.Round(dto.Snr, 1), YbMainDto = Math.Round(dto.YbMainDto, 10), YbAdja1Dto = Math.Round(dto.YbAdjaDto, 10), YbMainDfo = Math.Round(dto.YbMainDfo, 10), YbAdja1Dfo = Math.Round(dto.YbAdjaDfo, 10), TarFreqUp = dto.TarFreqUp, TarFreqDown = dto.TarFreqDown, RefFreqUp = dto.RefFreqUp, RefFreqDown = dto.RefFreqDown, StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.AdjaCode, TaskID = runTask.ID, MainX = dto.MainX, MainY = dto.MainY, MainZ = dto.MainZ, MainVx = dto.MainVx, MainVy = dto.MainVy, MainVz = dto.MainVz, Adja1X = dto.AdjaX, Adja1Y = dto.AdjaY, Adja1Z = dto.AdjaZ, Adja1Vx = dto.AdjaVx, Adja1Vy = dto.AdjaVy, Adja1Vz = dto.AdjaVz, }); var res = PosApi.X2_PosDtoDfo(cgRes, StationRes, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = cgRes.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X2Dfo, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, null)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } /// /// 双星时频差带参定位(无星历) /// /// 返回定位结果ID [HttpPost] public async Task> PosX2DtoDfoNoXlAsync(X2DtoDfoNoXlPosDto dto) { TaskInfo runTask; using (MySqlContext db = new MySqlContext()) { if (dto.TaskID == null) { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group && p.PosType == EnumPosType.X2Dfo && p.TaskState == EnumTaskState.Running); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"接收到双星时频差带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位"); return Error($"多模式融合定位平台没有启动双星时频差定位任务"); } } else { runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID); if (runTask == null) { XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}"); return Error($"找不到ID={dto.TaskID}的任务"); } } } var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime); if (xl1 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!"); return Error($"系统缺少编号{dto.MainCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime); if (xl2 == null) { XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!"); return Error($"系统缺少编号{dto.AdjaCode}卫星的星历!"); } XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算"); var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime }; var ephMain = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto); if (ephMain.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}"); return Error($"推算卫星{dto.MainCode}的ECEF星历出错"); } var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime }; var ephAdja = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2); if (ephAdja.code != 200) { XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}"); return Error($"推算卫星{dto.AdjaCode}的ECEF星历出错"); } using (MySqlContext db = new MySqlContext()) { var StationRes = db.StationRes.Add(new StationRes() { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, SigTime = dto.SigTime, }); var ckRes = new CheckRes() { SigTime = dto.SigTime, FileName = dto.CheckRes?.FileName, SmpStart = dto.CheckRes?.SmpStart, SmpCount = dto.CheckRes?.SmpCount, PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType, ModRate = dto.CheckRes?.ModRate, ModType = dto.CheckRes?.ModType, UserName = dto.CheckRes?.UserName, FfcHz = dto.CheckRes?.FfcHz, Snr = dto.CheckRes?.Snr }; db.CheckRes.Add(ckRes); var cgRes = db.CgRes.Add(new CgRes() { SigTime = dto.SigTime, Dto1 = Math.Round(dto.Dto, 10), Dfo1 = Math.Round(dto.Dfo, 10), Snr1 = Math.Round(dto.Snr, 1), YbMainDto = Math.Round(dto.YbMainDto, 10), YbAdja1Dto = Math.Round(dto.YbAdjaDto, 10), YbMainDfo = Math.Round(dto.YbMainDfo, 10), YbAdja1Dfo = Math.Round(dto.YbAdjaDfo, 10), TarFreqUp = dto.TarFreqUp, TarFreqDown = dto.TarFreqDown, RefFreqUp = dto.RefFreqUp, RefFreqDown = dto.RefFreqDown, StationResID = StationRes.ID, MainCode = dto.MainCode, Adja1Code = dto.AdjaCode, MainXlTime = ephMain.data.TleTime, Adja1XlTime = ephAdja.data.TleTime, TaskID = runTask.ID, MainX = ephMain.data.X, MainY = ephMain.data.Y, MainZ = ephMain.data.Z, MainVx = ephMain.data.VX, MainVy = ephMain.data.VY, MainVz = ephMain.data.VZ, Adja1X = ephAdja.data.X, Adja1Y = ephAdja.data.Y, Adja1Z = ephAdja.data.Z, Adja1Vx = ephAdja.data.VX, Adja1Vy = ephAdja.data.VY, Adja1Vz = ephAdja.data.VZ, }); var res = PosApi.X2_PosDtoDfo(cgRes, StationRes, dto.CalcConfidence); PosRes posRes = new PosRes() { FreqUpHz = (long)cgRes.TarFreqUp.Value, SigTime = dto.SigTime, TaskInfoID = runTask.ID, CgResID = cgRes.ID, CheckResID = ckRes.ID, PosLon = res[0], PosLat = res[1], MirrLon = res[3], MirrLat = res[4], Confidence = (int)res[6], PosResType = EnumPosResType.X2Dfo, }; if (dto.TheoryDfoCalc && posRes.PosLon != 999) posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold); posRes = db.PosRes.Add(posRes); var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskID); if (task != null) { if (task.MaxSigTime == null || task.MaxSigTime < dto.SigTime) task.MaxSigTime = dto.SigTime; if (task.MinSigTime == null || task.MinSigTime > dto.SigTime) task.MinSigTime = dto.SigTime; db.Entry(task).State = EntityState.Modified; } await db.SaveChangesAsync(); Messenger.Defalut.Pub("新增定位点", MapModel(posRes, cgRes, ckRes, null)); return Success(MapDto(posRes, cgRes, ckRes.UserName)); } } #endregion private PosResDto MapDto(PosRes res, CgRes cg, string user) { var tmp = 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, Snr1 = cg?.Snr1, UserName = user }; if (cg.Snr2 != null) tmp.Snr2 = cg.Snr2; else tmp.Snr2 = cg.SnrCdb; return tmp; } private ModelPosRes MapModel(PosRes res, CgRes cg, CheckRes ck, TargetInfo tar) { var model = new ModelPosRes() { ID = res.ID, FreqUpHz = res.FreqUpHz, SigTime = res.SigTime, TaskInfoID = res.TaskInfoID, PosLon = res.PosLon, PosLat = res.PosLat, MirrLon = res.MirrLon, MirrLat = res.MirrLat, TargetState = res.TargetState, PosResType = res.PosResType, CgResID = res.CgResID, CheckRes = res.CheckRes, CheckResID = res.CheckResID, ColorKey = tar?.TargeColor, CreateTime = res.CreateTime, CxResID = res.CxResID, StationResID = res.StationResID, TargetInfo = tar, TargetInfoID = tar?.ID, UpdateTime = res.UpdateTime, Confidence = res.Confidence, UserName = ck.UserName, PosCheckType = ck.PosCheckType, Snr1 = cg.Snr1, Snr2 = cg.Snr2, SnrCdb = cg.SnrCdb, TargetName = tar?.TargetName, }; if (model.Snr2 == null && model.SnrCdb != null) { model.Snr2 = model.SnrCdb; } return model; } } }