CtrlHome.cs 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162
  1. using DevExpress.Utils;
  2. using DevExpress.Utils.Drawing;
  3. using DevExpress.Utils.Svg;
  4. using DevExpress.XtraEditors.ButtonsPanelControl;
  5. using DevExpress.XtraGrid.Views.Grid;
  6. using DxHelper;
  7. using Microsoft.Owin.Hosting;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.ComponentModel.DataAnnotations;
  11. using System.Data;
  12. using System.Data.Entity;
  13. using System.Drawing;
  14. using System.Linq;
  15. using System.Net;
  16. using System.Reflection;
  17. using System.Text;
  18. using System.Windows.Forms;
  19. using XdCxRhDW.App.Api;
  20. using XdCxRhDW.App.EditForms;
  21. using XdCxRhDW.Repostory.Model;
  22. using XdCxRhDW.Repostory.EFContext;
  23. using XdCxRhDW.WebApi;
  24. using XdCxRhDW.Core.ObServer;
  25. using ExtensionsDev;
  26. using DevExpress.XtraEditors;
  27. using System.Data.Entity.Migrations;
  28. using System.Threading;
  29. using System.Threading.Tasks;
  30. using System.IO;
  31. namespace XdCxRhDW.App.UserControl
  32. {
  33. public partial class CtrlHome : DevExpress.XtraEditors.XtraUserControl
  34. {
  35. List<TaskInfo> list = new List<TaskInfo>();
  36. TaskInfo tsk = new TaskInfo();
  37. List<CancellationTokenSource> listCts = new List<CancellationTokenSource>();
  38. public CtrlHome()
  39. {
  40. InitializeComponent();
  41. gridHomeTask.Init<TaskInfo>().UseFilter();
  42. gridHomePosRes.Init<PosRes>().UseMultiSelect().UseRowNumber().UseFilter();
  43. layoutControl1.UseDefault();
  44. txtStartTime.UseDefault();
  45. txtEndTime.UseDefault();
  46. btnDrawDto.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\DtoLine.svg");
  47. btnDrawDfo.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\DfoLine.svg");
  48. btnGDOP.ImageOptions.SvgImage = SvgHelper.LoadFromFile("Image\\GDOP.svg");
  49. var mapService = string.Empty;//http://ows.mundialis.de/services/service
  50. using (RHDWContext db = new RHDWContext())
  51. {
  52. mapService = db.SysSetings.FirstOrDefault()?.MapService;
  53. }
  54. mapControl1.UseDefalutOptions()
  55. //.UseCluster()//定位点使用内置聚合
  56. .UseClearAll()
  57. .UseDistanceLine()
  58. .UseMarkDot()
  59. .UseExportImg()
  60. .UseExportXlsx()
  61. .UseExportCsv()
  62. .SetMapLayerType(mapService)
  63. //.SetMapLayerType("")
  64. //.UseHJ(item =>
  65. //{
  66. // (double Lon, double Lat) = item;
  67. // PosRes pos = new PosRes();
  68. // pos.PosLon = Lon;
  69. // pos.PosLat = Lat;
  70. // pos.SigTime = DateTime.Now;
  71. // mapControl1.AddHJPosItem(pos);
  72. //})
  73. .UseDrawRect(rect =>
  74. {
  75. (double startLon, double startLat, double centerLon, double centerLat, double endLon, double endLat, double lonRange, double latRange) = rect;
  76. });
  77. PosObServer.Instance.Sub(PosSubEvent);
  78. }
  79. private void PosSubEvent(PosRes posRes)
  80. {
  81. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  82. if (currentTask.ID == posRes.TaskInfoID)
  83. {
  84. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  85. ds.Insert(0, posRes);
  86. this.Invoke(new Action(() =>
  87. {
  88. gridView2.RefreshData();
  89. mapControl1.AddPosItem(posRes);
  90. }));
  91. }
  92. }
  93. private async void CtrlHome_Load(object sender, EventArgs e)
  94. {
  95. gridView1.FocusedRowObjectChanged += GridView1_FocusedRowObjectChanged;
  96. gridView2.FocusedRowObjectChanged += GridView2_FocusedRowObjectChanged;
  97. try
  98. {
  99. List<TxInfo> txList = new List<TxInfo>();
  100. using (RHDWContext db = new RHDWContext())
  101. {
  102. var qq = db.TaskInfos.OrderByDescending(p => p.CreateTime).ToList();
  103. list.AddRange(qq);
  104. var runningList = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running).ToListAsync();
  105. foreach (var item in runningList)
  106. {
  107. item.TaskState = EnumTaskState.Stopped;
  108. }
  109. await db.SaveChangesAsync();
  110. var satres = db.SatInfos.OrderBy(p => p.SatName).OrderBy(p => p.SatName);
  111. var txres = await db.TxInfos.ToListAsync();
  112. txList.AddRange(txres);
  113. }
  114. mapControl1.AddRectMenu<PosRes>("删除定位点", SvgHelper.CreateClose(), items =>
  115. {
  116. DeletePosRes(items);
  117. });
  118. mapControl1.AddRectMenu<PosRes>("使用镜像点", SvgHelper.LoadFromFile("Image\\Pos.svg"), items =>
  119. {
  120. UseMirr(items);
  121. });
  122. mapControl1.AddPosMenu<PosRes>("绘制时差线", SvgHelper.LoadFromFile("Image\\DtoLine.svg"), item =>
  123. {
  124. DrawDtoLine(item);
  125. }, p =>
  126. {
  127. switch (p.PosResType)
  128. {
  129. case EnumPosResType.X3TwoDfo:
  130. case EnumPosResType.RH:
  131. default:
  132. return false;
  133. case EnumPosResType.X1D1CX:
  134. case EnumPosResType.X2D1:
  135. case EnumPosResType.X2D1NoRef:
  136. case EnumPosResType.X3:
  137. case EnumPosResType.X3NoRef:
  138. case EnumPosResType.X2Dfo:
  139. return true;
  140. }
  141. })
  142. .AddPosMenu<PosRes>("绘制频差线", SvgHelper.LoadFromFile("Image\\DfoLine.svg"), item =>
  143. {
  144. DrawDfoLine(item);
  145. }, p =>
  146. {
  147. switch (p.PosResType)
  148. {
  149. case EnumPosResType.X3TwoDfo:
  150. case EnumPosResType.X2Dfo:
  151. return true;
  152. case EnumPosResType.X2D1:
  153. case EnumPosResType.X2D1NoRef:
  154. case EnumPosResType.RH:
  155. case EnumPosResType.X3:
  156. case EnumPosResType.X3NoRef:
  157. case EnumPosResType.X1D1CX:
  158. default:
  159. return false;
  160. }
  161. })
  162. .AddPosMenu<PosRes>("绘制GDOP", SvgHelper.LoadFromFile("Image\\GDOP.svg"), item =>
  163. {
  164. DrawGDOP(item);
  165. }, p =>
  166. {
  167. switch (p.PosResType)
  168. {
  169. case EnumPosResType.X3TwoDfo:
  170. case EnumPosResType.X2Dfo:
  171. case EnumPosResType.X2D1:
  172. case EnumPosResType.X2D1NoRef:
  173. case EnumPosResType.X3:
  174. case EnumPosResType.X3NoRef:
  175. case EnumPosResType.X1D1CX:
  176. return true;
  177. case EnumPosResType.RH:
  178. default:
  179. return false;
  180. }
  181. })
  182. .AddPosMenu<PosRes>("绘制测向线", btnDrawCX.ImageOptions.SvgImage, item =>
  183. {
  184. DrawCXLine(item);
  185. }, p =>
  186. {
  187. switch (p.PosResType)
  188. {
  189. case EnumPosResType.X1D1CX:
  190. return true;
  191. case EnumPosResType.RH:
  192. case EnumPosResType.X3TwoDfo:
  193. case EnumPosResType.X2Dfo:
  194. case EnumPosResType.X2D1:
  195. case EnumPosResType.X2D1NoRef:
  196. case EnumPosResType.X3:
  197. case EnumPosResType.X3NoRef:
  198. default:
  199. return false;
  200. }
  201. });
  202. }
  203. catch (Exception ex)
  204. {
  205. Serilog.Log.Error(ex, "加载任务信息异常");
  206. DxHelper.MsgBoxHelper.ShowError("加载任务信息异常");
  207. }
  208. gridHomeTask.DataSource = list;
  209. gridView1.Columns[nameof(TaskInfo.TaskName)].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Near;
  210. this.svgImageCollection1.Add("Stopped", SvgHelper.CreateCycle("#1E8B58"));
  211. this.svgImageCollection1.Add("Running", SvgHelper.CreateCycle("#2E8B57"));
  212. gridView1.CustomDrawCell += GridView1_CustomDrawCell;
  213. gridView1.CustomColumnDisplayText += GridView1_CustomColumnDisplayText;
  214. gridView1.RowClick += GridView1_RowClick;
  215. using (RHDWContext db = new RHDWContext())
  216. {
  217. var settings = await db.SysSetings.FirstOrDefaultAsync();
  218. if (settings == null)
  219. {
  220. DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息");
  221. return;
  222. }
  223. try
  224. {
  225. StartOptions options = new StartOptions();
  226. options.Urls.Add($"http://+:{settings.HttpPort}");
  227. httpServer = WebApp.Start<Startup>(options);
  228. }
  229. catch (System.Reflection.TargetInvocationException ex)
  230. {
  231. httpServer = null;
  232. Serilog.Log.Error(ex, $"启动Http服务失败!");
  233. if (ex.InnerException is HttpListenerException)
  234. {
  235. DxHelper.MsgBoxHelper.ShowWarning($"{ex.InnerException.Message}");
  236. }
  237. else
  238. {
  239. DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
  240. }
  241. }
  242. catch (Exception ex)
  243. {
  244. httpServer = null;
  245. Serilog.Log.Error(ex, $"启动Http服务失败!");
  246. DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
  247. }
  248. }
  249. WaitHelper.CloseForm();
  250. }
  251. private async void UseMirr(IEnumerable<PosRes> items)
  252. {
  253. if (items == null || items.Count() == 0)
  254. {
  255. DxHelper.MsgBoxHelper.ShowWarning($"请选择需要使用镜像点的定位数据信息!");
  256. return;
  257. }
  258. try
  259. {
  260. if (XtraMessageBox.Show("确认使用镜像点?", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
  261. {
  262. return;
  263. }
  264. var groupItems = items.GroupBy(p => p.SigTime.ToString("yyyyMMdd"));
  265. foreach (var groupItem in groupItems)
  266. {
  267. var ids = groupItem.Select(m => m.ID).ToList();
  268. using (RHDWPartContext db = RHDWPartContext.GetContext(groupItem.First().SigTime))
  269. {
  270. var array = await db.PosRes.Where(p => ids.Contains(p.ID)).ToArrayAsync();
  271. UseMirror(array);
  272. db.PosRes.AddOrUpdate(array);
  273. await db.SaveChangesAsync();
  274. }
  275. }
  276. UseMirror(items);
  277. mapControl1.UpdatePosItem(items);
  278. }
  279. catch (Exception ex)
  280. {
  281. Serilog.Log.Error(ex, "使用镜像点失败!");
  282. MsgBoxHelper.ShowError("使用镜像点失败!");
  283. }
  284. }
  285. private async void DeletePosRes(IEnumerable<PosRes> items)
  286. {
  287. if (items == null || items.Count() == 0)
  288. {
  289. DxHelper.MsgBoxHelper.ShowWarning($"请选择需要删除的定位数据信息!");
  290. return;
  291. }
  292. try
  293. {
  294. if (XtraMessageBox.Show("确认删除定位点?", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
  295. {
  296. return;
  297. }
  298. var groupItems = items.GroupBy(p => p.SigTime.ToString("yyyyMMdd"));
  299. foreach (var groupItem in groupItems)
  300. {
  301. var ids = groupItem.Select(m => m.ID).ToList();
  302. using (RHDWPartContext db = RHDWPartContext.GetContext(groupItem.First().SigTime))
  303. {
  304. List<PosRes> list = await db.PosRes.Where(p => ids.Contains(p.ID)).ToListAsync();
  305. db.PosRes.RemoveRange(list);
  306. await db.SaveChangesAsync();
  307. }
  308. }
  309. mapControl1.DelPosItem(items);
  310. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  311. ds.RemoveAll(m => items.Select(p => p.ID).Contains(m.ID));
  312. gridView2.RefreshData();
  313. }
  314. catch (Exception ex)
  315. {
  316. Serilog.Log.Error(ex, "删除定位点失败");
  317. MsgBoxHelper.ShowError("删除定位点失败!");
  318. }
  319. }
  320. private void UseMirror(IEnumerable<PosRes> pos)
  321. {
  322. foreach (var item in pos)
  323. {
  324. var mirrlon = item.MirrLon;
  325. var mirrLat = item.MirrLat;
  326. if (mirrlon == 999)
  327. {
  328. continue;
  329. }
  330. item.MirrLon = item.PosLon;
  331. item.MirrLat = item.PosLat;
  332. item.PosLon = mirrlon;
  333. item.PosLat = mirrLat;
  334. }
  335. }
  336. private async void GridView1_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e)
  337. {
  338. listCts.ForEach(t => t.Cancel());
  339. listCts.Clear();
  340. var cts = new CancellationTokenSource();
  341. listCts.Add(cts);
  342. mapControl1.DelFixedImg("Sat");
  343. mapControl1.DelFixedImg("Tx");
  344. tsk = (e.Row as TaskInfo);
  345. if (tsk == null) return;
  346. var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
  347. var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
  348. btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
  349. List<PosRes> listPos = await searchPos(cts.Token);
  350. this.gridHomePosRes.DataSource = listPos;
  351. using (RHDWContext db = new RHDWContext())
  352. {
  353. var sat1 = db.SatInfos.Where(p => p.SatCode == tsk.MainSat).FirstOrDefault();
  354. var sat2 = db.SatInfos.Where(p => p.SatCode == tsk.Adja1Sat).FirstOrDefault();
  355. var sat3 = db.SatInfos.Where(p => p.SatCode == tsk.Adja2Sat).FirstOrDefault();
  356. if (sat1 != null && sat1.SatLon != null)
  357. mapControl1.DrawFixedImg("Sat", 0, sat1.SatLon.Value, DxHelper.SvgHelper.CreateSat(), $"主星\r\n{sat1.Sat}");
  358. if (sat2 != null && sat2.SatLon != null)
  359. mapControl1.DrawFixedImg("Sat", 0, sat2.SatLon.Value, DxHelper.SvgHelper.CreateSat(), $"邻1星\r\n{sat2.Sat}");
  360. if (sat3 != null && sat3.SatLon != null)
  361. mapControl1.DrawFixedImg("Sat", 0, sat3.SatLon.Value, DxHelper.SvgHelper.CreateSat(), $"邻2星\r\n{sat3.Sat}");
  362. }
  363. mapControl1.SetPosDataSource(listPos);
  364. }
  365. private void GridView2_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e)
  366. {
  367. mapControl1.DelFixedImg("Tx");
  368. var posItem = (e.Row as PosRes);
  369. if (posItem == null) return;
  370. using (RHDWPartContext db = RHDWPartContext.GetContext(posItem.SigTime))
  371. {
  372. var station = db.StationRes.Where(p => p.ID == posItem.StationResID).FirstOrDefault();
  373. if (station != null)
  374. {
  375. mapControl1.DrawFixedImg("Tx", station.SatTxLat, station.SatTxLon, DxHelper.SvgHelper.CreateAnt(), $"[卫星接收天线]\r\n经度:{station.SatTxLon}°\r\n纬度:{station.SatTxLat}°");
  376. if (station.CdbTxLon != null)
  377. mapControl1.DrawFixedImg("Tx", station.CdbTxLat.Value, station.CdbTxLon.Value, DxHelper.SvgHelper.CreateAnt(), $"[超短接收天线]\r\n经度:{station.CdbTxLon.Value}°\r\n纬度:{station.CdbTxLat.Value}°");
  378. if (station.RefLon != null)
  379. mapControl1.DrawFixedImg("Tx", station.RefLat.Value, station.RefLon.Value, DxHelper.SvgHelper.CreatePentagram(), $"[参考站]\r\n经度:{station.RefLon.Value}°\r\n纬度:{station.RefLat.Value}°");
  380. if (station.CxLon != null)
  381. mapControl1.DrawFixedImg("Tx", station.CxLat.Value, station.CxLon.Value, DxHelper.SvgHelper.CreatePentagram(), $"[测向站]\r\n经度:{station.CxLon.Value}°\r\n纬度:{station.CxLat.Value}°");
  382. }
  383. }
  384. }
  385. private void GridView1_RowClick(object sender, RowClickEventArgs e)
  386. {
  387. if (e.Clicks > 1)
  388. {
  389. layoutControlGroup1_CustomButtonClick(null, new DevExpress.XtraBars.Docking2010.BaseButtonEventArgs(new GroupBoxButton() { Caption = "编辑任务" }));
  390. }
  391. }
  392. private void GridView1_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
  393. {
  394. if (e.Column.FieldName == nameof(TaskInfo.Freq))
  395. {
  396. e.DisplayText = $"{(long)e.Value / 1e6}MHz";
  397. }
  398. else if (e.Column.FieldName == nameof(TaskInfo.Band))
  399. {
  400. e.DisplayText = $"{(int)e.Value / 1e6}MHz";
  401. }
  402. }
  403. private void GridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
  404. {
  405. if (e.Column.FieldName == nameof(TaskInfo.TaskName) && (EnumTaskState)gridView1.GetRowCellValue(e.RowHandle, nameof(TaskInfo.TaskState)) == EnumTaskState.Running)
  406. {
  407. var palette = SvgPaletteHelper.GetSvgPalette(this.LookAndFeel, ObjectState.Normal);
  408. 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);
  409. Rectangle txtBounds = e.Bounds;
  410. txtBounds.Width -= 24;
  411. txtBounds.X += 24;
  412. e.Appearance.DrawString(e.Cache, e.DisplayText, txtBounds);
  413. e.Handled = true;
  414. }
  415. }
  416. private void toolTipController1_GetActiveObjectInfo(object sender, DevExpress.Utils.ToolTipControllerGetActiveObjectInfoEventArgs e)
  417. {
  418. var hitInfo = gridView1.CalcHitInfo(e.ControlMousePosition);
  419. if (hitInfo.RowHandle < 0 || hitInfo.Column == null || hitInfo.HitTest != DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitTest.RowCell)
  420. {
  421. toolTipController1.HideHint();
  422. return;
  423. }
  424. if (hitInfo.Column.FieldName == nameof(TaskInfo.TaskName))
  425. {
  426. var state = (EnumTaskState)gridView1.GetRowCellValue(hitInfo.RowHandle, nameof(TaskInfo.TaskState));
  427. if (state == EnumTaskState.Running)
  428. e.Info = new ToolTipControlInfo(hitInfo.RowHandle, "执行中");
  429. }
  430. }
  431. private void gridView1_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e)
  432. {
  433. if (gridView1.FocusedRowHandle < 0) return;
  434. var state = (EnumTaskState)gridView1.GetFocusedRowCellValue(nameof(TaskInfo.TaskState));
  435. btnStart.Enabled = state == EnumTaskState.Stopped;
  436. btnStop.Enabled = state == EnumTaskState.Running;
  437. popupMenu1.ShowPopup(MousePosition);
  438. }
  439. private void gridView2_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e)
  440. {
  441. if (gridView2.FocusedRowHandle < 0) return;
  442. var posRes = GetPosRes("");
  443. switch (posRes.PosResType)
  444. {
  445. case EnumPosResType.X1D1CX:
  446. //一星一地 测向线 GDOP
  447. btnDrawDfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  448. btnDrawDto.Visibility = btnGDOP.Visibility = btnDrawCX.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  449. break;
  450. case EnumPosResType.X2D1:
  451. case EnumPosResType.X2D1NoRef:
  452. //两星一地 GDOP 时差线
  453. btnDrawDto.Visibility = btnGDOP.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  454. btnDrawCX.Visibility = btnDrawDfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  455. break;
  456. case EnumPosResType.RH:
  457. //融合DW=
  458. btnDrawDto.Visibility = btnDrawCX.Visibility = btnGDOP.Visibility = btnDrawDfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  459. break;
  460. case EnumPosResType.X3:
  461. case EnumPosResType.X3NoRef:
  462. //三星双时差DW GDOP 时差线
  463. btnDrawDto.Visibility = btnGDOP.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  464. btnDrawCX.Visibility = btnDrawDfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  465. break;
  466. case EnumPosResType.X3TwoDfo:
  467. //三星双频差DW GDOP 频差线
  468. btnDrawDfo.Visibility = btnGDOP.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  469. btnDrawDto.Visibility = btnDrawCX.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  470. break;
  471. case EnumPosResType.X2Dfo:
  472. //双星时频差DW GDOP 时频差线
  473. btnDrawDto.Visibility = btnDrawDfo.Visibility = btnGDOP.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  474. btnDrawCX.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  475. break;
  476. default:
  477. break;
  478. }
  479. popupMenu2.ShowPopup(MousePosition);
  480. }
  481. private async void layoutControlGroup1_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
  482. {
  483. var txt = (e.Button as GroupBoxButton).Caption;
  484. if (txt == "新建任务")
  485. {
  486. try
  487. {
  488. TaskEditor frm = new TaskEditor();
  489. if (frm.ShowDialog() != DialogResult.OK) return;
  490. var addItem = frm.info;
  491. using (RHDWContext db = new RHDWContext())
  492. {
  493. if (await db.TaskInfos.AnyAsync(p => p.TaskName == addItem.TaskName))
  494. {
  495. DxHelper.MsgBoxHelper.ShowWarning("任务名称重复");
  496. return;
  497. }
  498. if (addItem.PosType == EnumPosType.X1D1CX)
  499. {
  500. addItem.Adja1Sat = null;
  501. addItem.Adja2Sat = null;
  502. }
  503. else if (addItem.PosType == EnumPosType.X2D1 || addItem.PosType == EnumPosType.X2Dfo || addItem.PosType == EnumPosType.RH)
  504. {
  505. addItem.Adja2Sat = null;
  506. }
  507. db.TaskInfos.Add(addItem);
  508. await db.SaveChangesAsync();
  509. }
  510. list.Insert(0, addItem);
  511. gridView1.RefreshData();
  512. gridView1.FocusedRowHandle = 0;
  513. }
  514. catch (Exception ex)
  515. {
  516. Serilog.Log.Error(ex, "保存任务异常");
  517. DxHelper.MsgBoxHelper.ShowError("保存任务异常");
  518. }
  519. }
  520. else if (txt == "编辑任务")
  521. {
  522. try
  523. {
  524. var editItem = gridView1.GetFocusedRow() as TaskInfo;
  525. TaskEditor frm = new TaskEditor(editItem);
  526. if (frm.ShowDialog() != DialogResult.OK) return;
  527. editItem = frm.info;
  528. using (RHDWContext db = new RHDWContext())
  529. {
  530. if (await db.TaskInfos.AnyAsync(p => p.ID != editItem.ID && p.TaskName == editItem.TaskName))
  531. {
  532. DxHelper.MsgBoxHelper.ShowWarning("任务名称重复");
  533. return;
  534. }
  535. var find = await db.TaskInfos.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync();
  536. find.TaskName = editItem.TaskName;
  537. find.PosType = editItem.PosType;
  538. find.UpdateTime = DateTime.Now;
  539. find.Freq = editItem.Freq;
  540. find.Band = editItem.Band;
  541. find.MainSat = editItem.MainSat;
  542. if (find.PosType == EnumPosType.X1D1CX)
  543. {
  544. find.Adja1Sat = null;
  545. find.Adja2Sat = null;
  546. }
  547. else if (find.PosType == EnumPosType.X2D1 || find.PosType == EnumPosType.X2Dfo || find.PosType == EnumPosType.RH)
  548. {
  549. find.Adja2Sat = null;
  550. }
  551. else
  552. {
  553. find.Adja1Sat = editItem.Adja1Sat;
  554. find.Adja2Sat = editItem.Adja2Sat;
  555. }
  556. await db.SaveChangesAsync();
  557. }
  558. gridView1.RefreshData();
  559. }
  560. catch (Exception ex)
  561. {
  562. Serilog.Log.Error(ex, "保存任务异常");
  563. DxHelper.MsgBoxHelper.ShowError("保存任务异常");
  564. }
  565. }
  566. else
  567. {
  568. try
  569. {
  570. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  571. if (tsk == null) return;
  572. if (!DxHelper.MsgBoxHelper.ShowConfirm($"删除任务[{tsk.TaskName}]?"))
  573. return;
  574. using (RHDWContext db = new RHDWContext())
  575. {
  576. var item = db.TaskInfos.FirstOrDefault(p => p.ID == tsk.ID);
  577. db.TaskInfos.Remove(item);
  578. db.SaveChanges();
  579. }
  580. gridView1.DeleteSelectedRows();
  581. }
  582. catch (Exception ex)
  583. {
  584. Serilog.Log.Error(ex, "删除任务异常");
  585. DxHelper.MsgBoxHelper.ShowError("删除任务异常");
  586. }
  587. }
  588. }
  589. IDisposable httpServer;
  590. private async void btn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  591. {
  592. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  593. if (e.Item.Caption == "启动任务")
  594. {
  595. try
  596. {
  597. using (RHDWContext db = new RHDWContext())
  598. {
  599. var find = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskState == EnumTaskState.Running && p.PosType == tsk.PosType);
  600. if (find != null)
  601. {
  602. var field = typeof(EnumPosType).GetField(Enum.GetName(typeof(EnumPosType), find.PosType));
  603. DxHelper.MsgBoxHelper.ShowWarning($"已经有一个[{field.GetCustomAttribute<DisplayAttribute>().Name}]任务正在执行,请先停止!");
  604. return;
  605. }
  606. var settings = await db.SysSetings.FirstOrDefaultAsync();
  607. if (settings == null)
  608. {
  609. DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息");
  610. return;
  611. }
  612. if (httpServer == null)
  613. {
  614. try
  615. {
  616. StartOptions options = new StartOptions();
  617. options.Urls.Add($"http://+:{settings.HttpPort}");
  618. httpServer = WebApp.Start<Startup>(options);
  619. }
  620. catch (Exception ex)
  621. {
  622. Serilog.Log.Error(ex, "启动任务异常,Http定位接口服务启动失败");
  623. DxHelper.MsgBoxHelper.ShowError($"启动任务异常,Http定位接口服务启动失败");
  624. }
  625. }
  626. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  627. item.TaskState = EnumTaskState.Running;
  628. await db.SaveChangesAsync();
  629. tsk.TaskState = EnumTaskState.Running;
  630. Serilog.Log.Information($"用户启动了任务,ID={tsk.ID}");
  631. }
  632. }
  633. catch (Exception ex)
  634. {
  635. Serilog.Log.Error(ex, "启动任务异常");
  636. DxHelper.MsgBoxHelper.ShowError($"启动任务异常.{ex.Message}");
  637. }
  638. }
  639. else
  640. {
  641. try
  642. {
  643. using (RHDWContext db = new RHDWContext())
  644. {
  645. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  646. item.TaskState = EnumTaskState.Stopped;
  647. await db.SaveChangesAsync();
  648. //if (!db.TaskInfos.Any(p => p.TaskState == EnumTaskState.Running))
  649. //{
  650. // server?.StopListening();
  651. // server = null;
  652. //}
  653. }
  654. tsk.TaskState = EnumTaskState.Stopped;
  655. Serilog.Log.Information($"用户停止了任务,ID={tsk.ID}");
  656. }
  657. catch (Exception ex)
  658. {
  659. Serilog.Log.Error(ex, "停止任务异常");
  660. DxHelper.MsgBoxHelper.ShowError($"停止任务异常.{ex.Message}");
  661. }
  662. }
  663. gridView1.RefreshData();
  664. var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
  665. var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
  666. btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
  667. }
  668. private void gridView1_CustomDrawEmptyForeground(object sender, DevExpress.XtraGrid.Views.Base.CustomDrawEventArgs e)
  669. {
  670. if (gridView1.RowCount == 0)
  671. {
  672. string txt = "点击+创建任务";
  673. var s = e.Appearance.CalcTextSize(e.Cache, txt, e.Bounds.Width).ToSize();
  674. var x = (e.Bounds.Width - s.Width) / 2;
  675. var y = (e.Bounds.Height - s.Height) / 2;
  676. //e.Appearance.DrawString(e.Cache, txt, new Rectangle(x,y,s.Width,s.Height));
  677. e.DrawHtml(htmlTemplate1);
  678. }
  679. }
  680. private void gridView2_RowClick(object sender, RowClickEventArgs e)
  681. {
  682. var p = gridView2.GetFocusedRow() as PosRes;
  683. p.Selected = true;
  684. mapControl1.UpdatePosItem(p);
  685. }
  686. private async void btnTar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  687. {
  688. try
  689. {
  690. //var ids = gridView2.GetSelectedRows();
  691. //if (ids.Length <= 0) return;
  692. //var fisrtitem = gridView2.GetRow(ids[0]) as PosRes;
  693. //EditorTar frm = new EditorTar(new TargetInfo() { ID = fisrtitem.TargetID.HasValue ? fisrtitem.TargetID.Value : 0, TargetName = fisrtitem.TarName });
  694. //if (frm.ShowDialog() != DialogResult.OK) return;
  695. //var tar = frm.info;
  696. //using (RHDWContext db = new RHDWContext())
  697. //{
  698. // foreach (var id in ids)
  699. // {
  700. // var item = gridView2.GetRow(id) as PosRes;
  701. // var tarItem = await db.PosRes.Where(p => p.ID == item.ID).FirstOrDefaultAsync();
  702. // if (tarItem != null)
  703. // {
  704. // item.TargetID = tarItem.TargetID = tar.ID;
  705. // item.TarName = tarItem.TarName = tar.TargetName;
  706. // }
  707. // }
  708. // await db.SaveChangesAsync();
  709. //}
  710. }
  711. catch (Exception ex)
  712. {
  713. Serilog.Log.Error(ex, "编辑定位目标异常");
  714. DxHelper.MsgBoxHelper.ShowError("编辑定位目标异常");
  715. }
  716. }
  717. private void btnDrawDto_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  718. {
  719. var info = GetPosRes("绘制时差");
  720. if (info == null) return;
  721. DrawDtoLine(info);
  722. }
  723. private PosRes GetPosRes(string msg)
  724. {
  725. var ids = gridView2.GetSelectedRows();
  726. if (ids.Length <= 0)
  727. {
  728. DxHelper.MsgBoxHelper.ShowWarning($"请选择需要{msg}的定位数据信息!");
  729. return null;
  730. }
  731. var item = gridView2.GetRow(ids[0]) as PosRes;
  732. return item;
  733. }
  734. private void btnDrawDfo_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  735. {
  736. var info = GetPosRes("绘制频差");
  737. if (info == null) return;
  738. DrawDfoLine(info);
  739. }
  740. private void btnDrawCX_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  741. {
  742. var ids = gridView2.GetSelectedRows();
  743. if (ids.Length <= 0)
  744. {
  745. DxHelper.MsgBoxHelper.ShowWarning($"请选择需要绘制测向线的定位数据信息!");
  746. return;
  747. }
  748. var item = gridView2.GetRow(ids[0]) as PosRes;
  749. if (item.PosResType == EnumPosResType.X1D1CX)
  750. {
  751. DrawCXLine(item);
  752. }
  753. }
  754. private void btnGDOP_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  755. {
  756. var info = GetPosRes("绘制GDOP");
  757. if (info == null) return;
  758. DrawGDOP(info);
  759. }
  760. private void DrawGDOP(PosRes item)
  761. {
  762. try
  763. {
  764. switch (item.PosResType)
  765. {
  766. case EnumPosResType.X1D1CX:
  767. X1D1GDOPParam x1D1GdopParam = new X1D1GDOPParam(item);
  768. x1D1GdopParam.mapControl1 = mapControl1;
  769. DxHelper.PopupHelper.ShowPopup(x1D1GdopParam, layoutControl1, 400);
  770. break;
  771. case EnumPosResType.X2D1:
  772. case EnumPosResType.X2D1NoRef:
  773. X2D1GDOPParam x2D1GdopParam = new X2D1GDOPParam(item);
  774. x2D1GdopParam.mapControl1 = mapControl1;
  775. DxHelper.PopupHelper.ShowPopup(x2D1GdopParam, layoutControl1, 400);
  776. break;
  777. case EnumPosResType.X3:
  778. case EnumPosResType.X3NoRef:
  779. X3GDOPParam x3GdopParam = new X3GDOPParam(item);
  780. x3GdopParam.mapControl1 = mapControl1;
  781. DxHelper.PopupHelper.ShowPopup(x3GdopParam, layoutControl1, 400);
  782. break;
  783. case EnumPosResType.X3TwoDfo:
  784. X3DFGDOPParam x3DFGdopParam = new X3DFGDOPParam(item);
  785. x3DFGdopParam.mapControl1 = mapControl1;
  786. DxHelper.PopupHelper.ShowPopup(x3DFGdopParam, layoutControl1, 400);
  787. break;
  788. case EnumPosResType.X2Dfo:
  789. X2DFGDOPParam x2DFGdopParam = new X2DFGDOPParam(item);
  790. x2DFGdopParam.mapControl1 = mapControl1;
  791. DxHelper.PopupHelper.ShowPopup(x2DFGdopParam, layoutControl1, 400);
  792. break;
  793. default:
  794. break;
  795. }
  796. }
  797. catch (Exception ex)
  798. {
  799. DxHelper.MsgBoxHelper.ShowWarning($"绘制{item.PosResType.GetEnumDisplayName()}GDOP失败,{ex.Message}");
  800. }
  801. }
  802. private void DrawDtoLine(PosRes item)
  803. {
  804. switch (item.PosResType)
  805. {
  806. case EnumPosResType.X1D1CX:
  807. X1D1DTOParamEditor frm = new X1D1DTOParamEditor(item, mapControl1);
  808. frm.ShowDialog();
  809. break;
  810. case EnumPosResType.X2D1:
  811. case EnumPosResType.X2D1NoRef:
  812. DrawXDtoLine(item);
  813. break;
  814. case EnumPosResType.X3:
  815. case EnumPosResType.X3NoRef:
  816. DrawX3toLine(item);
  817. break;
  818. case EnumPosResType.X2Dfo:
  819. X2DTOParamEditor frm2 = new X2DTOParamEditor(item, mapControl1);
  820. frm2.ShowDialog();
  821. break;
  822. default:
  823. break;
  824. }
  825. }
  826. private void DrawXDtoLine(PosRes item)
  827. {
  828. try
  829. {
  830. X2D1DTOParamEditor frm = new X2D1DTOParamEditor(item, mapControl1);
  831. frm.ShowDialog();
  832. }
  833. catch (Exception ex)
  834. {
  835. Serilog.Log.Error(ex, $"绘制{item.PosResType.GetEnumDisplayName()}时差线失败.PosID={item.ID},SigTime={item.SigTime}");
  836. DxHelper.MsgBoxHelper.ShowWarning($"绘制{item.PosResType.GetEnumDisplayName()}时差线失败");
  837. }
  838. }
  839. private void DrawX3toLine(PosRes item)
  840. {
  841. try
  842. {
  843. X3DTOParamEditor frm = new X3DTOParamEditor(item, mapControl1);
  844. frm.ShowDialog();
  845. }
  846. catch (Exception ex)
  847. {
  848. Serilog.Log.Error(ex, $"绘制{item.PosResType.GetEnumDisplayName()}时差线失败.PosID={item.ID},SigTime={item.SigTime}");
  849. DxHelper.MsgBoxHelper.ShowWarning($"绘制{item.PosResType.GetEnumDisplayName()}时差线失败");
  850. }
  851. }
  852. private void DrawDfoLine(PosRes item)
  853. {
  854. switch (item.PosResType)
  855. {
  856. case EnumPosResType.X3TwoDfo:
  857. case EnumPosResType.X2Dfo:
  858. DrawX3DfoLine(item);
  859. break;
  860. default:
  861. break;
  862. }
  863. }
  864. private async void DrawX3DfoLine(PosRes item)
  865. {
  866. try
  867. {
  868. StationRes station;
  869. CgRes cg;
  870. using (RHDWPartContext db = RHDWPartContext.GetContext(item.SigTime))
  871. {
  872. cg = await db.CgRes.Where(m => m.ID == item.CgResID).FirstOrDefaultAsync();
  873. station = await db.StationRes.Where(m => m.ID == item.StationResID).FirstOrDefaultAsync();
  874. }
  875. if (cg == null)
  876. {
  877. Serilog.Log.Error($"绘制三星频差线错误,未找到定位关联的参估计信息.PosID={item.ID},SigTime={item.SigTime}");
  878. DxHelper.MsgBoxHelper.ShowError($"未找到定位关联的参估计信息");
  879. return;
  880. }
  881. if (station == null)
  882. {
  883. Serilog.Log.Error($"绘制三星频差线错误,未找到定位关联的站点信息.PosID={item.ID},SigTime={item.SigTime}");
  884. DxHelper.MsgBoxHelper.ShowError($"未找到定位关联的站点信息");
  885. return;
  886. }
  887. if (station.SatTxLon == 0 || station.SatTxLat == 0)
  888. {
  889. Serilog.Log.Error($"绘制三星频差线错误,天线信息为空.PosID={item.ID},SigTime={item.SigTime}");
  890. DxHelper.MsgBoxHelper.ShowError($"天线信息为空!");
  891. return;
  892. }
  893. if (station.RefLon == 0 || station.RefLat == 0)
  894. {
  895. Serilog.Log.Error($"绘制三星频差线错误,参考站信息为空.PosID={item.ID},SigTime={item.SigTime}");
  896. DxHelper.MsgBoxHelper.ShowError($"参考站信息为空!");
  897. return;
  898. }
  899. DfoLineTwoStartOption twoStartOption = new DfoLineTwoStartOption();
  900. twoStartOption.Freq = cg.TarFreqUp.HasValue ? cg.TarFreqUp.Value : 0;
  901. twoStartOption.RefFreq = cg.RefFreqUp.HasValue ? cg.RefFreqUp.Value : 0;
  902. twoStartOption.MsEph = new double[] { cg.MainX.Value, cg.MainY.Value, cg.MainZ.Value, cg.MainVx.Value, cg.MainVy.Value, cg.MainVz.Value };
  903. twoStartOption.NsEph = new double[] { cg.Adja1X.Value, cg.Adja1Y.Value, cg.Adja1Z.Value, cg.Adja1Vx.Value, cg.Adja1Vy.Value, cg.Adja1Vz.Value };
  904. twoStartOption.MsAnt = new double[] { station.SatTxLon, station.SatTxLat, 0 };
  905. twoStartOption.NsAnt = new double[] { station.SatTxLon, station.SatTxLat, 0 };
  906. twoStartOption.RefGeod = new double[] { station.RefLon.Value, station.RefLat.Value, 0 };
  907. twoStartOption.TargetDfo = cg.Dfo1.Value;
  908. twoStartOption.Turn1 = Math.Abs(twoStartOption.Freq - (cg.TarFreqDown.HasValue ? cg.TarFreqDown.Value : 0));
  909. twoStartOption.Turn2 = Math.Abs(twoStartOption.RefFreq - (cg.RefFreqDown.HasValue ? cg.RefFreqDown.Value : 0));
  910. twoStartOption.RefDfo = cg.YbMainDfo.Value - cg.YbAdja1Dfo.Value;
  911. var tsDtoLine = DrawDfoLineHelper.DfoLineTwoStart(twoStartOption);
  912. List<SatInfo> listSat = null;
  913. using (RHDWContext db = new RHDWContext())
  914. {
  915. listSat = await db.SatInfos.ToListAsync();
  916. }
  917. var msat = listSat?.FirstOrDefault(m => m.SatCode == cg.MainCode.Value)?.Sat; ;
  918. var ad1sat = listSat?.FirstOrDefault(m => m.SatCode == cg.Adja1Code.Value)?.Sat;
  919. if (msat == null) msat = cg.MainCode.ToString();
  920. if (ad1sat == null) ad1sat = cg.Adja1Code.ToString();
  921. mapControl1.DrawDtoPonit($"{item.PosResType.GetEnumDisplayName()}[{msat},{ad1sat}]频差线", tsDtoLine);
  922. if (item.PosResType == EnumPosResType.X3TwoDfo)
  923. {
  924. twoStartOption.NsEph = new double[] { cg.Adja2X.Value, cg.Adja2Y.Value, cg.Adja2Z.Value, cg.Adja2Vx.Value, cg.Adja2Vy.Value, cg.Adja2Vz.Value };
  925. twoStartOption.TargetDfo = cg.Dfo2.Value;
  926. twoStartOption.RefDfo = cg.YbMainDfo.Value - cg.YbAdja2Dfo.Value;
  927. var tsDtoLine1 = DrawDfoLineHelper.DfoLineTwoStart(twoStartOption);
  928. string ad2sat = string.Empty;
  929. if (cg.Adja2Code.HasValue)
  930. {
  931. ad2sat = listSat.FirstOrDefault(m => m.SatCode == cg.Adja2Code.Value)?.Sat;
  932. }
  933. mapControl1.DrawDtoPonit($"{item.PosResType.GetEnumDisplayName()}[{msat},{ad2sat}]频差线", tsDtoLine1);
  934. }
  935. }
  936. catch (Exception ex)
  937. {
  938. Serilog.Log.Error(ex, $"绘制{item.PosResType.GetEnumDisplayName()}频差线失败.PosID={item.ID},SigTime={item.SigTime}");
  939. DxHelper.MsgBoxHelper.ShowError($"绘制{item.PosResType.GetEnumDisplayName()}频差线失败");
  940. }
  941. }
  942. private async void DrawCXLine(PosRes item)
  943. {
  944. try
  945. {
  946. CxRes cx;
  947. StationRes station;
  948. using (RHDWPartContext db = RHDWPartContext.GetContext(item.SigTime))
  949. {
  950. cx = await db.CxRes.Where(m => m.ID == item.CxResID.Value).FirstOrDefaultAsync();
  951. station = await db.StationRes.Where(m => m.ID == item.StationResID).FirstOrDefaultAsync();
  952. }
  953. if (cx == null)
  954. {
  955. Serilog.Log.Error($"绘制测向线错误,未找到定位关联的测向信息.PosID={item.ID},SigTime={item.SigTime}");
  956. DxHelper.MsgBoxHelper.ShowError($"未找到定位关联的测向信息");
  957. return;
  958. }
  959. if (station == null)
  960. {
  961. Serilog.Log.Error($"绘制测向线错误,未找到定位关联的站点信息.PosID={item.ID},SigTime={item.SigTime}");
  962. DxHelper.MsgBoxHelper.ShowError($"未找到定位关联的站点信息!");
  963. return;
  964. }
  965. if (station.CxLon == 0 || station.CxLat == 0)
  966. {
  967. Serilog.Log.Error($"绘制测向线错误,测向站信息为空.PosID={item.ID},SigTime={item.SigTime}");
  968. DxHelper.MsgBoxHelper.ShowError($"测向站信息为空!");
  969. return;
  970. }
  971. double deg = cx.Fx;//向北顺时针方向为夹角
  972. //计算测向站到定位点之间的距离
  973. var km = MapControlEx.CalcLineKm(station.CxLon.Value, station.CxLat.Value, item.PosLon, item.PosLat);
  974. var endpoint = MapControlEx.CalcSituation(station.CxLon.Value, station.CxLat.Value, deg, (km + 100) * 1000);
  975. List<(double, double)> points = new List<(double, double)>();
  976. points.Add((station.CxLon.Value, station.CxLat.Value));
  977. points.Add((endpoint.Item1, endpoint.Item2));
  978. mapControl1.DrawCXLine($"测向线角度:{cx.Fx}°\t\n", points, true);
  979. }
  980. catch (Exception ex)
  981. {
  982. Serilog.Log.Error(ex, $"绘制测向线失败.PosID={item.ID},SigTime={item.SigTime}");
  983. DxHelper.MsgBoxHelper.ShowWarning($"绘制测向线失败");
  984. }
  985. }
  986. private async void txtTimeCho_SelectedIndexChanged(object sender, EventArgs e)
  987. {
  988. listCts.ForEach(t => t.Cancel());
  989. listCts.Clear();
  990. this.gridHomePosRes.DataSource = new List<PosRes>();//先设为空,数据相同时便于观察结果有没有变化
  991. if (tsk == null)
  992. {
  993. return;
  994. }
  995. var cts = new CancellationTokenSource();
  996. listCts.Add(cts);
  997. switch (txtTimeCho.Text)
  998. {
  999. case "最近1小时":
  1000. case "最近6小时":
  1001. case "最近12小时":
  1002. case "最近1天":
  1003. case "最近3天":
  1004. layoutControlItemStartTime.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
  1005. layoutControlItemEndTime.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
  1006. layoutControlItemSearch.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
  1007. this.gridHomePosRes.DataSource = await searchPos(cts.Token);
  1008. break;
  1009. case "自定义":
  1010. layoutControlItemStartTime.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
  1011. layoutControlItemEndTime.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
  1012. layoutControlItemSearch.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
  1013. break;
  1014. }
  1015. }
  1016. private async void btnSearch_Click(object sender, EventArgs e)
  1017. {
  1018. if (txtStartTime.EditValue == null)
  1019. {
  1020. DxHelper.MsgBoxHelper.ShowError($"请选择信号开始时间!");
  1021. return;
  1022. }
  1023. if (txtEndTime.EditValue == null)
  1024. {
  1025. DxHelper.MsgBoxHelper.ShowError($"请选择信号结束时间!");
  1026. return;
  1027. }
  1028. if (txtStartTime.DateTime > txtEndTime.DateTime)
  1029. {
  1030. DxHelper.MsgBoxHelper.ShowError($"开始时间不能大于结束时间!");
  1031. return;
  1032. }
  1033. if ((txtEndTime.DateTime - txtStartTime.DateTime).TotalDays > 10)
  1034. {
  1035. MsgBoxHelper.ShowWarning("时间跨度不能超过10天!");
  1036. return;
  1037. }
  1038. listCts.ForEach(t => t.Cancel());
  1039. listCts.Clear();
  1040. var cts = new CancellationTokenSource();
  1041. listCts.Add(cts);
  1042. var listPos = await searchPos(cts.Token);
  1043. this.gridHomePosRes.DataSource = listPos;
  1044. }
  1045. private async Task<List<PosRes>> searchPos(CancellationToken ct = default)
  1046. {
  1047. try
  1048. {
  1049. DateTime start, end = DateTime.MinValue;
  1050. if (txtTimeCho.SelectedText == "自定义")
  1051. {
  1052. start = txtStartTime.DateTime;
  1053. end = txtEndTime.DateTime;
  1054. }
  1055. else
  1056. {
  1057. var yearDirs = Directory.EnumerateDirectories("DbPart").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name));//年目录,倒叙排列
  1058. foreach (var yearDir in yearDirs)
  1059. {
  1060. //每一天的db文件,倒序排列
  1061. var dayFiles = Directory.EnumerateFiles(yearDir, "*.db").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name.Substring(0, 4)));
  1062. foreach (var dayFile in dayFiles)
  1063. {
  1064. using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
  1065. {
  1066. if (db.PosRes.Any(p => p.TaskInfoID == tsk.ID))
  1067. end = await db.PosRes.Where(p => p.TaskInfoID == tsk.ID).MaxAsync(p => p.SigTime);
  1068. }
  1069. if (end != DateTime.MinValue)
  1070. {
  1071. goto skip;
  1072. }
  1073. }
  1074. }
  1075. skip:
  1076. if (end == DateTime.MinValue)
  1077. {
  1078. return new List<PosRes>();//没有数据不查询
  1079. }
  1080. start = end.AddHours(-(int)txtTimeCho.EditValue);
  1081. }
  1082. DateTime endDay = new DateTime(end.Year, end.Month, end.Day);
  1083. DateTime startDay = new DateTime(start.Year, start.Month, start.Day);
  1084. List<PosRes> list = new List<PosRes>();
  1085. while (endDay >= startDay)
  1086. {
  1087. using (RHDWPartContext db = RHDWPartContext.GetContext(endDay))
  1088. {
  1089. var posRes = await db.PosRes.Where(w => w.SigTime >= start && w.SigTime <= end && w.TaskInfoID == tsk.ID).OrderByDescending(o => o.SigTime).ToListAsync(ct);
  1090. list.AddRange(posRes);
  1091. }
  1092. endDay = endDay.AddDays(-1);
  1093. }
  1094. return list;
  1095. }
  1096. catch (TaskCanceledException) { }//屏蔽掉取消查询的异常
  1097. catch (Exception ex)
  1098. {
  1099. Serilog.Log.Error(ex, "定位结果查询异常");
  1100. MsgBoxHelper.ShowError("定位结果查询异常");
  1101. }
  1102. return new List<PosRes>();
  1103. }
  1104. }
  1105. }