PosController.cs 108 KB

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