PosController.cs 110 KB

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