CtrlHome.cs 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848
  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 (System.Reflection.TargetInvocationException ex)
  188. {
  189. httpServer = null;
  190. Serilog.Log.Error(ex, $"启动Http服务失败!");
  191. if (ex.InnerException is HttpListenerException)
  192. {
  193. DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败,请以管理员身份运行程序!");
  194. }
  195. else
  196. {
  197. DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
  198. }
  199. }
  200. catch (Exception ex)
  201. {
  202. httpServer = null;
  203. Serilog.Log.Error(ex, $"启动Http服务失败!");
  204. DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!");
  205. }
  206. }
  207. WaitHelper.CloseForm();
  208. }
  209. private async void Draw2X1DDtoLine(PosRes item)
  210. {
  211. try
  212. {
  213. List<TxInfo> listTx = new List<TxInfo>();
  214. List<SatInfo> listSat = new List<SatInfo>();
  215. CgRes cg;
  216. using (RHDWContext db = new RHDWContext())
  217. {
  218. listTx = db.TxInfos.ToList();
  219. listSat = db.SatInfos.ToList();
  220. cg = await db.CgRes.Where(m => m.ID == item.CgResID).FirstOrDefaultAsync();
  221. }
  222. if (cg == null)
  223. {
  224. DxHelper.MsgBoxHelper.ShowWarning($"未找到定位相关的计算[{item.CgResID}]信息");
  225. return;
  226. }
  227. var satTx = listTx.Find(p => p.TxType == EnumTxType.MainSat);
  228. if (satTx == null)
  229. {
  230. DxHelper.MsgBoxHelper.ShowWarning($"主星天线信息为空!");
  231. return;
  232. }
  233. var satNTx = listTx.Find(p => p.TxType == EnumTxType.AdjaSat);
  234. if (satNTx == null)
  235. {
  236. DxHelper.MsgBoxHelper.ShowWarning($"邻星天线信息为空!");
  237. return;
  238. }
  239. var cdbTx = listTx.Find(p => p.TxType == EnumTxType.Cdb);
  240. if (cdbTx == null)
  241. {
  242. DxHelper.MsgBoxHelper.ShowWarning($"超短波信息为空!");
  243. return;
  244. }
  245. var refTx = listTx.Find(p => p.TxType == EnumTxType.Ref);
  246. if (refTx == null)
  247. {
  248. DxHelper.MsgBoxHelper.ShowWarning($"参考站信息为空!");
  249. return;
  250. }
  251. DtoLineXdOption dtoLineXd = new DtoLineXdOption();
  252. dtoLineXd.MsEph = new double[] { cg.MainX, cg.MainY, cg.MainZ, 0, 0, 0 };
  253. dtoLineXd.MsAnt = new double[] { satTx.Lon, satTx.Lat, 0 };
  254. dtoLineXd.CDBAnt = new double[] { cdbTx.Lon, cdbTx.Lat, 0 };
  255. dtoLineXd.RefGeod = new double[] { refTx.Lon, refTx.Lat, 0 };
  256. dtoLineXd.xdDto = cg.DtoCdb;
  257. dtoLineXd.RefDto = cg.YbMain;
  258. dtoLineXd.PosLon = item.PosLon;
  259. dtoLineXd.PosLat = item.PosLat;
  260. var xdDtoLine = DrawDtoLineHelper.DtoLineXd(dtoLineXd);
  261. mapControl1.DrawDtoPonit($"星地[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == cdbTx.ID)?.Sat}]时差线", xdDtoLine);
  262. DtoLineTwoStartOption twoStartOption = new DtoLineTwoStartOption();
  263. twoStartOption.MsEph = new double[] { cg.MainX, cg.MainY, cg.MainZ, 0, 0, 0 };
  264. twoStartOption.NsEph = new double[] { cg.AdjaX, cg.AdjaY, cg.AdjaZ, 0, 0, 0 };
  265. twoStartOption.MsAnt = new double[] { satTx.Lon, satTx.Lat, 0 };
  266. twoStartOption.NsAnt = new double[] { satNTx.Lon, satNTx.Lat, 0 };
  267. twoStartOption.RefGeod = new double[] { refTx.Lon, refTx.Lat, 0 };
  268. twoStartOption.TargetDto = cg.DtoSx;
  269. twoStartOption.RefDto = cg.YbMain - cg.YbAdja;
  270. twoStartOption.PosLon = item.PosLon;
  271. twoStartOption.PosLat = item.PosLat;
  272. var tsDtoLine = DrawDtoLineHelper.DtoLineXDTwoStart(twoStartOption);
  273. mapControl1.DrawDtoPonit($"双星[{listSat.FirstOrDefault(m => m.ID == satTx.ID)?.Sat},{listSat.FirstOrDefault(m => m.ID == satNTx.ID)?.Sat}]时差线", tsDtoLine);
  274. }
  275. catch (Exception ex)
  276. {
  277. Serilog.Log.Error("绘制时差线失败", ex);
  278. DxHelper.MsgBoxHelper.ShowWarning($"绘制时差线失败,失败信息:{ex.Message}");
  279. }
  280. }
  281. private void GridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
  282. {
  283. if (e.Column.FieldName == "TaskName" && (EnumTaskState)gridView1.GetRowCellValue(e.RowHandle, "TaskState") == EnumTaskState.Running)
  284. {
  285. var palette = SvgPaletteHelper.GetSvgPalette(this.LookAndFeel, ObjectState.Normal);
  286. 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);
  287. Rectangle txtBounds = e.Bounds;
  288. txtBounds.Width -= 24;
  289. txtBounds.X += 24;
  290. e.Appearance.DrawString(e.Cache, e.DisplayText, txtBounds);
  291. e.Handled = true;
  292. }
  293. }
  294. //public void SetEnumColumnImage(GridView gv, string columnFieldName, object imageCollection)
  295. //{
  296. // var repositoryItemImageComboBoxStatus = new RepositoryItemImageEdit();
  297. // var col = gv.Columns[columnFieldName];
  298. // col.MaxWidth = 40;
  299. // repositoryItemImageComboBoxStatus.Images = imageCollection;
  300. // col.ColumnEdit = repositoryItemImageComboBoxStatus;
  301. //}
  302. private void toolTipController1_GetActiveObjectInfo(object sender, DevExpress.Utils.ToolTipControllerGetActiveObjectInfoEventArgs e)
  303. {
  304. GridHitInfo hitInfo = gridView1.CalcHitInfo(e.ControlMousePosition);
  305. if (hitInfo.RowHandle < 0 || hitInfo.Column == null || hitInfo.HitTest != GridHitTest.RowCell)
  306. {
  307. toolTipController1.HideHint();
  308. return;
  309. }
  310. if (hitInfo.Column.FieldName == "TaskName")
  311. {
  312. var state = (EnumTaskState)gridView1.GetRowCellValue(hitInfo.RowHandle, "TaskState");
  313. if (state == EnumTaskState.Running)
  314. e.Info = new ToolTipControlInfo(hitInfo.RowHandle, "执行中");
  315. }
  316. }
  317. private void gridView1_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
  318. {
  319. if (gridView1.FocusedRowHandle < 0) return;
  320. var state = (EnumTaskState)gridView1.GetFocusedRowCellValue("TaskState");
  321. btnStart.Enabled = state == EnumTaskState.Stopped;
  322. btnStop.Enabled = state == EnumTaskState.Running;
  323. popupMenu1.ShowPopup(MousePosition);
  324. }
  325. private void gridView2_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
  326. {
  327. if (gridView2.FocusedRowHandle < 0) return;
  328. if (!gridView2.GetSelectedRows().Any())
  329. {
  330. btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  331. }
  332. else
  333. {
  334. btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  335. }
  336. popupMenu2.ShowPopup(MousePosition);
  337. }
  338. private async void layoutControlGroup1_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
  339. {
  340. var txt = (e.Button as GroupBoxButton).Caption;
  341. if (txt == "新建任务")
  342. {
  343. try
  344. {
  345. TaskEditor frm = new TaskEditor();
  346. if (frm.ShowDialog() != DialogResult.OK) return;
  347. var addItem = frm.info;
  348. using (RHDWContext db = new RHDWContext())
  349. {
  350. if (await db.TaskInfos.AnyAsync(p => p.TaskName == addItem.TaskName))
  351. {
  352. DxHelper.MsgBoxHelper.ShowWarning("任务名称重复");
  353. return;
  354. }
  355. db.TaskInfos.Add(addItem);
  356. await db.SaveChangesAsync();
  357. }
  358. list.Insert(0, addItem);
  359. gridView1.RefreshData();
  360. gridView1.FocusedRowHandle = 0;
  361. }
  362. catch (Exception ex)
  363. {
  364. Serilog.Log.Error(ex, "保存任务异常");
  365. DxHelper.MsgBoxHelper.ShowError("保存任务异常");
  366. }
  367. }
  368. else if (txt == "编辑任务")
  369. {
  370. try
  371. {
  372. var editItem = gridView1.GetFocusedRow() as TaskInfo;
  373. TaskEditor frm = new TaskEditor(editItem);
  374. if (frm.ShowDialog() != DialogResult.OK) return;
  375. editItem = frm.info;
  376. using (RHDWContext db = new RHDWContext())
  377. {
  378. if (await db.TaskInfos.AnyAsync(p => p.ID != editItem.ID && p.TaskName == editItem.TaskName))
  379. {
  380. DxHelper.MsgBoxHelper.ShowWarning("任务名称重复");
  381. return;
  382. }
  383. var find = await db.TaskInfos.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync();
  384. find.TaskName = editItem.TaskName;
  385. find.PosType = editItem.PosType;
  386. await db.SaveChangesAsync();
  387. }
  388. gridView1.RefreshData();
  389. }
  390. catch (Exception ex)
  391. {
  392. Serilog.Log.Error(ex, "保存任务异常");
  393. DxHelper.MsgBoxHelper.ShowError("保存任务异常");
  394. }
  395. }
  396. else
  397. {
  398. try
  399. {
  400. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  401. if (tsk == null) return;
  402. if (!DxHelper.MsgBoxHelper.ShowConfirm($"删除任务[{tsk.TaskName}]?"))
  403. return;
  404. using (RHDWContext db = new RHDWContext())
  405. {
  406. var item = db.TaskInfos.FirstOrDefault(p => p.ID == tsk.ID);
  407. db.TaskInfos.Remove(item);
  408. db.SaveChanges();
  409. }
  410. gridView1.DeleteSelectedRows();
  411. }
  412. catch (Exception ex)
  413. {
  414. Serilog.Log.Error(ex, "删除任务异常");
  415. DxHelper.MsgBoxHelper.ShowError("删除任务异常");
  416. }
  417. }
  418. }
  419. IDisposable httpServer;
  420. TcpServer server;
  421. private async void btn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  422. {
  423. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  424. if (e.Item.Caption == "启动任务")
  425. {
  426. try
  427. {
  428. using (RHDWContext db = new RHDWContext())
  429. {
  430. var find = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskState == EnumTaskState.Running && p.PosType == tsk.PosType);
  431. if (find != null)
  432. {
  433. var field = typeof(EnumPosType).GetField(Enum.GetName(typeof(EnumPosType), find.PosType));
  434. DxHelper.MsgBoxHelper.ShowWarning($"已经有一个[{field.GetCustomAttribute<DisplayAttribute>().Name}]任务正在执行,请先停止!");
  435. return;
  436. }
  437. var settings = await db.SysSetings.FirstOrDefaultAsync();
  438. if (settings == null)
  439. {
  440. DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息");
  441. return;
  442. }
  443. if (server == null)
  444. {
  445. server = new TcpServer();
  446. server.OnDataReceived += this.Server_OnDataReceived;
  447. server.Start(settings.Port);
  448. }
  449. if (httpServer == null)
  450. {
  451. try
  452. {
  453. StartOptions options = new StartOptions();
  454. options.Urls.Add($"http://+:{settings.HttpPort}");
  455. httpServer = WebApp.Start<Startup>(options);
  456. }
  457. catch (Exception ex)
  458. {
  459. Serilog.Log.Error(ex, "启动任务异常,Http定位接口服务启动失败");
  460. DxHelper.MsgBoxHelper.ShowError($"启动任务异常,Http定位接口服务启动失败");
  461. }
  462. }
  463. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  464. item.TaskState = EnumTaskState.Running;
  465. await db.SaveChangesAsync();
  466. tsk.TaskState = EnumTaskState.Running;
  467. Serilog.Log.Information($"用户启动了任务,ID={tsk.ID}");
  468. }
  469. }
  470. catch (Exception ex)
  471. {
  472. Serilog.Log.Error(ex, "启动任务异常");
  473. DxHelper.MsgBoxHelper.ShowError($"启动任务异常.{ex.Message}");
  474. }
  475. }
  476. else
  477. {
  478. try
  479. {
  480. using (RHDWContext db = new RHDWContext())
  481. {
  482. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  483. item.TaskState = EnumTaskState.Stopped;
  484. await db.SaveChangesAsync();
  485. if (!db.TaskInfos.Any(p => p.TaskState == EnumTaskState.Running))
  486. {
  487. server?.StopListening();
  488. server = null;
  489. }
  490. }
  491. tsk.TaskState = EnumTaskState.Stopped;
  492. Serilog.Log.Information($"用户停止了任务,ID={tsk.ID}");
  493. }
  494. catch (Exception ex)
  495. {
  496. Serilog.Log.Error(ex, "停止任务异常");
  497. DxHelper.MsgBoxHelper.ShowError($"停止任务异常.{ex.Message}");
  498. }
  499. }
  500. gridView1.RefreshData();
  501. var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
  502. var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
  503. btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
  504. }
  505. private void gridView1_CustomDrawEmptyForeground(object sender, DevExpress.XtraGrid.Views.Base.CustomDrawEventArgs e)
  506. {
  507. if (gridView1.RowCount == 0)
  508. {
  509. string txt = "点击+创建任务";
  510. var s = e.Appearance.CalcTextSize(e.Cache, txt, e.Bounds.Width).ToSize();
  511. var x = (e.Bounds.Width - s.Width) / 2;
  512. var y = (e.Bounds.Height - s.Height) / 2;
  513. //e.Appearance.DrawString(e.Cache, txt, new Rectangle(x,y,s.Width,s.Height));
  514. e.DrawHtml(htmlTemplate1);
  515. }
  516. }
  517. readonly Random r = new Random();
  518. private async void Server_OnDataReceived(byte[] data)
  519. {
  520. try
  521. {
  522. var msg = Encoding.UTF8.GetString(data);
  523. var dto = Newtonsoft.Json.JsonConvert.DeserializeObject<SendDto>(msg);
  524. if (dto == null) return;
  525. var sigTime = DateTime.Now;
  526. using (RHDWContext db = new RHDWContext())
  527. {
  528. var cgRes = db.CgRes.Add(new CgRes()
  529. {
  530. SigTime = sigTime,
  531. DtoSx = dto.SxDto * 1e6,
  532. DfoSx = 200 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3),
  533. SnrSx = r.Next(18, 24) + Math.Round(r.NextDouble(), 1),
  534. DtoCdb = dto.XdDto * 1e6,
  535. DfoCdb = 600 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3),
  536. SnrCdb = r.Next(22, 32) + Math.Round(r.NextDouble(), 1),
  537. YbMain = dto.MainYbDto * 1e6,
  538. YbAdja = dto.AdjaYbDto * 1e6,
  539. MainX = dto.MainX,
  540. MainY = dto.MainY,
  541. MainZ = dto.MainZ,
  542. AdjaX = dto.AdjaX,
  543. AdjaY = dto.AdjaY,
  544. AdjaZ = dto.AdjaZ,
  545. });
  546. var listTx = await db.TxInfos.ToListAsync();
  547. var cxRes = db.CxRes.Add(new CxRes()
  548. {
  549. SigTime = sigTime,
  550. Fx = dto.CxRes,
  551. });
  552. var tsk1X1D = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running);
  553. var tsk2X1D = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  554. var tskRh = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running);
  555. if (tsk1X1D != null)
  556. {
  557. var res = PosApi.X1D1_POS(cgRes, listTx, cxRes);
  558. PosRes posRes = new PosRes()
  559. {
  560. SigTime = sigTime,
  561. TaskID = tsk1X1D.ID,
  562. CxResID = cxRes.ID,
  563. CgResID = cgRes.ID,
  564. TarName = "未知目标",
  565. TsName = "DAMA--56-115ms",
  566. PosLon = res[0],
  567. PosLat = res[1],
  568. MirrLon = res[3],
  569. MirrLat = res[4],
  570. };
  571. db.PosRes.Add(posRes);
  572. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  573. if (currentTask != null && currentTask.ID == tsk1X1D.ID)
  574. {
  575. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  576. ds.Insert(0, posRes);
  577. this.Invoke(new Action(() =>
  578. {
  579. gridView2.RefreshData();
  580. mapControl1.AddPosItem(posRes);
  581. }));
  582. }
  583. }
  584. if (tsk2X1D != null)
  585. {
  586. var res = PosApi.X2D1_POS(cgRes, listTx);
  587. PosRes posRes = new PosRes()
  588. {
  589. SigTime = sigTime,
  590. TaskID = tsk2X1D.ID,
  591. CxResID = cxRes.ID,
  592. CgResID = cgRes.ID,
  593. TarName = "未知目标",
  594. TsName = "DAMA-225-173ms",
  595. PosLon = res[0],
  596. PosLat = res[1],
  597. MirrLon = res[3],
  598. MirrLat = res[4],
  599. };
  600. db.PosRes.Add(posRes);
  601. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  602. if (currentTask.ID == tsk2X1D.ID)
  603. {
  604. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  605. ds.Insert(0, posRes);
  606. this.Invoke(new Action(() =>
  607. {
  608. gridView2.RefreshData();
  609. mapControl1.AddPosItem(posRes);
  610. }));
  611. }
  612. }
  613. if (tskRh != null)
  614. {
  615. var res = PosApi.RH_POS(cgRes, listTx, cxRes);
  616. PosRes posRes = new PosRes()
  617. {
  618. SigTime = sigTime,
  619. TaskID = tskRh.ID,
  620. CxResID = cxRes.ID,
  621. CgResID = cgRes.ID,
  622. TarName = "未知目标",
  623. TsName = "DAMA-738-109ms",
  624. PosLon = res[0],
  625. PosLat = res[1],
  626. MirrLon = res[3],
  627. MirrLat = res[4],
  628. };
  629. db.PosRes.Add(posRes);
  630. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  631. if (currentTask.ID == tskRh.ID)
  632. {
  633. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  634. ds.Insert(0, posRes);
  635. this.Invoke(new Action(() =>
  636. {
  637. gridView2.RefreshData();
  638. mapControl1.AddPosItem(posRes);
  639. }));
  640. }
  641. }
  642. await db.SaveChangesAsync();
  643. }
  644. }
  645. catch (Exception ex)
  646. {
  647. Serilog.Log.Error(ex, "接收到推送消息后处理异常");
  648. }
  649. }
  650. private async void btnDelPos_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  651. {
  652. try
  653. {
  654. var ids = gridView2.GetSelectedRows();
  655. using (RHDWContext db = new RHDWContext())
  656. {
  657. foreach (var id in ids)
  658. {
  659. var item = gridView2.GetRow(id) as PosRes;
  660. var delItem = await db.PosRes.Where(p => p.ID == item.ID).FirstOrDefaultAsync();
  661. if (delItem != null)
  662. {
  663. db.PosRes.Remove(delItem);
  664. mapControl1.DelPosItem<PosRes>(item);
  665. }
  666. }
  667. await db.SaveChangesAsync();
  668. }
  669. gridView2.DeleteSelectedRows();
  670. }
  671. catch (Exception ex)
  672. {
  673. Serilog.Log.Error(ex, "删除定位结果异常");
  674. DxHelper.MsgBoxHelper.ShowError("删除定位结果异常");
  675. }
  676. }
  677. private void gridView2_RowClick(object sender, RowClickEventArgs e)
  678. {
  679. var p = gridView2.GetFocusedRow() as PosRes;
  680. p.Selected = true;
  681. mapControl1.UpdatePosItem(p);
  682. }
  683. private async void btnTar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  684. {
  685. try
  686. {
  687. var ids = gridView2.GetSelectedRows();
  688. if (ids.Length <= 0) return;
  689. var fisrtitem = gridView2.GetRow(ids[0]) as PosRes;
  690. EditorTar frm = new EditorTar(new TargetInfo() { ID = fisrtitem.TargetID.HasValue ? fisrtitem.TargetID.Value : 0, TargetName = fisrtitem.TarName });
  691. if (frm.ShowDialog() != DialogResult.OK) return;
  692. var tar = frm.info;
  693. using (RHDWContext db = new RHDWContext())
  694. {
  695. foreach (var id in ids)
  696. {
  697. var item = gridView2.GetRow(id) as PosRes;
  698. var tarItem = await db.PosRes.Where(p => p.ID == item.ID).FirstOrDefaultAsync();
  699. if (tarItem != null)
  700. {
  701. item.TargetID = tarItem.TargetID = tar.ID;
  702. item.TarName = tarItem.TarName = tar.TargetName;
  703. }
  704. }
  705. await db.SaveChangesAsync();
  706. }
  707. }
  708. catch (Exception ex)
  709. {
  710. Serilog.Log.Error(ex, "编辑定位目标异常");
  711. DxHelper.MsgBoxHelper.ShowError("编辑定位目标异常");
  712. }
  713. }
  714. private async void btnDrawDto_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  715. {
  716. var info = GetPosRes("绘制时差");
  717. var posRes = info.Item1;
  718. if (posRes == null) return;
  719. var posType = info.Item2;
  720. await Task.Run(() =>
  721. {
  722. try
  723. {
  724. switch (posType)
  725. {
  726. case EnumPosType.X1D1CX:
  727. throw new Exception("未实现一星一地类型绘制时差线");
  728. break;
  729. case EnumPosType.X2D1:
  730. Draw2X1DDtoLine(posRes);
  731. break;
  732. case EnumPosType.RH:
  733. throw new Exception("未实现融合类型绘制时差线");
  734. break;
  735. default:
  736. break;
  737. }
  738. }
  739. catch (Exception ex)
  740. {
  741. this.Invoke(new Action(() => DxHelper.MsgBoxHelper.ShowWarning($"绘制时差线失败,{ex.Message}")));
  742. }
  743. });
  744. }
  745. private (PosRes, EnumPosType) GetPosRes(string msg)
  746. {
  747. var ids = gridView2.GetSelectedRows();
  748. if (ids.Length <= 0)
  749. {
  750. DxHelper.MsgBoxHelper.ShowWarning($"请选择需要{msg}的定位数据信息!");
  751. return (null, default);
  752. }
  753. var item = gridView2.GetRow(ids[0]) as PosRes;
  754. var taskInfo = list.Find(m => m.ID == item.TaskID);
  755. if (taskInfo == null)
  756. {
  757. DxHelper.MsgBoxHelper.ShowWarning($"未找到任务[{item.TaskID}]!");
  758. return (null, default);
  759. }
  760. return (item, taskInfo.PosType);
  761. }
  762. private void btnDrawDfo_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  763. {
  764. DxHelper.MsgBoxHelper.ShowWarning("未实现");
  765. }
  766. private void btnDrawCX_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  767. {
  768. DxHelper.MsgBoxHelper.ShowWarning("未实现");
  769. }
  770. private void btnGDOP_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  771. {
  772. var info = GetPosRes("绘制GDOP");
  773. var posRes = info.Item1;
  774. if (posRes == null) return;
  775. var posType = info.Item2;
  776. try
  777. {
  778. switch (posType)
  779. {
  780. case EnumPosType.X1D1CX:
  781. throw new Exception("未实现一星一地类型绘制GDOP");
  782. break;
  783. case EnumPosType.X2D1:
  784. X2D1GDOPParam x2D1GdopParam = new X2D1GDOPParam(posRes.SigTime);
  785. x2D1GdopParam.mapControl1 = mapControl1;
  786. DxHelper.PopupHelper.ShowPopup(x2D1GdopParam, mapControl1, mapControl1.Width / 4);
  787. break;
  788. case EnumPosType.RH:
  789. throw new Exception("未实现融合类型绘制GDOP");
  790. break;
  791. default:
  792. break;
  793. }
  794. }
  795. catch (Exception ex)
  796. {
  797. DxHelper.MsgBoxHelper.ShowWarning($"绘制GDOP失败,{ex.Message}");
  798. }
  799. }
  800. }
  801. }