PosController.cs 99 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205
  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. if (dto.BeFindRef)
  668. {
  669. X2D1PosRefService.Instance.AddPosDto(dto);
  670. PosRes posRes = new PosRes();
  671. return Success(MapDto(posRes));
  672. }
  673. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  674. {
  675. var StationRes = db.StationRes.Add(new StationRes()
  676. {
  677. SatTxLon = dto.SatTxLon,
  678. SatTxLat = dto.SatTxLat,
  679. CdbTxLon = dto.CdbTxLon,
  680. CdbTxLat = dto.CdbTxLat,
  681. });
  682. var ckRes = new CheckRes()
  683. {
  684. FileName = dto.CheckRes?.FileName,
  685. SmpStart = dto.CheckRes?.SmpStart,
  686. SmpCount = dto.CheckRes?.SmpCount,
  687. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  688. ModRate = dto.CheckRes?.ModRate,
  689. ModType = dto.CheckRes?.ModType,
  690. UserName = dto.CheckRes?.UserName,
  691. FfcHz = dto.CheckRes?.FfcHz,
  692. Snr = dto.CheckRes?.Snr
  693. };
  694. db.CheckRes.Add(ckRes);
  695. var cgRes = db.CgRes.Add(new CgRes()
  696. {
  697. SigTime = dto.SigTime,
  698. Dto1 = Math.Round(dto.SxDto, 10),
  699. Dfo1 = Math.Round(dto.SxDfo, 10),
  700. Snr1 = Math.Round(dto.SxSnr, 1),
  701. DtoCdb = Math.Round(dto.XdDto, 10),
  702. DfoCdb = Math.Round(dto.XdDfo, 10),
  703. SnrCdb = Math.Round(dto.XdSnr, 1),
  704. StationResID = StationRes.ID,
  705. FixedStationResID=dto.FixedStationId,
  706. MainCode = dto.MainCode,
  707. Adja1Code = dto.AdjaCode,
  708. MainXlTime = ephMain.data.TleTime,
  709. Adja1XlTime = ephAdja.data.TleTime,
  710. TaskID = runTask.ID,
  711. MainX = ephMain.data.X,
  712. MainY = ephMain.data.Y,
  713. MainZ = ephMain.data.Z,
  714. Adja1X = ephAdja.data.X,
  715. Adja1Y = ephAdja.data.Y,
  716. Adja1Z = ephAdja.data.Z,
  717. MainVx = ephMain.data.VX,
  718. MainVy = ephMain.data.VY,
  719. MainVz = ephMain.data.VZ,
  720. Adja1Vx = ephAdja.data.VX,
  721. Adja1Vy = ephAdja.data.VY,
  722. Adja1Vz = ephAdja.data.VZ,
  723. TarFreqUp = dto.FreqUp,
  724. TarFreqDown = dto.FreqDown,
  725. });
  726. double[] res;
  727. if (ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"] != null
  728. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "false"
  729. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "0")
  730. {
  731. res = PosApi.X2D1_PosNoRef_ZL(cgRes, StationRes);
  732. }
  733. else
  734. {
  735. res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  736. }
  737. PosRes posRes = new PosRes()
  738. {
  739. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  740. SigTime = dto.SigTime,
  741. TaskInfoID = runTask.ID,
  742. CgResID = cgRes.ID,
  743. CheckResID = ckRes.ID,
  744. PosLon = res[0],
  745. PosLat = res[1],
  746. MirrLon = res[3],
  747. MirrLat = res[4],
  748. Confidence = (int)res[6],
  749. PosResType = EnumPosResType.X2D1NoRef,
  750. };
  751. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  752. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  753. posRes = db.PosRes.Add(posRes);
  754. await db.SaveChangesAsync();
  755. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  756. return Success(MapDto(posRes));
  757. }
  758. }
  759. #endregion
  760. #region 融合定位
  761. /// <summary>
  762. /// 融合带参定位(含星历)
  763. /// </summary>
  764. /// <param name="dto">定位参数</param>
  765. /// <returns></returns>
  766. [HttpPost]
  767. public async Task<AjaxResult<PosResDto>> PosRhAsync(RHPosDto dto)
  768. {
  769. TaskInfo runTask;
  770. using (RHDWContext db = new RHDWContext())
  771. {
  772. if (dto.TaskID == null)
  773. {
  774. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  775. && p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running);
  776. if (runTask == null)
  777. {
  778. Serilog.Log.Warning($"接收到融合带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  779. return Error<PosResDto>($"多模式融合定位平台没有启动融合定位任务");
  780. }
  781. }
  782. else
  783. {
  784. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  785. if (runTask == null)
  786. {
  787. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  788. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  789. }
  790. }
  791. }
  792. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  793. {
  794. var StationRes = db.StationRes.Add(new StationRes()
  795. {
  796. SatTxLon = dto.SatTxLon,
  797. SatTxLat = dto.SatTxLat,
  798. CdbTxLon = dto.CdbTxLon,
  799. CdbTxLat = dto.CdbTxLat,
  800. CxLon = dto.CxLon,
  801. CxLat = dto.CxLat,
  802. RefLon = dto.RefLon,
  803. RefLat = dto.RefLat,
  804. });
  805. var ckRes = new CheckRes()
  806. {
  807. FileName = dto.CheckRes?.FileName,
  808. SmpStart = dto.CheckRes?.SmpStart,
  809. SmpCount = dto.CheckRes?.SmpCount,
  810. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  811. ModRate = dto.CheckRes?.ModRate,
  812. ModType = dto.CheckRes?.ModType,
  813. UserName = dto.CheckRes?.UserName,
  814. FfcHz = dto.CheckRes?.FfcHz,
  815. Snr = dto.CheckRes?.Snr
  816. };
  817. db.CheckRes.Add(ckRes);
  818. var cgRes = db.CgRes.Add(new CgRes()
  819. {
  820. SigTime = dto.SigTime,
  821. Dto1 = Math.Round(dto.SxDto, 10),
  822. Dfo1 = Math.Round(dto.SxDfo, 10),
  823. Snr1 = Math.Round(dto.SxSnr, 1),
  824. DtoCdb = Math.Round(dto.XdDto, 10),
  825. DfoCdb = Math.Round(dto.XdDfo, 10),
  826. SnrCdb = Math.Round(dto.XdSnr, 1),
  827. YbMainDto = Math.Round(dto.MainYbDto, 10),
  828. YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10),
  829. StationResID = StationRes.ID,
  830. MainCode = dto.MainCode,
  831. Adja1Code = dto.AdjaCode,
  832. TaskID = runTask.ID,
  833. MainX = dto.MainX,
  834. MainY = dto.MainY,
  835. MainZ = dto.MainZ,
  836. Adja1X = dto.AdjaX,
  837. Adja1Y = dto.AdjaY,
  838. Adja1Z = dto.AdjaZ,
  839. TarFreqUp = dto.FreqUp,
  840. TarFreqDown = dto.FreqDown,
  841. });
  842. var cxRes = db.CxRes.Add(new CxRes()
  843. {
  844. SigTime = dto.SigTime,
  845. Fx = dto.CxRes,
  846. });
  847. var res = PosApi.RH_Pos(cgRes, StationRes, cxRes, dto.CalcConfidence);
  848. PosRes posRes = new PosRes()
  849. {
  850. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  851. SigTime = cgRes.SigTime,
  852. TaskInfoID = runTask.ID,
  853. CxResID = cxRes.ID,
  854. CgResID = cgRes.ID,
  855. CheckResID = ckRes.ID,
  856. PosLon = res[0],
  857. PosLat = res[1],
  858. MirrLon = res[3],
  859. MirrLat = res[4],
  860. Confidence = (int)res[6],
  861. PosResType = EnumPosResType.RH,
  862. };
  863. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  864. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  865. posRes = db.PosRes.Add(posRes);
  866. await db.SaveChangesAsync();
  867. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  868. return Success(MapDto(posRes));
  869. }
  870. }
  871. /// <summary>
  872. /// 融合带参定位(无星历)
  873. /// </summary>
  874. /// <returns>返回定位结果ID</returns>
  875. [HttpPost]
  876. public async Task<AjaxResult<PosResDto>> PosRhNoXlAsync(RHNoXlPosDto dto)
  877. {
  878. TaskInfo runTask;
  879. using (RHDWContext db = new RHDWContext())
  880. {
  881. if (dto.TaskID == null)
  882. {
  883. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  884. && p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running);
  885. if (runTask == null)
  886. {
  887. Serilog.Log.Warning($"接收到融合带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  888. return Error<PosResDto>($"多模式融合定位平台没有启动融合定位任务");
  889. }
  890. }
  891. else
  892. {
  893. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  894. if (runTask == null)
  895. {
  896. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  897. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  898. }
  899. }
  900. }
  901. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  902. if (xl1 == null)
  903. {
  904. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  905. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  906. }
  907. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  908. var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime);
  909. if (xl2 == null)
  910. {
  911. Serilog.Log.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  912. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  913. }
  914. Serilog.Log.Information($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  915. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  916. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  917. if (ephMain.code != 200)
  918. {
  919. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  920. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  921. }
  922. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  923. var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  924. if (ephAdja.code != 200)
  925. {
  926. Serilog.Log.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}");
  927. return Error<PosResDto>($"推算卫星{dto.AdjaCode}的ECEF星历出错");
  928. }
  929. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  930. {
  931. var StationRes = db.StationRes.Add(new StationRes()
  932. {
  933. SatTxLon = dto.SatTxLon,
  934. SatTxLat = dto.SatTxLat,
  935. CdbTxLon = dto.CdbTxLon,
  936. CdbTxLat = dto.CdbTxLat,
  937. CxLon = dto.CxLon,
  938. CxLat = dto.CxLat,
  939. RefLon = dto.RefLon,
  940. RefLat = dto.RefLat,
  941. });
  942. var ckRes = new CheckRes()
  943. {
  944. FileName = dto.CheckRes?.FileName,
  945. SmpStart = dto.CheckRes?.SmpStart,
  946. SmpCount = dto.CheckRes?.SmpCount,
  947. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  948. ModRate = dto.CheckRes?.ModRate,
  949. ModType = dto.CheckRes?.ModType,
  950. UserName = dto.CheckRes?.UserName,
  951. FfcHz = dto.CheckRes?.FfcHz,
  952. Snr = dto.CheckRes?.Snr
  953. };
  954. db.CheckRes.Add(ckRes);
  955. var cgRes = db.CgRes.Add(new CgRes()
  956. {
  957. SigTime = dto.SigTime,
  958. Dto1 = Math.Round(dto.SxDto, 10),
  959. Dfo1 = Math.Round(dto.SxDfo, 10),
  960. Snr1 = Math.Round(dto.SxSnr, 1),
  961. DtoCdb = Math.Round(dto.XdDto, 10),
  962. DfoCdb = Math.Round(dto.XdDfo, 10),
  963. SnrCdb = Math.Round(dto.XdSnr, 1),
  964. YbMainDto = Math.Round(dto.MainYbDto, 10),
  965. YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10),
  966. StationResID = StationRes.ID,
  967. MainCode = dto.MainCode,
  968. Adja1Code = dto.AdjaCode,
  969. MainXlTime = ephMain.data.TleTime,
  970. Adja1XlTime = ephAdja.data.TleTime,
  971. TaskID = runTask.ID,
  972. MainX = ephMain.data.X,
  973. MainY = ephMain.data.Y,
  974. MainZ = ephMain.data.Z,
  975. MainVx = ephMain.data.VX,
  976. MainVy = ephMain.data.VY,
  977. MainVz = ephMain.data.VZ,
  978. Adja1X = ephAdja.data.X,
  979. Adja1Y = ephAdja.data.Y,
  980. Adja1Z = ephAdja.data.Z,
  981. Adja1Vx = ephAdja.data.VX,
  982. Adja1Vy = ephAdja.data.VY,
  983. Adja1Vz = ephAdja.data.VZ,
  984. TarFreqUp = dto.FreqUp,
  985. TarFreqDown = dto.FreqDown,
  986. });
  987. var cxRes = db.CxRes.Add(new CxRes()
  988. {
  989. SigTime = dto.SigTime,
  990. Fx = dto.CxRes,
  991. });
  992. var res = PosApi.RH_Pos(cgRes, StationRes, cxRes, dto.CalcConfidence);
  993. PosRes posRes = new PosRes()
  994. {
  995. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  996. SigTime = cgRes.SigTime,
  997. TaskInfoID = runTask.ID,
  998. CxResID = cxRes.ID,
  999. CgResID = cgRes.ID,
  1000. CheckResID = ckRes.ID,
  1001. PosLon = res[0],
  1002. PosLat = res[1],
  1003. MirrLon = res[3],
  1004. MirrLat = res[4],
  1005. Confidence = (int)res[6],
  1006. PosResType = EnumPosResType.RH,
  1007. };
  1008. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1009. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1010. posRes = db.PosRes.Add(posRes);
  1011. await db.SaveChangesAsync();
  1012. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1013. return Success(MapDto(posRes));
  1014. }
  1015. }
  1016. #endregion
  1017. #region 三星双时差定位
  1018. /// <summary>
  1019. /// 三星双时差带参定位(含星历)
  1020. /// </summary>
  1021. /// <param name="dto">定位参数</param>
  1022. /// <returns></returns>
  1023. [HttpPost]
  1024. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoAsync(X3TwoDtoPosDto dto)
  1025. {
  1026. TaskInfo runTask;
  1027. using (RHDWContext db = new RHDWContext())
  1028. {
  1029. if (dto.TaskID == null)
  1030. {
  1031. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1032. && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  1033. if (runTask == null)
  1034. {
  1035. Serilog.Log.Warning($"接收到三星双时差带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  1036. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  1037. }
  1038. }
  1039. else
  1040. {
  1041. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1042. if (runTask == null)
  1043. {
  1044. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1045. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1046. }
  1047. }
  1048. }
  1049. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1050. {
  1051. var StationRes = db.StationRes.Add(new StationRes()
  1052. {
  1053. SatTxLon = dto.SatTxLon,
  1054. SatTxLat = dto.SatTxLat,
  1055. RefLon = dto.RefLon,
  1056. RefLat = dto.RefLat,
  1057. });
  1058. var ckRes = new CheckRes()
  1059. {
  1060. FileName = dto.CheckRes?.FileName,
  1061. SmpStart = dto.CheckRes?.SmpStart,
  1062. SmpCount = dto.CheckRes?.SmpCount,
  1063. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1064. ModRate = dto.CheckRes?.ModRate,
  1065. ModType = dto.CheckRes?.ModType,
  1066. UserName = dto.CheckRes?.UserName,
  1067. FfcHz = dto.CheckRes?.FfcHz,
  1068. Snr = dto.CheckRes?.Snr
  1069. };
  1070. db.CheckRes.Add(ckRes);
  1071. var cgRes = db.CgRes.Add(new CgRes()
  1072. {
  1073. SigTime = dto.SigTime,
  1074. Dto1 = Math.Round(dto.Dto1, 10),
  1075. Dfo1 = Math.Round(dto.Dfo1, 10),
  1076. Snr1 = Math.Round(dto.Snr1, 1),
  1077. Dto2 = Math.Round(dto.Dto2, 10),
  1078. Dfo2 = Math.Round(dto.Dfo2, 10),
  1079. Snr2 = Math.Round(dto.Snr2, 1),
  1080. YbMainDto = Math.Round(dto.YbMainDto, 10),
  1081. YbAdja1Dto = Math.Round(dto.YbAdja1Dto, 10),
  1082. YbAdja2Dto = Math.Round(dto.YbAdja2Dto, 10),
  1083. StationResID = StationRes.ID,
  1084. MainCode = dto.MainCode,
  1085. Adja1Code = dto.Adja1Code,
  1086. Adja2Code = dto.Adja2Code,
  1087. TaskID = runTask.ID,
  1088. MainX = dto.MainX,
  1089. MainY = dto.MainY,
  1090. MainZ = dto.MainZ,
  1091. MainVx = dto.MainVX,
  1092. MainVy = dto.MainVY,
  1093. MainVz = dto.MainVZ,
  1094. Adja1X = dto.Adja1X,
  1095. Adja1Y = dto.Adja1Y,
  1096. Adja1Z = dto.Adja1Z,
  1097. Adja1Vx = dto.Adja1VX,
  1098. Adja1Vy = dto.Adja1VY,
  1099. Adja1Vz = dto.Adja1VZ,
  1100. Adja2X = dto.Adja2X,
  1101. Adja2Y = dto.Adja2Y,
  1102. Adja2Z = dto.Adja2Z,
  1103. Adja2Vx = dto.Adja2VX,
  1104. Adja2Vy = dto.Adja2VY,
  1105. Adja2Vz = dto.Adja2VZ,
  1106. TarFreqUp = dto.FreqUp,
  1107. TarFreqDown = dto.FreqDown,
  1108. });
  1109. var res = PosApi.X3_Pos(cgRes, StationRes, dto.CalcConfidence);
  1110. PosRes posRes = new PosRes()
  1111. {
  1112. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1113. SigTime = cgRes.SigTime,
  1114. TaskInfoID = runTask.ID,
  1115. CgResID = cgRes.ID,
  1116. CheckResID = ckRes.ID,
  1117. PosLon = res[0],
  1118. PosLat = res[1],
  1119. MirrLon = res[3],
  1120. MirrLat = res[4],
  1121. Confidence = (int)res[6],
  1122. PosResType = EnumPosResType.X3,
  1123. };
  1124. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1125. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1126. posRes = db.PosRes.Add(posRes);
  1127. await db.SaveChangesAsync();
  1128. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1129. return Success(MapDto(posRes));
  1130. }
  1131. }
  1132. /// <summary>
  1133. /// 三星双时差带参定位(无星历)
  1134. /// </summary>
  1135. /// <returns>返回定位结果ID</returns>
  1136. [HttpPost]
  1137. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoXlAsync(X3TwoDtoNoXlPosDto dto)
  1138. {
  1139. TaskInfo runTask;
  1140. using (RHDWContext db = new RHDWContext())
  1141. {
  1142. if (dto.TaskID == null)
  1143. {
  1144. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1145. && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  1146. if (runTask == null)
  1147. {
  1148. Serilog.Log.Warning($"接收到三星双时差带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  1149. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  1150. }
  1151. }
  1152. else
  1153. {
  1154. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1155. if (runTask == null)
  1156. {
  1157. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1158. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1159. }
  1160. }
  1161. }
  1162. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  1163. if (xl1 == null)
  1164. {
  1165. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1166. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1167. }
  1168. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1169. var xl2 = await XlRepository.GetLatestAsync(dto.Adja1Code, dto.SigTime);
  1170. if (xl2 == null)
  1171. {
  1172. Serilog.Log.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1173. return Error<PosResDto>($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1174. }
  1175. Serilog.Log.Information($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1176. var xl3 = await XlRepository.GetLatestAsync(dto.Adja2Code, dto.SigTime);
  1177. if (xl3 == null)
  1178. {
  1179. Serilog.Log.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1180. return Error<PosResDto>($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1181. }
  1182. Serilog.Log.Information($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1183. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  1184. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  1185. if (ephMain.code != 200)
  1186. {
  1187. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  1188. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  1189. }
  1190. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  1191. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  1192. if (ephAdja1.code != 200)
  1193. {
  1194. Serilog.Log.Error($"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}");
  1195. return Error<PosResDto>($"推算卫星{dto.Adja1Code}的ECEF星历出错");
  1196. }
  1197. var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime };
  1198. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3);
  1199. if (ephAdja2.code != 200)
  1200. {
  1201. Serilog.Log.Error($"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}");
  1202. return Error<PosResDto>($"推算卫星{dto.Adja2Code}的ECEF星历出错");
  1203. }
  1204. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1205. {
  1206. var StationRes = db.StationRes.Add(new StationRes()
  1207. {
  1208. SatTxLon = dto.SatTxLon,
  1209. SatTxLat = dto.SatTxLat,
  1210. RefLon = dto.RefLon,
  1211. RefLat = dto.RefLat,
  1212. });
  1213. var ckRes = new CheckRes()
  1214. {
  1215. FileName = dto.CheckRes?.FileName,
  1216. SmpStart = dto.CheckRes?.SmpStart,
  1217. SmpCount = dto.CheckRes?.SmpCount,
  1218. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1219. ModRate = dto.CheckRes?.ModRate,
  1220. ModType = dto.CheckRes?.ModType,
  1221. UserName = dto.CheckRes?.UserName,
  1222. FfcHz = dto.CheckRes?.FfcHz,
  1223. Snr = dto.CheckRes?.Snr
  1224. };
  1225. db.CheckRes.Add(ckRes);
  1226. var cgRes = db.CgRes.Add(new CgRes()
  1227. {
  1228. SigTime = dto.SigTime,
  1229. Dto1 = Math.Round(dto.Dto1, 10),
  1230. Dfo1 = Math.Round(dto.Dfo1, 10),
  1231. Snr1 = Math.Round(dto.Snr1, 1),
  1232. Dto2 = Math.Round(dto.Dto2, 10),
  1233. Dfo2 = Math.Round(dto.Dfo2, 10),
  1234. Snr2 = Math.Round(dto.Snr2, 1),
  1235. YbMainDto = Math.Round(dto.YbMainDto, 10),
  1236. YbAdja1Dto = Math.Round(dto.YbAdja1Dto, 10),
  1237. YbAdja2Dto = Math.Round(dto.YbAdja2Dto, 10),
  1238. StationResID = StationRes.ID,
  1239. MainCode = dto.MainCode,
  1240. Adja1Code = dto.Adja1Code,
  1241. Adja2Code = dto.Adja2Code,
  1242. MainXlTime = ephMain.data.TleTime,
  1243. Adja1XlTime = ephAdja1.data.TleTime,
  1244. Adja2XlTime = ephAdja2.data.TleTime,
  1245. TaskID = runTask.ID,
  1246. MainX = ephMain.data.X,
  1247. MainY = ephMain.data.Y,
  1248. MainZ = ephMain.data.Z,
  1249. MainVx = ephMain.data.VX,
  1250. MainVy = ephMain.data.VY,
  1251. MainVz = ephMain.data.VZ,
  1252. Adja1X = ephAdja1.data.X,
  1253. Adja1Y = ephAdja1.data.Y,
  1254. Adja1Z = ephAdja1.data.Z,
  1255. Adja1Vx = ephAdja1.data.VX,
  1256. Adja1Vy = ephAdja1.data.VY,
  1257. Adja1Vz = ephAdja1.data.VZ,
  1258. Adja2X = ephAdja2.data.X,
  1259. Adja2Y = ephAdja2.data.Y,
  1260. Adja2Z = ephAdja2.data.Z,
  1261. Adja2Vx = ephAdja2.data.VX,
  1262. Adja2Vy = ephAdja2.data.VY,
  1263. Adja2Vz = ephAdja2.data.VZ,
  1264. TarFreqUp = dto.FreqUp,
  1265. TarFreqDown = dto.FreqDown,
  1266. });
  1267. var res = PosApi.X3_Pos(cgRes, StationRes, dto.CalcConfidence);
  1268. PosRes posRes = new PosRes()
  1269. {
  1270. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1271. SigTime = dto.SigTime,
  1272. TaskInfoID = runTask.ID,
  1273. CgResID = cgRes.ID,
  1274. CheckResID = ckRes.ID,
  1275. PosLon = res[0],
  1276. PosLat = res[1],
  1277. MirrLon = res[3],
  1278. MirrLat = res[4],
  1279. Confidence = (int)res[6],
  1280. PosResType = EnumPosResType.X3,
  1281. };
  1282. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1283. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1284. posRes = db.PosRes.Add(posRes);
  1285. await db.SaveChangesAsync();
  1286. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1287. return Success(MapDto(posRes));
  1288. }
  1289. }
  1290. /// <summary>
  1291. /// 三星双时差无参定位(含星历)
  1292. /// </summary>
  1293. /// <param name="dto">定位参数</param>
  1294. /// <returns></returns>
  1295. [HttpPost]
  1296. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoParAsync(X3TwoDtoNoParPosDto dto)
  1297. {
  1298. TaskInfo runTask;
  1299. using (RHDWContext db = new RHDWContext())
  1300. {
  1301. if (dto.TaskID == null)
  1302. {
  1303. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1304. && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  1305. if (runTask == null)
  1306. {
  1307. Serilog.Log.Warning($"接收到三星双时差无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  1308. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  1309. }
  1310. }
  1311. else
  1312. {
  1313. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1314. if (runTask == null)
  1315. {
  1316. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1317. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1318. }
  1319. }
  1320. }
  1321. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1322. {
  1323. var StationRes = db.StationRes.Add(new StationRes()
  1324. {
  1325. SatTxLon = dto.SatTxLon,
  1326. SatTxLat = dto.SatTxLat,
  1327. });
  1328. var ckRes = new CheckRes()
  1329. {
  1330. FileName = dto.CheckRes?.FileName,
  1331. SmpStart = dto.CheckRes?.SmpStart,
  1332. SmpCount = dto.CheckRes?.SmpCount,
  1333. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1334. ModRate = dto.CheckRes?.ModRate,
  1335. ModType = dto.CheckRes?.ModType,
  1336. UserName = dto.CheckRes?.UserName,
  1337. FfcHz = dto.CheckRes?.FfcHz,
  1338. Snr = dto.CheckRes?.Snr
  1339. };
  1340. db.CheckRes.Add(ckRes);
  1341. var cgRes = db.CgRes.Add(new CgRes()
  1342. {
  1343. SigTime = dto.SigTime,
  1344. Dto1 = Math.Round(dto.Dto1, 10),
  1345. Dfo1 = Math.Round(dto.Dfo1, 10),
  1346. Snr1 = Math.Round(dto.Snr1, 1),
  1347. Dto2 = Math.Round(dto.Dto2, 10),
  1348. Dfo2 = Math.Round(dto.Dfo2, 10),
  1349. Snr2 = Math.Round(dto.Snr2, 1),
  1350. StationResID = StationRes.ID,
  1351. MainCode = dto.MainCode,
  1352. Adja1Code = dto.Adja1Code,
  1353. Adja2Code = dto.Adja2Code,
  1354. TaskID = runTask.ID,
  1355. MainX = dto.MainX,
  1356. MainY = dto.MainY,
  1357. MainZ = dto.MainZ,
  1358. MainVx = dto.MainVX,
  1359. MainVy = dto.MainVY,
  1360. MainVz = dto.MainVZ,
  1361. Adja1X = dto.Adja1X,
  1362. Adja1Y = dto.Adja1Y,
  1363. Adja1Z = dto.Adja1Z,
  1364. Adja1Vx = dto.Adja1VX,
  1365. Adja1Vy = dto.Adja1VY,
  1366. Adja1Vz = dto.Adja1VZ,
  1367. Adja2X = dto.Adja2X,
  1368. Adja2Y = dto.Adja2Y,
  1369. Adja2Z = dto.Adja2Z,
  1370. Adja2Vx = dto.Adja2VX,
  1371. Adja2Vy = dto.Adja2VY,
  1372. Adja2Vz = dto.Adja2VZ,
  1373. TarFreqUp = dto.FreqUp,
  1374. TarFreqDown = dto.FreqDown,
  1375. });
  1376. var res = PosApi.X3_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  1377. PosRes posRes = new PosRes()
  1378. {
  1379. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1380. SigTime = cgRes.SigTime,
  1381. TaskInfoID = runTask.ID,
  1382. CgResID = cgRes.ID,
  1383. CheckResID = ckRes.ID,
  1384. PosLon = res[0],
  1385. PosLat = res[1],
  1386. MirrLon = res[3],
  1387. MirrLat = res[4],
  1388. Confidence = (int)res[6],
  1389. PosResType = EnumPosResType.X3NoRef,
  1390. };
  1391. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1392. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1393. posRes = db.PosRes.Add(posRes);
  1394. await db.SaveChangesAsync();
  1395. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1396. return Success(MapDto(posRes));
  1397. }
  1398. }
  1399. /// <summary>
  1400. /// 三星双时差无参定位(无星历)
  1401. /// </summary>
  1402. /// <returns>返回定位结果ID</returns>
  1403. [HttpPost]
  1404. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoXlNoParAsync(X3TwoDtoNoXlNoParPosDto dto)
  1405. {
  1406. TaskInfo runTask;
  1407. using (RHDWContext db = new RHDWContext())
  1408. {
  1409. if (dto.TaskID == null)
  1410. {
  1411. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1412. && p.PosType == EnumPosType.X3TwoDto && p.TaskState == EnumTaskState.Running);
  1413. if (runTask == null)
  1414. {
  1415. Serilog.Log.Warning($"接收到三星双时差无参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  1416. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  1417. }
  1418. }
  1419. else
  1420. {
  1421. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1422. if (runTask == null)
  1423. {
  1424. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1425. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1426. }
  1427. }
  1428. }
  1429. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  1430. if (xl1 == null)
  1431. {
  1432. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1433. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1434. }
  1435. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1436. var xl2 = await XlRepository.GetLatestAsync(dto.Adja1Code, dto.SigTime);
  1437. if (xl2 == null)
  1438. {
  1439. Serilog.Log.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1440. return Error<PosResDto>($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1441. }
  1442. Serilog.Log.Information($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1443. var xl3 = await XlRepository.GetLatestAsync(dto.Adja2Code, dto.SigTime);
  1444. if (xl3 == null)
  1445. {
  1446. Serilog.Log.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1447. return Error<PosResDto>($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1448. }
  1449. Serilog.Log.Information($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1450. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  1451. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  1452. if (ephMain.code != 200)
  1453. {
  1454. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  1455. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  1456. }
  1457. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  1458. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  1459. if (ephAdja1.code != 200)
  1460. {
  1461. Serilog.Log.Error($"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}");
  1462. return Error<PosResDto>($"推算卫星{dto.Adja1Code}的ECEF星历出错");
  1463. }
  1464. var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime };
  1465. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3);
  1466. if (ephAdja2.code != 200)
  1467. {
  1468. Serilog.Log.Error($"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}");
  1469. return Error<PosResDto>($"推算卫星{dto.Adja2Code}的ECEF星历出错");
  1470. }
  1471. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1472. {
  1473. var StationRes = db.StationRes.Add(new StationRes()
  1474. {
  1475. SatTxLon = dto.SatTxLon,
  1476. SatTxLat = dto.SatTxLat,
  1477. });
  1478. var ckRes = new CheckRes()
  1479. {
  1480. FileName = dto.CheckRes?.FileName,
  1481. SmpStart = dto.CheckRes?.SmpStart,
  1482. SmpCount = dto.CheckRes?.SmpCount,
  1483. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1484. ModRate = dto.CheckRes?.ModRate,
  1485. ModType = dto.CheckRes?.ModType,
  1486. UserName = dto.CheckRes?.UserName,
  1487. FfcHz = dto.CheckRes?.FfcHz,
  1488. Snr = dto.CheckRes?.Snr
  1489. };
  1490. db.CheckRes.Add(ckRes);
  1491. var cgRes = db.CgRes.Add(new CgRes()
  1492. {
  1493. SigTime = dto.SigTime,
  1494. Dto1 = Math.Round(dto.Dto1, 10),
  1495. Dfo1 = Math.Round(dto.Dfo1, 10),
  1496. Snr1 = Math.Round(dto.Snr1, 1),
  1497. Dto2 = Math.Round(dto.Dto2, 10),
  1498. Dfo2 = Math.Round(dto.Dfo2, 10),
  1499. Snr2 = Math.Round(dto.Snr2, 1),
  1500. StationResID = StationRes.ID,
  1501. MainCode = dto.MainCode,
  1502. Adja1Code = dto.Adja1Code,
  1503. Adja2Code = dto.Adja2Code,
  1504. MainXlTime = ephMain.data.TleTime,
  1505. Adja1XlTime = ephAdja1.data.TleTime,
  1506. Adja2XlTime = ephAdja2.data.TleTime,
  1507. TaskID = runTask.ID,
  1508. MainX = ephMain.data.X,
  1509. MainY = ephMain.data.Y,
  1510. MainZ = ephMain.data.Z,
  1511. MainVx = ephMain.data.VX,
  1512. MainVy = ephMain.data.VY,
  1513. MainVz = ephMain.data.VZ,
  1514. Adja1X = ephAdja1.data.X,
  1515. Adja1Y = ephAdja1.data.Y,
  1516. Adja1Z = ephAdja1.data.Z,
  1517. Adja1Vx = ephAdja1.data.VX,
  1518. Adja1Vy = ephAdja1.data.VY,
  1519. Adja1Vz = ephAdja1.data.VZ,
  1520. Adja2X = ephAdja2.data.X,
  1521. Adja2Y = ephAdja2.data.Y,
  1522. Adja2Z = ephAdja2.data.Z,
  1523. Adja2Vx = ephAdja2.data.VX,
  1524. Adja2Vy = ephAdja2.data.VY,
  1525. Adja2Vz = ephAdja2.data.VZ,
  1526. TarFreqUp = dto.FreqUp,
  1527. TarFreqDown = dto.FreqDown,
  1528. });
  1529. var res = PosApi.X3_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  1530. PosRes posRes = new PosRes()
  1531. {
  1532. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1533. SigTime = dto.SigTime,
  1534. TaskInfoID = runTask.ID,
  1535. CgResID = cgRes.ID,
  1536. CheckResID = ckRes.ID,
  1537. PosLon = res[0],
  1538. PosLat = res[1],
  1539. MirrLon = res[3],
  1540. MirrLat = res[4],
  1541. Confidence = (int)res[6],
  1542. PosResType = EnumPosResType.X3NoRef,
  1543. };
  1544. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1545. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1546. posRes = db.PosRes.Add(posRes);
  1547. await db.SaveChangesAsync();
  1548. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1549. return Success(MapDto(posRes));
  1550. }
  1551. }
  1552. #endregion
  1553. #region 三星双频差定位
  1554. /// <summary>
  1555. /// 三星双频差带参定位(含星历)
  1556. /// </summary>
  1557. /// <param name="dto">定位参数</param>
  1558. /// <returns></returns>
  1559. [HttpPost]
  1560. public async Task<AjaxResult<PosResDto>> PosX3TwoDfoAsync(X3TwoDfoPosDto dto)
  1561. {
  1562. TaskInfo runTask;
  1563. using (RHDWContext db = new RHDWContext())
  1564. {
  1565. if (dto.TaskID == null)
  1566. {
  1567. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1568. && p.PosType == EnumPosType.X3TwoDfo && p.TaskState == EnumTaskState.Running);
  1569. if (runTask == null)
  1570. {
  1571. Serilog.Log.Warning($"接收到三星双频差带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  1572. return Error<PosResDto>($"多模式融合定位平台没有启动三星双频差定位任务");
  1573. }
  1574. }
  1575. else
  1576. {
  1577. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1578. if (runTask == null)
  1579. {
  1580. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1581. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1582. }
  1583. }
  1584. }
  1585. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1586. {
  1587. var StationRes = db.StationRes.Add(new StationRes()
  1588. {
  1589. SatTxLon = dto.SatTxLon,
  1590. SatTxLat = dto.SatTxLat,
  1591. RefLon = dto.RefLon,
  1592. RefLat = dto.RefLat,
  1593. });
  1594. var ckRes = new CheckRes()
  1595. {
  1596. FileName = dto.CheckRes?.FileName,
  1597. SmpStart = dto.CheckRes?.SmpStart,
  1598. SmpCount = dto.CheckRes?.SmpCount,
  1599. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1600. ModRate = dto.CheckRes?.ModRate,
  1601. ModType = dto.CheckRes?.ModType,
  1602. UserName = dto.CheckRes?.UserName,
  1603. FfcHz = dto.CheckRes?.FfcHz,
  1604. Snr = dto.CheckRes?.Snr
  1605. };
  1606. db.CheckRes.Add(ckRes);
  1607. var cgRes = db.CgRes.Add(new CgRes()
  1608. {
  1609. SigTime = dto.SigTime,
  1610. Dto1 = Math.Round(dto.Dto1, 10),
  1611. Dfo1 = Math.Round(dto.Dfo1, 10),
  1612. Snr1 = Math.Round(dto.Snr1, 1),
  1613. Dto2 = Math.Round(dto.Dto2, 10),
  1614. Dfo2 = Math.Round(dto.Dfo2, 10),
  1615. Snr2 = Math.Round(dto.Snr2, 1),
  1616. YbMainDfo = Math.Round(dto.YbMainDfo, 10),
  1617. YbAdja1Dfo = Math.Round(dto.YbAdja1Dfo, 10),
  1618. YbAdja2Dfo = Math.Round(dto.YbAdja2Dfo, 10),
  1619. TarFreqUp = dto.TarFreqUp,
  1620. TarFreqDown = dto.TarFreqDown,
  1621. RefFreqUp = dto.RefFreqUp,
  1622. RefFreqDown = dto.RefFreqDown,
  1623. StationResID = StationRes.ID,
  1624. MainCode = dto.MainCode,
  1625. Adja1Code = dto.Adja1Code,
  1626. Adja2Code = dto.Adja2Code,
  1627. TaskID = runTask.ID,
  1628. MainX = dto.MainX,
  1629. MainY = dto.MainY,
  1630. MainZ = dto.MainZ,
  1631. MainVx = dto.MainVx,
  1632. MainVy = dto.MainVy,
  1633. MainVz = dto.MainVz,
  1634. Adja1X = dto.Adja1X,
  1635. Adja1Y = dto.Adja1Y,
  1636. Adja1Z = dto.Adja1Z,
  1637. Adja1Vx = dto.Adja1Vx,
  1638. Adja1Vy = dto.Adja1Vy,
  1639. Adja1Vz = dto.Adja1Vz,
  1640. Adja2X = dto.Adja2X,
  1641. Adja2Y = dto.Adja2Y,
  1642. Adja2Z = dto.Adja2Z,
  1643. Adja2Vx = dto.Adja2Vx,
  1644. Adja2Vy = dto.Adja2Vy,
  1645. Adja2Vz = dto.Adja2Vz,
  1646. });
  1647. var res = PosApi.X3_PosTwoDfo(cgRes, StationRes, dto.CalcConfidence);
  1648. PosRes posRes = new PosRes()
  1649. {
  1650. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1651. SigTime = cgRes.SigTime,
  1652. TaskInfoID = runTask.ID,
  1653. CgResID = cgRes.ID,
  1654. CheckResID = ckRes.ID,
  1655. PosLon = res[0],
  1656. PosLat = res[1],
  1657. MirrLon = res[3],
  1658. MirrLat = res[4],
  1659. Confidence = (int)res[6],
  1660. PosResType = EnumPosResType.X3TwoDfo,
  1661. };
  1662. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1663. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1664. posRes = db.PosRes.Add(posRes);
  1665. await db.SaveChangesAsync();
  1666. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1667. return Success(MapDto(posRes));
  1668. }
  1669. }
  1670. /// <summary>
  1671. /// 三星双频差带参定位(无星历)
  1672. /// </summary>
  1673. /// <returns>返回定位结果ID</returns>
  1674. [HttpPost]
  1675. public async Task<AjaxResult<PosResDto>> PosX3TwoDfoNoXlAsync(X3TwoDfoNoXlPosDto dto)
  1676. {
  1677. TaskInfo runTask;
  1678. using (RHDWContext db = new RHDWContext())
  1679. {
  1680. if (dto.TaskID == null)
  1681. {
  1682. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1683. && p.PosType == EnumPosType.X3TwoDfo && p.TaskState == EnumTaskState.Running);
  1684. if (runTask == null)
  1685. {
  1686. Serilog.Log.Warning($"接收到三星双频差带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  1687. return Error<PosResDto>($"多模式融合定位平台没有启动三星双频差定位任务");
  1688. }
  1689. }
  1690. else
  1691. {
  1692. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1693. if (runTask == null)
  1694. {
  1695. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1696. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1697. }
  1698. }
  1699. }
  1700. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  1701. if (xl1 == null)
  1702. {
  1703. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1704. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1705. }
  1706. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1707. var xl2 = await XlRepository.GetLatestAsync(dto.Adja1Code, dto.SigTime);
  1708. if (xl2 == null)
  1709. {
  1710. Serilog.Log.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1711. return Error<PosResDto>($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1712. }
  1713. Serilog.Log.Information($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1714. var xl3 = await XlRepository.GetLatestAsync(dto.Adja2Code, dto.SigTime);
  1715. if (xl3 == null)
  1716. {
  1717. Serilog.Log.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1718. return Error<PosResDto>($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1719. }
  1720. Serilog.Log.Information($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1721. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  1722. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  1723. if (ephMain.code != 200)
  1724. {
  1725. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  1726. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  1727. }
  1728. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  1729. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  1730. if (ephAdja1.code != 200)
  1731. {
  1732. Serilog.Log.Error($"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}");
  1733. return Error<PosResDto>($"推算卫星{dto.Adja1Code}的ECEF星历出错");
  1734. }
  1735. var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime };
  1736. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3);
  1737. if (ephAdja2.code != 200)
  1738. {
  1739. Serilog.Log.Error($"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}");
  1740. return Error<PosResDto>($"推算卫星{dto.Adja2Code}的ECEF星历出错");
  1741. }
  1742. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1743. {
  1744. var StationRes = db.StationRes.Add(new StationRes()
  1745. {
  1746. SatTxLon = dto.SatTxLon,
  1747. SatTxLat = dto.SatTxLat,
  1748. RefLon = dto.RefLon,
  1749. RefLat = dto.RefLat,
  1750. });
  1751. var ckRes = new CheckRes()
  1752. {
  1753. FileName = dto.CheckRes?.FileName,
  1754. SmpStart = dto.CheckRes?.SmpStart,
  1755. SmpCount = dto.CheckRes?.SmpCount,
  1756. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1757. ModRate = dto.CheckRes?.ModRate,
  1758. ModType = dto.CheckRes?.ModType,
  1759. UserName = dto.CheckRes?.UserName,
  1760. FfcHz = dto.CheckRes?.FfcHz,
  1761. Snr = dto.CheckRes?.Snr
  1762. };
  1763. db.CheckRes.Add(ckRes);
  1764. var cgRes = db.CgRes.Add(new CgRes()
  1765. {
  1766. SigTime = dto.SigTime,
  1767. Dto1 = Math.Round(dto.Dto1, 10),
  1768. Dfo1 = Math.Round(dto.Dfo1, 10),
  1769. Snr1 = Math.Round(dto.Snr1, 1),
  1770. Dto2 = Math.Round(dto.Dto2, 10),
  1771. Dfo2 = Math.Round(dto.Dfo2, 10),
  1772. Snr2 = Math.Round(dto.Snr2, 1),
  1773. YbMainDfo = Math.Round(dto.YbMainDfo, 10),
  1774. YbAdja1Dfo = Math.Round(dto.YbAdja1Dfo, 10),
  1775. YbAdja2Dfo = Math.Round(dto.YbAdja2Dfo, 10),
  1776. TarFreqUp = dto.TarFreqUp,
  1777. TarFreqDown = dto.TarFreqDown,
  1778. RefFreqUp = dto.RefFreqUp,
  1779. RefFreqDown = dto.RefFreqDown,
  1780. StationResID = StationRes.ID,
  1781. MainCode = dto.MainCode,
  1782. Adja1Code = dto.Adja1Code,
  1783. Adja2Code = dto.Adja2Code,
  1784. MainXlTime = ephMain.data.TleTime,
  1785. Adja1XlTime = ephAdja1.data.TleTime,
  1786. Adja2XlTime = ephAdja2.data.TleTime,
  1787. TaskID = runTask.ID,
  1788. MainX = ephMain.data.X,
  1789. MainY = ephMain.data.Y,
  1790. MainZ = ephMain.data.Z,
  1791. MainVx = ephMain.data.VX,
  1792. MainVy = ephMain.data.VY,
  1793. MainVz = ephMain.data.VZ,
  1794. Adja1X = ephAdja1.data.X,
  1795. Adja1Y = ephAdja1.data.Y,
  1796. Adja1Z = ephAdja1.data.Z,
  1797. Adja1Vx = ephAdja1.data.VX,
  1798. Adja1Vy = ephAdja1.data.VY,
  1799. Adja1Vz = ephAdja1.data.VZ,
  1800. Adja2X = ephAdja2.data.X,
  1801. Adja2Y = ephAdja2.data.Y,
  1802. Adja2Z = ephAdja2.data.Z,
  1803. Adja2Vx = ephAdja2.data.VX,
  1804. Adja2Vy = ephAdja2.data.VY,
  1805. Adja2Vz = ephAdja2.data.VZ,
  1806. });
  1807. var res = PosApi.X3_PosTwoDfo(cgRes, StationRes, dto.CalcConfidence);
  1808. PosRes posRes = new PosRes()
  1809. {
  1810. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1811. SigTime = dto.SigTime,
  1812. TaskInfoID = runTask.ID,
  1813. CgResID = cgRes.ID,
  1814. CheckResID = ckRes.ID,
  1815. PosLon = res[0],
  1816. PosLat = res[1],
  1817. MirrLon = res[3],
  1818. MirrLat = res[4],
  1819. Confidence = (int)res[6],
  1820. PosResType = EnumPosResType.X3TwoDfo,
  1821. };
  1822. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1823. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1824. posRes = db.PosRes.Add(posRes);
  1825. await db.SaveChangesAsync();
  1826. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1827. return Success(MapDto(posRes));
  1828. }
  1829. }
  1830. #endregion
  1831. #region 双星时频差定位
  1832. /// <summary>
  1833. /// 双星时频差带参定位(含星历)
  1834. /// </summary>
  1835. /// <param name="dto">定位参数</param>
  1836. /// <returns></returns>
  1837. [HttpPost]
  1838. public async Task<AjaxResult<PosResDto>> PosX2DtoDfoAsync(X2DtoDfoPosDto dto)
  1839. {
  1840. TaskInfo runTask;
  1841. using (RHDWContext db = new RHDWContext())
  1842. {
  1843. if (dto.TaskID == null)
  1844. {
  1845. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1846. && p.PosType == EnumPosType.X2Dfo && p.TaskState == EnumTaskState.Running);
  1847. if (runTask == null)
  1848. {
  1849. Serilog.Log.Warning($"接收到双星时频差带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  1850. return Error<PosResDto>($"多模式融合定位平台没有启动双星时频差定位任务");
  1851. }
  1852. }
  1853. else
  1854. {
  1855. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1856. if (runTask == null)
  1857. {
  1858. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1859. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1860. }
  1861. }
  1862. }
  1863. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1864. {
  1865. var StationRes = db.StationRes.Add(new StationRes()
  1866. {
  1867. SatTxLon = dto.SatTxLon,
  1868. SatTxLat = dto.SatTxLat,
  1869. RefLon = dto.RefLon,
  1870. RefLat = dto.RefLat,
  1871. });
  1872. var ckRes = new CheckRes()
  1873. {
  1874. FileName = dto.CheckRes?.FileName,
  1875. SmpStart = dto.CheckRes?.SmpStart,
  1876. SmpCount = dto.CheckRes?.SmpCount,
  1877. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1878. ModRate = dto.CheckRes?.ModRate,
  1879. ModType = dto.CheckRes?.ModType,
  1880. UserName = dto.CheckRes?.UserName,
  1881. FfcHz = dto.CheckRes?.FfcHz,
  1882. Snr = dto.CheckRes?.Snr
  1883. };
  1884. db.CheckRes.Add(ckRes);
  1885. var cgRes = db.CgRes.Add(new CgRes()
  1886. {
  1887. SigTime = dto.SigTime,
  1888. Dto1 = Math.Round(dto.Dto, 10),
  1889. Dfo1 = Math.Round(dto.Dfo, 10),
  1890. Snr1 = Math.Round(dto.Snr, 1),
  1891. YbMainDto = Math.Round(dto.YbMainDto, 10),
  1892. YbAdja1Dto = Math.Round(dto.YbAdjaDto, 10),
  1893. YbMainDfo = Math.Round(dto.YbMainDfo, 10),
  1894. YbAdja1Dfo = Math.Round(dto.YbAdjaDfo, 10),
  1895. TarFreqUp = dto.TarFreqUp,
  1896. TarFreqDown = dto.TarFreqDown,
  1897. RefFreqUp = dto.RefFreqUp,
  1898. RefFreqDown = dto.RefFreqDown,
  1899. StationResID = StationRes.ID,
  1900. MainCode = dto.MainCode,
  1901. Adja1Code = dto.AdjaCode,
  1902. TaskID = runTask.ID,
  1903. MainX = dto.MainX,
  1904. MainY = dto.MainY,
  1905. MainZ = dto.MainZ,
  1906. MainVx = dto.MainVx,
  1907. MainVy = dto.MainVy,
  1908. MainVz = dto.MainVz,
  1909. Adja1X = dto.AdjaX,
  1910. Adja1Y = dto.AdjaY,
  1911. Adja1Z = dto.AdjaZ,
  1912. Adja1Vx = dto.AdjaVx,
  1913. Adja1Vy = dto.AdjaVy,
  1914. Adja1Vz = dto.AdjaVz,
  1915. });
  1916. var res = PosApi.X2_PosDtoDfo(cgRes, StationRes, dto.CalcConfidence);
  1917. PosRes posRes = new PosRes()
  1918. {
  1919. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1920. SigTime = cgRes.SigTime,
  1921. TaskInfoID = runTask.ID,
  1922. CgResID = cgRes.ID,
  1923. CheckResID = ckRes.ID,
  1924. PosLon = res[0],
  1925. PosLat = res[1],
  1926. MirrLon = res[3],
  1927. MirrLat = res[4],
  1928. Confidence = (int)res[6],
  1929. PosResType = EnumPosResType.X2Dfo,
  1930. };
  1931. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1932. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1933. posRes = db.PosRes.Add(posRes);
  1934. await db.SaveChangesAsync();
  1935. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1936. return Success(MapDto(posRes));
  1937. }
  1938. }
  1939. /// <summary>
  1940. /// 双星时频差带参定位(无星历)
  1941. /// </summary>
  1942. /// <returns>返回定位结果ID</returns>
  1943. [HttpPost]
  1944. public async Task<AjaxResult<PosResDto>> PosX2DtoDfoNoXlAsync(X2DtoDfoNoXlPosDto dto)
  1945. {
  1946. TaskInfo runTask;
  1947. using (RHDWContext db = new RHDWContext())
  1948. {
  1949. if (dto.TaskID == null)
  1950. {
  1951. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1952. && p.PosType == EnumPosType.X2Dfo && p.TaskState == EnumTaskState.Running);
  1953. if (runTask == null)
  1954. {
  1955. Serilog.Log.Warning($"接收到双星时频差带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  1956. return Error<PosResDto>($"多模式融合定位平台没有启动双星时频差定位任务");
  1957. }
  1958. }
  1959. else
  1960. {
  1961. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1962. if (runTask == null)
  1963. {
  1964. Serilog.Log.Warning($"找不到任务,ID={dto.TaskID}");
  1965. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1966. }
  1967. }
  1968. }
  1969. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  1970. if (xl1 == null)
  1971. {
  1972. Serilog.Log.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1973. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1974. }
  1975. Serilog.Log.Information($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1976. var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime);
  1977. if (xl2 == null)
  1978. {
  1979. Serilog.Log.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  1980. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  1981. }
  1982. Serilog.Log.Information($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1983. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  1984. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  1985. if (ephMain.code != 200)
  1986. {
  1987. Serilog.Log.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  1988. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  1989. }
  1990. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  1991. var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  1992. if (ephAdja.code != 200)
  1993. {
  1994. Serilog.Log.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}");
  1995. return Error<PosResDto>($"推算卫星{dto.AdjaCode}的ECEF星历出错");
  1996. }
  1997. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1998. {
  1999. var StationRes = db.StationRes.Add(new StationRes()
  2000. {
  2001. SatTxLon = dto.SatTxLon,
  2002. SatTxLat = dto.SatTxLat,
  2003. RefLon = dto.RefLon,
  2004. RefLat = dto.RefLat,
  2005. });
  2006. var ckRes = new CheckRes()
  2007. {
  2008. FileName = dto.CheckRes?.FileName,
  2009. SmpStart = dto.CheckRes?.SmpStart,
  2010. SmpCount = dto.CheckRes?.SmpCount,
  2011. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  2012. ModRate = dto.CheckRes?.ModRate,
  2013. ModType = dto.CheckRes?.ModType,
  2014. UserName = dto.CheckRes?.UserName,
  2015. FfcHz = dto.CheckRes?.FfcHz,
  2016. Snr = dto.CheckRes?.Snr
  2017. };
  2018. db.CheckRes.Add(ckRes);
  2019. var cgRes = db.CgRes.Add(new CgRes()
  2020. {
  2021. SigTime = dto.SigTime,
  2022. Dto1 = Math.Round(dto.Dto, 10),
  2023. Dfo1 = Math.Round(dto.Dfo, 10),
  2024. Snr1 = Math.Round(dto.Snr, 1),
  2025. YbMainDto = Math.Round(dto.YbMainDto, 10),
  2026. YbAdja1Dto = Math.Round(dto.YbAdjaDto, 10),
  2027. YbMainDfo = Math.Round(dto.YbMainDfo, 10),
  2028. YbAdja1Dfo = Math.Round(dto.YbAdjaDfo, 10),
  2029. TarFreqUp = dto.TarFreqUp,
  2030. TarFreqDown = dto.TarFreqDown,
  2031. RefFreqUp = dto.RefFreqUp,
  2032. RefFreqDown = dto.RefFreqDown,
  2033. StationResID = StationRes.ID,
  2034. MainCode = dto.MainCode,
  2035. Adja1Code = dto.AdjaCode,
  2036. MainXlTime = ephMain.data.TleTime,
  2037. Adja1XlTime = ephAdja.data.TleTime,
  2038. TaskID = runTask.ID,
  2039. MainX = ephMain.data.X,
  2040. MainY = ephMain.data.Y,
  2041. MainZ = ephMain.data.Z,
  2042. MainVx = ephMain.data.VX,
  2043. MainVy = ephMain.data.VY,
  2044. MainVz = ephMain.data.VZ,
  2045. Adja1X = ephAdja.data.X,
  2046. Adja1Y = ephAdja.data.Y,
  2047. Adja1Z = ephAdja.data.Z,
  2048. Adja1Vx = ephAdja.data.VX,
  2049. Adja1Vy = ephAdja.data.VY,
  2050. Adja1Vz = ephAdja.data.VZ,
  2051. });
  2052. var res = PosApi.X2_PosDtoDfo(cgRes, StationRes, dto.CalcConfidence);
  2053. PosRes posRes = new PosRes()
  2054. {
  2055. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  2056. SigTime = dto.SigTime,
  2057. TaskInfoID = runTask.ID,
  2058. CgResID = cgRes.ID,
  2059. CheckResID = ckRes.ID,
  2060. PosLon = res[0],
  2061. PosLat = res[1],
  2062. MirrLon = res[3],
  2063. MirrLat = res[4],
  2064. Confidence = (int)res[6],
  2065. PosResType = EnumPosResType.X2Dfo,
  2066. };
  2067. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  2068. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  2069. posRes = db.PosRes.Add(posRes);
  2070. await db.SaveChangesAsync();
  2071. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  2072. return Success(MapDto(posRes));
  2073. }
  2074. }
  2075. #endregion
  2076. private PosResDto MapDto(PosRes res)
  2077. {
  2078. return new PosResDto()
  2079. {
  2080. ID = res.ID,
  2081. FreqUpHz = res.FreqUpHz,
  2082. SigTime = res.SigTime,
  2083. TaskInfoID = res.TaskInfoID,
  2084. TarName = res.TargetInfo?.TargetName,
  2085. PosLon = res.PosLon,
  2086. PosLat = res.PosLat,
  2087. MirrLon = res.MirrLon,
  2088. MirrLat = res.MirrLat,
  2089. CheckType = res.CheckRes?.PosCheckType == null ? "" : res.CheckRes?.PosCheckType?.GetEnumDisplayName(),
  2090. TargetState = (EnumTargetStateDto)res.TargetState,
  2091. PosResType = (EnumPosResTypeDto)res.PosResType,
  2092. Confidence = res.Confidence,
  2093. };
  2094. }
  2095. private ModelPosRes MapModel(PosRes res)
  2096. {
  2097. return new ModelPosRes()
  2098. {
  2099. ID = res.ID,
  2100. FreqUpHz = res.FreqUpHz,
  2101. SigTime = res.SigTime,
  2102. TaskInfoID = res.TaskInfoID,
  2103. PosLon = res.PosLon,
  2104. PosLat = res.PosLat,
  2105. MirrLon = res.MirrLon,
  2106. MirrLat = res.MirrLat,
  2107. TargetState = res.TargetState,
  2108. PosResType = res.PosResType,
  2109. CgResID = res.CgResID,
  2110. CheckRes = res.CheckRes,
  2111. CheckResID = res.CheckResID,
  2112. ColorKey = res.ColorKey,
  2113. CreateTime = res.CreateTime,
  2114. CxResID = res.CxResID,
  2115. StationResID = res.StationResID,
  2116. TargetInfo = res.TargetInfo,
  2117. TargetInfoID = res.TargetInfoID,
  2118. UpdateTime = res.UpdateTime,
  2119. Confidence = res.Confidence,
  2120. };
  2121. }
  2122. }
  2123. }