using DevExpress.Utils; using DevExpress.Utils.Drawing; using DevExpress.Utils.Svg; using DevExpress.XtraEditors.ButtonsPanelControl; using DevExpress.XtraGrid.Views.Grid; using DxHelper; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Data; using System.Data.Entity; using System.Drawing; using System.Linq; using System.Net; using System.Text; using System.Windows.Forms; using XdCxRhDW.App.EditForms; using XdCxRhDW.Repostory; using XdCxRhDW.WebApi; using ExtensionsDev; using DevExpress.XtraEditors; using System.Data.Entity.Migrations; using System.Threading; using System.Threading.Tasks; using System.IO; using XdCxRhDW.App.PopupControl; using System.Windows.Controls; using XdCxRhDW.Dto; using DevExpress.XtraEditors.Controls; using DevExpress.Mvvm.Native; using XdCxRhDW.Entity; using XdCxRhDW.Api; using XdCxRhDW.App.Controllers; using DevExpress.XtraPrinting.Native.Properties; using DevExpress.Utils.Drawing.Helpers; using DevExpress.Office.Crypto; using XdCxRhDW.App.Model; using DPP_YH_Core.Extensions; using DevExpress.Utils.Filtering; using DevExpress.Data.Svg; using DevExpress.Utils.About; using XdCxRhDW.App.App.Properties; using System.Windows.Documents; using System.Configuration; using DevExpress.XtraExport.Helpers; namespace XdCxRhDW.App.UserControl { public partial class CtrlHome : DevExpress.XtraEditors.XtraUserControl { List list = new List(); TaskInfo tsk; List listCts = new List(); public CtrlHome() { InitializeComponent(); layoutControl1.UseDefault(); if (this.splitterItem1.Location.X < 200) this.splitterItem1.Location = new Point(200, 0); } private async void CtrlHome_Load(object sender, EventArgs e) { 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; using (RHDWContext db = new RHDWContext()) { var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == id); if (item == null) return; for (int i = 0; i < 5; i++) { if (find.TaskState != item.TaskState) break; await Task.Delay(500); } find.TaskState = item.TaskState; } this.gridView1.RefreshData(); }); gridHomeTask.UseDefault(list, showScrollH: true).UseEmptyText("点击+创建任务"); gridView1.BestFitColumns(); gridHomePosRes.UseDefault(new List()).UseMultiSelect().UseRowNumber().UseNullValueText() .AddRowMenu("绘制时差线", SvgHelper.CreateDtoLine(), DrawDtoLine, item => item.PosResType != EnumPosResType.RH) .AddRowMenuAsync("绘制频差线", SvgHelper.CreateDfoLine(), DrawDfoLine, item => item.PosResType == EnumPosResType.X2Dfo || item.PosResType == EnumPosResType.X3TwoDfo) .AddRowMenuAsync("绘制测向线", SvgHelper.CreateDfoLine(), DrawCxLine, item => item.PosResType == EnumPosResType.X1D1CX || item.PosResType == EnumPosResType.RH) .AddRowMenu("GDOP分析", SvgHelper.CreateGDOP(), DrawGdopLine, item => item.PosResType != EnumPosResType.RH) .AddRowMenu("查看参估", SvgHelper.CreateShowCafRes(), ShowCafRes) .AddRowMenu("查看测向", SvgHelper.CreateShowCxRes(), ShowCxRes) .AddRowMenu("查看检测", SvgHelper.CreateShowCheckRes(), ShowCheckRes, item => item.PosResType == EnumPosResType.X1D1CX || item.PosResType == EnumPosResType.RH) .AddRowMenu("手动定位", SvgHelper.CreatePosManual(), PosManual) .AddContentMenu("重新定位", SvgHelper.CreateRepos(), Repos, true) .UseDeleteAsync(DelPos, "删除记录") .SetDisplayText(nameof(ModelPosRes.FreqUpHz), val => (Convert.ToInt64(val) / 1e6).ToString("f3")) .MountRowMenuToMapPos(mapControl1)//将表格单行元素菜单挂载到定位点上(实验) .MountMultRowMenuToMapRegion(mapControl1); //将表格多行元素菜单挂载到地图区域菜单上(该功能暂未实现) txtStartTime.UseDefault(); txtEndTime.UseDefault(); //mapService = "http://ows.mundialis.de/services/service"; mapControl1.UseDefalutOptions() //.UseCluster()//定位点使用内置聚合 .UseClearAll() .UseDistanceLine() .UseMarkDot() .UseExportImg() .UseExportXlsx() .UseExportCsv() .UseDrawRect(rect => { (double startLon, double startLat, double centerLon, double centerLat, double endLon, double endLat, double lonRange, double latRange) = rect; }); SysSetings settings; using (RHDWContext db = new RHDWContext()) { settings = await db.SysSetings.FirstOrDefaultAsync(); if (settings == null) { mapControl1.UseLocalDb(); DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息"); return; } try { Startup.Start(settings.HttpPort, "多模式融合定位平台.Xml", "XdCxRhDW.Dto.xml"); } catch (System.Reflection.TargetInvocationException ex) { Serilog.Log.Error(ex, $"启动Http服务失败!"); if (ex.InnerException is HttpListenerException) { DxHelper.MsgBoxHelper.ShowWarning($"{ex.InnerException.Message}"); } else { DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!"); } } catch (Exception ex) { Serilog.Log.Error(ex, $"启动Http服务失败!"); DxHelper.MsgBoxHelper.ShowWarning($"启动Http服务失败!"); } } if (settings.MapType == 0) { mapControl1.UseLocalDb(); } else { try { string url; if (settings.WmtsSource == EnumWmtsSource.ZCJ) { url = ConfigurationManager.AppSettings["ZCJ_URL"].Trim(); } else { url = ConfigurationManager.AppSettings["SJZX_URL"].Trim(); } if (url.EndsWith("/")) url = url.Substring(0, url.Length - 1); mapControl1.UseWMTS(url, settings.WmtsSource, settings.MapLayerType); } catch (Exception ex) { mapControl1.UseLocalDb(); Serilog.Log.Error(ex, "MapControl使用WMTS出现异常,强制使用本地地图"); } } gridView1.FocusedRowObjectChanged += GridView1_FocusedRowObjectChanged; gridView2.FocusedRowObjectChanged += GridView2_FocusedRowObjectChanged; btnIncludeInvalidate.CheckedChanged += BtnIncludeInvalidate_CheckedChanged; try { List txList = new List(); using (RHDWContext db = new RHDWContext()) { var tasks = db.TaskInfos.OrderByDescending(p => p.UpdateTime).ToList(); list.AddRange(tasks); var runningList = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running).ToListAsync(); foreach (var item in runningList) { item.TaskState = EnumTaskState.Stopped; } await db.SaveChangesAsync(); var satres = db.SatInfos.OrderBy(p => p.SatName).OrderBy(p => p.SatName); var txres = await db.TxInfos.ToListAsync(); txList.AddRange(txres); } 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())); } catch (Exception ex) { Serilog.Log.Error(ex, "加载基础信息异常"); DxHelper.MsgBoxHelper.ShowError("加载基础信息异常"); } gridView1.Columns[nameof(TaskInfo.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.CustomColumnDisplayText += GridView1_CustomColumnDisplayText; gridView1.DoubleClick += GridView1_DoubleClick; txtTimeCho_SelectedIndexChanged(null, null); WaitHelper.CloseForm(); } private void OnSysSetingsChanged(SysSetings settings) { if (settings.MapType == 0) mapControl1.UseLocalDb(); else { try { string url; if (settings.WmtsSource == EnumWmtsSource.ZCJ) { url = ConfigurationManager.AppSettings["ZCJ_URL"].Trim(); } else { url = ConfigurationManager.AppSettings["SJZX_URL"].Trim(); } if (url.EndsWith("/")) url = url.Substring(0, url.Length - 1); mapControl1.UseWMTS(url, settings.WmtsSource, settings.MapLayerType); } catch (Exception ex) { mapControl1.UseLocalDb(); Serilog.Log.Error(ex, "MapControl使用WMTS出现异常,强制使用本地地图"); } } } private void OnPosAdd(ModelPosRes posRes) { var currentTask = gridView1.GetFocusedRow() as TaskInfo; if (currentTask.ID == posRes.TaskInfoID) { var ds = this.gridHomePosRes.DataSource as List; ds.Insert(0, posRes); this.Invoke(new Action(() => { gridView2.RefreshData(); mapControl1.AddPosItem(posRes); })); } } private async void GridView1_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e) { listCts.ForEach(t => t.Cancel()); listCts.Clear(); var cts = new CancellationTokenSource(); listCts.Add(cts); mapControl1.DelFixedImg("Sat"); mapControl1.DelFixedImg("Tx"); tsk = (e.Row as TaskInfo); if (tsk == null) return; if (tsk.PosType == EnumPosType.X1D1CX || tsk.PosType == EnumPosType.RH) { 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)); if (tsk.TaskType == EnumTaskType.Real) this.txtFrequpMHz.Properties.Items.Add(new ImageComboBoxItem((tsk.Freq / 1e6).ToString("f3"), tsk.Freq)); else { if (tsk.HistoryFrequpMHz != null) { var freqArr = tsk.HistoryFrequpMHz.Split(','); var listFreqHz = freqArr.Where(p => !string.IsNullOrWhiteSpace(p)).Select(p => Convert.ToDouble(p) * 1e6).OrderBy(p => p).ToList(); foreach (var freqHz in listFreqHz) { this.txtFrequpMHz.Properties.Items.Add(new ImageComboBoxItem((freqHz / 1e6).ToString("f3"), freqHz)); } } } 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); } using (RHDWContext db = new RHDWContext()) { var sat1 = db.SatInfos.Where(p => p.SatCode == tsk.MainSat).FirstOrDefault(); var sat2 = db.SatInfos.Where(p => p.SatCode == tsk.Adja1Sat).FirstOrDefault(); var sat3 = db.SatInfos.Where(p => p.SatCode == tsk.Adja2Sat).FirstOrDefault(); if (sat1 != null && sat1.SatLon != null) mapControl1.DrawFixedImg("Sat", 0, sat1.SatLon.Value, DxHelper.SvgHelper.CreateSat(width: 16, height: 16), $"主星\r\n{sat1.Sat}"); if (sat2 != null && sat2.SatLon != null) mapControl1.DrawFixedImg("Sat", 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", 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_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) { if (e.Value == null) return; if (e.Column.FieldName == nameof(TaskInfo.Freq)) { e.DisplayText = $"{(long)e.Value / 1e6}MHz"; } } private void GridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e) { if (e.Column.FieldName == nameof(TaskInfo.TaskName) && (EnumTaskState)gridView1.GetRowCellValue(e.RowHandle, nameof(TaskInfo.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(TaskInfo.TaskState)); btnStart.Enabled = state == EnumTaskState.Stopped; btnStop.Enabled = state == EnumTaskState.Running; popupMenu1.ShowPopup(MousePosition); } private void GridView2_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e) { mapControl1.DelFixedImg("Tx"); var posItem = (e.Row as ModelPosRes); if (posItem == null) return; using (RHDWPartContext db = RHDWPartContext.GetContext(posItem.SigTime)) { if (db.DatabaseExist) { var station = db.StationRes.Where(p => p.ID == posItem.StationResID).FirstOrDefault(); if (station != null) { mapControl1.DrawFixedImg("Tx", station.SatTxLat, station.SatTxLon, DxHelper.SvgHelper.CreateAnt(width: 16, height: 16), $"[卫星接收天线]\r\n经度:{station.SatTxLon}°\r\n纬度:{station.SatTxLat}°"); if (station.CdbTxLon != null) mapControl1.DrawFixedImg("Tx", 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) mapControl1.DrawFixedImg("Tx", 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) mapControl1.DrawFixedImg("Tx", 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(TaskInfo.TaskName)) { var state = (EnumTaskState)gridView1.GetRowCellValue(hitInfo.RowHandle, nameof(TaskInfo.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 { TaskEditor frm = new TaskEditor(); if (frm.ShowDialog() != DialogResult.OK) return; var addItem = frm.info; using (RHDWContext db = new RHDWContext()) { if (addItem.PosType == EnumPosType.X1D1CX) { addItem.Adja1Sat = null; addItem.Adja2Sat = null; } else if (addItem.PosType == EnumPosType.X2D1 || addItem.PosType == EnumPosType.X2Dfo || addItem.PosType == EnumPosType.RH) { addItem.Adja2Sat = null; } var taskInfo = db.TaskInfos.Add(addItem); await db.SaveChangesAsync(); } list.Insert(0, addItem); gridView1.RefreshData(); gridView1.FocusedRowHandle = 0; } catch (Exception ex) { Serilog.Log.Error(ex, "保存任务异常"); DxHelper.MsgBoxHelper.ShowError("保存任务异常"); } } else if (txt == "编辑任务") { try { using (RHDWContext db = new RHDWContext()) { var editItem = gridView1.GetFocusedRow() as TaskInfo; TaskEditor frm = new TaskEditor(editItem); if (frm.ShowDialog() != DialogResult.OK) return; editItem = frm.info; if (await db.TaskInfos.AnyAsync(p => p.ID != editItem.ID && p.TaskName == editItem.TaskName)) { DxHelper.MsgBoxHelper.ShowWarning("任务名称重复"); return; } var find = await db.TaskInfos.Where(p => p.ID == editItem.ID).FirstOrDefaultAsync(); find.TaskName = editItem.TaskName; find.PosType = editItem.PosType; find.SigType = editItem.SigType; find.DetectionWay = editItem.DetectionWay; find.UpdateTime = DateTime.Now; find.Freq = editItem.Freq; find.MainSat = editItem.MainSat; find.CapDir = editItem.CapDir; find.CapDirFormat = editItem.CapDirFormat; find.HistoryFrequpMHz = editItem.HistoryFrequpMHz; if (find.PosType == EnumPosType.X1D1CX) { find.Adja1Sat = null; find.Adja2Sat = null; } else if (find.PosType == EnumPosType.X2D1 || find.PosType == EnumPosType.X2Dfo || find.PosType == EnumPosType.RH) { find.Adja2Sat = null; } else { find.Adja1Sat = editItem.Adja1Sat; find.Adja2Sat = editItem.Adja2Sat; } db.TaskInfos.AddOrUpdate(find); await db.SaveChangesAsync(); } gridView1.RefreshData(); } catch (Exception ex) { Serilog.Log.Error(ex, "保存任务异常"); DxHelper.MsgBoxHelper.ShowError("保存任务异常"); } } else { try { var tsk = gridView1.GetFocusedRow() as TaskInfo; if (tsk == null) return; if (!DxHelper.MsgBoxHelper.ShowConfirm($"删除任务[{tsk.TaskName}]?")) return; using (RHDWContext db = new RHDWContext()) { var item = db.TaskInfos.FirstOrDefault(p => p.ID == tsk.ID); db.TaskInfos.Remove(item); db.SaveChanges(); } gridView1.DeleteSelectedRows(); } catch (Exception ex) { Serilog.Log.Error(ex, "删除任务异常"); DxHelper.MsgBoxHelper.ShowError("删除任务异常"); } } } private async void btn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var tsk = gridView1.GetFocusedRow() as TaskInfo; if (e.Item.Caption == "启动任务") { try { if (tsk.TaskType == EnumTaskType.History) { TxInfo tx; using (RHDWContext db = new RHDWContext()) { tx = db.TxInfos.FirstOrDefault(); if (tx == null) { DxHelper.MsgBoxHelper.ShowWarning($"未配置天线信息"); return; } } if (tsk.PosType == EnumPosType.X2D1) { //下发任务 var svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.X2D1NoRefHistoryTask); if (svtItem == null) { DxHelper.MsgBoxHelper.ShowWarning($"未找到注册的处理服务"); return; } TaskHistoryTimeEditor frm = new TaskHistoryTimeEditor(tsk); if (frm.ShowDialog() != DialogResult.OK) return; var startTime = frm.start; var endTime = frm.end; var strs = tsk.HistoryFrequpMHz.Split(','); var freqs = strs.Select(f => ((long)(Convert.ToDouble(f) * 1e6))); X2D1HistoryTaskHandleDto dto = new X2D1HistoryTaskHandleDto() { MainSatCode = tsk.MainSat, AdjaSatCode = tsk.Adja1Sat.Value, ID = tsk.ID, StartTime = startTime, EndTime = endTime, TaskName = tsk.TaskName, TaskCheckType = tsk.DetectionWay.HasValue ? (EnumTaskCheckTypeDto)(int)tsk.DetectionWay.Value : EnumTaskCheckTypeDto.DAMA, CapDir = tsk.CapDir, CapLon = tx.Lon, CapLat = tx.Lat, DateDirFormat = tsk.CapDirFormat, FreqsHz = freqs.ToList() }; var res = await HttpHelper.PostRequestAsync(svtItem.BaseHttpAddr + "/api/HistoryTaskProcessing/Run", dto); if (res.code != 200) { Serilog.Log.Error(res.msg); DxHelper.MsgBoxHelper.ShowError($"{res.msg}"); return; } } else if (tsk.PosType == EnumPosType.X3TwoDto) { //下发任务 var svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.X3NoRefHistoryTask); if (svtItem == null) { DxHelper.MsgBoxHelper.ShowWarning($"未找到注册的处理服务"); return; } TaskHistoryTimeEditor frm = new TaskHistoryTimeEditor(tsk); if (frm.ShowDialog() != DialogResult.OK) return; var startTime = frm.start; var endTime = frm.end; var strs = tsk.HistoryFrequpMHz.Split(','); var freqs = strs.Select(f => ((long)(Convert.ToDouble(f) * 1e6))); X2D1HistoryTaskHandleDto dto = new X2D1HistoryTaskHandleDto() { MainSatCode = tsk.MainSat, AdjaSatCode = tsk.Adja1Sat.Value, ID = tsk.ID, StartTime = startTime, EndTime = endTime, TaskName = tsk.TaskName, TaskCheckType = tsk.DetectionWay.HasValue ? (EnumTaskCheckTypeDto)(int)tsk.DetectionWay.Value : EnumTaskCheckTypeDto.DAMA, CapDir = tsk.CapDir, DateDirFormat = tsk.CapDirFormat, CapLon = tx.Lon, CapLat = tx.Lat, FreqsHz = freqs.ToList() }; var res = await HttpHelper.PostRequestAsync(svtItem.BaseHttpAddr + "/api/HistoryTaskProcessing/Run", dto); if (res.code != 200) { Serilog.Log.Error(res.msg); DxHelper.MsgBoxHelper.ShowError($"{res.msg}"); return; } } else { DxHelper.MsgBoxHelper.ShowError($"暂不支持{tsk.PosType.GetEnumDisplayName()}类型的历史任务"); } } using (RHDWContext db = new RHDWContext()) { var settings = await db.SysSetings.FirstOrDefaultAsync(); if (settings == null) { DxHelper.MsgBoxHelper.ShowWarning($"请在系统设置中配置IP端口信息"); return; } var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID); item.TaskState = EnumTaskState.Running; await db.SaveChangesAsync(); tsk.TaskState = EnumTaskState.Running; Serilog.Log.Information($"用户启动了任务,ID={tsk.ID}"); } } catch (Exception ex) { Serilog.Log.Error(ex, "启动任务异常"); DxHelper.MsgBoxHelper.ShowError($"启动任务异常.{ex.Message}"); } } else { try { if (tsk.TaskType == EnumTaskType.History) { ModelSvr svtItem = null; if (tsk.PosType == EnumPosType.X2D1) svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.X2D1NoRefHistoryTask); else if (tsk.PosType == EnumPosType.X3TwoDto) svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.X3NoRefHistoryTask); if (svtItem == null) { DxHelper.MsgBoxHelper.ShowWarning($"未找到注册的处理服务"); return; } TaskStopHandleDto dto = new TaskStopHandleDto(); dto.ID = tsk.ID; var res = await HttpHelper.PostRequestAsync(svtItem.BaseHttpAddr + "/api/HistoryTaskProcessing/Stop", dto); if (res.code != 200) { Serilog.Log.Error(res.msg); DxHelper.MsgBoxHelper.ShowWarning(res.msg); } } using (RHDWContext db = new RHDWContext()) { var item = await db.TaskInfos.FirstOrDefaultAsync(p => p.ID == tsk.ID); item.TaskState = EnumTaskState.Stopped; await db.SaveChangesAsync(); } tsk.TaskState = EnumTaskState.Stopped; Serilog.Log.Warning($"用户停止了任务,ID={tsk.ID}"); } catch (Exception ex) { Serilog.Log.Error(ex, "停止任务异常"); DxHelper.MsgBoxHelper.ShowError($"停止任务异常.{ex.Message}"); } } gridView1.RefreshData(); 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天": layoutControlItemStartTime.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never; layoutControlItemEndTime.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 "自定义": layoutControlItemStartTime.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always; layoutControlItemEndTime.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(); string baseUrl = null; using (RHDWContext db = new RHDWContext()) { var res = await db.SysSetings.FirstOrDefaultAsync(); if (res != null) { baseUrl = $"http://{IpHelper.GetLocalIp()}:{res.HttpPort}/api/"; } } 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>(baseUrl + "Pos/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>(baseUrl + "Pos/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) { Serilog.Log.Error(ex, "定位结果查询异常"); MsgBoxHelper.ShowError("定位结果查询异常"); } return new List(); } #region 定位点右键事件函数 //删除定位点 public async Task DelPos(List items) { try { var groupItems = items.GroupBy(p => p.SigTime.ToString("yyyyMMdd")); foreach (var groupItem in groupItems) { var ids = groupItem.Select(m => m.ID).ToList(); using (RHDWPartContext db = RHDWPartContext.GetContext(groupItem.First().SigTime)) { if (db.DatabaseExist) { var array = await db.PosRes.Where(p => ids.Contains(p.ID)).ToArrayAsync(); db.PosRes.RemoveRange(array); await db.SaveChangesAsync(); } } } return true; } catch (Exception ex) { Serilog.Log.Error(ex, "表格中删除定位点异常!"); DxHelper.MsgBoxHelper.ShowError("删除定位点异常!"); 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; case EnumPosResType.X3: case EnumPosResType.X3NoRef: X3DTOParamEditor X3frm = new X3DTOParamEditor(item, mapControl1); DxHelper.PopupHelper.ShowPopup(X3frm, layoutControl1, 600); break; case EnumPosResType.X2Dfo: X2DTOParamEditor X2Dfofrm = new X2DTOParamEditor(item, mapControl1); DxHelper.PopupHelper.ShowPopup(X2Dfofrm, layoutControl1, 600); break; default: break; } } //绘制频差线 public async Task DrawDfoLine(ModelPosRes item) { switch (item.PosResType) { case EnumPosResType.X3TwoDfo: case EnumPosResType.X2Dfo: try { StationRes station=null; CgRes cg=null; using (RHDWPartContext db = RHDWPartContext.GetContext(item.SigTime)) { if (db.DatabaseExist) { cg = await db.CgRes.Where(m => m.ID == item.CgResID).FirstOrDefaultAsync(); station = await db.StationRes.Where(m => m.ID == item.StationResID).FirstOrDefaultAsync(); } } if (cg == null) { Serilog.Log.Error($"绘制三星频差线错误,未找到定位关联的参估计信息.PosID={item.ID},SigTime={item.SigTime}"); DxHelper.MsgBoxHelper.ShowError($"未找到定位关联的参估计信息"); return; } if (station == null) { Serilog.Log.Error($"绘制三星频差线错误,未找到定位关联的站点信息.PosID={item.ID},SigTime={item.SigTime}"); DxHelper.MsgBoxHelper.ShowError($"未找到定位关联的站点信息"); return; } if (station.SatTxLon == 0 || station.SatTxLat == 0) { Serilog.Log.Error($"绘制三星频差线错误,天线信息为空.PosID={item.ID},SigTime={item.SigTime}"); DxHelper.MsgBoxHelper.ShowError($"天线信息为空!"); return; } if (station.RefLon == 0 || station.RefLat == 0) { Serilog.Log.Error($"绘制三星频差线错误,参考站信息为空.PosID={item.ID},SigTime={item.SigTime}"); DxHelper.MsgBoxHelper.ShowError($"参考站信息为空!"); return; } DfoLineTwoStartOption twoStartOption = new DfoLineTwoStartOption(); twoStartOption.Freq = cg.TarFreqUp.HasValue ? cg.TarFreqUp.Value : 0; twoStartOption.RefFreq = cg.RefFreqUp.HasValue ? cg.RefFreqUp.Value : 0; twoStartOption.MsEph = new double[] { cg.MainX.Value, cg.MainY.Value, cg.MainZ.Value, cg.MainVx.Value, cg.MainVy.Value, cg.MainVz.Value }; twoStartOption.NsEph = new double[] { cg.Adja1X.Value, cg.Adja1Y.Value, cg.Adja1Z.Value, cg.Adja1Vx.Value, cg.Adja1Vy.Value, cg.Adja1Vz.Value }; twoStartOption.MsAnt = new double[] { station.SatTxLon, station.SatTxLat, 0 }; twoStartOption.NsAnt = new double[] { station.SatTxLon, station.SatTxLat, 0 }; twoStartOption.RefGeod = new double[] { station.RefLon.Value, station.RefLat.Value, 0 }; twoStartOption.TargetDfo = cg.Dfo1.Value; twoStartOption.Turn1 = Math.Abs(twoStartOption.Freq - (cg.TarFreqDown.HasValue ? cg.TarFreqDown.Value : 0)); twoStartOption.Turn2 = Math.Abs(twoStartOption.RefFreq - (cg.RefFreqDown.HasValue ? cg.RefFreqDown.Value : 0)); twoStartOption.RefDfo = cg.YbMainDfo.Value - cg.YbAdja1Dfo.Value; var tsDtoLine = DrawDfoLineHelper.DfoLineTwoStart(twoStartOption); List listSat = null; using (RHDWContext db = new RHDWContext()) { listSat = await db.SatInfos.ToListAsync(); } var msat = listSat?.FirstOrDefault(m => m.SatCode == cg.MainCode.Value)?.Sat; ; var ad1sat = listSat?.FirstOrDefault(m => m.SatCode == cg.Adja1Code.Value)?.Sat; if (msat == null) msat = cg.MainCode.ToString(); if (ad1sat == null) ad1sat = cg.Adja1Code.ToString(); mapControl1.DrawDtoPonit($"{item.PosResType.GetEnumDisplayName()}[{msat},{ad1sat}]频差线", tsDtoLine); if (item.PosResType == EnumPosResType.X3TwoDfo) { twoStartOption.NsEph = new double[] { cg.Adja2X.Value, cg.Adja2Y.Value, cg.Adja2Z.Value, cg.Adja2Vx.Value, cg.Adja2Vy.Value, cg.Adja2Vz.Value }; twoStartOption.TargetDfo = cg.Dfo2.Value; twoStartOption.RefDfo = cg.YbMainDfo.Value - cg.YbAdja2Dfo.Value; var tsDtoLine1 = DrawDfoLineHelper.DfoLineTwoStart(twoStartOption); string ad2sat = string.Empty; if (cg.Adja2Code.HasValue) { ad2sat = listSat.FirstOrDefault(m => m.SatCode == cg.Adja2Code.Value)?.Sat; } mapControl1.DrawDtoPonit($"{item.PosResType.GetEnumDisplayName()}[{msat},{ad2sat}]频差线", tsDtoLine1); } } catch (Exception ex) { Serilog.Log.Error(ex, $"绘制{item.PosResType.GetEnumDisplayName()}频差线失败.PosID={item.ID},SigTime={item.SigTime}"); DxHelper.MsgBoxHelper.ShowError($"绘制{item.PosResType.GetEnumDisplayName()}频差线失败"); } break; default: break; } } private async Task DrawCxLine(ModelPosRes item) { try { CxRes cx=null; StationRes station=null; using (RHDWPartContext db = RHDWPartContext.GetContext(item.SigTime)) { if (db.DatabaseExist) { cx = await db.CxRes.Where(m => m.ID == item.CxResID.Value).FirstOrDefaultAsync(); station = await db.StationRes.Where(m => m.ID == item.StationResID).FirstOrDefaultAsync(); } } if (cx == null) { Serilog.Log.Error($"绘制测向线错误,未找到定位关联的测向信息.PosID={item.ID},SigTime={item.SigTime}"); DxHelper.MsgBoxHelper.ShowError($"未找到定位关联的测向信息"); return; } if (station == null) { Serilog.Log.Error($"绘制测向线错误,未找到定位关联的站点信息.PosID={item.ID},SigTime={item.SigTime}"); DxHelper.MsgBoxHelper.ShowError($"未找到定位关联的站点信息!"); return; } if (station.CxLon == 0 || station.CxLat == 0) { Serilog.Log.Error($"绘制测向线错误,测向站信息为空.PosID={item.ID},SigTime={item.SigTime}"); DxHelper.MsgBoxHelper.ShowError($"测向站信息为空!"); return; } double deg = cx.Fx;//向北顺时针方向为夹角 //计算测向站到定位点之间的距离 var km = MapControlEx.CalcLineKm(station.CxLon.Value, station.CxLat.Value, item.PosLon, item.PosLat); var endpoint = MapControlEx.CalcSituation(station.CxLon.Value, station.CxLat.Value, deg, (km + 100) * 1000); List<(double, double)> points = new List<(double, double)>(); points.Add((station.CxLon.Value, station.CxLat.Value)); points.Add((endpoint.Item1, endpoint.Item2)); mapControl1.DrawCXLine($"测向线角度:{cx.Fx}°\t\n", points, true); } catch (Exception ex) { Serilog.Log.Error(ex, $"绘制测向线失败.PosID={item.ID},SigTime={item.SigTime}"); DxHelper.MsgBoxHelper.ShowWarning($"绘制测向线失败"); } } //绘制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, 500); break; case EnumPosResType.X2D1: case EnumPosResType.X2D1NoRef: X2D1GDOPParam x2D1GdopParam = new X2D1GDOPParam(item); x2D1GdopParam.mapControl1 = mapControl1; DxHelper.PopupHelper.ShowPopup(x2D1GdopParam, layoutControl1, 500); break; case EnumPosResType.X3: case EnumPosResType.X3NoRef: X3GDOPParam x3GdopParam = new X3GDOPParam(item); x3GdopParam.mapControl1 = mapControl1; DxHelper.PopupHelper.ShowPopup(x3GdopParam, layoutControl1, 500); break; case EnumPosResType.X3TwoDfo: X3DFGDOPParam x3DFGdopParam = new X3DFGDOPParam(item); x3DFGdopParam.mapControl1 = mapControl1; DxHelper.PopupHelper.ShowPopup(x3DFGdopParam, layoutControl1, 500); break; case EnumPosResType.X2Dfo: X2DFGDOPParam x2DFGdopParam = new X2DFGDOPParam(item); x2DFGdopParam.mapControl1 = mapControl1; DxHelper.PopupHelper.ShowPopup(x2DFGdopParam, layoutControl1, 500); break; default: break; } } catch (Exception ex) { Serilog.Log.Error(ex, $"绘制{item.PosResType.GetEnumDisplayName()}GDOP失败"); DxHelper.MsgBoxHelper.ShowWarning($"绘制{item.PosResType.GetEnumDisplayName()}GDOP失败!"); } } //查看参估结果 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, 500); 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, 500); break; case EnumPosResType.X3TwoDfo: X3DfoPosParamEditor X3df0frm = new X3DfoPosParamEditor(item); DxHelper.PopupHelper.ShowPopup(X3df0frm, layoutControl1, 500); break; case EnumPosResType.X2Dfo: X2PosParamEditor X2PosParamEditor = new X2PosParamEditor(item); DxHelper.PopupHelper.ShowPopup(X2PosParamEditor, layoutControl1, 600); break; default: break; } } public void RePosition(List items) { if (items.Count == 0) return; Task.Run(async () => { 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 mainxlInfo = await XlRepository.GetLatestAsync(item.CgRes.MainCode.Value, item.SigTime); if (mainxlInfo == null) { Serilog.Log.Error($"重新定位异常:卫星:{item.CgRes.MainCode.Value}未找到对应的星历信息,请导入星历"); continue; } var maineph = EphHelper.Calc(mainxlInfo.TwoLine, item.SigTime); 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 xlInfo1 = await XlRepository.GetLatestAsync(item.CgRes.Adja1Code.Value, item.SigTime); if (xlInfo1 == null) { Serilog.Log.Error($"重新定位异常:卫星:{item.CgRes.Adja1Code.Value}未找到对应的星历信息,请导入星历"); continue; } var eph1 = EphHelper.Calc(xlInfo1.TwoLine, item.SigTime); 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; res = item.PosResType == EnumPosResType.X2D1 ? PosApi.X2D1_Pos(CgRes, StationRes) : PosApi.X2D1_PosNoRef(CgRes, StationRes); item.PosLon = res[0]; item.PosLat = res[1]; item.MirrLon = res[3]; item.MirrLat = res[4]; break; case EnumPosResType.X3: case EnumPosResType.X3NoRef: break; case EnumPosResType.X3TwoDfo: break; case EnumPosResType.X2Dfo: break; default: break; } } var groupItems = items.GroupBy(p => p.SigTime.ToString("yyyyMMdd")); foreach (var groupItem in groupItems) { var ids = groupItem.Select(m => m.ID).ToList(); using (RHDWPartContext db = RHDWPartContext.GetContext(groupItem.First().SigTime)) { if (db.DatabaseExist) { var tarItems = await db.PosRes.Where(p => ids.Contains(p.ID)).ToArrayAsync(); tarItems.ForEach(t => { var repos = items.First(p => p.ID == t.ID); t.PosLon = repos.PosLon; t.PosLat = repos.PosLat; t.MirrLon = repos.MirrLon; t.MirrLat = repos.MirrLat; }); db.PosRes.AddOrUpdate(tarItems); await db.SaveChangesAsync(); } } } //var posids = items.Select(s => s.ID); //var ds = this.gridHomePosRes.DataSource as List; //ds.Where(w => posids.Contains(w.ID)).ForEach(t => //{ // var repos = items.First(i => i.ID == t.ID); // t.PosLon = repos.PosLon; // t.PosLat = repos.PosLat; // t.MirrLon = repos.MirrLon; // t.MirrLat = repos.MirrLat; //}); //gridView2.RefreshData(); Serilog.Log.Warning($"共重新定位了{items.Count()}个定位点的目标信息"); MsgBoxHelper.ShowInfo($"共重新定位了{items.Count()}个定位点的目标信息"); }); } //重新定位 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() { TarFrequpHz = (long?)txtFrequpMHz.EditValue, BeginTime = frm.start, EndTime = frm.end, TaskInfoID = tsk.ID, IncludeInvalidate = btnIncludeInvalidate.Checked }; string baseUrl = null; using (RHDWContext db = new RHDWContext()) { var setings = await db.SysSetings.FirstOrDefaultAsync(); if (setings != null) { baseUrl = $"http://{IpHelper.GetLocalIp()}:{setings.HttpPort}/api/"; } } try { var ct = new CancellationTokenSource(); var res = await HttpHelper.PostRequestAsync>(baseUrl + "Pos/GetPosCgResByTimeRangeObsolete", dto, token: ct.Token); if (res.code == 200) { RePosition(res.data); } else { MsgBoxHelper.ShowError(res.msg); } } catch (Exception ex) { Serilog.Log.Error(ex, "重新定位结果查询异常"); MsgBoxHelper.ShowError("重新定位结果查询异常"); } } #endregion #region 地图区域右键菜单 //编辑目标 private async Task EditTarget(List items) { try { if (items.Count == 0) return; long? targetID = 0; using (RHDWPartContext db = RHDWPartContext.GetContext(items.First().SigTime)) { if (db.DatabaseExist) { var idRes = items.First().ID; var target = await db.PosRes.Where(p => p.ID == idRes).FirstOrDefaultAsync() as PosRes; targetID = target.TargetInfoID; } } TargetInfo info = null; if (targetID > 0) { using (RHDWContext db = new RHDWContext()) { info = db.TargetInfos.FirstOrDefault(p => p.ID == targetID); } } EditorTar frm = new EditorTar(info); if (frm.ShowDialog() != DialogResult.OK) return; var tar = frm.info; var groupData = items.GroupBy(p => p.SigTime.ToString("yyyyMMdd")); List posResIdList = new List(); foreach (var groupItems in groupData) { var ids = groupItems.Select(p => p.ID); using (RHDWPartContext db = RHDWPartContext.GetContext(groupItems.First().SigTime)) { if (db.DatabaseExist) { var tarItems = await db.PosRes.Where(p => ids.Contains(p.ID)).ToArrayAsync(); tarItems.ForEach(t => { t.TargetInfoID = tar.ID; t.ColorKey = tar.TargeColor; }); posResIdList.AddRange(tarItems.Select(s => s.ID)); mapControl1.UpdatePosItem(tarItems); db.PosRes.AddOrUpdate(tarItems); await db.SaveChangesAsync(); } } } var ds = this.gridHomePosRes.DataSource as List; ds.Where(w => posResIdList.Contains(w.ID)).ForEach(p => { p.TargetInfoID = tar.ID; p.TargetInfo = tar; }); gridView2.RefreshData(); Serilog.Log.Warning($"共修改了{items.Count()}个定位点的目标信息"); MsgBoxHelper.ShowInfo($"共修改了{items.Count()}个定位点的目标信息"); } catch (Exception ex) { Serilog.Log.Error(ex, "编辑定位目标异常"); DxHelper.MsgBoxHelper.ShowError("编辑定位目标异常"); } } //转到列表 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) { Serilog.Log.Error(ex, "转到列表异常!"); MsgBoxHelper.ShowError("转到列表异常!"); } } //批量使用镜像点 private async Task UseMirr(List items) { if (items == null || items.Count() == 0) { DxHelper.MsgBoxHelper.ShowWarning($"请选择需要使用镜像点的定位数据信息!"); return; } try { if (!MsgBoxHelper.ShowConfirm($"确认使用镜像点?共{items.Count}条记录")) return; var groupItems = items.GroupBy(p => p.SigTime.ToString("yyyyMMdd")); foreach (var groupItem in groupItems) { var ids = groupItem.Select(m => m.ID).ToList(); using (RHDWPartContext db = RHDWPartContext.GetContext(groupItem.First().SigTime)) { if (db.DatabaseExist) { var array = await db.PosRes.Where(p => ids.Contains(p.ID)).ToArrayAsync(); UseMirror(array); await db.SaveChangesAsync(); } } } UseMirror(items); mapControl1.UpdatePosItem(items); gridView2.RefreshData(); Serilog.Log.Warning($"用户修改了{items.Count()}个定位点的镜像点"); MsgBoxHelper.ShowInfo($"共修改了{items.Count()}个定位点的镜像点"); } catch (Exception ex) { Serilog.Log.Error(ex, "使用镜像点失败!"); MsgBoxHelper.ShowError("使用镜像点失败!"); } } //批量删除 private async Task DeletePosRes(List items) { if (items == null || items.Count() == 0) { DxHelper.MsgBoxHelper.ShowWarning($"请选择需要删除的定位数据信息!"); return; } try { if (!MsgBoxHelper.ShowConfirm($"确认删除定位点?共{items.Count}条记录")) return; var groupItems = items.GroupBy(p => p.SigTime.ToString("yyyyMMdd")); foreach (var groupItem in groupItems) { var ids = groupItem.Select(m => m.ID).ToList(); using (RHDWPartContext db = RHDWPartContext.GetContext(groupItem.First().SigTime)) { if (db.DatabaseExist) { var list = await db.PosRes.Where(p => ids.Contains(p.ID)).ToListAsync(); db.PosRes.RemoveRange(list); await db.SaveChangesAsync(); } } } mapControl1.DelPosItem(items); var ds = this.gridHomePosRes.DataSource as List; ds.RemoveAll(m => items.Select(p => p.ID).Contains(m.ID)); gridView2.RefreshData(); Serilog.Log.Warning($"用户删除了{items.Count()}个定位点"); MsgBoxHelper.ShowInfo($"共删除了{items.Count()}个定位点"); } catch (Exception ex) { Serilog.Log.Error(ex, "删除定位点失败"); MsgBoxHelper.ShowError("删除定位点失败!"); } } 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 } }