CtrlHome.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  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. namespace XdCxRhDW.App.UserControl
  40. {
  41. public partial class CtrlHome : DevExpress.XtraEditors.XtraUserControl
  42. {
  43. List<TaskInfo> list = new List<TaskInfo>();
  44. public CtrlHome()
  45. {
  46. InitializeComponent();
  47. gridHomeTask.Init();
  48. gridHomePosRes.Init().UseMultiSelect().UseRowNumber();
  49. mapControl1.UseDefalutOptions()
  50. //.UseCluster()//定位点使用内置聚合
  51. .UseClearAll()
  52. .UseDistanceLine()
  53. .UseMarkDot()
  54. .UseExportImg()
  55. .UseExportXlsx()
  56. .UseExportCsv()
  57. .UseDrawRect(rect =>
  58. {
  59. (double startLon, double startLat, double centerLon, double centerLat, double endLon, double endLat, double lonRange, double latRange) = rect;
  60. });
  61. }
  62. private async void GridView1_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e)
  63. {
  64. var tsk = (e.Row as TaskInfo);
  65. var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
  66. var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
  67. btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
  68. List<PosRes> listPos = new List<PosRes>();
  69. using (RHDWContext db = new RHDWContext())
  70. {
  71. var items = await db.PosRes.Where(p => p.TaskID == tsk.ID).OrderByDescending(p => p.SigTime).ToListAsync();
  72. listPos.AddRange(items);
  73. }
  74. this.gridHomePosRes.DataSource = listPos;
  75. mapControl1.SetPosDataSource(listPos.Where(p => p.PosLon <= 180));
  76. }
  77. private async void CtrlHome_Load(object sender, EventArgs e)
  78. {
  79. gridView1.FocusedRowObjectChanged += GridView1_FocusedRowObjectChanged;
  80. try
  81. {
  82. using (RHDWContext db = new RHDWContext())
  83. {
  84. var qq = db.TaskInfos.OrderByDescending(p => p.CreateTime).ToList();
  85. list.AddRange(qq);
  86. var runningList = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running).ToListAsync();
  87. foreach (var item in runningList)
  88. {
  89. item.TaskState = EnumTaskState.Stopped;
  90. }
  91. await db.SaveChangesAsync();
  92. }
  93. }
  94. catch (Exception ex)
  95. {
  96. Serilog.Log.Error("加载任务信息异常",ex);
  97. XtraMessageBox.Show("加载任务信息异常");
  98. }
  99. gridHomeTask.DataSource = list;
  100. gridView1.Columns["TaskName"].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Near;
  101. this.svgImageCollection1.Add("Stopped", SvgHelper.CreateCycle("#1E8B58"));
  102. this.svgImageCollection1.Add("Running", SvgHelper.CreateCycle("#2E8B57"));
  103. gridView1.CustomDrawCell += GridView1_CustomDrawCell;
  104. DxHelper.WaitHelper.CloseForm();
  105. }
  106. private void GridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
  107. {
  108. if (e.Column.FieldName == "TaskName" && (EnumTaskState)gridView1.GetRowCellValue(e.RowHandle, "TaskState") == EnumTaskState.Running)
  109. {
  110. var palette = SvgPaletteHelper.GetSvgPalette(this.LookAndFeel, ObjectState.Normal);
  111. 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);
  112. Rectangle txtBounds = e.Bounds;
  113. txtBounds.Width -= 24;
  114. txtBounds.X += 24;
  115. e.Appearance.DrawString(e.Cache, e.DisplayText, txtBounds);
  116. e.Handled = true;
  117. }
  118. }
  119. //public void SetEnumColumnImage(GridView gv, string columnFieldName, object imageCollection)
  120. //{
  121. // var repositoryItemImageComboBoxStatus = new RepositoryItemImageEdit();
  122. // var col = gv.Columns[columnFieldName];
  123. // col.MaxWidth = 40;
  124. // repositoryItemImageComboBoxStatus.Images = imageCollection;
  125. // col.ColumnEdit = repositoryItemImageComboBoxStatus;
  126. //}
  127. private void toolTipController1_GetActiveObjectInfo(object sender, DevExpress.Utils.ToolTipControllerGetActiveObjectInfoEventArgs e)
  128. {
  129. GridHitInfo hitInfo = gridView1.CalcHitInfo(e.ControlMousePosition);
  130. if (hitInfo.RowHandle < 0 || hitInfo.Column == null || hitInfo.HitTest != GridHitTest.RowCell)
  131. {
  132. toolTipController1.HideHint();
  133. return;
  134. }
  135. if (hitInfo.Column.FieldName == "TaskName")
  136. {
  137. var state = (EnumTaskState)gridView1.GetRowCellValue(hitInfo.RowHandle, "TaskState");
  138. if (state == EnumTaskState.Running)
  139. e.Info = new ToolTipControlInfo(hitInfo.RowHandle, "执行中");
  140. }
  141. }
  142. private void gridView1_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
  143. {
  144. if (gridView1.FocusedRowHandle < 0) return;
  145. var state = (EnumTaskState)gridView1.GetFocusedRowCellValue("TaskState");
  146. btnStart.Enabled = state == EnumTaskState.Stopped;
  147. btnStop.Enabled = state == EnumTaskState.Running;
  148. popupMenu1.ShowPopup(MousePosition);
  149. }
  150. private void gridView2_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
  151. {
  152. if (gridView2.FocusedRowHandle < 0) return;
  153. if (!gridView2.GetSelectedRows().Any())
  154. {
  155. btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
  156. }
  157. else
  158. {
  159. btnDelPos.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
  160. }
  161. popupMenu2.ShowPopup(MousePosition);
  162. }
  163. private async void layoutControlGroup1_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
  164. {
  165. var txt = (e.Button as GroupBoxButton).Caption;
  166. if (txt == "新建任务")
  167. {
  168. try
  169. {
  170. TaskEditor frm = new TaskEditor();
  171. if (frm.ShowDialog() != DialogResult.OK) return;
  172. var addItem = frm.info;
  173. using (RHDWContext db = new RHDWContext())
  174. {
  175. if (await db.TaskInfos.AnyAsync(p => p.TaskName == addItem.TaskName))
  176. {
  177. XtraMessageBox.Show("任务名称重复");
  178. return;
  179. }
  180. db.TaskInfos.Add(addItem);
  181. await db.SaveChangesAsync();
  182. }
  183. list.Insert(0, addItem);
  184. gridView1.RefreshData();
  185. gridView1.FocusedRowHandle = 0;
  186. }
  187. catch (Exception ex)
  188. {
  189. Serilog.Log.Error("保存任务失败", ex);
  190. XtraMessageBox.Show("保存任务失败!");
  191. }
  192. }
  193. else if (txt == "编辑任务")
  194. {
  195. try
  196. {
  197. var editItem = gridView1.GetFocusedRow() as TaskInfo;
  198. TaskEditor frm = new TaskEditor(editItem);
  199. if (frm.ShowDialog() != DialogResult.OK) return;
  200. editItem = frm.info;
  201. using (RHDWContext db = new RHDWContext())
  202. {
  203. if (await db.TaskInfos.AnyAsync(p => p.ID != editItem.ID && p.TaskName == editItem.TaskName))
  204. {
  205. XtraMessageBox.Show("任务名称重复");
  206. return;
  207. }
  208. var find = await db.TaskInfos.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync();
  209. find.TaskName = editItem.TaskName;
  210. find.PosType = editItem.PosType;
  211. await db.SaveChangesAsync();
  212. }
  213. gridView1.RefreshData();
  214. }
  215. catch (Exception ex)
  216. {
  217. Serilog.Log.Error("保存任务失败", ex);
  218. XtraMessageBox.Show("保存任务失败!");
  219. }
  220. }
  221. else
  222. {
  223. try
  224. {
  225. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  226. if (tsk == null) return;
  227. if (XtraMessageBox.Show($"删除任务[{tsk.TaskName}]?", "确认", MessageBoxButtons.YesNo) == DialogResult.No) return;
  228. using (RHDWContext db = new RHDWContext())
  229. {
  230. var item = db.TaskInfos.FirstOrDefault(p => p.ID == tsk.ID);
  231. db.TaskInfos.Remove(item);
  232. db.SaveChanges();
  233. }
  234. gridView1.DeleteSelectedRows();
  235. }
  236. catch (Exception ex)
  237. {
  238. Serilog.Log.Error("删除任务失败", ex);
  239. XtraMessageBox.Show("删除任务失败!");
  240. }
  241. }
  242. }
  243. TcpServer server;
  244. private async void btn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  245. {
  246. var tsk = gridView1.GetFocusedRow() as TaskInfo;
  247. if (e.Item.Caption == "启动任务")
  248. {
  249. try
  250. {
  251. using (RHDWContext db = new RHDWContext())
  252. {
  253. var find = await db.TaskInfos.FirstOrDefaultAsync(p => p.TaskState == EnumTaskState.Running && p.PosType == tsk.PosType);
  254. if (find != null)
  255. {
  256. var field = typeof(EnumPosType).GetField(Enum.GetName(typeof(EnumPosType), find.PosType));
  257. XtraMessageBox.Show($"已经有一个[{field.GetCustomAttribute<DisplayAttribute>().Name}]任务正在执行,请先停止!");
  258. return;
  259. }
  260. var settings = await db.SysSetings.FirstOrDefaultAsync();
  261. if (settings == null)
  262. {
  263. XtraMessageBox.Show($"请在系统设置中配置IP端口信息");
  264. return;
  265. }
  266. if (server == null)
  267. {
  268. server = new TcpServer();
  269. server.OnDataReceived += this.Server_OnDataReceived;
  270. server.Start(settings.Port);
  271. }
  272. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  273. item.TaskState = EnumTaskState.Running;
  274. await db.SaveChangesAsync();
  275. tsk.TaskState = EnumTaskState.Running;
  276. Serilog.Log.Information($"用户启动了任务,ID={tsk.ID}");
  277. }
  278. }
  279. catch (Exception ex)
  280. {
  281. Serilog.Log.Error("启动任务失败", ex);
  282. XtraMessageBox.Show("启动任务失败");
  283. }
  284. }
  285. else
  286. {
  287. try
  288. {
  289. using (RHDWContext db = new RHDWContext())
  290. {
  291. var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID);
  292. item.TaskState = EnumTaskState.Stopped;
  293. await db.SaveChangesAsync();
  294. if (!db.TaskInfos.Any(p => p.TaskState == EnumTaskState.Running))
  295. {
  296. server?.StopListening();
  297. server = null;
  298. }
  299. }
  300. tsk.TaskState = EnumTaskState.Stopped;
  301. Serilog.Log.Information($"用户停止了任务,ID={tsk.ID}");
  302. }
  303. catch (Exception ex)
  304. {
  305. Serilog.Log.Error("停止任务失败", ex);
  306. XtraMessageBox.Show("停止任务失败");
  307. }
  308. }
  309. gridView1.RefreshData();
  310. var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton);
  311. var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton);
  312. btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running;
  313. }
  314. private void gridView1_CustomDrawEmptyForeground(object sender, DevExpress.XtraGrid.Views.Base.CustomDrawEventArgs e)
  315. {
  316. if (gridView1.RowCount == 0)
  317. {
  318. string txt = "点击+创建任务";
  319. var s = e.Appearance.CalcTextSize(e.Cache, txt, e.Bounds.Width).ToSize();
  320. var x = (e.Bounds.Width - s.Width) / 2;
  321. var y = (e.Bounds.Height - s.Height) / 2;
  322. //e.Appearance.DrawString(e.Cache, txt, new Rectangle(x,y,s.Width,s.Height));
  323. e.DrawHtml(htmlTemplate1);
  324. }
  325. }
  326. readonly Random r = new Random();
  327. private async void Server_OnDataReceived(byte[] data)
  328. {
  329. try
  330. {
  331. var msg = Encoding.UTF8.GetString(data);
  332. var dto = Newtonsoft.Json.JsonConvert.DeserializeObject<SendDto>(msg);
  333. if (dto == null) return;
  334. var sigTime = DateTime.Now;
  335. using (RHDWContext db = new RHDWContext())
  336. {
  337. var cgRes = db.CgRes.Add(new CgRes()
  338. {
  339. SigTime = sigTime,
  340. DtoSx = dto.SxDto * 1e6,
  341. DfoSx = 200 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3),
  342. SnrSx = r.Next(18, 24) + Math.Round(r.NextDouble(), 1),
  343. DtoCdb = dto.XdDto * 1e6,
  344. DfoCdb = 600 + r.Next(1, 5) + Math.Round(r.NextDouble(), 3),
  345. SnrCdb = r.Next(22, 32) + Math.Round(r.NextDouble(), 1),
  346. YbMain = dto.MainYbDto * 1e6,
  347. YbAdja = dto.AdjaYbDto * 1e6,
  348. MainX = dto.MainX,
  349. MainY = dto.MainY,
  350. MainZ = dto.MainZ,
  351. AdjaX = dto.AdjaX,
  352. AdjaY = dto.AdjaY,
  353. AdjaZ = dto.AdjaZ,
  354. });
  355. var listTx = await db.TxInfos.ToListAsync();
  356. var cxRes = db.CxRes.Add(new CxRes()
  357. {
  358. SigTime = sigTime,
  359. Fx = dto.CxRes,
  360. });
  361. var tsk1X1D = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X1D1CX && p.TaskState == EnumTaskState.Running);
  362. var tsk2X1D = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.X2D1 && p.TaskState == EnumTaskState.Running);
  363. var tskRh = await db.TaskInfos.FirstOrDefaultAsync(p => p.PosType == EnumPosType.RH && p.TaskState == EnumTaskState.Running);
  364. if (tsk1X1D != null)
  365. {
  366. var res = PosApi.X1D1_POS(cgRes, listTx, cxRes);
  367. PosRes posRes = new PosRes()
  368. {
  369. SigTime = sigTime,
  370. TaskID = tsk1X1D.ID,
  371. CxResID = cxRes.ID,
  372. CgResID = cgRes.ID,
  373. TarName = "未知目标",
  374. TsName = "DAMA--56-115ms",
  375. PosLon = res[0],
  376. PosLat = res[1],
  377. MirrLon = res[3],
  378. MirrLat = res[4],
  379. };
  380. db.PosRes.Add(posRes);
  381. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  382. if (currentTask != null && currentTask.ID == tsk1X1D.ID)
  383. {
  384. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  385. ds.Insert(0, posRes);
  386. this.Invoke(new Action(() =>
  387. {
  388. gridView2.RefreshData();
  389. mapControl1.AddPosItem(posRes);
  390. }));
  391. }
  392. }
  393. if (tsk2X1D != null)
  394. {
  395. var res = PosApi.X2D1_POS(cgRes, listTx);
  396. PosRes posRes = new PosRes()
  397. {
  398. SigTime = sigTime,
  399. TaskID = tsk2X1D.ID,
  400. CxResID = cxRes.ID,
  401. CgResID = cgRes.ID,
  402. TarName = "未知目标",
  403. TsName = "DAMA-225-173ms",
  404. PosLon = res[0],
  405. PosLat = res[1],
  406. MirrLon = res[3],
  407. MirrLat = res[4],
  408. };
  409. db.PosRes.Add(posRes);
  410. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  411. if (currentTask.ID == tsk2X1D.ID)
  412. {
  413. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  414. ds.Insert(0, posRes);
  415. this.Invoke(new Action(() =>
  416. {
  417. gridView2.RefreshData();
  418. mapControl1.AddPosItem(posRes);
  419. }));
  420. }
  421. }
  422. if (tskRh != null)
  423. {
  424. var res = PosApi.RH_POS(cgRes, listTx, cxRes);
  425. PosRes posRes = new PosRes()
  426. {
  427. SigTime = sigTime,
  428. TaskID = tskRh.ID,
  429. CxResID = cxRes.ID,
  430. CgResID = cgRes.ID,
  431. TarName = "未知目标",
  432. TsName = "DAMA-738-109ms",
  433. PosLon = res[0],
  434. PosLat = res[1],
  435. MirrLon = res[3],
  436. MirrLat = res[4],
  437. };
  438. db.PosRes.Add(posRes);
  439. var currentTask = gridView1.GetFocusedRow() as TaskInfo;
  440. if (currentTask.ID == tskRh.ID)
  441. {
  442. var ds = this.gridHomePosRes.DataSource as List<PosRes>;
  443. ds.Insert(0, posRes);
  444. this.Invoke(new Action(() =>
  445. {
  446. gridView2.RefreshData();
  447. mapControl1.AddPosItem(posRes);
  448. }));
  449. }
  450. }
  451. await db.SaveChangesAsync();
  452. }
  453. }
  454. catch (Exception ex)
  455. {
  456. Serilog.Log.Error("接收到推送消息后处理异常", ex);
  457. }
  458. }
  459. private async void btnDelPos_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  460. {
  461. try
  462. {
  463. var ids = gridView2.GetSelectedRows();
  464. using (RHDWContext db = new RHDWContext())
  465. {
  466. foreach (var id in ids)
  467. {
  468. var item = gridView2.GetRow(id) as PosRes;
  469. var delItem = await db.PosRes.Where(p => p.ID == item.ID).FirstOrDefaultAsync();
  470. if (delItem != null)
  471. {
  472. db.PosRes.Remove(delItem);
  473. mapControl1.DelPosItem<PosRes>(item);
  474. }
  475. }
  476. await db.SaveChangesAsync();
  477. }
  478. gridView2.DeleteSelectedRows();
  479. }
  480. catch (Exception ex)
  481. {
  482. Serilog.Log.Error("删除定位结果失败", ex);
  483. XtraMessageBox.Show("删除定位结果失败");
  484. }
  485. }
  486. private void gridView2_RowClick(object sender, RowClickEventArgs e)
  487. {
  488. var p = gridView2.GetFocusedRow() as PosRes;
  489. p.Selected = true;
  490. mapControl1.UpdatePosItem(p);
  491. }
  492. }
  493. }