PosController.cs 99 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Linq;
  5. using System.Net.Http;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Web.Http;
  9. using Serilog;
  10. using XdCxRhDW.Dto;
  11. using XdCxRhDW.Repostory;
  12. using System.IO;
  13. using XdCxRhDW.Entity;
  14. using XdCxRhDW.Api;
  15. using XdCxRhDW.WebApi;
  16. using DPP_YH_Core.Extensions;
  17. using XdCxRhDW.App.Model;
  18. using System.Diagnostics;
  19. using System.Configuration;
  20. namespace XdCxRhDW.App.Controllers
  21. {
  22. /// <summary>
  23. /// 定位功能相关接口
  24. /// </summary>
  25. public class PosController : BaseController
  26. {
  27. #region 一星一地测向定位
  28. /// <summary>
  29. /// 一星一地测向带参定位(含星历)
  30. /// </summary>
  31. /// <param name="dto">定位参数</param>
  32. /// <returns></returns>
  33. [HttpPost]
  34. public async Task<AjaxResult<PosResDto>> PosX1D1Async(X1D1PosDto dto)
  35. {
  36. TaskInfo runTask;
  37. using (RHDWContext db = new RHDWContext())
  38. {
  39. if (dto.TaskID == null)
  40. {
  41. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  42. && p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running);
  43. if (runTask == null)
  44. {
  45. Serilog.Log.Warning($"接收到一星一地测向带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  46. return Error<PosResDto>($"多模式融合定位平台没有启动一星一地测向定位任务");
  47. }
  48. }
  49. else
  50. {
  51. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  52. if (runTask == null)
  53. {
  54. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  55. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  56. }
  57. }
  58. }
  59. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  60. {
  61. var StationRes = db.StationRes.Add(new StationRes()
  62. {
  63. SatTxLon = dto.SatTxLon,
  64. SatTxLat = dto.SatTxLat,
  65. CdbTxLon = dto.CdbTxLon,
  66. CdbTxLat = dto.CdbTxLat,
  67. CxLon = dto.CxLon,
  68. CxLat = dto.CxLat,
  69. RefLon = dto.RefLon,
  70. RefLat = dto.RefLat,
  71. });
  72. var ckRes = new CheckRes()
  73. {
  74. FileName = dto.CheckRes?.FileName,
  75. SmpStart = dto.CheckRes?.SmpStart,
  76. SmpCount = dto.CheckRes?.SmpCount,
  77. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  78. ModRate = dto.CheckRes?.ModRate,
  79. ModType = dto.CheckRes?.ModType,
  80. UserName = dto.CheckRes?.UserName,
  81. FfcHz = dto.CheckRes?.FfcHz,
  82. Snr = dto.CheckRes?.Snr
  83. };
  84. db.CheckRes.Add(ckRes);
  85. var cgRes = db.CgRes.Add(new CgRes()
  86. {
  87. SigTime = dto.SigTime,
  88. DtoCdb = Math.Round(dto.XdDto, 10),
  89. DfoCdb = Math.Round(dto.XdDfo, 10),
  90. SnrCdb = Math.Round(dto.XdSnr, 1),
  91. YbMainDto = Math.Round(dto.MainYbDto, 10),
  92. StationResID = StationRes.ID,
  93. MainCode = dto.MainCode,
  94. TaskID = runTask.ID,
  95. MainX = dto.MainX,
  96. MainY = dto.MainY,
  97. MainZ = dto.MainZ,
  98. TarFreqUp = dto.FreqUp,
  99. TarFreqDown = dto.FreqDown,
  100. });
  101. var cxRes = db.CxRes.Add(new CxRes()
  102. {
  103. SigTime = dto.SigTime,
  104. Fx = dto.CxRes,
  105. });
  106. var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes, dto.CalcConfidence);
  107. PosRes posRes = new PosRes()
  108. {
  109. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  110. SigTime = cgRes.SigTime,
  111. TaskInfoID = runTask.ID,
  112. CxResID = cxRes.ID,
  113. CgResID = cgRes.ID,
  114. CheckResID = ckRes.ID,
  115. PosLon = res[0],
  116. PosLat = res[1],
  117. MirrLon = res[3],
  118. MirrLat = res[4],
  119. Confidence = (int)res[6],
  120. PosResType = EnumPosResType.X1D1CX,
  121. };
  122. posRes = db.PosRes.Add(posRes);
  123. await db.SaveChangesAsync();
  124. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  125. return Success(MapDto(posRes));
  126. }
  127. }
  128. /// <summary>
  129. /// 一星一地测向带参定位(无星历)
  130. /// </summary>
  131. /// <returns>返回定位结果ID</returns>
  132. [HttpPost]
  133. public async Task<AjaxResult<PosResDto>> PosX1D1NoXlAsync(X1D1NoXlPosDto dto)
  134. {
  135. TaskInfo runTask;
  136. using (RHDWContext db = new RHDWContext())
  137. {
  138. if (dto.TaskID == null)
  139. {
  140. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  141. && p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running);
  142. if (runTask == null)
  143. {
  144. Serilog.Log.Warning($"接收到一星一地测向带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  145. return Error<PosResDto>($"多模式融合定位平台没有启动一星一地测向定位任务");
  146. }
  147. }
  148. else
  149. {
  150. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  151. if (runTask == null)
  152. {
  153. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  154. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  155. }
  156. }
  157. }
  158. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  159. if (xl1 == null)
  160. {
  161. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  162. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  163. }
  164. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  165. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  166. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  167. if (ephMain.code != 200)
  168. {
  169. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  170. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  171. }
  172. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  173. {
  174. var StationRes = db.StationRes.Add(new StationRes()
  175. {
  176. SatTxLon = dto.SatTxLon,
  177. SatTxLat = dto.SatTxLat,
  178. CdbTxLon = dto.CdbTxLon,
  179. CdbTxLat = dto.CdbTxLat,
  180. CxLon = dto.CxLon,
  181. CxLat = dto.CxLat,
  182. RefLon = dto.RefLon,
  183. RefLat = dto.RefLat,
  184. });
  185. var ckRes = new CheckRes()
  186. {
  187. FileName = dto.CheckRes?.FileName,
  188. SmpStart = dto.CheckRes?.SmpStart,
  189. SmpCount = dto.CheckRes?.SmpCount,
  190. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  191. ModRate = dto.CheckRes?.ModRate,
  192. ModType = dto.CheckRes?.ModType,
  193. UserName = dto.CheckRes?.UserName,
  194. FfcHz = dto.CheckRes?.FfcHz,
  195. Snr = dto.CheckRes?.Snr
  196. };
  197. db.CheckRes.Add(ckRes);
  198. var cgRes = db.CgRes.Add(new CgRes()
  199. {
  200. SigTime = dto.SigTime,
  201. DtoCdb = Math.Round(dto.XdDto, 10),
  202. DfoCdb = Math.Round(dto.XdDfo, 10),
  203. SnrCdb = Math.Round(dto.XdSnr, 1),
  204. YbMainDto = Math.Round(dto.MainYbDto, 10),
  205. StationResID = StationRes.ID,
  206. MainCode = dto.MainCode,
  207. MainXlTime = ephMain.data.TleTime,
  208. TaskID = runTask.ID,
  209. MainX = ephMain.data.X,
  210. MainY = ephMain.data.Y,
  211. MainZ = ephMain.data.Z,
  212. MainVx = ephMain.data.VX,
  213. MainVy = ephMain.data.VY,
  214. MainVz = ephMain.data.VZ,
  215. TarFreqUp = dto.FreqUp,
  216. TarFreqDown = dto.FreqDown,
  217. });
  218. var cxRes = db.CxRes.Add(new CxRes()
  219. {
  220. SigTime = dto.SigTime,
  221. Fx = dto.CxRes,
  222. });
  223. var res = PosApi.X1D1_Pos(cgRes, StationRes, cxRes, dto.CalcConfidence);
  224. PosRes posRes = new PosRes()
  225. {
  226. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  227. SigTime = dto.SigTime,
  228. TaskInfoID = runTask.ID,
  229. CgResID = cgRes.ID,
  230. CxResID = cxRes.ID,
  231. CheckResID = ckRes.ID,
  232. PosLon = res[0],
  233. PosLat = res[1],
  234. MirrLon = res[3],
  235. MirrLat = res[4],
  236. Confidence = (int)res[6],
  237. PosResType = EnumPosResType.X1D1CX,
  238. };
  239. posRes = db.PosRes.Add(posRes);
  240. await db.SaveChangesAsync();
  241. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  242. return Success(MapDto(posRes));
  243. }
  244. }
  245. #endregion
  246. #region 两星一地定位
  247. /// <summary>
  248. /// 两星一地带参定位(含星历)
  249. /// </summary>
  250. /// <param name="dto">定位参数</param>
  251. /// <returns></returns>
  252. [HttpPost]
  253. public async Task<AjaxResult<PosResDto>> PosX2D1Async(X2D1PosDto dto)
  254. {
  255. TaskInfo runTask;
  256. using (RHDWContext db = new RHDWContext())
  257. {
  258. if (dto.TaskID == null)
  259. {
  260. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  261. && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  262. if (runTask == null)
  263. {
  264. Serilog.Log.Warning($"接收到两星一地带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  265. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  266. }
  267. }
  268. else
  269. {
  270. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  271. if (runTask == null)
  272. {
  273. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  274. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  275. }
  276. }
  277. }
  278. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  279. {
  280. var StationRes = db.StationRes.Add(new StationRes()
  281. {
  282. SatTxLon = dto.SatTxLon,
  283. SatTxLat = dto.SatTxLat,
  284. CdbTxLon = dto.CdbTxLon,
  285. CdbTxLat = dto.CdbTxLat,
  286. RefLon = dto.RefLon,
  287. RefLat = dto.RefLat,
  288. });
  289. var ckRes = new CheckRes()
  290. {
  291. FileName = dto.CheckRes?.FileName,
  292. SmpStart = dto.CheckRes?.SmpStart,
  293. SmpCount = dto.CheckRes?.SmpCount,
  294. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  295. ModRate = dto.CheckRes?.ModRate,
  296. ModType = dto.CheckRes?.ModType,
  297. UserName = dto.CheckRes?.UserName,
  298. FfcHz = dto.CheckRes?.FfcHz,
  299. Snr = dto.CheckRes?.Snr
  300. };
  301. ckRes = db.CheckRes.Add(ckRes);
  302. var cgRes = db.CgRes.Add(new CgRes()
  303. {
  304. SigTime = dto.SigTime,
  305. Dto1 = Math.Round(dto.SxDto, 10),
  306. Dfo1 = Math.Round(dto.SxDfo, 10),
  307. Snr1 = Math.Round(dto.SxSnr, 1),
  308. DtoCdb = Math.Round(dto.XdDto, 10),
  309. DfoCdb = Math.Round(dto.XdDfo, 10),
  310. SnrCdb = Math.Round(dto.XdSnr, 1),
  311. YbMainDto = Math.Round(dto.MainYbDto, 10),
  312. YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10),
  313. StationResID = StationRes.ID,
  314. MainCode = dto.MainCode,
  315. Adja1Code = dto.AdjaCode,
  316. TaskID = runTask.ID,
  317. MainX = dto.MainX,
  318. MainY = dto.MainY,
  319. MainZ = dto.MainZ,
  320. Adja1X = dto.AdjaX,
  321. Adja1Y = dto.AdjaY,
  322. Adja1Z = dto.AdjaZ,
  323. MainVx = dto.MainVX,
  324. MainVy = dto.MainVY,
  325. MainVz = dto.MainVZ,
  326. Adja1Vx = dto.AdjaVX,
  327. Adja1Vy = dto.AdjaVY,
  328. Adja1Vz = dto.AdjaVZ,
  329. TarFreqUp = dto.FreqUp,
  330. TarFreqDown = dto.FreqDown,
  331. });
  332. var res = PosApi.X2D1_Pos(cgRes, StationRes, dto.CalcConfidence);
  333. PosRes posRes = new PosRes()
  334. {
  335. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  336. SigTime = cgRes.SigTime,
  337. TaskInfoID = runTask.ID,
  338. CgResID = cgRes.ID,
  339. CheckResID = ckRes.ID,
  340. PosLon = res[0],
  341. PosLat = res[1],
  342. MirrLon = res[3],
  343. MirrLat = res[4],
  344. Confidence = (int)res[6],
  345. PosResType = EnumPosResType.X2D1,
  346. };
  347. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  348. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  349. if (dto.CalcConfidence)
  350. {
  351. }
  352. posRes = db.PosRes.Add(posRes);
  353. await db.SaveChangesAsync();
  354. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  355. return Success(MapDto(posRes));
  356. }
  357. }
  358. /// <summary>
  359. /// 两星一地带参定位(无星历)
  360. /// </summary>
  361. /// <returns>返回定位结果ID</returns>
  362. [HttpPost]
  363. public async Task<AjaxResult<PosResDto>> PosX2D1NoXlAsync(X2D1NoXlPosDto dto)
  364. {
  365. TaskInfo runTask;
  366. using (RHDWContext db = new RHDWContext())
  367. {
  368. if (dto.TaskID == null)
  369. {
  370. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  371. && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  372. if (runTask == null)
  373. {
  374. Serilog.Log.Warning($"接收到两星一地带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  375. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  376. }
  377. }
  378. else
  379. {
  380. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  381. if (runTask == null)
  382. {
  383. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  384. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  385. }
  386. }
  387. }
  388. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  389. if (xl1 == null)
  390. {
  391. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  392. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  393. }
  394. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  395. var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime);
  396. if (xl2 == null)
  397. {
  398. Serilog.Log.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  399. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  400. }
  401. Serilog.Log.Information($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  402. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  403. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  404. if (ephMain.code != 200)
  405. {
  406. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  407. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  408. }
  409. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  410. var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  411. if (ephAdja.code != 200)
  412. {
  413. Serilog.Log.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}");
  414. return Error<PosResDto>($"推算卫星{dto.AdjaCode}的ECEF星历出错");
  415. }
  416. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  417. {
  418. var StationRes = db.StationRes.Add(new StationRes()
  419. {
  420. SatTxLon = dto.SatTxLon,
  421. SatTxLat = dto.SatTxLat,
  422. CdbTxLon = dto.CdbTxLon,
  423. CdbTxLat = dto.CdbTxLat,
  424. RefLon = dto.RefLon,
  425. RefLat = dto.RefLat,
  426. });
  427. var ckRes = new CheckRes()
  428. {
  429. FileName = dto.CheckRes?.FileName,
  430. SmpStart = dto.CheckRes?.SmpStart,
  431. SmpCount = dto.CheckRes?.SmpCount,
  432. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  433. ModRate = dto.CheckRes?.ModRate,
  434. ModType = dto.CheckRes?.ModType,
  435. UserName = dto.CheckRes?.UserName,
  436. FfcHz = dto.CheckRes?.FfcHz,
  437. Snr = dto.CheckRes?.Snr
  438. };
  439. db.CheckRes.Add(ckRes);
  440. var cgRes = db.CgRes.Add(new CgRes()
  441. {
  442. SigTime = dto.SigTime,
  443. Dto1 = Math.Round(dto.SxDto, 10),
  444. Dfo1 = Math.Round(dto.SxDfo, 10),
  445. Snr1 = Math.Round(dto.SxSnr, 1),
  446. DtoCdb = Math.Round(dto.XdDto, 10),
  447. DfoCdb = Math.Round(dto.XdDfo, 10),
  448. SnrCdb = Math.Round(dto.XdSnr, 1),
  449. YbMainDto = Math.Round(dto.MainYbDto, 10),
  450. YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10),
  451. StationResID = StationRes.ID,
  452. MainCode = dto.MainCode,
  453. MainXlTime = ephMain.data.TleTime,
  454. Adja1Code = dto.AdjaCode,
  455. Adja1XlTime = ephAdja.data.TleTime,
  456. TaskID = runTask.ID,
  457. MainX = ephMain.data.X,
  458. MainY = ephMain.data.Y,
  459. MainZ = ephMain.data.Z,
  460. MainVx = ephMain.data.VX,
  461. MainVy = ephMain.data.VY,
  462. MainVz = ephMain.data.VZ,
  463. Adja1Vx = ephAdja.data.VX,
  464. Adja1Vy = ephAdja.data.VY,
  465. Adja1Vz = ephAdja.data.VZ,
  466. Adja1X = ephAdja.data.X,
  467. Adja1Y = ephAdja.data.Y,
  468. Adja1Z = ephAdja.data.Z,
  469. TarFreqUp = dto.FreqUp,
  470. TarFreqDown = dto.FreqDown,
  471. });
  472. var res = PosApi.X2D1_Pos(cgRes, StationRes, dto.CalcConfidence);
  473. PosRes posRes = new PosRes()
  474. {
  475. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  476. SigTime = dto.SigTime,
  477. TaskInfoID = runTask.ID,
  478. CgResID = cgRes.ID,
  479. CheckResID = ckRes.ID,
  480. PosLon = res[0],
  481. PosLat = res[1],
  482. MirrLon = res[3],
  483. MirrLat = res[4],
  484. Confidence = (int)res[6],
  485. PosResType = EnumPosResType.X2D1,
  486. };
  487. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  488. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  489. posRes = db.PosRes.Add(posRes);
  490. await db.SaveChangesAsync();
  491. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  492. return Success(MapDto(posRes));
  493. }
  494. }
  495. /// <summary>
  496. /// 两星一地无参定位(含星历)
  497. /// </summary>
  498. /// <param name="dto">定位参数</param>
  499. /// <returns></returns>
  500. [HttpPost]
  501. public async Task<AjaxResult<PosResDto>> PosX2D1NoParAsync(X2D1NoParPosDto dto)
  502. {
  503. TaskInfo runTask;
  504. using (RHDWContext db = new RHDWContext())
  505. {
  506. if (dto.TaskID == null)
  507. {
  508. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  509. && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  510. if (runTask == null)
  511. {
  512. Serilog.Log.Warning($"接收到两星一地无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  513. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  514. }
  515. }
  516. else
  517. {
  518. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  519. if (runTask == null)
  520. {
  521. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  522. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  523. }
  524. }
  525. }
  526. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  527. {
  528. var StationRes = db.StationRes.Add(new StationRes()
  529. {
  530. SatTxLon = dto.SatTxLon,
  531. SatTxLat = dto.SatTxLat,
  532. CdbTxLon = dto.CdbTxLon,
  533. CdbTxLat = dto.CdbTxLat,
  534. });
  535. var ckRes = new CheckRes()
  536. {
  537. FileName = dto.CheckRes?.FileName,
  538. SmpStart = dto.CheckRes?.SmpStart,
  539. SmpCount = dto.CheckRes?.SmpCount,
  540. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  541. ModRate = dto.CheckRes?.ModRate,
  542. ModType = dto.CheckRes?.ModType,
  543. UserName = dto.CheckRes?.UserName,
  544. FfcHz = dto.CheckRes?.FfcHz,
  545. Snr = dto.CheckRes?.Snr
  546. };
  547. db.CheckRes.Add(ckRes);
  548. var cgRes = db.CgRes.Add(new CgRes()
  549. {
  550. SigTime = dto.SigTime,
  551. Dto1 = Math.Round(dto.SxDto, 10),
  552. Dfo1 = Math.Round(dto.SxDfo, 10),
  553. Snr1 = Math.Round(dto.SxSnr, 1),
  554. DtoCdb = Math.Round(dto.XdDto, 10),
  555. DfoCdb = Math.Round(dto.XdDfo, 10),
  556. SnrCdb = Math.Round(dto.XdSnr, 1),
  557. StationResID = StationRes.ID,
  558. MainCode = dto.MainCode,
  559. Adja1Code = dto.AdjaCode,
  560. TaskID = runTask.ID,
  561. MainX = dto.MainX,
  562. MainY = dto.MainY,
  563. MainZ = dto.MainZ,
  564. Adja1X = dto.AdjaX,
  565. Adja1Y = dto.AdjaY,
  566. Adja1Z = dto.AdjaZ,
  567. MainVx = dto.MainVX,
  568. MainVy = dto.MainVY,
  569. MainVz = dto.MainVZ,
  570. Adja1Vx = dto.AdjaVX,
  571. Adja1Vy = dto.AdjaVY,
  572. Adja1Vz = dto.AdjaVZ,
  573. TarFreqUp = dto.FreqUp,
  574. TarFreqDown = dto.FreqDown,
  575. });
  576. double[] res;
  577. if (ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"] != null
  578. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "false"
  579. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "0")
  580. {
  581. res = PosApi.X2D1_PosNoRef_ZL(cgRes, StationRes);
  582. }
  583. else
  584. {
  585. res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  586. }
  587. PosRes posRes = new PosRes()
  588. {
  589. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  590. SigTime = cgRes.SigTime,
  591. TaskInfoID = runTask.ID,
  592. CgResID = cgRes.ID,
  593. CheckResID = ckRes.ID,
  594. PosLon = res[0],
  595. PosLat = res[1],
  596. MirrLon = res[3],
  597. MirrLat = res[4],
  598. Confidence = (int)res[6],
  599. PosResType = EnumPosResType.X2D1NoRef,
  600. };
  601. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  602. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  603. posRes = db.PosRes.Add(posRes);
  604. await db.SaveChangesAsync();
  605. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  606. return Success(MapDto(posRes));
  607. }
  608. }
  609. /// <summary>
  610. /// 两星一地无参定位(无星历)
  611. /// </summary>
  612. /// <returns>返回定位结果ID</returns>
  613. [HttpPost]
  614. public async Task<AjaxResult<PosResDto>> PosX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto)
  615. {
  616. TaskInfo runTask;
  617. using (RHDWContext db = new RHDWContext())
  618. {
  619. if (dto.TaskID == null)
  620. {
  621. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  622. && p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  623. if (runTask == null)
  624. {
  625. Serilog.Log.Warning($"接收到两星一地无参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  626. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  627. }
  628. }
  629. else
  630. {
  631. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  632. if (runTask == null)
  633. {
  634. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  635. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  636. }
  637. }
  638. }
  639. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  640. if (xl1 == null)
  641. {
  642. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  643. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  644. }
  645. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  646. var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime);
  647. if (xl2 == null)
  648. {
  649. Serilog.Log.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  650. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  651. }
  652. Serilog.Log.Information($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  653. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  654. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  655. if (ephMain.code != 200)
  656. {
  657. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  658. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  659. }
  660. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  661. var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  662. if (ephAdja.code != 200)
  663. {
  664. Serilog.Log.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}");
  665. return Error<PosResDto>($"推算卫星{dto.AdjaCode}的ECEF星历出错");
  666. }
  667. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  668. {
  669. var StationRes = db.StationRes.Add(new StationRes()
  670. {
  671. SatTxLon = dto.SatTxLon,
  672. SatTxLat = dto.SatTxLat,
  673. CdbTxLon = dto.CdbTxLon,
  674. CdbTxLat = dto.CdbTxLat,
  675. });
  676. var ckRes = new CheckRes()
  677. {
  678. FileName = dto.CheckRes?.FileName,
  679. SmpStart = dto.CheckRes?.SmpStart,
  680. SmpCount = dto.CheckRes?.SmpCount,
  681. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  682. ModRate = dto.CheckRes?.ModRate,
  683. ModType = dto.CheckRes?.ModType,
  684. UserName = dto.CheckRes?.UserName,
  685. FfcHz = dto.CheckRes?.FfcHz,
  686. Snr = dto.CheckRes?.Snr
  687. };
  688. db.CheckRes.Add(ckRes);
  689. var cgRes = db.CgRes.Add(new CgRes()
  690. {
  691. SigTime = dto.SigTime,
  692. Dto1 = Math.Round(dto.SxDto, 10),
  693. Dfo1 = Math.Round(dto.SxDfo, 10),
  694. Snr1 = Math.Round(dto.SxSnr, 1),
  695. DtoCdb = Math.Round(dto.XdDto, 10),
  696. DfoCdb = Math.Round(dto.XdDfo, 10),
  697. SnrCdb = Math.Round(dto.XdSnr, 1),
  698. StationResID = StationRes.ID,
  699. FixedStationResID=dto.FixedStationId,
  700. MainCode = dto.MainCode,
  701. Adja1Code = dto.AdjaCode,
  702. MainXlTime = ephMain.data.TleTime,
  703. Adja1XlTime = ephAdja.data.TleTime,
  704. TaskID = runTask.ID,
  705. MainX = ephMain.data.X,
  706. MainY = ephMain.data.Y,
  707. MainZ = ephMain.data.Z,
  708. Adja1X = ephAdja.data.X,
  709. Adja1Y = ephAdja.data.Y,
  710. Adja1Z = ephAdja.data.Z,
  711. MainVx = ephMain.data.VX,
  712. MainVy = ephMain.data.VY,
  713. MainVz = ephMain.data.VZ,
  714. Adja1Vx = ephAdja.data.VX,
  715. Adja1Vy = ephAdja.data.VY,
  716. Adja1Vz = ephAdja.data.VZ,
  717. TarFreqUp = dto.FreqUp,
  718. TarFreqDown = dto.FreqDown,
  719. });
  720. double[] res;
  721. if (ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"] != null
  722. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "false"
  723. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "0")
  724. {
  725. res = PosApi.X2D1_PosNoRef_ZL(cgRes, StationRes);
  726. }
  727. else
  728. {
  729. res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  730. }
  731. PosRes posRes = new PosRes()
  732. {
  733. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  734. SigTime = dto.SigTime,
  735. TaskInfoID = runTask.ID,
  736. CgResID = cgRes.ID,
  737. CheckResID = ckRes.ID,
  738. PosLon = res[0],
  739. PosLat = res[1],
  740. MirrLon = res[3],
  741. MirrLat = res[4],
  742. Confidence = (int)res[6],
  743. PosResType = EnumPosResType.X2D1NoRef,
  744. };
  745. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  746. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  747. posRes = db.PosRes.Add(posRes);
  748. await db.SaveChangesAsync();
  749. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  750. return Success(MapDto(posRes));
  751. }
  752. }
  753. #endregion
  754. #region 融合定位
  755. /// <summary>
  756. /// 融合带参定位(含星历)
  757. /// </summary>
  758. /// <param name="dto">定位参数</param>
  759. /// <returns></returns>
  760. [HttpPost]
  761. public async Task<AjaxResult<PosResDto>> PosRhAsync(RHPosDto dto)
  762. {
  763. TaskInfo runTask;
  764. using (RHDWContext db = new RHDWContext())
  765. {
  766. if (dto.TaskID == null)
  767. {
  768. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  769. && p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running);
  770. if (runTask == null)
  771. {
  772. Serilog.Log.Warning($"接收到融合带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  773. return Error<PosResDto>($"多模式融合定位平台没有启动融合定位任务");
  774. }
  775. }
  776. else
  777. {
  778. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  779. if (runTask == null)
  780. {
  781. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  782. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  783. }
  784. }
  785. }
  786. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  787. {
  788. var StationRes = db.StationRes.Add(new StationRes()
  789. {
  790. SatTxLon = dto.SatTxLon,
  791. SatTxLat = dto.SatTxLat,
  792. CdbTxLon = dto.CdbTxLon,
  793. CdbTxLat = dto.CdbTxLat,
  794. CxLon = dto.CxLon,
  795. CxLat = dto.CxLat,
  796. RefLon = dto.RefLon,
  797. RefLat = dto.RefLat,
  798. });
  799. var ckRes = new CheckRes()
  800. {
  801. FileName = dto.CheckRes?.FileName,
  802. SmpStart = dto.CheckRes?.SmpStart,
  803. SmpCount = dto.CheckRes?.SmpCount,
  804. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  805. ModRate = dto.CheckRes?.ModRate,
  806. ModType = dto.CheckRes?.ModType,
  807. UserName = dto.CheckRes?.UserName,
  808. FfcHz = dto.CheckRes?.FfcHz,
  809. Snr = dto.CheckRes?.Snr
  810. };
  811. db.CheckRes.Add(ckRes);
  812. var cgRes = db.CgRes.Add(new CgRes()
  813. {
  814. SigTime = dto.SigTime,
  815. Dto1 = Math.Round(dto.SxDto, 10),
  816. Dfo1 = Math.Round(dto.SxDfo, 10),
  817. Snr1 = Math.Round(dto.SxSnr, 1),
  818. DtoCdb = Math.Round(dto.XdDto, 10),
  819. DfoCdb = Math.Round(dto.XdDfo, 10),
  820. SnrCdb = Math.Round(dto.XdSnr, 1),
  821. YbMainDto = Math.Round(dto.MainYbDto, 10),
  822. YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10),
  823. StationResID = StationRes.ID,
  824. MainCode = dto.MainCode,
  825. Adja1Code = dto.AdjaCode,
  826. TaskID = runTask.ID,
  827. MainX = dto.MainX,
  828. MainY = dto.MainY,
  829. MainZ = dto.MainZ,
  830. Adja1X = dto.AdjaX,
  831. Adja1Y = dto.AdjaY,
  832. Adja1Z = dto.AdjaZ,
  833. TarFreqUp = dto.FreqUp,
  834. TarFreqDown = dto.FreqDown,
  835. });
  836. var cxRes = db.CxRes.Add(new CxRes()
  837. {
  838. SigTime = dto.SigTime,
  839. Fx = dto.CxRes,
  840. });
  841. var res = PosApi.RH_Pos(cgRes, StationRes, cxRes, dto.CalcConfidence);
  842. PosRes posRes = new PosRes()
  843. {
  844. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  845. SigTime = cgRes.SigTime,
  846. TaskInfoID = runTask.ID,
  847. CxResID = cxRes.ID,
  848. CgResID = cgRes.ID,
  849. CheckResID = ckRes.ID,
  850. PosLon = res[0],
  851. PosLat = res[1],
  852. MirrLon = res[3],
  853. MirrLat = res[4],
  854. Confidence = (int)res[6],
  855. PosResType = EnumPosResType.RH,
  856. };
  857. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  858. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  859. posRes = db.PosRes.Add(posRes);
  860. await db.SaveChangesAsync();
  861. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  862. return Success(MapDto(posRes));
  863. }
  864. }
  865. /// <summary>
  866. /// 融合带参定位(无星历)
  867. /// </summary>
  868. /// <returns>返回定位结果ID</returns>
  869. [HttpPost]
  870. public async Task<AjaxResult<PosResDto>> PosRhNoXlAsync(RHNoXlPosDto dto)
  871. {
  872. TaskInfo runTask;
  873. using (RHDWContext db = new RHDWContext())
  874. {
  875. if (dto.TaskID == null)
  876. {
  877. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  878. && p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running);
  879. if (runTask == null)
  880. {
  881. Serilog.Log.Warning($"接收到融合带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  882. return Error<PosResDto>($"多模式融合定位平台没有启动融合定位任务");
  883. }
  884. }
  885. else
  886. {
  887. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  888. if (runTask == null)
  889. {
  890. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  891. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  892. }
  893. }
  894. }
  895. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  896. if (xl1 == null)
  897. {
  898. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  899. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  900. }
  901. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  902. var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime);
  903. if (xl2 == null)
  904. {
  905. Serilog.Log.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  906. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  907. }
  908. Serilog.Log.Information($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  909. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  910. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  911. if (ephMain.code != 200)
  912. {
  913. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  914. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  915. }
  916. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  917. var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  918. if (ephAdja.code != 200)
  919. {
  920. Serilog.Log.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}");
  921. return Error<PosResDto>($"推算卫星{dto.AdjaCode}的ECEF星历出错");
  922. }
  923. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  924. {
  925. var StationRes = db.StationRes.Add(new StationRes()
  926. {
  927. SatTxLon = dto.SatTxLon,
  928. SatTxLat = dto.SatTxLat,
  929. CdbTxLon = dto.CdbTxLon,
  930. CdbTxLat = dto.CdbTxLat,
  931. CxLon = dto.CxLon,
  932. CxLat = dto.CxLat,
  933. RefLon = dto.RefLon,
  934. RefLat = dto.RefLat,
  935. });
  936. var ckRes = new CheckRes()
  937. {
  938. FileName = dto.CheckRes?.FileName,
  939. SmpStart = dto.CheckRes?.SmpStart,
  940. SmpCount = dto.CheckRes?.SmpCount,
  941. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  942. ModRate = dto.CheckRes?.ModRate,
  943. ModType = dto.CheckRes?.ModType,
  944. UserName = dto.CheckRes?.UserName,
  945. FfcHz = dto.CheckRes?.FfcHz,
  946. Snr = dto.CheckRes?.Snr
  947. };
  948. db.CheckRes.Add(ckRes);
  949. var cgRes = db.CgRes.Add(new CgRes()
  950. {
  951. SigTime = dto.SigTime,
  952. Dto1 = Math.Round(dto.SxDto, 10),
  953. Dfo1 = Math.Round(dto.SxDfo, 10),
  954. Snr1 = Math.Round(dto.SxSnr, 1),
  955. DtoCdb = Math.Round(dto.XdDto, 10),
  956. DfoCdb = Math.Round(dto.XdDfo, 10),
  957. SnrCdb = Math.Round(dto.XdSnr, 1),
  958. YbMainDto = Math.Round(dto.MainYbDto, 10),
  959. YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10),
  960. StationResID = StationRes.ID,
  961. MainCode = dto.MainCode,
  962. Adja1Code = dto.AdjaCode,
  963. MainXlTime = ephMain.data.TleTime,
  964. Adja1XlTime = ephAdja.data.TleTime,
  965. TaskID = runTask.ID,
  966. MainX = ephMain.data.X,
  967. MainY = ephMain.data.Y,
  968. MainZ = ephMain.data.Z,
  969. MainVx = ephMain.data.VX,
  970. MainVy = ephMain.data.VY,
  971. MainVz = ephMain.data.VZ,
  972. Adja1X = ephAdja.data.X,
  973. Adja1Y = ephAdja.data.Y,
  974. Adja1Z = ephAdja.data.Z,
  975. Adja1Vx = ephAdja.data.VX,
  976. Adja1Vy = ephAdja.data.VY,
  977. Adja1Vz = ephAdja.data.VZ,
  978. TarFreqUp = dto.FreqUp,
  979. TarFreqDown = dto.FreqDown,
  980. });
  981. var cxRes = db.CxRes.Add(new CxRes()
  982. {
  983. SigTime = dto.SigTime,
  984. Fx = dto.CxRes,
  985. });
  986. var res = PosApi.RH_Pos(cgRes, StationRes, cxRes, dto.CalcConfidence);
  987. PosRes posRes = new PosRes()
  988. {
  989. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  990. SigTime = cgRes.SigTime,
  991. TaskInfoID = runTask.ID,
  992. CxResID = cxRes.ID,
  993. CgResID = cgRes.ID,
  994. CheckResID = ckRes.ID,
  995. PosLon = res[0],
  996. PosLat = res[1],
  997. MirrLon = res[3],
  998. MirrLat = res[4],
  999. Confidence = (int)res[6],
  1000. PosResType = EnumPosResType.RH,
  1001. };
  1002. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1003. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1004. posRes = db.PosRes.Add(posRes);
  1005. await db.SaveChangesAsync();
  1006. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1007. return Success(MapDto(posRes));
  1008. }
  1009. }
  1010. #endregion
  1011. #region 三星双时差定位
  1012. /// <summary>
  1013. /// 三星双时差带参定位(含星历)
  1014. /// </summary>
  1015. /// <param name="dto">定位参数</param>
  1016. /// <returns></returns>
  1017. [HttpPost]
  1018. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoAsync(X3TwoDtoPosDto dto)
  1019. {
  1020. TaskInfo runTask;
  1021. using (RHDWContext db = new RHDWContext())
  1022. {
  1023. if (dto.TaskID == null)
  1024. {
  1025. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1026. && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  1027. if (runTask == null)
  1028. {
  1029. Serilog.Log.Warning($"接收到三星双时差带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  1030. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  1031. }
  1032. }
  1033. else
  1034. {
  1035. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1036. if (runTask == null)
  1037. {
  1038. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1039. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1040. }
  1041. }
  1042. }
  1043. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1044. {
  1045. var StationRes = db.StationRes.Add(new StationRes()
  1046. {
  1047. SatTxLon = dto.SatTxLon,
  1048. SatTxLat = dto.SatTxLat,
  1049. RefLon = dto.RefLon,
  1050. RefLat = dto.RefLat,
  1051. });
  1052. var ckRes = new CheckRes()
  1053. {
  1054. FileName = dto.CheckRes?.FileName,
  1055. SmpStart = dto.CheckRes?.SmpStart,
  1056. SmpCount = dto.CheckRes?.SmpCount,
  1057. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1058. ModRate = dto.CheckRes?.ModRate,
  1059. ModType = dto.CheckRes?.ModType,
  1060. UserName = dto.CheckRes?.UserName,
  1061. FfcHz = dto.CheckRes?.FfcHz,
  1062. Snr = dto.CheckRes?.Snr
  1063. };
  1064. db.CheckRes.Add(ckRes);
  1065. var cgRes = db.CgRes.Add(new CgRes()
  1066. {
  1067. SigTime = dto.SigTime,
  1068. Dto1 = Math.Round(dto.Dto1, 10),
  1069. Dfo1 = Math.Round(dto.Dfo1, 10),
  1070. Snr1 = Math.Round(dto.Snr1, 1),
  1071. Dto2 = Math.Round(dto.Dto2, 10),
  1072. Dfo2 = Math.Round(dto.Dfo2, 10),
  1073. Snr2 = Math.Round(dto.Snr2, 1),
  1074. YbMainDto = Math.Round(dto.YbMainDto, 10),
  1075. YbAdja1Dto = Math.Round(dto.YbAdja1Dto, 10),
  1076. YbAdja2Dto = Math.Round(dto.YbAdja2Dto, 10),
  1077. StationResID = StationRes.ID,
  1078. MainCode = dto.MainCode,
  1079. Adja1Code = dto.Adja1Code,
  1080. Adja2Code = dto.Adja2Code,
  1081. TaskID = runTask.ID,
  1082. MainX = dto.MainX,
  1083. MainY = dto.MainY,
  1084. MainZ = dto.MainZ,
  1085. MainVx = dto.MainVX,
  1086. MainVy = dto.MainVY,
  1087. MainVz = dto.MainVZ,
  1088. Adja1X = dto.Adja1X,
  1089. Adja1Y = dto.Adja1Y,
  1090. Adja1Z = dto.Adja1Z,
  1091. Adja1Vx = dto.Adja1VX,
  1092. Adja1Vy = dto.Adja1VY,
  1093. Adja1Vz = dto.Adja1VZ,
  1094. Adja2X = dto.Adja2X,
  1095. Adja2Y = dto.Adja2Y,
  1096. Adja2Z = dto.Adja2Z,
  1097. Adja2Vx = dto.Adja2VX,
  1098. Adja2Vy = dto.Adja2VY,
  1099. Adja2Vz = dto.Adja2VZ,
  1100. TarFreqUp = dto.FreqUp,
  1101. TarFreqDown = dto.FreqDown,
  1102. });
  1103. var res = PosApi.X3_Pos(cgRes, StationRes, dto.CalcConfidence);
  1104. PosRes posRes = new PosRes()
  1105. {
  1106. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1107. SigTime = cgRes.SigTime,
  1108. TaskInfoID = runTask.ID,
  1109. CgResID = cgRes.ID,
  1110. CheckResID = ckRes.ID,
  1111. PosLon = res[0],
  1112. PosLat = res[1],
  1113. MirrLon = res[3],
  1114. MirrLat = res[4],
  1115. Confidence = (int)res[6],
  1116. PosResType = EnumPosResType.X3,
  1117. };
  1118. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1119. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1120. posRes = db.PosRes.Add(posRes);
  1121. await db.SaveChangesAsync();
  1122. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1123. return Success(MapDto(posRes));
  1124. }
  1125. }
  1126. /// <summary>
  1127. /// 三星双时差带参定位(无星历)
  1128. /// </summary>
  1129. /// <returns>返回定位结果ID</returns>
  1130. [HttpPost]
  1131. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoXlAsync(X3TwoDtoNoXlPosDto dto)
  1132. {
  1133. TaskInfo runTask;
  1134. using (RHDWContext db = new RHDWContext())
  1135. {
  1136. if (dto.TaskID == null)
  1137. {
  1138. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1139. && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  1140. if (runTask == null)
  1141. {
  1142. Serilog.Log.Warning($"接收到三星双时差带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  1143. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  1144. }
  1145. }
  1146. else
  1147. {
  1148. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1149. if (runTask == null)
  1150. {
  1151. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1152. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1153. }
  1154. }
  1155. }
  1156. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  1157. if (xl1 == null)
  1158. {
  1159. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1160. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1161. }
  1162. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1163. var xl2 = await XlRepository.GetLatestAsync(dto.Adja1Code, dto.SigTime);
  1164. if (xl2 == null)
  1165. {
  1166. Serilog.Log.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1167. return Error<PosResDto>($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1168. }
  1169. Serilog.Log.Information($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1170. var xl3 = await XlRepository.GetLatestAsync(dto.Adja2Code, dto.SigTime);
  1171. if (xl3 == null)
  1172. {
  1173. Serilog.Log.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1174. return Error<PosResDto>($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1175. }
  1176. Serilog.Log.Information($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1177. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  1178. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  1179. if (ephMain.code != 200)
  1180. {
  1181. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  1182. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  1183. }
  1184. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  1185. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  1186. if (ephAdja1.code != 200)
  1187. {
  1188. Serilog.Log.Error($"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}");
  1189. return Error<PosResDto>($"推算卫星{dto.Adja1Code}的ECEF星历出错");
  1190. }
  1191. var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime };
  1192. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3);
  1193. if (ephAdja2.code != 200)
  1194. {
  1195. Serilog.Log.Error($"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}");
  1196. return Error<PosResDto>($"推算卫星{dto.Adja2Code}的ECEF星历出错");
  1197. }
  1198. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1199. {
  1200. var StationRes = db.StationRes.Add(new StationRes()
  1201. {
  1202. SatTxLon = dto.SatTxLon,
  1203. SatTxLat = dto.SatTxLat,
  1204. RefLon = dto.RefLon,
  1205. RefLat = dto.RefLat,
  1206. });
  1207. var ckRes = new CheckRes()
  1208. {
  1209. FileName = dto.CheckRes?.FileName,
  1210. SmpStart = dto.CheckRes?.SmpStart,
  1211. SmpCount = dto.CheckRes?.SmpCount,
  1212. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1213. ModRate = dto.CheckRes?.ModRate,
  1214. ModType = dto.CheckRes?.ModType,
  1215. UserName = dto.CheckRes?.UserName,
  1216. FfcHz = dto.CheckRes?.FfcHz,
  1217. Snr = dto.CheckRes?.Snr
  1218. };
  1219. db.CheckRes.Add(ckRes);
  1220. var cgRes = db.CgRes.Add(new CgRes()
  1221. {
  1222. SigTime = dto.SigTime,
  1223. Dto1 = Math.Round(dto.Dto1, 10),
  1224. Dfo1 = Math.Round(dto.Dfo1, 10),
  1225. Snr1 = Math.Round(dto.Snr1, 1),
  1226. Dto2 = Math.Round(dto.Dto2, 10),
  1227. Dfo2 = Math.Round(dto.Dfo2, 10),
  1228. Snr2 = Math.Round(dto.Snr2, 1),
  1229. YbMainDto = Math.Round(dto.YbMainDto, 10),
  1230. YbAdja1Dto = Math.Round(dto.YbAdja1Dto, 10),
  1231. YbAdja2Dto = Math.Round(dto.YbAdja2Dto, 10),
  1232. StationResID = StationRes.ID,
  1233. MainCode = dto.MainCode,
  1234. Adja1Code = dto.Adja1Code,
  1235. Adja2Code = dto.Adja2Code,
  1236. MainXlTime = ephMain.data.TleTime,
  1237. Adja1XlTime = ephAdja1.data.TleTime,
  1238. Adja2XlTime = ephAdja2.data.TleTime,
  1239. TaskID = runTask.ID,
  1240. MainX = ephMain.data.X,
  1241. MainY = ephMain.data.Y,
  1242. MainZ = ephMain.data.Z,
  1243. MainVx = ephMain.data.VX,
  1244. MainVy = ephMain.data.VY,
  1245. MainVz = ephMain.data.VZ,
  1246. Adja1X = ephAdja1.data.X,
  1247. Adja1Y = ephAdja1.data.Y,
  1248. Adja1Z = ephAdja1.data.Z,
  1249. Adja1Vx = ephAdja1.data.VX,
  1250. Adja1Vy = ephAdja1.data.VY,
  1251. Adja1Vz = ephAdja1.data.VZ,
  1252. Adja2X = ephAdja2.data.X,
  1253. Adja2Y = ephAdja2.data.Y,
  1254. Adja2Z = ephAdja2.data.Z,
  1255. Adja2Vx = ephAdja2.data.VX,
  1256. Adja2Vy = ephAdja2.data.VY,
  1257. Adja2Vz = ephAdja2.data.VZ,
  1258. TarFreqUp = dto.FreqUp,
  1259. TarFreqDown = dto.FreqDown,
  1260. });
  1261. var res = PosApi.X3_Pos(cgRes, StationRes, dto.CalcConfidence);
  1262. PosRes posRes = new PosRes()
  1263. {
  1264. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1265. SigTime = dto.SigTime,
  1266. TaskInfoID = runTask.ID,
  1267. CgResID = cgRes.ID,
  1268. CheckResID = ckRes.ID,
  1269. PosLon = res[0],
  1270. PosLat = res[1],
  1271. MirrLon = res[3],
  1272. MirrLat = res[4],
  1273. Confidence = (int)res[6],
  1274. PosResType = EnumPosResType.X3,
  1275. };
  1276. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1277. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1278. posRes = db.PosRes.Add(posRes);
  1279. await db.SaveChangesAsync();
  1280. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1281. return Success(MapDto(posRes));
  1282. }
  1283. }
  1284. /// <summary>
  1285. /// 三星双时差无参定位(含星历)
  1286. /// </summary>
  1287. /// <param name="dto">定位参数</param>
  1288. /// <returns></returns>
  1289. [HttpPost]
  1290. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoParAsync(X3TwoDtoNoParPosDto dto)
  1291. {
  1292. TaskInfo runTask;
  1293. using (RHDWContext db = new RHDWContext())
  1294. {
  1295. if (dto.TaskID == null)
  1296. {
  1297. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1298. && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  1299. if (runTask == null)
  1300. {
  1301. Serilog.Log.Warning($"接收到三星双时差无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  1302. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  1303. }
  1304. }
  1305. else
  1306. {
  1307. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1308. if (runTask == null)
  1309. {
  1310. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1311. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1312. }
  1313. }
  1314. }
  1315. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1316. {
  1317. var StationRes = db.StationRes.Add(new StationRes()
  1318. {
  1319. SatTxLon = dto.SatTxLon,
  1320. SatTxLat = dto.SatTxLat,
  1321. });
  1322. var ckRes = new CheckRes()
  1323. {
  1324. FileName = dto.CheckRes?.FileName,
  1325. SmpStart = dto.CheckRes?.SmpStart,
  1326. SmpCount = dto.CheckRes?.SmpCount,
  1327. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1328. ModRate = dto.CheckRes?.ModRate,
  1329. ModType = dto.CheckRes?.ModType,
  1330. UserName = dto.CheckRes?.UserName,
  1331. FfcHz = dto.CheckRes?.FfcHz,
  1332. Snr = dto.CheckRes?.Snr
  1333. };
  1334. db.CheckRes.Add(ckRes);
  1335. var cgRes = db.CgRes.Add(new CgRes()
  1336. {
  1337. SigTime = dto.SigTime,
  1338. Dto1 = Math.Round(dto.Dto1, 10),
  1339. Dfo1 = Math.Round(dto.Dfo1, 10),
  1340. Snr1 = Math.Round(dto.Snr1, 1),
  1341. Dto2 = Math.Round(dto.Dto2, 10),
  1342. Dfo2 = Math.Round(dto.Dfo2, 10),
  1343. Snr2 = Math.Round(dto.Snr2, 1),
  1344. StationResID = StationRes.ID,
  1345. MainCode = dto.MainCode,
  1346. Adja1Code = dto.Adja1Code,
  1347. Adja2Code = dto.Adja2Code,
  1348. TaskID = runTask.ID,
  1349. MainX = dto.MainX,
  1350. MainY = dto.MainY,
  1351. MainZ = dto.MainZ,
  1352. MainVx = dto.MainVX,
  1353. MainVy = dto.MainVY,
  1354. MainVz = dto.MainVZ,
  1355. Adja1X = dto.Adja1X,
  1356. Adja1Y = dto.Adja1Y,
  1357. Adja1Z = dto.Adja1Z,
  1358. Adja1Vx = dto.Adja1VX,
  1359. Adja1Vy = dto.Adja1VY,
  1360. Adja1Vz = dto.Adja1VZ,
  1361. Adja2X = dto.Adja2X,
  1362. Adja2Y = dto.Adja2Y,
  1363. Adja2Z = dto.Adja2Z,
  1364. Adja2Vx = dto.Adja2VX,
  1365. Adja2Vy = dto.Adja2VY,
  1366. Adja2Vz = dto.Adja2VZ,
  1367. TarFreqUp = dto.FreqUp,
  1368. TarFreqDown = dto.FreqDown,
  1369. });
  1370. var res = PosApi.X3_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  1371. PosRes posRes = new PosRes()
  1372. {
  1373. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1374. SigTime = cgRes.SigTime,
  1375. TaskInfoID = runTask.ID,
  1376. CgResID = cgRes.ID,
  1377. CheckResID = ckRes.ID,
  1378. PosLon = res[0],
  1379. PosLat = res[1],
  1380. MirrLon = res[3],
  1381. MirrLat = res[4],
  1382. Confidence = (int)res[6],
  1383. PosResType = EnumPosResType.X3NoRef,
  1384. };
  1385. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1386. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1387. posRes = db.PosRes.Add(posRes);
  1388. await db.SaveChangesAsync();
  1389. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1390. return Success(MapDto(posRes));
  1391. }
  1392. }
  1393. /// <summary>
  1394. /// 三星双时差无参定位(无星历)
  1395. /// </summary>
  1396. /// <returns>返回定位结果ID</returns>
  1397. [HttpPost]
  1398. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoXlNoParAsync(X3TwoDtoNoXlNoParPosDto dto)
  1399. {
  1400. TaskInfo runTask;
  1401. using (RHDWContext db = new RHDWContext())
  1402. {
  1403. if (dto.TaskID == null)
  1404. {
  1405. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1406. && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  1407. if (runTask == null)
  1408. {
  1409. Serilog.Log.Warning($"接收到三星双时差无参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  1410. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  1411. }
  1412. }
  1413. else
  1414. {
  1415. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1416. if (runTask == null)
  1417. {
  1418. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1419. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1420. }
  1421. }
  1422. }
  1423. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  1424. if (xl1 == null)
  1425. {
  1426. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1427. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1428. }
  1429. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1430. var xl2 = await XlRepository.GetLatestAsync(dto.Adja1Code, dto.SigTime);
  1431. if (xl2 == null)
  1432. {
  1433. Serilog.Log.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1434. return Error<PosResDto>($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1435. }
  1436. Serilog.Log.Information($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1437. var xl3 = await XlRepository.GetLatestAsync(dto.Adja2Code, dto.SigTime);
  1438. if (xl3 == null)
  1439. {
  1440. Serilog.Log.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1441. return Error<PosResDto>($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1442. }
  1443. Serilog.Log.Information($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1444. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  1445. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  1446. if (ephMain.code != 200)
  1447. {
  1448. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  1449. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  1450. }
  1451. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  1452. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  1453. if (ephAdja1.code != 200)
  1454. {
  1455. Serilog.Log.Error($"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}");
  1456. return Error<PosResDto>($"推算卫星{dto.Adja1Code}的ECEF星历出错");
  1457. }
  1458. var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime };
  1459. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3);
  1460. if (ephAdja2.code != 200)
  1461. {
  1462. Serilog.Log.Error($"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}");
  1463. return Error<PosResDto>($"推算卫星{dto.Adja2Code}的ECEF星历出错");
  1464. }
  1465. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1466. {
  1467. var StationRes = db.StationRes.Add(new StationRes()
  1468. {
  1469. SatTxLon = dto.SatTxLon,
  1470. SatTxLat = dto.SatTxLat,
  1471. });
  1472. var ckRes = new CheckRes()
  1473. {
  1474. FileName = dto.CheckRes?.FileName,
  1475. SmpStart = dto.CheckRes?.SmpStart,
  1476. SmpCount = dto.CheckRes?.SmpCount,
  1477. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1478. ModRate = dto.CheckRes?.ModRate,
  1479. ModType = dto.CheckRes?.ModType,
  1480. UserName = dto.CheckRes?.UserName,
  1481. FfcHz = dto.CheckRes?.FfcHz,
  1482. Snr = dto.CheckRes?.Snr
  1483. };
  1484. db.CheckRes.Add(ckRes);
  1485. var cgRes = db.CgRes.Add(new CgRes()
  1486. {
  1487. SigTime = dto.SigTime,
  1488. Dto1 = Math.Round(dto.Dto1, 10),
  1489. Dfo1 = Math.Round(dto.Dfo1, 10),
  1490. Snr1 = Math.Round(dto.Snr1, 1),
  1491. Dto2 = Math.Round(dto.Dto2, 10),
  1492. Dfo2 = Math.Round(dto.Dfo2, 10),
  1493. Snr2 = Math.Round(dto.Snr2, 1),
  1494. StationResID = StationRes.ID,
  1495. MainCode = dto.MainCode,
  1496. Adja1Code = dto.Adja1Code,
  1497. Adja2Code = dto.Adja2Code,
  1498. MainXlTime = ephMain.data.TleTime,
  1499. Adja1XlTime = ephAdja1.data.TleTime,
  1500. Adja2XlTime = ephAdja2.data.TleTime,
  1501. TaskID = runTask.ID,
  1502. MainX = ephMain.data.X,
  1503. MainY = ephMain.data.Y,
  1504. MainZ = ephMain.data.Z,
  1505. MainVx = ephMain.data.VX,
  1506. MainVy = ephMain.data.VY,
  1507. MainVz = ephMain.data.VZ,
  1508. Adja1X = ephAdja1.data.X,
  1509. Adja1Y = ephAdja1.data.Y,
  1510. Adja1Z = ephAdja1.data.Z,
  1511. Adja1Vx = ephAdja1.data.VX,
  1512. Adja1Vy = ephAdja1.data.VY,
  1513. Adja1Vz = ephAdja1.data.VZ,
  1514. Adja2X = ephAdja2.data.X,
  1515. Adja2Y = ephAdja2.data.Y,
  1516. Adja2Z = ephAdja2.data.Z,
  1517. Adja2Vx = ephAdja2.data.VX,
  1518. Adja2Vy = ephAdja2.data.VY,
  1519. Adja2Vz = ephAdja2.data.VZ,
  1520. TarFreqUp = dto.FreqUp,
  1521. TarFreqDown = dto.FreqDown,
  1522. });
  1523. var res = PosApi.X3_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  1524. PosRes posRes = new PosRes()
  1525. {
  1526. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1527. SigTime = dto.SigTime,
  1528. TaskInfoID = runTask.ID,
  1529. CgResID = cgRes.ID,
  1530. CheckResID = ckRes.ID,
  1531. PosLon = res[0],
  1532. PosLat = res[1],
  1533. MirrLon = res[3],
  1534. MirrLat = res[4],
  1535. Confidence = (int)res[6],
  1536. PosResType = EnumPosResType.X3NoRef,
  1537. };
  1538. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1539. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1540. posRes = db.PosRes.Add(posRes);
  1541. await db.SaveChangesAsync();
  1542. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1543. return Success(MapDto(posRes));
  1544. }
  1545. }
  1546. #endregion
  1547. #region 三星双频差定位
  1548. /// <summary>
  1549. /// 三星双频差带参定位(含星历)
  1550. /// </summary>
  1551. /// <param name="dto">定位参数</param>
  1552. /// <returns></returns>
  1553. [HttpPost]
  1554. public async Task<AjaxResult<PosResDto>> PosX3TwoDfoAsync(X3TwoDfoPosDto dto)
  1555. {
  1556. TaskInfo runTask;
  1557. using (RHDWContext db = new RHDWContext())
  1558. {
  1559. if (dto.TaskID == null)
  1560. {
  1561. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1562. && p.PosType == EnumPosType.X3TwoDfo && p.TaskState == EnumTaskState.Running);
  1563. if (runTask == null)
  1564. {
  1565. Serilog.Log.Warning($"接收到三星双频差带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  1566. return Error<PosResDto>($"多模式融合定位平台没有启动三星双频差定位任务");
  1567. }
  1568. }
  1569. else
  1570. {
  1571. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1572. if (runTask == null)
  1573. {
  1574. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1575. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1576. }
  1577. }
  1578. }
  1579. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1580. {
  1581. var StationRes = db.StationRes.Add(new StationRes()
  1582. {
  1583. SatTxLon = dto.SatTxLon,
  1584. SatTxLat = dto.SatTxLat,
  1585. RefLon = dto.RefLon,
  1586. RefLat = dto.RefLat,
  1587. });
  1588. var ckRes = new CheckRes()
  1589. {
  1590. FileName = dto.CheckRes?.FileName,
  1591. SmpStart = dto.CheckRes?.SmpStart,
  1592. SmpCount = dto.CheckRes?.SmpCount,
  1593. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1594. ModRate = dto.CheckRes?.ModRate,
  1595. ModType = dto.CheckRes?.ModType,
  1596. UserName = dto.CheckRes?.UserName,
  1597. FfcHz = dto.CheckRes?.FfcHz,
  1598. Snr = dto.CheckRes?.Snr
  1599. };
  1600. db.CheckRes.Add(ckRes);
  1601. var cgRes = db.CgRes.Add(new CgRes()
  1602. {
  1603. SigTime = dto.SigTime,
  1604. Dto1 = Math.Round(dto.Dto1, 10),
  1605. Dfo1 = Math.Round(dto.Dfo1, 10),
  1606. Snr1 = Math.Round(dto.Snr1, 1),
  1607. Dto2 = Math.Round(dto.Dto2, 10),
  1608. Dfo2 = Math.Round(dto.Dfo2, 10),
  1609. Snr2 = Math.Round(dto.Snr2, 1),
  1610. YbMainDfo = Math.Round(dto.YbMainDfo, 10),
  1611. YbAdja1Dfo = Math.Round(dto.YbAdja1Dfo, 10),
  1612. YbAdja2Dfo = Math.Round(dto.YbAdja2Dfo, 10),
  1613. TarFreqUp = dto.TarFreqUp,
  1614. TarFreqDown = dto.TarFreqDown,
  1615. RefFreqUp = dto.RefFreqUp,
  1616. RefFreqDown = dto.RefFreqDown,
  1617. StationResID = StationRes.ID,
  1618. MainCode = dto.MainCode,
  1619. Adja1Code = dto.Adja1Code,
  1620. Adja2Code = dto.Adja2Code,
  1621. TaskID = runTask.ID,
  1622. MainX = dto.MainX,
  1623. MainY = dto.MainY,
  1624. MainZ = dto.MainZ,
  1625. MainVx = dto.MainVx,
  1626. MainVy = dto.MainVy,
  1627. MainVz = dto.MainVz,
  1628. Adja1X = dto.Adja1X,
  1629. Adja1Y = dto.Adja1Y,
  1630. Adja1Z = dto.Adja1Z,
  1631. Adja1Vx = dto.Adja1Vx,
  1632. Adja1Vy = dto.Adja1Vy,
  1633. Adja1Vz = dto.Adja1Vz,
  1634. Adja2X = dto.Adja2X,
  1635. Adja2Y = dto.Adja2Y,
  1636. Adja2Z = dto.Adja2Z,
  1637. Adja2Vx = dto.Adja2Vx,
  1638. Adja2Vy = dto.Adja2Vy,
  1639. Adja2Vz = dto.Adja2Vz,
  1640. });
  1641. var res = PosApi.X3_PosTwoDfo(cgRes, StationRes, dto.CalcConfidence);
  1642. PosRes posRes = new PosRes()
  1643. {
  1644. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1645. SigTime = cgRes.SigTime,
  1646. TaskInfoID = runTask.ID,
  1647. CgResID = cgRes.ID,
  1648. CheckResID = ckRes.ID,
  1649. PosLon = res[0],
  1650. PosLat = res[1],
  1651. MirrLon = res[3],
  1652. MirrLat = res[4],
  1653. Confidence = (int)res[6],
  1654. PosResType = EnumPosResType.X3TwoDfo,
  1655. };
  1656. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1657. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1658. posRes = db.PosRes.Add(posRes);
  1659. await db.SaveChangesAsync();
  1660. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1661. return Success(MapDto(posRes));
  1662. }
  1663. }
  1664. /// <summary>
  1665. /// 三星双频差带参定位(无星历)
  1666. /// </summary>
  1667. /// <returns>返回定位结果ID</returns>
  1668. [HttpPost]
  1669. public async Task<AjaxResult<PosResDto>> PosX3TwoDfoNoXlAsync(X3TwoDfoNoXlPosDto dto)
  1670. {
  1671. TaskInfo runTask;
  1672. using (RHDWContext db = new RHDWContext())
  1673. {
  1674. if (dto.TaskID == null)
  1675. {
  1676. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1677. && p.PosType == EnumPosType.X3TwoDfo && p.TaskState == EnumTaskState.Running);
  1678. if (runTask == null)
  1679. {
  1680. Serilog.Log.Warning($"接收到三星双频差带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  1681. return Error<PosResDto>($"多模式融合定位平台没有启动三星双频差定位任务");
  1682. }
  1683. }
  1684. else
  1685. {
  1686. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1687. if (runTask == null)
  1688. {
  1689. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1690. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1691. }
  1692. }
  1693. }
  1694. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  1695. if (xl1 == null)
  1696. {
  1697. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1698. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1699. }
  1700. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1701. var xl2 = await XlRepository.GetLatestAsync(dto.Adja1Code, dto.SigTime);
  1702. if (xl2 == null)
  1703. {
  1704. Serilog.Log.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1705. return Error<PosResDto>($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1706. }
  1707. Serilog.Log.Information($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1708. var xl3 = await XlRepository.GetLatestAsync(dto.Adja2Code, dto.SigTime);
  1709. if (xl3 == null)
  1710. {
  1711. Serilog.Log.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1712. return Error<PosResDto>($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1713. }
  1714. Serilog.Log.Information($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1715. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  1716. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  1717. if (ephMain.code != 200)
  1718. {
  1719. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  1720. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  1721. }
  1722. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  1723. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  1724. if (ephAdja1.code != 200)
  1725. {
  1726. Serilog.Log.Error($"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}");
  1727. return Error<PosResDto>($"推算卫星{dto.Adja1Code}的ECEF星历出错");
  1728. }
  1729. var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime };
  1730. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3);
  1731. if (ephAdja2.code != 200)
  1732. {
  1733. Serilog.Log.Error($"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}");
  1734. return Error<PosResDto>($"推算卫星{dto.Adja2Code}的ECEF星历出错");
  1735. }
  1736. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1737. {
  1738. var StationRes = db.StationRes.Add(new StationRes()
  1739. {
  1740. SatTxLon = dto.SatTxLon,
  1741. SatTxLat = dto.SatTxLat,
  1742. RefLon = dto.RefLon,
  1743. RefLat = dto.RefLat,
  1744. });
  1745. var ckRes = new CheckRes()
  1746. {
  1747. FileName = dto.CheckRes?.FileName,
  1748. SmpStart = dto.CheckRes?.SmpStart,
  1749. SmpCount = dto.CheckRes?.SmpCount,
  1750. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1751. ModRate = dto.CheckRes?.ModRate,
  1752. ModType = dto.CheckRes?.ModType,
  1753. UserName = dto.CheckRes?.UserName,
  1754. FfcHz = dto.CheckRes?.FfcHz,
  1755. Snr = dto.CheckRes?.Snr
  1756. };
  1757. db.CheckRes.Add(ckRes);
  1758. var cgRes = db.CgRes.Add(new CgRes()
  1759. {
  1760. SigTime = dto.SigTime,
  1761. Dto1 = Math.Round(dto.Dto1, 10),
  1762. Dfo1 = Math.Round(dto.Dfo1, 10),
  1763. Snr1 = Math.Round(dto.Snr1, 1),
  1764. Dto2 = Math.Round(dto.Dto2, 10),
  1765. Dfo2 = Math.Round(dto.Dfo2, 10),
  1766. Snr2 = Math.Round(dto.Snr2, 1),
  1767. YbMainDfo = Math.Round(dto.YbMainDfo, 10),
  1768. YbAdja1Dfo = Math.Round(dto.YbAdja1Dfo, 10),
  1769. YbAdja2Dfo = Math.Round(dto.YbAdja2Dfo, 10),
  1770. TarFreqUp = dto.TarFreqUp,
  1771. TarFreqDown = dto.TarFreqDown,
  1772. RefFreqUp = dto.RefFreqUp,
  1773. RefFreqDown = dto.RefFreqDown,
  1774. StationResID = StationRes.ID,
  1775. MainCode = dto.MainCode,
  1776. Adja1Code = dto.Adja1Code,
  1777. Adja2Code = dto.Adja2Code,
  1778. MainXlTime = ephMain.data.TleTime,
  1779. Adja1XlTime = ephAdja1.data.TleTime,
  1780. Adja2XlTime = ephAdja2.data.TleTime,
  1781. TaskID = runTask.ID,
  1782. MainX = ephMain.data.X,
  1783. MainY = ephMain.data.Y,
  1784. MainZ = ephMain.data.Z,
  1785. MainVx = ephMain.data.VX,
  1786. MainVy = ephMain.data.VY,
  1787. MainVz = ephMain.data.VZ,
  1788. Adja1X = ephAdja1.data.X,
  1789. Adja1Y = ephAdja1.data.Y,
  1790. Adja1Z = ephAdja1.data.Z,
  1791. Adja1Vx = ephAdja1.data.VX,
  1792. Adja1Vy = ephAdja1.data.VY,
  1793. Adja1Vz = ephAdja1.data.VZ,
  1794. Adja2X = ephAdja2.data.X,
  1795. Adja2Y = ephAdja2.data.Y,
  1796. Adja2Z = ephAdja2.data.Z,
  1797. Adja2Vx = ephAdja2.data.VX,
  1798. Adja2Vy = ephAdja2.data.VY,
  1799. Adja2Vz = ephAdja2.data.VZ,
  1800. });
  1801. var res = PosApi.X3_PosTwoDfo(cgRes, StationRes, dto.CalcConfidence);
  1802. PosRes posRes = new PosRes()
  1803. {
  1804. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1805. SigTime = dto.SigTime,
  1806. TaskInfoID = runTask.ID,
  1807. CgResID = cgRes.ID,
  1808. CheckResID = ckRes.ID,
  1809. PosLon = res[0],
  1810. PosLat = res[1],
  1811. MirrLon = res[3],
  1812. MirrLat = res[4],
  1813. Confidence = (int)res[6],
  1814. PosResType = EnumPosResType.X3TwoDfo,
  1815. };
  1816. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1817. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1818. posRes = db.PosRes.Add(posRes);
  1819. await db.SaveChangesAsync();
  1820. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1821. return Success(MapDto(posRes));
  1822. }
  1823. }
  1824. #endregion
  1825. #region 双星时频差定位
  1826. /// <summary>
  1827. /// 双星时频差带参定位(含星历)
  1828. /// </summary>
  1829. /// <param name="dto">定位参数</param>
  1830. /// <returns></returns>
  1831. [HttpPost]
  1832. public async Task<AjaxResult<PosResDto>> PosX2DtoDfoAsync(X2DtoDfoPosDto dto)
  1833. {
  1834. TaskInfo runTask;
  1835. using (RHDWContext db = new RHDWContext())
  1836. {
  1837. if (dto.TaskID == null)
  1838. {
  1839. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1840. && p.PosType == EnumPosType.X2Dfo && p.TaskState == EnumTaskState.Running);
  1841. if (runTask == null)
  1842. {
  1843. Serilog.Log.Warning($"接收到双星时频差带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  1844. return Error<PosResDto>($"多模式融合定位平台没有启动双星时频差定位任务");
  1845. }
  1846. }
  1847. else
  1848. {
  1849. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1850. if (runTask == null)
  1851. {
  1852. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1853. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1854. }
  1855. }
  1856. }
  1857. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1858. {
  1859. var StationRes = db.StationRes.Add(new StationRes()
  1860. {
  1861. SatTxLon = dto.SatTxLon,
  1862. SatTxLat = dto.SatTxLat,
  1863. RefLon = dto.RefLon,
  1864. RefLat = dto.RefLat,
  1865. });
  1866. var ckRes = new CheckRes()
  1867. {
  1868. FileName = dto.CheckRes?.FileName,
  1869. SmpStart = dto.CheckRes?.SmpStart,
  1870. SmpCount = dto.CheckRes?.SmpCount,
  1871. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1872. ModRate = dto.CheckRes?.ModRate,
  1873. ModType = dto.CheckRes?.ModType,
  1874. UserName = dto.CheckRes?.UserName,
  1875. FfcHz = dto.CheckRes?.FfcHz,
  1876. Snr = dto.CheckRes?.Snr
  1877. };
  1878. db.CheckRes.Add(ckRes);
  1879. var cgRes = db.CgRes.Add(new CgRes()
  1880. {
  1881. SigTime = dto.SigTime,
  1882. Dto1 = Math.Round(dto.Dto, 10),
  1883. Dfo1 = Math.Round(dto.Dfo, 10),
  1884. Snr1 = Math.Round(dto.Snr, 1),
  1885. YbMainDto = Math.Round(dto.YbMainDto, 10),
  1886. YbAdja1Dto = Math.Round(dto.YbAdjaDto, 10),
  1887. YbMainDfo = Math.Round(dto.YbMainDfo, 10),
  1888. YbAdja1Dfo = Math.Round(dto.YbAdjaDfo, 10),
  1889. TarFreqUp = dto.TarFreqUp,
  1890. TarFreqDown = dto.TarFreqDown,
  1891. RefFreqUp = dto.RefFreqUp,
  1892. RefFreqDown = dto.RefFreqDown,
  1893. StationResID = StationRes.ID,
  1894. MainCode = dto.MainCode,
  1895. Adja1Code = dto.AdjaCode,
  1896. TaskID = runTask.ID,
  1897. MainX = dto.MainX,
  1898. MainY = dto.MainY,
  1899. MainZ = dto.MainZ,
  1900. MainVx = dto.MainVx,
  1901. MainVy = dto.MainVy,
  1902. MainVz = dto.MainVz,
  1903. Adja1X = dto.AdjaX,
  1904. Adja1Y = dto.AdjaY,
  1905. Adja1Z = dto.AdjaZ,
  1906. Adja1Vx = dto.AdjaVx,
  1907. Adja1Vy = dto.AdjaVy,
  1908. Adja1Vz = dto.AdjaVz,
  1909. });
  1910. var res = PosApi.X2_PosDtoDfo(cgRes, StationRes, dto.CalcConfidence);
  1911. PosRes posRes = new PosRes()
  1912. {
  1913. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1914. SigTime = cgRes.SigTime,
  1915. TaskInfoID = runTask.ID,
  1916. CgResID = cgRes.ID,
  1917. CheckResID = ckRes.ID,
  1918. PosLon = res[0],
  1919. PosLat = res[1],
  1920. MirrLon = res[3],
  1921. MirrLat = res[4],
  1922. Confidence = (int)res[6],
  1923. PosResType = EnumPosResType.X2Dfo,
  1924. };
  1925. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1926. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1927. posRes = db.PosRes.Add(posRes);
  1928. await db.SaveChangesAsync();
  1929. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1930. return Success(MapDto(posRes));
  1931. }
  1932. }
  1933. /// <summary>
  1934. /// 双星时频差带参定位(无星历)
  1935. /// </summary>
  1936. /// <returns>返回定位结果ID</returns>
  1937. [HttpPost]
  1938. public async Task<AjaxResult<PosResDto>> PosX2DtoDfoNoXlAsync(X2DtoDfoNoXlPosDto dto)
  1939. {
  1940. TaskInfo runTask;
  1941. using (RHDWContext db = new RHDWContext())
  1942. {
  1943. if (dto.TaskID == null)
  1944. {
  1945. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1946. && p.PosType == EnumPosType.X2Dfo && p.TaskState == EnumTaskState.Running);
  1947. if (runTask == null)
  1948. {
  1949. Serilog.Log.Warning($"接收到双星时频差带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  1950. return Error<PosResDto>($"多模式融合定位平台没有启动双星时频差定位任务");
  1951. }
  1952. }
  1953. else
  1954. {
  1955. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1956. if (runTask == null)
  1957. {
  1958. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1959. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1960. }
  1961. }
  1962. }
  1963. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  1964. if (xl1 == null)
  1965. {
  1966. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1967. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1968. }
  1969. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1970. var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime);
  1971. if (xl2 == null)
  1972. {
  1973. Serilog.Log.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  1974. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  1975. }
  1976. Serilog.Log.Information($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1977. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  1978. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  1979. if (ephMain.code != 200)
  1980. {
  1981. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  1982. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  1983. }
  1984. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  1985. var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  1986. if (ephAdja.code != 200)
  1987. {
  1988. Serilog.Log.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}");
  1989. return Error<PosResDto>($"推算卫星{dto.AdjaCode}的ECEF星历出错");
  1990. }
  1991. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1992. {
  1993. var StationRes = db.StationRes.Add(new StationRes()
  1994. {
  1995. SatTxLon = dto.SatTxLon,
  1996. SatTxLat = dto.SatTxLat,
  1997. RefLon = dto.RefLon,
  1998. RefLat = dto.RefLat,
  1999. });
  2000. var ckRes = new CheckRes()
  2001. {
  2002. FileName = dto.CheckRes?.FileName,
  2003. SmpStart = dto.CheckRes?.SmpStart,
  2004. SmpCount = dto.CheckRes?.SmpCount,
  2005. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  2006. ModRate = dto.CheckRes?.ModRate,
  2007. ModType = dto.CheckRes?.ModType,
  2008. UserName = dto.CheckRes?.UserName,
  2009. FfcHz = dto.CheckRes?.FfcHz,
  2010. Snr = dto.CheckRes?.Snr
  2011. };
  2012. db.CheckRes.Add(ckRes);
  2013. var cgRes = db.CgRes.Add(new CgRes()
  2014. {
  2015. SigTime = dto.SigTime,
  2016. Dto1 = Math.Round(dto.Dto, 10),
  2017. Dfo1 = Math.Round(dto.Dfo, 10),
  2018. Snr1 = Math.Round(dto.Snr, 1),
  2019. YbMainDto = Math.Round(dto.YbMainDto, 10),
  2020. YbAdja1Dto = Math.Round(dto.YbAdjaDto, 10),
  2021. YbMainDfo = Math.Round(dto.YbMainDfo, 10),
  2022. YbAdja1Dfo = Math.Round(dto.YbAdjaDfo, 10),
  2023. TarFreqUp = dto.TarFreqUp,
  2024. TarFreqDown = dto.TarFreqDown,
  2025. RefFreqUp = dto.RefFreqUp,
  2026. RefFreqDown = dto.RefFreqDown,
  2027. StationResID = StationRes.ID,
  2028. MainCode = dto.MainCode,
  2029. Adja1Code = dto.AdjaCode,
  2030. MainXlTime = ephMain.data.TleTime,
  2031. Adja1XlTime = ephAdja.data.TleTime,
  2032. TaskID = runTask.ID,
  2033. MainX = ephMain.data.X,
  2034. MainY = ephMain.data.Y,
  2035. MainZ = ephMain.data.Z,
  2036. MainVx = ephMain.data.VX,
  2037. MainVy = ephMain.data.VY,
  2038. MainVz = ephMain.data.VZ,
  2039. Adja1X = ephAdja.data.X,
  2040. Adja1Y = ephAdja.data.Y,
  2041. Adja1Z = ephAdja.data.Z,
  2042. Adja1Vx = ephAdja.data.VX,
  2043. Adja1Vy = ephAdja.data.VY,
  2044. Adja1Vz = ephAdja.data.VZ,
  2045. });
  2046. var res = PosApi.X2_PosDtoDfo(cgRes, StationRes, dto.CalcConfidence);
  2047. PosRes posRes = new PosRes()
  2048. {
  2049. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  2050. SigTime = dto.SigTime,
  2051. TaskInfoID = runTask.ID,
  2052. CgResID = cgRes.ID,
  2053. CheckResID = ckRes.ID,
  2054. PosLon = res[0],
  2055. PosLat = res[1],
  2056. MirrLon = res[3],
  2057. MirrLat = res[4],
  2058. Confidence = (int)res[6],
  2059. PosResType = EnumPosResType.X2Dfo,
  2060. };
  2061. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  2062. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  2063. posRes = db.PosRes.Add(posRes);
  2064. await db.SaveChangesAsync();
  2065. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  2066. return Success(MapDto(posRes));
  2067. }
  2068. }
  2069. #endregion
  2070. private PosResDto MapDto(PosRes res)
  2071. {
  2072. return new PosResDto()
  2073. {
  2074. ID = res.ID,
  2075. FreqUpHz = res.FreqUpHz,
  2076. SigTime = res.SigTime,
  2077. TaskInfoID = res.TaskInfoID,
  2078. TarName = res.TargetInfo?.TargetName,
  2079. PosLon = res.PosLon,
  2080. PosLat = res.PosLat,
  2081. MirrLon = res.MirrLon,
  2082. MirrLat = res.MirrLat,
  2083. CheckType = res.CheckRes?.PosCheckType == null ? "" : res.CheckRes?.PosCheckType?.GetEnumDisplayName(),
  2084. TargetState = (EnumTargetStateDto)res.TargetState,
  2085. PosResType = (EnumPosResTypeDto)res.PosResType,
  2086. Confidence = res.Confidence,
  2087. };
  2088. }
  2089. private ModelPosRes MapModel(PosRes res)
  2090. {
  2091. return new ModelPosRes()
  2092. {
  2093. ID = res.ID,
  2094. FreqUpHz = res.FreqUpHz,
  2095. SigTime = res.SigTime,
  2096. TaskInfoID = res.TaskInfoID,
  2097. PosLon = res.PosLon,
  2098. PosLat = res.PosLat,
  2099. MirrLon = res.MirrLon,
  2100. MirrLat = res.MirrLat,
  2101. TargetState = res.TargetState,
  2102. PosResType = res.PosResType,
  2103. CgResID = res.CgResID,
  2104. CheckRes = res.CheckRes,
  2105. CheckResID = res.CheckResID,
  2106. ColorKey = res.ColorKey,
  2107. CreateTime = res.CreateTime,
  2108. CxResID = res.CxResID,
  2109. StationResID = res.StationResID,
  2110. TargetInfo = res.TargetInfo,
  2111. TargetInfoID = res.TargetInfoID,
  2112. UpdateTime = res.UpdateTime,
  2113. Confidence = res.Confidence,
  2114. };
  2115. }
  2116. }
  2117. }