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,
//};
}
}
}