using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; using DW5S.DTO; using DW5S.Repostory; using System.IO; using DW5S.Entity; using DW5S.WebApi; using System.Diagnostics; using System.Configuration; using Microsoft.AspNetCore.Mvc; using Serilog; using DW5S.KxcApi; namespace DW5S.Controllers { /// /// 定位功能相关接口 /// public class PosController : BaseController { ILogger logger { get; set; } IUnitOfWork unitOfWork { get; set; } #region 一星一地测向定位 /// /// 一星一地测向带参定位 /// /// [HttpPost] public async Task PosX1D1Async(X1D1PosDto dto) { TargetInfo target = null; var repsTask = unitOfWork.Of(); var runTask = await repsTask.GetByIdAsync(dto.TaskID); if (runTask == null) { string msg = $"找不到任务,ID={dto.TaskID}"; logger.Error(msg); return Error(msg); } if (!string.IsNullOrWhiteSpace(dto.Target)) { var repsTarget = unitOfWork.Of(); target = await repsTarget.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim()); target ??= await repsTarget.AddOrUpdateAsync(new TargetInfo() { TargetName = dto.Target.Trim(), TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim()) }); } var ephMain = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), new SatDto { SatCode = dto.MainCode, SigTime = dto.SigTime }); if (ephMain.code != 200) { logger.Error(ephMain.msg); return Error(ephMain.msg); } //采集结果 List adres = new List() { dto.AdRes.First(p => p.SatCode == dto.MainCode),//主星采集结果 dto.AdRes.First(p => p.SatCode == dto.Adja1Code) };//超短站某个方向采集结果 var repsAdRes = unitOfWork.OfLong(); List adIds = new List(); foreach (var adRes in adres) { var adItem = await repsAdRes.AddOrUpdateAsync(new AdRes { SatCode = dto.MainCode, RealFileCreateTime = adRes.RealFileCreateTime, FileTime = adRes.FileTime, RealFileUpdateTime = adRes.RealFileUpdateTime, Ch = adRes.Ch, FileSeconds = adRes.FileSeconds, FreqCenter = adRes.FreqCenter, FreqdownHz = adRes.FreqdownHz, FrequpHz = adRes.FrequpHz, FsHz = adRes.FsHz, HttpFile = adRes.HttpFile, SigTime = dto.SigTime, RecTxInfoID = adRes.RecTxInfoID, RecStationName = adRes.RecStationName, FileSize = adRes.FileSize, RealFileSize = adRes.RealFileSize, FileErrorMsg = adRes.FileErrorMsg, }); adIds.Add(adItem.Id); } var repsStationRes = unitOfWork.OfLong(); var stationRes = await repsStationRes.AddOrUpdateAsync(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, }); var repsCheckRes = unitOfWork.OfLong(); var ckRes = await repsCheckRes.AddOrUpdateAsync(new CheckRes { HttpFile = 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 }); var repsCgRes = unitOfWork.OfLong(); var cgRes = await repsCgRes.AddOrUpdateAsync(new CgRes { SigTime = dto.SigTime, FrequpHz = dto.FrequpHz, FreqdownHz = dto.FreqdownHz, Dto1 = Math.Round(dto.XdDto, 3), Dfo1 = Math.Round(dto.XdDfo, 3), Snr1 = Math.Round(dto.XdSnr, 1), Dto2 = null, Dfo2 = null, Snr2 = null, StationResID = stationRes.Id, MainCode = dto.MainCode, Adja1Code = dto.Adja1Code, Adja2Code = null, MainXlTime = ephMain.data.TleTime, Adja1XlTime = null, TaskID = runTask.Id, MainX = ephMain.data.X, MainY = ephMain.data.Y, MainZ = ephMain.data.Z, Adja1X = null, Adja1Y = null, Adja1Z = null, CheckResID = ckRes.Id, SigInfoID = dto.SigInfoID, AdResId1 = adIds[0], AdResId2 = adIds[1], AdResId3 = null, }); var repsCxRes = unitOfWork.OfLong(); var cxRes = await repsCxRes.AddOrUpdateAsync(new CxRes() { SigTime = dto.SigTime, Fx = dto.CxRes, }); var res = PosApi.X1D1_Pos(cgRes, stationRes, cxRes, dto.CalcConfidence); var repsPosRes = unitOfWork.OfLong(); var posRes = await repsPosRes.AddOrUpdateAsync(new PosRes { FrequpHz = cgRes.FrequpHz, FreqdownHz = cgRes.FreqdownHz, SigTime = dto.SigTime, TaskID = 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.X1D1CX, TargetInfoID = target?.Id, SigInfoID = dto.SigInfoID, StationResID = stationRes.Id, CxResID = cxRes.Id, }); await unitOfWork.SaveAsync(); //await unitOfWork.DisposeAsync();//依赖注入的对象在容器销毁时自动释放 Messenger.Defalut.Pub("新增定位点", MapModel(posRes)); return Success(); } #endregion #region 两星一地定位 /// /// 两星一地带参定位 /// /// [HttpPost] public async Task PosX2D1Async(X2D1PosDto dto) { TargetInfo target = null; var repsTask = unitOfWork.Of(); var runTask = await repsTask.GetByIdAsync(dto.TaskID); if (runTask == null) { string msg = $"找不到任务,ID={dto.TaskID}"; logger.Error(msg); return Error(msg); } if (!string.IsNullOrWhiteSpace(dto.Target)) { var repsTarget = unitOfWork.Of(); target = await repsTarget.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim()); target ??= await repsTarget.AddOrUpdateAsync(new TargetInfo() { TargetName = dto.Target.Trim(), TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim()) }); } var ephMain = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), new SatDto { SatCode = dto.MainCode, SigTime = dto.SigTime }); if (ephMain.code != 200) { logger.Error(ephMain.msg); return Error(ephMain.msg); } var ephAdja = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), new SatDto { SatCode = dto.Adja1Code, SigTime = dto.SigTime }); if (ephAdja.code != 200) { logger.Error(ephAdja.msg); return Error(ephAdja.msg); } //#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); //采集结果 List adres = new List() { dto.AdRes.First(p => p.SatCode == dto.MainCode),//主星采集结果 dto.AdRes.First(p => p.SatCode == dto.Adja1Code),//邻1星采集结果 dto.AdRes.First(p => p.SatCode == dto.Adja2Code) };//超短站某个方向采集结果 var repsAdRes = unitOfWork.OfLong(); List adIds = new List(); foreach (var adRes in adres) { var adItem = await repsAdRes.AddOrUpdateAsync(new AdRes { SatCode = dto.MainCode, RealFileCreateTime = adRes.RealFileCreateTime, FileTime = adRes.FileTime, RealFileUpdateTime = adRes.RealFileUpdateTime, Ch = adRes.Ch, FileSeconds = adRes.FileSeconds, FreqCenter = adRes.FreqCenter, FreqdownHz = adRes.FreqdownHz, FrequpHz = adRes.FrequpHz, FsHz = adRes.FsHz, HttpFile = adRes.HttpFile, SigTime = dto.SigTime, RecTxInfoID = adRes.RecTxInfoID, RecStationName = adRes.RecStationName, FileSize = adRes.FileSize, RealFileSize = adRes.RealFileSize, FileErrorMsg = adRes.FileErrorMsg, }); adIds.Add(adItem.Id); } //站点信息 var repsStationRes = unitOfWork.OfLong(); var stationRes = await repsStationRes.AddOrUpdateAsync(new StationRes { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, CdbTxLon = dto.CdbTxLon, CdbTxLat = dto.CdbTxLat, RefLon = dto.RefLon, RefLat = dto.RefLat, }); //检测结果 var repsCheckRes = unitOfWork.OfLong(); var ckRes = await repsCheckRes.AddOrUpdateAsync(new CheckRes { HttpFile = 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, }); //参估结果 var repsCgRes = unitOfWork.OfLong(); var cgRes = await repsCgRes.AddOrUpdateAsync(new CgRes { SigTime = dto.SigTime, FrequpHz = dto.FrequpHz, FreqdownHz = dto.FreqdownHz, Dto1 = Math.Round(dto.SxDto, 10), Dfo1 = Math.Round(dto.SxDfo, 10), Snr1 = Math.Round(dto.SxSnr, 1), Dto2 = Math.Round(dto.XdDto, 10), Dfo2 = Math.Round(dto.XdDfo, 10), Snr2 = Math.Round(dto.XdSnr, 1), StationResID = stationRes.Id, MainCode = dto.MainCode, Adja1Code = dto.Adja1Code, Adja2Code = dto.Adja2Code, 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, CheckResID = ckRes.Id, SigInfoID = dto.SigInfoID, AdResId1 = adIds[0], AdResId2 = adIds[1], AdResId3 = adIds[2], }); //定位结果 var res = PosApi.X2D1_Pos(cgRes, stationRes, dto.CalcConfidence); var repsPosRes = unitOfWork.OfLong(); var posRes = await repsPosRes.AddOrUpdateAsync(new PosRes { FrequpHz = cgRes.FrequpHz, FreqdownHz = cgRes.FreqdownHz, SigTime = dto.SigTime, TaskID = 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, TargetInfoID = target?.Id, SigInfoID = dto.SigInfoID, StationResID = stationRes.Id, }); await unitOfWork.SaveAsync(); //await unitOfWork.DisposeAsync();//依赖注入的对象在容器销毁时自动释放 Messenger.Defalut.Pub("新增定位点", MapModel(posRes)); return Success(); } /// /// 两星一地无参定位 /// /// [HttpPost] public async Task PosX2D1NoParAsync(X2D1NoRefPosDto dto) { TargetInfo target = null; var repsTask = unitOfWork.Of(); var runTask = await repsTask.GetByIdAsync(dto.TaskID); if (runTask == null) { string msg = $"找不到任务,ID={dto.TaskID}"; logger.Error(msg); return Error(msg); } if (!string.IsNullOrWhiteSpace(dto.Target)) { var repsTarget = unitOfWork.Of(); target = await repsTarget.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim()); target ??= await repsTarget.AddOrUpdateAsync(new TargetInfo() { TargetName = dto.Target.Trim(), TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim()) }); } var ephMain = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), new SatDto { SatCode = dto.MainCode, SigTime = dto.SigTime }); if (ephMain.code != 200) { logger.Error(ephMain.msg); return Error(ephMain.msg); } var ephAdja = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), new SatDto { SatCode = dto.Adja1Code, SigTime = dto.SigTime }); if (ephAdja.code != 200) { logger.Error(ephAdja.msg); return Error(ephAdja.msg); } //#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); //采集结果 List adres = new List() { dto.AdRes.First(p => p.SatCode == dto.MainCode),//主星采集结果 dto.AdRes.First(p => p.SatCode == dto.Adja1Code),//邻1星采集结果 dto.AdRes.First(p => p.SatCode == dto.Adja2Code) };//超短站某个方向采集结果 var repsAdRes = unitOfWork.OfLong(); List adIds = new List(); foreach (var adRes in adres) { var adItem = await repsAdRes.AddOrUpdateAsync(new AdRes { SatCode = dto.MainCode, RealFileCreateTime = adRes.RealFileCreateTime, FileTime = adRes.FileTime, RealFileUpdateTime = adRes.RealFileUpdateTime, Ch = adRes.Ch, FileSeconds = adRes.FileSeconds, FreqCenter = adRes.FreqCenter, FreqdownHz = adRes.FreqdownHz, FrequpHz = adRes.FrequpHz, FsHz = adRes.FsHz, HttpFile = adRes.HttpFile, SigTime = dto.SigTime, RecTxInfoID = adRes.RecTxInfoID, RecStationName = adRes.RecStationName, FileSize = adRes.FileSize, RealFileSize = adRes.RealFileSize, FileErrorMsg = adRes.FileErrorMsg, }); adIds.Add(adItem.Id); } //站点信息 var repsStationRes = unitOfWork.OfLong(); var stationRes = await repsStationRes.AddOrUpdateAsync(new StationRes { SatTxLon = dto.SatTxLon, SatTxLat = dto.SatTxLat, CdbTxLon = dto.CdbTxLon, CdbTxLat = dto.CdbTxLat, }); //检测结果 var repsCheckRes = unitOfWork.OfLong(); var ckRes = await repsCheckRes.AddOrUpdateAsync(new CheckRes { HttpFile = 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 }); //参估结果 var repsCgRes = unitOfWork.OfLong(); var cgRes = await repsCgRes.AddOrUpdateAsync(new CgRes { SigTime = dto.SigTime, FrequpHz = dto.FrequpHz, FreqdownHz = dto.FreqdownHz, Dto1 = Math.Round(dto.SxDto, 10), Dfo1 = Math.Round(dto.SxDfo, 10), Snr1 = Math.Round(dto.SxSnr, 1), Dto2 = Math.Round(dto.XdDto, 10), Dfo2 = Math.Round(dto.XdDfo, 10), Snr2 = Math.Round(dto.XdSnr, 1), StationResID = stationRes.Id, MainCode = dto.MainCode, Adja1Code = dto.Adja1Code, Adja2Code = dto.Adja2Code, 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, CheckResID = ckRes.Id, SigInfoID = dto.SigInfoID, AdResId1 = adIds[0], AdResId2 = adIds[1], AdResId3 = adIds[2], }); //定位结果 var res = PosApi.X2D1_PosNoRef_ZL(cgRes, stationRes, dto.CalcConfidence); var repsPosRes = unitOfWork.OfLong(); var posRes = await repsPosRes.AddOrUpdateAsync(new PosRes { FrequpHz = cgRes.FrequpHz, FreqdownHz = cgRes.FreqdownHz, SigTime = dto.SigTime, TaskID = 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, TargetInfoID = target?.Id, SigInfoID = dto.SigInfoID, StationResID = stationRes.Id, }); await unitOfWork.SaveAsync(); //await unitOfWork.DisposeAsync();//依赖注入的对象在容器销毁时自动释放 Messenger.Defalut.Pub("新增定位点", MapModel(posRes)); return Success(); } #endregion private object MapModel(PosRes res) { return res; //return 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 = res.ColorKey, // CreateTime = res.CreateTime, // CxResID = res.CxResID, // StationResID = res.StationResID, // TargetInfo = res.TargetInfo, // TargetInfoID = res.TargetInfoID, // UpdateTime = res.UpdateTime, // Confidence = res.Confidence, //}; } } }