PosController.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. using System;
  2. using System.Configuration;
  3. using System.Data.Entity;
  4. using System.Threading.Tasks;
  5. using System.Web.Http;
  6. using XdCxRhDW.Api;
  7. using XdCxRhDW.App.Model;
  8. using XdCxRhDW.Dto;
  9. using XdCxRhDW.Entity;
  10. using XdCxRhDW.Repostory;
  11. using XdCxRhDW.WebApi;
  12. namespace XdCxRhDW.App.Controllers
  13. {
  14. /// <summary>
  15. /// 定位功能相关接口
  16. /// </summary>
  17. public class PosController : BaseController
  18. {
  19. #region 两星一地定位
  20. /// <summary>
  21. /// 两星一地无参定位(含星历)
  22. /// </summary>
  23. /// <param name="dto">定位参数</param>
  24. /// <returns></returns>
  25. [HttpPost]
  26. public async Task<AjaxResult<PosResDto>> PosX2D1NoParAsync(X2D1NoParPosDto dto)
  27. {
  28. TaskInfo runTask;
  29. using (RHDWContext db = new RHDWContext())
  30. {
  31. if (dto.TaskID == null)
  32. {
  33. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  34. && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  35. if (runTask == null)
  36. {
  37. await LogHelper.Warning($"接收到两星一地无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  38. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  39. }
  40. }
  41. else
  42. {
  43. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  44. if (runTask == null)
  45. {
  46. await LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  47. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  48. }
  49. }
  50. }
  51. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  52. {
  53. var StationRes = db.StationRes.Add(new StationRes()
  54. {
  55. SatTxLon = dto.SatTxLon,
  56. SatTxLat = dto.SatTxLat,
  57. CdbTxLon = dto.CdbTxLon,
  58. CdbTxLat = dto.CdbTxLat,
  59. });
  60. var ckRes = new CheckRes()
  61. {
  62. FileName = dto.CheckRes?.FileName,
  63. SmpStart = dto.CheckRes?.SmpStart,
  64. SmpCount = dto.CheckRes?.SmpCount,
  65. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  66. ModRate = dto.CheckRes?.ModRate,
  67. ModType = dto.CheckRes?.ModType,
  68. UserName = dto.CheckRes?.UserName,
  69. FfcHz = dto.CheckRes?.FfcHz,
  70. Snr = dto.CheckRes?.Snr
  71. };
  72. db.CheckRes.Add(ckRes);
  73. var cgRes = db.CgRes.Add(new CgRes()
  74. {
  75. SigTime = dto.SigTime,
  76. Dto1 = Math.Round(dto.SxDto, 10),
  77. Dfo1 = Math.Round(dto.SxDfo, 10),
  78. Snr1 = Math.Round(dto.SxSnr, 1),
  79. DtoCdb = Math.Round(dto.XdDto, 10),
  80. DfoCdb = Math.Round(dto.XdDfo, 10),
  81. SnrCdb = Math.Round(dto.XdSnr, 1),
  82. StationResID = StationRes.ID,
  83. MainCode = dto.MainCode,
  84. Adja1Code = dto.AdjaCode,
  85. TaskID = runTask.ID,
  86. MainX = dto.MainX,
  87. MainY = dto.MainY,
  88. MainZ = dto.MainZ,
  89. Adja1X = dto.AdjaX,
  90. Adja1Y = dto.AdjaY,
  91. Adja1Z = dto.AdjaZ,
  92. MainVx = dto.MainVX,
  93. MainVy = dto.MainVY,
  94. MainVz = dto.MainVZ,
  95. Adja1Vx = dto.AdjaVX,
  96. Adja1Vy = dto.AdjaVY,
  97. Adja1Vz = dto.AdjaVZ,
  98. TarFreqUp = dto.FreqUp,
  99. TarFreqDown = dto.FreqDown,
  100. });
  101. double[] res;
  102. if (ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"] != null
  103. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "false"
  104. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "0")
  105. {
  106. res = PosApi.X2D1_PosNoRef_ZL(cgRes, StationRes);
  107. }
  108. else
  109. {
  110. res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  111. }
  112. PosRes posRes = new PosRes()
  113. {
  114. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  115. SigTime = cgRes.SigTime,
  116. TaskInfoID = runTask.ID,
  117. CgResID = cgRes.ID,
  118. CheckResID = ckRes.ID,
  119. PosLon = res[0],
  120. PosLat = res[1],
  121. MirrLon = res[3],
  122. MirrLat = res[4],
  123. Confidence = (int)res[6],
  124. PosResType = EnumPosResType.X2D1NoRef,
  125. };
  126. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  127. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  128. posRes = db.PosRes.Add(posRes);
  129. await db.SaveChangesAsync();
  130. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  131. return Success(MapDto(posRes));
  132. }
  133. }
  134. /// <summary>
  135. /// 两星一地无参定位(无星历)
  136. /// </summary>
  137. /// <returns>返回定位结果ID</returns>
  138. [HttpPost]
  139. public async Task<AjaxResult<PosResDto>> PosX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto)
  140. {
  141. TaskInfo runTask;
  142. using (RHDWContext db = new RHDWContext())
  143. {
  144. if (dto.TaskID == null)
  145. {
  146. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  147. && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  148. if (runTask == null)
  149. {
  150. await LogHelper.Warning($"接收到两星一地无参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  151. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  152. }
  153. }
  154. else
  155. {
  156. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  157. if (runTask == null)
  158. {
  159. await LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  160. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  161. }
  162. }
  163. }
  164. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  165. if (xl1 == null)
  166. {
  167. await LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  168. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  169. }
  170. await LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  171. var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime);
  172. if (xl2 == null)
  173. {
  174. await LogHelper.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  175. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  176. }
  177. await LogHelper.Info($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  178. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  179. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  180. if (ephMain.code != 200)
  181. {
  182. await LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  183. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  184. }
  185. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  186. var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  187. if (ephAdja.code != 200)
  188. {
  189. await LogHelper.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}");
  190. return Error<PosResDto>($"推算卫星{dto.AdjaCode}的ECEF星历出错");
  191. }
  192. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  193. {
  194. var StationRes = db.StationRes.Add(new StationRes()
  195. {
  196. SatTxLon = dto.SatTxLon,
  197. SatTxLat = dto.SatTxLat,
  198. CdbTxLon = dto.CdbTxLon,
  199. CdbTxLat = dto.CdbTxLat,
  200. });
  201. var ckRes = new CheckRes()
  202. {
  203. FileName = dto.CheckRes?.FileName,
  204. SmpStart = dto.CheckRes?.SmpStart,
  205. SmpCount = dto.CheckRes?.SmpCount,
  206. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  207. ModRate = dto.CheckRes?.ModRate,
  208. ModType = dto.CheckRes?.ModType,
  209. UserName = dto.CheckRes?.UserName,
  210. FfcHz = dto.CheckRes?.FfcHz,
  211. Snr = dto.CheckRes?.Snr
  212. };
  213. db.CheckRes.Add(ckRes);
  214. var cgRes = db.CgRes.Add(new CgRes()
  215. {
  216. SigTime = dto.SigTime,
  217. Dto1 = Math.Round(dto.SxDto, 10),
  218. Dfo1 = Math.Round(dto.SxDfo, 10),
  219. Snr1 = Math.Round(dto.SxSnr, 1),
  220. DtoCdb = Math.Round(dto.XdDto, 10),
  221. DfoCdb = Math.Round(dto.XdDfo, 10),
  222. SnrCdb = Math.Round(dto.XdSnr, 1),
  223. StationResID = StationRes.ID,
  224. MainCode = dto.MainCode,
  225. Adja1Code = dto.AdjaCode,
  226. MainXlTime = ephMain.data.TleTime,
  227. Adja1XlTime = ephAdja.data.TleTime,
  228. TaskID = runTask.ID,
  229. MainX = ephMain.data.X,
  230. MainY = ephMain.data.Y,
  231. MainZ = ephMain.data.Z,
  232. Adja1X = ephAdja.data.X,
  233. Adja1Y = ephAdja.data.Y,
  234. Adja1Z = ephAdja.data.Z,
  235. MainVx = ephMain.data.VX,
  236. MainVy = ephMain.data.VY,
  237. MainVz = ephMain.data.VZ,
  238. Adja1Vx = ephAdja.data.VX,
  239. Adja1Vy = ephAdja.data.VY,
  240. Adja1Vz = ephAdja.data.VZ,
  241. TarFreqUp = dto.FreqUp,
  242. TarFreqDown = dto.FreqDown,
  243. });
  244. double[] res;
  245. if (ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"] != null
  246. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "false"
  247. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "0")
  248. {
  249. res = PosApi.X2D1_PosNoRef_ZL(cgRes, StationRes);
  250. }
  251. else
  252. {
  253. res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  254. }
  255. PosRes posRes = new PosRes()
  256. {
  257. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  258. SigTime = dto.SigTime,
  259. TaskInfoID = runTask.ID,
  260. CgResID = cgRes.ID,
  261. CheckResID = ckRes.ID,
  262. PosLon = res[0],
  263. PosLat = res[1],
  264. MirrLon = res[3],
  265. MirrLat = res[4],
  266. Confidence = (int)res[6],
  267. PosResType = EnumPosResType.X2D1NoRef,
  268. };
  269. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  270. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  271. posRes = db.PosRes.Add(posRes);
  272. await db.SaveChangesAsync();
  273. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  274. return Success(MapDto(posRes));
  275. }
  276. }
  277. #endregion
  278. #region 三星双时差定位
  279. /// <summary>
  280. /// 三星双时差无参定位(含星历)
  281. /// </summary>
  282. /// <param name="dto">定位参数</param>
  283. /// <returns></returns>
  284. [HttpPost]
  285. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoParAsync(X3TwoDtoNoParPosDto dto)
  286. {
  287. TaskInfo runTask;
  288. using (RHDWContext db = new RHDWContext())
  289. {
  290. if (dto.TaskID == null)
  291. {
  292. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  293. && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  294. if (runTask == null)
  295. {
  296. await LogHelper.Warning($"接收到三星双时差无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  297. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  298. }
  299. }
  300. else
  301. {
  302. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  303. if (runTask == null)
  304. {
  305. await LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  306. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  307. }
  308. }
  309. }
  310. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  311. {
  312. var StationRes = db.StationRes.Add(new StationRes()
  313. {
  314. SatTxLon = dto.SatTxLon,
  315. SatTxLat = dto.SatTxLat,
  316. });
  317. var ckRes = new CheckRes()
  318. {
  319. FileName = dto.CheckRes?.FileName,
  320. SmpStart = dto.CheckRes?.SmpStart,
  321. SmpCount = dto.CheckRes?.SmpCount,
  322. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  323. ModRate = dto.CheckRes?.ModRate,
  324. ModType = dto.CheckRes?.ModType,
  325. UserName = dto.CheckRes?.UserName,
  326. FfcHz = dto.CheckRes?.FfcHz,
  327. Snr = dto.CheckRes?.Snr
  328. };
  329. db.CheckRes.Add(ckRes);
  330. var cgRes = db.CgRes.Add(new CgRes()
  331. {
  332. SigTime = dto.SigTime,
  333. Dto1 = Math.Round(dto.Dto1, 10),
  334. Dfo1 = Math.Round(dto.Dfo1, 10),
  335. Snr1 = Math.Round(dto.Snr1, 1),
  336. Dto2 = Math.Round(dto.Dto2, 10),
  337. Dfo2 = Math.Round(dto.Dfo2, 10),
  338. Snr2 = Math.Round(dto.Snr2, 1),
  339. StationResID = StationRes.ID,
  340. MainCode = dto.MainCode,
  341. Adja1Code = dto.Adja1Code,
  342. Adja2Code = dto.Adja2Code,
  343. TaskID = runTask.ID,
  344. MainX = dto.MainX,
  345. MainY = dto.MainY,
  346. MainZ = dto.MainZ,
  347. MainVx = dto.MainVX,
  348. MainVy = dto.MainVY,
  349. MainVz = dto.MainVZ,
  350. Adja1X = dto.Adja1X,
  351. Adja1Y = dto.Adja1Y,
  352. Adja1Z = dto.Adja1Z,
  353. Adja1Vx = dto.Adja1VX,
  354. Adja1Vy = dto.Adja1VY,
  355. Adja1Vz = dto.Adja1VZ,
  356. Adja2X = dto.Adja2X,
  357. Adja2Y = dto.Adja2Y,
  358. Adja2Z = dto.Adja2Z,
  359. Adja2Vx = dto.Adja2VX,
  360. Adja2Vy = dto.Adja2VY,
  361. Adja2Vz = dto.Adja2VZ,
  362. TarFreqUp = dto.FreqUp,
  363. TarFreqDown = dto.FreqDown,
  364. });
  365. var res = PosApi.X3_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  366. PosRes posRes = new PosRes()
  367. {
  368. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  369. SigTime = cgRes.SigTime,
  370. TaskInfoID = runTask.ID,
  371. CgResID = cgRes.ID,
  372. CheckResID = ckRes.ID,
  373. PosLon = res[0],
  374. PosLat = res[1],
  375. MirrLon = res[3],
  376. MirrLat = res[4],
  377. Confidence = (int)res[6],
  378. PosResType = EnumPosResType.X3TwoDtoNoRef,
  379. };
  380. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  381. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  382. posRes = db.PosRes.Add(posRes);
  383. await db.SaveChangesAsync();
  384. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  385. return Success(MapDto(posRes));
  386. }
  387. }
  388. /// <summary>
  389. /// 三星双时差无参定位(无星历)
  390. /// </summary>
  391. /// <returns>返回定位结果ID</returns>
  392. [HttpPost]
  393. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoXlNoParAsync(X3TwoDtoNoXlNoParPosDto dto)
  394. {
  395. TaskInfo runTask;
  396. using (RHDWContext db = new RHDWContext())
  397. {
  398. if (dto.TaskID == null)
  399. {
  400. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  401. && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  402. if (runTask == null)
  403. {
  404. await LogHelper.Warning($"接收到三星双时差无参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  405. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  406. }
  407. }
  408. else
  409. {
  410. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  411. if (runTask == null)
  412. {
  413. await LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  414. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  415. }
  416. }
  417. }
  418. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  419. if (xl1 == null)
  420. {
  421. await LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  422. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  423. }
  424. await LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  425. var xl2 = await XlRepository.GetLatestAsync(dto.Adja1Code, dto.SigTime);
  426. if (xl2 == null)
  427. {
  428. await LogHelper.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  429. return Error<PosResDto>($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  430. }
  431. await LogHelper.Info($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  432. var xl3 = await XlRepository.GetLatestAsync(dto.Adja2Code, dto.SigTime);
  433. if (xl3 == null)
  434. {
  435. await LogHelper.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  436. return Error<PosResDto>($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  437. }
  438. await LogHelper.Info($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  439. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  440. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  441. if (ephMain.code != 200)
  442. {
  443. await LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  444. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  445. }
  446. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  447. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  448. if (ephAdja1.code != 200)
  449. {
  450. await LogHelper.Error($"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}");
  451. return Error<PosResDto>($"推算卫星{dto.Adja1Code}的ECEF星历出错");
  452. }
  453. var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime };
  454. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3);
  455. if (ephAdja2.code != 200)
  456. {
  457. await LogHelper.Error($"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}");
  458. return Error<PosResDto>($"推算卫星{dto.Adja2Code}的ECEF星历出错");
  459. }
  460. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  461. {
  462. var StationRes = db.StationRes.Add(new StationRes()
  463. {
  464. SatTxLon = dto.SatTxLon,
  465. SatTxLat = dto.SatTxLat,
  466. });
  467. var ckRes = new CheckRes()
  468. {
  469. FileName = dto.CheckRes?.FileName,
  470. SmpStart = dto.CheckRes?.SmpStart,
  471. SmpCount = dto.CheckRes?.SmpCount,
  472. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  473. ModRate = dto.CheckRes?.ModRate,
  474. ModType = dto.CheckRes?.ModType,
  475. UserName = dto.CheckRes?.UserName,
  476. FfcHz = dto.CheckRes?.FfcHz,
  477. Snr = dto.CheckRes?.Snr
  478. };
  479. db.CheckRes.Add(ckRes);
  480. var cgRes = db.CgRes.Add(new CgRes()
  481. {
  482. SigTime = dto.SigTime,
  483. Dto1 = Math.Round(dto.Dto1, 10),
  484. Dfo1 = Math.Round(dto.Dfo1, 10),
  485. Snr1 = Math.Round(dto.Snr1, 1),
  486. Dto2 = Math.Round(dto.Dto2, 10),
  487. Dfo2 = Math.Round(dto.Dfo2, 10),
  488. Snr2 = Math.Round(dto.Snr2, 1),
  489. StationResID = StationRes.ID,
  490. MainCode = dto.MainCode,
  491. Adja1Code = dto.Adja1Code,
  492. Adja2Code = dto.Adja2Code,
  493. MainXlTime = ephMain.data.TleTime,
  494. Adja1XlTime = ephAdja1.data.TleTime,
  495. Adja2XlTime = ephAdja2.data.TleTime,
  496. TaskID = runTask.ID,
  497. MainX = ephMain.data.X,
  498. MainY = ephMain.data.Y,
  499. MainZ = ephMain.data.Z,
  500. MainVx = ephMain.data.VX,
  501. MainVy = ephMain.data.VY,
  502. MainVz = ephMain.data.VZ,
  503. Adja1X = ephAdja1.data.X,
  504. Adja1Y = ephAdja1.data.Y,
  505. Adja1Z = ephAdja1.data.Z,
  506. Adja1Vx = ephAdja1.data.VX,
  507. Adja1Vy = ephAdja1.data.VY,
  508. Adja1Vz = ephAdja1.data.VZ,
  509. Adja2X = ephAdja2.data.X,
  510. Adja2Y = ephAdja2.data.Y,
  511. Adja2Z = ephAdja2.data.Z,
  512. Adja2Vx = ephAdja2.data.VX,
  513. Adja2Vy = ephAdja2.data.VY,
  514. Adja2Vz = ephAdja2.data.VZ,
  515. TarFreqUp = dto.FreqUp,
  516. TarFreqDown = dto.FreqDown,
  517. });
  518. var res = PosApi.X3_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  519. PosRes posRes = new PosRes()
  520. {
  521. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  522. SigTime = dto.SigTime,
  523. TaskInfoID = runTask.ID,
  524. CgResID = cgRes.ID,
  525. CheckResID = ckRes.ID,
  526. PosLon = res[0],
  527. PosLat = res[1],
  528. MirrLon = res[3],
  529. MirrLat = res[4],
  530. Confidence = (int)res[6],
  531. PosResType = EnumPosResType.X3TwoDtoNoRef,
  532. };
  533. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  534. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  535. posRes = db.PosRes.Add(posRes);
  536. await db.SaveChangesAsync();
  537. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  538. return Success(MapDto(posRes));
  539. }
  540. }
  541. #endregion
  542. #region 低轨单星双频差定位
  543. //(单星没有参考的概念)
  544. [HttpPost]
  545. public async Task<AjaxResult<PosResDto>> PosLeX1ParAsync(LeoX1ParPosDto dto)
  546. {
  547. TaskInfo runTask;
  548. using (RHDWContext db = new RHDWContext())
  549. {
  550. if (dto.TaskID == null)
  551. {
  552. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  553. && p.PosType == EnumPosType.X1Leo && p.TaskState == EnumTaskState.Running);
  554. if (runTask == null)
  555. {
  556. await LogHelper.Warning($"接收到低轨单星带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  557. return Error<PosResDto>($"多模式融合定位平台没有启动低轨定位任务");
  558. }
  559. }
  560. else
  561. {
  562. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  563. if (runTask == null)
  564. {
  565. await LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  566. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  567. }
  568. }
  569. }
  570. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  571. {
  572. var ckRes = new CheckRes()
  573. {
  574. FileName = dto.CheckRes?.FileName,
  575. SmpStart = dto.CheckRes?.SmpStart,
  576. SmpCount = dto.CheckRes?.SmpCount,
  577. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  578. ModRate = dto.CheckRes?.ModRate,
  579. ModType = dto.CheckRes?.ModType,
  580. UserName = dto.CheckRes?.UserName,
  581. FfcHz = dto.CheckRes?.FfcHz,
  582. Snr = dto.CheckRes?.Snr
  583. };
  584. db.CheckRes.Add(ckRes);
  585. var cgRes = db.CgRes.Add(new CgRes()
  586. {
  587. SigTime = dto.SigTime,
  588. Dto1 = Math.Round(dto.Dto1, 10),
  589. Dfo1 = Math.Round(dto.Dfo1, 10),
  590. Snr1 = Math.Round(dto.Snr1, 1),
  591. Dto2 = Math.Round(dto.Dto2, 10),
  592. Dfo2 = Math.Round(dto.Dfo2, 10),
  593. Snr2 = Math.Round(dto.Snr2, 1),
  594. StationResID = 0,
  595. MainCode = dto.MainCode,
  596. Adja1Code = dto.Adja1Code,
  597. Adja2Code = dto.Adja2Code,
  598. TaskID = runTask.ID,
  599. MainX = dto.MainX,
  600. MainY = dto.MainY,
  601. MainZ = dto.MainZ,
  602. MainVx = dto.MainVX,
  603. MainVy = dto.MainVY,
  604. MainVz = dto.MainVZ,
  605. Adja1X = dto.Adja1X,
  606. Adja1Y = dto.Adja1Y,
  607. Adja1Z = dto.Adja1Z,
  608. Adja1Vx = dto.Adja1VX,
  609. Adja1Vy = dto.Adja1VY,
  610. Adja1Vz = dto.Adja1VZ,
  611. Adja2X = dto.Adja2X,
  612. Adja2Y = dto.Adja2Y,
  613. Adja2Z = dto.Adja2Z,
  614. Adja2Vx = dto.Adja2VX,
  615. Adja2Vy = dto.Adja2VY,
  616. Adja2Vz = dto.Adja2VZ,
  617. TarFreqUp = dto.FreqUp,
  618. TarFreqDown = dto.FreqDown,
  619. });
  620. var res = LeoPosApi.X1_POS(cgRes, dto.FreqUp);
  621. PosRes posRes = new PosRes()
  622. {
  623. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  624. SigTime = cgRes.SigTime,
  625. TaskInfoID = runTask.ID,
  626. CgResID = cgRes.ID,
  627. CheckResID = ckRes.ID,
  628. PosLon = res[0],
  629. PosLat = res[1],
  630. MirrLon = res[3],
  631. MirrLat = res[4],
  632. Confidence = (int)res[6],
  633. PosResType = EnumPosResType.X1Leo,
  634. };
  635. posRes = db.PosRes.Add(posRes);
  636. await db.SaveChangesAsync();
  637. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  638. return Success(MapDto(posRes));
  639. }
  640. }
  641. #endregion
  642. #region 低轨双星时频差带参定位
  643. [HttpPost]
  644. public async Task<AjaxResult<PosResDto>> PosLeX2ParAsync(LeoX2ParPosDto dto)
  645. {
  646. TaskInfo runTask;
  647. using (RHDWContext db = new RHDWContext())
  648. {
  649. if (dto.TaskID == null)
  650. {
  651. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  652. && p.PosType == EnumPosType.X1Leo && p.TaskState == EnumTaskState.Running);
  653. if (runTask == null)
  654. {
  655. await LogHelper.Warning($"接收到低轨双星带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  656. return Error<PosResDto>($"多模式融合定位平台没有启动低轨定位任务");
  657. }
  658. }
  659. else
  660. {
  661. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  662. if (runTask == null)
  663. {
  664. await LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  665. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  666. }
  667. }
  668. }
  669. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  670. {
  671. var StationRes = db.StationRes.Add(new StationRes()
  672. {
  673. SatTxLon = dto.SatTxLon,
  674. SatTxLat = dto.SatTxLat,
  675. RefLon = dto.RefLon,
  676. RefLat = dto.RefLat,
  677. });
  678. var ckRes = new CheckRes()
  679. {
  680. FileName = dto.CheckRes?.FileName,
  681. SmpStart = dto.CheckRes?.SmpStart,
  682. SmpCount = dto.CheckRes?.SmpCount,
  683. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  684. ModRate = dto.CheckRes?.ModRate,
  685. ModType = dto.CheckRes?.ModType,
  686. UserName = dto.CheckRes?.UserName,
  687. FfcHz = dto.CheckRes?.FfcHz,
  688. Snr = dto.CheckRes?.Snr
  689. };
  690. db.CheckRes.Add(ckRes);
  691. var cgRes = db.CgRes.Add(new CgRes()
  692. {
  693. SigTime = dto.SigTime,
  694. Dto1 = Math.Round(dto.Dto, 10),
  695. Dfo1 = Math.Round(dto.Dfo, 10),
  696. Snr1 = Math.Round(dto.Snr, 1),
  697. YbMainDto = Math.Round(dto.YbMainDto, 10),
  698. YbAdja1Dto = Math.Round(dto.YbAdjaDto, 10),
  699. YbMainDfo = Math.Round(dto.YbMainDfo, 10),
  700. YbAdja1Dfo = Math.Round(dto.YbAdjaDfo, 10),
  701. TarFreqUp = dto.TarFreqUp,
  702. TarFreqDown = dto.TarFreqDown,
  703. RefFreqUp = dto.RefFreqUp,
  704. RefFreqDown = dto.RefFreqDown,
  705. StationResID = StationRes.ID,
  706. MainCode = dto.MainCode,
  707. Adja1Code = dto.AdjaCode,
  708. TaskID = runTask.ID,
  709. MainX = dto.MainX,
  710. MainY = dto.MainY,
  711. MainZ = dto.MainZ,
  712. MainVx = dto.MainVx,
  713. MainVy = dto.MainVy,
  714. MainVz = dto.MainVz,
  715. Adja1X = dto.AdjaX,
  716. Adja1Y = dto.AdjaY,
  717. Adja1Z = dto.AdjaZ,
  718. Adja1Vx = dto.AdjaVx,
  719. Adja1Vy = dto.AdjaVy,
  720. Adja1Vz = dto.AdjaVz,
  721. });
  722. var res = LeoPosApi.X2_POS(cgRes, StationRes, dto.TarFreqUp, dto.RefFreqUp);
  723. PosRes posRes = new PosRes()
  724. {
  725. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  726. SigTime = cgRes.SigTime,
  727. TaskInfoID = runTask.ID,
  728. CgResID = cgRes.ID,
  729. CheckResID = ckRes.ID,
  730. PosLon = res[0],
  731. PosLat = res[1],
  732. MirrLon = res[3],
  733. MirrLat = res[4],
  734. Confidence = (int)res[6],
  735. PosResType = EnumPosResType.X2Leo,
  736. };
  737. posRes = db.PosRes.Add(posRes);
  738. await db.SaveChangesAsync();
  739. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  740. return Success(MapDto(posRes));
  741. }
  742. }
  743. #endregion
  744. private PosResDto MapDto(PosRes res)
  745. {
  746. return new PosResDto()
  747. {
  748. ID = res.ID,
  749. FreqUpHz = res.FreqUpHz,
  750. SigTime = res.SigTime,
  751. TaskInfoID = res.TaskInfoID,
  752. TarName = res.TargetInfo?.TargetName,
  753. PosLon = res.PosLon,
  754. PosLat = res.PosLat,
  755. MirrLon = res.MirrLon,
  756. MirrLat = res.MirrLat,
  757. CheckType = res.CheckRes?.PosCheckType == null ? "" : res.CheckRes?.PosCheckType?.GetEnumDisplayName(),
  758. TargetState = (EnumTargetStateDto)res.TargetState,
  759. PosResType = (EnumPosResTypeDto)res.PosResType,
  760. Confidence = res.Confidence,
  761. };
  762. }
  763. private ModelPosRes MapModel(PosRes res)
  764. {
  765. return new ModelPosRes()
  766. {
  767. ID = res.ID,
  768. FreqUpHz = res.FreqUpHz,
  769. SigTime = res.SigTime,
  770. TaskInfoID = res.TaskInfoID,
  771. PosLon = res.PosLon,
  772. PosLat = res.PosLat,
  773. MirrLon = res.MirrLon,
  774. MirrLat = res.MirrLat,
  775. TargetState = res.TargetState,
  776. PosResType = res.PosResType,
  777. CgResID = res.CgResID,
  778. CheckRes = res.CheckRes,
  779. CheckResID = res.CheckResID,
  780. ColorKey = res.ColorKey,
  781. CreateTime = res.CreateTime,
  782. CxResID = res.CxResID,
  783. StationResID = res.StationResID,
  784. TargetInfo = res.TargetInfo,
  785. TargetInfoID = res.TargetInfoID,
  786. UpdateTime = res.UpdateTime,
  787. Confidence = res.Confidence,
  788. };
  789. }
  790. }
  791. }