PosController.cs 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.Http;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using DW5S.DTO;
  8. using DW5S.Repostory;
  9. using System.IO;
  10. using DW5S.Entity;
  11. using DW5S.WebApi;
  12. using System.Diagnostics;
  13. using System.Configuration;
  14. using Microsoft.AspNetCore.Mvc;
  15. using Microsoft.Extensions.Logging;
  16. using DW5S.KxcApi;
  17. namespace DW5S.App.Controllers
  18. {
  19. /// <summary>
  20. /// 定位功能相关接口
  21. /// </summary>
  22. public class PosController : BaseController
  23. {
  24. [Autowired]
  25. private readonly ILogger logger;
  26. [Autowired]
  27. private readonly UnitOfWork unitOfWork;
  28. #region 一星一地测向定位
  29. /// <summary>
  30. /// 一星一地测向带参定位
  31. /// </summary>
  32. /// <returns></returns>
  33. [HttpPost]
  34. public async Task<AjaxResult> PosX1D1Async(X1D1NoXlPosDto dto)
  35. {
  36. TaskInfo runTask;
  37. var repsTask = unitOfWork.Of<TaskInfo>();
  38. if (dto.TaskID == null)
  39. {
  40. runTask = await repsTask.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  41. && p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running);
  42. if (runTask == null)
  43. {
  44. string msg = $"接收到一星一地测向带参定位参数,由于找不到执行中的任务忽略本次定位";
  45. logger.LogWarning(msg);
  46. return Error(msg);
  47. }
  48. }
  49. else
  50. {
  51. runTask = await repsTask.GetByIdAsync(dto.TaskID);
  52. if (runTask == null)
  53. {
  54. string msg = $"找不到任务,ID={dto.TaskID}";
  55. logger.LogWarning(msg);
  56. return Error(msg);
  57. }
  58. }
  59. var repsXl = unitOfWork.Of<XlInfo>() as XlRepository;
  60. var xl1 = await repsXl.GetLatestAsync(dto.MainCode, dto.SigTime);
  61. if (xl1 == null)
  62. {
  63. string msg = $"系统缺少编号{dto.MainCode}卫星的星历!";
  64. logger.LogError(msg);
  65. return Error(msg);
  66. }
  67. logger.LogInformation($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  68. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  69. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  70. if (ephMain.code != 200)
  71. {
  72. string msg = $"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}";
  73. logger.LogError(msg);
  74. return Error(msg);
  75. }
  76. var repsStationRes = unitOfWork.Of<StationRes>();
  77. var stationRes = await repsStationRes.AddOrUpdateAsync(new StationRes
  78. {
  79. SatTxLon = dto.SatTxLon,
  80. SatTxLat = dto.SatTxLat,
  81. CdbTxLon = dto.CdbTxLon,
  82. CdbTxLat = dto.CdbTxLat,
  83. CxLon = dto.CxLon,
  84. CxLat = dto.CxLat,
  85. RefLon = dto.RefLon,
  86. RefLat = dto.RefLat,
  87. });
  88. var repsCheckRes = unitOfWork.Of<CheckRes>();
  89. var ckRes = await repsCheckRes.AddOrUpdateAsync(new CheckRes
  90. {
  91. FileName = dto.CheckRes?.FileName,
  92. SmpStart = dto.CheckRes?.SmpStart,
  93. SmpCount = dto.CheckRes?.SmpCount,
  94. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  95. ModRate = dto.CheckRes?.ModRate,
  96. ModType = dto.CheckRes?.ModType,
  97. UserName = dto.CheckRes?.UserName,
  98. FfcHz = dto.CheckRes?.FfcHz,
  99. Snr = dto.CheckRes?.Snr
  100. });
  101. var repsCgRes = unitOfWork.Of<CgRes>();
  102. var cgRes = await repsCgRes.AddOrUpdateAsync(new CgRes
  103. {
  104. SigTime = dto.SigTime,
  105. DtoCdb = Math.Round(dto.XdDto, 10),
  106. DfoCdb = Math.Round(dto.XdDfo, 10),
  107. SnrCdb = Math.Round(dto.XdSnr, 1),
  108. YbMainDto = Math.Round(dto.MainYbDto, 10),
  109. StationResID = stationRes.Id,
  110. MainCode = dto.MainCode,
  111. MainXlTime = ephMain.data.TleTime,
  112. TaskID = runTask.Id,
  113. MainX = ephMain.data.X,
  114. MainY = ephMain.data.Y,
  115. MainZ = ephMain.data.Z,
  116. MainVx = ephMain.data.VX,
  117. MainVy = ephMain.data.VY,
  118. MainVz = ephMain.data.VZ,
  119. TarFreqUp = dto.FreqUp,
  120. TarFreqDown = dto.FreqDown,
  121. });
  122. var repsCxRes = unitOfWork.Of<CxRes>();
  123. var cxRes = await repsCxRes.AddOrUpdateAsync(new CxRes()
  124. {
  125. SigTime = dto.SigTime,
  126. Fx = dto.CxRes,
  127. });
  128. var res = PosApi.X1D1_Pos(cgRes, stationRes, cxRes, dto.CalcConfidence);
  129. var repsPosRes = unitOfWork.Of<PosRes>();
  130. var posRes = await repsPosRes.AddOrUpdateAsync(new PosRes
  131. {
  132. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  133. SigTime = cgRes.SigTime,
  134. TaskInfoID = runTask.Id,
  135. CxResID = cxRes.Id,
  136. CgResID = cgRes.Id,
  137. CheckResID = ckRes.Id,
  138. PosLon = res[0],
  139. PosLat = res[1],
  140. MirrLon = res[3],
  141. MirrLat = res[4],
  142. Confidence = (int)res[6],
  143. PosResType = EnumPosResType.X1D1CX,
  144. });
  145. await unitOfWork.SaveAsync();
  146. //await unitOfWork.DisposeAsync();//依赖注入的对象在容器销毁时自动释放
  147. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  148. return Success();
  149. }
  150. #endregion
  151. #region 两星一地定位
  152. /// <summary>
  153. /// 两星一地带参定位
  154. /// </summary>
  155. /// <returns></returns>
  156. [HttpPost]
  157. public async Task<AjaxResult> PosX2D1Async(X2D1NoXlPosDto dto)
  158. {
  159. TargetInfo target = null;
  160. TaskInfo runTask;
  161. var repsTask = unitOfWork.Of<TaskInfo>();
  162. if (dto.TaskID == null)
  163. {
  164. runTask = await repsTask.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  165. && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  166. if (runTask == null)
  167. {
  168. string msg = $"接收到两星一地带参定位参数,由于找不到执行中的任务忽略本次定位";
  169. logger.LogWarning(msg);
  170. return Error(msg);
  171. }
  172. }
  173. else
  174. {
  175. runTask = await repsTask.GetByIdAsync(dto.TaskID);
  176. if (runTask == null)
  177. {
  178. string msg = $"找不到任务,ID={dto.TaskID}";
  179. logger.LogWarning(msg);
  180. return Error(msg);
  181. }
  182. }
  183. if (!string.IsNullOrWhiteSpace(dto.Target))
  184. {
  185. var repsTarget = unitOfWork.Of<TargetInfo>();
  186. target = await repsTarget.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
  187. if (target == null)
  188. {
  189. target = await repsTarget.AddOrUpdateAsync(new TargetInfo()
  190. {
  191. TargetName = dto.Target.Trim(),
  192. TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim())
  193. });
  194. }
  195. }
  196. var repsXl = unitOfWork.Of<XlInfo>() as XlRepository;
  197. var xl1 = await repsXl.GetLatestAsync(dto.MainCode, dto.SigTime);
  198. if (xl1 == null)
  199. {
  200. string msg = $"系统缺少编号{dto.MainCode}卫星的星历!";
  201. logger.LogError(msg);
  202. return Error(msg);
  203. }
  204. logger.LogInformation($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  205. var xl2 = await repsXl.GetLatestAsync(dto.AdjaCode, dto.SigTime);
  206. if (xl2 == null)
  207. {
  208. string msg = $"系统缺少编号{dto.AdjaCode}卫星的星历!";
  209. logger.LogError(msg);
  210. return Error(msg);
  211. }
  212. logger.LogInformation($"卫星{dto.AdjaCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  213. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  214. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  215. if (ephMain.code != 200)
  216. {
  217. string msg = $"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}";
  218. logger.LogError(msg);
  219. return Error(msg);
  220. }
  221. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  222. var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  223. if (ephAdja.code != 200)
  224. {
  225. string msg = $"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}";
  226. logger.LogError(msg);
  227. return Error(msg);
  228. }
  229. //#warning 测试代码
  230. //var tarEcef = PhysicsHelper.GeoToEcef((110, 17, 0));
  231. //var ecefXl1 = (ephMain.data.X, ephMain.data.Y, ephMain.data.Z);
  232. //var ecefXl2 = (ephAdja.data.X, ephAdja.data.Y, ephAdja.data.Z);
  233. //var ecefCdb = PhysicsHelper.GeoToEcef((dto.CdbTxLon, dto.CdbTxLat, 0));
  234. //var ecefRec = PhysicsHelper.GeoToEcef((dto.SatTxLon, dto.SatTxLat, 0));
  235. //var dt1 = PhysicsHelper.Dto(tarEcef, ecefXl1, ecefRec);
  236. //var dt2 = PhysicsHelper.Dto(tarEcef, ecefXl2, ecefRec);
  237. //var dt3 = PhysicsHelper.Dto(tarEcef, ecefCdb);
  238. //var dto1 = dt1 - dt2;
  239. //var dto2 = dt1 - dt3;
  240. //dto.SxDto = Math.Round(dto1 * 1e6 + r.Next(-10, 10) + r.NextDouble(), 3);
  241. //dto.XdDto = Math.Round(dto2 * 1e6 + r.Next(-10, 10) + r.NextDouble(), 3);
  242. //var refEcef = PhysicsHelper.GeoToEcef((dto.RefLon, dto.RefLat, 0));
  243. //var refdt1 = PhysicsHelper.Dto(refEcef, ecefXl1, ecefRec);
  244. //var refdt2 = PhysicsHelper.Dto(refEcef, ecefXl2, ecefRec);
  245. //dto.MainYbDto = Math.Round(refdt1 * 1e6, 3);
  246. //dto.AdjaYbDto = Math.Round(refdt2 * 1e6, 3);
  247. var repsStationRes = unitOfWork.Of<StationRes>();
  248. var stationRes = await repsStationRes.AddOrUpdateAsync(new StationRes
  249. {
  250. SatTxLon = dto.SatTxLon,
  251. SatTxLat = dto.SatTxLat,
  252. CdbTxLon = dto.CdbTxLon,
  253. CdbTxLat = dto.CdbTxLat,
  254. RefLon = dto.RefLon,
  255. RefLat = dto.RefLat,
  256. });
  257. var repsCheckRes = unitOfWork.Of<CheckRes>();
  258. var ckRes = await repsCheckRes.AddOrUpdateAsync(new CheckRes
  259. {
  260. FileName = dto.CheckRes?.FileName,
  261. SmpStart = dto.CheckRes?.SmpStart,
  262. SmpCount = dto.CheckRes?.SmpCount,
  263. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  264. ModRate = dto.CheckRes?.ModRate,
  265. ModType = dto.CheckRes?.ModType,
  266. UserName = dto.CheckRes?.UserName,
  267. FfcHz = dto.CheckRes?.FfcHz,
  268. Snr = dto.CheckRes?.Snr
  269. });
  270. var repsCgRes = unitOfWork.Of<CgRes>();
  271. var cgRes = await repsCgRes.AddOrUpdateAsync(new CgRes
  272. {
  273. SigTime = dto.SigTime,
  274. Dto1 = Math.Round(dto.SxDto, 10),
  275. Dfo1 = Math.Round(dto.SxDfo, 10),
  276. Snr1 = Math.Round(dto.SxSnr, 1),
  277. DtoCdb = Math.Round(dto.XdDto, 10),
  278. DfoCdb = Math.Round(dto.XdDfo, 10),
  279. SnrCdb = Math.Round(dto.XdSnr, 1),
  280. YbMainDto = Math.Round(dto.MainYbDto, 10),
  281. YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10),
  282. StationResID = stationRes.Id,
  283. MainCode = dto.MainCode,
  284. MainXlTime = ephMain.data.TleTime,
  285. Adja1Code = dto.AdjaCode,
  286. Adja1XlTime = ephAdja.data.TleTime,
  287. TaskID = runTask.Id,
  288. MainX = ephMain.data.X,
  289. MainY = ephMain.data.Y,
  290. MainZ = ephMain.data.Z,
  291. MainVx = ephMain.data.VX,
  292. MainVy = ephMain.data.VY,
  293. MainVz = ephMain.data.VZ,
  294. Adja1Vx = ephAdja.data.VX,
  295. Adja1Vy = ephAdja.data.VY,
  296. Adja1Vz = ephAdja.data.VZ,
  297. Adja1X = ephAdja.data.X,
  298. Adja1Y = ephAdja.data.Y,
  299. Adja1Z = ephAdja.data.Z,
  300. TarFreqUp = dto.FreqUp,
  301. TarFreqDown = dto.FreqDown,
  302. });
  303. var res = PosApi.X2D1_Pos(cgRes, stationRes, dto.CalcConfidence);
  304. var repsPosRes = unitOfWork.Of<PosRes>();
  305. var posRes = await repsPosRes.AddOrUpdateAsync(new PosRes
  306. {
  307. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  308. SigTime = dto.SigTime,
  309. TaskInfoID = runTask.Id,
  310. CgResID = cgRes.Id,
  311. CheckResID = ckRes.Id,
  312. PosLon = res[0],
  313. PosLat = res[1],
  314. MirrLon = res[3],
  315. MirrLat = res[4],
  316. Confidence = (int)res[6],
  317. PosResType = EnumPosResType.X2D1,
  318. TargetInfoID = target?.Id
  319. });
  320. await unitOfWork.SaveAsync();
  321. //await unitOfWork.DisposeAsync();//依赖注入的对象在容器销毁时自动释放
  322. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  323. return Success();
  324. }
  325. /// <summary>
  326. /// 两星一地无参定位
  327. /// </summary>
  328. /// <returns></returns>
  329. [HttpPost]
  330. public async Task<AjaxResult> PosX2D1NoParAsync(X2D1NoXlNoParlPosDto dto)
  331. {
  332. TargetInfo target = null;
  333. TaskInfo runTask;
  334. var repsTask = unitOfWork.Of<TaskInfo>();
  335. if (dto.TaskID == null)
  336. {
  337. runTask = await repsTask.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  338. && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  339. if (runTask == null)
  340. {
  341. string msg = $"接收到两星一地无参定位参数,由于找不到执行中的任务忽略本次定位";
  342. logger.LogWarning(msg);
  343. return Error(msg);
  344. }
  345. }
  346. else
  347. {
  348. runTask = await repsTask.GetByIdAsync(dto.TaskID);
  349. if (runTask == null)
  350. {
  351. string msg = $"找不到任务,ID={dto.TaskID}";
  352. logger.LogWarning(msg);
  353. return Error(msg);
  354. }
  355. }
  356. if (!string.IsNullOrWhiteSpace(dto.Target))
  357. {
  358. var repsTarget = unitOfWork.Of<TargetInfo>();
  359. target = await repsTarget.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
  360. if (target == null)
  361. {
  362. target = await repsTarget.AddOrUpdateAsync(new TargetInfo()
  363. {
  364. TargetName = dto.Target.Trim(),
  365. TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim())
  366. });
  367. }
  368. }
  369. var repsXl = unitOfWork.Of<XlInfo>() as XlRepository;
  370. var xl1 = await repsXl.GetLatestAsync(dto.MainCode, dto.SigTime);
  371. if (xl1 == null)
  372. {
  373. string msg = $"系统缺少编号{dto.MainCode}卫星的星历!";
  374. logger.LogError(msg);
  375. return Error(msg);
  376. }
  377. logger.LogInformation($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  378. var xl2 = await repsXl.GetLatestAsync(dto.AdjaCode, dto.SigTime);
  379. if (xl2 == null)
  380. {
  381. string msg = $"系统缺少编号{dto.AdjaCode}卫星的星历!";
  382. logger.LogError(msg);
  383. return Error(msg);
  384. }
  385. logger.LogInformation($"卫星{dto.AdjaCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  386. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  387. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  388. if (ephMain.code != 200)
  389. {
  390. string msg = $"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}";
  391. logger.LogError(msg);
  392. return Error(msg);
  393. }
  394. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  395. var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  396. if (ephAdja.code != 200)
  397. {
  398. string msg = $"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}";
  399. logger.LogError(msg);
  400. return Error(msg);
  401. }
  402. //#warning 测试代码
  403. //var tarEcef = PhysicsHelper.GeoToEcef((46, 21, 0));
  404. //var ecefXl1 = (ephMain.data.X, ephMain.data.Y, ephMain.data.Z);
  405. //var ecefXl2 = (ephAdja.data.X, ephAdja.data.Y, ephAdja.data.Z);
  406. //var ecefCdb = PhysicsHelper.GeoToEcef((dto.CdbTxLon, dto.CdbTxLat, 0));
  407. //var ecefRec = PhysicsHelper.GeoToEcef((dto.SatTxLon, dto.SatTxLat, 0));
  408. //var dt1 = PhysicsHelper.Dto(tarEcef, ecefXl1, ecefRec);
  409. //var dt2 = PhysicsHelper.Dto(tarEcef, ecefXl2, ecefRec);
  410. //var dt3 = PhysicsHelper.Dto(tarEcef, ecefCdb);
  411. //var dto1 = dt1 - dt2;
  412. //var dto2 = dt1 - dt3;
  413. //dto.SxDto = dto1 * 1e6 + r.Next(-10, 10) + Math.Round(r.NextDouble(), 3);
  414. //dto.XdDto = dto2 * 1e6 + r.Next(-10, 10) + Math.Round(r.NextDouble(), 3);
  415. var repsStationRes = unitOfWork.Of<StationRes>();
  416. var stationRes = await repsStationRes.AddOrUpdateAsync(new StationRes
  417. {
  418. SatTxLon = dto.SatTxLon,
  419. SatTxLat = dto.SatTxLat,
  420. CdbTxLon = dto.CdbTxLon,
  421. CdbTxLat = dto.CdbTxLat,
  422. });
  423. var repsCheckRes = unitOfWork.Of<CheckRes>();
  424. var ckRes = await repsCheckRes.AddOrUpdateAsync(new CheckRes
  425. {
  426. FileName = dto.CheckRes?.FileName,
  427. SmpStart = dto.CheckRes?.SmpStart,
  428. SmpCount = dto.CheckRes?.SmpCount,
  429. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  430. ModRate = dto.CheckRes?.ModRate,
  431. ModType = dto.CheckRes?.ModType,
  432. UserName = dto.CheckRes?.UserName,
  433. FfcHz = dto.CheckRes?.FfcHz,
  434. Snr = dto.CheckRes?.Snr
  435. });
  436. var repsCgRes = unitOfWork.Of<CgRes>();
  437. var cgRes = await repsCgRes.AddOrUpdateAsync(new CgRes
  438. {
  439. SigTime = dto.SigTime,
  440. Dto1 = Math.Round(dto.SxDto, 10),
  441. Dfo1 = Math.Round(dto.SxDfo, 10),
  442. Snr1 = Math.Round(dto.SxSnr, 1),
  443. DtoCdb = Math.Round(dto.XdDto, 10),
  444. DfoCdb = Math.Round(dto.XdDfo, 10),
  445. SnrCdb = Math.Round(dto.XdSnr, 1),
  446. StationResID = stationRes.Id,
  447. MainCode = dto.MainCode,
  448. Adja1Code = dto.AdjaCode,
  449. MainXlTime = ephMain.data.TleTime,
  450. Adja1XlTime = ephAdja.data.TleTime,
  451. TaskID = runTask.Id,
  452. MainX = ephMain.data.X,
  453. MainY = ephMain.data.Y,
  454. MainZ = ephMain.data.Z,
  455. Adja1X = ephAdja.data.X,
  456. Adja1Y = ephAdja.data.Y,
  457. Adja1Z = ephAdja.data.Z,
  458. MainVx = ephMain.data.VX,
  459. MainVy = ephMain.data.VY,
  460. MainVz = ephMain.data.VZ,
  461. Adja1Vx = ephAdja.data.VX,
  462. Adja1Vy = ephAdja.data.VY,
  463. Adja1Vz = ephAdja.data.VZ,
  464. TarFreqUp = dto.FreqUp,
  465. TarFreqDown = dto.FreqDown,
  466. });
  467. var res = PosApi.X2D1_PosNoRef_ZL(cgRes, stationRes, dto.CalcConfidence);
  468. var repsPosRes = unitOfWork.Of<PosRes>();
  469. var posRes = await repsPosRes.AddOrUpdateAsync(new PosRes
  470. {
  471. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  472. SigTime = dto.SigTime,
  473. TaskInfoID = runTask.Id,
  474. CgResID = cgRes.Id,
  475. CheckResID = ckRes.Id,
  476. PosLon = res[0],
  477. PosLat = res[1],
  478. MirrLon = res[3],
  479. MirrLat = res[4],
  480. Confidence = (int)res[6],
  481. PosResType = EnumPosResType.X2D1NoRef,
  482. TargetInfoID = target?.Id
  483. });
  484. await unitOfWork.SaveAsync();
  485. //await unitOfWork.DisposeAsync();//依赖注入的对象在容器销毁时自动释放
  486. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  487. return Success();
  488. }
  489. #endregion
  490. #region 三星双时差定位
  491. /// <summary>
  492. /// 三星双时差带参定位
  493. /// </summary>
  494. /// <returns></returns>
  495. [HttpPost]
  496. public async Task<AjaxResult> PosX3TwoDtoAsync(X3TwoDtoNoXlPosDto dto)
  497. {
  498. TargetInfo target = null;
  499. TaskInfo runTask;
  500. var repsTask = unitOfWork.Of<TaskInfo>();
  501. if (dto.TaskID == null)
  502. {
  503. runTask = await repsTask.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  504. && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  505. if (runTask == null)
  506. {
  507. string msg = $"接收到三星双时差带参定位参数,由于找不到执行中的任务忽略本次定位";
  508. logger.LogWarning(msg);
  509. return Error(msg);
  510. }
  511. }
  512. else
  513. {
  514. runTask = await repsTask.GetByIdAsync(dto.TaskID);
  515. if (runTask == null)
  516. {
  517. string msg = $"找不到任务,ID={dto.TaskID}";
  518. logger.LogWarning(msg);
  519. return Error(msg);
  520. }
  521. }
  522. if (!string.IsNullOrWhiteSpace(dto.Target))
  523. {
  524. var repsTarget = unitOfWork.Of<TargetInfo>();
  525. target = await repsTarget.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
  526. if (target == null)
  527. {
  528. target = await repsTarget.AddOrUpdateAsync(new TargetInfo()
  529. {
  530. TargetName = dto.Target.Trim(),
  531. TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim())
  532. });
  533. }
  534. }
  535. var repsXl = unitOfWork.Of<XlInfo>() as XlRepository;
  536. var xl1 = await repsXl.GetLatestAsync(dto.MainCode, dto.SigTime);
  537. if (xl1 == null)
  538. {
  539. string msg = $"系统缺少编号{dto.MainCode}卫星的星历!";
  540. logger.LogError(msg);
  541. return Error(msg);
  542. }
  543. logger.LogInformation($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  544. var xl2 = await repsXl.GetLatestAsync(dto.Adja1Code, dto.SigTime);
  545. if (xl2 == null)
  546. {
  547. string msg = $"系统缺少编号{dto.Adja1Code}卫星的星历!";
  548. logger.LogError(msg);
  549. return Error(msg);
  550. }
  551. logger.LogInformation($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  552. var xl3 = await repsXl.GetLatestAsync(dto.Adja2Code, dto.SigTime);
  553. if (xl3 == null)
  554. {
  555. string msg = $"系统缺少编号{dto.Adja2Code}卫星的星历!";
  556. logger.LogError(msg);
  557. return Error(msg);
  558. }
  559. logger.LogInformation($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  560. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  561. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  562. if (ephMain.code != 200)
  563. {
  564. string msg = $"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}";
  565. logger.LogError(msg);
  566. return Error(msg);
  567. }
  568. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  569. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  570. if (ephAdja1.code != 200)
  571. {
  572. string msg = $"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}";
  573. logger.LogError(msg);
  574. return Error(msg);
  575. }
  576. var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime };
  577. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3);
  578. if (ephAdja2.code != 200)
  579. {
  580. string msg = $"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}";
  581. logger.LogError(msg);
  582. return Error(msg);
  583. }
  584. var repsStationRes = unitOfWork.Of<StationRes>();
  585. var stationRes = await repsStationRes.AddOrUpdateAsync(new StationRes
  586. {
  587. SatTxLon = dto.SatTxLon,
  588. SatTxLat = dto.SatTxLat,
  589. RefLon = dto.RefLon,
  590. RefLat = dto.RefLat,
  591. });
  592. var repsCheckRes = unitOfWork.Of<CheckRes>();
  593. var ckRes = await repsCheckRes.AddOrUpdateAsync(new CheckRes
  594. {
  595. FileName = dto.CheckRes?.FileName,
  596. SmpStart = dto.CheckRes?.SmpStart,
  597. SmpCount = dto.CheckRes?.SmpCount,
  598. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  599. ModRate = dto.CheckRes?.ModRate,
  600. ModType = dto.CheckRes?.ModType,
  601. UserName = dto.CheckRes?.UserName,
  602. FfcHz = dto.CheckRes?.FfcHz,
  603. Snr = dto.CheckRes?.Snr
  604. });
  605. var repsCgRes = unitOfWork.Of<CgRes>();
  606. var cgRes = await repsCgRes.AddOrUpdateAsync(new CgRes
  607. {
  608. SigTime = dto.SigTime,
  609. Dto1 = Math.Round(dto.Dto1, 10),
  610. Dfo1 = Math.Round(dto.Dfo1, 10),
  611. Snr1 = Math.Round(dto.Snr1, 1),
  612. Dto2 = Math.Round(dto.Dto2, 10),
  613. Dfo2 = Math.Round(dto.Dfo2, 10),
  614. Snr2 = Math.Round(dto.Snr2, 1),
  615. YbMainDto = Math.Round(dto.YbMainDto, 10),
  616. YbAdja1Dto = Math.Round(dto.YbAdja1Dto, 10),
  617. YbAdja2Dto = Math.Round(dto.YbAdja2Dto, 10),
  618. StationResID = stationRes.Id,
  619. MainCode = dto.MainCode,
  620. Adja1Code = dto.Adja1Code,
  621. Adja2Code = dto.Adja2Code,
  622. MainXlTime = ephMain.data.TleTime,
  623. Adja1XlTime = ephAdja1.data.TleTime,
  624. Adja2XlTime = ephAdja2.data.TleTime,
  625. TaskID = runTask.Id,
  626. MainX = ephMain.data.X,
  627. MainY = ephMain.data.Y,
  628. MainZ = ephMain.data.Z,
  629. MainVx = ephMain.data.VX,
  630. MainVy = ephMain.data.VY,
  631. MainVz = ephMain.data.VZ,
  632. Adja1X = ephAdja1.data.X,
  633. Adja1Y = ephAdja1.data.Y,
  634. Adja1Z = ephAdja1.data.Z,
  635. Adja1Vx = ephAdja1.data.VX,
  636. Adja1Vy = ephAdja1.data.VY,
  637. Adja1Vz = ephAdja1.data.VZ,
  638. Adja2X = ephAdja2.data.X,
  639. Adja2Y = ephAdja2.data.Y,
  640. Adja2Z = ephAdja2.data.Z,
  641. Adja2Vx = ephAdja2.data.VX,
  642. Adja2Vy = ephAdja2.data.VY,
  643. Adja2Vz = ephAdja2.data.VZ,
  644. TarFreqUp = dto.FreqUp,
  645. TarFreqDown = dto.FreqDown,
  646. });
  647. var res = PosApi.X3_Pos(cgRes, stationRes, dto.CalcConfidence);
  648. var repsPosRes = unitOfWork.Of<PosRes>();
  649. var posRes = await repsPosRes.AddOrUpdateAsync(new PosRes
  650. {
  651. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  652. SigTime = dto.SigTime,
  653. TaskInfoID = runTask.Id,
  654. CgResID = cgRes.Id,
  655. CheckResID = ckRes.Id,
  656. PosLon = res[0],
  657. PosLat = res[1],
  658. MirrLon = res[3],
  659. MirrLat = res[4],
  660. Confidence = (int)res[6],
  661. PosResType = EnumPosResType.X3,
  662. TargetInfoID=target?.Id,
  663. });
  664. await unitOfWork.SaveAsync();
  665. //await unitOfWork.DisposeAsync();//依赖注入的对象在容器销毁时自动释放
  666. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  667. return Success();
  668. }
  669. /// <summary>
  670. /// 三星双时差无参定位
  671. /// </summary>
  672. /// <returns></returns>
  673. [HttpPost]
  674. public async Task<AjaxResult> PosX3TwoDtoNoParAsync(X3TwoDtoNoXlNoParPosDto dto)
  675. {
  676. TargetInfo target = null;
  677. TaskInfo runTask;
  678. var repsTask = unitOfWork.Of<TaskInfo>();
  679. if (dto.TaskID == null)
  680. {
  681. runTask = await repsTask.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  682. && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  683. if (runTask == null)
  684. {
  685. string msg = $"接收到三星双时差无参定位参数,由于找不到执行中的任务忽略本次定位";
  686. logger.LogWarning(msg);
  687. return Error(msg);
  688. }
  689. }
  690. else
  691. {
  692. runTask = await repsTask.GetByIdAsync(dto.TaskID);
  693. if (runTask == null)
  694. {
  695. string msg = $"找不到任务,ID={dto.TaskID}";
  696. logger.LogWarning(msg);
  697. return Error(msg);
  698. }
  699. }
  700. if (!string.IsNullOrWhiteSpace(dto.Target))
  701. {
  702. var repsTarget = unitOfWork.Of<TargetInfo>();
  703. target = await repsTarget.FirstOrDefaultAsync(p => p.TargetName == dto.Target.Trim());
  704. if (target == null)
  705. {
  706. target = await repsTarget.AddOrUpdateAsync(new TargetInfo()
  707. {
  708. TargetName = dto.Target.Trim(),
  709. TargeColor = ColorHelper.GetHtmlColor(dto.Target.Trim())
  710. });
  711. }
  712. }
  713. var repsXl = unitOfWork.Of<XlInfo>() as XlRepository;
  714. var xl1 = await repsXl.GetLatestAsync(dto.MainCode, dto.SigTime);
  715. if (xl1 == null)
  716. {
  717. string msg = $"系统缺少编号{dto.MainCode}卫星的星历!";
  718. logger.LogError(msg);
  719. return Error(msg);
  720. }
  721. logger.LogInformation($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  722. var xl2 = await repsXl.GetLatestAsync(dto.Adja1Code, dto.SigTime);
  723. if (xl2 == null)
  724. {
  725. string msg = $"系统缺少编号{dto.Adja1Code}卫星的星历!";
  726. logger.LogError(msg);
  727. return Error(msg);
  728. }
  729. logger.LogInformation($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  730. var xl3 = await repsXl.GetLatestAsync(dto.Adja2Code, dto.SigTime);
  731. if (xl3 == null)
  732. {
  733. string msg = $"系统缺少编号{dto.Adja2Code}卫星的星历!";
  734. logger.LogError(msg);
  735. return Error(msg);
  736. }
  737. logger.LogInformation($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  738. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  739. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  740. if (ephMain.code != 200)
  741. {
  742. string msg = $"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}";
  743. logger.LogError(msg);
  744. return Error(msg);
  745. }
  746. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  747. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  748. if (ephAdja1.code != 200)
  749. {
  750. string msg = $"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}";
  751. logger.LogError(msg);
  752. return Error(msg);
  753. }
  754. var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime };
  755. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3);
  756. if (ephAdja2.code != 200)
  757. {
  758. string msg = $"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}";
  759. logger.LogError(msg);
  760. return Error(msg);
  761. }
  762. var repsStationRes = unitOfWork.Of<StationRes>();
  763. var stationRes = await repsStationRes.AddOrUpdateAsync(new StationRes
  764. {
  765. SatTxLon = dto.SatTxLon,
  766. SatTxLat = dto.SatTxLat,
  767. });
  768. var repsCheckRes = unitOfWork.Of<CheckRes>();
  769. var ckRes = await repsCheckRes.AddOrUpdateAsync(new CheckRes
  770. {
  771. FileName = dto.CheckRes?.FileName,
  772. SmpStart = dto.CheckRes?.SmpStart,
  773. SmpCount = dto.CheckRes?.SmpCount,
  774. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  775. ModRate = dto.CheckRes?.ModRate,
  776. ModType = dto.CheckRes?.ModType,
  777. UserName = dto.CheckRes?.UserName,
  778. FfcHz = dto.CheckRes?.FfcHz,
  779. Snr = dto.CheckRes?.Snr
  780. });
  781. var repsCgRes = unitOfWork.Of<CgRes>();
  782. var cgRes = await repsCgRes.AddOrUpdateAsync(new CgRes
  783. {
  784. SigTime = dto.SigTime,
  785. Dto1 = Math.Round(dto.Dto1, 10),
  786. Dfo1 = Math.Round(dto.Dfo1, 10),
  787. Snr1 = Math.Round(dto.Snr1, 1),
  788. Dto2 = Math.Round(dto.Dto2, 10),
  789. Dfo2 = Math.Round(dto.Dfo2, 10),
  790. Snr2 = Math.Round(dto.Snr2, 1),
  791. StationResID = stationRes.Id,
  792. MainCode = dto.MainCode,
  793. Adja1Code = dto.Adja1Code,
  794. Adja2Code = dto.Adja2Code,
  795. MainXlTime = ephMain.data.TleTime,
  796. Adja1XlTime = ephAdja1.data.TleTime,
  797. Adja2XlTime = ephAdja2.data.TleTime,
  798. TaskID = runTask.Id,
  799. MainX = ephMain.data.X,
  800. MainY = ephMain.data.Y,
  801. MainZ = ephMain.data.Z,
  802. MainVx = ephMain.data.VX,
  803. MainVy = ephMain.data.VY,
  804. MainVz = ephMain.data.VZ,
  805. Adja1X = ephAdja1.data.X,
  806. Adja1Y = ephAdja1.data.Y,
  807. Adja1Z = ephAdja1.data.Z,
  808. Adja1Vx = ephAdja1.data.VX,
  809. Adja1Vy = ephAdja1.data.VY,
  810. Adja1Vz = ephAdja1.data.VZ,
  811. Adja2X = ephAdja2.data.X,
  812. Adja2Y = ephAdja2.data.Y,
  813. Adja2Z = ephAdja2.data.Z,
  814. Adja2Vx = ephAdja2.data.VX,
  815. Adja2Vy = ephAdja2.data.VY,
  816. Adja2Vz = ephAdja2.data.VZ,
  817. TarFreqUp = dto.FreqUp,
  818. TarFreqDown = dto.FreqDown,
  819. });
  820. var res = PosApi.X3_PosNoRef(cgRes, stationRes, dto.CalcConfidence);
  821. var repsPosRes = unitOfWork.Of<PosRes>();
  822. var posRes = await repsPosRes.AddOrUpdateAsync(new PosRes
  823. {
  824. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  825. SigTime = dto.SigTime,
  826. TaskInfoID = runTask.Id,
  827. CgResID = cgRes.Id,
  828. CheckResID = ckRes.Id,
  829. PosLon = res[0],
  830. PosLat = res[1],
  831. MirrLon = res[3],
  832. MirrLat = res[4],
  833. Confidence = (int)res[6],
  834. PosResType = EnumPosResType.X3,
  835. TargetInfoID = target?.Id,
  836. });
  837. await unitOfWork.SaveAsync();
  838. //await unitOfWork.DisposeAsync();//依赖注入的对象在容器销毁时自动释放
  839. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  840. return Success();
  841. }
  842. #endregion
  843. private object MapModel(PosRes res)
  844. {
  845. return res;
  846. //return new ModelPosRes()
  847. //{
  848. // ID = res.ID,
  849. // FreqUpHz = res.FreqUpHz,
  850. // SigTime = res.SigTime,
  851. // TaskInfoID = res.TaskInfoID,
  852. // PosLon = res.PosLon,
  853. // PosLat = res.PosLat,
  854. // MirrLon = res.MirrLon,
  855. // MirrLat = res.MirrLat,
  856. // TargetState = res.TargetState,
  857. // PosResType = res.PosResType,
  858. // CgResID = res.CgResID,
  859. // CheckRes = res.CheckRes,
  860. // CheckResID = res.CheckResID,
  861. // ColorKey = res.ColorKey,
  862. // CreateTime = res.CreateTime,
  863. // CxResID = res.CxResID,
  864. // StationResID = res.StationResID,
  865. // TargetInfo = res.TargetInfo,
  866. // TargetInfoID = res.TargetInfoID,
  867. // UpdateTime = res.UpdateTime,
  868. // Confidence = res.Confidence,
  869. //};
  870. }
  871. }
  872. }