CtrlHome.cs 35 KB

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