CtrlHome.cs 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. using DevExpress.Utils;
  2. using DevExpress.Utils.Drawing;
  3. using DevExpress.Utils.Drawing.Helpers;
  4. using DevExpress.Utils.Svg;
  5. using DevExpress.XtraEditors.ButtonsPanelControl;
  6. using DevExpress.XtraGrid.Views.Grid;
  7. using DevExpress.XtraGrid.Views.Grid.ViewInfo;
  8. using DevExpress.XtraTreeList.Data;
  9. using DxHelper;
  10. using Microsoft.Owin.Hosting;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.ComponentModel.DataAnnotations;
  14. using System.Data;
  15. using System.Data.Entity;
  16. using System.Drawing;
  17. using System.Linq;
  18. using System.Net;
  19. using System.Reflection;
  20. using System.Text;
  21. using System.Windows.Forms;
  22. using XdCxRhDW.App.Api;
  23. using XdCxRhDW.App.Api.时差线;
  24. using XdCxRhDW.App.EditForms;
  25. using XdCxRhDW.App.EFContext;
  26. using XdCxRhDW.App.Model;
  27. using XdCxRhDW.App.WebAPI;
  28. using XdCxRhDW.Dto;
  29. namespace XdCxRhDW.App.UserControl
  30. {
  31. public partial class CtrlHome : DevExpress.XtraEditors.XtraUserControl
  32. {
  33. List<TaskInfo> list = new List<TaskInfo>();
  34. public CtrlHome()
  35. {
  36. InitializeComponent();
  37. gridHomeTask.Init();
  38. gridHomePosRes.Init().UseMultiSelect().UseRowNumber();
  39. btnDrawDto.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\DtoLine.svg");
  40. btnDrawDfo.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\DfoLine.svg");
  41. btnGDOP.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\GDOP.svg");
  42. var mapService = string.Empty;//http://ows.mundialis.de/services/service
  43. using (RHDWContext db = new RHDWContext())
  44. {
  45. mapService = db.SysSetings.FirstOrDefault().MapService;
  46. }
  47. mapControl1.UseDefalutOptions()
  48. //.UseCluster()//定位点使用内置聚合
  49. .UseClearAll()
  50. .UseDistanceLine()
  51. .UseMarkDot()
  52. .UseExportImg()
  53. .UseExportXlsx()
  54. .UseExportCsv()
  55. .SetMapLayerType(mapService)
  56. //.SetMapLayerType("")
  57. //.UseHJ(item =>
  58. //{
  59. // (double Lon, double Lat) = item;
  60. // PosRes pos = new PosRes();
  61. // pos.PosLon = Lon;
  62. // pos.PosLat = Lat;
  63. // pos.SigTime = DateTime.Now;
  64. // mapControl1.AddHJPosItem(pos);
  65. //})
  66. .UseDrawRect(rect =>
  67. {
  68. (double startLon, double startLat, double centerLon, double centerLat, double endLon, double endLat, double lonRange, double latRange) = rect;
  69. });
  70. }
  71. private async void GridView1_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e)
  72. {
  73. var tsk = (e.Row as TaskInfo);
  74. var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
  75. var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
  76. btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
  77. List<PosRes> listPos = new List<PosRes>();
  78. using (RHDWContext db = new RHDWContext())
  79. {
  80. var items = await db.PosRes.Where(p => p.TaskID == tsk.ID).OrderByDescending(p => p.SigTime).ToListAsync();
  81. listPos.AddRange(items);
  82. }
  83. this.gridHomePosRes.DataSource = listPos;
  84. mapControl1.SetPosDataSource(listPos.Where(p => p.PosLon <= 180), false);
  85. }
  86. private async void CtrlHome_Load(object sender, EventArgs e)
  87. {
  88. gridView1.FocusedRowObjectChanged += GridView1_FocusedRowObjectChanged;
  89. try
  90. {
  91. List<SatInfo> satList = new List<SatInfo>();
  92. List<TxInfo> txList = new List<TxInfo>();
  93. using (RHDWContext db = new RHDWContext())
  94. {
  95. var qq = db.TaskInfos.OrderByDescending(p => p.CreateTime).ToList();
  96. list.AddRange(qq);
  97. var runningList = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running).ToListAsync();
  98. foreach (var item in runningList)
  99. {
  100. item.TaskState = EnumTaskState.Stopped;
  101. }
  102. await db.SaveChangesAsync();
  103. var satres = db.SatInfos.OrderBy(p => p.SatName).OrderBy(p => p.SatName);
  104. satList.AddRange(await satres.ToListAsync());
  105. var txres = await db.TxInfos.ToListAsync();
  106. txList.AddRange(txres);
  107. }
  108. foreach (var sat in satList)
  109. {
  110. if (!sat.SatLon.HasValue) continue;
  111. mapControl1.Invoke(new Action(() =>
  112. {
  113. mapControl1.DrawFixedImg("sat", 10, sat.SatLon.Value, DxHelper.SvgHelper.CreateSat(), new Size(24, 24), $"{sat.Sat}\r\n");
  114. }));
  115. }
  116. foreach (var txitem in txList)
  117. {
  118. if ((txitem.Lon >= 180 || txitem.Lon <= 180) && txitem.Lat >= -90 || txitem.Lat <= 90)//画天线
  119. {
  120. mapControl1.Invoke(new Action(() =>
  121. {
  122. switch (txitem.TxType)
  123. {
  124. #warning 天线图片需要邹大哥给
  125. case EnumTxType.MainSat:
  126. mapControl1.DrawFixedImg("MainSatTx", txitem.Lat, txitem.Lon, DxHelper.SvgHelper.CreatePentagram(), new Size(24, 24), $"[{txitem.Name}]\r\n主星天线经度:{txitem.Lon}°\r\n主星天线纬度:{txitem.Lat}°\r\n");
  127. break;
  128. case EnumTxType.AdjaSat:
  129. mapControl1.DrawFixedImg("AdjaSatTx", txitem.Lat, txitem.Lon, DxHelper.SvgHelper.CreatePentagram(), new Size(24, 24), $"[{txitem.Name}]\r\n邻星天线经度:{txitem.Lon}°\r\n邻星天线纬度:{txitem.Lat}°\r\n");
  130. break;
  131. case EnumTxType.Cdb:
  132. mapControl1.DrawFixedImg("CdbStation", txitem.Lat, txitem.Lon, DxHelper.SvgHelper.CreatePentagram(), new Size(24, 24), $"[{txitem.Name}]\r\n超短站经度:{txitem.Lon}°\r\n超短站纬度:{txitem.Lat}°\r\n");
  133. break;
  134. case EnumTxType.Cx:
  135. mapControl1.DrawFixedImg("CxStation", txitem.Lat, txitem.Lon, DxHelper.SvgHelper.CreatePentagram(), new Size(24, 24), $"[{txitem.Name}]\r\n测向站经度:{txitem.Lon}°\r\n测向站纬度:{txitem.Lat}°\r\n");
  136. break;
  137. case EnumTxType.Ref:
  138. mapControl1.DrawFixedImg("RefStation", txitem.Lat, txitem.Lon, DxHelper.SvgHelper.CreatePentagram(), new Size(24, 24), $"参考站经度:{txitem.Lon}°\r\n参考站纬度:{txitem.Lat}°\r\n");
  139. break;
  140. default:
  141. break;
  142. }
  143. }));
  144. }
  145. }
  146. mapControl1.AddPosMenu<PosRes>("绘制时差线", SvgHelper.LoadFromFile("Image\\DtoLine.svg"), item =>
  147. {
  148. var posType = GetPosRes(item, "绘制时差线");
  149. DrawDtoLine(item, posType);
  150. })
  151. .AddPosMenu<PosRes>("绘制频差线", SvgHelper.LoadFromFile("Image\\DfoLine.svg"), item =>
  152. {
  153. var posType = GetPosRes(item, "绘制频差线");
  154. DrawDfoLine(item, posType);
  155. })
  156. .AddPosMenu<PosRes>("绘制GDOP", SvgHelper.LoadFromFile("Image\\GDOP.svg"), item =>
  157. {
  158. var posType = GetPosRes(item, "绘制GDOP");
  159. DrawGDOP(item.SigTime, posType);
  160. })
  161. .AddPosMenu<PosRes>("绘制测向线", btnDrawCX.ImageOptions.SvgImage, item =>
  162. {
  163. DrawCXLine(item);
  164. });
  165. }
  166. catch (Exception ex)
  167. {
  168. Serilog.Log.Error(ex, "加载任务信息异常");
  169. DxHelper.MsgBoxHelper.ShowError("加载任务信息异常");
  170. }
  171. gridHomeTask.DataSource = list;
  172. gridView1.Columns["TaskName"].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Near;
  173. this.svgImageCollection1.Add("Stopped", SvgHelper.CreateCycle("#1E8B58"));
  174. this.svgImageCollection1.Add("Running", SvgHelper.CreateCycle("#2E8B57"));
  175. gridView1.CustomDrawCell += GridView1_CustomDrawCell;
  176. using (RHDWContext db = new RHDWContext())
  177. {
  178. var settings = await db.SysSetings.FirstOrDefaultAsync();
  179. if (settings == null)
  180. {
  181. DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息");
  182. return;
  183. }
  184. try
  185. {
  186. StartOptions options = new StartOptions();
  187. options.Urls.Add($"http://+:{settings.HttpPort}");
  188. httpServer = WebApp.Start<Startup>(options);
  189. }
  190. catch (System.Reflection.TargetInvocationException ex)
  191. {
  192. httpServer = null;
  193. Serilog.Log.Error(ex, $"启动Http服务失败!");
  194. if (ex.InnerException is HttpListenerException)
  195. {
  196. DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败,请以管理员身份运行程序!");
  197. }
  198. else
  199. {
  200. DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
  201. }
  202. }
  203. catch (Exception ex)
  204. {
  205. httpServer = null;
  206. Serilog.Log.Error(ex, $"启动Http服务失败!");
  207. DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
  208. }
  209. }
  210. WaitHelper.CloseForm();
  211. }
  212. private void GridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
  213. {
  214. if (e.Column.FieldName == "TaskName" && (EnumTaskState)gridView1.GetRowCellValue(e.RowHandle, "TaskState") == EnumTaskState.Running)
  215. {
  216. var palette = SvgPaletteHelper.GetSvgPalette(this.LookAndFeel, ObjectState.Normal);
  217. e.Cache.DrawSvgImage(svgImageCollection1[1], new Rectangle(new Point(e.Bounds.X + 4, e.Bounds.Y + (e.Bounds.Height - 16) / 2), new Size(16, 16)), palette);
  218. Rectangle txtBounds = e.Bounds;
  219. txtBounds.Width -= 24;
  220. txtBounds.X += 24;
  221. e.Appearance.DrawString(e.Cache, e.DisplayText, txtBounds);
  222. e.Handled = true;
  223. }
  224. }
  225. //public void SetEnumColumnImage(GridView gv, string columnFieldName, object imageCollection)
  226. //{
  227. // var repositoryItemImageComboBoxStatus = new RepositoryItemImageEdit();
  228. // var col = gv.Columns[columnFieldName];
  229. // col.MaxWidth = 40;
  230. // repositoryItemImageComboBoxStatus.Images = imageCollection;
  231. // col.ColumnEdit = repositoryItemImageComboBoxStatus;
  232. //}
  233. private void toolTipController1_GetActiveObjectInfo(object sender, DevExpress.Utils.ToolTipControllerGetActiveObjectInfoEventArgs e)
  234. {
  235. GridHitInfo hitInfo = gridView1.CalcHitInfo(e.ControlMousePosition);
  236. if (hitInfo.RowHandle < 0 || hitInfo.Column == null || hitInfo.HitTest != GridHitTest.RowCell)
  237. {
  238. toolTipController1.HideHint();
  239. return;
  240. }
  241. if (hitInfo.Column.FieldName == "TaskName")
  242. {
  243. var state = (EnumTaskState)gridView1.GetRowCellValue(hitInfo.RowHandle, "TaskState");
  244. if (state == EnumTaskState.Running)
  245. e.Info = new ToolTipControlInfo(hitInfo.RowHandle, "执行中");
  246. }
  247. }
  248. private void gridView1_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
  249. {
  250. if (gridView1.FocusedRowHandle < 0) return;
  251. var state = (EnumTaskState)gridView1.GetFocusedRowCellValue("TaskState");
  252. btnStart.Enabled = state == EnumTaskState.Stopped;
  253. btnStop.Enabled = state == EnumTaskState.Running;
  254. popupMenu1.ShowPopup(MousePosition);
  255. }
  256. private void gridView2_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
  257. {
  258. if (gridView2.FocusedRowHandle < 0) return;
  259. if (!gridView2.GetSelectedRows().Any())
  260. {
  261. btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  262. }
  263. else
  264. {
  265. btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  266. }
  267. popupMenu2.ShowPopup(MousePosition);
  268. }
  269. private async void layoutControlGroup1_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
  270. {
  271. var txt = (e.Button as GroupBoxButton).Caption;
  272. if (txt == "新建任务")
  273. {
  274. try
  275. {
  276. TaskEditor frm = new TaskEditor();
  277. if (frm.ShowDialog() != DialogResult.OK) return;
  278. var addItem = frm.info;
  279. using (RHDWContext db = new RHDWContext())
  280. {
  281. if (await db.TaskInfos.AnyAsync(p => p.TaskName == addItem.TaskName))
  282. {
  283. DxHelper.MsgBoxHelper.ShowWarning("任务名称重复");
  284. return;
  285. }
  286. db.TaskInfos.Add(addItem);
  287. await db.SaveChangesAsync();
  288. }
  289. list.Insert(0, addItem);
  290. gridView1.RefreshData();
  291. gridView1.FocusedRowHandle = 0;
  292. }
  293. catch (Exception ex)
  294. {
  295. Serilog.Log.Error(ex, "保存任务异常");
  296. DxHelper.MsgBoxHelper.ShowError("保存任务异常");
  297. }
  298. }
  299. else if (txt == "编辑任务")
  300. {
  301. try
  302. {
  303. var editItem = gridView1.GetFocusedRow() as TaskInfo;
  304. TaskEditor frm = new TaskEditor(editItem);
  305. if (frm.ShowDialog() != DialogResult.OK) return;
  306. editItem = frm.info;
  307. using (RHDWContext db = new RHDWContext())
  308. {
  309. if (await db.TaskInfos.AnyAsync(p => p.ID != editItem.ID && p.TaskName == editItem.TaskName))
  310. {
  311. DxHelper.MsgBoxHelper.ShowWarning("任务名称重复");
  312. return;
  313. }
  314. var find = await db.TaskInfos.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync();
  315. find.TaskName = editItem.TaskName;
  316. find.PosType = editItem.PosType;
  317. await db.SaveChangesAsync();
  318. }
  319. gridView1.RefreshData();
  320. }
  321. catch (Exception ex)
  322. {
  323. Serilog.Log.Error(ex, "保存任务异常");
  324. DxHelper.MsgBoxHelper.ShowError("保存任务异常");
  325. }
  326. }
  327. else
  328. {
  329. try
  330. {
  331. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  332. if (tsk == null) return;
  333. if (!DxHelper.MsgBoxHelper.ShowConfirm($"删除任务[{tsk.TaskName}]?"))
  334. return;
  335. using (RHDWContext db = new RHDWContext())
  336. {
  337. var item = db.TaskInfos.FirstOrDefault(p => p.ID == tsk.ID);
  338. db.TaskInfos.Remove(item);
  339. db.SaveChanges();
  340. }
  341. gridView1.DeleteSelectedRows();
  342. }
  343. catch (Exception ex)
  344. {
  345. Serilog.Log.Error(ex, "删除任务异常");
  346. DxHelper.MsgBoxHelper.ShowError("删除任务异常");
  347. }
  348. }
  349. }
  350. IDisposable httpServer;
  351. TcpServer server;
  352. private async void btn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  353. {
  354. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  355. if (e.Item.Caption == "启动任务")
  356. {
  357. try
  358. {
  359. using (RHDWContext db = new RHDWContext())
  360. {
  361. var find = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskState == EnumTaskState.Running && p.PosType == tsk.PosType);
  362. if (find != null)
  363. {
  364. var field = typeof(EnumPosType).GetField(Enum.GetName(typeof(EnumPosType), find.PosType));
  365. DxHelper.MsgBoxHelper.ShowWarning($"已经有一个[{field.GetCustomAttribute<DisplayAttribute>().Name}]任务正在执行,请先停止!");
  366. return;
  367. }
  368. var settings = await db.SysSetings.FirstOrDefaultAsync();
  369. if (settings == null)
  370. {
  371. DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息");
  372. return;
  373. }
  374. if (server == null)
  375. {
  376. server = new TcpServer();
  377. server.OnDataReceived += this.Server_OnDataReceived;
  378. server.Start(settings.Port);
  379. }
  380. if (httpServer == null)
  381. {
  382. try
  383. {
  384. StartOptions options = new StartOptions();
  385. options.Urls.Add($"http://+:{settings.HttpPort}");
  386. httpServer = WebApp.Start<Startup>(options);
  387. }
  388. catch (Exception ex)
  389. {
  390. Serilog.Log.Error(ex, "启动任务异常,Http定位接口服务启动失败");
  391. DxHelper.MsgBoxHelper.ShowError($"启动任务异常,Http定位接口服务启动失败");
  392. }
  393. }
  394. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  395. item.TaskState = EnumTaskState.Running;
  396. await db.SaveChangesAsync();
  397. tsk.TaskState = EnumTaskState.Running;
  398. Serilog.Log.Information($"用户启动了任务,ID={tsk.ID}");
  399. }
  400. }
  401. catch (Exception ex)
  402. {
  403. Serilog.Log.Error(ex, "启动任务异常");
  404. DxHelper.MsgBoxHelper.ShowError($"启动任务异常.{ex.Message}");
  405. }
  406. }
  407. else
  408. {
  409. try
  410. {
  411. using (RHDWContext db = new RHDWContext())
  412. {
  413. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  414. item.TaskState = EnumTaskState.Stopped;
  415. await db.SaveChangesAsync();
  416. if (!db.TaskInfos.Any(p => p.TaskState == EnumTaskState.Running))
  417. {
  418. server?.StopListening();
  419. server = null;
  420. }
  421. }
  422. tsk.TaskState = EnumTaskState.Stopped;
  423. Serilog.Log.Information($"用户停止了任务,ID={tsk.ID}");
  424. }
  425. catch (Exception ex)
  426. {
  427. Serilog.Log.Error(ex, "停止任务异常");
  428. DxHelper.MsgBoxHelper.ShowError($"停止任务异常.{ex.Message}");
  429. }
  430. }
  431. gridView1.RefreshData();
  432. var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
  433. var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
  434. btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
  435. }
  436. private void gridView1_CustomDrawEmptyForeground(object sender, DevExpress.XtraGrid.Views.Base.CustomDrawEventArgs e)
  437. {
  438. if (gridView1.RowCount == 0)
  439. {
  440. string txt = "点击+创建任务";
  441. var s = e.Appearance.CalcTextSize(e.Cache, txt, e.Bounds.Width).ToSize();
  442. var x = (e.Bounds.Width - s.Width) / 2;
  443. var y = (e.Bounds.Height - s.Height) / 2;
  444. //e.Appearance.DrawString(e.Cache, txt, new Rectangle(x,y,s.Width,s.Height));
  445. e.DrawHtml(htmlTemplate1);
  446. }
  447. }
  448. readonly Random r = new Random();
  449. private async void Server_OnDataReceived(byte[] data)
  450. {
  451. try
  452. {
  453. var msg = Encoding.UTF8.GetString(data);
  454. var dto = Newtonsoft.Json.JsonConvert.DeserializeObject<SendDto>(msg);
  455. if (dto == null) return;
  456. var sigTime = DateTime.Now;
  457. using (RHDWContext db = new RHDWContext())
  458. {
  459. var cgRes = db.CgRes.Add(new CgRes()
  460. {
  461. SigTime = sigTime,
  462. DtoSx = dto.SxDto * 1e6,
  463. DfoSx = 200 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3),
  464. SnrSx = r.Next(18, 24) + Math.Round(r.NextDouble(), 1),
  465. DtoCdb = dto.XdDto * 1e6,
  466. DfoCdb = 600 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3),
  467. SnrCdb = r.Next(22, 32) + Math.Round(r.NextDouble(), 1),
  468. YbMain = dto.MainYbDto * 1e6,
  469. YbAdja = dto.AdjaYbDto * 1e6,
  470. MainX = dto.MainX,
  471. MainY = dto.MainY,
  472. MainZ = dto.MainZ,
  473. AdjaX = dto.AdjaX,
  474. AdjaY = dto.AdjaY,
  475. AdjaZ = dto.AdjaZ,
  476. });
  477. var listTx = await db.TxInfos.ToListAsync();
  478. var cxRes = db.CxRes.Add(new CxRes()
  479. {
  480. SigTime = sigTime,
  481. Fx = dto.CxRes,
  482. });
  483. var tsk1X1D = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running);
  484. var tsk2X1D = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  485. var tskRh = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running);
  486. if (tsk1X1D != null)
  487. {
  488. var res = PosApi.X1D1_POS(cgRes, listTx, cxRes);
  489. PosRes posRes = new PosRes()
  490. {
  491. SigTime = sigTime,
  492. TaskID = tsk1X1D.ID,
  493. CxResID = cxRes.ID,
  494. CgResID = cgRes.ID,
  495. TarName = "未知目标",
  496. TsName = "DAMA--56-115ms",
  497. PosLon = res[0],
  498. PosLat = res[1],
  499. MirrLon = res[3],
  500. MirrLat = res[4],
  501. };
  502. db.PosRes.Add(posRes);
  503. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  504. if (currentTask != null && currentTask.ID == tsk1X1D.ID)
  505. {
  506. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  507. ds.Insert(0, posRes);
  508. this.Invoke(new Action(() =>
  509. {
  510. gridView2.RefreshData();
  511. mapControl1.AddPosItem(posRes);
  512. }));
  513. }
  514. }
  515. if (tsk2X1D != null)
  516. {
  517. var res = PosApi.X2D1_POS(cgRes, listTx);
  518. PosRes posRes = new PosRes()
  519. {
  520. SigTime = sigTime,
  521. TaskID = tsk2X1D.ID,
  522. CxResID = cxRes.ID,
  523. CgResID = cgRes.ID,
  524. TarName = "未知目标",
  525. TsName = "DAMA-225-173ms",
  526. PosLon = res[0],
  527. PosLat = res[1],
  528. MirrLon = res[3],
  529. MirrLat = res[4],
  530. };
  531. db.PosRes.Add(posRes);
  532. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  533. if (currentTask.ID == tsk2X1D.ID)
  534. {
  535. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  536. ds.Insert(0, posRes);
  537. this.Invoke(new Action(() =>
  538. {
  539. gridView2.RefreshData();
  540. mapControl1.AddPosItem(posRes);
  541. }));
  542. }
  543. }
  544. if (tskRh != null)
  545. {
  546. var res = PosApi.RH_POS(cgRes, listTx, cxRes);
  547. PosRes posRes = new PosRes()
  548. {
  549. SigTime = sigTime,
  550. TaskID = tskRh.ID,
  551. CxResID = cxRes.ID,
  552. CgResID = cgRes.ID,
  553. TarName = "未知目标",
  554. TsName = "DAMA-738-109ms",
  555. PosLon = res[0],
  556. PosLat = res[1],
  557. MirrLon = res[3],
  558. MirrLat = res[4],
  559. };
  560. db.PosRes.Add(posRes);
  561. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  562. if (currentTask.ID == tskRh.ID)
  563. {
  564. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  565. ds.Insert(0, posRes);
  566. this.Invoke(new Action(() =>
  567. {
  568. gridView2.RefreshData();
  569. mapControl1.AddPosItem(posRes);
  570. }));
  571. }
  572. }
  573. await db.SaveChangesAsync();
  574. }
  575. }
  576. catch (Exception ex)
  577. {
  578. Serilog.Log.Error(ex, "接收到推送消息后处理异常");
  579. }
  580. }
  581. private async void btnDelPos_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  582. {
  583. try
  584. {
  585. var ids = gridView2.GetSelectedRows();
  586. using (RHDWContext db = new RHDWContext())
  587. {
  588. foreach (var id in ids)
  589. {
  590. var item = gridView2.GetRow(id) as PosRes;
  591. var delItem = await db.PosRes.Where(p => p.ID == item.ID).FirstOrDefaultAsync();
  592. if (delItem != null)
  593. {
  594. db.PosRes.Remove(delItem);
  595. mapControl1.DelPosItem<PosRes>(item);
  596. }
  597. }
  598. await db.SaveChangesAsync();
  599. }
  600. gridView2.DeleteSelectedRows();
  601. }
  602. catch (Exception ex)
  603. {
  604. Serilog.Log.Error(ex, "删除定位结果异常");
  605. DxHelper.MsgBoxHelper.ShowError("删除定位结果异常");
  606. }
  607. }
  608. private void gridView2_RowClick(object sender, RowClickEventArgs e)
  609. {
  610. var p = gridView2.GetFocusedRow() as PosRes;
  611. p.Selected = true;
  612. mapControl1.UpdatePosItem(p);
  613. }
  614. private async void btnTar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  615. {
  616. try
  617. {
  618. var ids = gridView2.GetSelectedRows();
  619. if (ids.Length <= 0) return;
  620. var fisrtitem = gridView2.GetRow(ids[0]) as PosRes;
  621. EditorTar frm = new EditorTar(new TargetInfo() { ID = fisrtitem.TargetID.HasValue ? fisrtitem.TargetID.Value : 0, TargetName = fisrtitem.TarName });
  622. if (frm.ShowDialog() != DialogResult.OK) return;
  623. var tar = frm.info;
  624. using (RHDWContext db = new RHDWContext())
  625. {
  626. foreach (var id in ids)
  627. {
  628. var item = gridView2.GetRow(id) as PosRes;
  629. var tarItem = await db.PosRes.Where(p => p.ID == item.ID).FirstOrDefaultAsync();
  630. if (tarItem != null)
  631. {
  632. item.TargetID = tarItem.TargetID = tar.ID;
  633. item.TarName = tarItem.TarName = tar.TargetName;
  634. }
  635. }
  636. await db.SaveChangesAsync();
  637. }
  638. }
  639. catch (Exception ex)
  640. {
  641. Serilog.Log.Error(ex, "编辑定位目标异常");
  642. DxHelper.MsgBoxHelper.ShowError("编辑定位目标异常");
  643. }
  644. }
  645. private void btnDrawDto_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  646. {
  647. var info = GetPosRes("绘制时差");
  648. var posRes = info.Item1;
  649. if (posRes == null) return;
  650. var posType = info.Item2;
  651. DrawDtoLine(posRes, posType);
  652. }
  653. private (PosRes, EnumPosType) GetPosRes(string msg)
  654. {
  655. var ids = gridView2.GetSelectedRows();
  656. if (ids.Length <= 0)
  657. {
  658. DxHelper.MsgBoxHelper.ShowWarning($"请选择需要{msg}的定位数据信息!");
  659. return (null, default);
  660. }
  661. var item = gridView2.GetRow(ids[0]) as PosRes;
  662. var taskInfo = list.Find(m => m.ID == item.TaskID);
  663. if (taskInfo == null)
  664. {
  665. DxHelper.MsgBoxHelper.ShowWarning($"{msg}未找到任务[{item.TaskID}]!");
  666. return (null, default);
  667. }
  668. return (item, taskInfo.PosType);
  669. }
  670. private EnumPosType GetPosRes(PosRes posRes, string msg)
  671. {
  672. var taskInfo = list.Find(m => m.ID == posRes.TaskID);
  673. if (taskInfo == null)
  674. {
  675. DxHelper.MsgBoxHelper.ShowWarning($"{msg}未找到任务[{posRes.TaskID}]!");
  676. return default;
  677. }
  678. return taskInfo.PosType;
  679. }
  680. private void btnDrawDfo_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  681. {
  682. var info = GetPosRes("绘制频差");
  683. var posRes = info.Item1;
  684. if (posRes == null) return;
  685. var posType = info.Item2;
  686. DrawDfoLine(posRes, posType);
  687. }
  688. private void btnDrawCX_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  689. {
  690. var ids = gridView2.GetSelectedRows();
  691. if (ids.Length <= 0)
  692. {
  693. DxHelper.MsgBoxHelper.ShowWarning($"请选择需要绘制测向线的定位数据信息!");
  694. return;
  695. }
  696. var item = gridView2.GetRow(ids[0]) as PosRes;
  697. DrawCXLine(item);
  698. }
  699. private void btnGDOP_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  700. {
  701. var info = GetPosRes("绘制GDOP");
  702. var posRes = info.Item1;
  703. if (posRes == null) return;
  704. var posType = info.Item2;
  705. DrawGDOP(posRes.SigTime, posType);
  706. }
  707. private void DrawGDOP(DateTime sigTime, EnumPosType posType)
  708. {
  709. try
  710. {
  711. switch (posType)
  712. {
  713. case EnumPosType.X1D1CX:
  714. X1D1GDOPParam x1D1GdopParam = new X1D1GDOPParam(sigTime);
  715. x1D1GdopParam.mapControl1 = mapControl1;
  716. DxHelper.PopupHelper.ShowPopup(x1D1GdopParam, mapControl1, mapControl1.Width / 4);
  717. break;
  718. case EnumPosType.X2D1:
  719. X2D1GDOPParam x2D1GdopParam = new X2D1GDOPParam(sigTime);
  720. x2D1GdopParam.mapControl1 = mapControl1;
  721. DxHelper.PopupHelper.ShowPopup(x2D1GdopParam, mapControl1, mapControl1.Width / 4);
  722. break;
  723. case EnumPosType.RH:
  724. GDOPParam gdopParam = new GDOPParam(sigTime);
  725. gdopParam.mapControl1 = mapControl1;
  726. DxHelper.PopupHelper.ShowPopup(gdopParam, mapControl1, mapControl1.Width / 4);
  727. break;
  728. default:
  729. break;
  730. }
  731. }
  732. catch (Exception ex)
  733. {
  734. DxHelper.MsgBoxHelper.ShowWarning($"绘制{posType.GetEnumDisplayName()}GDOP失败,{ex.Message}");
  735. }
  736. }
  737. private void DrawDtoLine(PosRes item, EnumPosType posType)
  738. {
  739. switch (posType)
  740. {
  741. case EnumPosType.X1D1CX:
  742. case EnumPosType.X2D1:
  743. DrawXDtoLine(item, posType);
  744. break;
  745. case EnumPosType.RH:
  746. DrawXDtoLine(item, EnumPosType.X1D1CX);
  747. DrawXDtoLine(item, EnumPosType.X2D1);
  748. break;
  749. default:
  750. break;
  751. }
  752. }
  753. private async void DrawXDtoLine(PosRes item, EnumPosType posType)
  754. {
  755. try
  756. {
  757. List<TxInfo> listTx = new List<TxInfo>();
  758. List<SatInfo> listSat = new List<SatInfo>();
  759. CgRes cg;
  760. using (RHDWContext db = new RHDWContext())
  761. {
  762. listTx = db.TxInfos.ToList();
  763. listSat = db.SatInfos.ToList();
  764. cg = await db.CgRes.Where(m => m.ID == item.CgResID).FirstOrDefaultAsync();
  765. }
  766. if (cg == null)
  767. {
  768. DxHelper.MsgBoxHelper.ShowWarning($"未找到定位相关的计算[{item.CgResID}]信息");
  769. return;
  770. }
  771. var satTx = listTx.Find(p => p.TxType == EnumTxType.MainSat);
  772. if (satTx == null)
  773. {
  774. DxHelper.MsgBoxHelper.ShowWarning($"主星天线信息为空!");
  775. return;
  776. }
  777. var satNTx = listTx.Find(p => p.TxType == EnumTxType.AdjaSat);
  778. if (posType == EnumPosType.X2D1 && satNTx == null)
  779. {
  780. DxHelper.MsgBoxHelper.ShowWarning($"邻星天线信息为空!");
  781. return;
  782. }
  783. var cdbTx = listTx.Find(p => p.TxType == EnumTxType.Cdb);
  784. if (cdbTx == null)
  785. {
  786. DxHelper.MsgBoxHelper.ShowWarning($"超短波信息为空!");
  787. return;
  788. }
  789. var refTx = listTx.Find(p => p.TxType == EnumTxType.Ref);
  790. if (refTx == null)
  791. {
  792. DxHelper.MsgBoxHelper.ShowWarning($"参考站信息为空!");
  793. return;
  794. }
  795. DtoLineXdOption dtoLineXd = new DtoLineXdOption();
  796. dtoLineXd.MsEph = new double[] { cg.MainX, cg.MainY, cg.MainZ, 0, 0, 0 };
  797. dtoLineXd.MsAnt = new double[] { satTx.Lon, satTx.Lat, 0 };
  798. dtoLineXd.CDBAnt = new double[] { cdbTx.Lon, cdbTx.Lat, 0 };
  799. dtoLineXd.RefGeod = new double[] { refTx.Lon, refTx.Lat, 0 };
  800. dtoLineXd.xdDto = cg.DtoCdb;
  801. dtoLineXd.RefDto = cg.YbMain;
  802. dtoLineXd.PosLon = item.PosLon;
  803. dtoLineXd.PosLat = item.PosLat;
  804. var xdDtoLine = DrawDtoLineHelper.DtoLineXd(dtoLineXd);
  805. mapControl1.DrawDtoPonit($"星地[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == cdbTx.ID)?.Sat}]时差线", xdDtoLine);
  806. if (posType == EnumPosType.X2D1)
  807. {
  808. DtoLineTwoStartOption twoStartOption = new DtoLineTwoStartOption();
  809. twoStartOption.MsEph = new double[] { cg.MainX, cg.MainY, cg.MainZ, 0, 0, 0 };
  810. twoStartOption.NsEph = new double[] { cg.AdjaX, cg.AdjaY, cg.AdjaZ, 0, 0, 0 };
  811. twoStartOption.MsAnt = new double[] { satTx.Lon, satTx.Lat, 0 };
  812. twoStartOption.NsAnt = new double[] { satNTx.Lon, satNTx.Lat, 0 };
  813. twoStartOption.RefGeod = new double[] { refTx.Lon, refTx.Lat, 0 };
  814. twoStartOption.TargetDto = cg.DtoSx;
  815. twoStartOption.RefDto = cg.YbMain - cg.YbAdja;
  816. twoStartOption.PosLon = item.PosLon;
  817. twoStartOption.PosLat = item.PosLat;
  818. var tsDtoLine = DrawDtoLineHelper.DtoLineXDTwoStart(twoStartOption);
  819. mapControl1.DrawDtoPonit($"双星[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == satNTx.ID)?.Sat}]时差线", tsDtoLine);
  820. }
  821. }
  822. catch (Exception ex)
  823. {
  824. Serilog.Log.Error($"绘制{posType.GetEnumDisplayName()}时差线失败", ex);
  825. DxHelper.MsgBoxHelper.ShowWarning($"绘制{posType.GetEnumDisplayName()}时差线失败,失败信息:{ex.Message}");
  826. }
  827. }
  828. private void DrawDfoLine(PosRes item, EnumPosType posType)
  829. {
  830. switch (posType)
  831. {
  832. case EnumPosType.X1D1CX:
  833. case EnumPosType.X2D1:
  834. DrawXDfoLine(item, posType);
  835. break;
  836. case EnumPosType.RH:
  837. DrawXDfoLine(item, EnumPosType.X1D1CX);
  838. DrawXDfoLine(item, EnumPosType.X2D1);
  839. break;
  840. default:
  841. break;
  842. }
  843. }
  844. private async void DrawXDfoLine(PosRes item, EnumPosType posType)
  845. {
  846. try
  847. {
  848. List<TxInfo> listTx = new List<TxInfo>();
  849. List<SatInfo> listSat = new List<SatInfo>();
  850. CgRes cg;
  851. using (RHDWContext db = new RHDWContext())
  852. {
  853. listTx = db.TxInfos.ToList();
  854. listSat = db.SatInfos.ToList();
  855. cg = await db.CgRes.Where(m => m.ID == item.CgResID).FirstOrDefaultAsync();
  856. }
  857. if (cg == null)
  858. {
  859. DxHelper.MsgBoxHelper.ShowWarning($"未找到定位相关的计算[{item.CgResID}]信息");
  860. return;
  861. }
  862. var satTx = listTx.Find(p => p.TxType == EnumTxType.MainSat);
  863. if (satTx == null)
  864. {
  865. DxHelper.MsgBoxHelper.ShowWarning($"主星天线信息为空!");
  866. return;
  867. }
  868. var satNTx = listTx.Find(p => p.TxType == EnumTxType.AdjaSat);
  869. if (posType == EnumPosType.X2D1 && satNTx == null)
  870. {
  871. DxHelper.MsgBoxHelper.ShowWarning($"邻星天线信息为空!");
  872. return;
  873. }
  874. var cdbTx = listTx.Find(p => p.TxType == EnumTxType.Cdb);
  875. if (cdbTx == null)
  876. {
  877. DxHelper.MsgBoxHelper.ShowWarning($"超短波信息为空!");
  878. return;
  879. }
  880. var refTx = listTx.Find(p => p.TxType == EnumTxType.Ref);
  881. if (refTx == null)
  882. {
  883. DxHelper.MsgBoxHelper.ShowWarning($"参考站信息为空!");
  884. return;
  885. }
  886. DtoLineXdOption dtoLineXd = new DtoLineXdOption();
  887. dtoLineXd.MsEph = new double[] { cg.MainX, cg.MainY, cg.MainZ, 0, 0, 0 };
  888. dtoLineXd.MsAnt = new double[] { satTx.Lon, satTx.Lat, 0 };
  889. dtoLineXd.CDBAnt = new double[] { cdbTx.Lon, cdbTx.Lat, 0 };
  890. dtoLineXd.RefGeod = new double[] { refTx.Lon, refTx.Lat, 0 };
  891. dtoLineXd.xdDto = cg.DtoCdb;
  892. dtoLineXd.RefDto = cg.YbMain;
  893. dtoLineXd.PosLon = item.PosLon;
  894. dtoLineXd.PosLat = item.PosLat;
  895. var xdDtoLine = DrawDtoLineHelper.DtoLineXd(dtoLineXd);
  896. mapControl1.DrawDtoPonit($"星地[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == cdbTx.ID)?.Sat}]时差线", xdDtoLine);
  897. if (posType == EnumPosType.X2D1)
  898. {
  899. DtoLineTwoStartOption twoStartOption = new DtoLineTwoStartOption();
  900. twoStartOption.MsEph = new double[] { cg.MainX, cg.MainY, cg.MainZ, 0, 0, 0 };
  901. twoStartOption.NsEph = new double[] { cg.AdjaX, cg.AdjaY, cg.AdjaZ, 0, 0, 0 };
  902. twoStartOption.MsAnt = new double[] { satTx.Lon, satTx.Lat, 0 };
  903. twoStartOption.NsAnt = new double[] { satNTx.Lon, satNTx.Lat, 0 };
  904. twoStartOption.RefGeod = new double[] { refTx.Lon, refTx.Lat, 0 };
  905. twoStartOption.TargetDto = cg.DtoSx;
  906. twoStartOption.RefDto = cg.YbMain - cg.YbAdja;
  907. twoStartOption.PosLon = item.PosLon;
  908. twoStartOption.PosLat = item.PosLat;
  909. var tsDtoLine = DrawDtoLineHelper.DtoLineXDTwoStart(twoStartOption);
  910. mapControl1.DrawDtoPonit($"双星[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == satNTx.ID)?.Sat}]时差线", tsDtoLine);
  911. }
  912. }
  913. catch (Exception ex)
  914. {
  915. Serilog.Log.Error($"绘制{posType.GetEnumDisplayName()}频差线失败", ex);
  916. DxHelper.MsgBoxHelper.ShowWarning($"绘制{posType.GetEnumDisplayName()}频差线失败,失败信息:{ex.Message}");
  917. }
  918. }
  919. private async void DrawCXLine(PosRes item)
  920. {
  921. if (!item.CxResID.HasValue)
  922. {
  923. DxHelper.MsgBoxHelper.ShowWarning($"绘制测向线未有测向编号!");
  924. return;
  925. }
  926. try
  927. {
  928. List<TxInfo> listTx = new List<TxInfo>();
  929. CxRes cx;
  930. using (RHDWContext db = new RHDWContext())
  931. {
  932. listTx = db.TxInfos.ToList();
  933. cx = await db.CxRes.Where(m => m.ID == item.CxResID.Value).FirstOrDefaultAsync();
  934. }
  935. if (cx == null)
  936. {
  937. DxHelper.MsgBoxHelper.ShowWarning($"未找到定位相关的测向[{item.CxResID.Value}]信息");
  938. return;
  939. }
  940. var satTx = listTx.Find(p => p.TxType == EnumTxType.Cx);
  941. if (satTx == null)
  942. {
  943. DxHelper.MsgBoxHelper.ShowWarning($"测向站信息为空!");
  944. return;
  945. }
  946. double startdeg =360;
  947. double deg = startdeg- cx.Fx;//向北顺时针方向为夹角
  948. //计算测向站到定位点之间的距离
  949. var km = MapControlEx.CalcLineKm(satTx.Lon, satTx.Lat, item.PosLon, item.PosLat);
  950. var endpoint = MapControlEx.CalcSituation(satTx.Lon, satTx.Lat, deg, (km+100) * 1000);
  951. List<(double, double)> points = new List<(double, double)>();
  952. points.Add((satTx.Lon, satTx.Lat));
  953. points.Add((endpoint.Item1, endpoint.Item2));
  954. mapControl1.DrawCXLine($"测向线角度:{cx.Fx}°\t\n", points);
  955. }
  956. catch (Exception ex)
  957. {
  958. Serilog.Log.Error($"绘制测向线失败", ex);
  959. DxHelper.MsgBoxHelper.ShowWarning($"绘制测向线失败,失败信息:{ex.Message}");
  960. }
  961. }
  962. }
  963. }