PosController.cs 72 KB

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