PosController.cs 82 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Data.SqlClient;
  5. using System.Data.SQLite;
  6. using System.Linq;
  7. using System.Net.Http;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Web.Http;
  11. using Newtonsoft.Json;
  12. using Serilog;
  13. using Swashbuckle.Swagger;
  14. using XdCxRhDw.Dto;
  15. using XdCxRhDW.App.Api;
  16. using XdCxRhDW.Core.Api;
  17. using XdCxRhDW.Core.ObServer;
  18. using XdCxRhDW.Core;
  19. using XdCxRhDW.Dto;
  20. using XdCxRhDW.Repostory.EFContext;
  21. using XdCxRhDW.Repostory.Model;
  22. using XdCxRhDW.WebApi.Controllers;
  23. using System.ComponentModel.DataAnnotations;
  24. using System.Web.Caching;
  25. using XdCxRhDW.Repostory;
  26. using System.IO;
  27. namespace XdCxRhDW.App.WebAPI
  28. {
  29. /// <summary>
  30. /// 定位功能相关接口
  31. /// </summary>
  32. public class PosController : BaseController
  33. {
  34. #region 一星一地测向定位
  35. /// <summary>
  36. /// 一星一地测向带参定位(含星历)
  37. /// </summary>
  38. /// <param name="dto">定位参数</param>
  39. /// <returns></returns>
  40. [HttpPost]
  41. public async Task<AjaxResult<PosResDto>> PosX1D1Async(X1D1PosDto dto)
  42. {
  43. TaskInfo runTask;
  44. using (RHDWContext db = new RHDWContext())
  45. {
  46. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running);
  47. if (runTask == null)
  48. {
  49. Serilog.Log.Warning($"接收到一星一地测向带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  50. return Error<PosResDto>($"多模式融合定位平台没有启动一星一地测向定位任务");
  51. }
  52. }
  53. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  54. {
  55. var StationRes = db.StationRes.Add(new StationRes()
  56. {
  57. SatTxLon = dto.SatTxLon,
  58. SatTxLat = dto.SatTxLat,
  59. CdbTxLon = dto.CdbTxLon,
  60. CdbTxLat = dto.CdbTxLat,
  61. CxLon = dto.CxLon,
  62. CxLat = dto.CxLat,
  63. RefLon = dto.RefLon,
  64. RefLat = dto.RefLat,
  65. });
  66. var cgRes = db.CgRes.Add(new CgRes()
  67. {
  68. SigTime = dto.SigTime,
  69. DtoCdb = dto.XdDto,
  70. DfoCdb = dto.XdDfo,
  71. SnrCdb = dto.XdSnr,
  72. YbMainDto = dto.MainYbDto,
  73. StationResID = StationRes.ID,
  74. MainCode = dto.MainCode,
  75. TaskID = runTask.ID,
  76. MainX = dto.MainX,
  77. MainY = dto.MainY,
  78. MainZ = dto.MainZ,
  79. });
  80. var cxRes = db.CxRes.Add(new CxRes()
  81. {
  82. SigTime = dto.SigTime,
  83. Fx = dto.CxRes,
  84. });
  85. var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes);
  86. PosRes posRes = new PosRes()
  87. {
  88. SigTime = cgRes.SigTime,
  89. TaskInfoID = runTask.ID,
  90. CxResID = cxRes.ID,
  91. CgResID = cgRes.ID,
  92. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  93. TsName = dto.TsName,
  94. PosLon = res[0],
  95. PosLat = res[1],
  96. MirrLon = res[3],
  97. MirrLat = res[4],
  98. PosResType = EnumPosResType.X1D1CX,
  99. };
  100. posRes = db.PosRes.Add(posRes);
  101. await db.SaveChangesAsync();
  102. PosObServer.Instance.Pub(posRes);
  103. return Success(Map(posRes));
  104. }
  105. }
  106. /// <summary>
  107. /// 一星一地测向带参定位(无星历)
  108. /// </summary>
  109. /// <returns>返回定位结果ID</returns>
  110. [HttpPost]
  111. public async Task<AjaxResult<PosResDto>> PosX1D1NoXlAsync(X1D1NoXlPosDto dto)
  112. {
  113. TaskInfo runTask;
  114. SysSetings settings;
  115. using (RHDWContext db = new RHDWContext())
  116. {
  117. runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X1D1CX).FirstOrDefaultAsync();
  118. if (runTask == null)
  119. {
  120. Serilog.Log.Warning($"接收到一星一地带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  121. return Error<PosResDto>($"多模式融合定位平台没有启动一星一地定位任务");
  122. }
  123. settings = await db.SysSetings.FirstOrDefaultAsync();
  124. }
  125. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  126. {
  127. var xlInfoList = await XlCache.GetAllAsync();
  128. var mainXl = xlInfoList.Where(w => w.SatCode == dto.MainCode);
  129. if (!mainXl.Any())
  130. {
  131. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  132. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  133. }
  134. var minTime = mainXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  135. var xlInfo1 = mainXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime).FirstOrDefault();
  136. //var parameter1 = new SQLiteParameter("@sigTime", dto.SigTime);
  137. //var parameter2 = new SQLiteParameter("@satcode", dto.MainCode);
  138. //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();
  139. if (xlInfo1 == null)
  140. {
  141. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  142. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  143. }
  144. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  145. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  146. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  147. var ephMain = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto);
  148. if (ephMain.code != 200)
  149. {
  150. Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
  151. return Error<PosResDto>($"推算[{dto.MainCode}]的星历出错");
  152. }
  153. var StationRes = db.StationRes.Add(new StationRes()
  154. {
  155. SatTxLon = dto.SatTxLon,
  156. SatTxLat = dto.SatTxLat,
  157. CdbTxLon = dto.CdbTxLon,
  158. CdbTxLat = dto.CdbTxLat,
  159. CxLon = dto.CxLon,
  160. CxLat = dto.CxLat,
  161. RefLon = dto.RefLon,
  162. RefLat = dto.RefLat,
  163. });
  164. var cgRes = db.CgRes.Add(new CgRes()
  165. {
  166. SigTime = dto.SigTime,
  167. DtoCdb = dto.XdDto,
  168. DfoCdb = dto.XdDfo,
  169. SnrCdb = dto.XdSnr,
  170. YbMainDto = dto.MainYbDto,
  171. StationResID = StationRes.ID,
  172. MainCode = dto.MainCode,
  173. TaskID = runTask.ID,
  174. MainX = ephMain.data.X,
  175. MainY = ephMain.data.Y,
  176. MainZ = ephMain.data.Z,
  177. });
  178. var cxRes = db.CxRes.Add(new CxRes()
  179. {
  180. SigTime = dto.SigTime,
  181. Fx = dto.CxRes,
  182. });
  183. var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes);
  184. PosRes posRes = new PosRes()
  185. {
  186. SigTime = dto.SigTime,
  187. TaskInfoID = runTask.ID,
  188. CgResID = cgRes.ID,
  189. CxResID = cxRes.ID,
  190. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  191. TsName = dto.TsName,
  192. PosLon = res[0],
  193. PosLat = res[1],
  194. MirrLon = res[3],
  195. MirrLat = res[4],
  196. PosResType = EnumPosResType.X1D1CX,
  197. };
  198. posRes = db.PosRes.Add(posRes);
  199. await db.SaveChangesAsync();
  200. PosObServer.Instance.Pub(posRes);
  201. return Success(Map(posRes));
  202. }
  203. }
  204. #endregion
  205. #region 两星一地定位
  206. /// <summary>
  207. /// 两星一地带参定位(含星历)
  208. /// </summary>
  209. /// <param name="dto">定位参数</param>
  210. /// <returns></returns>
  211. [HttpPost]
  212. public async Task<AjaxResult<PosResDto>> PosX2D1Async(X2D1PosDto dto)
  213. {
  214. TaskInfo runTask;
  215. using (RHDWContext db = new RHDWContext())
  216. {
  217. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  218. if (runTask == null)
  219. {
  220. Serilog.Log.Warning($"接收到两星一地带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  221. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  222. }
  223. }
  224. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  225. {
  226. var StationRes = db.StationRes.Add(new StationRes()
  227. {
  228. SatTxLon = dto.SatTxLon,
  229. SatTxLat = dto.SatTxLat,
  230. CdbTxLon = dto.CdbTxLon,
  231. CdbTxLat = dto.CdbTxLat,
  232. RefLon = dto.RefLon,
  233. RefLat = dto.RefLat,
  234. });
  235. var cgRes = db.CgRes.Add(new CgRes()
  236. {
  237. SigTime = dto.SigTime,
  238. Dto1 = dto.SxDto,
  239. Dfo1 = dto.SxDfo,
  240. Snr1 = dto.SxSnr,
  241. DtoCdb = dto.XdDto,
  242. DfoCdb = dto.XdDfo,
  243. SnrCdb = dto.XdSnr,
  244. YbMainDto = dto.MainYbDto,
  245. YbAdja1Dto = dto.AdjaYbDto,
  246. StationResID = StationRes.ID,
  247. MainCode = dto.MainCode,
  248. Adja1Code = dto.AdjaCode,
  249. TaskID = runTask.ID,
  250. MainX = dto.MainX,
  251. MainY = dto.MainY,
  252. MainZ = dto.MainZ,
  253. Adja1X = dto.AdjaX,
  254. Adja1Y = dto.AdjaY,
  255. Adja1Z = dto.AdjaZ,
  256. });
  257. var res = PosApi.X2D1_Pos(cgRes, StationRes);
  258. PosRes posRes = new PosRes()
  259. {
  260. SigTime = cgRes.SigTime,
  261. TaskInfoID = runTask.ID,
  262. CgResID = cgRes.ID,
  263. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  264. TsName = dto.TsName,
  265. PosLon = res[0],
  266. PosLat = res[1],
  267. MirrLon = res[3],
  268. MirrLat = res[4],
  269. PosResType = EnumPosResType.X2D1,
  270. };
  271. posRes = db.PosRes.Add(posRes);
  272. await db.SaveChangesAsync();
  273. PosObServer.Instance.Pub(posRes);
  274. return Success(Map(posRes));
  275. }
  276. }
  277. /// <summary>
  278. /// 两星一地带参定位(无星历)
  279. /// </summary>
  280. /// <returns>返回定位结果ID</returns>
  281. [HttpPost]
  282. public async Task<AjaxResult<PosResDto>> PosX2D1NoXlAsync(X2D1NoXlPosDto dto)
  283. {
  284. TaskInfo runTask;
  285. SysSetings settings;
  286. using (RHDWContext db = new RHDWContext())
  287. {
  288. runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2D1).FirstOrDefaultAsync();
  289. if (runTask == null)
  290. {
  291. Serilog.Log.Warning($"接收到两星一地带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  292. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  293. }
  294. settings = await db.SysSetings.FirstOrDefaultAsync();
  295. }
  296. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  297. {
  298. var xlInfoList = await XlCache.GetAllAsync();
  299. var mainXl = xlInfoList.Where(w => w.SatCode == dto.MainCode);
  300. if (!mainXl.Any())
  301. {
  302. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  303. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  304. }
  305. var minTime = mainXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  306. var xlInfo1 = mainXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime).FirstOrDefault();
  307. if (xlInfo1 == null)
  308. {
  309. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  310. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  311. }
  312. var adjaXl = xlInfoList.Where(w => w.SatCode == dto.AdjaCode);
  313. if (!adjaXl.Any())
  314. {
  315. Serilog.Log.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  316. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  317. }
  318. var minTime2 = adjaXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  319. var xlInfo2 = adjaXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime2).FirstOrDefault();
  320. if (xlInfo2 == null)
  321. {
  322. Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  323. return Error<PosResDto>($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  324. }
  325. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  326. Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
  327. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  328. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  329. var ephMain = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto);
  330. if (ephMain.code != 200)
  331. {
  332. Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
  333. return Error<PosResDto>($"推算[{dto.MainCode}]的星历出错");
  334. }
  335. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  336. var ephAdja = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto2);
  337. if (ephAdja.code != 200)
  338. {
  339. Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
  340. return Error<PosResDto>($"推算[{dto.MainCode}]的星历出错");
  341. }
  342. var StationRes = db.StationRes.Add(new StationRes()
  343. {
  344. SatTxLon = dto.SatTxLon,
  345. SatTxLat = dto.SatTxLat,
  346. CdbTxLon = dto.CdbTxLon,
  347. CdbTxLat = dto.CdbTxLat,
  348. RefLon = dto.RefLon,
  349. RefLat = dto.RefLat,
  350. });
  351. var cgRes = db.CgRes.Add(new CgRes()
  352. {
  353. SigTime = dto.SigTime,
  354. Dto1 = dto.SxDto,
  355. Dfo1 = dto.SxDfo,
  356. Snr1 = dto.SxSnr,
  357. DtoCdb = dto.XdDto,
  358. DfoCdb = dto.XdDfo,
  359. SnrCdb = dto.XdSnr,
  360. YbMainDto = dto.MainYbDto,
  361. YbAdja1Dto = dto.AdjaYbDto,
  362. StationResID = StationRes.ID,
  363. MainCode = dto.MainCode,
  364. Adja1Code = dto.AdjaCode,
  365. TaskID = runTask.ID,
  366. MainX = ephMain.data.X,
  367. MainY = ephMain.data.Y,
  368. MainZ = ephMain.data.Z,
  369. Adja1X = ephAdja.data.X,
  370. Adja1Y = ephAdja.data.Y,
  371. Adja1Z = ephAdja.data.Z,
  372. });
  373. var res = PosApi.X2D1_Pos(cgRes, StationRes);
  374. PosRes posRes = new PosRes()
  375. {
  376. SigTime = dto.SigTime,
  377. TaskInfoID = runTask.ID,
  378. CgResID = cgRes.ID,
  379. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  380. TsName = dto.TsName,
  381. PosLon = res[0],
  382. PosLat = res[1],
  383. MirrLon = res[3],
  384. MirrLat = res[4],
  385. PosResType = EnumPosResType.X2D1,
  386. };
  387. posRes = db.PosRes.Add(posRes);
  388. await db.SaveChangesAsync();
  389. PosObServer.Instance.Pub(posRes);
  390. return Success(Map(posRes));
  391. }
  392. }
  393. /// <summary>
  394. /// 两星一地无参定位(含星历)
  395. /// </summary>
  396. /// <param name="dto">定位参数</param>
  397. /// <returns></returns>
  398. [HttpPost]
  399. public async Task<AjaxResult<PosResDto>> PosX2D1NoParAsync(X2D1NoParPosDto dto)
  400. {
  401. TaskInfo runTask;
  402. using (RHDWContext db = new RHDWContext())
  403. {
  404. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  405. if (runTask == null)
  406. {
  407. Serilog.Log.Warning($"接收到两星一地无参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  408. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  409. }
  410. }
  411. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  412. {
  413. var StationRes = db.StationRes.Add(new StationRes()
  414. {
  415. SatTxLon = dto.SatTxLon,
  416. SatTxLat = dto.SatTxLat,
  417. CdbTxLon = dto.CdbTxLon,
  418. CdbTxLat = dto.CdbTxLat,
  419. });
  420. var cgRes = db.CgRes.Add(new CgRes()
  421. {
  422. SigTime = dto.SigTime,
  423. Dto1 = dto.SxDto,
  424. Dfo1 = dto.SxDfo,
  425. Snr1 = dto.SxSnr,
  426. DtoCdb = dto.XdDto,
  427. DfoCdb = dto.XdDfo,
  428. SnrCdb = dto.XdSnr,
  429. StationResID = StationRes.ID,
  430. MainCode = dto.MainCode,
  431. Adja1Code = dto.AdjaCode,
  432. TaskID = runTask.ID,
  433. MainX = dto.MainX,
  434. MainY = dto.MainY,
  435. MainZ = dto.MainZ,
  436. Adja1X = dto.AdjaX,
  437. Adja1Y = dto.AdjaY,
  438. Adja1Z = dto.AdjaZ,
  439. });
  440. var res = PosApi.X2D1_PosNoRef(cgRes, StationRes);
  441. PosRes posRes = new PosRes()
  442. {
  443. SigTime = cgRes.SigTime,
  444. TaskInfoID = runTask.ID,
  445. CgResID = cgRes.ID,
  446. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  447. TsName = dto.TsName,
  448. PosLon = res[0],
  449. PosLat = res[1],
  450. MirrLon = res[3],
  451. MirrLat = res[4],
  452. PosResType = EnumPosResType.X2D1NoRef,
  453. };
  454. posRes = db.PosRes.Add(posRes);
  455. await db.SaveChangesAsync();
  456. PosObServer.Instance.Pub(posRes);
  457. return Success(Map(posRes));
  458. }
  459. }
  460. /// <summary>
  461. /// 两星一地无参定位(无星历)
  462. /// </summary>
  463. /// <returns>返回定位结果ID</returns>
  464. [HttpPost]
  465. public async Task<AjaxResult<PosResDto>> PosX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto)
  466. {
  467. TaskInfo runTask;
  468. SysSetings settings;
  469. using (RHDWContext db = new RHDWContext())
  470. {
  471. runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2D1).FirstOrDefaultAsync();
  472. if (runTask == null)
  473. {
  474. Serilog.Log.Warning($"接收到两星一地无参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  475. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  476. }
  477. settings = await db.SysSetings.FirstOrDefaultAsync();
  478. }
  479. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  480. {
  481. var xlInfoList = await XlCache.GetAllAsync();
  482. var mainXl = xlInfoList.Where(w => w.SatCode == dto.MainCode);
  483. if (!mainXl.Any())
  484. {
  485. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  486. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  487. }
  488. var minTime = mainXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  489. var xlInfo1 = mainXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime).FirstOrDefault();
  490. if (xlInfo1 == null)
  491. {
  492. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  493. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  494. }
  495. var adjaXl = xlInfoList.Where(w => w.SatCode == dto.AdjaCode);
  496. if (!adjaXl.Any())
  497. {
  498. Serilog.Log.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  499. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  500. }
  501. var minTime2 = adjaXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  502. var xlInfo2 = adjaXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime2).FirstOrDefault();
  503. if (xlInfo2 == null)
  504. {
  505. Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  506. return Error<PosResDto>($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  507. }
  508. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  509. Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
  510. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  511. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  512. var ephMain = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto);
  513. if (ephMain.code != 200)
  514. {
  515. Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
  516. return Error<PosResDto>($"推算[{dto.MainCode}]的星历出错");
  517. }
  518. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  519. var ephAdja = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto2);
  520. if (ephAdja.code != 200)
  521. {
  522. Serilog.Log.Error($"推算[{dto.AdjaCode}]的星历出错");
  523. return Error<PosResDto>($"推算[{dto.AdjaCode}]的星历出错");
  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. });
  532. var cgRes = db.CgRes.Add(new CgRes()
  533. {
  534. SigTime = dto.SigTime,
  535. Dto1 = dto.SxDto,
  536. Dfo1 = dto.SxDfo,
  537. Snr1 = dto.SxSnr,
  538. DtoCdb = dto.XdDto,
  539. DfoCdb = dto.XdDfo,
  540. SnrCdb = dto.XdSnr,
  541. StationResID = StationRes.ID,
  542. MainCode = dto.MainCode,
  543. Adja1Code = dto.AdjaCode,
  544. TaskID = runTask.ID,
  545. MainX = ephMain.data.X,
  546. MainY = ephMain.data.Y,
  547. MainZ = ephMain.data.Z,
  548. Adja1X = ephAdja.data.X,
  549. Adja1Y = ephAdja.data.Y,
  550. Adja1Z = ephAdja.data.Z,
  551. });
  552. var res = PosApi.X2D1_PosNoRef(cgRes, StationRes);
  553. PosRes posRes = new PosRes()
  554. {
  555. SigTime = dto.SigTime,
  556. TaskInfoID = runTask.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. PosResType = EnumPosResType.X2D1NoRef,
  565. };
  566. posRes = db.PosRes.Add(posRes);
  567. await db.SaveChangesAsync();
  568. PosObServer.Instance.Pub(posRes);
  569. return Success(Map(posRes));
  570. }
  571. }
  572. #endregion
  573. #region 融合定位
  574. /// <summary>
  575. /// 融合带参定位(含星历)
  576. /// </summary>
  577. /// <param name="dto">定位参数</param>
  578. /// <returns></returns>
  579. [HttpPost]
  580. public async Task<AjaxResult<PosResDto>> PosRhAsync(RHPosDto dto)
  581. {
  582. TaskInfo runTask;
  583. using (RHDWContext db = new RHDWContext())
  584. {
  585. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running);
  586. if (runTask == null)
  587. {
  588. Serilog.Log.Warning($"接收到融合带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  589. return Error<PosResDto>($"多模式融合定位平台没有启动融合定位任务");
  590. }
  591. }
  592. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  593. {
  594. var StationRes = db.StationRes.Add(new StationRes()
  595. {
  596. SatTxLon = dto.SatTxLon,
  597. SatTxLat = dto.SatTxLat,
  598. CdbTxLon = dto.CdbTxLon,
  599. CdbTxLat = dto.CdbTxLat,
  600. CxLon = dto.CxLon,
  601. CxLat = dto.CxLat,
  602. RefLon = dto.RefLon,
  603. RefLat = dto.RefLat,
  604. });
  605. var cgRes = db.CgRes.Add(new CgRes()
  606. {
  607. SigTime = dto.SigTime,
  608. Dto1 = dto.SxDto,
  609. Dfo1 = dto.SxDfo,
  610. Snr1 = dto.SxSnr,
  611. DtoCdb = dto.XdDto,
  612. DfoCdb = dto.XdDfo,
  613. SnrCdb = dto.XdSnr,
  614. YbMainDto = dto.MainYbDto,
  615. YbAdja1Dto = dto.AdjaYbDto,
  616. StationResID = StationRes.ID,
  617. MainCode = dto.MainCode,
  618. Adja1Code = dto.AdjaCode,
  619. TaskID = runTask.ID,
  620. MainX = dto.MainX,
  621. MainY = dto.MainY,
  622. MainZ = dto.MainZ,
  623. Adja1X = dto.AdjaX,
  624. Adja1Y = dto.AdjaY,
  625. Adja1Z = dto.AdjaZ,
  626. });
  627. var cxRes = db.CxRes.Add(new CxRes()
  628. {
  629. SigTime = dto.SigTime,
  630. Fx = dto.CxRes,
  631. });
  632. var res = PosApi.RH_Pos(cgRes, StationRes, cxRes);
  633. PosRes posRes = new PosRes()
  634. {
  635. SigTime = cgRes.SigTime,
  636. TaskInfoID = runTask.ID,
  637. CxResID = cxRes.ID,
  638. CgResID = cgRes.ID,
  639. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  640. TsName = dto.TsName,
  641. PosLon = res[0],
  642. PosLat = res[1],
  643. MirrLon = res[3],
  644. MirrLat = res[4],
  645. PosResType = EnumPosResType.RH,
  646. };
  647. posRes = db.PosRes.Add(posRes);
  648. await db.SaveChangesAsync();
  649. PosObServer.Instance.Pub(posRes);
  650. return Success(Map(posRes));
  651. }
  652. }
  653. /// <summary>
  654. /// 融合带参定位(无星历)
  655. /// </summary>
  656. /// <returns>返回定位结果ID</returns>
  657. [HttpPost]
  658. public async Task<AjaxResult<PosResDto>> PosRhNoXlAsync(RHNoXlPosDto dto)
  659. {
  660. TaskInfo runTask;
  661. SysSetings settings;
  662. using (RHDWContext db = new RHDWContext())
  663. {
  664. runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.RH).FirstOrDefaultAsync();
  665. if (runTask == null)
  666. {
  667. Serilog.Log.Warning($"接收到融合带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  668. return Error<PosResDto>($"多模式融合定位平台没有启动融合定位任务");
  669. }
  670. settings = await db.SysSetings.FirstOrDefaultAsync();
  671. }
  672. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  673. {
  674. var xlInfoList = await XlCache.GetAllAsync();
  675. var mainXl = xlInfoList.Where(w => w.SatCode == dto.MainCode);
  676. if (!mainXl.Any())
  677. {
  678. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  679. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  680. }
  681. var minTime = mainXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  682. var xlInfo1 = mainXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime).FirstOrDefault();
  683. if (xlInfo1 == null)
  684. {
  685. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  686. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  687. }
  688. var adjaXl = xlInfoList.Where(w => w.SatCode == dto.AdjaCode);
  689. if (!adjaXl.Any())
  690. {
  691. Serilog.Log.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  692. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  693. }
  694. var minTime2 = adjaXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  695. var xlInfo2 = adjaXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime2).FirstOrDefault();
  696. if (xlInfo2 == null)
  697. {
  698. Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  699. return Error<PosResDto>($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  700. }
  701. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  702. Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
  703. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  704. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  705. var ephMain = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto);
  706. if (ephMain.code != 200)
  707. {
  708. Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
  709. return Error<PosResDto>($"推算[{dto.MainCode}]的星历出错");
  710. }
  711. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  712. var ephAdja = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto2);
  713. if (ephAdja.code != 200)
  714. {
  715. Serilog.Log.Error($"推算[{dto.AdjaCode}]的星历出错");
  716. return Error<PosResDto>($"推算[{dto.AdjaCode}]的星历出错");
  717. }
  718. var StationRes = db.StationRes.Add(new StationRes()
  719. {
  720. SatTxLon = dto.SatTxLon,
  721. SatTxLat = dto.SatTxLat,
  722. CdbTxLon = dto.CdbTxLon,
  723. CdbTxLat = dto.CdbTxLat,
  724. CxLon = dto.CxLon,
  725. CxLat = dto.CxLat,
  726. RefLon = dto.RefLon,
  727. RefLat = dto.RefLat,
  728. });
  729. var cgRes = db.CgRes.Add(new CgRes()
  730. {
  731. SigTime = dto.SigTime,
  732. Dto1 = dto.SxDto,
  733. Dfo1 = dto.SxDfo,
  734. Snr1 = dto.SxSnr,
  735. DtoCdb = dto.XdDto,
  736. DfoCdb = dto.XdDfo,
  737. SnrCdb = dto.XdSnr,
  738. YbMainDto = dto.MainYbDto,
  739. YbAdja1Dto = dto.AdjaYbDto,
  740. StationResID = StationRes.ID,
  741. MainCode = dto.MainCode,
  742. Adja1Code = dto.AdjaCode,
  743. TaskID = runTask.ID,
  744. MainX = ephMain.data.X,
  745. MainY = ephMain.data.Y,
  746. MainZ = ephMain.data.Z,
  747. Adja1X = ephAdja.data.X,
  748. Adja1Y = ephAdja.data.Y,
  749. Adja1Z = ephAdja.data.Z,
  750. });
  751. var cxRes = db.CxRes.Add(new CxRes()
  752. {
  753. SigTime = dto.SigTime,
  754. Fx = dto.CxRes,
  755. });
  756. var res = PosApi.RH_Pos(cgRes, StationRes, cxRes);
  757. PosRes posRes = new PosRes()
  758. {
  759. SigTime = cgRes.SigTime,
  760. TaskInfoID = runTask.ID,
  761. CxResID = cxRes.ID,
  762. CgResID = cgRes.ID,
  763. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  764. TsName = dto.TsName,
  765. PosLon = res[0],
  766. PosLat = res[1],
  767. MirrLon = res[3],
  768. MirrLat = res[4],
  769. PosResType = EnumPosResType.RH,
  770. };
  771. posRes = db.PosRes.Add(posRes);
  772. await db.SaveChangesAsync();
  773. PosObServer.Instance.Pub(posRes);
  774. return Success(Map(posRes));
  775. }
  776. }
  777. #endregion
  778. #region 三星双时差定位
  779. /// <summary>
  780. /// 三星双时差带参定位(含星历)
  781. /// </summary>
  782. /// <param name="dto">定位参数</param>
  783. /// <returns></returns>
  784. [HttpPost]
  785. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoAsync(X3TwoDtoPosDto dto)
  786. {
  787. TaskInfo runTask;
  788. using (RHDWContext db = new RHDWContext())
  789. {
  790. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  791. if (runTask == null)
  792. {
  793. Serilog.Log.Warning($"接收到三星双时差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  794. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  795. }
  796. }
  797. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  798. {
  799. var StationRes = db.StationRes.Add(new StationRes()
  800. {
  801. SatTxLon = dto.SatTxLon,
  802. SatTxLat = dto.SatTxLat,
  803. RefLon = dto.RefLon,
  804. RefLat = dto.RefLat,
  805. });
  806. var cgRes = db.CgRes.Add(new CgRes()
  807. {
  808. SigTime = dto.SigTime,
  809. Dto1 = dto.Dto1,
  810. Dfo1 = dto.Dfo1,
  811. Snr1 = dto.Snr1,
  812. Dto2 = dto.Dto2,
  813. Dfo2 = dto.Dfo2,
  814. Snr2 = dto.Snr2,
  815. YbMainDto = dto.YbMainDto,
  816. YbAdja1Dto = dto.YbAdja1Dto,
  817. YbAdja2Dto = dto.YbAdja2Dto,
  818. StationResID = StationRes.ID,
  819. MainCode = dto.MainCode,
  820. Adja1Code = dto.Adja1Code,
  821. Adja2Code = dto.Adja2Code,
  822. TaskID = runTask.ID,
  823. MainX = dto.MainX,
  824. MainY = dto.MainY,
  825. MainZ = dto.MainZ,
  826. Adja1X = dto.Adja1X,
  827. Adja1Y = dto.Adja1Y,
  828. Adja1Z = dto.Adja1Z,
  829. Adja2X = dto.Adja2X,
  830. Adja2Y = dto.Adja2Y,
  831. Adja2Z = dto.Adja2Z,
  832. });
  833. var res = PosApi.X3_Pos(cgRes, StationRes);
  834. PosRes posRes = new PosRes()
  835. {
  836. SigTime = cgRes.SigTime,
  837. TaskInfoID = runTask.ID,
  838. CgResID = cgRes.ID,
  839. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  840. TsName = dto.TsName,
  841. PosLon = res[0],
  842. PosLat = res[1],
  843. MirrLon = res[3],
  844. MirrLat = res[4],
  845. PosResType = EnumPosResType.X3,
  846. };
  847. posRes = db.PosRes.Add(posRes);
  848. await db.SaveChangesAsync();
  849. PosObServer.Instance.Pub(posRes);
  850. return Success(Map(posRes));
  851. }
  852. }
  853. /// <summary>
  854. /// 三星双时差带参定位(无星历)
  855. /// </summary>
  856. /// <returns>返回定位结果ID</returns>
  857. [HttpPost]
  858. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoXlAsync(X3TwoDtoNoXlPosDto dto)
  859. {
  860. TaskInfo runTask;
  861. SysSetings settings;
  862. using (RHDWContext db = new RHDWContext())
  863. {
  864. runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDto).FirstOrDefaultAsync();
  865. if (runTask == null)
  866. {
  867. Serilog.Log.Warning($"接收到三星双时差带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  868. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  869. }
  870. settings = await db.SysSetings.FirstOrDefaultAsync();
  871. }
  872. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  873. {
  874. var xlInfoList = await XlCache.GetAllAsync();
  875. var mainXl = xlInfoList.Where(w => w.SatCode == dto.MainCode);
  876. if (!mainXl.Any())
  877. {
  878. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  879. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  880. }
  881. var minTime = mainXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  882. var xlInfo1 = mainXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime).FirstOrDefault();
  883. if (xlInfo1 == null)
  884. {
  885. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  886. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  887. }
  888. var adja1Xl = xlInfoList.Where(w => w.SatCode == dto.Adja1Code);
  889. if (!adja1Xl.Any())
  890. {
  891. Serilog.Log.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  892. return Error<PosResDto>($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  893. }
  894. var minTime2 = adja1Xl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  895. var xlInfo2 = adja1Xl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime2).FirstOrDefault();
  896. if (xlInfo2 == null)
  897. {
  898. Serilog.Log.Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  899. return Error<PosResDto>($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  900. }
  901. var adja2Xl = xlInfoList.Where(w => w.SatCode == dto.Adja2Code);
  902. if (!adja2Xl.Any())
  903. {
  904. Serilog.Log.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  905. return Error<PosResDto>($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  906. }
  907. var minTime3 = adja2Xl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  908. var xlInfo3 = adja2Xl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime3).FirstOrDefault();
  909. if (xlInfo3 == null)
  910. {
  911. Serilog.Log.Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  912. return Error<PosResDto>($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  913. }
  914. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  915. Serilog.Log.Information($"卫星{dto.Adja1Code}使用{xlInfo2.TwoLine}进行星历推算");
  916. Serilog.Log.Information($"卫星{dto.Adja2Code}使用{xlInfo3.TwoLine}进行星历推算");
  917. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  918. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  919. var ephMain = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto);
  920. if (ephMain.code != 200)
  921. {
  922. Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
  923. return Error<PosResDto>($"推算[{dto.MainCode}]的星历出错");
  924. }
  925. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  926. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto2);
  927. if (ephAdja1.code != 200)
  928. {
  929. Serilog.Log.Error($"推算[{dto.Adja1Code}]的星历出错");
  930. return Error<PosResDto>($"推算[{dto.Adja1Code}]的星历出错");
  931. }
  932. var XlCalcDto3 = new XlCalcDto() { tleStr = xlInfo3.TwoLine, dt = dto.SigTime };
  933. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto3);
  934. if (ephAdja2.code != 200)
  935. {
  936. Serilog.Log.Error($"推算[{dto.Adja2Code}]的星历出错");
  937. return Error<PosResDto>($"推算[{dto.Adja2Code}]的星历出错");
  938. }
  939. var StationRes = db.StationRes.Add(new StationRes()
  940. {
  941. SatTxLon = dto.SatTxLon,
  942. SatTxLat = dto.SatTxLat,
  943. RefLon = dto.RefLon,
  944. RefLat = dto.RefLat,
  945. });
  946. var cgRes = db.CgRes.Add(new CgRes()
  947. {
  948. SigTime = dto.SigTime,
  949. Dto1 = dto.Dto1,
  950. Dfo1 = dto.Dfo1,
  951. Snr1 = dto.Snr1,
  952. Dto2 = dto.Dto2,
  953. Dfo2 = dto.Dfo2,
  954. Snr2 = dto.Snr2,
  955. YbMainDto = dto.YbMainDto,
  956. YbAdja1Dto = dto.YbAdja1Dto,
  957. YbAdja2Dto = dto.YbAdja2Dto,
  958. StationResID = StationRes.ID,
  959. MainCode = dto.MainCode,
  960. Adja1Code = dto.Adja1Code,
  961. Adja2Code = dto.Adja2Code,
  962. TaskID = runTask.ID,
  963. MainX = ephMain.data.X,
  964. MainY = ephMain.data.Y,
  965. MainZ = ephMain.data.Z,
  966. Adja1X = ephAdja1.data.X,
  967. Adja1Y = ephAdja1.data.Y,
  968. Adja1Z = ephAdja1.data.Z,
  969. Adja2X = ephAdja2.data.X,
  970. Adja2Y = ephAdja2.data.Y,
  971. Adja2Z = ephAdja2.data.Z,
  972. });
  973. var res = PosApi.X3_Pos(cgRes, StationRes);
  974. PosRes posRes = new PosRes()
  975. {
  976. SigTime = dto.SigTime,
  977. TaskInfoID = runTask.ID,
  978. CgResID = cgRes.ID,
  979. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  980. TsName = dto.TsName,
  981. PosLon = res[0],
  982. PosLat = res[1],
  983. MirrLon = res[3],
  984. MirrLat = res[4],
  985. PosResType = EnumPosResType.X3,
  986. };
  987. posRes = db.PosRes.Add(posRes);
  988. await db.SaveChangesAsync();
  989. PosObServer.Instance.Pub(posRes);
  990. return Success(Map(posRes));
  991. }
  992. }
  993. /// <summary>
  994. /// 三星双时差无参定位(含星历)
  995. /// </summary>
  996. /// <param name="dto">定位参数</param>
  997. /// <returns></returns>
  998. [HttpPost]
  999. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoParAsync(X3TwoDtoNoParPosDto dto)
  1000. {
  1001. TaskInfo runTask;
  1002. using (RHDWContext db = new RHDWContext())
  1003. {
  1004. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  1005. if (runTask == null)
  1006. {
  1007. Serilog.Log.Warning($"接收到三星双时差无参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  1008. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  1009. }
  1010. }
  1011. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  1012. {
  1013. var StationRes = db.StationRes.Add(new StationRes()
  1014. {
  1015. SatTxLon = dto.SatTxLon,
  1016. SatTxLat = dto.SatTxLat,
  1017. });
  1018. var cgRes = db.CgRes.Add(new CgRes()
  1019. {
  1020. SigTime = dto.SigTime,
  1021. Dto1 = dto.Dto1,
  1022. Dfo1 = dto.Dfo1,
  1023. Snr1 = dto.Snr1,
  1024. Dto2 = dto.Dto2,
  1025. Dfo2 = dto.Dfo2,
  1026. Snr2 = dto.Snr2,
  1027. StationResID = StationRes.ID,
  1028. MainCode = dto.MainCode,
  1029. Adja1Code = dto.Adja1Code,
  1030. Adja2Code = dto.Adja2Code,
  1031. TaskID = runTask.ID,
  1032. MainX = dto.MainX,
  1033. MainY = dto.MainY,
  1034. MainZ = dto.MainZ,
  1035. Adja1X = dto.Adja1X,
  1036. Adja1Y = dto.Adja1Y,
  1037. Adja1Z = dto.Adja1Z,
  1038. Adja2X = dto.Adja2X,
  1039. Adja2Y = dto.Adja2Y,
  1040. Adja2Z = dto.Adja2Z,
  1041. });
  1042. var res = PosApi.X3_PosNoRef(cgRes, StationRes);
  1043. PosRes posRes = new PosRes()
  1044. {
  1045. SigTime = cgRes.SigTime,
  1046. TaskInfoID = runTask.ID,
  1047. CgResID = cgRes.ID,
  1048. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  1049. TsName = dto.TsName,
  1050. PosLon = res[0],
  1051. PosLat = res[1],
  1052. MirrLon = res[3],
  1053. MirrLat = res[4],
  1054. PosResType = EnumPosResType.X3NoRef,
  1055. };
  1056. posRes = db.PosRes.Add(posRes);
  1057. await db.SaveChangesAsync();
  1058. PosObServer.Instance.Pub(posRes);
  1059. return Success(Map(posRes));
  1060. }
  1061. }
  1062. /// <summary>
  1063. /// 三星双时差无参定位(无星历)
  1064. /// </summary>
  1065. /// <returns>返回定位结果ID</returns>
  1066. [HttpPost]
  1067. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoXlNoParAsync(X3TwoDtoNoXlNoParPosDto dto)
  1068. {
  1069. TaskInfo runTask;
  1070. SysSetings settings;
  1071. using (RHDWContext db = new RHDWContext())
  1072. {
  1073. runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDto).FirstOrDefaultAsync();
  1074. if (runTask == null)
  1075. {
  1076. Serilog.Log.Warning($"接收到三星双时差无参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  1077. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  1078. }
  1079. settings = await db.SysSetings.FirstOrDefaultAsync();
  1080. }
  1081. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  1082. {
  1083. var xlInfoList = await XlCache.GetAllAsync();
  1084. var mainXl = xlInfoList.Where(w => w.SatCode == dto.MainCode);
  1085. if (!mainXl.Any())
  1086. {
  1087. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1088. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1089. }
  1090. var minTime = mainXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  1091. var xlInfo1 = mainXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime).FirstOrDefault();
  1092. if (xlInfo1 == null)
  1093. {
  1094. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  1095. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  1096. }
  1097. var adja1Xl = xlInfoList.Where(w => w.SatCode == dto.Adja1Code);
  1098. if (!adja1Xl.Any())
  1099. {
  1100. Serilog.Log.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1101. return Error<PosResDto>($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1102. }
  1103. var minTime2 = adja1Xl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  1104. var xlInfo2 = adja1Xl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime2).FirstOrDefault();
  1105. if (xlInfo2 == null)
  1106. {
  1107. Serilog.Log.Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  1108. return Error<PosResDto>($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  1109. }
  1110. var adja2Xl = xlInfoList.Where(w => w.SatCode == dto.Adja2Code);
  1111. if (!adja2Xl.Any())
  1112. {
  1113. Serilog.Log.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1114. return Error<PosResDto>($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1115. }
  1116. var minTime3 = adja2Xl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  1117. var xlInfo3 = adja2Xl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime3).FirstOrDefault();
  1118. if (xlInfo3 == null)
  1119. {
  1120. Serilog.Log.Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  1121. return Error<PosResDto>($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  1122. }
  1123. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  1124. Serilog.Log.Information($"卫星{dto.Adja1Code}使用{xlInfo2.TwoLine}进行星历推算");
  1125. Serilog.Log.Information($"卫星{dto.Adja2Code}使用{xlInfo3.TwoLine}进行星历推算");
  1126. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  1127. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  1128. var ephMain = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto);
  1129. if (ephMain.code != 200)
  1130. {
  1131. Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
  1132. return Error<PosResDto>($"推算[{dto.MainCode}]的星历出错");
  1133. }
  1134. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  1135. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto2);
  1136. if (ephAdja1.code != 200)
  1137. {
  1138. Serilog.Log.Error($"推算[{dto.Adja1Code}]的星历出错");
  1139. return Error<PosResDto>($"推算[{dto.Adja1Code}]的星历出错");
  1140. }
  1141. var XlCalcDto3 = new XlCalcDto() { tleStr = xlInfo3.TwoLine, dt = dto.SigTime };
  1142. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto3);
  1143. if (ephAdja2.code != 200)
  1144. {
  1145. Serilog.Log.Error($"推算[{dto.Adja2Code}]的星历出错");
  1146. return Error<PosResDto>($"推算[{dto.Adja2Code}]的星历出错");
  1147. }
  1148. var StationRes = db.StationRes.Add(new StationRes()
  1149. {
  1150. SatTxLon = dto.SatTxLon,
  1151. SatTxLat = dto.SatTxLat,
  1152. });
  1153. var cgRes = db.CgRes.Add(new CgRes()
  1154. {
  1155. SigTime = dto.SigTime,
  1156. Dto1 = dto.Dto1,
  1157. Dfo1 = dto.Dfo1,
  1158. Snr1 = dto.Snr1,
  1159. Dto2 = dto.Dto2,
  1160. Dfo2 = dto.Dfo2,
  1161. Snr2 = dto.Snr2,
  1162. StationResID = StationRes.ID,
  1163. MainCode = dto.MainCode,
  1164. Adja1Code = dto.Adja1Code,
  1165. Adja2Code = dto.Adja2Code,
  1166. TaskID = runTask.ID,
  1167. MainX = ephMain.data.X,
  1168. MainY = ephMain.data.Y,
  1169. MainZ = ephMain.data.Z,
  1170. Adja1X = ephAdja1.data.X,
  1171. Adja1Y = ephAdja1.data.Y,
  1172. Adja1Z = ephAdja1.data.Z,
  1173. Adja2X = ephAdja2.data.X,
  1174. Adja2Y = ephAdja2.data.Y,
  1175. Adja2Z = ephAdja2.data.Z,
  1176. });
  1177. var res = PosApi.X3_PosNoRef(cgRes, StationRes);
  1178. PosRes posRes = new PosRes()
  1179. {
  1180. SigTime = dto.SigTime,
  1181. TaskInfoID = runTask.ID,
  1182. CgResID = cgRes.ID,
  1183. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  1184. TsName = dto.TsName,
  1185. PosLon = res[0],
  1186. PosLat = res[1],
  1187. MirrLon = res[3],
  1188. MirrLat = res[4],
  1189. PosResType = EnumPosResType.X3NoRef,
  1190. };
  1191. posRes = db.PosRes.Add(posRes);
  1192. await db.SaveChangesAsync();
  1193. PosObServer.Instance.Pub(posRes);
  1194. return Success(Map(posRes));
  1195. }
  1196. }
  1197. #endregion
  1198. #region 三星双频差定位
  1199. /// <summary>
  1200. /// 三星双频差带参定位(含星历)
  1201. /// </summary>
  1202. /// <param name="dto">定位参数</param>
  1203. /// <returns></returns>
  1204. [HttpPost]
  1205. public async Task<AjaxResult<PosResDto>> PosX3TwoDfoAsync(X3TwoDfoPosDto dto)
  1206. {
  1207. TaskInfo runTask;
  1208. using (RHDWContext db = new RHDWContext())
  1209. {
  1210. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X3TwoDfo && p.TaskState == EnumTaskState.Running);
  1211. if (runTask == null)
  1212. {
  1213. Serilog.Log.Warning($"接收到三星双频差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  1214. return Error<PosResDto>($"多模式融合定位平台没有启动三星双频差定位任务");
  1215. }
  1216. }
  1217. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  1218. {
  1219. var StationRes = db.StationRes.Add(new StationRes()
  1220. {
  1221. SatTxLon = dto.SatTxLon,
  1222. SatTxLat = dto.SatTxLat,
  1223. RefLon = dto.RefLon,
  1224. RefLat = dto.RefLat,
  1225. });
  1226. var cgRes = db.CgRes.Add(new CgRes()
  1227. {
  1228. SigTime = dto.SigTime,
  1229. Dto1 = dto.Dto1,
  1230. Dfo1 = dto.Dfo1,
  1231. Snr1 = dto.Snr1,
  1232. Dto2 = dto.Dto2,
  1233. Dfo2 = dto.Dfo2,
  1234. Snr2 = dto.Snr2,
  1235. YbMainDfo = dto.YbMainDfo,
  1236. YbAdja1Dfo = dto.YbAdja1Dfo,
  1237. YbAdja2Dfo = dto.YbAdja2Dfo,
  1238. TarFreqUp = dto.TarFreqUp,
  1239. TarFreqDown = dto.TarFreqDown,
  1240. RefFreqUp = dto.RefFreqUp,
  1241. RefFreqDown = dto.RefFreqDown,
  1242. StationResID = StationRes.ID,
  1243. MainCode = dto.MainCode,
  1244. Adja1Code = dto.Adja1Code,
  1245. Adja2Code = dto.Adja2Code,
  1246. TaskID = runTask.ID,
  1247. MainX = dto.MainX,
  1248. MainY = dto.MainY,
  1249. MainZ = dto.MainZ,
  1250. MainVx = dto.MainVx,
  1251. MainVy = dto.MainVy,
  1252. MainVz = dto.MainVz,
  1253. Adja1X = dto.Adja1X,
  1254. Adja1Y = dto.Adja1Y,
  1255. Adja1Z = dto.Adja1Z,
  1256. Adja1Vx = dto.Adja1Vx,
  1257. Adja1Vy = dto.Adja1Vy,
  1258. Adja1Vz = dto.Adja1Vz,
  1259. Adja2X = dto.Adja2X,
  1260. Adja2Y = dto.Adja2Y,
  1261. Adja2Z = dto.Adja2Z,
  1262. Adja2Vx = dto.Adja2Vx,
  1263. Adja2Vy = dto.Adja2Vy,
  1264. Adja2Vz = dto.Adja2Vz,
  1265. });
  1266. var res = PosApi.X3_PosTwoDfo(cgRes, StationRes);
  1267. PosRes posRes = new PosRes()
  1268. {
  1269. SigTime = cgRes.SigTime,
  1270. TaskInfoID = runTask.ID,
  1271. CgResID = cgRes.ID,
  1272. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  1273. TsName = dto.TsName,
  1274. PosLon = res[0],
  1275. PosLat = res[1],
  1276. MirrLon = res[3],
  1277. MirrLat = res[4],
  1278. PosResType = EnumPosResType.X3TwoDfo,
  1279. };
  1280. posRes = db.PosRes.Add(posRes);
  1281. await db.SaveChangesAsync();
  1282. PosObServer.Instance.Pub(posRes);
  1283. return Success(Map(posRes));
  1284. }
  1285. }
  1286. /// <summary>
  1287. /// 三星双频差带参定位(无星历)
  1288. /// </summary>
  1289. /// <returns>返回定位结果ID</returns>
  1290. [HttpPost]
  1291. public async Task<AjaxResult<PosResDto>> PosX3TwoDfoNoXlAsync(X3TwoDfoNoXlPosDto dto)
  1292. {
  1293. TaskInfo runTask;
  1294. SysSetings settings;
  1295. using (RHDWContext db = new RHDWContext())
  1296. {
  1297. runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X3TwoDfo).FirstOrDefaultAsync();
  1298. if (runTask == null)
  1299. {
  1300. Serilog.Log.Warning($"接收到三星双频差带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  1301. return Error<PosResDto>($"多模式融合定位平台没有启动三星双频差定位任务");
  1302. }
  1303. settings = await db.SysSetings.FirstOrDefaultAsync();
  1304. }
  1305. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  1306. {
  1307. var xlInfoList = await XlCache.GetAllAsync();
  1308. var mainXl = xlInfoList.Where(w => w.SatCode == dto.MainCode);
  1309. if (!mainXl.Any())
  1310. {
  1311. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1312. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1313. }
  1314. var minTime = mainXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  1315. var xlInfo1 = mainXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime).FirstOrDefault();
  1316. if (xlInfo1 == null)
  1317. {
  1318. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  1319. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  1320. }
  1321. var adja1Xl = xlInfoList.Where(w => w.SatCode == dto.Adja1Code);
  1322. if (!adja1Xl.Any())
  1323. {
  1324. Serilog.Log.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1325. return Error<PosResDto>($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1326. }
  1327. var minTime2 = adja1Xl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  1328. var xlInfo2 = adja1Xl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime2).FirstOrDefault();
  1329. if (xlInfo2 == null)
  1330. {
  1331. Serilog.Log.Error($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  1332. return Error<PosResDto>($"未找到卫星[{dto.Adja1Code}]的双行根数星历");
  1333. }
  1334. var adja2Xl = xlInfoList.Where(w => w.SatCode == dto.Adja2Code);
  1335. if (!adja2Xl.Any())
  1336. {
  1337. Serilog.Log.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1338. return Error<PosResDto>($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1339. }
  1340. var minTime3 = adja2Xl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  1341. var xlInfo3 = adja2Xl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime3).FirstOrDefault();
  1342. if (xlInfo3 == null)
  1343. {
  1344. Serilog.Log.Error($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  1345. return Error<PosResDto>($"未找到卫星[{dto.Adja2Code}]的双行根数星历");
  1346. }
  1347. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  1348. Serilog.Log.Information($"卫星{dto.Adja1Code}使用{xlInfo2.TwoLine}进行星历推算");
  1349. Serilog.Log.Information($"卫星{dto.Adja2Code}使用{xlInfo3.TwoLine}进行星历推算");
  1350. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  1351. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  1352. var ephMain = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto);
  1353. if (ephMain.code != 200)
  1354. {
  1355. Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
  1356. return Error<PosResDto>($"推算[{dto.MainCode}]的星历出错");
  1357. }
  1358. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  1359. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto2);
  1360. if (ephAdja1.code != 200)
  1361. {
  1362. Serilog.Log.Error($"推算[{dto.Adja1Code}]的星历出错");
  1363. return Error<PosResDto>($"推算[{dto.Adja1Code}]的星历出错");
  1364. }
  1365. var XlCalcDto3 = new XlCalcDto() { tleStr = xlInfo3.TwoLine, dt = dto.SigTime };
  1366. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto3);
  1367. if (ephAdja2.code != 200)
  1368. {
  1369. Serilog.Log.Error($"推算[{dto.Adja2Code}]的星历出错");
  1370. return Error<PosResDto>($"推算[{dto.Adja2Code}]的星历出错");
  1371. }
  1372. var StationRes = db.StationRes.Add(new StationRes()
  1373. {
  1374. SatTxLon = dto.SatTxLon,
  1375. SatTxLat = dto.SatTxLat,
  1376. RefLon = dto.RefLon,
  1377. RefLat = dto.RefLat,
  1378. });
  1379. var cgRes = db.CgRes.Add(new CgRes()
  1380. {
  1381. SigTime = dto.SigTime,
  1382. Dto1 = dto.Dto1,
  1383. Dfo1 = dto.Dfo1,
  1384. Snr1 = dto.Snr1,
  1385. Dto2 = dto.Dto2,
  1386. Dfo2 = dto.Dfo2,
  1387. Snr2 = dto.Snr2,
  1388. YbMainDfo = dto.YbMainDfo,
  1389. YbAdja1Dfo = dto.YbAdja1Dfo,
  1390. YbAdja2Dfo = dto.YbAdja2Dfo,
  1391. TarFreqUp = dto.TarFreqUp,
  1392. TarFreqDown = dto.TarFreqDown,
  1393. RefFreqUp = dto.RefFreqUp,
  1394. RefFreqDown = dto.RefFreqDown,
  1395. StationResID = StationRes.ID,
  1396. MainCode = dto.MainCode,
  1397. Adja1Code = dto.Adja1Code,
  1398. Adja2Code = dto.Adja2Code,
  1399. TaskID = runTask.ID,
  1400. MainX = ephMain.data.X,
  1401. MainY = ephMain.data.Y,
  1402. MainZ = ephMain.data.Z,
  1403. MainVx = ephMain.data.VX,
  1404. MainVy = ephMain.data.VY,
  1405. MainVz = ephMain.data.VZ,
  1406. Adja1X = ephAdja1.data.X,
  1407. Adja1Y = ephAdja1.data.Y,
  1408. Adja1Z = ephAdja1.data.Z,
  1409. Adja1Vx = ephAdja1.data.VX,
  1410. Adja1Vy = ephAdja1.data.VY,
  1411. Adja1Vz = ephAdja1.data.VZ,
  1412. Adja2X = ephAdja2.data.X,
  1413. Adja2Y = ephAdja2.data.Y,
  1414. Adja2Z = ephAdja2.data.Z,
  1415. Adja2Vx = ephAdja2.data.VX,
  1416. Adja2Vy = ephAdja2.data.VY,
  1417. Adja2Vz = ephAdja2.data.VZ,
  1418. });
  1419. var res = PosApi.X3_PosTwoDfo(cgRes, StationRes);
  1420. PosRes posRes = new PosRes()
  1421. {
  1422. SigTime = dto.SigTime,
  1423. TaskInfoID = runTask.ID,
  1424. CgResID = cgRes.ID,
  1425. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  1426. TsName = dto.TsName,
  1427. PosLon = res[0],
  1428. PosLat = res[1],
  1429. MirrLon = res[3],
  1430. MirrLat = res[4],
  1431. PosResType = EnumPosResType.X3TwoDfo,
  1432. };
  1433. posRes = db.PosRes.Add(posRes);
  1434. await db.SaveChangesAsync();
  1435. PosObServer.Instance.Pub(posRes);
  1436. return Success(Map(posRes));
  1437. }
  1438. }
  1439. #endregion
  1440. #region 双星时频差定位
  1441. /// <summary>
  1442. /// 双星时频差带参定位(含星历)
  1443. /// </summary>
  1444. /// <param name="dto">定位参数</param>
  1445. /// <returns></returns>
  1446. [HttpPost]
  1447. public async Task<AjaxResult<PosResDto>> PosX2DtoDfoAsync(X2DtoDfoPosDto dto)
  1448. {
  1449. TaskInfo runTask;
  1450. using (RHDWContext db = new RHDWContext())
  1451. {
  1452. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2Dfo && p.TaskState == EnumTaskState.Running);
  1453. if (runTask == null)
  1454. {
  1455. Serilog.Log.Warning($"接收到双星时频差带参定位(含星历)参数,由于任务没有运行中忽略本次定位!");
  1456. return Error<PosResDto>($"多模式融合定位平台没有启动双星时频差定位任务");
  1457. }
  1458. }
  1459. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  1460. {
  1461. var StationRes = db.StationRes.Add(new StationRes()
  1462. {
  1463. SatTxLon = dto.SatTxLon,
  1464. SatTxLat = dto.SatTxLat,
  1465. RefLon = dto.RefLon,
  1466. RefLat = dto.RefLat,
  1467. });
  1468. var cgRes = db.CgRes.Add(new CgRes()
  1469. {
  1470. SigTime = dto.SigTime,
  1471. Dto1 = dto.Dto,
  1472. Dfo1 = dto.Dfo,
  1473. Snr1 = dto.Snr,
  1474. YbMainDto = dto.YbMainDto,
  1475. YbAdja1Dto = dto.YbAdjaDto,
  1476. YbMainDfo = dto.YbMainDfo,
  1477. YbAdja1Dfo = dto.YbAdjaDfo,
  1478. TarFreqUp = dto.TarFreqUp,
  1479. TarFreqDown = dto.TarFreqDown,
  1480. RefFreqUp = dto.RefFreqUp,
  1481. RefFreqDown = dto.RefFreqDown,
  1482. StationResID = StationRes.ID,
  1483. MainCode = dto.MainCode,
  1484. Adja1Code = dto.AdjaCode,
  1485. TaskID = runTask.ID,
  1486. MainX = dto.MainX,
  1487. MainY = dto.MainY,
  1488. MainZ = dto.MainZ,
  1489. MainVx = dto.MainVx,
  1490. MainVy = dto.MainVy,
  1491. MainVz = dto.MainVz,
  1492. Adja1X = dto.AdjaX,
  1493. Adja1Y = dto.AdjaY,
  1494. Adja1Z = dto.AdjaZ,
  1495. Adja1Vx = dto.AdjaVx,
  1496. Adja1Vy = dto.AdjaVy,
  1497. Adja1Vz = dto.AdjaVz,
  1498. });
  1499. var res = PosApi.X2_PosDtoDfo(cgRes, StationRes);
  1500. PosRes posRes = new PosRes()
  1501. {
  1502. SigTime = cgRes.SigTime,
  1503. TaskInfoID = runTask.ID,
  1504. CgResID = cgRes.ID,
  1505. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  1506. TsName = dto.TsName,
  1507. PosLon = res[0],
  1508. PosLat = res[1],
  1509. MirrLon = res[3],
  1510. MirrLat = res[4],
  1511. PosResType = EnumPosResType.X2Dfo,
  1512. };
  1513. posRes = db.PosRes.Add(posRes);
  1514. await db.SaveChangesAsync();
  1515. PosObServer.Instance.Pub(posRes);
  1516. return Success(Map(posRes));
  1517. }
  1518. }
  1519. /// <summary>
  1520. /// 双星时频差带参定位(无星历)
  1521. /// </summary>
  1522. /// <returns>返回定位结果ID</returns>
  1523. [HttpPost]
  1524. public async Task<AjaxResult<PosResDto>> PosX2DtoDfoNoXlAsync(X2DtoDfoNoXlPosDto dto)
  1525. {
  1526. TaskInfo runTask;
  1527. SysSetings settings;
  1528. using (RHDWContext db = new RHDWContext())
  1529. {
  1530. runTask = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running && p.PosType == EnumPosType.X2Dfo).FirstOrDefaultAsync();
  1531. if (runTask == null)
  1532. {
  1533. Serilog.Log.Warning($"接收到双星时频差带参定位(无星历)参数,由于任务没有运行中忽略本次定位!");
  1534. return Error<PosResDto>($"多模式融合定位平台没有启动双星时频差定位任务");
  1535. }
  1536. settings = await db.SysSetings.FirstOrDefaultAsync();
  1537. }
  1538. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime))
  1539. {
  1540. var xlInfoList = await XlCache.GetAllAsync();
  1541. var mainXl = xlInfoList.Where(w => w.SatCode == dto.MainCode);
  1542. if (!mainXl.Any())
  1543. {
  1544. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1545. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1546. }
  1547. var minTime = mainXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  1548. var xlInfo1 = mainXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime).FirstOrDefault();
  1549. if (xlInfo1 == null)
  1550. {
  1551. Serilog.Log.Error($"未找到卫星[{dto.MainCode}]的双行根数星历");
  1552. return Error<PosResDto>($"未找到卫星[{dto.MainCode}]的双行根数星历");
  1553. }
  1554. var adjaXl = xlInfoList.Where(w => w.SatCode == dto.AdjaCode);
  1555. if (!adjaXl.Any())
  1556. {
  1557. Serilog.Log.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  1558. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  1559. }
  1560. var minTime2 = adjaXl.Min(m => Math.Abs((m.TimeBJ - dto.SigTime).TotalSeconds));
  1561. var xlInfo2 = adjaXl.Where(w => Math.Abs((w.TimeBJ - dto.SigTime).TotalSeconds) == minTime2).FirstOrDefault();
  1562. if (xlInfo2 == null)
  1563. {
  1564. Serilog.Log.Error($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  1565. return Error<PosResDto>($"未找到卫星[{dto.AdjaCode}]的双行根数星历");
  1566. }
  1567. Serilog.Log.Information($"卫星{dto.MainCode}使用{xlInfo1.TwoLine}进行星历推算");
  1568. Serilog.Log.Information($"卫星{dto.AdjaCode}使用{xlInfo2.TwoLine}进行星历推算");
  1569. string url = string.Format("http://{0}:{1}/Api/Xl/Calc", IpHelper.GetLocalIp(), settings.HttpPort);
  1570. var XlCalcDto = new XlCalcDto() { tleStr = xlInfo1.TwoLine, dt = dto.SigTime };
  1571. var ephMain = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto);
  1572. if (ephMain.code != 200)
  1573. {
  1574. Serilog.Log.Error($"推算[{dto.MainCode}]的星历出错");
  1575. return Error<PosResDto>($"推算[{dto.MainCode}]的星历出错");
  1576. }
  1577. var XlCalcDto2 = new XlCalcDto() { tleStr = xlInfo2.TwoLine, dt = dto.SigTime };
  1578. var ephAdja = await HttpHelper.PostRequestAsync<SatEphDto>(url, XlCalcDto2);
  1579. if (ephAdja.code != 200)
  1580. {
  1581. Serilog.Log.Error($"推算[{dto.AdjaCode}]的星历出错");
  1582. return Error<PosResDto>($"推算[{dto.AdjaCode}]的星历出错");
  1583. }
  1584. var StationRes = db.StationRes.Add(new StationRes()
  1585. {
  1586. SatTxLon = dto.SatTxLon,
  1587. SatTxLat = dto.SatTxLat,
  1588. RefLon = dto.RefLon,
  1589. RefLat = dto.RefLat,
  1590. });
  1591. var cgRes = db.CgRes.Add(new CgRes()
  1592. {
  1593. SigTime = dto.SigTime,
  1594. Dto1 = dto.Dto,
  1595. Dfo1 = dto.Dfo,
  1596. Snr1 = dto.Snr,
  1597. YbMainDto = dto.YbMainDto,
  1598. YbAdja1Dto = dto.YbAdjaDto,
  1599. YbMainDfo = dto.YbMainDfo,
  1600. YbAdja1Dfo = dto.YbAdjaDfo,
  1601. TarFreqUp = dto.TarFreqUp,
  1602. TarFreqDown = dto.TarFreqDown,
  1603. RefFreqUp = dto.RefFreqUp,
  1604. RefFreqDown = dto.RefFreqDown,
  1605. StationResID = StationRes.ID,
  1606. MainCode = dto.MainCode,
  1607. Adja1Code = dto.AdjaCode,
  1608. TaskID = runTask.ID,
  1609. MainX = ephMain.data.X,
  1610. MainY = ephMain.data.Y,
  1611. MainZ = ephMain.data.Z,
  1612. MainVx = ephMain.data.VX,
  1613. MainVy = ephMain.data.VY,
  1614. MainVz = ephMain.data.VZ,
  1615. Adja1X = ephAdja.data.X,
  1616. Adja1Y = ephAdja.data.Y,
  1617. Adja1Z = ephAdja.data.Z,
  1618. Adja1Vx = ephAdja.data.VX,
  1619. Adja1Vy = ephAdja.data.VY,
  1620. Adja1Vz = ephAdja.data.VZ,
  1621. });
  1622. var res = PosApi.X2_PosDtoDfo(cgRes, StationRes);
  1623. PosRes posRes = new PosRes()
  1624. {
  1625. SigTime = dto.SigTime,
  1626. TaskInfoID = runTask.ID,
  1627. CgResID = cgRes.ID,
  1628. TarName = string.IsNullOrWhiteSpace(dto.TarName) ? "未知目标" : dto.TarName,
  1629. TsName = dto.TsName,
  1630. PosLon = res[0],
  1631. PosLat = res[1],
  1632. MirrLon = res[3],
  1633. MirrLat = res[4],
  1634. PosResType = EnumPosResType.X2Dfo,
  1635. };
  1636. posRes = db.PosRes.Add(posRes);
  1637. await db.SaveChangesAsync();
  1638. PosObServer.Instance.Pub(posRes);
  1639. return Success(Map(posRes));
  1640. }
  1641. }
  1642. #endregion
  1643. private PosResDto Map(PosRes res)
  1644. {
  1645. return new PosResDto()
  1646. {
  1647. ID = res.ID,
  1648. SigTime = res.SigTime,
  1649. TaskInfoID = res.TaskInfoID,
  1650. TarName = string.IsNullOrWhiteSpace(res.TarName) ? "未知目标" : res.TarName,
  1651. PosLon = res.PosLon,
  1652. PosLat = res.PosLat,
  1653. MirrLon = res.MirrLon,
  1654. MirrLat = res.MirrLat,
  1655. PosResType = (EnumPosResTypeDto)((int)res.PosResType)
  1656. };
  1657. }
  1658. /// <summary>
  1659. /// 查询定位结果
  1660. /// </summary>
  1661. /// <param name="dto"></param>
  1662. /// <returns></returns>
  1663. /// <exception cref="Exception"></exception>
  1664. [HttpPost]
  1665. public async Task<AjaxResult<List<PosResDto>>> GetPosRes(PosResQueryDto dto)
  1666. {
  1667. List<PosResDto> posList = new List<PosResDto>();
  1668. try
  1669. {
  1670. DateTime start = dto.BeginTime;
  1671. DateTime end = dto.EndTime;
  1672. var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
  1673. if (!Directory.Exists(dir)) return Success(posList);
  1674. var yearDirs = Directory.EnumerateDirectories(dir).OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name));//年目录,倒叙排列
  1675. foreach (var yearDir in yearDirs)
  1676. {
  1677. //每一天的db文件,倒序排列
  1678. var dayFiles = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, yearDir), "*.db").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name.Substring(0, 4)));
  1679. foreach (var dayFile in dayFiles)
  1680. {
  1681. using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
  1682. {
  1683. if (db.PosRes.Any(p => p.TaskInfoID == dto.TaskInfoID))
  1684. end = await db.PosRes.Where(p => p.TaskInfoID == dto.TaskInfoID).MaxAsync(p => p.SigTime);
  1685. }
  1686. if (end != DateTime.MinValue)
  1687. {
  1688. goto skip;
  1689. }
  1690. }
  1691. }
  1692. skip:
  1693. if (end == DateTime.MinValue)
  1694. {
  1695. return Success(posList);//没有数据不查询
  1696. }
  1697. if (end >= dto.EndTime)
  1698. {
  1699. end = dto.EndTime;
  1700. }
  1701. start = dto.BeginTime;
  1702. DateTime endDay = new DateTime(end.Year, end.Month, end.Day);
  1703. DateTime startDay = new DateTime(start.Year, start.Month, start.Day);
  1704. while (endDay >= startDay)
  1705. {
  1706. using (RHDWPartContext db = RHDWPartContext.GetContext(endDay))
  1707. {
  1708. var posRes = await db.PosRes
  1709. .Where(w => w.SigTime >= start && w.SigTime <= end && w.TaskInfoID == dto.TaskInfoID)
  1710. .OrderByDescending(o => o.SigTime).ToListAsync();
  1711. posList.AddRange(posRes.Select(m => Map(m)));
  1712. }
  1713. endDay = endDay.AddDays(-1);
  1714. }
  1715. return Success(posList);
  1716. }
  1717. catch (Exception ex)
  1718. {
  1719. string err = $"定位查询任务编号:{dto.TaskInfoID},{dto.BeginTime:yyyy-MM-dd HH:mm:ss}-{dto.EndTime:yyyy-MM-dd HH:mm:ss}异常:{ex.Message}";
  1720. Serilog.Log.Error(err);
  1721. return Error<List<PosResDto>>(err);
  1722. }
  1723. }
  1724. }
  1725. }