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