PosController.cs 74 KB

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