PosController.cs 68 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Data.SqlClient;
  5. using System.Data.SQLite;
  6. using System.Linq;
  7. using System.Net.Http;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Web.Http;
  11. using Newtonsoft.Json;
  12. using Serilog;
  13. using Swashbuckle.Swagger;
  14. using XdCxRhDw.Dto;
  15. using XdCxRhDW.App.Api;
  16. using XdCxRhDW.Core.Api;
  17. using XdCxRhDW.Core.ObServer;
  18. using XdCxRhDW.Core;
  19. using XdCxRhDW.Dto;
  20. using XdCxRhDW.Repostory.EFContext;
  21. using XdCxRhDW.Repostory.Model;
  22. using XdCxRhDW.WebApi.Controllers;
  23. using System.ComponentModel.DataAnnotations;
  24. namespace XdCxRhDW.App.WebAPI
  25. {
  26. /// <summary>
  27. /// 定位功能相关接口
  28. /// </summary>
  29. public class PosController : BaseController
  30. {
  31. #region 一星一地测向定位
  32. /// <summary>
  33. /// 一星一地测向带参定位(含星历)
  34. /// </summary>
  35. /// <param name="dto">定位参数</param>
  36. /// <returns></returns>
  37. [HttpPost]
  38. [CustomValidation(typeof(X1D1PosDto), "Validate")]
  39. public async Task<AjaxResult<PosResDto>> PosX1D1Async(X1D1PosDto dto)
  40. {
  41. using (RHDWContext db = new RHDWContext())
  42. {
  43. var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running);
  44. if (runTask == null)
  45. {
  46. Serilog.Log.Warning($"接收到一星一地测向带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  47. return Error<PosResDto>($"多模式融合定位平台没有启动一星一地测向定位任务");
  48. }
  49. var StationRes = db.StationRes.Add(new StationRes()
  50. {
  51. SatTxLon = dto.SatTxLon,
  52. SatTxLat = dto.SatTxLat,
  53. CdbTxLon = dto.CdbTxLon,
  54. CdbTxLat = dto.CdbTxLat,
  55. CxLon = dto.CxLon,
  56. CxLat = dto.CxLat,
  57. RefLon = dto.RefLon,
  58. RefLat = dto.RefLat,
  59. });
  60. var cgRes = db.CgRes.Add(new CgRes()
  61. {
  62. SigTime = dto.SigTime,
  63. DtoCdb = dto.XdDto,
  64. DfoCdb = dto.XdDfo,
  65. SnrCdb = dto.XdSnr,
  66. YbMainDto = dto.MainYbDto,
  67. StationResID = StationRes.ID,
  68. MainCode = dto.MainCode,
  69. MainX = dto.MainX,
  70. MainY = dto.MainY,
  71. MainZ = dto.MainZ,
  72. });
  73. var cxRes = db.CxRes.Add(new CxRes()
  74. {
  75. SigTime = dto.SigTime,
  76. Fx = dto.CxRes,
  77. });
  78. var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes);
  79. PosRes posRes = new PosRes()
  80. {
  81. SigTime = cgRes.SigTime,
  82. TaskInfoID = runTask.ID,
  83. CxResID = cxRes.ID,
  84. CgResID = cgRes.ID,
  85. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  86. TsName = dto.TsName,
  87. PosLon = res[0],
  88. PosLat = res[1],
  89. MirrLon = res[3],
  90. MirrLat = res[4],
  91. PosResType = EnumPosResType.X1D1CX,
  92. };
  93. posRes = db.PosRes.Add(posRes);
  94. await db.SaveChangesAsync();
  95. PosObServer.Instance.Pub(posRes);
  96. return Success(Map(posRes));
  97. }
  98. }
  99. /// <summary>
  100. /// 一星一地测向带参定位(无星历)
  101. /// </summary>
  102. /// <returns>返回定位结果ID</returns>
  103. [HttpPost]
  104. [CustomValidation(typeof(X1D1NoXlPosDto), "Validate")]
  105. public async Task<AjaxResult<PosResDto>> PosX1D1NoXlAsync(X1D1NoXlPosDto dto)
  106. {
  107. using (RHDWContext db = new RHDWContext())
  108. {
  109. var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X1D1CX).FirstOrDefaultAsync();
  110. if (runTask == null)
  111. {
  112. Serilog.Log.Warning($"接收到一星一地带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  113. return Error<PosResDto>($"多模式融合定位平台没有启动一星一地定位任务");
  114. }
  115. var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
  116. var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
  117. 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();
  118. if (xlInfo1 == null)
  119. {
  120. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  121. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  122. }
  123. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  124. var settings = await db.SysSetings.FirstOrDefaultAsync();
  125. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  126. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  127. var ephMain = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto);
  128. var StationRes = db.StationRes.Add(new StationRes()
  129. {
  130. SatTxLon = dto.SatTxLon,
  131. SatTxLat = dto.SatTxLat,
  132. CdbTxLon = dto.CdbTxLon,
  133. CdbTxLat = dto.CdbTxLat,
  134. CxLon = dto.CxLon,
  135. CxLat = dto.CxLat,
  136. RefLon = dto.RefLon,
  137. RefLat = dto.RefLat,
  138. });
  139. var cgRes = db.CgRes.Add(new CgRes()
  140. {
  141. SigTime = dto.SigTime,
  142. DtoCdb = dto.XdDto,
  143. DfoCdb = dto.XdDfo,
  144. SnrCdb = dto.XdSnr,
  145. YbMainDto = dto.MainYbDto,
  146. StationResID = StationRes.ID,
  147. MainCode = dto.MainCode,
  148. MainX = ephMain.X,
  149. MainY = ephMain.Y,
  150. MainZ = ephMain.Z,
  151. });
  152. var cxRes = db.CxRes.Add(new CxRes()
  153. {
  154. SigTime = dto.SigTime,
  155. Fx = dto.CxRes,
  156. });
  157. var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes);
  158. PosRes posRes = new PosRes()
  159. {
  160. SigTime = dto.SigTime,
  161. TaskInfoID = runTask.ID,
  162. CgResID = cgRes.ID,
  163. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  164. TsName = dto.TsName,
  165. PosLon = res[0],
  166. PosLat = res[1],
  167. MirrLon = res[3],
  168. MirrLat = res[4],
  169. PosResType = EnumPosResType.X1D1CX,
  170. };
  171. posRes = db.PosRes.Add(posRes);
  172. await db.SaveChangesAsync();
  173. PosObServer.Instance.Pub(posRes);
  174. return Success(Map(posRes));
  175. }
  176. }
  177. #endregion
  178. #region 两星一地定位
  179. /// <summary>
  180. /// 两星一地带参定位(含星历)
  181. /// </summary>
  182. /// <param name="dto">定位参数</param>
  183. /// <returns></returns>
  184. [HttpPost]
  185. [CustomValidation(typeof(X2D1PosDto), "Validate")]
  186. public async Task<AjaxResult<PosResDto>> PosX2D1Async(X2D1PosDto dto)
  187. {
  188. using (RHDWContext db = new RHDWContext())
  189. {
  190. var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  191. if (runTask == null)
  192. {
  193. Serilog.Log.Warning($"接收到两星一地带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  194. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  195. }
  196. var StationRes = db.StationRes.Add(new StationRes()
  197. {
  198. SatTxLon = dto.SatTxLon,
  199. SatTxLat = dto.SatTxLat,
  200. CdbTxLon = dto.CdbTxLon,
  201. CdbTxLat = dto.CdbTxLat,
  202. RefLon = dto.RefLon,
  203. RefLat = dto.RefLat,
  204. });
  205. var cgRes = db.CgRes.Add(new CgRes()
  206. {
  207. SigTime = dto.SigTime,
  208. Dto1 = dto.SxDto,
  209. Dfo1 = dto.SxDfo,
  210. Snr1 = dto.SxSnr,
  211. DtoCdb = dto.XdDto,
  212. DfoCdb = dto.XdDfo,
  213. SnrCdb = dto.XdSnr,
  214. YbMainDto = dto.MainYbDto,
  215. YbAdja1Dto = dto.AdjaYbDto,
  216. StationResID = StationRes.ID,
  217. MainCode = dto.MainCode,
  218. Adja1Code = dto.AdjaCode,
  219. MainX = dto.MainX,
  220. MainY = dto.MainY,
  221. MainZ = dto.MainZ,
  222. Adja1X = dto.AdjaX,
  223. Adja1Y = dto.AdjaY,
  224. Adja1Z = dto.AdjaZ,
  225. });
  226. var res = PosApi.X2D1_Pos(cgRes, StationRes);
  227. PosRes posRes = new PosRes()
  228. {
  229. SigTime = cgRes.SigTime,
  230. TaskInfoID = runTask.ID,
  231. CgResID = cgRes.ID,
  232. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  233. TsName = dto.TsName,
  234. PosLon = res[0],
  235. PosLat = res[1],
  236. MirrLon = res[3],
  237. MirrLat = res[4],
  238. PosResType = EnumPosResType.X2D1,
  239. };
  240. posRes = db.PosRes.Add(posRes);
  241. await db.SaveChangesAsync();
  242. PosObServer.Instance.Pub(posRes);
  243. return Success(Map(posRes));
  244. }
  245. }
  246. /// <summary>
  247. /// 两星一地带参定位(无星历)
  248. /// </summary>
  249. /// <returns>返回定位结果ID</returns>
  250. [HttpPost]
  251. [CustomValidation(typeof(X2D1NoXlPosDto), "Validate")]
  252. public async Task<AjaxResult<PosResDto>> PosX2D1NoXlAsync(X2D1NoXlPosDto dto)
  253. {
  254. using (RHDWContext db = new RHDWContext())
  255. {
  256. var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2D1).FirstOrDefaultAsync();
  257. if (runTask == null)
  258. {
  259. Serilog.Log.Warning($"接收到两星一地带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  260. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  261. }
  262. var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
  263. var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
  264. var parameter3 = new SQLiteParameter("@satcode", dto.AdjaCode);
  265. 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();
  266. if (xlInfo1 == null)
  267. {
  268. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  269. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  270. }
  271. 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();
  272. if (xlInfo2 == null)
  273. {
  274. Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  275. return Error<PosResDto>($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  276. }
  277. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  278. Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
  279. var settings = await db.SysSetings.FirstOrDefaultAsync();
  280. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  281. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  282. var ephMain = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto);
  283. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  284. var ephAdja = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto2);
  285. var StationRes = db.StationRes.Add(new StationRes()
  286. {
  287. SatTxLon = dto.SatTxLon,
  288. SatTxLat = dto.SatTxLat,
  289. CdbTxLon = dto.CdbTxLon,
  290. CdbTxLat = dto.CdbTxLat,
  291. RefLon = dto.RefLon,
  292. RefLat = dto.RefLat,
  293. });
  294. var cgRes = db.CgRes.Add(new CgRes()
  295. {
  296. SigTime = dto.SigTime,
  297. Dto1 = dto.SxDto,
  298. Dfo1 = dto.SxDfo,
  299. Snr1 = dto.SxSnr,
  300. DtoCdb = dto.XdDto,
  301. DfoCdb = dto.XdDfo,
  302. SnrCdb = dto.XdSnr,
  303. YbMainDto = dto.MainYbDto,
  304. YbAdja1Dto = dto.AdjaYbDto,
  305. StationResID = StationRes.ID,
  306. MainCode = dto.MainCode,
  307. Adja1Code = dto.AdjaCode,
  308. MainX = ephMain.X,
  309. MainY = ephMain.Y,
  310. MainZ = ephMain.Z,
  311. Adja1X = ephAdja.X,
  312. Adja1Y = ephAdja.Y,
  313. Adja1Z = ephAdja.Z,
  314. });
  315. var res = PosApi.X2D1_Pos(cgRes, StationRes);
  316. PosRes posRes = new PosRes()
  317. {
  318. SigTime = dto.SigTime,
  319. TaskInfoID = runTask.ID,
  320. CgResID = cgRes.ID,
  321. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  322. TsName = dto.TsName,
  323. PosLon = res[0],
  324. PosLat = res[1],
  325. MirrLon = res[3],
  326. MirrLat = res[4],
  327. PosResType = EnumPosResType.X2D1,
  328. };
  329. posRes = db.PosRes.Add(posRes);
  330. await db.SaveChangesAsync();
  331. PosObServer.Instance.Pub(posRes);
  332. return Success(Map(posRes));
  333. }
  334. }
  335. /// <summary>
  336. /// 两星一地无参定位(含星历)
  337. /// </summary>
  338. /// <param name="dto">定位参数</param>
  339. /// <returns></returns>
  340. [HttpPost]
  341. [CustomValidation(typeof(X2D1NoParPosDto), "Validate")]
  342. public async Task<AjaxResult<PosResDto>> PosX2D1NoParAsync(X2D1NoParPosDto dto)
  343. {
  344. using (RHDWContext db = new RHDWContext())
  345. {
  346. var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  347. if (runTask == null)
  348. {
  349. Serilog.Log.Warning($"接收到两星一地无参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  350. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  351. }
  352. var StationRes = db.StationRes.Add(new StationRes()
  353. {
  354. SatTxLon = dto.SatTxLon,
  355. SatTxLat = dto.SatTxLat,
  356. CdbTxLon = dto.CdbTxLon,
  357. CdbTxLat = dto.CdbTxLat,
  358. });
  359. var cgRes = db.CgRes.Add(new CgRes()
  360. {
  361. SigTime = dto.SigTime,
  362. Dto1 = dto.SxDto,
  363. Dfo1 = dto.SxDfo,
  364. Snr1 = dto.SxSnr,
  365. DtoCdb = dto.XdDto,
  366. DfoCdb = dto.XdDfo,
  367. SnrCdb = dto.XdSnr,
  368. StationResID = StationRes.ID,
  369. MainCode = dto.MainCode,
  370. Adja1Code = dto.AdjaCode,
  371. MainX = dto.MainX,
  372. MainY = dto.MainY,
  373. MainZ = dto.MainZ,
  374. Adja1X = dto.AdjaX,
  375. Adja1Y = dto.AdjaY,
  376. Adja1Z = dto.AdjaZ,
  377. });
  378. var res = PosApi.X2D1_PosNoRef(cgRes, StationRes);
  379. PosRes posRes = new PosRes()
  380. {
  381. SigTime = cgRes.SigTime,
  382. TaskInfoID = runTask.ID,
  383. CgResID = cgRes.ID,
  384. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  385. TsName = dto.TsName,
  386. PosLon = res[0],
  387. PosLat = res[1],
  388. MirrLon = res[3],
  389. MirrLat = res[4],
  390. PosResType = EnumPosResType.X2D1NoRef,
  391. };
  392. posRes = db.PosRes.Add(posRes);
  393. await db.SaveChangesAsync();
  394. PosObServer.Instance.Pub(posRes);
  395. return Success(Map(posRes));
  396. }
  397. }
  398. /// <summary>
  399. /// 两星一地无参定位(无星历)
  400. /// </summary>
  401. /// <returns>返回定位结果ID</returns>
  402. [HttpPost]
  403. [CustomValidation(typeof(X2D1NoXlNoParlPosDto), "Validate")]
  404. public async Task<AjaxResult<PosResDto>> PosX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto)
  405. {
  406. using (RHDWContext db = new RHDWContext())
  407. {
  408. var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2D1).FirstOrDefaultAsync();
  409. if (runTask == null)
  410. {
  411. Serilog.Log.Warning($"接收到两星一地无参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  412. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  413. }
  414. var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
  415. var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
  416. var parameter3 = new SQLiteParameter("@satcode", dto.AdjaCode);
  417. 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();
  418. if (xlInfo1 == null)
  419. {
  420. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  421. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  422. }
  423. 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();
  424. if (xlInfo2 == null)
  425. {
  426. Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  427. return Error<PosResDto>($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  428. }
  429. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  430. Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
  431. var settings = await db.SysSetings.FirstOrDefaultAsync();
  432. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  433. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  434. var ephMain = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto);
  435. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  436. var ephAdja = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto2);
  437. var StationRes = db.StationRes.Add(new StationRes()
  438. {
  439. SatTxLon = dto.SatTxLon,
  440. SatTxLat = dto.SatTxLat,
  441. CdbTxLon = dto.CdbTxLon,
  442. CdbTxLat = dto.CdbTxLat,
  443. });
  444. var cgRes = db.CgRes.Add(new CgRes()
  445. {
  446. SigTime = dto.SigTime,
  447. Dto1 = dto.SxDto,
  448. Dfo1 = dto.SxDfo,
  449. Snr1 = dto.SxSnr,
  450. DtoCdb = dto.XdDto,
  451. DfoCdb = dto.XdDfo,
  452. SnrCdb = dto.XdSnr,
  453. StationResID = StationRes.ID,
  454. MainCode = dto.MainCode,
  455. Adja1Code = dto.AdjaCode,
  456. MainX = ephMain.X,
  457. MainY = ephMain.Y,
  458. MainZ = ephMain.Z,
  459. Adja1X = ephAdja.X,
  460. Adja1Y = ephAdja.Y,
  461. Adja1Z = ephAdja.Z,
  462. });
  463. var res = PosApi.X2D1_PosNoRef(cgRes, StationRes);
  464. PosRes posRes = new PosRes()
  465. {
  466. SigTime = dto.SigTime,
  467. TaskInfoID = runTask.ID,
  468. CgResID = cgRes.ID,
  469. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  470. TsName = dto.TsName,
  471. PosLon = res[0],
  472. PosLat = res[1],
  473. MirrLon = res[3],
  474. MirrLat = res[4],
  475. PosResType = EnumPosResType.X2D1NoRef,
  476. };
  477. posRes = db.PosRes.Add(posRes);
  478. await db.SaveChangesAsync();
  479. PosObServer.Instance.Pub(posRes);
  480. return Success(Map(posRes));
  481. }
  482. }
  483. #endregion
  484. #region 融合定位
  485. /// <summary>
  486. /// 融合带参定位(含星历)
  487. /// </summary>
  488. /// <param name="dto">定位参数</param>
  489. /// <returns></returns>
  490. [HttpPost]
  491. [CustomValidation(typeof(RHPosDto), "Validate")]
  492. public async Task<AjaxResult<PosResDto>> PosRhAsync(RHPosDto dto)
  493. {
  494. using (RHDWContext db = new RHDWContext())
  495. {
  496. var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running);
  497. if (runTask == null)
  498. {
  499. Serilog.Log.Warning($"接收到融合带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  500. return Error<PosResDto>($"多模式融合定位平台没有启动融合定位任务");
  501. }
  502. var StationRes = db.StationRes.Add(new StationRes()
  503. {
  504. SatTxLon = dto.SatTxLon,
  505. SatTxLat = dto.SatTxLat,
  506. CdbTxLon = dto.CdbTxLon,
  507. CdbTxLat = dto.CdbTxLat,
  508. CxLon = dto.CxLon,
  509. CxLat = dto.CxLat,
  510. RefLon = dto.RefLon,
  511. RefLat = dto.RefLat,
  512. });
  513. var cgRes = db.CgRes.Add(new CgRes()
  514. {
  515. SigTime = dto.SigTime,
  516. Dto1 = dto.SxDto,
  517. Dfo1 = dto.SxDfo,
  518. Snr1 = dto.SxSnr,
  519. DtoCdb = dto.XdDto,
  520. DfoCdb = dto.XdDfo,
  521. SnrCdb = dto.XdSnr,
  522. YbMainDto = dto.MainYbDto,
  523. YbAdja1Dto = dto.AdjaYbDto,
  524. StationResID = StationRes.ID,
  525. MainCode = dto.MainCode,
  526. Adja1Code = dto.AdjaCode,
  527. MainX = dto.MainX,
  528. MainY = dto.MainY,
  529. MainZ = dto.MainZ,
  530. Adja1X = dto.AdjaX,
  531. Adja1Y = dto.AdjaY,
  532. Adja1Z = dto.AdjaZ,
  533. });
  534. var cxRes = db.CxRes.Add(new CxRes()
  535. {
  536. SigTime = dto.SigTime,
  537. Fx = dto.CxRes,
  538. });
  539. var res = PosApi.RH_Pos(cgRes, StationRes, cxRes);
  540. PosRes posRes = new PosRes()
  541. {
  542. SigTime = cgRes.SigTime,
  543. TaskInfoID = runTask.ID,
  544. CxResID = cxRes.ID,
  545. CgResID = cgRes.ID,
  546. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  547. TsName = dto.TsName,
  548. PosLon = res[0],
  549. PosLat = res[1],
  550. MirrLon = res[3],
  551. MirrLat = res[4],
  552. PosResType = EnumPosResType.RH,
  553. };
  554. posRes = db.PosRes.Add(posRes);
  555. await db.SaveChangesAsync();
  556. PosObServer.Instance.Pub(posRes);
  557. return Success(Map(posRes));
  558. }
  559. }
  560. /// <summary>
  561. /// 融合带参定位(无星历)
  562. /// </summary>
  563. /// <returns>返回定位结果ID</returns>
  564. [HttpPost]
  565. [CustomValidation(typeof(RHNoXlPosDto), "Validate")]
  566. public async Task<AjaxResult<PosResDto>> PosRhNoXlAsync(RHNoXlPosDto dto)
  567. {
  568. using (RHDWContext db = new RHDWContext())
  569. {
  570. var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.RH).FirstOrDefaultAsync();
  571. if (runTask == null)
  572. {
  573. Serilog.Log.Warning($"接收到融合带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  574. return Error<PosResDto>($"多模式融合定位平台没有启动融合定位任务");
  575. }
  576. var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
  577. var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
  578. var parameter3 = new SQLiteParameter("@satcode", dto.AdjaCode);
  579. 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();
  580. if (xlInfo1 == null)
  581. {
  582. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  583. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  584. }
  585. 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();
  586. if (xlInfo2 == null)
  587. {
  588. Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  589. return Error<PosResDto>($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  590. }
  591. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  592. Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
  593. var settings = await db.SysSetings.FirstOrDefaultAsync();
  594. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  595. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  596. var ephMain = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto);
  597. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  598. var ephAdja = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto2);
  599. var StationRes = db.StationRes.Add(new StationRes()
  600. {
  601. SatTxLon = dto.SatTxLon,
  602. SatTxLat = dto.SatTxLat,
  603. CdbTxLon = dto.CdbTxLon,
  604. CdbTxLat = dto.CdbTxLat,
  605. CxLon = dto.CxLon,
  606. CxLat = dto.CxLat,
  607. RefLon = dto.RefLon,
  608. RefLat = dto.RefLat,
  609. });
  610. var cgRes = db.CgRes.Add(new CgRes()
  611. {
  612. SigTime = dto.SigTime,
  613. Dto1 = dto.SxDto,
  614. Dfo1 = dto.SxDfo,
  615. Snr1 = dto.SxSnr,
  616. DtoCdb = dto.XdDto,
  617. DfoCdb = dto.XdDfo,
  618. SnrCdb = dto.XdSnr,
  619. YbMainDto = dto.MainYbDto,
  620. YbAdja1Dto = dto.AdjaYbDto,
  621. StationResID = StationRes.ID,
  622. MainCode = dto.MainCode,
  623. Adja1Code = dto.AdjaCode,
  624. MainX = ephMain.X,
  625. MainY = ephMain.Y,
  626. MainZ = ephMain.Z,
  627. Adja1X = ephAdja.X,
  628. Adja1Y = ephAdja.Y,
  629. Adja1Z = ephAdja.Z,
  630. });
  631. var cxRes = db.CxRes.Add(new CxRes()
  632. {
  633. SigTime = dto.SigTime,
  634. Fx = dto.CxRes,
  635. });
  636. var res = PosApi.RH_Pos(cgRes, StationRes, cxRes);
  637. PosRes posRes = new PosRes()
  638. {
  639. SigTime = cgRes.SigTime,
  640. TaskInfoID = runTask.ID,
  641. CxResID = cxRes.ID,
  642. CgResID = cgRes.ID,
  643. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  644. TsName = dto.TsName,
  645. PosLon = res[0],
  646. PosLat = res[1],
  647. MirrLon = res[3],
  648. MirrLat = res[4],
  649. PosResType = EnumPosResType.RH,
  650. };
  651. posRes = db.PosRes.Add(posRes);
  652. await db.SaveChangesAsync();
  653. PosObServer.Instance.Pub(posRes);
  654. return Success(Map(posRes));
  655. }
  656. }
  657. #endregion
  658. #region 三星双时差定位
  659. /// <summary>
  660. /// 三星双时差带参定位(含星历)
  661. /// </summary>
  662. /// <param name="dto">定位参数</param>
  663. /// <returns></returns>
  664. [HttpPost]
  665. [CustomValidation(typeof(X3TwoDtoPosDto), "Validate")]
  666. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoAsync(X3TwoDtoPosDto dto)
  667. {
  668. using (RHDWContext db = new RHDWContext())
  669. {
  670. var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  671. if (runTask == null)
  672. {
  673. Serilog.Log.Warning($"接收到三星双时差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  674. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  675. }
  676. var StationRes = db.StationRes.Add(new StationRes()
  677. {
  678. SatTxLon = dto.SatTxLon,
  679. SatTxLat = dto.SatTxLat,
  680. RefLon = dto.RefLon,
  681. RefLat = dto.RefLat,
  682. });
  683. var cgRes = db.CgRes.Add(new CgRes()
  684. {
  685. SigTime = dto.SigTime,
  686. Dto1 = dto.Dto1,
  687. Dfo1 = dto.Dfo1,
  688. Snr1 = dto.Snr1,
  689. Dto2 = dto.Dto2,
  690. Dfo2 = dto.Dfo2,
  691. Snr2 = dto.Snr2,
  692. YbMainDto = dto.YbMainDto,
  693. YbAdja1Dto = dto.YbAdja1Dto,
  694. YbAdja2Dto = dto.YbAdja2Dto,
  695. StationResID = StationRes.ID,
  696. MainCode = dto.MainCode,
  697. Adja1Code = dto.Adja1Code,
  698. Adja2Code = dto.Adja2Code,
  699. MainX = dto.MainX,
  700. MainY = dto.MainY,
  701. MainZ = dto.MainZ,
  702. Adja1X = dto.Adja1X,
  703. Adja1Y = dto.Adja1Y,
  704. Adja1Z = dto.Adja1Z,
  705. Adja2X = dto.Adja2X,
  706. Adja2Y = dto.Adja2Y,
  707. Adja2Z = dto.Adja2Z,
  708. });
  709. var res = PosApi.X3_Pos(cgRes, StationRes);
  710. PosRes posRes = new PosRes()
  711. {
  712. SigTime = cgRes.SigTime,
  713. TaskInfoID = runTask.ID,
  714. CgResID = cgRes.ID,
  715. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  716. TsName = dto.TsName,
  717. PosLon = res[0],
  718. PosLat = res[1],
  719. MirrLon = res[3],
  720. MirrLat = res[4],
  721. PosResType = EnumPosResType.X3,
  722. };
  723. posRes = db.PosRes.Add(posRes);
  724. await db.SaveChangesAsync();
  725. PosObServer.Instance.Pub(posRes);
  726. return Success(Map(posRes));
  727. }
  728. }
  729. /// <summary>
  730. /// 三星双时差带参定位(无星历)
  731. /// </summary>
  732. /// <returns>返回定位结果ID</returns>
  733. [HttpPost]
  734. [CustomValidation(typeof(X3TwoDtoNoXlPosDto), "Validate")]
  735. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoXlAsync(X3TwoDtoNoXlPosDto dto)
  736. {
  737. using (RHDWContext db = new RHDWContext())
  738. {
  739. var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDto).FirstOrDefaultAsync();
  740. if (runTask == null)
  741. {
  742. Serilog.Log.Warning($"接收到三星双时差带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  743. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  744. }
  745. var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
  746. var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
  747. var parameter3 = new SQLiteParameter("@satcode", dto.Adja1Code);
  748. var parameter4 = new SQLiteParameter("@satcode", dto.Adja2Code);
  749. 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();
  750. if (xlInfo1 == null)
  751. {
  752. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  753. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  754. }
  755. 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();
  756. if (xlInfo2 == null)
  757. {
  758. Serilog.Log.Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  759. return Error<PosResDto>($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  760. }
  761. 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();
  762. if (xlInfo3 == null)
  763. {
  764. Serilog.Log.Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  765. return Error<PosResDto>($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  766. }
  767. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  768. Serilog.Log.Information($"卫星{dto.Adja1Code}使用{xlInfo2.TwoLine}进行星历推算");
  769. Serilog.Log.Information($"卫星{dto.Adja2Code}使用{xlInfo3.TwoLine}进行星历推算");
  770. var settings = await db.SysSetings.FirstOrDefaultAsync();
  771. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  772. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  773. var ephMain = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto);
  774. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  775. var ephAdja1 = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto2);
  776. var XlCalcDto3 = new XlCalcDto() { tleStr = xlInfo3.TwoLine, dt = dto.SigTime };
  777. var ephAdja2 = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto3);
  778. var StationRes = db.StationRes.Add(new StationRes()
  779. {
  780. SatTxLon = dto.SatTxLon,
  781. SatTxLat = dto.SatTxLat,
  782. RefLon = dto.RefLon,
  783. RefLat = dto.RefLat,
  784. });
  785. var cgRes = db.CgRes.Add(new CgRes()
  786. {
  787. SigTime = dto.SigTime,
  788. Dto1 = dto.Dto1,
  789. Dfo1 = dto.Dfo1,
  790. Snr1 = dto.Snr1,
  791. Dto2 = dto.Dto2,
  792. Dfo2 = dto.Dfo2,
  793. Snr2 = dto.Snr2,
  794. YbMainDto = dto.YbMainDto,
  795. YbAdja1Dto = dto.YbAdja1Dto,
  796. YbAdja2Dto = dto.YbAdja2Dto,
  797. StationResID = StationRes.ID,
  798. MainCode = dto.MainCode,
  799. Adja1Code = dto.Adja1Code,
  800. Adja2Code = dto.Adja2Code,
  801. MainX = ephMain.X,
  802. MainY = ephMain.Y,
  803. MainZ = ephMain.Z,
  804. Adja1X = ephAdja1.X,
  805. Adja1Y = ephAdja1.Y,
  806. Adja1Z = ephAdja1.Z,
  807. Adja2X = ephAdja2.X,
  808. Adja2Y = ephAdja2.Y,
  809. Adja2Z = ephAdja2.Z,
  810. });
  811. var res = PosApi.X3_Pos(cgRes, StationRes);
  812. PosRes posRes = new PosRes()
  813. {
  814. SigTime = dto.SigTime,
  815. TaskInfoID = runTask.ID,
  816. CgResID = cgRes.ID,
  817. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  818. TsName = dto.TsName,
  819. PosLon = res[0],
  820. PosLat = res[1],
  821. MirrLon = res[3],
  822. MirrLat = res[4],
  823. PosResType = EnumPosResType.X3,
  824. };
  825. posRes = db.PosRes.Add(posRes);
  826. await db.SaveChangesAsync();
  827. PosObServer.Instance.Pub(posRes);
  828. return Success(Map(posRes));
  829. }
  830. }
  831. /// <summary>
  832. /// 三星双时差无参定位(含星历)
  833. /// </summary>
  834. /// <param name="dto">定位参数</param>
  835. /// <returns></returns>
  836. [HttpPost]
  837. [CustomValidation(typeof(X3TwoDtoNoParPosDto), "Validate")]
  838. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoParAsync(X3TwoDtoNoParPosDto dto)
  839. {
  840. using (RHDWContext db = new RHDWContext())
  841. {
  842. var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  843. if (runTask == null)
  844. {
  845. Serilog.Log.Warning($"接收到三星双时差无参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  846. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  847. }
  848. var StationRes = db.StationRes.Add(new StationRes()
  849. {
  850. SatTxLon = dto.SatTxLon,
  851. SatTxLat = dto.SatTxLat,
  852. });
  853. var cgRes = db.CgRes.Add(new CgRes()
  854. {
  855. SigTime = dto.SigTime,
  856. Dto1 = dto.Dto1,
  857. Dfo1 = dto.Dfo1,
  858. Snr1 = dto.Snr1,
  859. Dto2 = dto.Dto2,
  860. Dfo2 = dto.Dfo2,
  861. Snr2 = dto.Snr2,
  862. StationResID = StationRes.ID,
  863. MainCode = dto.MainCode,
  864. Adja1Code = dto.Adja1Code,
  865. Adja2Code = dto.Adja2Code,
  866. MainX = dto.MainX,
  867. MainY = dto.MainY,
  868. MainZ = dto.MainZ,
  869. Adja1X = dto.Adja1X,
  870. Adja1Y = dto.Adja1Y,
  871. Adja1Z = dto.Adja1Z,
  872. Adja2X = dto.Adja2X,
  873. Adja2Y = dto.Adja2Y,
  874. Adja2Z = dto.Adja2Z,
  875. });
  876. var res = PosApi.X3_PosNoRef(cgRes, StationRes);
  877. PosRes posRes = new PosRes()
  878. {
  879. SigTime = cgRes.SigTime,
  880. TaskInfoID = runTask.ID,
  881. CgResID = cgRes.ID,
  882. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  883. TsName = dto.TsName,
  884. PosLon = res[0],
  885. PosLat = res[1],
  886. MirrLon = res[3],
  887. MirrLat = res[4],
  888. PosResType = EnumPosResType.X3NoRef,
  889. };
  890. posRes = db.PosRes.Add(posRes);
  891. await db.SaveChangesAsync();
  892. PosObServer.Instance.Pub(posRes);
  893. return Success(Map(posRes));
  894. }
  895. }
  896. /// <summary>
  897. /// 三星双时差无参定位(无星历)
  898. /// </summary>
  899. /// <returns>返回定位结果ID</returns>
  900. [HttpPost]
  901. [CustomValidation(typeof(X3TwoDtoNoXlNoParPosDto), "Validate")]
  902. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoXlNoParAsync(X3TwoDtoNoXlNoParPosDto dto)
  903. {
  904. using (RHDWContext db = new RHDWContext())
  905. {
  906. var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDto).FirstOrDefaultAsync();
  907. if (runTask == null)
  908. {
  909. Serilog.Log.Warning($"接收到三星双时差无参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  910. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  911. }
  912. var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
  913. var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
  914. var parameter3 = new SQLiteParameter("@satcode", dto.Adja1Code);
  915. var parameter4 = new SQLiteParameter("@satcode", dto.Adja2Code);
  916. 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();
  917. if (xlInfo1 == null)
  918. {
  919. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  920. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  921. }
  922. 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();
  923. if (xlInfo2 == null)
  924. {
  925. Serilog.Log.Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  926. return Error<PosResDto>($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  927. }
  928. 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();
  929. if (xlInfo3 == null)
  930. {
  931. Serilog.Log.Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  932. return Error<PosResDto>($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  933. }
  934. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  935. Serilog.Log.Information($"卫星{dto.Adja1Code}使用{xlInfo2.TwoLine}进行星历推算");
  936. Serilog.Log.Information($"卫星{dto.Adja2Code}使用{xlInfo3.TwoLine}进行星历推算");
  937. var settings = await db.SysSetings.FirstOrDefaultAsync();
  938. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  939. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  940. var ephMain = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto);
  941. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  942. var ephAdja1 = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto2);
  943. var XlCalcDto3 = new XlCalcDto() { tleStr = xlInfo3.TwoLine, dt = dto.SigTime };
  944. var ephAdja2 = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto3);
  945. var StationRes = db.StationRes.Add(new StationRes()
  946. {
  947. SatTxLon = dto.SatTxLon,
  948. SatTxLat = dto.SatTxLat,
  949. });
  950. var cgRes = db.CgRes.Add(new CgRes()
  951. {
  952. SigTime = dto.SigTime,
  953. Dto1 = dto.Dto1,
  954. Dfo1 = dto.Dfo1,
  955. Snr1 = dto.Snr1,
  956. Dto2 = dto.Dto2,
  957. Dfo2 = dto.Dfo2,
  958. Snr2 = dto.Snr2,
  959. StationResID = StationRes.ID,
  960. MainCode = dto.MainCode,
  961. Adja1Code = dto.Adja1Code,
  962. Adja2Code = dto.Adja2Code,
  963. MainX = ephMain.X,
  964. MainY = ephMain.Y,
  965. MainZ = ephMain.Z,
  966. Adja1X = ephAdja1.X,
  967. Adja1Y = ephAdja1.Y,
  968. Adja1Z = ephAdja1.Z,
  969. Adja2X = ephAdja2.X,
  970. Adja2Y = ephAdja2.Y,
  971. Adja2Z = ephAdja2.Z,
  972. });
  973. var res = PosApi.X3_PosNoRef(cgRes, StationRes);
  974. PosRes posRes = new PosRes()
  975. {
  976. SigTime = dto.SigTime,
  977. TaskInfoID = runTask.ID,
  978. CgResID = cgRes.ID,
  979. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  980. TsName = dto.TsName,
  981. PosLon = res[0],
  982. PosLat = res[1],
  983. MirrLon = res[3],
  984. MirrLat = res[4],
  985. PosResType = EnumPosResType.X3NoRef,
  986. };
  987. posRes = db.PosRes.Add(posRes);
  988. await db.SaveChangesAsync();
  989. PosObServer.Instance.Pub(posRes);
  990. return Success(Map(posRes));
  991. }
  992. }
  993. #endregion
  994. #region 三星双频差定位
  995. /// <summary>
  996. /// 三星双频差带参定位(含星历)
  997. /// </summary>
  998. /// <param name="dto">定位参数</param>
  999. /// <returns></returns>
  1000. [HttpPost]
  1001. [CustomValidation(typeof(X3TwoDfoPosDto), "Validate")]
  1002. public async Task<AjaxResult<PosResDto>> PosX3TwoDfoAsync(X3TwoDfoPosDto dto)
  1003. {
  1004. using (RHDWContext db = new RHDWContext())
  1005. {
  1006. var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDfo && p.TaskState == EnumTaskState.Running);
  1007. if (runTask == null)
  1008. {
  1009. Serilog.Log.Warning($"接收到三星双频差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  1010. return Error<PosResDto>($"多模式融合定位平台没有启动三星双频差定位任务");
  1011. }
  1012. var StationRes = db.StationRes.Add(new StationRes()
  1013. {
  1014. SatTxLon = dto.SatTxLon,
  1015. SatTxLat = dto.SatTxLat,
  1016. RefLon = dto.RefLon,
  1017. RefLat = dto.RefLat,
  1018. });
  1019. var cgRes = db.CgRes.Add(new CgRes()
  1020. {
  1021. SigTime = dto.SigTime,
  1022. Dto1 = dto.Dto1,
  1023. Dfo1 = dto.Dfo1,
  1024. Snr1 = dto.Snr1,
  1025. Dto2 = dto.Dto2,
  1026. Dfo2 = dto.Dfo2,
  1027. Snr2 = dto.Snr2,
  1028. YbMainDfo = dto.YbMainDfo,
  1029. YbAdja1Dfo = dto.YbAdja1Dfo,
  1030. YbAdja2Dfo = dto.YbAdja2Dfo,
  1031. TarFreqUp = dto.TarFreqUp,
  1032. TarFreqDown = dto.TarFreqDown,
  1033. RefFreqUp = dto.RefFreqUp,
  1034. RefFreqDown = dto.RefFreqDown,
  1035. StationResID = StationRes.ID,
  1036. MainCode = dto.MainCode,
  1037. Adja1Code = dto.Adja1Code,
  1038. Adja2Code = dto.Adja2Code,
  1039. MainX = dto.MainX,
  1040. MainY = dto.MainY,
  1041. MainZ = dto.MainZ,
  1042. MainVx = dto.MainVx,
  1043. MainVy = dto.MainVy,
  1044. MainVz = dto.MainVz,
  1045. Adja1X = dto.Adja1X,
  1046. Adja1Y = dto.Adja1Y,
  1047. Adja1Z = dto.Adja1Z,
  1048. Adja1Vx = dto.Adja1Vx,
  1049. Adja1Vy = dto.Adja1Vy,
  1050. Adja1Vz = dto.Adja1Vz,
  1051. Adja2X = dto.Adja2X,
  1052. Adja2Y = dto.Adja2Y,
  1053. Adja2Z = dto.Adja2Z,
  1054. Adja2Vx = dto.Adja2Vx,
  1055. Adja2Vy = dto.Adja2Vy,
  1056. Adja2Vz = dto.Adja2Vz,
  1057. });
  1058. var res = PosApi.X3_PosTwoDfo(cgRes, StationRes);
  1059. PosRes posRes = new PosRes()
  1060. {
  1061. SigTime = cgRes.SigTime,
  1062. TaskInfoID = runTask.ID,
  1063. CgResID = cgRes.ID,
  1064. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  1065. TsName = dto.TsName,
  1066. PosLon = res[0],
  1067. PosLat = res[1],
  1068. MirrLon = res[3],
  1069. MirrLat = res[4],
  1070. PosResType = EnumPosResType.X3TwoDfo,
  1071. };
  1072. posRes = db.PosRes.Add(posRes);
  1073. await db.SaveChangesAsync();
  1074. PosObServer.Instance.Pub(posRes);
  1075. return Success(Map(posRes));
  1076. }
  1077. }
  1078. /// <summary>
  1079. /// 三星双频差带参定位(无星历)
  1080. /// </summary>
  1081. /// <returns>返回定位结果ID</returns>
  1082. [HttpPost]
  1083. [CustomValidation(typeof(X3TwoDfoNoXlPosDto), "Validate")]
  1084. public async Task<AjaxResult<PosResDto>> PosX3TwoDfoNoXlAsync(X3TwoDfoNoXlPosDto dto)
  1085. {
  1086. using (RHDWContext db = new RHDWContext())
  1087. {
  1088. var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDfo).FirstOrDefaultAsync();
  1089. if (runTask == null)
  1090. {
  1091. Serilog.Log.Warning($"接收到三星双频差带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  1092. return Error<PosResDto>($"多模式融合定位平台没有启动三星双频差定位任务");
  1093. }
  1094. var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
  1095. var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
  1096. var parameter3 = new SQLiteParameter("@satcode", dto.Adja1Code);
  1097. var parameter4 = new SQLiteParameter("@satcode", dto.Adja2Code);
  1098. 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();
  1099. if (xlInfo1 == null)
  1100. {
  1101. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  1102. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  1103. }
  1104. 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();
  1105. if (xlInfo2 == null)
  1106. {
  1107. Serilog.Log.Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  1108. return Error<PosResDto>($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  1109. }
  1110. 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();
  1111. if (xlInfo3 == null)
  1112. {
  1113. Serilog.Log.Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  1114. return Error<PosResDto>($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  1115. }
  1116. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  1117. Serilog.Log.Information($"卫星{dto.Adja1Code}使用{xlInfo2.TwoLine}进行星历推算");
  1118. Serilog.Log.Information($"卫星{dto.Adja2Code}使用{xlInfo3.TwoLine}进行星历推算");
  1119. var settings = await db.SysSetings.FirstOrDefaultAsync();
  1120. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  1121. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  1122. var ephMain = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto);
  1123. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  1124. var ephAdja1 = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto2);
  1125. var XlCalcDto3 = new XlCalcDto() { tleStr = xlInfo3.TwoLine, dt = dto.SigTime };
  1126. var ephAdja2 = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto3);
  1127. var StationRes = db.StationRes.Add(new StationRes()
  1128. {
  1129. SatTxLon = dto.SatTxLon,
  1130. SatTxLat = dto.SatTxLat,
  1131. RefLon = dto.RefLon,
  1132. RefLat = dto.RefLat,
  1133. });
  1134. var cgRes = db.CgRes.Add(new CgRes()
  1135. {
  1136. SigTime = dto.SigTime,
  1137. Dto1 = dto.Dto1,
  1138. Dfo1 = dto.Dfo1,
  1139. Snr1 = dto.Snr1,
  1140. Dto2 = dto.Dto2,
  1141. Dfo2 = dto.Dfo2,
  1142. Snr2 = dto.Snr2,
  1143. YbMainDfo = dto.YbMainDfo,
  1144. YbAdja1Dfo = dto.YbAdja1Dfo,
  1145. YbAdja2Dfo = dto.YbAdja2Dfo,
  1146. TarFreqUp = dto.TarFreqUp,
  1147. TarFreqDown = dto.TarFreqDown,
  1148. RefFreqUp = dto.RefFreqUp,
  1149. RefFreqDown = dto.RefFreqDown,
  1150. StationResID = StationRes.ID,
  1151. MainCode = dto.MainCode,
  1152. Adja1Code = dto.Adja1Code,
  1153. Adja2Code = dto.Adja2Code,
  1154. MainX = ephMain.X,
  1155. MainY = ephMain.Y,
  1156. MainZ = ephMain.Z,
  1157. MainVx = ephMain.VX,
  1158. MainVy = ephMain.VY,
  1159. MainVz = ephMain.VZ,
  1160. Adja1X = ephAdja1.X,
  1161. Adja1Y = ephAdja1.Y,
  1162. Adja1Z = ephAdja1.Z,
  1163. Adja1Vx = ephAdja1.VX,
  1164. Adja1Vy = ephAdja1.VY,
  1165. Adja1Vz = ephAdja1.VZ,
  1166. Adja2X = ephAdja2.X,
  1167. Adja2Y = ephAdja2.Y,
  1168. Adja2Z = ephAdja2.Z,
  1169. Adja2Vx = ephAdja2.VX,
  1170. Adja2Vy = ephAdja2.VY,
  1171. Adja2Vz = ephAdja2.VZ,
  1172. });
  1173. var res = PosApi.X3_PosTwoDfo(cgRes, StationRes);
  1174. PosRes posRes = new PosRes()
  1175. {
  1176. SigTime = dto.SigTime,
  1177. TaskInfoID = runTask.ID,
  1178. CgResID = cgRes.ID,
  1179. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  1180. TsName = dto.TsName,
  1181. PosLon = res[0],
  1182. PosLat = res[1],
  1183. MirrLon = res[3],
  1184. MirrLat = res[4],
  1185. PosResType = EnumPosResType.X3TwoDfo,
  1186. };
  1187. posRes = db.PosRes.Add(posRes);
  1188. await db.SaveChangesAsync();
  1189. PosObServer.Instance.Pub(posRes);
  1190. return Success(Map(posRes));
  1191. }
  1192. }
  1193. #endregion
  1194. #region 双星时频差定位
  1195. /// <summary>
  1196. /// 双星时频差带参定位(含星历)
  1197. /// </summary>
  1198. /// <param name="dto">定位参数</param>
  1199. /// <returns></returns>
  1200. [HttpPost]
  1201. [CustomValidation(typeof(X2DtoDfoPosDto), "Validate")]
  1202. public async Task<AjaxResult<PosResDto>> PosX2DtoDfoAsync(X2DtoDfoPosDto dto)
  1203. {
  1204. using (RHDWContext db = new RHDWContext())
  1205. {
  1206. var runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2Dfo && p.TaskState == EnumTaskState.Running);
  1207. if (runTask == null)
  1208. {
  1209. Serilog.Log.Warning($"接收到双星时频差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  1210. return Error<PosResDto>($"多模式融合定位平台没有启动双星时频差定位任务");
  1211. }
  1212. var StationRes = db.StationRes.Add(new StationRes()
  1213. {
  1214. SatTxLon = dto.SatTxLon,
  1215. SatTxLat = dto.SatTxLat,
  1216. RefLon = dto.RefLon,
  1217. RefLat = dto.RefLat,
  1218. });
  1219. var cgRes = db.CgRes.Add(new CgRes()
  1220. {
  1221. SigTime = dto.SigTime,
  1222. Dto1 = dto.Dto,
  1223. Dfo1 = dto.Dfo,
  1224. Snr1 = dto.Snr,
  1225. YbMainDto = dto.YbMainDto,
  1226. YbAdja1Dto = dto.YbAdjaDto,
  1227. YbMainDfo = dto.YbMainDfo,
  1228. YbAdja1Dfo = dto.YbAdjaDfo,
  1229. TarFreqUp = dto.TarFreqUp,
  1230. TarFreqDown = dto.TarFreqDown,
  1231. RefFreqUp = dto.RefFreqUp,
  1232. RefFreqDown = dto.RefFreqDown,
  1233. StationResID = StationRes.ID,
  1234. MainCode = dto.MainCode,
  1235. Adja1Code = dto.AdjaCode,
  1236. MainX = dto.MainX,
  1237. MainY = dto.MainY,
  1238. MainZ = dto.MainZ,
  1239. MainVx = dto.MainVx,
  1240. MainVy = dto.MainVy,
  1241. MainVz = dto.MainVz,
  1242. Adja1X = dto.AdjaX,
  1243. Adja1Y = dto.AdjaY,
  1244. Adja1Z = dto.AdjaZ,
  1245. Adja1Vx = dto.AdjaVx,
  1246. Adja1Vy = dto.AdjaVy,
  1247. Adja1Vz = dto.AdjaVz,
  1248. });
  1249. var res = PosApi.X2_PosDtoDfo(cgRes, StationRes);
  1250. PosRes posRes = new PosRes()
  1251. {
  1252. SigTime = cgRes.SigTime,
  1253. TaskInfoID = runTask.ID,
  1254. CgResID = cgRes.ID,
  1255. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  1256. TsName = dto.TsName,
  1257. PosLon = res[0],
  1258. PosLat = res[1],
  1259. MirrLon = res[3],
  1260. MirrLat = res[4],
  1261. PosResType = EnumPosResType.X2Dfo,
  1262. };
  1263. posRes = db.PosRes.Add(posRes);
  1264. await db.SaveChangesAsync();
  1265. PosObServer.Instance.Pub(posRes);
  1266. return Success(Map(posRes));
  1267. }
  1268. }
  1269. /// <summary>
  1270. /// 双星时频差带参定位(无星历)
  1271. /// </summary>
  1272. /// <returns>返回定位结果ID</returns>
  1273. [HttpPost]
  1274. [CustomValidation(typeof(X2DtoDfoNoXlPosDto), "Validate")]
  1275. public async Task<AjaxResult<PosResDto>> PosX2DtoDfoNoXlAsync(X2DtoDfoNoXlPosDto dto)
  1276. {
  1277. using (RHDWContext db = new RHDWContext())
  1278. {
  1279. var runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2Dfo).FirstOrDefaultAsync();
  1280. if (runTask == null)
  1281. {
  1282. Serilog.Log.Warning($"接收到双星时频差带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  1283. return Error<PosResDto>($"多模式融合定位平台没有启动双星时频差定位任务");
  1284. }
  1285. var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
  1286. var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
  1287. var parameter3 = new SQLiteParameter("@satcode", dto.AdjaCode);
  1288. 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();
  1289. if (xlInfo1 == null)
  1290. {
  1291. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  1292. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  1293. }
  1294. 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();
  1295. if (xlInfo2 == null)
  1296. {
  1297. Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  1298. return Error<PosResDto>($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  1299. }
  1300. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  1301. Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
  1302. var settings = await db.SysSetings.FirstOrDefaultAsync();
  1303. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  1304. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  1305. var ephMain = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto);
  1306. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  1307. var ephAdja = HttpHelper.PostRequest<SatEphDto>(url, XlCalcDto2);
  1308. var StationRes = db.StationRes.Add(new StationRes()
  1309. {
  1310. SatTxLon = dto.SatTxLon,
  1311. SatTxLat = dto.SatTxLat,
  1312. RefLon = dto.RefLon,
  1313. RefLat = dto.RefLat,
  1314. });
  1315. var cgRes = db.CgRes.Add(new CgRes()
  1316. {
  1317. SigTime = dto.SigTime,
  1318. Dto1 = dto.Dto,
  1319. Dfo1 = dto.Dfo,
  1320. Snr1 = dto.Snr,
  1321. YbMainDto = dto.YbMainDto,
  1322. YbAdja1Dto = dto.YbAdjaDto,
  1323. YbMainDfo = dto.YbMainDfo,
  1324. YbAdja1Dfo = dto.YbAdjaDfo,
  1325. TarFreqUp = dto.TarFreqUp,
  1326. TarFreqDown = dto.TarFreqDown,
  1327. RefFreqUp = dto.RefFreqUp,
  1328. RefFreqDown = dto.RefFreqDown,
  1329. StationResID = StationRes.ID,
  1330. MainCode = dto.MainCode,
  1331. Adja1Code = dto.AdjaCode,
  1332. MainX = ephMain.X,
  1333. MainY = ephMain.Y,
  1334. MainZ = ephMain.Z,
  1335. MainVx = ephMain.VX,
  1336. MainVy = ephMain.VY,
  1337. MainVz = ephMain.VZ,
  1338. Adja1X = ephAdja.X,
  1339. Adja1Y = ephAdja.Y,
  1340. Adja1Z = ephAdja.Z,
  1341. Adja1Vx = ephAdja.VX,
  1342. Adja1Vy = ephAdja.VY,
  1343. Adja1Vz = ephAdja.VZ,
  1344. });
  1345. var res = PosApi.X2_PosDtoDfo(cgRes, StationRes);
  1346. PosRes posRes = new PosRes()
  1347. {
  1348. SigTime = dto.SigTime,
  1349. TaskInfoID = runTask.ID,
  1350. CgResID = cgRes.ID,
  1351. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  1352. TsName = dto.TsName,
  1353. PosLon = res[0],
  1354. PosLat = res[1],
  1355. MirrLon = res[3],
  1356. MirrLat = res[4],
  1357. PosResType = EnumPosResType.X2Dfo,
  1358. };
  1359. posRes = db.PosRes.Add(posRes);
  1360. await db.SaveChangesAsync();
  1361. PosObServer.Instance.Pub(posRes);
  1362. return Success(Map(posRes));
  1363. }
  1364. }
  1365. #endregion
  1366. private PosResDto Map(PosRes res)
  1367. {
  1368. return new PosResDto()
  1369. {
  1370. ID = res.ID,
  1371. SigTime = res.SigTime,
  1372. TaskInfoID = res.TaskInfoID,
  1373. TarName = string.IsNullOrWhiteSpace(res.TarName) ? "未知目标" : res.TarName,
  1374. PosLon = res.PosLon,
  1375. PosLat = res.PosLat,
  1376. MirrLon = res.MirrLon,
  1377. MirrLat = res.MirrLat,
  1378. PosResType = (EnumPosResTypeDto)((int)res.PosResType)
  1379. };
  1380. }
  1381. /// <summary>
  1382. /// 查询定位结果(暂未实现)
  1383. /// </summary>
  1384. /// <param name="dto"></param>
  1385. /// <returns></returns>
  1386. /// <exception cref="Exception"></exception>
  1387. [HttpGet]
  1388. public async Task<AjaxResult<PosResDto>> GetPosRes(PosResQueryDto dto)
  1389. {
  1390. await Task.Delay(100);
  1391. return Error<PosResDto>("该功能暂未实现!");
  1392. }
  1393. }
  1394. }