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(X1D1NoXlPosDto dto)
{
TaskInfo runTask;
var repsTask = unitOfWork.Of();
if (dto.TaskID == null)
{
runTask = await repsTask.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running);
if (runTask == null)
{
string msg = $"接收到一星一地测向带参定位参数,由于找不到执行中的任务忽略本次定位";
logger.Error(msg);
return Error(msg);
}
}
else
{
runTask = await repsTask.GetByIdAsync(dto.TaskID);
if (runTask == null)
{
string msg = $"找不到任务,ID={dto.TaskID}";
logger.Error(msg);
return Error(msg);
}
}
var repsXl = unitOfWork.Of() as XlRepository;
var xl1 = await repsXl.GetLatestAsync(dto.MainCode, dto.SigTime);
if (xl1 == null)
{
string msg = $"系统缺少编号{dto.MainCode}卫星的星历!";
logger.Error(msg);
return Error(msg);
}
logger.Information($"卫星{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)
{
string msg = $"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}";
logger.Error(msg);
return Error(msg);
}
var repsStationRes = unitOfWork.Of();
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.Of();
var ckRes = await repsCheckRes.AddOrUpdateAsync(new CheckRes
{
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
});
var repsCgRes = unitOfWork.Of();
var cgRes = await repsCgRes.AddOrUpdateAsync(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 repsCxRes = unitOfWork.Of();
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.Of();
var posRes = await repsPosRes.AddOrUpdateAsync(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,
});
await unitOfWork.SaveAsync();
//await unitOfWork.DisposeAsync();//依赖注入的对象在容器销毁时自动释放
Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
return Success();
}
#endregion
#region 两星一地定位
///
/// 两星一地带参定位
///
///
[HttpPost]
public async Task PosX2D1Async(X2D1NoXlPosDto dto)
{
TargetInfo target = null;
TaskInfo runTask;
var repsTask = unitOfWork.Of();
if (dto.TaskID == null)
{
runTask = await repsTask.FirstOrDefaultAsync(p =>p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
if (runTask == null)
{
string msg = $"接收到两星一地带参定位参数,由于找不到执行中的任务忽略本次定位";
logger.Error(msg);
return Error(msg);
}
}
else
{
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());
if (target == null)
{
target = await repsTarget.AddOrUpdateAsync(new TargetInfo()
{
TargetName = dto.Target.Trim(),
TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim())
});
}
}
var repsXl = unitOfWork.Of() as XlRepository;
var xl1 = await repsXl.GetLatestAsync(dto.MainCode, dto.SigTime);
if (xl1 == null)
{
string msg = $"系统缺少编号{dto.MainCode}卫星的星历!";
logger.Error(msg);
return Error(msg);
}
logger.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
var xl2 = await repsXl.GetLatestAsync(dto.AdjaCode, dto.SigTime);
if (xl2 == null)
{
string msg = $"系统缺少编号{dto.AdjaCode}卫星的星历!";
logger.Error(msg);
return Error(msg);
}
logger.Information($"卫星{dto.AdjaCode}使用发布时刻为{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)
{
string msg = $"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}";
logger.Error(msg);
return Error(msg);
}
var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
var ephAdja = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
if (ephAdja.code != 200)
{
string msg = $"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}";
logger.Error(msg);
return Error(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);
var repsStationRes = unitOfWork.Of();
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.Of();
var ckRes = await repsCheckRes.AddOrUpdateAsync(new CheckRes
{
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
});
var repsCgRes = unitOfWork.Of();
var cgRes = await repsCgRes.AddOrUpdateAsync(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.CalcConfidence);
var repsPosRes = unitOfWork.Of();
var posRes = await repsPosRes.AddOrUpdateAsync(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,
TargetInfoID = target?.Id
});
await unitOfWork.SaveAsync();
//await unitOfWork.DisposeAsync();//依赖注入的对象在容器销毁时自动释放
Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
return Success();
}
///
/// 两星一地无参定位
///
///
[HttpPost]
public async Task PosX2D1NoParAsync(X2D1NoXlNoParlPosDto dto)
{
TargetInfo target = null;
TaskInfo runTask;
var repsTask = unitOfWork.Of();
if (dto.TaskID == null)
{
runTask = await repsTask.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
if (runTask == null)
{
string msg = $"接收到两星一地无参定位参数,由于找不到执行中的任务忽略本次定位";
logger.Error(msg);
return Error(msg);
}
}
else
{
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());
if (target == null)
{
target = await repsTarget.AddOrUpdateAsync(new TargetInfo()
{
TargetName = dto.Target.Trim(),
TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim())
});
}
}
var repsXl = unitOfWork.Of() as XlRepository;
var xl1 = await repsXl.GetLatestAsync(dto.MainCode, dto.SigTime);
if (xl1 == null)
{
string msg = $"系统缺少编号{dto.MainCode}卫星的星历!";
logger.Error(msg);
return Error(msg);
}
logger.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
var xl2 = await repsXl.GetLatestAsync(dto.AdjaCode, dto.SigTime);
if (xl2 == null)
{
string msg = $"系统缺少编号{dto.AdjaCode}卫星的星历!";
logger.Error(msg);
return Error(msg);
}
logger.Information($"卫星{dto.AdjaCode}使用发布时刻为{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)
{
string msg = $"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}";
logger.Error(msg);
return Error(msg);
}
var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
var ephAdja = await HttpHelper.PostRequestAsync(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
if (ephAdja.code != 200)
{
string msg = $"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}";
logger.Error(msg);
return Error(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);
var repsStationRes = unitOfWork.Of();
var stationRes = await repsStationRes.AddOrUpdateAsync(new StationRes
{
SatTxLon = dto.SatTxLon,
SatTxLat = dto.SatTxLat,
CdbTxLon = dto.CdbTxLon,
CdbTxLat = dto.CdbTxLat,
});
var repsCheckRes = unitOfWork.Of();
var ckRes = await repsCheckRes.AddOrUpdateAsync(new CheckRes
{
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
});
var repsCgRes = unitOfWork.Of();
var cgRes = await repsCgRes.AddOrUpdateAsync(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,
});
var res = PosApi.X2D1_PosNoRef_ZL(cgRes, stationRes, dto.CalcConfidence);
var repsPosRes = unitOfWork.Of();
var posRes = await repsPosRes.AddOrUpdateAsync(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,
TargetInfoID = target?.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,
//};
}
}
}