PosController.cs 74 KB

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