using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Data.SQLite;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using Newtonsoft.Json;
using Serilog;
using Swashbuckle.Swagger;
using XdCxRhDw.Dto;
using XdCxRhDW.App.Api;
using XdCxRhDW.Core.Api;
using XdCxRhDW.Core.ObServer;
using XdCxRhDW.Core;
using XdCxRhDW.Dto;
using XdCxRhDW.Repostory.EFContext;
using XdCxRhDW.Repostory.Model;
using XdCxRhDW.WebApi.Controllers;
using System.ComponentModel.DataAnnotations;
namespace XdCxRhDW.App.WebAPI
{
    /// 
    /// 定位功能相关接口
    /// 
    public class PosController : BaseController
    {
        #region 一星一地测向定位
        /// 
        /// 一星一地测向带参定位(含星历)
        /// 
        /// 定位参数
        /// 
        [HttpPost]
        public async Task> PosX1D1Async(X1D1PosDto dto)
        {
            TaskInfo runTask;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running);
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到一星一地测向带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动一星一地测向定位任务");
                }
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                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,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    DtoCdb = dto.XdDto,
                    DfoCdb = dto.XdDfo,
                    SnrCdb = dto.XdSnr,
                    YbMainDto = dto.MainYbDto,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    MainX = dto.MainX,
                    MainY = dto.MainY,
                    MainZ = dto.MainZ,
                });
                var cxRes = db.CxRes.Add(new CxRes()
                {
                    SigTime = dto.SigTime,
                    Fx = dto.CxRes,
                });
                var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = cgRes.SigTime,
                    TaskInfoID = runTask.ID,
                    CxResID = cxRes.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X1D1CX,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        /// 
        /// 一星一地测向带参定位(无星历)
        /// 
        /// 返回定位结果ID
        [HttpPost]
        public async Task> PosX1D1NoXlAsync(X1D1NoXlPosDto dto)
        {
            TaskInfo runTask;
            SysSetings settings;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X1D1CX).FirstOrDefaultAsync();
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到一星一地带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动一星一地定位任务");
                }
                settings = await db.SysSetings.FirstOrDefaultAsync();
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
                var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
                var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync();
                if (xlInfo1 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                }
                Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
                var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
                string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
                var ephMain = await HttpHelper.PostRequestAsync(url, XlCalcDto);
                if (ephMain.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
                    return Error($"推算[{dto.MainCode}]的星历出错");
                }
                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,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    DtoCdb = dto.XdDto,
                    DfoCdb = dto.XdDfo,
                    SnrCdb = dto.XdSnr,
                    YbMainDto = dto.MainYbDto,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    MainX = ephMain.data.X,
                    MainY = ephMain.data.Y,
                    MainZ = ephMain.data.Z,
                });
                var cxRes = db.CxRes.Add(new CxRes()
                {
                    SigTime = dto.SigTime,
                    Fx = dto.CxRes,
                });
                var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = dto.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X1D1CX,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        #endregion
        #region  两星一地定位
        /// 
        /// 两星一地带参定位(含星历)
        /// 
        /// 定位参数
        /// 
        [HttpPost]
        public async Task> PosX2D1Async(X2D1PosDto dto)
        {
            TaskInfo runTask;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到两星一地带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动两星一地定位任务");
                }
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                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,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.SxDto,
                    Dfo1 = dto.SxDfo,
                    Snr1 = dto.SxSnr,
                    DtoCdb = dto.XdDto,
                    DfoCdb = dto.XdDfo,
                    SnrCdb = dto.XdSnr,
                    YbMainDto = dto.MainYbDto,
                    YbAdja1Dto = dto.AdjaYbDto,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.AdjaCode,
                    MainX = dto.MainX,
                    MainY = dto.MainY,
                    MainZ = dto.MainZ,
                    Adja1X = dto.AdjaX,
                    Adja1Y = dto.AdjaY,
                    Adja1Z = dto.AdjaZ,
                });
                var res = PosApi.X2D1_Pos(cgRes, StationRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = cgRes.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X2D1,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        /// 
        /// 两星一地带参定位(无星历)
        /// 
        /// 返回定位结果ID
        [HttpPost]
        public async Task> PosX2D1NoXlAsync(X2D1NoXlPosDto dto)
        {
            TaskInfo runTask;
            SysSetings settings;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2D1).FirstOrDefaultAsync();
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到两星一地带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动两星一地定位任务");
                }
                settings = await db.SysSetings.FirstOrDefaultAsync();
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
                var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
                var parameter3 = new SQLiteParameter("@satcode", dto.AdjaCode);
                var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync();
                if (xlInfo1 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                }
                var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync();
                if (xlInfo2 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
                }
                Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
                Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
                string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
                var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
                var ephMain = await HttpHelper.PostRequestAsync(url, XlCalcDto);
                if (ephMain.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
                    return Error($"推算[{dto.MainCode}]的星历出错");
                }
                var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
                var ephAdja = await HttpHelper.PostRequestAsync(url, XlCalcDto2);
                if (ephAdja.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
                    return Error($"推算[{dto.MainCode}]的星历出错");
                }
                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,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.SxDto,
                    Dfo1 = dto.SxDfo,
                    Snr1 = dto.SxSnr,
                    DtoCdb = dto.XdDto,
                    DfoCdb = dto.XdDfo,
                    SnrCdb = dto.XdSnr,
                    YbMainDto = dto.MainYbDto,
                    YbAdja1Dto = dto.AdjaYbDto,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.AdjaCode,
                    MainX = ephMain.data.X,
                    MainY = ephMain.data.Y,
                    MainZ = ephMain.data.Z,
                    Adja1X = ephAdja.data.X,
                    Adja1Y = ephAdja.data.Y,
                    Adja1Z = ephAdja.data.Z,
                });
                var res = PosApi.X2D1_Pos(cgRes, StationRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = dto.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X2D1,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        /// 
        /// 两星一地无参定位(含星历)
        /// 
        /// 定位参数
        /// 
        [HttpPost]
        public async Task> PosX2D1NoParAsync(X2D1NoParPosDto dto)
        {
            TaskInfo runTask;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到两星一地无参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动两星一地定位任务");
                }
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var StationRes = db.StationRes.Add(new StationRes()
                {
                    SatTxLon = dto.SatTxLon,
                    SatTxLat = dto.SatTxLat,
                    CdbTxLon = dto.CdbTxLon,
                    CdbTxLat = dto.CdbTxLat,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.SxDto,
                    Dfo1 = dto.SxDfo,
                    Snr1 = dto.SxSnr,
                    DtoCdb = dto.XdDto,
                    DfoCdb = dto.XdDfo,
                    SnrCdb = dto.XdSnr,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.AdjaCode,
                    MainX = dto.MainX,
                    MainY = dto.MainY,
                    MainZ = dto.MainZ,
                    Adja1X = dto.AdjaX,
                    Adja1Y = dto.AdjaY,
                    Adja1Z = dto.AdjaZ,
                });
                var res = PosApi.X2D1_PosNoRef(cgRes, StationRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = cgRes.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X2D1NoRef,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        /// 
        /// 两星一地无参定位(无星历)
        /// 
        /// 返回定位结果ID
        [HttpPost]
        public async Task> PosX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto)
        {
            TaskInfo runTask;
            SysSetings settings;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2D1).FirstOrDefaultAsync();
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到两星一地无参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动两星一地定位任务");
                }
                settings = await db.SysSetings.FirstOrDefaultAsync();
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
                var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
                var parameter3 = new SQLiteParameter("@satcode", dto.AdjaCode);
                var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync();
                if (xlInfo1 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                }
                var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync();
                if (xlInfo2 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
                }
                Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
                Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
                string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
                var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
                var ephMain = await HttpHelper.PostRequestAsync(url, XlCalcDto);
                if (ephMain.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
                    return Error($"推算[{dto.MainCode}]的星历出错");
                }
                var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
                var ephAdja = await HttpHelper.PostRequestAsync(url, XlCalcDto2);
                if (ephAdja.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.AdjaCode}]的星历出错");
                    return Error($"推算[{dto.AdjaCode}]的星历出错");
                }
                var StationRes = db.StationRes.Add(new StationRes()
                {
                    SatTxLon = dto.SatTxLon,
                    SatTxLat = dto.SatTxLat,
                    CdbTxLon = dto.CdbTxLon,
                    CdbTxLat = dto.CdbTxLat,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.SxDto,
                    Dfo1 = dto.SxDfo,
                    Snr1 = dto.SxSnr,
                    DtoCdb = dto.XdDto,
                    DfoCdb = dto.XdDfo,
                    SnrCdb = dto.XdSnr,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.AdjaCode,
                    MainX = ephMain.data.X,
                    MainY = ephMain.data.Y,
                    MainZ = ephMain.data.Z,
                    Adja1X = ephAdja.data.X,
                    Adja1Y = ephAdja.data.Y,
                    Adja1Z = ephAdja.data.Z,
                });
                var res = PosApi.X2D1_PosNoRef(cgRes, StationRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = dto.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X2D1NoRef,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        #endregion
        #region 融合定位
        /// 
        /// 融合带参定位(含星历)
        /// 
        /// 定位参数
        /// 
        [HttpPost]
        public async Task> PosRhAsync(RHPosDto dto)
        {
            TaskInfo runTask;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running);
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到融合带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动融合定位任务");
                }
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                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,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.SxDto,
                    Dfo1 = dto.SxDfo,
                    Snr1 = dto.SxSnr,
                    DtoCdb = dto.XdDto,
                    DfoCdb = dto.XdDfo,
                    SnrCdb = dto.XdSnr,
                    YbMainDto = dto.MainYbDto,
                    YbAdja1Dto = dto.AdjaYbDto,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.AdjaCode,
                    MainX = dto.MainX,
                    MainY = dto.MainY,
                    MainZ = dto.MainZ,
                    Adja1X = dto.AdjaX,
                    Adja1Y = dto.AdjaY,
                    Adja1Z = dto.AdjaZ,
                });
                var cxRes = db.CxRes.Add(new CxRes()
                {
                    SigTime = dto.SigTime,
                    Fx = dto.CxRes,
                });
                var res = PosApi.RH_Pos(cgRes, StationRes, cxRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = cgRes.SigTime,
                    TaskInfoID = runTask.ID,
                    CxResID = cxRes.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.RH,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        /// 
        /// 融合带参定位(无星历)
        /// 
        /// 返回定位结果ID
        [HttpPost]
        public async Task> PosRhNoXlAsync(RHNoXlPosDto dto)
        {
            TaskInfo runTask;
            SysSetings settings;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.RH).FirstOrDefaultAsync();
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到融合带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动融合定位任务");
                }
                settings = await db.SysSetings.FirstOrDefaultAsync();
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
                var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
                var parameter3 = new SQLiteParameter("@satcode", dto.AdjaCode);
                var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync();
                if (xlInfo1 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                }
                var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync();
                if (xlInfo2 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
                }
                Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
                Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
                string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
                var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
                var ephMain = await HttpHelper.PostRequestAsync(url, XlCalcDto);
                if (ephMain.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
                    return Error($"推算[{dto.MainCode}]的星历出错");
                }
                var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
                var ephAdja = await HttpHelper.PostRequestAsync(url, XlCalcDto2);
                if (ephAdja.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.AdjaCode}]的星历出错");
                    return Error($"推算[{dto.AdjaCode}]的星历出错");
                }
                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,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.SxDto,
                    Dfo1 = dto.SxDfo,
                    Snr1 = dto.SxSnr,
                    DtoCdb = dto.XdDto,
                    DfoCdb = dto.XdDfo,
                    SnrCdb = dto.XdSnr,
                    YbMainDto = dto.MainYbDto,
                    YbAdja1Dto = dto.AdjaYbDto,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.AdjaCode,
                    MainX = ephMain.data.X,
                    MainY = ephMain.data.Y,
                    MainZ = ephMain.data.Z,
                    Adja1X = ephAdja.data.X,
                    Adja1Y = ephAdja.data.Y,
                    Adja1Z = ephAdja.data.Z,
                });
                var cxRes = db.CxRes.Add(new CxRes()
                {
                    SigTime = dto.SigTime,
                    Fx = dto.CxRes,
                });
                var res = PosApi.RH_Pos(cgRes, StationRes, cxRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = cgRes.SigTime,
                    TaskInfoID = runTask.ID,
                    CxResID = cxRes.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.RH,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        #endregion
        #region 三星双时差定位
        /// 
        /// 三星双时差带参定位(含星历)
        /// 
        /// 定位参数
        /// 
        [HttpPost]
        public async Task> PosX3TwoDtoAsync(X3TwoDtoPosDto dto)
        {
            TaskInfo runTask;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到三星双时差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动三星双时差定位任务");
                }
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var StationRes = db.StationRes.Add(new StationRes()
                {
                    SatTxLon = dto.SatTxLon,
                    SatTxLat = dto.SatTxLat,
                    RefLon = dto.RefLon,
                    RefLat = dto.RefLat,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.Dto1,
                    Dfo1 = dto.Dfo1,
                    Snr1 = dto.Snr1,
                    Dto2 = dto.Dto2,
                    Dfo2 = dto.Dfo2,
                    Snr2 = dto.Snr2,
                    YbMainDto = dto.YbMainDto,
                    YbAdja1Dto = dto.YbAdja1Dto,
                    YbAdja2Dto = dto.YbAdja2Dto,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.Adja1Code,
                    Adja2Code = dto.Adja2Code,
                    MainX = dto.MainX,
                    MainY = dto.MainY,
                    MainZ = dto.MainZ,
                    Adja1X = dto.Adja1X,
                    Adja1Y = dto.Adja1Y,
                    Adja1Z = dto.Adja1Z,
                    Adja2X = dto.Adja2X,
                    Adja2Y = dto.Adja2Y,
                    Adja2Z = dto.Adja2Z,
                });
                var res = PosApi.X3_Pos(cgRes, StationRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = cgRes.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X3,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        /// 
        /// 三星双时差带参定位(无星历)
        /// 
        /// 返回定位结果ID
        [HttpPost]
        public async Task> PosX3TwoDtoNoXlAsync(X3TwoDtoNoXlPosDto dto)
        {
            TaskInfo runTask;
            SysSetings settings;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDto).FirstOrDefaultAsync();
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到三星双时差带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动三星双时差定位任务");
                }
                settings = await db.SysSetings.FirstOrDefaultAsync();
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
                var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
                var parameter3 = new SQLiteParameter("@satcode", dto.Adja1Code);
                var parameter4 = new SQLiteParameter("@satcode", dto.Adja2Code);
                var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync();
                if (xlInfo1 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                }
                var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync();
                if (xlInfo2 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
                    return Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
                }
                var xlInfo3 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter4).FirstOrDefaultAsync();
                if (xlInfo3 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
                    return Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
                }
                Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
                Serilog.Log.Information($"卫星{dto.Adja1Code}使用{xlInfo2.TwoLine}进行星历推算");
                Serilog.Log.Information($"卫星{dto.Adja2Code}使用{xlInfo3.TwoLine}进行星历推算");
                string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
                var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
                var ephMain = await HttpHelper.PostRequestAsync(url, XlCalcDto);
                if (ephMain.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
                    return Error($"推算[{dto.MainCode}]的星历出错");
                }
                var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
                var ephAdja1 = await HttpHelper.PostRequestAsync(url, XlCalcDto2);
                if (ephAdja1.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.Adja1Code}]的星历出错");
                    return Error($"推算[{dto.Adja1Code}]的星历出错");
                }
                var XlCalcDto3 = new XlCalcDto() { tleStr = xlInfo3.TwoLine, dt = dto.SigTime };
                var ephAdja2 = await HttpHelper.PostRequestAsync(url, XlCalcDto3);
                if (ephAdja2.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.Adja2Code}]的星历出错");
                    return Error($"推算[{dto.Adja2Code}]的星历出错");
                }
                var StationRes = db.StationRes.Add(new StationRes()
                {
                    SatTxLon = dto.SatTxLon,
                    SatTxLat = dto.SatTxLat,
                    RefLon = dto.RefLon,
                    RefLat = dto.RefLat,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.Dto1,
                    Dfo1 = dto.Dfo1,
                    Snr1 = dto.Snr1,
                    Dto2 = dto.Dto2,
                    Dfo2 = dto.Dfo2,
                    Snr2 = dto.Snr2,
                    YbMainDto = dto.YbMainDto,
                    YbAdja1Dto = dto.YbAdja1Dto,
                    YbAdja2Dto = dto.YbAdja2Dto,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.Adja1Code,
                    Adja2Code = dto.Adja2Code,
                    MainX = ephMain.data.X,
                    MainY = ephMain.data.Y,
                    MainZ = ephMain.data.Z,
                    Adja1X = ephAdja1.data.X,
                    Adja1Y = ephAdja1.data.Y,
                    Adja1Z = ephAdja1.data.Z,
                    Adja2X = ephAdja2.data.X,
                    Adja2Y = ephAdja2.data.Y,
                    Adja2Z = ephAdja2.data.Z,
                });
                var res = PosApi.X3_Pos(cgRes, StationRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = dto.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X3,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        /// 
        /// 三星双时差无参定位(含星历)
        /// 
        /// 定位参数
        /// 
        [HttpPost]
        public async Task> PosX3TwoDtoNoParAsync(X3TwoDtoNoParPosDto dto)
        {
            TaskInfo runTask;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到三星双时差无参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动三星双时差定位任务");
                }
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var StationRes = db.StationRes.Add(new StationRes()
                {
                    SatTxLon = dto.SatTxLon,
                    SatTxLat = dto.SatTxLat,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.Dto1,
                    Dfo1 = dto.Dfo1,
                    Snr1 = dto.Snr1,
                    Dto2 = dto.Dto2,
                    Dfo2 = dto.Dfo2,
                    Snr2 = dto.Snr2,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.Adja1Code,
                    Adja2Code = dto.Adja2Code,
                    MainX = dto.MainX,
                    MainY = dto.MainY,
                    MainZ = dto.MainZ,
                    Adja1X = dto.Adja1X,
                    Adja1Y = dto.Adja1Y,
                    Adja1Z = dto.Adja1Z,
                    Adja2X = dto.Adja2X,
                    Adja2Y = dto.Adja2Y,
                    Adja2Z = dto.Adja2Z,
                });
                var res = PosApi.X3_PosNoRef(cgRes, StationRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = cgRes.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X3NoRef,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        /// 
        /// 三星双时差无参定位(无星历)
        /// 
        /// 返回定位结果ID
        [HttpPost]
        public async Task> PosX3TwoDtoNoXlNoParAsync(X3TwoDtoNoXlNoParPosDto dto)
        {
            TaskInfo runTask;
            SysSetings settings;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDto).FirstOrDefaultAsync();
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到三星双时差无参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动三星双时差定位任务");
                }
                settings = await db.SysSetings.FirstOrDefaultAsync();
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
                var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
                var parameter3 = new SQLiteParameter("@satcode", dto.Adja1Code);
                var parameter4 = new SQLiteParameter("@satcode", dto.Adja2Code);
                var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync();
                if (xlInfo1 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                }
                var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync();
                if (xlInfo2 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
                    return Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
                }
                var xlInfo3 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter4).FirstOrDefaultAsync();
                if (xlInfo3 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
                    return Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
                }
                Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
                Serilog.Log.Information($"卫星{dto.Adja1Code}使用{xlInfo2.TwoLine}进行星历推算");
                Serilog.Log.Information($"卫星{dto.Adja2Code}使用{xlInfo3.TwoLine}进行星历推算");
                string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
                var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
                var ephMain = await HttpHelper.PostRequestAsync(url, XlCalcDto);
                if (ephMain.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
                    return Error($"推算[{dto.MainCode}]的星历出错");
                }
                var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
                var ephAdja1 = await HttpHelper.PostRequestAsync(url, XlCalcDto2);
                if (ephAdja1.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.Adja1Code}]的星历出错");
                    return Error($"推算[{dto.Adja1Code}]的星历出错");
                }
                var XlCalcDto3 = new XlCalcDto() { tleStr = xlInfo3.TwoLine, dt = dto.SigTime };
                var ephAdja2 = await HttpHelper.PostRequestAsync(url, XlCalcDto3);
                if (ephAdja2.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.Adja2Code}]的星历出错");
                    return Error($"推算[{dto.Adja2Code}]的星历出错");
                }
                var StationRes = db.StationRes.Add(new StationRes()
                {
                    SatTxLon = dto.SatTxLon,
                    SatTxLat = dto.SatTxLat,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.Dto1,
                    Dfo1 = dto.Dfo1,
                    Snr1 = dto.Snr1,
                    Dto2 = dto.Dto2,
                    Dfo2 = dto.Dfo2,
                    Snr2 = dto.Snr2,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.Adja1Code,
                    Adja2Code = dto.Adja2Code,
                    MainX = ephMain.data.X,
                    MainY = ephMain.data.Y,
                    MainZ = ephMain.data.Z,
                    Adja1X = ephAdja1.data.X,
                    Adja1Y = ephAdja1.data.Y,
                    Adja1Z = ephAdja1.data.Z,
                    Adja2X = ephAdja2.data.X,
                    Adja2Y = ephAdja2.data.Y,
                    Adja2Z = ephAdja2.data.Z,
                });
                var res = PosApi.X3_PosNoRef(cgRes, StationRes);
                PosRes posRes = new PosRes()
                {
                    SigTime = dto.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X3NoRef,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        #endregion
        #region 三星双频差定位
        /// 
        /// 三星双频差带参定位(含星历)
        /// 
        /// 定位参数
        /// 
        [HttpPost]
        public async Task> PosX3TwoDfoAsync(X3TwoDfoPosDto dto)
        {
            TaskInfo runTask;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDfo && p.TaskState == EnumTaskState.Running);
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到三星双频差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动三星双频差定位任务");
                }
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var StationRes = db.StationRes.Add(new StationRes()
                {
                    SatTxLon = dto.SatTxLon,
                    SatTxLat = dto.SatTxLat,
                    RefLon = dto.RefLon,
                    RefLat = dto.RefLat,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.Dto1,
                    Dfo1 = dto.Dfo1,
                    Snr1 = dto.Snr1,
                    Dto2 = dto.Dto2,
                    Dfo2 = dto.Dfo2,
                    Snr2 = dto.Snr2,
                    YbMainDfo = dto.YbMainDfo,
                    YbAdja1Dfo = dto.YbAdja1Dfo,
                    YbAdja2Dfo = dto.YbAdja2Dfo,
                    TarFreqUp = dto.TarFreqUp,
                    TarFreqDown = dto.TarFreqDown,
                    RefFreqUp = dto.RefFreqUp,
                    RefFreqDown = dto.RefFreqDown,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.Adja1Code,
                    Adja2Code = dto.Adja2Code,
                    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);
                PosRes posRes = new PosRes()
                {
                    SigTime = cgRes.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X3TwoDfo,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        /// 
        /// 三星双频差带参定位(无星历)
        /// 
        /// 返回定位结果ID
        [HttpPost]
        public async Task> PosX3TwoDfoNoXlAsync(X3TwoDfoNoXlPosDto dto)
        {
            TaskInfo runTask;
            SysSetings settings;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDfo).FirstOrDefaultAsync();
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到三星双频差带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动三星双频差定位任务");
                }
                settings = await db.SysSetings.FirstOrDefaultAsync();
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
                var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
                var parameter3 = new SQLiteParameter("@satcode", dto.Adja1Code);
                var parameter4 = new SQLiteParameter("@satcode", dto.Adja2Code);
                var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync();
                if (xlInfo1 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                }
                var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync();
                if (xlInfo2 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
                    return Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
                }
                var xlInfo3 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter4).FirstOrDefaultAsync();
                if (xlInfo3 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
                    return Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
                }
                Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
                Serilog.Log.Information($"卫星{dto.Adja1Code}使用{xlInfo2.TwoLine}进行星历推算");
                Serilog.Log.Information($"卫星{dto.Adja2Code}使用{xlInfo3.TwoLine}进行星历推算");
                string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
                var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
                var ephMain = await HttpHelper.PostRequestAsync(url, XlCalcDto);
                if (ephMain.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
                    return Error($"推算[{dto.MainCode}]的星历出错");
                }
                var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
                var ephAdja1 = await HttpHelper.PostRequestAsync(url, XlCalcDto2);
                if (ephAdja1.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.Adja1Code}]的星历出错");
                    return Error($"推算[{dto.Adja1Code}]的星历出错");
                }
                var XlCalcDto3 = new XlCalcDto() { tleStr = xlInfo3.TwoLine, dt = dto.SigTime };
                var ephAdja2 = await HttpHelper.PostRequestAsync(url, XlCalcDto3);
                if (ephAdja2.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.Adja2Code}]的星历出错");
                    return Error($"推算[{dto.Adja2Code}]的星历出错");
                }
                var StationRes = db.StationRes.Add(new StationRes()
                {
                    SatTxLon = dto.SatTxLon,
                    SatTxLat = dto.SatTxLat,
                    RefLon = dto.RefLon,
                    RefLat = dto.RefLat,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.Dto1,
                    Dfo1 = dto.Dfo1,
                    Snr1 = dto.Snr1,
                    Dto2 = dto.Dto2,
                    Dfo2 = dto.Dfo2,
                    Snr2 = dto.Snr2,
                    YbMainDfo = dto.YbMainDfo,
                    YbAdja1Dfo = dto.YbAdja1Dfo,
                    YbAdja2Dfo = dto.YbAdja2Dfo,
                    TarFreqUp = dto.TarFreqUp,
                    TarFreqDown = dto.TarFreqDown,
                    RefFreqUp = dto.RefFreqUp,
                    RefFreqDown = dto.RefFreqDown,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.Adja1Code,
                    Adja2Code = dto.Adja2Code,
                    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);
                PosRes posRes = new PosRes()
                {
                    SigTime = dto.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X3TwoDfo,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        #endregion
        #region 双星时频差定位
        /// 
        /// 双星时频差带参定位(含星历)
        /// 
        /// 定位参数
        /// 
        [HttpPost]
        public async Task> PosX2DtoDfoAsync(X2DtoDfoPosDto dto)
        {
            TaskInfo runTask;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2Dfo && p.TaskState == EnumTaskState.Running);
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到双星时频差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动双星时频差定位任务");
                }
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var StationRes = db.StationRes.Add(new StationRes()
                {
                    SatTxLon = dto.SatTxLon,
                    SatTxLat = dto.SatTxLat,
                    RefLon = dto.RefLon,
                    RefLat = dto.RefLat,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.Dto,
                    Dfo1 = dto.Dfo,
                    Snr1 = dto.Snr,
                    YbMainDto = dto.YbMainDto,
                    YbAdja1Dto = dto.YbAdjaDto,
                    YbMainDfo = dto.YbMainDfo,
                    YbAdja1Dfo = dto.YbAdjaDfo,
                    TarFreqUp = dto.TarFreqUp,
                    TarFreqDown = dto.TarFreqDown,
                    RefFreqUp = dto.RefFreqUp,
                    RefFreqDown = dto.RefFreqDown,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.AdjaCode,
                    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);
                PosRes posRes = new PosRes()
                {
                    SigTime = cgRes.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X2Dfo,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        /// 
        /// 双星时频差带参定位(无星历)
        /// 
        /// 返回定位结果ID
        [HttpPost]
        public async Task> PosX2DtoDfoNoXlAsync(X2DtoDfoNoXlPosDto dto)
        {
            TaskInfo runTask;
            SysSetings settings;
            using (RHDWContext db = new RHDWContext())
            {
                runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2Dfo).FirstOrDefaultAsync();
                if (runTask == null)
                {
                    Serilog.Log.Warning($"接收到双星时频差带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
                    return Error($"多模式融合定位平台没有启动双星时频差定位任务");
                }
                settings = await db.SysSetings.FirstOrDefaultAsync();
            }
            using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
            {
                var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
                var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
                var parameter3 = new SQLiteParameter("@satcode", dto.AdjaCode);
                var xlInfo1 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter2).FirstOrDefaultAsync();
                if (xlInfo1 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
                }
                var xlInfo2 = await db.XlInfos.SqlQuery("select * from XlInfo where ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))=(select min(ABS(JULIANDAY(TimeBJ)-JULIANDAY(@sigTime))) from XlInfo where satcode=@satcode)", parameter1, parameter3).FirstOrDefaultAsync();
                if (xlInfo2 == null)
                {
                    Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
                    return Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
                }
                Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
                Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
                string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
                var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
                var ephMain = await HttpHelper.PostRequestAsync(url, XlCalcDto);
                if (ephMain.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
                    return Error($"推算[{dto.MainCode}]的星历出错");
                }
                var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
                var ephAdja = await HttpHelper.PostRequestAsync(url, XlCalcDto2);
                if (ephAdja.code != 200)
                {
                    Serilog.Log.Error($"推算[{dto.AdjaCode}]的星历出错");
                    return Error($"推算[{dto.AdjaCode}]的星历出错");
                }
                var StationRes = db.StationRes.Add(new StationRes()
                {
                    SatTxLon = dto.SatTxLon,
                    SatTxLat = dto.SatTxLat,
                    RefLon = dto.RefLon,
                    RefLat = dto.RefLat,
                });
                var cgRes = db.CgRes.Add(new CgRes()
                {
                    SigTime = dto.SigTime,
                    Dto1 = dto.Dto,
                    Dfo1 = dto.Dfo,
                    Snr1 = dto.Snr,
                    YbMainDto = dto.YbMainDto,
                    YbAdja1Dto = dto.YbAdjaDto,
                    YbMainDfo = dto.YbMainDfo,
                    YbAdja1Dfo = dto.YbAdjaDfo,
                    TarFreqUp = dto.TarFreqUp,
                    TarFreqDown = dto.TarFreqDown,
                    RefFreqUp = dto.RefFreqUp,
                    RefFreqDown = dto.RefFreqDown,
                    StationResID = StationRes.ID,
                    MainCode = dto.MainCode,
                    Adja1Code = dto.AdjaCode,
                    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);
                PosRes posRes = new PosRes()
                {
                    SigTime = dto.SigTime,
                    TaskInfoID = runTask.ID,
                    CgResID = cgRes.ID,
                    TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
                    TsName = dto.TsName,
                    PosLon = res[0],
                    PosLat = res[1],
                    MirrLon = res[3],
                    MirrLat = res[4],
                    PosResType = EnumPosResType.X2Dfo,
                };
                posRes = db.PosRes.Add(posRes);
                await db.SaveChangesAsync();
                PosObServer.Instance.Pub(posRes);
                return Success(Map(posRes));
            }
        }
        #endregion
        private PosResDto Map(PosRes res)
        {
            return new PosResDto()
            {
                ID = res.ID,
                SigTime = res.SigTime,
                TaskInfoID = res.TaskInfoID,
                TarName = string.IsNullOrWhiteSpace(res.TarName) ? "未知目标" : res.TarName,
                PosLon = res.PosLon,
                PosLat = res.PosLat,
                MirrLon = res.MirrLon,
                MirrLat = res.MirrLat,
                PosResType = (EnumPosResTypeDto)((int)res.PosResType)
            };
        }
        /// 
        /// 查询定位结果(暂未实现)
        /// 
        /// 
        /// 
        /// 
        [HttpGet]
        public async Task> GetPosRes(PosResQueryDto dto)
        {
            await Task.Delay(100);
            return Error("该功能暂未实现!");
        }
    }
}