PosController.cs 70 KB

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