using DevExpress.XtraEditors; using IStation.Untity; using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace IStation.WinFrmUI.Monitor { public partial class CurveAnalyzeMgrPage : DocumentPage { public CurveAnalyzeMgrPage() { InitializeComponent(); this.PageTitle.Caption = "曲线分析"; this.bandedGridView1.SetBandView(); this.bandedGridView1.FocusedRowChanged += bandedGridView1_FocusedRowChanged; this.bandedGridView1.RowCellClick += bandedGridView1_RowCellClick; this.bandedGridView1.DoubleClick += this.bandedGridView1_DoubleClick; this.gridView2.SetNormalView(); this.gridView2.OptionsView.ShowFooter = true; this.equipmentExTreeListCtrl1.FocusedChangedEvent += EquipmentExTreeListCtrl1_FocusedChangedEvent; this.monitorDataSourcesTreeList1.FocusedChangedEvent += MonitorDataSourcesListCtrl1_FocusedChangedEvent; } private class CurrentViewModel : Model.CurveAnalyze { public CurrentViewModel() { } public CurrentViewModel(Model.CurveAnalyze rhs) { Reset(rhs); } public new void Reset(Model.CurveAnalyze rhs) { base.Reset(rhs); if (this.Hzs != null) this.HzsStr = string.Join(",", rhs.Hzs); } public string HzsStr { get; set; } } private BLL.CurveAnalyze _bll = new BLL.CurveAnalyze(); private BLL.CurveAnalyzePacket _bllPacket = new BLL.CurveAnalyzePacket(); private BLL.CurveAnalyzePointPacket _bllPointPacket = new BLL.CurveAnalyzePointPacket(); private BLL.CurveAnalyzePoint _bllPoint = new BLL.CurveAnalyzePoint(); private Model.Equipment _equipment = null; private Model.MonitorDataSources _monitorDataSources = null; private List _allBindingList = null; /// /// 初始化数据 /// public override void InitialDataSource() { this.equipmentExTreeListCtrl1.SetBindingData(); this.monitorDataSourcesTreeList1.SetBindingData(); } //机组变换 private void EquipmentExTreeListCtrl1_FocusedChangedEvent(Model.Equipment obj) { this.bandedGridView1.FocusInvalidRow(); _equipment = obj; SetBindingData(_monitorDataSources, obj); } //来源变换 private void MonitorDataSourcesListCtrl1_FocusedChangedEvent(Model.MonitorDataSources obj) { this.bandedGridView1.FocusInvalidRow(); _monitorDataSources = obj; SetBindingData(obj, _equipment); } /// /// 绑定数据 /// public void SetBindingData(Model.MonitorDataSources monitorDataSources, Model.Equipment equipment) { WaitFrmHelper.ShowWaitForm(); var list = new List(); if (monitorDataSources != null && equipment != null) { var curveAnalyzes = _bll.GetByEquipmentID(monitorDataSources.ID, equipment.BelongID, equipment.ID); curveAnalyzes?.ForEach(x => list.Add(new CurrentViewModel(x))); } _allBindingList = list ?? new List(); this.gridControl1.DataSource = _allBindingList; this.gridControl1.RefreshDataSource(); this.bandedGridView1.BestFitColumns(); if (list == null) this.gridControl2.DataSource = null; WaitFrmHelper.HideWaitForm(); } //变换 private void bandedGridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { var curveAnalyze = this.bandedGridView1.GetFocusedRow() as Model.CurveAnalyze; LoadCurveAnalyzePackets(_monitorDataSources, _equipment, curveAnalyze); } //加载 private void LoadCurveAnalyzePackets(Model.MonitorDataSources monitorDataSources, Model.Equipment equipment, Model.CurveAnalyze curveAnalyze) { var list = new List(); if (monitorDataSources != null && equipment != null && curveAnalyze != null) { list = _bllPacket.GetByCurveAnalyzeID(_monitorDataSources.ID, curveAnalyze.ID); } this.gridControl2.DataSource = list; this.gridControl2.RefreshDataSource(); //this.gridView2.BestFitColumns(); } //添加 private void barBtnAdd_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { if (_allBindingList == null) return; var bol = new BLL.MonitorDataSetSummary().GetMaxMinTime(_monitorDataSources.ID, out DateTime minTime, out DateTime maxTime); if (!bol) { XtraMessageBox.Show("无监测数据!"); return; } WaitFrmHelper.ShowWaitForm(); var dlg = new AddCurveAnalyzeDlg(); dlg.Shown += delegate { WaitFrmHelper.HideWaitForm(); }; dlg.SetBindingData(minTime, maxTime); dlg.ReloadDataEvent += (rhs) => { rhs.StationID = _equipment.BelongID; rhs.EquipmentID = _equipment.ID; rhs.ID = _bll.Insert(_monitorDataSources.ID, rhs); if (rhs.ID > 0) { var vm = new CurrentViewModel(rhs); _allBindingList.Add(vm); this.gridControl1.RefreshDataSource(); return true; } return false; }; dlg.ShowDialog(); } //编辑 private void barBtnEdit_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var vm = this.bandedGridView1.GetCurrentViewModel(_allBindingList); if (vm == null) { XtraMessageBox.Show("请选择数据行!"); return; } WaitFrmHelper.ShowWaitForm(); var dlg = new EditCurveAnalyzeDlg(); dlg.Shown += delegate { WaitFrmHelper.HideWaitForm(); }; dlg.SetBindingData(vm); dlg.ReloadDataEvent += (rhs) => { var bol = _bll.Update(_monitorDataSources.ID, rhs); if (bol) { vm.Reset(rhs); this.bandedGridView1.RefreshRow(this.bandedGridView1.FocusedRowHandle); } return bol; }; dlg.ShowDialog(); } //删除 private void barBtnDelete_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var vm = this.bandedGridView1.GetCurrentViewModel(_allBindingList); if (vm == null) return; if (XtraMessageBox.Show($"确认删除数据行?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) != DialogResult.OK) return; var bol = _bll.DeleteByIDAndClear(_monitorDataSources.ID, vm.ID); if (!bol) { XtraMessageBox.Show($"删除失败!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } else { _allBindingList.Remove(vm); this.gridControl1.RefreshDataSource(); this.bandedGridView1.FocusInvalidRow(); } XtraMessageBox.Show($"删除成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } //详情 private void barBtnDetail_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { XtraMessageBox.Show("待补充"); } // 刷新数据 private void barBtnRefresh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { InitialDataSource(); } //单元格点击 private void bandedGridView1_RowCellClick(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs e) { if (_allBindingList == null) return; if (e.Column == this.colAnalyze) { var model = this.bandedGridView1.GetCurrentViewModel(_allBindingList); if (model == null) return; if (model.Status != Model.eAnalyzeStatus.Unanalyzed) if (XtraMessageBox.Show($"是否重新分析(重置全部数据)?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) != DialogResult.OK) return; WaitFrmHelper.ShowWaitForm(); _bllPointPacket.AnalysisContainsPacketAndSave(_monitorDataSources.ID, _equipment.ID, model.ID, out Model.eAnalyzeStatus analyzeStatus, out int count, model.TimeStep); model.Status = analyzeStatus; model.Count = count; XtraMessageBox.Show("分析完成!"); var bol = _bll.Update(_monitorDataSources.ID, model); if (!bol) { WaitFrmHelper.HideWaitForm(); XtraMessageBox.Show("状态更新失败!"); return; } this.gridControl1.RefreshDataSource(); LoadCurveAnalyzePackets(_monitorDataSources, _equipment, model); WaitFrmHelper.HideWaitForm(); } else if (e.Column == this.colDataView) { var model = this.bandedGridView1.GetCurrentViewModel(_allBindingList); if (model.Status != Model.eAnalyzeStatus.Analyzed) { XtraMessageBox.Show("未分析数据!"); return; } var station = new BLL.Station().GetByID(_equipment.BelongID); var caption = $"{station.Name}_{_equipment.Name}_{model.Name}-数据视图"; var page = new CurveAnalyzeViewMgrPage(); page.Initial(_monitorDataSources.ID, model.ID); page.PageTitle.Caption = caption; page.SurfaceGuid = new SurfaceGuid() { Modular = eModular.Monitor, Function = model.ID.ToString(), TagName = "数据视图", }; if (!this.IsExistPage(page.SurfaceGuid, true)) { this.CreatePage(page, page.SurfaceGuid); } } else if (e.Column == this.colCurveCalibration) { var model = this.bandedGridView1.GetCurrentViewModel(_allBindingList); if (model.Status != Model.eAnalyzeStatus.Analyzed) { XtraMessageBox.Show("未分析数据!"); return; } var station = new BLL.Station().GetByID(_equipment.BelongID); var caption = $"{station.Name}_{_equipment.Name}_{model.Name}-曲线校验"; var page = new CurveCalibrationPage(); page.Initial(_monitorDataSources.ID, model.ID, model); page.PageTitle.Caption = caption; page.SurfaceGuid = new SurfaceGuid() { Modular = eModular.Monitor, Function = model.ID.ToString(), TagName = "曲线校验", }; page.UpdatePacketEvent += () => { var newModel = _bll.GetByID(_monitorDataSources.ID, model.ID); model.Reset(newModel); //this.gridControl2.RefreshDataSource(); this.gridView2.RefreshRow(this.gridView2.FocusedRowHandle); }; if (!this.IsExistPage(page.SurfaceGuid, true)) { this.CreatePage(page, page.SurfaceGuid); } } else if (e.Column == this.colSaveCurve) { var model = this.bandedGridView1.GetCurrentViewModel(_allBindingList); if (model == null) return; if (model.Status != Model.eAnalyzeStatus.Analyzed) { XtraMessageBox.Show("未分析数据!"); return; } var pump = new BLL.Equipment().GetChildPumpByEnginePumpID(_equipment.ID); if (pump == null) { XtraMessageBox.Show("无泵信息!"); return; } var packets = _bllPacket.GetHaveCurveInfoByCurveAnalyzeID(_monitorDataSources.ID, model.ID); if (packets == null || !packets.Any()) { XtraMessageBox.Show("无曲线信息!"); return; } var pumpSpeedCurves = new List(); foreach (var packet in packets) { var curveInfo = new Model.FeatCurveExpressGroup(packet.CurveInfo); if (curveInfo == null) continue; var speedCurve = new Model.PumpSpeedCurve(); speedCurve.HZ = packet.Hz; speedCurve.SourceFrom = Model.eCurveSourceFrom.SCADA数据分析; speedCurve.CreateMethod = Model.eCurveCreateMethod.曲线表达式; speedCurve.CoordParas = Model.CurveCoordinateParas.CalcCoordinate(curveInfo); speedCurve.CurveInfo = curveInfo; speedCurve.ReliabilityStatus = Model.eReliabilityStatus.Normal; speedCurve.CreateTime = DateTime.Now; pumpSpeedCurves.Add(speedCurve); } if (pumpSpeedCurves == null || !pumpSpeedCurves.Any()) { XtraMessageBox.Show("无曲线信息!"); return; } var maxSpeedCurve = pumpSpeedCurves.OrderByDescending(x => x.HZ).First(); var curveInfo50 = Model.SimilarCalculateHelper.Calculate(maxSpeedCurve.CurveInfo, maxSpeedCurve.HZ, 50); var bllPumpCurve = new BLL.PumpCurve(); var bllPumpSpeedCurve = new BLL.PumpSpeedCurve(); var pumpCurveID = model.PumpCurveID ?? 0; var pumpCurve = new BLL.PumpCurve().GetExMappingByID(_equipment.ID, pumpCurveID); if (pumpCurve != null) { pumpCurve.CurveInfo = curveInfo50; var bol = bllPumpCurve.Update(pumpCurve); if (!bol) { XtraMessageBox.Show("更新PumpCurve失败!"); return; } bllPumpSpeedCurve.DeleteByPumpCurveID(pumpCurve.ID, out string msg); } else { pumpCurve = new Model.PumpCurveExMapping(); pumpCurve.CurveCode = $"分析线-{DateTime.Now.ToString("g")}"; pumpCurve.SourceFrom = Model.eCurveSourceFrom.SCADA数据分析; pumpCurve.CreateMethod = Model.eCurveCreateMethod.曲线表达式; pumpCurve.CoordParas = Model.CurveCoordinateParas.CalcCoordinate(curveInfo50); pumpCurve.CurveInfo = curveInfo50; pumpCurve.ReliabilityStatus = Model.PumpCurve.eReliabilityStatus.Normal; pumpCurve.CreateTime = DateTime.Now; pumpCurve.OtherName = pumpCurve.CurveCode; pumpCurve.ID = bllPumpCurve.Insert(pumpCurve); if (pumpCurve.ID < 1) { XtraMessageBox.Show("插入PumpCurve失败!"); return; } else { var pumpCurveMapping = new Model.PumpCurveMapping(); pumpCurveMapping.PumpID = pump.ID; pumpCurveMapping.CurveID = pumpCurve.ID; pumpCurveMapping.OtherName = pumpCurve.CurveCode; pumpCurveMapping.SortCode = 1; pumpCurveMapping.IsWorking = false; pumpCurveMapping.ID = new BLL.PumpCurveMapping().Insert(pumpCurveMapping); if (pumpCurveMapping.ID < 1) { bllPumpCurve.DeleteByID(pumpCurve.ID, out string msg); XtraMessageBox.Show("保存失败!"); return; } } } pumpSpeedCurves.ForEach(x => x.PumpCurveID = pumpCurve.ID); if (!bllPumpSpeedCurve.Inserts(pumpSpeedCurves)) { bllPumpCurve.DeleteByID(pumpCurve.ID, out string msg); XtraMessageBox.Show("插入PumpSpeedCurves失败!"); return; } model.PumpCurveID = pumpCurve.ID; if (!_bll.Update(_monitorDataSources.ID, model)) { bllPumpCurve.DeleteByID(pumpCurve.ID, out string msg); bllPumpSpeedCurve.DeleteByPumpCurveID(pumpCurve.ID, out msg); XtraMessageBox.Show("更新CurveAnalyze失败!"); return; } XtraMessageBox.Show("保存成功!"); this.gridView2.RefreshRow(this.bandedGridView1.FocusedRowHandle); } else if (e.Column == this.colCreateAnalyzePacket) { var model = this.bandedGridView1.GetCurrentViewModel(_allBindingList); if (model == null) return; if (model.Status == Model.eAnalyzeStatus.Unanalyzed) { XtraMessageBox.Show("请先分析数据!"); return; } if (_bllPacket.ExistByCurveAnalyzeID(_monitorDataSources.ID, model.ID)) if (XtraMessageBox.Show($"是否清空已有分析项并重新生成?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) != DialogResult.OK) return; WaitFrmHelper.ShowWaitForm(); _bllPointPacket.AnalyzePacketAndSave(_equipment.BelongID, _monitorDataSources.ID, _equipment.ID, model.ID, out int count, model.TimeStep); XtraMessageBox.Show("分析完成!"); LoadCurveAnalyzePackets(_monitorDataSources, _equipment, model); WaitFrmHelper.HideWaitForm(); } } //双击表格 private void bandedGridView1_DoubleClick(object sender, EventArgs e) { var mouse = e as MouseEventArgs; if (mouse == null) return; var hit = this.bandedGridView1.CalcHitInfo(mouse.Location); if (hit.InRowCell) { var vm = this.bandedGridView1.GetRow(hit.RowHandle) as CurrentViewModel; if (hit.Column == this.colHzs) { if (_bllPacket.ExistByCurveAnalyzeID(_monitorDataSources.ID, vm.ID)) { if (XtraMessageBox.Show($"修改频率组会清空已有分析项,是否修改?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) != DialogResult.OK) return; } var dlg = new SetHzsDlg(); dlg.SetBindingData(vm.Hzs); dlg.ReloadDataEvent += (rhs) => { vm.Hzs = rhs; vm.HzsStr = DoubleListHelper.ToString(rhs); var bol = _bll.Update(_monitorDataSources.ID, vm); if (bol) { this.bandedGridView1.RefreshRow(hit.RowHandle); } return bol; }; dlg.ShowDialog(); } } } //单元格点击 private void gridView2_RowCellClick(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs e) { if (e.Column == this.colAnalyzePacket) { var model = this.gridView2.GetFocusedRow() as Model.CurveAnalyzePacket; if (model == null) return; var curveAnalyze = this.bandedGridView1.GetFocusedRow() as CurrentViewModel; if (curveAnalyze.Status != Model.eAnalyzeStatus.Analyzed) { XtraMessageBox.Show($"无法操作!数据状态:{curveAnalyze.Status.GetDisplayText()}!"); return; } var station = new BLL.Station().GetByID(_equipment.BelongID); var caption = $"{station.Name}_{_equipment.Name}_{curveAnalyze.Name}_{model.Hz}-曲线分析"; var page = new CurveAnalyzePacketMgrPage(); page.Initial(_monitorDataSources.ID, model.CurveAnalyzeID, model.ID, model.CurveInfo); page.PageTitle.Caption = caption; page.SurfaceGuid = new SurfaceGuid() { Modular = eModular.Monitor, Function = model.ID.ToString(), }; page.UpdatePacketEvent += () => { var newModel = _bllPacket.GetByID(_monitorDataSources.ID, model.ID); model.Reset(newModel); this.gridView2.RefreshRow(this.gridView2.FocusedRowHandle); this.gridControl2.RefreshDataSource(); }; if (!this.IsExistPage(page.SurfaceGuid, true)) { this.CreatePage(page, page.SurfaceGuid); } } } //双击 private void gridView2_DoubleClick(object sender, EventArgs e) { var mouse = e as MouseEventArgs; if (mouse == null) return; var hit = this.gridView2.CalcHitInfo(mouse.Location); if (hit.InRowCell) { var vm = this.bandedGridView1.GetCurrentViewModel(_allBindingList); var model = this.gridView2.GetRow(hit.RowHandle) as Model.CurveAnalyzePacket; if (hit.Column == this.colHzUpperValue) { if (_bllPoint.Exists(_monitorDataSources.ID, model.CurveAnalyzeID, model.ID)) { if (XtraMessageBox.Show($"修改上限值会清空已有分析项,是否修改?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) != DialogResult.OK) return; } var dlg = new SetDoubleDlg(); dlg.SetBindingData(model.HzUpperValue); dlg.ReloadDataEvent += (value) => { if (model.HzUpperValue == value) return true; model.HzUpperValue = value; var bol = _bllPacket.Update(_monitorDataSources.ID, model); if (bol) { _bllPointPacket.AnalyzePacketAndSave(_monitorDataSources.ID, model.CurveAnalyzeID, model.ID); var newModel = _bllPacket.GetByID(_monitorDataSources.ID, model.ID); model.Reset(newModel); this.gridView2.RefreshRow(hit.RowHandle); } return bol; }; dlg.ShowDialog(); } if (hit.Column == this.colHzLowerValue) { if (_bllPoint.Exists(_monitorDataSources.ID, model.CurveAnalyzeID, model.ID)) { if (XtraMessageBox.Show($"修改下限值会清空已有分析项,是否修改?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) != DialogResult.OK) return; } var dlg = new SetDoubleDlg(); dlg.SetBindingData(model.HzLowerValue); dlg.ReloadDataEvent += (value) => { if (model.HzLowerValue == value) return true; model.HzLowerValue = value; var bol = _bllPacket.Update(_monitorDataSources.ID, model); if (bol) { _bllPointPacket.AnalyzePacketAndSave(_monitorDataSources.ID, model.CurveAnalyzeID, model.ID); var newModel = _bllPacket.GetByID(_monitorDataSources.ID, model.ID); model.Reset(newModel); this.gridView2.RefreshRow(hit.RowHandle); } return bol; }; dlg.ShowDialog(); } } } } }