PosController.cs 69 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498
  1. using System;
  2. using System.Configuration;
  3. using System.Data.Entity;
  4. using System.Data.Entity.Infrastructure;
  5. using System.Threading.Tasks;
  6. using System.Web.Http;
  7. using XdCxRhDW.Api;
  8. using XdCxRhDW.App.Model;
  9. using XdCxRhDW.Dto;
  10. using XdCxRhDW.Entity;
  11. using XdCxRhDW.Repostory;
  12. using XdCxRhDW.WebApi;
  13. namespace XdCxRhDW.App.Controllers
  14. {
  15. /// <summary>
  16. /// 定位功能相关接口
  17. /// </summary>
  18. public class PosController : BaseController
  19. {
  20. #region 两星一地定位
  21. /// <summary>
  22. /// 两星一地带参定位(含星历)
  23. /// </summary>
  24. /// <param name="dto">定位参数</param>
  25. /// <returns></returns>
  26. [HttpPost]
  27. public async Task<AjaxResult<PosResDto>> PosX2D1Async(X2D1PosDto dto)
  28. {
  29. try
  30. {
  31. TaskInfo runTask;
  32. using (RHDWContext db = new RHDWContext())
  33. {
  34. if (dto.TaskID == null)
  35. {
  36. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  37. && p.PosType == EnumPosType.X2D1Ref && p.TaskState == EnumTaskState.Running);
  38. if (runTask == null)
  39. {
  40. XdCxRhDW.Framework.LogHelper.Warning($"接收到两星一地带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  41. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  42. }
  43. }
  44. else
  45. {
  46. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  47. if (runTask == null)
  48. {
  49. XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  50. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  51. }
  52. }
  53. }
  54. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  55. {
  56. var StationRes = db.StationRes.Add(new StationRes()
  57. {
  58. MSatTxLon = dto.MSatTxLon,
  59. MSatTxLat = dto.MSatTxLat,
  60. N1SatTxLon = dto.NSatTxLon,
  61. N1SatTxLat = dto.NSatTxLat,
  62. CdbTxLon = dto.CdbTxLon,
  63. CdbTxLat = dto.CdbTxLat,
  64. RefLon = dto.RefLon,
  65. RefLat = dto.RefLat,
  66. });
  67. var ckRes = new CheckRes()
  68. {
  69. FileName = dto.CheckRes?.FileName,
  70. SmpStart = dto.CheckRes?.SmpStart,
  71. SmpCount = dto.CheckRes?.SmpCount,
  72. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  73. ModRate = dto.CheckRes?.ModRate,
  74. ModType = dto.CheckRes?.ModType,
  75. UserName = dto.CheckRes?.UserName,
  76. FfcHz = dto.CheckRes?.FfcHz,
  77. Snr = dto.CheckRes?.Snr
  78. };
  79. ckRes = db.CheckRes.Add(ckRes);
  80. var cgRes = db.CgRes.Add(new CgRes()
  81. {
  82. SigTime = dto.SigTime,
  83. Dto1 = Math.Round(dto.SxDto, 10),
  84. Dfo1 = Math.Round(dto.SxDfo, 10),
  85. Snr1 = Math.Round(dto.SxSnr, 1),
  86. DtoCdb = Math.Round(dto.XdDto, 10),
  87. DfoCdb = Math.Round(dto.XdDfo, 10),
  88. SnrCdb = Math.Round(dto.XdSnr, 1),
  89. YbMainDto = Math.Round(dto.MainYbDto, 10),
  90. YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10),
  91. StationResID = StationRes.ID,
  92. MainCode = dto.MainCode,
  93. Adja1Code = dto.AdjaCode,
  94. TaskID = runTask.ID,
  95. MainX = dto.MainX,
  96. MainY = dto.MainY,
  97. MainZ = dto.MainZ,
  98. Adja1X = dto.AdjaX,
  99. Adja1Y = dto.AdjaY,
  100. Adja1Z = dto.AdjaZ,
  101. MainVx = dto.MainVX,
  102. MainVy = dto.MainVY,
  103. MainVz = dto.MainVZ,
  104. Adja1Vx = dto.AdjaVX,
  105. Adja1Vy = dto.AdjaVY,
  106. Adja1Vz = dto.AdjaVZ,
  107. TarFreqUp = dto.FreqUp,
  108. TarFreqDown = dto.FreqDown,
  109. });
  110. var res = PosApi.X2D1_Pos(cgRes, StationRes, dto.CalcConfidence);
  111. PosRes posRes = new PosRes()
  112. {
  113. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  114. SigTime = cgRes.SigTime,
  115. TaskInfoID = runTask.ID,
  116. CgResID = cgRes.ID,
  117. CheckResID = ckRes.ID,
  118. PosLon = res[0],
  119. PosLat = res[1],
  120. MirrLon = res[3],
  121. MirrLat = res[4],
  122. Confidence = (int)res[6],
  123. PosResType = EnumPosResType.X2D1,
  124. };
  125. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  126. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  127. if (dto.CalcConfidence)
  128. {
  129. }
  130. posRes = db.PosRes.Add(posRes);
  131. await db.SaveChangesAsync();
  132. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  133. return Success(MapDto(posRes));
  134. }
  135. }
  136. catch (Exception)
  137. {
  138. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  139. {
  140. db.SyncDb();
  141. }
  142. throw;
  143. }
  144. }
  145. /// <summary>
  146. /// 两星一地带参定位(无星历)
  147. /// </summary>
  148. /// <returns>返回定位结果ID</returns>
  149. [HttpPost]
  150. public async Task<AjaxResult<PosResDto>> PosX2D1NoXlAsync(X2D1NoXlPosDto dto)
  151. {
  152. try
  153. {
  154. TaskInfo runTask;
  155. using (RHDWContext db = new RHDWContext())
  156. {
  157. if (dto.TaskID == null)
  158. {
  159. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  160. && p.PosType == EnumPosType.X2D1Ref && p.TaskState == EnumTaskState.Running);
  161. if (runTask == null)
  162. {
  163. XdCxRhDW.Framework.LogHelper.Warning($"接收到两星一地带参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  164. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  165. }
  166. }
  167. else
  168. {
  169. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  170. if (runTask == null)
  171. {
  172. XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  173. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  174. }
  175. }
  176. }
  177. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  178. if (xl1 == null)
  179. {
  180. XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  181. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  182. }
  183. XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  184. var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime);
  185. if (xl2 == null)
  186. {
  187. XdCxRhDW.Framework.LogHelper.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  188. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  189. }
  190. XdCxRhDW.Framework.LogHelper.Info($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  191. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  192. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  193. if (ephMain.code != 200)
  194. {
  195. XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  196. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  197. }
  198. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  199. var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  200. if (ephAdja.code != 200)
  201. {
  202. XdCxRhDW.Framework.LogHelper.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}");
  203. return Error<PosResDto>($"推算卫星{dto.AdjaCode}的ECEF星历出错");
  204. }
  205. //#warning 测试代码
  206. //var tarEcef = PhysicsHelper.GeoToEcef((110, 17, 0));
  207. //var ecefXl1 = (ephMain.data.X, ephMain.data.Y, ephMain.data.Z);
  208. //var ecefXl2 = (ephAdja.data.X, ephAdja.data.Y, ephAdja.data.Z);
  209. //var ecefCdb = PhysicsHelper.GeoToEcef((dto.CdbTxLon, dto.CdbTxLat, 0));
  210. //var ecefRec = PhysicsHelper.GeoToEcef((dto.SatTxLon, dto.SatTxLat, 0));
  211. //var dt1 = PhysicsHelper.Dto(tarEcef, ecefXl1, ecefRec);
  212. //var dt2 = PhysicsHelper.Dto(tarEcef, ecefXl2, ecefRec);
  213. //var dt3 = PhysicsHelper.Dto(tarEcef, ecefCdb);
  214. //var dto1 = dt1 - dt2;
  215. //var dto2 = dt1 - dt3;
  216. //dto.SxDto = Math.Round(dto1 * 1e6 + r.Next(-10, 10) + r.NextDouble(), 3);
  217. //dto.XdDto = Math.Round(dto2 * 1e6 + r.Next(-10, 10) + r.NextDouble(), 3);
  218. //var refEcef = PhysicsHelper.GeoToEcef((dto.RefLon, dto.RefLat, 0));
  219. //var refdt1 = PhysicsHelper.Dto(refEcef, ecefXl1, ecefRec);
  220. //var refdt2 = PhysicsHelper.Dto(refEcef, ecefXl2, ecefRec);
  221. //dto.MainYbDto = Math.Round(refdt1 * 1e6, 3);
  222. //dto.AdjaYbDto = Math.Round(refdt2 * 1e6, 3);
  223. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  224. {
  225. var StationRes = db.StationRes.Add(new StationRes()
  226. {
  227. MSatTxLon = dto.SatTxLon,
  228. MSatTxLat = dto.SatTxLat,
  229. CdbTxLon = dto.CdbTxLon,
  230. CdbTxLat = dto.CdbTxLat,
  231. RefLon = dto.RefLon,
  232. RefLat = dto.RefLat,
  233. });
  234. var ckRes = new CheckRes()
  235. {
  236. FileName = dto.CheckRes?.FileName,
  237. SmpStart = dto.CheckRes?.SmpStart,
  238. SmpCount = dto.CheckRes?.SmpCount,
  239. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  240. ModRate = dto.CheckRes?.ModRate,
  241. ModType = dto.CheckRes?.ModType,
  242. UserName = dto.CheckRes?.UserName,
  243. FfcHz = dto.CheckRes?.FfcHz,
  244. Snr = dto.CheckRes?.Snr
  245. };
  246. db.CheckRes.Add(ckRes);
  247. var cgRes = db.CgRes.Add(new CgRes()
  248. {
  249. SigTime = dto.SigTime,
  250. Dto1 = Math.Round(dto.SxDto, 10),
  251. Dfo1 = Math.Round(dto.SxDfo, 10),
  252. Snr1 = Math.Round(dto.SxSnr, 1),
  253. DtoCdb = Math.Round(dto.XdDto, 10),
  254. DfoCdb = Math.Round(dto.XdDfo, 10),
  255. SnrCdb = Math.Round(dto.XdSnr, 1),
  256. YbMainDto = Math.Round(dto.MainYbDto, 10),
  257. YbAdja1Dto = Math.Round(dto.AdjaYbDto, 10),
  258. StationResID = StationRes.ID,
  259. MainCode = dto.MainCode,
  260. MainXlTime = ephMain.data.TleTime,
  261. Adja1Code = dto.AdjaCode,
  262. Adja1XlTime = ephAdja.data.TleTime,
  263. TaskID = runTask.ID,
  264. MainX = ephMain.data.X,
  265. MainY = ephMain.data.Y,
  266. MainZ = ephMain.data.Z,
  267. MainVx = ephMain.data.VX,
  268. MainVy = ephMain.data.VY,
  269. MainVz = ephMain.data.VZ,
  270. Adja1Vx = ephAdja.data.VX,
  271. Adja1Vy = ephAdja.data.VY,
  272. Adja1Vz = ephAdja.data.VZ,
  273. Adja1X = ephAdja.data.X,
  274. Adja1Y = ephAdja.data.Y,
  275. Adja1Z = ephAdja.data.Z,
  276. TarFreqUp = dto.FreqUp,
  277. TarFreqDown = dto.FreqDown,
  278. });
  279. var res = PosApi.X2D1_Pos(cgRes, StationRes, dto.CalcConfidence);
  280. PosRes posRes = new PosRes()
  281. {
  282. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  283. SigTime = dto.SigTime,
  284. TaskInfoID = runTask.ID,
  285. CgResID = cgRes.ID,
  286. CheckResID = ckRes.ID,
  287. PosLon = res[0],
  288. PosLat = res[1],
  289. MirrLon = res[3],
  290. MirrLat = res[4],
  291. Confidence = (int)res[6],
  292. PosResType = EnumPosResType.X2D1,
  293. };
  294. if (posRes.PosLon == 999 || posRes.PosLat == 999)//有参无结果时做无参
  295. {
  296. res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  297. posRes = new PosRes()
  298. {
  299. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  300. SigTime = dto.SigTime,
  301. TaskInfoID = runTask.ID,
  302. CgResID = cgRes.ID,
  303. CheckResID = ckRes.ID,
  304. PosLon = res[0],
  305. PosLat = res[1],
  306. MirrLon = res[3],
  307. MirrLat = res[4],
  308. Confidence = (int)res[6],
  309. PosResType = EnumPosResType.X2D1NoRef,
  310. };
  311. }
  312. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  313. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  314. posRes = db.PosRes.Add(posRes);
  315. await db.SaveChangesAsync();
  316. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  317. return Success(MapDto(posRes));
  318. }
  319. }
  320. catch (Exception)
  321. {
  322. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  323. {
  324. db.SyncDb();
  325. }
  326. throw;
  327. }
  328. }
  329. /// <summary>
  330. /// 两星一地无参定位(含星历)
  331. /// </summary>
  332. /// <param name="dto">定位参数</param>
  333. /// <returns></returns>
  334. [HttpPost]
  335. public async Task<AjaxResult<PosResDto>> PosX2D1NoParAsync(X2D1NoParPosDto dto)
  336. {
  337. try
  338. {
  339. TaskInfo runTask;
  340. using (RHDWContext db = new RHDWContext())
  341. {
  342. if (dto.TaskID == null)
  343. {
  344. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  345. && p.PosType == EnumPosType.X2D1NoRef && p.TaskState == EnumTaskState.Running);
  346. if (runTask == null)
  347. {
  348. await XdCxRhDW.UI.Lib.LogHelper.Warning($"接收到两星一地无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  349. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  350. }
  351. }
  352. else
  353. {
  354. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  355. if (runTask == null)
  356. {
  357. await XdCxRhDW.UI.Lib.LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  358. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  359. }
  360. }
  361. }
  362. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  363. {
  364. var StationRes = db.StationRes.Add(new StationRes()
  365. {
  366. MSatTxLon = dto.SatTxLon,
  367. MSatTxLat = dto.SatTxLat,
  368. CdbTxLon = dto.CdbTxLon,
  369. CdbTxLat = dto.CdbTxLat,
  370. });
  371. var ckRes = new CheckRes()
  372. {
  373. FileName = dto.CheckRes?.FileName,
  374. SmpStart = dto.CheckRes?.SmpStart,
  375. SmpCount = dto.CheckRes?.SmpCount,
  376. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  377. ModRate = dto.CheckRes?.ModRate,
  378. ModType = dto.CheckRes?.ModType,
  379. UserName = dto.CheckRes?.UserName,
  380. FfcHz = dto.CheckRes?.FfcHz,
  381. Snr = dto.CheckRes?.Snr
  382. };
  383. db.CheckRes.Add(ckRes);
  384. var cgRes = db.CgRes.Add(new CgRes()
  385. {
  386. SigTime = dto.SigTime,
  387. Dto1 = Math.Round(dto.SxDto, 10),
  388. Dfo1 = Math.Round(dto.SxDfo, 10),
  389. Snr1 = Math.Round(dto.SxSnr, 1),
  390. DtoCdb = Math.Round(dto.XdDto, 10),
  391. DfoCdb = Math.Round(dto.XdDfo, 10),
  392. SnrCdb = Math.Round(dto.XdSnr, 1),
  393. StationResID = StationRes.ID,
  394. MainCode = dto.MainCode,
  395. Adja1Code = dto.AdjaCode,
  396. TaskID = runTask.ID,
  397. MainX = dto.MainX,
  398. MainY = dto.MainY,
  399. MainZ = dto.MainZ,
  400. Adja1X = dto.AdjaX,
  401. Adja1Y = dto.AdjaY,
  402. Adja1Z = dto.AdjaZ,
  403. MainVx = dto.MainVX,
  404. MainVy = dto.MainVY,
  405. MainVz = dto.MainVZ,
  406. Adja1Vx = dto.AdjaVX,
  407. Adja1Vy = dto.AdjaVY,
  408. Adja1Vz = dto.AdjaVZ,
  409. TarFreqUp = dto.FreqUp,
  410. TarFreqDown = dto.FreqDown,
  411. });
  412. double[] res;
  413. if (ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"] != null
  414. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "false"
  415. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "0")
  416. {
  417. res = PosApi.X2D1_PosNoRef_ZL(cgRes, StationRes);
  418. }
  419. else
  420. {
  421. res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  422. }
  423. PosRes posRes = new PosRes()
  424. {
  425. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  426. SigTime = cgRes.SigTime,
  427. TaskInfoID = runTask.ID,
  428. CgResID = cgRes.ID,
  429. CheckResID = ckRes.ID,
  430. PosLon = res[0],
  431. PosLat = res[1],
  432. MirrLon = res[3],
  433. MirrLat = res[4],
  434. Confidence = (int)res[6],
  435. PosResType = EnumPosResType.X2D1NoRef,
  436. };
  437. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  438. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  439. posRes = db.PosRes.Add(posRes);
  440. await db.SaveChangesAsync();
  441. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  442. return Success(MapDto(posRes));
  443. }
  444. }
  445. catch (Exception)
  446. {
  447. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  448. {
  449. db.SyncDb();
  450. }
  451. throw;
  452. }
  453. }
  454. /// <summary>
  455. /// 两星一地无参定位(无星历)
  456. /// </summary>
  457. /// <returns>返回定位结果ID</returns>
  458. [HttpPost]
  459. public async Task<AjaxResult<PosResDto>> PosX2D1NoXlNoParAsync(X2D1NoXlNoParlPosDto dto)
  460. {
  461. try
  462. {
  463. TaskInfo runTask;
  464. using (RHDWContext db = new RHDWContext())
  465. {
  466. if (dto.TaskID == null)
  467. {
  468. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  469. && p.PosType == EnumPosType.X2D1NoRef && p.TaskState == EnumTaskState.Running);
  470. if (runTask == null)
  471. {
  472. await XdCxRhDW.UI.Lib.LogHelper.Warning($"接收到两星一地无参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  473. return Error<PosResDto>($"多模式融合定位平台没有启动两星一地定位任务");
  474. }
  475. }
  476. else
  477. {
  478. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  479. if (runTask == null)
  480. {
  481. await XdCxRhDW.UI.Lib.LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  482. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  483. }
  484. }
  485. }
  486. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  487. if (xl1 == null)
  488. {
  489. await XdCxRhDW.UI.Lib.LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  490. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  491. }
  492. await XdCxRhDW.UI.Lib.LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  493. var xl2 = await XlRepository.GetLatestAsync(dto.AdjaCode, dto.SigTime);
  494. if (xl2 == null)
  495. {
  496. await XdCxRhDW.UI.Lib.LogHelper.Error($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  497. return Error<PosResDto>($"系统缺少编号{dto.AdjaCode}卫星的星历!");
  498. }
  499. await XdCxRhDW.UI.Lib.LogHelper.Info($"卫星{dto.AdjaCode}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  500. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  501. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  502. if (ephMain.code != 200)
  503. {
  504. await XdCxRhDW.UI.Lib.LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  505. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  506. }
  507. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  508. var ephAdja = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  509. if (ephAdja.code != 200)
  510. {
  511. await XdCxRhDW.UI.Lib.LogHelper.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}");
  512. return Error<PosResDto>($"推算卫星{dto.AdjaCode}的ECEF星历出错");
  513. }
  514. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  515. {
  516. var StationRes = db.StationRes.Add(new StationRes()
  517. {
  518. MSatTxLon = dto.SatTxLon,
  519. MSatTxLat = dto.SatTxLat,
  520. CdbTxLon = dto.CdbTxLon,
  521. CdbTxLat = dto.CdbTxLat,
  522. });
  523. var ckRes = new CheckRes()
  524. {
  525. FileName = dto.CheckRes?.FileName,
  526. SmpStart = dto.CheckRes?.SmpStart,
  527. SmpCount = dto.CheckRes?.SmpCount,
  528. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  529. ModRate = dto.CheckRes?.ModRate,
  530. ModType = dto.CheckRes?.ModType,
  531. UserName = dto.CheckRes?.UserName,
  532. FfcHz = dto.CheckRes?.FfcHz,
  533. Snr = dto.CheckRes?.Snr
  534. };
  535. db.CheckRes.Add(ckRes);
  536. var cgRes = db.CgRes.Add(new CgRes()
  537. {
  538. SigTime = dto.SigTime,
  539. Dto1 = Math.Round(dto.SxDto, 10),
  540. Dfo1 = Math.Round(dto.SxDfo, 10),
  541. Snr1 = Math.Round(dto.SxSnr, 1),
  542. DtoCdb = Math.Round(dto.XdDto, 10),
  543. DfoCdb = Math.Round(dto.XdDfo, 10),
  544. SnrCdb = Math.Round(dto.XdSnr, 1),
  545. StationResID = StationRes.ID,
  546. MainCode = dto.MainCode,
  547. Adja1Code = dto.AdjaCode,
  548. MainXlTime = ephMain.data.TleTime,
  549. Adja1XlTime = ephAdja.data.TleTime,
  550. TaskID = runTask.ID,
  551. MainX = ephMain.data.X,
  552. MainY = ephMain.data.Y,
  553. MainZ = ephMain.data.Z,
  554. Adja1X = ephAdja.data.X,
  555. Adja1Y = ephAdja.data.Y,
  556. Adja1Z = ephAdja.data.Z,
  557. MainVx = ephMain.data.VX,
  558. MainVy = ephMain.data.VY,
  559. MainVz = ephMain.data.VZ,
  560. Adja1Vx = ephAdja.data.VX,
  561. Adja1Vy = ephAdja.data.VY,
  562. Adja1Vz = ephAdja.data.VZ,
  563. TarFreqUp = dto.FreqUp,
  564. TarFreqDown = dto.FreqDown,
  565. });
  566. double[] res;
  567. if (ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"] != null
  568. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "false"
  569. && ConfigurationManager.AppSettings["UseNewPosX2D1NoRef"].ToLower() != "0")
  570. {
  571. res = PosApi.X2D1_PosNoRef_ZL(cgRes, StationRes);
  572. }
  573. else
  574. {
  575. res = PosApi.X2D1_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  576. }
  577. PosRes posRes = new PosRes()
  578. {
  579. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  580. SigTime = dto.SigTime,
  581. TaskInfoID = runTask.ID,
  582. CgResID = cgRes.ID,
  583. CheckResID = ckRes.ID,
  584. PosLon = res[0],
  585. PosLat = res[1],
  586. MirrLon = res[3],
  587. MirrLat = res[4],
  588. Confidence = (int)res[6],
  589. PosResType = EnumPosResType.X2D1NoRef,
  590. };
  591. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  592. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  593. posRes = db.PosRes.Add(posRes);
  594. await db.SaveChangesAsync();
  595. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  596. return Success(MapDto(posRes));
  597. }
  598. }
  599. catch (Exception)
  600. {
  601. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  602. {
  603. db.SyncDb();
  604. }
  605. throw;
  606. }
  607. }
  608. #endregion
  609. #region 三星双时差定位
  610. /// <summary>
  611. /// 三星双时差带参定位(含星历)
  612. /// </summary>
  613. /// <param name="dto">定位参数</param>
  614. /// <returns></returns>
  615. [HttpPost]
  616. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoAsync(X3TwoDtoPosDto dto)
  617. {
  618. try
  619. {
  620. TaskInfo runTask;
  621. using (RHDWContext db = new RHDWContext())
  622. {
  623. if (dto.TaskID == null)
  624. {
  625. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  626. && p.PosType == EnumPosType.X3TwoDtoRef && p.TaskState == EnumTaskState.Running);
  627. if (runTask == null)
  628. {
  629. XdCxRhDW.Framework.LogHelper.Warning($"接收到三星双时差带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  630. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  631. }
  632. }
  633. else
  634. {
  635. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  636. if (runTask == null)
  637. {
  638. XdCxRhDW.Framework.LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  639. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  640. }
  641. }
  642. }
  643. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  644. {
  645. var StationRes = db.StationRes.Add(new StationRes()
  646. {
  647. MSatTxLon = dto.MSatTxLon,
  648. MSatTxLat = dto.MSatTxLat,
  649. N1SatTxLon = dto.N1SatTxLon,
  650. N1SatTxLat = dto.N1SatTxLat,
  651. N2SatTxLon = dto.N2SatTxLon,
  652. N2SatTxLat = dto.N2SatTxLat,
  653. RefLon = dto.RefLon,
  654. RefLat = dto.RefLat,
  655. });
  656. var ckRes = new CheckRes()
  657. {
  658. FileName = dto.CheckRes?.FileName,
  659. SmpStart = dto.CheckRes?.SmpStart,
  660. SmpCount = dto.CheckRes?.SmpCount,
  661. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  662. ModRate = dto.CheckRes?.ModRate,
  663. ModType = dto.CheckRes?.ModType,
  664. UserName = dto.CheckRes?.UserName,
  665. FfcHz = dto.CheckRes?.FfcHz,
  666. Snr = dto.CheckRes?.Snr
  667. };
  668. db.CheckRes.Add(ckRes);
  669. var cgRes = db.CgRes.Add(new CgRes()
  670. {
  671. SigTime = dto.SigTime,
  672. Dto1 = Math.Round(dto.Dto1, 10),
  673. Dfo1 = Math.Round(dto.Dfo1, 10),
  674. Snr1 = Math.Round(dto.Snr1, 1),
  675. Dto2 = Math.Round(dto.Dto2, 10),
  676. Dfo2 = Math.Round(dto.Dfo2, 10),
  677. Snr2 = Math.Round(dto.Snr2, 1),
  678. YbMainDto = Math.Round(dto.YbMainDto, 10),
  679. YbAdja1Dto = Math.Round(dto.YbAdja1Dto, 10),
  680. YbAdja2Dto = Math.Round(dto.YbAdja2Dto, 10),
  681. StationResID = StationRes.ID,
  682. MainCode = dto.MainCode,
  683. Adja1Code = dto.Adja1Code,
  684. Adja2Code = dto.Adja2Code,
  685. TaskID = runTask.ID,
  686. MainX = dto.MainX,
  687. MainY = dto.MainY,
  688. MainZ = dto.MainZ,
  689. MainVx = dto.MainVX,
  690. MainVy = dto.MainVY,
  691. MainVz = dto.MainVZ,
  692. Adja1X = dto.Adja1X,
  693. Adja1Y = dto.Adja1Y,
  694. Adja1Z = dto.Adja1Z,
  695. Adja1Vx = dto.Adja1VX,
  696. Adja1Vy = dto.Adja1VY,
  697. Adja1Vz = dto.Adja1VZ,
  698. Adja2X = dto.Adja2X,
  699. Adja2Y = dto.Adja2Y,
  700. Adja2Z = dto.Adja2Z,
  701. Adja2Vx = dto.Adja2VX,
  702. Adja2Vy = dto.Adja2VY,
  703. Adja2Vz = dto.Adja2VZ,
  704. TarFreqUp = dto.FreqUp,
  705. TarFreqDown = dto.FreqDown,
  706. });
  707. var res = PosApi.X3_Pos(cgRes, StationRes, dto.CalcConfidence);
  708. PosRes posRes = new PosRes()
  709. {
  710. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  711. SigTime = cgRes.SigTime,
  712. TaskInfoID = runTask.ID,
  713. CgResID = cgRes.ID,
  714. CheckResID = ckRes.ID,
  715. PosLon = res[0],
  716. PosLat = res[1],
  717. MirrLon = res[3],
  718. MirrLat = res[4],
  719. Confidence = (int)res[6],
  720. PosResType = EnumPosResType.X3TwoDto,
  721. };
  722. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  723. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  724. posRes = db.PosRes.Add(posRes);
  725. await db.SaveChangesAsync();
  726. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  727. return Success(MapDto(posRes));
  728. }
  729. }
  730. catch (Exception)
  731. {
  732. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  733. {
  734. db.SyncDb();
  735. }
  736. throw;
  737. }
  738. }
  739. /// <summary>
  740. /// 三星双时差无参定位(含星历)
  741. /// </summary>
  742. /// <param name="dto">定位参数</param>
  743. /// <returns></returns>
  744. [HttpPost]
  745. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoParAsync(X3TwoDtoNoParPosDto dto)
  746. {
  747. try
  748. {
  749. TaskInfo runTask;
  750. using (RHDWContext db = new RHDWContext())
  751. {
  752. if (dto.TaskID == null)
  753. {
  754. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  755. &&(p.PosType == EnumPosType.X3TwoDtoNoRef||p.PosType== EnumPosType.X3Leo1||p.PosType==EnumPosType.X3Leo) && p.TaskState == EnumTaskState.Running);
  756. if (runTask == null)
  757. {
  758. await XdCxRhDW.UI.Lib.LogHelper.Warning($"接收到三星双时差无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  759. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  760. }
  761. }
  762. else
  763. {
  764. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  765. if (runTask == null)
  766. {
  767. await XdCxRhDW.UI.Lib.LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  768. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  769. }
  770. }
  771. }
  772. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  773. {
  774. var StationRes = db.StationRes.Add(new StationRes()
  775. {
  776. MSatTxLon = dto.MSatTxLon,
  777. MSatTxLat = dto.MSatTxLat,
  778. N1SatTxLon = dto.N1SatTxLon,
  779. N1SatTxLat = dto.N1SatTxLat,
  780. N2SatTxLon = dto.N2SatTxLon,
  781. N2SatTxLat = dto.N2SatTxLat,
  782. });
  783. var ckRes = new CheckRes()
  784. {
  785. FileName = dto.CheckRes?.FileName,
  786. SmpStart = dto.CheckRes?.SmpStart,
  787. SmpCount = dto.CheckRes?.SmpCount,
  788. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  789. ModRate = dto.CheckRes?.ModRate,
  790. ModType = dto.CheckRes?.ModType,
  791. UserName = dto.CheckRes?.UserName,
  792. FfcHz = dto.CheckRes?.FfcHz,
  793. Snr = dto.CheckRes?.Snr
  794. };
  795. db.CheckRes.Add(ckRes);
  796. var cgRes = db.CgRes.Add(new CgRes()
  797. {
  798. SigTime = dto.SigTime,
  799. Dto1 = Math.Round(dto.Dto1, 10),
  800. Dfo1 = Math.Round(dto.Dfo1, 10),
  801. Snr1 = Math.Round(dto.Snr1, 1),
  802. Dto2 = Math.Round(dto.Dto2, 10),
  803. Dfo2 = Math.Round(dto.Dfo2, 10),
  804. Snr2 = Math.Round(dto.Snr2, 1),
  805. StationResID = StationRes.ID,
  806. MainCode = dto.MainCode,
  807. Adja1Code = dto.Adja1Code,
  808. Adja2Code = dto.Adja2Code,
  809. TaskID = runTask.ID,
  810. MainX = dto.MainX,
  811. MainY = dto.MainY,
  812. MainZ = dto.MainZ,
  813. MainVx = dto.MainVX,
  814. MainVy = dto.MainVY,
  815. MainVz = dto.MainVZ,
  816. Adja1X = dto.Adja1X,
  817. Adja1Y = dto.Adja1Y,
  818. Adja1Z = dto.Adja1Z,
  819. Adja1Vx = dto.Adja1VX,
  820. Adja1Vy = dto.Adja1VY,
  821. Adja1Vz = dto.Adja1VZ,
  822. Adja2X = dto.Adja2X,
  823. Adja2Y = dto.Adja2Y,
  824. Adja2Z = dto.Adja2Z,
  825. Adja2Vx = dto.Adja2VX,
  826. Adja2Vy = dto.Adja2VY,
  827. Adja2Vz = dto.Adja2VZ,
  828. TarFreqUp = dto.FreqUp,
  829. TarFreqDown = dto.FreqDown,
  830. });
  831. var res = PosApi.X3_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  832. PosRes posRes = new PosRes()
  833. {
  834. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  835. SigTime = cgRes.SigTime,
  836. TaskInfoID = runTask.ID,
  837. CgResID = cgRes.ID,
  838. CheckResID = ckRes.ID,
  839. PosLon = res[0],
  840. PosLat = res[1],
  841. MirrLon = res[3],
  842. MirrLat = res[4],
  843. Confidence = (int)res[6],
  844. PosResType = EnumPosResType.X3TwoDtoNoRef,
  845. };
  846. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  847. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  848. posRes = db.PosRes.Add(posRes);
  849. await db.SaveChangesAsync();
  850. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  851. return Success(MapDto(posRes));
  852. }
  853. }
  854. catch (Exception)
  855. {
  856. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  857. {
  858. db.SyncDb();
  859. }
  860. throw;
  861. }
  862. }
  863. /// <summary>
  864. /// 三星高低轨双时差无参定位(含星历)
  865. /// </summary>
  866. /// <param name="dto">定位参数</param>
  867. /// <returns></returns>
  868. [HttpPost]
  869. public async Task<AjaxResult<PosResDto>> PosX3LeoDtoNoParAsync(X3TwoDtoNoParPosDto dto)
  870. {
  871. try
  872. {
  873. TaskInfo runTask;
  874. using (RHDWContext db = new RHDWContext())
  875. {
  876. if (dto.TaskID == null)
  877. {
  878. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  879. && ( p.PosType == EnumPosType.X3Leo1) && p.TaskState == EnumTaskState.Running);
  880. if (runTask == null)
  881. {
  882. await XdCxRhDW.UI.Lib.LogHelper.Warning($"接收到三星双时差无参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  883. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  884. }
  885. }
  886. else
  887. {
  888. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  889. if (runTask == null)
  890. {
  891. await XdCxRhDW.UI.Lib.LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  892. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  893. }
  894. }
  895. }
  896. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  897. {
  898. var StationRes = db.StationRes.Add(new StationRes()
  899. {
  900. MSatTxLon = dto.MSatTxLon,
  901. MSatTxLat = dto.MSatTxLat,
  902. N1SatTxLon = dto.N1SatTxLon,
  903. N1SatTxLat = dto.N1SatTxLat,
  904. N2SatTxLon = dto.N2SatTxLon,
  905. N2SatTxLat = dto.N2SatTxLat,
  906. });
  907. var ckRes = new CheckRes()
  908. {
  909. FileName = dto.CheckRes?.FileName,
  910. SmpStart = dto.CheckRes?.SmpStart,
  911. SmpCount = dto.CheckRes?.SmpCount,
  912. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  913. ModRate = dto.CheckRes?.ModRate,
  914. ModType = dto.CheckRes?.ModType,
  915. UserName = dto.CheckRes?.UserName,
  916. FfcHz = dto.CheckRes?.FfcHz,
  917. Snr = dto.CheckRes?.Snr
  918. };
  919. db.CheckRes.Add(ckRes);
  920. var cgRes = db.CgRes.Add(new CgRes()
  921. {
  922. SigTime = dto.SigTime,
  923. Dto1 = Math.Round(dto.Dto1, 10),
  924. Dfo1 = Math.Round(dto.Dfo1, 10),
  925. Snr1 = Math.Round(dto.Snr1, 1),
  926. Dto2 = Math.Round(dto.Dto2, 10),
  927. Dfo2 = Math.Round(dto.Dfo2, 10),
  928. Snr2 = Math.Round(dto.Snr2, 1),
  929. StationResID = StationRes.ID,
  930. MainCode = dto.MainCode,
  931. Adja1Code = dto.Adja1Code,
  932. Adja2Code = dto.Adja2Code,
  933. TaskID = runTask.ID,
  934. MainX = dto.MainX,
  935. MainY = dto.MainY,
  936. MainZ = dto.MainZ,
  937. MainVx = dto.MainVX,
  938. MainVy = dto.MainVY,
  939. MainVz = dto.MainVZ,
  940. Adja1X = dto.Adja1X,
  941. Adja1Y = dto.Adja1Y,
  942. Adja1Z = dto.Adja1Z,
  943. Adja1Vx = dto.Adja1VX,
  944. Adja1Vy = dto.Adja1VY,
  945. Adja1Vz = dto.Adja1VZ,
  946. Adja2X = dto.Adja2X,
  947. Adja2Y = dto.Adja2Y,
  948. Adja2Z = dto.Adja2Z,
  949. Adja2Vx = dto.Adja2VX,
  950. Adja2Vy = dto.Adja2VY,
  951. Adja2Vz = dto.Adja2VZ,
  952. TarFreqUp = dto.FreqUp,
  953. TarFreqDown = dto.FreqDown,
  954. });
  955. var res = PosApi.X3_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  956. PosRes posRes = new PosRes()
  957. {
  958. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  959. SigTime = cgRes.SigTime,
  960. TaskInfoID = runTask.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.X3Leo1,
  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. catch (Exception)
  979. {
  980. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  981. {
  982. db.SyncDb();
  983. }
  984. throw;
  985. }
  986. }
  987. /// <summary>
  988. /// 三星双时差无参定位(无星历)
  989. /// </summary>
  990. /// <returns>返回定位结果ID</returns>
  991. [HttpPost]
  992. public async Task<AjaxResult<PosResDto>> PosX3TwoDtoNoXlNoParAsync(X3TwoDtoNoXlNoParPosDto dto)
  993. {
  994. try
  995. {
  996. TaskInfo runTask;
  997. using (RHDWContext db = new RHDWContext())
  998. {
  999. if (dto.TaskID == null)
  1000. {
  1001. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1002. && p.PosType == EnumPosType.X3TwoDtoNoRef && p.TaskState == EnumTaskState.Running);
  1003. if (runTask == null)
  1004. {
  1005. await XdCxRhDW.UI.Lib.LogHelper.Warning($"接收到三星双时差无参定位(无星历)参数,由于找不到执行中的任务忽略本次定位");
  1006. return Error<PosResDto>($"多模式融合定位平台没有启动三星双时差定位任务");
  1007. }
  1008. }
  1009. else
  1010. {
  1011. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1012. if (runTask == null)
  1013. {
  1014. await XdCxRhDW.UI.Lib.LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  1015. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1016. }
  1017. }
  1018. }
  1019. var xl1 = await XlRepository.GetLatestAsync(dto.MainCode, dto.SigTime);
  1020. if (xl1 == null)
  1021. {
  1022. await XdCxRhDW.UI.Lib.LogHelper.Error($"系统缺少编号{dto.MainCode}卫星的星历!");
  1023. return Error<PosResDto>($"系统缺少编号{dto.MainCode}卫星的星历!");
  1024. }
  1025. await XdCxRhDW.UI.Lib.LogHelper.Info($"卫星{dto.MainCode}使用发布时刻为{xl1.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1026. var xl2 = await XlRepository.GetLatestAsync(dto.Adja1Code, dto.SigTime);
  1027. if (xl2 == null)
  1028. {
  1029. await XdCxRhDW.UI.Lib.LogHelper.Error($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1030. return Error<PosResDto>($"系统缺少编号{dto.Adja1Code}卫星的星历!");
  1031. }
  1032. await XdCxRhDW.UI.Lib.LogHelper.Info($"卫星{dto.Adja1Code}使用发布时刻为{xl2.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1033. var xl3 = await XlRepository.GetLatestAsync(dto.Adja2Code, dto.SigTime);
  1034. if (xl3 == null)
  1035. {
  1036. await XdCxRhDW.UI.Lib.LogHelper.Error($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1037. return Error<PosResDto>($"系统缺少编号{dto.Adja2Code}卫星的星历!");
  1038. }
  1039. await XdCxRhDW.UI.Lib.LogHelper.Info($"卫星{dto.Adja2Code}使用发布时刻为{xl3.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
  1040. var XlCalcDto = new XlCalcDto() { tleStr = xl1.TwoLine, SigTime = dto.SigTime };
  1041. var ephMain = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto);
  1042. if (ephMain.code != 200)
  1043. {
  1044. await XdCxRhDW.UI.Lib.LogHelper.Error($"推算卫星{dto.MainCode}的ECEF星历出错.{ephMain.msg}");
  1045. return Error<PosResDto>($"推算卫星{dto.MainCode}的ECEF星历出错");
  1046. }
  1047. var XlCalcDto2 = new XlCalcDto() { tleStr = xl2.TwoLine, SigTime = dto.SigTime };
  1048. var ephAdja1 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto2);
  1049. if (ephAdja1.code != 200)
  1050. {
  1051. await XdCxRhDW.UI.Lib.LogHelper.Error($"推算卫星{dto.Adja1Code}的ECEF星历出错.{ephAdja1.msg}");
  1052. return Error<PosResDto>($"推算卫星{dto.Adja1Code}的ECEF星历出错");
  1053. }
  1054. var XlCalcDto3 = new XlCalcDto() { tleStr = xl3.TwoLine, SigTime = dto.SigTime };
  1055. var ephAdja2 = await HttpHelper.PostRequestAsync<SatEphResDto>(SysConfig.GetUrl("Xl/Calc"), XlCalcDto3);
  1056. if (ephAdja2.code != 200)
  1057. {
  1058. await XdCxRhDW.UI.Lib.LogHelper.Error($"推算卫星{dto.Adja2Code}的ECEF星历出错.{ephAdja2.msg}");
  1059. return Error<PosResDto>($"推算卫星{dto.Adja2Code}的ECEF星历出错");
  1060. }
  1061. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1062. {
  1063. var StationRes = db.StationRes.Add(new StationRes()
  1064. {
  1065. MSatTxLon = dto.SatTxLon,
  1066. MSatTxLat = dto.SatTxLat,
  1067. });
  1068. var ckRes = new CheckRes()
  1069. {
  1070. FileName = dto.CheckRes?.FileName,
  1071. SmpStart = dto.CheckRes?.SmpStart,
  1072. SmpCount = dto.CheckRes?.SmpCount,
  1073. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1074. ModRate = dto.CheckRes?.ModRate,
  1075. ModType = dto.CheckRes?.ModType,
  1076. UserName = dto.CheckRes?.UserName,
  1077. FfcHz = dto.CheckRes?.FfcHz,
  1078. Snr = dto.CheckRes?.Snr
  1079. };
  1080. db.CheckRes.Add(ckRes);
  1081. var cgRes = db.CgRes.Add(new CgRes()
  1082. {
  1083. SigTime = dto.SigTime,
  1084. Dto1 = Math.Round(dto.Dto1, 10),
  1085. Dfo1 = Math.Round(dto.Dfo1, 10),
  1086. Snr1 = Math.Round(dto.Snr1, 1),
  1087. Dto2 = Math.Round(dto.Dto2, 10),
  1088. Dfo2 = Math.Round(dto.Dfo2, 10),
  1089. Snr2 = Math.Round(dto.Snr2, 1),
  1090. StationResID = StationRes.ID,
  1091. MainCode = dto.MainCode,
  1092. Adja1Code = dto.Adja1Code,
  1093. Adja2Code = dto.Adja2Code,
  1094. MainXlTime = ephMain.data.TleTime,
  1095. Adja1XlTime = ephAdja1.data.TleTime,
  1096. Adja2XlTime = ephAdja2.data.TleTime,
  1097. TaskID = runTask.ID,
  1098. MainX = ephMain.data.X,
  1099. MainY = ephMain.data.Y,
  1100. MainZ = ephMain.data.Z,
  1101. MainVx = ephMain.data.VX,
  1102. MainVy = ephMain.data.VY,
  1103. MainVz = ephMain.data.VZ,
  1104. Adja1X = ephAdja1.data.X,
  1105. Adja1Y = ephAdja1.data.Y,
  1106. Adja1Z = ephAdja1.data.Z,
  1107. Adja1Vx = ephAdja1.data.VX,
  1108. Adja1Vy = ephAdja1.data.VY,
  1109. Adja1Vz = ephAdja1.data.VZ,
  1110. Adja2X = ephAdja2.data.X,
  1111. Adja2Y = ephAdja2.data.Y,
  1112. Adja2Z = ephAdja2.data.Z,
  1113. Adja2Vx = ephAdja2.data.VX,
  1114. Adja2Vy = ephAdja2.data.VY,
  1115. Adja2Vz = ephAdja2.data.VZ,
  1116. TarFreqUp = dto.FreqUp,
  1117. TarFreqDown = dto.FreqDown,
  1118. });
  1119. var res = PosApi.X3_PosNoRef(cgRes, StationRes, dto.CalcConfidence);
  1120. PosRes posRes = new PosRes()
  1121. {
  1122. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1123. SigTime = dto.SigTime,
  1124. TaskInfoID = runTask.ID,
  1125. CgResID = cgRes.ID,
  1126. CheckResID = ckRes.ID,
  1127. PosLon = res[0],
  1128. PosLat = res[1],
  1129. MirrLon = res[3],
  1130. MirrLat = res[4],
  1131. Confidence = (int)res[6],
  1132. PosResType = EnumPosResType.X3TwoDtoNoRef,
  1133. };
  1134. if (dto.TheoryDfoCalc && posRes.PosLon != 999)
  1135. posRes.TargetState = TheoryDtoDfoApi.TheoryDfo(cgRes, StationRes, posRes, SysConfig.Config.YDPZThreshold);
  1136. posRes = db.PosRes.Add(posRes);
  1137. await db.SaveChangesAsync();
  1138. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1139. return Success(MapDto(posRes));
  1140. }
  1141. }
  1142. catch (Exception)
  1143. {
  1144. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1145. {
  1146. db.SyncDb();
  1147. }
  1148. throw;
  1149. }
  1150. }
  1151. #endregion
  1152. #region 低轨单星双频差定位
  1153. //(单星没有参考的概念)
  1154. [HttpPost]
  1155. public async Task<AjaxResult<PosResDto>> PosLeX1ParAsync(LeoX1ParPosDto dto)
  1156. {
  1157. try
  1158. {
  1159. TaskInfo runTask;
  1160. using (RHDWContext db = new RHDWContext())
  1161. {
  1162. if (dto.TaskID == null)
  1163. {
  1164. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1165. && p.PosType == EnumPosType.X1Leo && p.TaskState == EnumTaskState.Running);
  1166. if (runTask == null)
  1167. {
  1168. await XdCxRhDW.UI.Lib.LogHelper.Warning($"接收到低轨单星带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  1169. return Error<PosResDto>($"多模式融合定位平台没有启动低轨定位任务");
  1170. }
  1171. }
  1172. else
  1173. {
  1174. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1175. if (runTask == null)
  1176. {
  1177. await XdCxRhDW.UI.Lib.LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  1178. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1179. }
  1180. }
  1181. }
  1182. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1183. {
  1184. var ckRes = new CheckRes()
  1185. {
  1186. FileName = dto.CheckRes?.FileName,
  1187. SmpStart = dto.CheckRes?.SmpStart,
  1188. SmpCount = dto.CheckRes?.SmpCount,
  1189. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1190. ModRate = dto.CheckRes?.ModRate,
  1191. ModType = dto.CheckRes?.ModType,
  1192. UserName = dto.CheckRes?.UserName,
  1193. FfcHz = dto.CheckRes?.FfcHz,
  1194. Snr = dto.CheckRes?.Snr
  1195. };
  1196. db.CheckRes.Add(ckRes);
  1197. var cgRes = db.CgRes.Add(new CgRes()
  1198. {
  1199. SigTime = dto.SigTime,
  1200. Dto1 = Math.Round(dto.Dto1, 10),
  1201. Dfo1 = Math.Round(dto.Dfo1, 10),
  1202. Snr1 = Math.Round(dto.Snr1, 1),
  1203. Dto2 = Math.Round(dto.Dto2, 10),
  1204. Dfo2 = Math.Round(dto.Dfo2, 10),
  1205. Snr2 = Math.Round(dto.Snr2, 1),
  1206. StationResID = 0,
  1207. MainCode = dto.MainCode,
  1208. Adja1Code = dto.Adja1Code,
  1209. Adja2Code = dto.Adja2Code,
  1210. TaskID = runTask.ID,
  1211. MainX = dto.MainX,
  1212. MainY = dto.MainY,
  1213. MainZ = dto.MainZ,
  1214. MainVx = dto.MainVX,
  1215. MainVy = dto.MainVY,
  1216. MainVz = dto.MainVZ,
  1217. Adja1X = dto.Adja1X,
  1218. Adja1Y = dto.Adja1Y,
  1219. Adja1Z = dto.Adja1Z,
  1220. Adja1Vx = dto.Adja1VX,
  1221. Adja1Vy = dto.Adja1VY,
  1222. Adja1Vz = dto.Adja1VZ,
  1223. Adja2X = dto.Adja2X,
  1224. Adja2Y = dto.Adja2Y,
  1225. Adja2Z = dto.Adja2Z,
  1226. Adja2Vx = dto.Adja2VX,
  1227. Adja2Vy = dto.Adja2VY,
  1228. Adja2Vz = dto.Adja2VZ,
  1229. TarFreqUp = dto.FreqUp,
  1230. TarFreqDown = dto.FreqDown,
  1231. });
  1232. var res = LeoPosApi.X1_POS(cgRes, dto.FreqUp);
  1233. PosRes posRes = new PosRes()
  1234. {
  1235. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1236. SigTime = cgRes.SigTime,
  1237. TaskInfoID = runTask.ID,
  1238. CgResID = cgRes.ID,
  1239. CheckResID = ckRes.ID,
  1240. PosLon = res[0],
  1241. PosLat = res[1],
  1242. MirrLon = res[3],
  1243. MirrLat = res[4],
  1244. Confidence = (int)res[6],
  1245. PosResType = EnumPosResType.X1Leo,
  1246. };
  1247. posRes = db.PosRes.Add(posRes);
  1248. await db.SaveChangesAsync();
  1249. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1250. return Success(MapDto(posRes));
  1251. }
  1252. }
  1253. catch (Exception)
  1254. {
  1255. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1256. {
  1257. db.SyncDb();
  1258. }
  1259. throw;
  1260. }
  1261. }
  1262. #endregion
  1263. #region 低轨双星时频差带参定位
  1264. [HttpPost]
  1265. public async Task<AjaxResult<PosResDto>> PosLeX2ParAsync(LeoX2ParPosDto dto)
  1266. {
  1267. try
  1268. {
  1269. TaskInfo runTask;
  1270. using (RHDWContext db = new RHDWContext())
  1271. {
  1272. if (dto.TaskID == null)
  1273. {
  1274. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskType == EnumTaskType.Group
  1275. && p.PosType == EnumPosType.X1Leo && p.TaskState == EnumTaskState.Running);
  1276. if (runTask == null)
  1277. {
  1278. await XdCxRhDW.UI.Lib.LogHelper.Warning($"接收到低轨双星带参定位(含星历)参数,由于找不到执行中的任务忽略本次定位");
  1279. return Error<PosResDto>($"多模式融合定位平台没有启动低轨定位任务");
  1280. }
  1281. }
  1282. else
  1283. {
  1284. runTask = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == dto.TaskID);
  1285. if (runTask == null)
  1286. {
  1287. await XdCxRhDW.UI.Lib.LogHelper.Warning($"找不到任务,ID={dto.TaskID}");
  1288. return Error<PosResDto>($"找不到ID={dto.TaskID}的任务");
  1289. }
  1290. }
  1291. }
  1292. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1293. {
  1294. var StationRes = db.StationRes.Add(new StationRes()
  1295. {
  1296. MSatTxLon = dto.SatTxLon,
  1297. MSatTxLat = dto.SatTxLat,
  1298. RefLon = dto.RefLon,
  1299. RefLat = dto.RefLat,
  1300. });
  1301. var ckRes = new CheckRes()
  1302. {
  1303. FileName = dto.CheckRes?.FileName,
  1304. SmpStart = dto.CheckRes?.SmpStart,
  1305. SmpCount = dto.CheckRes?.SmpCount,
  1306. PosCheckType = (EnumPosCheckType?)dto.CheckRes?.PosCheckType,
  1307. ModRate = dto.CheckRes?.ModRate,
  1308. ModType = dto.CheckRes?.ModType,
  1309. UserName = dto.CheckRes?.UserName,
  1310. FfcHz = dto.CheckRes?.FfcHz,
  1311. Snr = dto.CheckRes?.Snr
  1312. };
  1313. db.CheckRes.Add(ckRes);
  1314. var cgRes = db.CgRes.Add(new CgRes()
  1315. {
  1316. SigTime = dto.SigTime,
  1317. Dto1 = Math.Round(dto.Dto, 10),
  1318. Dfo1 = Math.Round(dto.Dfo, 10),
  1319. Snr1 = Math.Round(dto.Snr, 1),
  1320. YbMainDto = Math.Round(dto.YbMainDto, 10),
  1321. YbAdja1Dto = Math.Round(dto.YbAdjaDto, 10),
  1322. YbMainDfo = Math.Round(dto.YbMainDfo, 10),
  1323. YbAdja1Dfo = Math.Round(dto.YbAdjaDfo, 10),
  1324. TarFreqUp = dto.TarFreqUp,
  1325. TarFreqDown = dto.TarFreqDown,
  1326. RefFreqUp = dto.RefFreqUp,
  1327. RefFreqDown = dto.RefFreqDown,
  1328. StationResID = StationRes.ID,
  1329. MainCode = dto.MainCode,
  1330. Adja1Code = dto.AdjaCode,
  1331. TaskID = runTask.ID,
  1332. MainX = dto.MainX,
  1333. MainY = dto.MainY,
  1334. MainZ = dto.MainZ,
  1335. MainVx = dto.MainVx,
  1336. MainVy = dto.MainVy,
  1337. MainVz = dto.MainVz,
  1338. Adja1X = dto.AdjaX,
  1339. Adja1Y = dto.AdjaY,
  1340. Adja1Z = dto.AdjaZ,
  1341. Adja1Vx = dto.AdjaVx,
  1342. Adja1Vy = dto.AdjaVy,
  1343. Adja1Vz = dto.AdjaVz,
  1344. });
  1345. var res = LeoPosApi.X2_POS(cgRes, StationRes, dto.TarFreqUp, dto.RefFreqUp);
  1346. PosRes posRes = new PosRes()
  1347. {
  1348. FreqUpHz = (long)cgRes.TarFreqUp.Value,
  1349. SigTime = cgRes.SigTime,
  1350. TaskInfoID = runTask.ID,
  1351. CgResID = cgRes.ID,
  1352. CheckResID = ckRes.ID,
  1353. PosLon = res[0],
  1354. PosLat = res[1],
  1355. MirrLon = res[3],
  1356. MirrLat = res[4],
  1357. Confidence = (int)res[6],
  1358. PosResType = EnumPosResType.X2Leo,
  1359. };
  1360. posRes = db.PosRes.Add(posRes);
  1361. await db.SaveChangesAsync();
  1362. Messenger.Defalut.Pub("新增定位点", MapModel(posRes));
  1363. return Success(MapDto(posRes));
  1364. }
  1365. }
  1366. catch (Exception)
  1367. {
  1368. using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
  1369. {
  1370. db.SyncDb();
  1371. }
  1372. throw;
  1373. }
  1374. }
  1375. #endregion
  1376. private PosResDto MapDto(PosRes res)
  1377. {
  1378. return new PosResDto()
  1379. {
  1380. ID = res.ID,
  1381. FreqUpHz = res.FreqUpHz,
  1382. SigTime = res.SigTime,
  1383. TaskInfoID = res.TaskInfoID,
  1384. TarName = res.TargetInfo?.TargetName,
  1385. PosLon = res.PosLon,
  1386. PosLat = res.PosLat,
  1387. MirrLon = res.MirrLon,
  1388. MirrLat = res.MirrLat,
  1389. CheckType = res.CheckRes?.PosCheckType == null ? "" : res.CheckRes?.PosCheckType?.GetEnumDisplayName(),
  1390. TargetState = (EnumTargetStateDto)res.TargetState,
  1391. PosResType = (EnumPosResTypeDto)res.PosResType,
  1392. Confidence = res.Confidence,
  1393. };
  1394. }
  1395. private ModelPosRes MapModel(PosRes res)
  1396. {
  1397. return new ModelPosRes()
  1398. {
  1399. ID = res.ID,
  1400. FreqUpHz = res.FreqUpHz,
  1401. SigTime = res.SigTime,
  1402. TaskInfoID = res.TaskInfoID,
  1403. PosLon = res.PosLon,
  1404. PosLat = res.PosLat,
  1405. MirrLon = res.MirrLon,
  1406. MirrLat = res.MirrLat,
  1407. TargetState = res.TargetState,
  1408. PosResType = res.PosResType,
  1409. CgResID = res.CgResID,
  1410. CheckRes = res.CheckRes,
  1411. CheckResID = res.CheckResID,
  1412. ColorKey = res.ColorKey,
  1413. CreateTime = res.CreateTime,
  1414. CxResID = res.CxResID,
  1415. StationResID = res.StationResID,
  1416. TargetInfo = res.TargetInfo,
  1417. TargetInfoID = res.TargetInfoID,
  1418. UpdateTime = res.UpdateTime,
  1419. Confidence = res.Confidence,
  1420. };
  1421. }
  1422. }
  1423. }