using DevExpress.Mvvm.Native; using DevExpress.Utils; using DevExpress.Utils.Drawing; using DevExpress.Utils.Svg; using DevExpress.XtraEditors.ButtonsPanelControl; using DevExpress.XtraEditors.Controls; using DevExpress.XtraGrid.Views.Grid; using DW5S.App.EditForms; using DW5S.App.Model; using DW5S.App.PopupControl; using DW5S.DTO; using DW5S.Entity; using DW5S.KxcApi; using DW5S.Repostory; using DW5S.Service; using DW5S.ViewModel; using DxHelper; using ExtensionsDev; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace DW5S.App.UserControl { public partial class CtrlHome : DevExpress.XtraEditors.XtraUserControl { List list = new List(); TaskViewModel tsk; List listCts = new List(); Dictionary dicCts = new Dictionary(); List cache = new List();//定位点缓存,最多1000条记录 public CtrlHome() { InitializeComponent(); layoutControl1.UseDefault(true); if (this.splitterItem1.Location.X < 200) this.splitterItem1.Location = new Point(200, 0); txtStartTime.UseDefault(); txtEndTime.UseDefault(); //txtFrequpMHz.Properties.Sorted = true; } private async void CtrlHome_Load(object sender, EventArgs e) { this.ctrlPage1.SetOnQuery(LoadPageData); gridView2.ColumnFilterChanged += GridView2_ColumnFilterChanged; Messenger.Defalut.Sub("新增定位点", OnPosAdd); Messenger.Defalut.Sub("地图类型改变", OnSysSetingsChanged); Messenger.Defalut.Sub("任务状态改变", async id => { var find = list.FirstOrDefault(p => p.Id == id); if (find == null) return; var unitOfWork = IocContainer.UnitOfWork; var repsTask = unitOfWork.Of(); var item = await repsTask.FirstOrDefaultAsync(p => p.Id == id); if (item == null) return; find.TaskState = item.TaskState; //停止查找参考信号 if (dicCts.ContainsKey(id)) { dicCts[id]?.Cancel(); dicCts.Remove(id); } this.Invoke(new Action(() => { var idx = gridView1.FindRow(find); this.gridView1.RefreshRow(idx); })); if (tsk.Id != id) return; this.Invoke(new Action(() => { var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton); var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton); btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running; })); }); gridHomeTask.UseDefault(list, showScrollH: true).UseEmptyText("点击+创建任务"); gridView1.BestFitColumns(); gridHomePosRes.UseDefault(new List()).UseMultiSelect().UseRowNumber() .AddRowMenu("绘制时差线", SvgHelper.CreateDtoLine(), DrawDtoLine) .AddRowMenu("GDOP分析", SvgHelper.CreateGDOP(), DrawGdopLine)//, item => item.PosResType != EnumPosResType.RH .AddRowMenu("查看参估", SvgHelper.CreateShowCafRes(), ShowCafRes) .AddRowMenu("查看测向", SvgHelper.CreateShowCxRes(), ShowCxRes) .AddRowMenu("查看检测", SvgHelper.CreateShowCheckRes(), ShowCheckRes) .AddContentMenu("重新定位", SvgHelper.CreateRepos(), Repos, true) .UseDeleteAsync(DelPos, "删除记录") .SetDisplayText(nameof(ModelPosRes.FreqUpHz), val => (Convert.ToInt64(val) / 1e6).ToString("f3")) .SetDisplayText(nameof(ModelPosRes.Confidence), val => { if (val == null) return "--"; else if (Convert.ToInt32(val) < 0) return "--"; else return val.ToString(); }) .MountRowMenuToMapPos(mapControl1)//将表格单行元素菜单挂载到定位点上(实验) .MountMultRowMenuToMapRegion(mapControl1); //将表格多行元素菜单挂载到地图区域菜单上(该功能暂未实现) //mapService = "http://ows.mundialis.de/services/service"; mapControl1.UseDefalutOptions() .UseDrawRect() .UseClearAll() .UseDistanceLine() .UseMarkDot() .UseTrack() .UseExportImg() .UseExportXlsx(); if (AppConfigHelper.Get("UseMapCluster", false)) { mapControl1.UseCluster(); } var unitOfWork = IocContainer.UnitOfWork; var settings = await unitOfWork.Of().FirstOrDefaultAsync(); if (settings == null) { mapControl1.UseLocalDb(); return; } OnSysSetingsChanged(settings); try { var repsTask = unitOfWork.Of(); await repsTask.UpdatePropAsync(p => p.TaskState == EnumTaskState.Running, s => s.SetProperty(b => b.TaskState, EnumTaskState.Stopped)); await unitOfWork.SaveAsync(); mapControl1.AddRectMenu("删除定位点", SvgHelper.CreateClose(), async items => await DeletePosRes(items.ToList())) .AddRectMenu("使用镜像点", SvgHelper.CreateUseMirr(), async items => await UseMirr(items.ToList())) .AddRectMenu("编辑目标", SvgHelper.CreateEdit(), async items => await EditTarget(items.ToList())) .AddRectMenu("转到列表", SvgHelper.CreateGoto(), items => ToPosList(items.ToList())) .AddRectMenu("目标轨迹", SvgHelper.CreateTrack(), items => DrawTrack(items.ToList())); } catch (Exception ex) { string msg = "加载基础信息异常"; IocContainer.Logger.Error(ex, msg); DxHelper.MsgBoxHelper.ShowError(msg); } gridView1.Columns[nameof(TaskViewModel.TaskName)].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Near; this.svgImageCollection1.Add("Stopped", SvgHelper.CreateCycle("#1E8B58")); this.svgImageCollection1.Add("Running", SvgHelper.CreateCycle("#2E8B57")); gridView1.CustomDrawCell += GridView1_CustomDrawCell; gridView1.DoubleClick += GridView1_DoubleClick; gridView1.FocusedRowObjectChanged += GridView1_FocusedRowObjectChanged; gridView2.FocusedRowObjectChanged += GridView2_FocusedRowObjectChanged; btnIncludeInvalidate.CheckedChanged += BtnIncludeInvalidate_CheckedChanged; txtTimeCho_SelectedIndexChanged(null, null); WaitHelper.CloseForm(); await Task.Run(() => { var refreshPosTime = AppConfigHelper.Get("RefreshPosTime", 5); if (refreshPosTime < 1) refreshPosTime = 5; refreshPosTime = refreshPosTime * 1000; while (!this.IsDisposed && !this.Disposing) { try { //表格处于筛选状态,不刷新数据 if (!string.IsNullOrWhiteSpace(gridView2.FindFilterText) || !string.IsNullOrWhiteSpace(gridView2.FilterPanelText)) { continue; } var currentTask = gridView1.GetFocusedRow() as TaskViewModel; IQueryable refreshQuery = null; List updateItems = null; long? currentFreq = null; if (txtFrequpMHz.EditValue != null) currentFreq = Convert.ToInt64(txtFrequpMHz.EditValue); List freqs = null; lock (this) { refreshQuery = cache.AsQueryable(); refreshQuery = refreshQuery.Where(p => p.TaskInfoID == currentTask.Id); freqs = refreshQuery.Select(p => p.FreqUpHz).Distinct().OrderBy(p => p).ToList(); if (currentFreq != null) refreshQuery = refreshQuery.Where(p => p.FreqUpHz == currentFreq.Value); if (!btnIncludeInvalidate.Checked) { refreshQuery = refreshQuery.Where(p => p.PosLon != 999); } updateItems = refreshQuery.Reverse().ToList(); cache.Clear(); } var items = txtFrequpMHz.Properties.Items.Where(p => p.Value != null).Select(t => Convert.ToInt64(t.Value)).ToList(); foreach (var item in freqs) { if (!items.Contains(item)) { this.Invoke(new Action(() => { this.txtFrequpMHz.Properties.Items.Add(new ImageComboBoxItem((item / 1e6).ToString("f3"), item)); })); } } if (txtTimeCho.Text == "自定义") continue; if (!updateItems.Any()) continue; var hours = Convert.ToInt32(txtTimeCho.EditValue); var ds = this.gridHomePosRes.DataSource as List; ds.InsertRange(0, updateItems); var max = ds.First().SigTime; ds.RemoveAll(p => (max - p.SigTime).TotalHours > hours); this.Invoke(new Action(() => { mapControl1.DelPosItem(p => (max - p.SigTime).TotalHours > hours); mapControl1.AddPosItems(updateItems); gridView2.RefreshData(); })); } catch (Exception ex) { IocContainer.Logger.Error(ex, "刷新定位点出错"); } finally { Thread.Sleep(refreshPosTime); } } }); } private async Task LoadPageData(PageQueryDto arg) { var repsTask = IocContainer.UnitOfWork.Of(); var queryable = repsTask.AsQueryable(); queryable = queryable.OrderByDescending(p => p.CreateTime); var pageData = await repsTask.GetPageData(arg, queryable); list.Clear(); list.AddRange(pageData.Data.To>()); gridView1.RefreshData(); return pageData; } private void GridView2_ColumnFilterChanged(object sender, EventArgs e) { try { //ModelPosRes List data = gridView2.DataController.GetAllFilteredAndSortedRows().OfType().ToList(); mapControl1.SetPosDataSource(data); } catch (Exception ex) { string msg = "筛选定位结果异常"; IocContainer.Logger.Error(ex, msg); DxHelper.MsgBoxHelper.ShowError(msg); } } private void OnSysSetingsChanged(SysSetings settings) { if (settings.MapType == 0) mapControl1.UseLocalDb(); else { string url = null; try { if (settings.WmtsSource == EnumWmtsSource.ZCJ) { url = AppConfigHelper.Get("ZCJ_URL", ""); } else { url = AppConfigHelper.Get("SJZX_URL", ""); } if (url.EndsWith("/")) url = url.Substring(0, url.Length - 1); mapControl1.UseWMTS(url, settings.WmtsSource, settings.MapLayerType); } catch (Exception ex) { mapControl1.UseLocalDb(); string msg = $"MapControl使用WMTS出现异常,强制使用本地地图.url={url}"; IocContainer.Logger.Error(ex, msg); } } } private void OnPosAdd(ModelPosRes posRes) { lock (this) { cache.Add(posRes); if (cache.Count > 1000) cache.RemoveAt(0); } } private async void GridView1_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e) { gridHomePosRes.DataSource = new List(); listCts.ForEach(t => t.Cancel()); listCts.Clear(); var cts = new CancellationTokenSource(); listCts.Add(cts); mapControl1.DelFixedImg("Sat"); mapControl1.DelFixedImg("Tx"); tsk = (e.Row as TaskViewModel); if (tsk == null) return; if (tsk.PosType == EnumPosType.X1D1CX) { gridView2.Columns[nameof(ModelPosRes.CxResID)].Visible = true; } else { gridView2.Columns[nameof(ModelPosRes.CxResID)].Visible = false; } this.txtFrequpMHz.Properties.Items.Clear(); this.txtFrequpMHz.Properties.Items.Add(new ImageComboBoxItem("全部", null)); var sigs = new List(); var dto = new TaskFreqQueryDto() { TaskInfoID = tsk.Id }; var res = await HttpHelper.PostRequestAsync>(SysConfig.GetUrl("Result/GetTaskFreqs"), dto); if (res.code == 200) sigs = res.data; foreach (var item in sigs) { this.txtFrequpMHz.Properties.Items.Add(new ImageComboBoxItem((item.FreqUpHz / 1e6).ToString("f3"), item.FreqUpHz)); } txtFrequpMHz.SelectedIndex = 0; var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton); var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton); btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running; List listPos = null; if (txtTimeCho.Text == "自定义" && (txtStartTime.EditValue == null || txtEndTime.EditValue == null || txtStartTime.DateTime > txtEndTime.DateTime)) { listPos = new List(); this.gridHomePosRes.DataSource = listPos; mapControl1.SetPosDataSource(listPos); } else { listPos = await searchPos(cts.Token); this.gridHomePosRes.DataSource = listPos; mapControl1.SetPosDataSource(listPos); } var unitOfWork = IocContainer.UnitOfWork; var repsSat = unitOfWork.Of(); var sat1 = await repsSat.FirstOrDefaultAsync(p => p.SatCode == tsk.MainSat); var sat2 = await repsSat.FirstOrDefaultAsync(p => p.SatCode == tsk.Adja1Sat); var sat3 = await repsSat.FirstOrDefaultAsync(p => p.SatCode == tsk.Adja2Sat); if (sat1 != null && sat1.SatLon != null) mapControl1.DrawFixedImg("Sat", "Sat1", 0, sat1.SatLon.Value, DxHelper.SvgHelper.CreateSat(width: 16, height: 16), $"主星\r\n{sat1.Sat}"); if (sat2 != null && sat2.SatLon != null) mapControl1.DrawFixedImg("Sat", "Sat2", 0, sat2.SatLon.Value, DxHelper.SvgHelper.CreateSat(width: 16, height: 16), $"邻1星\r\n{sat2.Sat}"); if (sat3 != null && sat3.SatLon != null) mapControl1.DrawFixedImg("Sat", "Sat3", 0, sat3.SatLon.Value, DxHelper.SvgHelper.CreateSat(width: 16, height: 16), $"邻2星\r\n{sat3.Sat}"); } private void GridView1_DoubleClick(object sender, EventArgs e) { layoutControlGroup1_CustomButtonClick(null, new DevExpress.XtraBars.Docking2010.BaseButtonEventArgs(new GroupBoxButton() { Caption = "编辑任务" })); } private void GridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { if (e.Column.FieldName == nameof(TaskViewModel.TaskName) && (EnumTaskState)gridView1.GetRowCellValue(e.RowHandle, nameof(TaskViewModel.TaskState)) == EnumTaskState.Running) { var palette = SvgPaletteHelper.GetSvgPalette(this.LookAndFeel, ObjectState.Normal); 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); Rectangle txtBounds = e.Bounds; txtBounds.Width -= 24; txtBounds.X += 24; e.Appearance.DrawString(e.Cache, e.DisplayText, txtBounds); e.Handled = true; } } private void gridView1_PopupMenuShowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e) { if (gridView1.FocusedRowHandle < 0) return; var state = (EnumTaskState)gridView1.GetFocusedRowCellValue(nameof(TaskViewModel.TaskState)); btnStart.Enabled = state == EnumTaskState.Stopped; btnStop.Enabled = state == EnumTaskState.Running; popupMenu1.ShowPopup(MousePosition); } private async void GridView2_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e) { mapControl1.DelFixedImg("Tx"); var posItem = (e.Row as ModelPosRes); if (posItem == null) return; var unitOfWork = IocContainer.UnitOfWork; var repsStation = unitOfWork.OfLong(); var station = await repsStation.FirstOrDefaultAsync(p => p.Id == posItem.StationResID); if (station != null) { if (mapControl1.ExistFixedImg($"SatTx_{station.SatTxLon}_{station.SatTxLat}", station.SatTxLat, station.SatTxLon)) mapControl1.DrawFixedImg("Tx", $"SatTx_{station.SatTxLon}_{station.SatTxLat}", station.SatTxLat, station.SatTxLon, DxHelper.SvgHelper.CreateAnt(width: 16, height: 16), $"[卫星接收天线]\r\n经度:{station.SatTxLon}°\r\n纬度:{station.SatTxLat}°"); if (station.CdbTxLon != null) { if (mapControl1.ExistFixedImg($"SatTx_{station.CdbTxLon.Value}_{station.CdbTxLat.Value}", station.CdbTxLat.Value, station.CdbTxLon.Value)) mapControl1.DrawFixedImg("Tx", $"CdbTx_{station.CdbTxLon.Value}_{station.CdbTxLat.Value}", station.CdbTxLat.Value, station.CdbTxLon.Value, DxHelper.SvgHelper.CreateAnt(width: 16, height: 16), $"[超短接收天线]\r\n经度:{station.CdbTxLon.Value}°\r\n纬度:{station.CdbTxLat.Value}°"); } if (station.RefLon != null) { if (mapControl1.ExistFixedImg($"SatTx_{station.RefLon.Value}_{station.RefLat.Value}", station.RefLat.Value, station.RefLon.Value)) mapControl1.DrawFixedImg("Tx", $"RefTx_{station.RefLon.Value}_{station.RefLat.Value}", station.RefLat.Value, station.RefLon.Value, DxHelper.SvgHelper.CreatePentagram(width: 16, height: 16), $"[参考站]\r\n经度:{station.RefLon.Value}°\r\n纬度:{station.RefLat.Value}°"); } if (station.CxLon != null) { if (mapControl1.ExistFixedImg($"SatTx_{station.CxLon.Value}_{station.CxLat.Value}", station.CxLat.Value, station.CxLon.Value)) mapControl1.DrawFixedImg("Tx", $"CxTx_{station.CxLon.Value}_{station.CxLat.Value}", station.CxLat.Value, station.CxLon.Value, DxHelper.SvgHelper.CreatePentagram(width: 16, height: 16), $"[测向站]\r\n经度:{station.CxLon.Value}°\r\n纬度:{station.CxLat.Value}°"); } } } private void gridView2_RowClick(object sender, RowClickEventArgs e) { var p = gridView2.GetFocusedRow() as ModelPosRes; p.Selected = true; mapControl1.UpdatePosItem(p, true); } private void toolTipController1_GetActiveObjectInfo(object sender, DevExpress.Utils.ToolTipControllerGetActiveObjectInfoEventArgs e) { var hitInfo = gridView1.CalcHitInfo(e.ControlMousePosition); if (hitInfo.RowHandle < 0 || hitInfo.Column == null || hitInfo.HitTest != DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitTest.RowCell) { toolTipController1.HideHint(); return; } if (hitInfo.Column.FieldName == nameof(TaskViewModel.TaskName)) { var state = (EnumTaskState)gridView1.GetRowCellValue(hitInfo.RowHandle, nameof(TaskViewModel.TaskState)); if (state == EnumTaskState.Running) e.Info = new ToolTipControlInfo(hitInfo.RowHandle, "执行中"); } } private async void layoutControlGroup1_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e) { var txt = (e.Button as GroupBoxButton).Caption; if (txt == "新建任务") { try { TaskViewModel addItem; TaskEditor frm = new TaskEditor(); if (frm.ShowDialog() != DialogResult.OK) return; addItem = frm.info; var addItemSignal = frm.selectedItem; if (addItem.PosType == EnumPosType.X1D1CX) { addItem.Adja1Sat = null; addItem.Adja2Sat = null; } else if (addItem.PosType == EnumPosType.X2D1 || addItem.PosType == EnumPosType.X2D1NoRef) { addItem.Adja2Sat = null; } var unitOfWork = IocContainer.UnitOfWork; var repsTask = unitOfWork.Of(); var taskInfo = await repsTask.AddOrUpdateAsync(addItem.To()); await unitOfWork.SaveAsync(); List sigList = new List(); foreach (var item in addItemSignal) { TaskSig taskSig = new TaskSig { TaskInfoID = taskInfo.Id, SigInfoID = item.Id, FreqUp = item.FreqUp, FreqDown = item.FreqDown, }; sigList.Add(taskSig); } var repsTaskSig = unitOfWork.Of(); await repsTaskSig.AddOrUpdateAsync(sigList); await unitOfWork.SaveAsync(); list.Insert(0, addItem); gridView1.RefreshData(); gridView1.FocusedRowHandle = 0; } catch (Exception ex) { string msg = "保存任务异常"; IocContainer.Logger.Error(ex, msg); DxHelper.MsgBoxHelper.ShowError(msg); } } else if (txt == "编辑任务") { try { var editItem = gridView1.GetFocusedRow() as TaskViewModel; if (editItem == null) return; var unitOfWork = IocContainer.UnitOfWork; var repsTaskSig = unitOfWork.Of(); var sigs = await repsTaskSig.AsQueryable().Include(p => p.SigInfo).Where(p => p.TaskInfoID == editItem.Id).Select(p => p.SigInfo).ToListAsync(); TaskEditor frm = new TaskEditor(editItem, sigs.To>()); if (frm.ShowDialog() != DialogResult.OK) return; editItem = frm.info; var editItemSig = frm.selectedItem; var repsTask = unitOfWork.Of(); if (await repsTask.AnyAsync(p => p.Id != editItem.Id && p.TaskName == editItem.TaskName)) { DxHelper.MsgBoxHelper.ShowWarning("任务名称重复"); return; } var find = await repsTask.FirstOrDefaultAsync(p => p.Id == editItem.Id); find.TaskName = editItem.TaskName; find.PosType = editItem.PosType; find.UpdateTime = DateTime.Now; find.MainSat = editItem.MainSat; find.TaskType = editItem.TaskType; find.TaskType = editItem.TaskType; if (find.PosType == EnumPosType.X1D1CX) { find.Adja1Sat = null; find.Adja2Sat = null; } else if (find.PosType == EnumPosType.X2D1 || find.PosType == EnumPosType.X2D1NoRef) { find.Adja1Sat = editItem.Adja1Sat; find.Adja2Sat = null; } else { find.Adja1Sat = editItem.Adja1Sat; find.Adja2Sat = editItem.Adja2Sat; } find.UpdateTime = DateTime.Now; await repsTask.AddOrUpdateAsync(find); await repsTaskSig.DeleteAsync(p => p.TaskInfoID == editItem.Id); List sigList = new List(); foreach (var item in editItemSig) { TaskSig taskSigEdit = new TaskSig(); taskSigEdit.TaskInfoID = editItem.Id; taskSigEdit.SigInfoID = item.Id; taskSigEdit.FreqUp = item.FreqUp; taskSigEdit.FreqDown = item.FreqDown; sigList.Add(taskSigEdit); } await repsTaskSig.AddOrUpdateAsync(sigList); await unitOfWork.SaveAsync(); gridView1.RefreshData(); } catch (Exception ex) { string msg = "编辑任务异常"; IocContainer.Logger.Error(ex, msg); DxHelper.MsgBoxHelper.ShowError(msg); } } else { try { var tsk = gridView1.GetFocusedRow() as TaskViewModel; if (tsk == null) return; if (!DxHelper.MsgBoxHelper.ShowConfirm($"删除任务[{tsk.TaskName}]?")) return; var unitOfWork = IocContainer.UnitOfWork; var repsTask = unitOfWork.Of(); await repsTask.DeleteAsync(p => p.Id == tsk.Id); var repsTaskSig = unitOfWork.Of(); await repsTaskSig.DeleteAsync(p => p.TaskInfoID == tsk.Id); await unitOfWork.SaveAsync(); gridView1.DeleteSelectedRows(); } catch (Exception ex) { string msg = "删除任务异常"; IocContainer.Logger.Error(ex, msg); DxHelper.MsgBoxHelper.ShowError(msg); } } } private async void btn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var tsk = gridView1.GetFocusedRow() as TaskViewModel; var unitOfWork = IocContainer.UnitOfWork; var repsTask = unitOfWork.Of(); var repsTaskSig = unitOfWork.Of(); if (e.Item.Caption == "启动任务") { try { TxInfo tx; TxInfo cdb; List tskSigsDto = new List(); var dbSigs = await repsTaskSig.AsQueryable().Include(p => p.SigInfo).Where(p => p.TaskInfoID == tsk.Id).ToListAsync(); if (!dbSigs.Any()) { DxHelper.MsgBoxHelper.ShowWarning($"请添加任务信号"); return; } foreach (var taskSig in dbSigs) { TaskSigDto sigDto = new TaskSigDto() { FreqDown = taskSig.SigInfo.FreqDown, FreqUp = taskSig.SigInfo.FreqUp, SigType = (EnumSigCheckTypeDto)taskSig.SigInfo.SigType, Snr = taskSig.SigInfo.Snr, TaskInfoID = taskSig.TaskInfoID, }; if (taskSig.SigInfo.Band > 0) sigDto.BandHz = taskSig.SigInfo.Band; else sigDto.BandHz = 25000; var repsSigDelay = unitOfWork.Of(); var sigDelay = await repsSigDelay.FindAsync(p => p.SigInfoId == taskSig.SigInfo.Id); sigDto.SigDelay.AddRange(sigDelay.To>()); tskSigsDto.Add(sigDto); } var repsTx = unitOfWork.Of(); tx = await repsTx.FirstOrDefaultAsync(p => p.TxType == EnumTxType.Rec); cdb = await repsTx.FirstOrDefaultAsync(p => p.TxType == EnumTxType.Cdb); if (tx == null || cdb == null) { DxHelper.MsgBoxHelper.ShowWarning($"未配置天线信息"); return; } var repsFixed = unitOfWork.Of(); var fixedStations = await repsFixed.FindAsync(p => p.Enable); if (tsk.PosType == EnumPosType.X2D1) { //下发任务 var svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.X2D1NoRefTask); if (svtItem == null) { DxHelper.MsgBoxHelper.ShowWarning($"未找到注册的两星一地处理服务"); return; } X2D1TaskHandleDto dto = new X2D1TaskHandleDto() { MainSatCode = tsk.MainSat, TaskType = (EnumTaskTypeDto)((int)tsk.TaskType), AdjaSatCode = tsk.Adja1Sat.Value, ID = tsk.Id, TaskName = tsk.TaskName, CapDir = "", CapLon = tx.Lon, CapLat = tx.Lat, CdbLon = cdb.Lon, CdbLat = cdb.Lat, DateDirFormat = "", Sigs = tskSigsDto, ForTest = AppConfigHelper.Get("ForTest", false) }; var fixedStation = fixedStations.FirstOrDefault(p => dto.Sigs.Any(t => t.FreqUp == p.FreqUpHz)); if (fixedStation != null) { dto.FixedStationDto = new X2D1FixedStationDto() { FixedStationId = fixedStation.Id, FreqUp = fixedStation.FreqUpHz, Lon = fixedStation.Lon, Lat = fixedStation.Lat, StationName = fixedStation.StationName, Value = fixedStation.Value, }; } if (tsk.TaskType == EnumTaskType.History) { TaskHistoryTimeEditor frm = new TaskHistoryTimeEditor(tsk); if (frm.ShowDialog() != DialogResult.OK) return; var startTime = frm.start; var endTime = frm.end; dto.StartTime = startTime; dto.EndTime = endTime; } var res = await HttpHelper.PostRequestAsync(svtItem.BaseHttpAddr + "X2D1TaskProcessing/Run", dto); if (res.code != 200) { IocContainer.Logger.Error(res.msg); DxHelper.MsgBoxHelper.ShowError($"{res.msg}"); return; } if (fixedStation != null)//有固定站 { var cts = new CancellationTokenSource(); PosWithRefFind refFind = new PosWithRefFind(); refFind.Start(dto.ID, cts.Token); dicCts[dto.ID] = cts; } } else { DxHelper.MsgBoxHelper.ShowError($"暂不支持{tsk.PosType.GetEnumDisplayName()}类型的任务"); return; } var item = await repsTask.FirstOrDefaultAsync(p => p.Id == tsk.Id); item.TaskState = EnumTaskState.Running; await repsTask.AddOrUpdateAsync(item); tsk.TaskState = EnumTaskState.Running; await unitOfWork.SaveAsync(); IocContainer.Logger.Information($"用户启动了任务,ID={tsk.Id}"); } catch (Exception ex) { string msg = "启动任务异常"; IocContainer.Logger.Error(ex, msg); DxHelper.MsgBoxHelper.ShowError(msg); } } else { try { var item = await repsTask.FirstOrDefaultAsync(p => p.Id == tsk.Id); item.TaskState = EnumTaskState.Stopped; await repsTask.AddOrUpdateAsync(item); await unitOfWork.SaveAsync(); tsk.TaskState = EnumTaskState.Stopped; string url = ""; ModelSvr svtItem = null; if (tsk.PosType == EnumPosType.X2D1) { svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.X2D1NoRefTask).To(); url = "X2D1TaskProcessing"; } if (svtItem == null) { //DxHelper.MsgBoxHelper.ShowWarning($"未找到注册的处理服务"); return; } TaskStopHandleDto dto = new TaskStopHandleDto(); dto.TaskType = (EnumTaskTypeDto)((int)tsk.TaskType); dto.ID = tsk.Id; var res = await HttpHelper.PostRequestAsync(svtItem.BaseHttpAddr + $"{url}/Stop", dto); if (res.code != 200) { IocContainer.Logger.Error(res.msg); DxHelper.MsgBoxHelper.ShowError(res.msg); } //停止查找参考信号 if (dicCts.ContainsKey(dto.ID)) { dicCts[dto.ID]?.Cancel(); dicCts.Remove(dto.ID); } IocContainer.Logger.Warning($"用户停止了任务,ID={tsk.Id}"); } catch (Exception ex) { string msg = "停止任务异常"; IocContainer.Logger.Error(ex, msg); DxHelper.MsgBoxHelper.ShowError(msg); } } gridView1.RefreshRow(gridView1.FocusedRowHandle); var btnEdit = (layoutControlGroup1.CustomHeaderButtons[1] as GroupBoxButton); var btnDel = (layoutControlGroup1.CustomHeaderButtons[2] as GroupBoxButton); btnDel.Enabled = btnEdit.Enabled = tsk.TaskState != EnumTaskState.Running; } private void txtFrequpMHz_SelectedIndexChanged(object sender, EventArgs e) { txtTimeCho_SelectedIndexChanged(null, null); } private async void txtTimeCho_SelectedIndexChanged(object sender, EventArgs e) { listCts.ForEach(t => t.Cancel()); listCts.Clear(); this.gridHomePosRes.DataSource = new List();//先设为空,数据相同时便于观察结果有没有变化 this.mapControl1.SetPosDataSource(new List()); if (tsk == null) { return; } var cts = new CancellationTokenSource(); listCts.Add(cts); switch (txtTimeCho.Text) { case "最近1小时": case "最近6小时": case "最近12小时": case "最近1天": case "最近3天": itemStart.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never; itemEnd.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never; layoutControlItemSearch.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never; var list = await searchPos(cts.Token); this.gridHomePosRes.DataSource = list; this.mapControl1.SetPosDataSource(list); break; case "自定义": itemStart.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always; itemEnd.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always; layoutControlItemSearch.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always; break; } } private async void BtnIncludeInvalidate_CheckedChanged(object sender, EventArgs e) { if (txtTimeCho.Text != "自定义") { listCts.ForEach(t => t.Cancel()); listCts.Clear(); this.gridHomePosRes.DataSource = new List();//先设为空,数据相同时便于观察结果有没有变化 if (tsk == null) { return; } var cts = new CancellationTokenSource(); listCts.Add(cts); this.gridHomePosRes.DataSource = await searchPos(cts.Token); } } private async void btnSearch_Click(object sender, EventArgs e) { if (txtStartTime.EditValue == null) { DxHelper.MsgBoxHelper.ShowError($"请选择信号开始时间!"); return; } if (txtEndTime.EditValue == null) { DxHelper.MsgBoxHelper.ShowError($"请选择信号结束时间!"); return; } if (txtStartTime.DateTime > txtEndTime.DateTime) { DxHelper.MsgBoxHelper.ShowError($"开始时间不能大于结束时间!"); return; } listCts.ForEach(t => t.Cancel()); listCts.Clear(); var cts = new CancellationTokenSource(); listCts.Add(cts); var listPos = await searchPos(cts.Token); this.gridHomePosRes.DataSource = listPos; this.mapControl1.SetPosDataSource(listPos); } private async Task> searchPos(CancellationToken ct = default) { gridView2.ClearSorting(); gridView2.ClearFindFilter(); gridView2.ClearColumnsFilter(); try { List list = new List(); if (txtTimeCho.Text == "自定义") { var dto = new PosRequestByTimeRangeDto() { TarFrequpHz = (long?)txtFrequpMHz.EditValue, BeginTime = txtStartTime.DateTime, EndTime = txtEndTime.DateTime, TaskInfoID = tsk.Id, IncludeInvalidate = btnIncludeInvalidate.Checked }; var res = await HttpHelper.PostRequestAsync>(SysConfig.GetUrl("Result/GetPosResByTimeRangeObsolete"), dto, token: ct); if (res.code == 200) { if (res.msg.Length > 10) { MsgBoxHelper.ShowWarning(res.msg); } list = res.data; } else { MsgBoxHelper.ShowError(res.msg); } } else { var dto = new PosRequestByLastRangeDto() { TaskInfoID = tsk.Id, Hours = Convert.ToInt32(txtTimeCho.EditValue), IncludeInvalidate = btnIncludeInvalidate.Checked }; if (txtFrequpMHz.EditValue != null) { dto.TarFrequpHz = Convert.ToInt64(txtFrequpMHz.EditValue); } var res = await HttpHelper.PostRequestAsync>(SysConfig.GetUrl("Result/GetPosResByLastHoursObsolete"), dto, token: ct); if (res.code == 200) { if (res.msg.Length > 10) { MsgBoxHelper.ShowWarning(res.msg); } list = res.data; } else { MsgBoxHelper.ShowError(res.msg); } } return list; } catch (TaskCanceledException) { }//屏蔽掉取消查询的异常 catch (Exception ex) { string msg = "定位结果查询异常"; IocContainer.Logger.Error(ex, msg); MsgBoxHelper.ShowError(msg); } return new List(); } #region 定位点右键事件函数 //删除定位点 public async Task DelPos(List items) { try { var ids = items.Select(m => m.Id).ToList(); var unitOfWork = IocContainer.UnitOfWork; var repsPos = unitOfWork.OfLong(); await repsPos.DeleteAsync(p => ids.Contains(p.Id)); mapControl1.DelPosItem(p => ids.Contains(p.Id)); return true; } catch (Exception ex) { string msg = "表格中删除定位点异常"; IocContainer.Logger.Error(ex, msg); DxHelper.MsgBoxHelper.ShowError(msg); return false; } } //绘制时差线 public void DrawDtoLine(ModelPosRes item) { switch (item.PosResType) { case EnumPosResType.X1D1CX: X1D1DTOParamEditor frm = new X1D1DTOParamEditor(item, mapControl1); DxHelper.PopupHelper.ShowPopup(frm, layoutControl1, 600); break; case EnumPosResType.X2D1: case EnumPosResType.X2D1NoRef: X2D1DTOParamEditor X2D1frm = new X2D1DTOParamEditor(item, mapControl1); DxHelper.PopupHelper.ShowPopup(X2D1frm, layoutControl1, 600); break; default: break; } } //绘制GDOP public void DrawGdopLine(ModelPosRes item) { try { switch (item.PosResType) { case EnumPosResType.X1D1CX: X1D1GDOPParam x1D1GdopParam = new X1D1GDOPParam(item); x1D1GdopParam.mapControl1 = mapControl1; DxHelper.PopupHelper.ShowPopup(x1D1GdopParam, layoutControl1, 600); break; case EnumPosResType.X2D1: case EnumPosResType.X2D1NoRef: X2D1GDOPParam x2D1GdopParam = new X2D1GDOPParam(item); x2D1GdopParam.mapControl1 = mapControl1; DxHelper.PopupHelper.ShowPopup(x2D1GdopParam, layoutControl1, 600); break; default: break; } } catch (Exception ex) { string msg = $"绘制{item.PosResType.GetEnumDisplayName()}GDOP失败"; IocContainer.Logger.Error(ex, msg); DxHelper.MsgBoxHelper.ShowWarning(msg); } } //查看参估结果 public void ShowCafRes(ModelPosRes item) { DxHelper.PopupHelper.ShowPopup(new ShowCgCtrl(item), gridHomePosRes, gridHomePosRes.Height + 80, EnumPopupDirection.Bottom, showCloseButton: true); } //查看测向结果 public void ShowCxRes(ModelPosRes item) { DxHelper.PopupHelper.ShowPopup(new ShowCxCtrl(item), gridHomePosRes, gridHomePosRes.Height + 80, EnumPopupDirection.Bottom, showCloseButton: true); } //查看检测结果 public void ShowCheckRes(ModelPosRes item) { DxHelper.PopupHelper.ShowPopup(new ShowCheckCtrl(item), gridHomePosRes, gridHomePosRes.Height + 80, EnumPopupDirection.Bottom, showCloseButton: true); } //手动定位 public void PosManual(ModelPosRes item) { //switch (item.PosResType) //{ // case EnumPosResType.X1D1CX: // X1D1PosParamEditor frm = new X1D1PosParamEditor(item, mapControl1); // DxHelper.PopupHelper.ShowPopup(frm, layoutControl1, 600); // break; // case EnumPosResType.X2D1: // case EnumPosResType.X2D1NoRef: // X2D1PosParamEditor X2D1PosParamEditor = new X2D1PosParamEditor(item); // DxHelper.PopupHelper.ShowPopup(X2D1PosParamEditor, layoutControl1, 600); // break; // case EnumPosResType.X3: // case EnumPosResType.X3NoRef: // X3PosParamEditor X3frm = new X3PosParamEditor(item, mapControl1); // DxHelper.PopupHelper.ShowPopup(X3frm, layoutControl1, 600); // break; // case EnumPosResType.X3TwoDfo: // X3DfoPosParamEditor X3df0frm = new X3DfoPosParamEditor(item); // DxHelper.PopupHelper.ShowPopup(X3df0frm, layoutControl1, 600); // break; // case EnumPosResType.X2Dfo: // X2PosParamEditor X2PosParamEditor = new X2PosParamEditor(item); // DxHelper.PopupHelper.ShowPopup(X2PosParamEditor, layoutControl1, 600); // break; // default: // break; //} } public void RePosition(List items, PosRequestByTimeRangeDto dto) { Task.Run(async () => { var unitOfWork = IocContainer.UnitOfWork; foreach (var item in items) { double[] res = new double[6]; var StationRes = new StationRes() { SatTxLon = item.StationRes.SatTxLon, SatTxLat = item.StationRes.SatTxLat, CdbTxLon = item.StationRes.CdbTxLon, CdbTxLat = item.StationRes.CdbTxLat, CxLon = item.StationRes.CxLon, CxLat = item.StationRes.CxLat, RefLon = item.StationRes.RefLon, RefLat = item.StationRes.RefLat, }; var repsXl = unitOfWork.Of() as XlRepository; var mainxlInfo = await repsXl.GetLatestAsync(item.CgRes.MainCode.Value, item.SigTime); if (mainxlInfo == null) { IocContainer.Logger.Error($"重新定位异常,卫星{item.CgRes.MainCode}未找到对应的星历信息"); continue; } var maineph = EphHelper.Calc(mainxlInfo.TwoLine, item.SigTime.ToUtc()); var CgRes = new CgRes() { SigTime = item.SigTime, MainX = maineph.X, MainY = maineph.Y, MainZ = maineph.Z, MainVx = maineph.VX, MainVy = maineph.VY, MainVz = maineph.VZ, }; switch (item.PosResType) { case EnumPosResType.X1D1CX: CgRes.DtoCdb = item.CgRes.DtoCdb; CgRes.YbMainDto = item.CgRes.YbMainDto; var cxRes = new CxRes() { SigTime = item.SigTime, Fx = item.CxRes.Fx, }; res = PosApi.X1D1_Pos(CgRes, StationRes, cxRes); item.PosLon = res[0]; item.PosLat = res[1]; item.MirrLon = res[3]; item.MirrLat = res[4]; break; case EnumPosResType.X2D1: case EnumPosResType.X2D1NoRef: var x2lInfo1 = await repsXl.GetLatestAsync(item.CgRes.Adja1Code.Value, item.SigTime); if (x2lInfo1 == null) { IocContainer.Logger.Error($"重新定位异常,卫星{item.CgRes.Adja1Code}未找到对应的星历信息"); continue; } var eph1 = EphHelper.Calc(x2lInfo1.TwoLine, item.SigTime.ToUtc()); CgRes.Dto1 = item.CgRes.Dto1; CgRes.Dfo1 = item.CgRes.Dfo1; CgRes.Snr1 = item.CgRes.Snr1; CgRes.DtoCdb = item.CgRes.DtoCdb; CgRes.DfoCdb = item.CgRes.DfoCdb; CgRes.SnrCdb = item.CgRes.SnrCdb; CgRes.YbMainDto = item.CgRes.YbMainDto; CgRes.YbAdja1Dto = item.CgRes.YbAdja1Dto; CgRes.MainCode = item.CgRes.MainCode; CgRes.Adja1Code = item.CgRes.Adja1Code; CgRes.Adja1X = eph1.X; CgRes.Adja1Y = eph1.Y; CgRes.Adja1Z = eph1.Z; if (item.PosResType == EnumPosResType.X2D1) { res = PosApi.X2D1_Pos(CgRes, StationRes); } else { res = PosApi.X2D1_PosNoRef_ZL(CgRes, StationRes); } item.PosLon = res[0]; item.PosLat = res[1]; item.MirrLon = res[3]; item.MirrLat = res[4]; break; default: break; } } var repsPos = unitOfWork.OfLong(); foreach (var item in items) { var posItem = await repsPos.FirstOrDefaultAsync(p => p.Id == item.Id); posItem.PosLon = item.PosLon; posItem.PosLat = item.PosLat; posItem.MirrLon = item.MirrLon; posItem.MirrLat = item.MirrLat; await repsPos.AddOrUpdateAsync(posItem); } await unitOfWork.SaveAsync(); string msg = $"重新定位完成,共{items.Count()}条记录"; IocContainer.Logger.Information(msg); MsgBoxHelper.ShowInfo(msg); }); } //重新定位 public async void Repos(List dataSource) { if (tsk == null) { MsgBoxHelper.ShowWarning("请选择需要重新定位的任务"); return; } PosTimeEditor frm = new PosTimeEditor(tsk); if (frm.ShowDialog() != DialogResult.OK) return; var dto = new PosRequestByTimeRangeDto() { BeginTime = frm.start, EndTime = frm.end, TaskInfoID = tsk.Id }; try { var ct = new CancellationTokenSource(); var res = await HttpHelper.PostRequestAsync>(SysConfig.GetUrl("Result/GetPosCgResByTimeRangeObsolete"), dto, token: ct.Token); if (res.code == 200) { RePosition(res.data, dto); } else { MsgBoxHelper.ShowError(res.msg); } } catch (Exception ex) { string msg = $"任务[{dto.TaskInfoID}]重新定位异常"; IocContainer.Logger.Error(ex, msg); MsgBoxHelper.ShowError(msg); } } #endregion #region 地图区域右键菜单 public void DrawTrack(List items) { try { if (items.Count == 0) { DxHelper.MsgBoxHelper.ShowWarning($"请选择需要绘制目标航迹的定位数据信息!"); return; } if (items.Count == 1) { DxHelper.MsgBoxHelper.ShowWarning($"一条定位数据信息不能绘制目标航迹!"); return; } mapControl1.DrawTrack(items); } catch (Exception ex) { string msg = $"绘制目标轨迹异常"; IocContainer.Logger.Error(ex, msg); MsgBoxHelper.ShowError(msg); } } //编辑目标 private async Task EditTarget(List items) { try { if (items.Count == 0) return; long? targetID = 0; var unitOfWork = IocContainer.UnitOfWork; var repsPos = unitOfWork.OfLong(); var idRes = items.First().Id; var target = await repsPos.FirstOrDefaultAsync(p => p.Id == idRes); targetID = target.TargetInfoID; TargetInfo info = null; if (targetID != null) { var repsTarget = unitOfWork.Of(); info = await repsTarget.FirstOrDefaultAsync(p => p.Id == target.Id); } EditorTar frm = new EditorTar(info); if (frm.ShowDialog() != DialogResult.OK) return; var tar = frm.info; foreach (var item in items) { var posItem = await repsPos.FirstOrDefaultAsync(p => p.Id == item.Id); posItem.TargetInfoID = tar.Id; posItem.ColorKey = tar.TargeColor; await repsPos.AddOrUpdateAsync(posItem); mapControl1.UpdatePosItem(posItem); } var ds = this.gridHomePosRes.DataSource as List; items.ForEach(p => { p.TargetInfoID = tar.Id; p.TargetInfo = tar; p.ColorKey = tar.TargeColor; }); gridView2.RefreshData(); string msg = $"共修改了{items.Count()}个定位点的目标信息"; IocContainer.Logger.Information(msg); MsgBoxHelper.ShowInfo(msg); } catch (Exception ex) { string msg = $"编辑定位目标异常"; IocContainer.Logger.Error(ex, msg); MsgBoxHelper.ShowError(msg); } } //转到列表 private void ToPosList(List items) { if (items == null || items.Count() == 0) { DxHelper.MsgBoxHelper.ShowWarning($"请选择需要转到列表的定位数据信息!"); return; } try { var ds = this.gridHomePosRes.DataSource as List; var ids = items.Select(p => p.Id).ToList(); //删除地图 var deleteItems = ds.Where(m => !ids.Contains(m.Id)).ToList(); mapControl1.DelPosItem(deleteItems); //删除列表 ds.RemoveAll(m => !ids.Contains(m.Id)); gridView2.RefreshData(); } catch (Exception ex) { string msg = "转到列表异常"; IocContainer.Logger.Error(ex, msg); MsgBoxHelper.ShowError(msg); } } //批量使用镜像点 private async Task UseMirr(List items) { if (items == null || items.Count() == 0) { DxHelper.MsgBoxHelper.ShowWarning($"请选择需要使用镜像点的定位数据信息!"); return; } try { if (!MsgBoxHelper.ShowConfirm($"确认使用镜像点?共{items.Count}条记录")) return; var ids = items.Select(p => p.Id); var unitOfWork = IocContainer.UnitOfWork; var repsPos = unitOfWork.OfLong(); var updateItems = await repsPos.FindAsync(p => ids.Contains(p.Id)); UseMirror(updateItems); mapControl1.UpdatePosItem(items); gridView2.RefreshData(); string msg = $"用户修改了{items.Count()}个定位点的镜像点"; IocContainer.Logger.Information(msg); MsgBoxHelper.ShowInfo(msg); } catch (Exception ex) { string msg = "使用镜像点失败"; IocContainer.Logger.Error(ex, msg); MsgBoxHelper.ShowError(msg); } } //批量删除 private async Task DeletePosRes(List items) { if (items == null || items.Count() == 0) { DxHelper.MsgBoxHelper.ShowWarning($"请选择需要删除的定位数据信息!"); return; } try { if (!MsgBoxHelper.ShowConfirm($"确认删除定位点?共{items.Count}条记录")) return; var ids = items.Select(p => p.Id); var unitOfWork = IocContainer.UnitOfWork; var repsPos = unitOfWork.OfLong(); await repsPos.DeleteAsync(p => ids.Contains(p.Id)); await unitOfWork.SaveAsync(); mapControl1.DelPosItem(items); var ds = this.gridHomePosRes.DataSource as List; ds.RemoveAll(m => items.Select(p => p.Id).Contains(m.Id)); gridView2.RefreshData(); string msg = $"用户删除了{items.Count()}个定位点"; IocContainer.Logger.Information(msg); MsgBoxHelper.ShowInfo(msg); } catch (Exception ex) { string msg = "删除定位点失败"; IocContainer.Logger.Error(ex, msg); MsgBoxHelper.ShowError(msg); } } private void UseMirror(IEnumerable pos) { foreach (var item in pos) { var mirrlon = item.MirrLon; var mirrLat = item.MirrLat; if (mirrlon == 999) { continue; } item.MirrLon = item.PosLon; item.MirrLat = item.PosLat; item.PosLon = mirrlon; item.PosLat = mirrLat; } } #endregion } }