using DevExpress.Utils.Extensions; using DevExpress.Utils.Svg; using DevExpress.XtraCharts; using Yw.DAL.Basic; using Yw.Vmo; namespace HStation.WinFrmUI { public partial class SimulationFunctionCtrl : DevExpress.XtraEditors.XtraUserControl { public SimulationFunctionCtrl() { InitializeComponent(); this.layoutControl1.SetupLayoutControl(); } /// /// 显示项目站信息事件 /// public event Action ShowProjectSiteInfoEvent; /// /// 显示项目站模拟事件 /// public event Action, SvgImage> ShowProjectSiteSimulationEvent; /// /// 显示项目站工况事件 /// public event Action ShowProjectSiteWorkingEvent; /// /// 项目站工况选择改变事件 /// public event Action ProjectSiteWorkingCheckedEvent; /// /// 项目站工况增加事件 /// public event Action ProjectSiteWorkingAppendEvent; /// /// 项目站工况更新事件 /// public event Action ProjectSiteWorkingUpdateEvent; /// /// 项目站工况移除事件 /// public event Action ProjectSiteWorkingRemoveEvent; /// /// 创建项目站方案事件 /// public event Action CreateProjectSiteSchemeEvent; /// /// 项目站方案增加事件 /// public event Action ProjectSiteSchemeAppendEvent; /// /// 项目站方案更新事件 /// public event Action ProjectSiteSchemeUpdateEvent; /// /// 项目站方案移除事件 /// public event Action ProjectSiteSchemeRemoveEvent; private XhsProjectVmo _project = null;//项目 private XhsProjectSiteVmo _projectSite = null;//项目站 private Yw.Model.HydroModelInfo _hydroInfo = null;//模型信息 private Dictionary _allWorkingCheckedListDict = null;//所有工况选择列表字典 private Dictionary _allSchemeHydroInfoDict = null;//所有方案水力信息列表 private Dictionary> _allSchemeWorkingCheckedListDict = null;//所有方案工况选择列表字典 /// /// 绑定数据 /// public async Task SetBindingData(XhsProjectVmo project) { if (project == null) { return; } _project = project; var overlay = this.ShowOverlay(); _projectSite = await BLLFactory.Instance.GetDefaultByProjectID(_project.ID); var relation = await BLLFactory.Instance .GetDefaultByObjectTypeAndObjectIDOfPurpose(HStation.Xhs.DataType.XhsProjectSite, _projectSite.ID, HStation.Xhs.Purpose.Simulation); if (relation == null) { return; } var allWorkingList = await BLLFactory.Instance.GetByModelID(relation.ModelID); allWorkingList?.ForEach(x => { AppendWorking(null, x); }); var allSchemeList = await BLLFactory.Instance.GetBySiteID(_projectSite.ID); allSchemeList?.ForEach(async x => { AppendScheme(x); var schemeRelation = await BLLFactory.Instance .GetDefaultByObjectTypeAndObjectIDOfPurpose(HStation.Xhs.DataType.XhsScheme, x.ID, HStation.Xhs.Purpose.Simulation); if (schemeRelation != null) { var allSchemeWorkingList = await BLLFactory.Instance.GetByModelID(schemeRelation.ModelID); allSchemeWorkingList?.ForEach(y => { AppendWorking(x, y); }); } }); await ShowInfo(); overlay.Close(); } //项目站概况 private async void elementProjectSiteInfo_Click(object sender, EventArgs e) { await ShowInfo(); } //项目站水力模拟 private async void elementProjectSiteSimulation_Click(object sender, EventArgs e) { if (_project == null) { return; } if (_projectSite == null) { return; } var hydroInfo = await GetHydroInfo(null, true); if (hydroInfo == null) { return; } this.ShowProjectSiteSimulationEvent?.Invoke(_project, _projectSite, null, hydroInfo, _allWorkingCheckedListDict, this.svgImg32[1]); } //创建项目站方案 private async void accordionControl1_ContextButtonClick(object sender, DevExpress.Utils.ContextItemClickEventArgs e) { if (_project == null) { return; } if (_projectSite == null) { return; } var element = e.DataItem as DevExpress.XtraBars.Navigation.AccordionControlElement; if (element != this.elementProjectSiteSchemeList) { return; } var hydroInfo = await GetHydroInfo(null, true); if (hydroInfo == null) { return; } this.CreateProjectSiteSchemeEvent?.Invoke(_project, _projectSite, hydroInfo, this.svgImg32[3]); } private void accordionControl1_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { this.popupMenu1.ShowPopup(MousePosition); } } private void barBtnCollpseAll_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.accordionControl1.CollapseAll(); } private void barBtnExpandAll_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { this.accordionControl1.ExpandAll(); } #region 通用方法 /// /// 获取水力信息 /// UseCache 是否使用缓存 /// public async Task GetHydroInfo(XhsSchemeVmo scheme, bool useCache) { Yw.Model.HydroModelInfo hydroInfo = null; if (!useCache) { hydroInfo = await GetHydroInfo(scheme); if (hydroInfo == null) { return default; } } if (scheme == null) { if (hydroInfo == null) { if (_hydroInfo == null) { _hydroInfo = await GetHydroInfo(null); } return _hydroInfo; } _hydroInfo = hydroInfo; return _hydroInfo; } if (_allSchemeHydroInfoDict == null) { _allSchemeHydroInfoDict = new Dictionary(); } if (hydroInfo == null) { if (!_allSchemeHydroInfoDict.ContainsKey(scheme)) { hydroInfo = await GetHydroInfo(scheme); _allSchemeHydroInfoDict.Add(scheme, hydroInfo); return hydroInfo; } } if (_allSchemeHydroInfoDict.ContainsKey(scheme)) { _allSchemeHydroInfoDict[scheme] = hydroInfo; } else { _allSchemeHydroInfoDict.Add(scheme, hydroInfo); } return hydroInfo; } //获取水力信息 private async Task GetHydroInfo(XhsSchemeVmo scheme) { if (_project == null) { return default; } if (_projectSite == null) { return default; } HydroModelRelationVmo relation = null; if (scheme == null) { relation = await BLLFactory.Instance .GetDefaultByObjectTypeAndObjectIDOfPurpose(HStation.Xhs.DataType.XhsProjectSite, _projectSite.ID, HStation.Xhs.Purpose.Simulation); } else { relation = await BLLFactory.Instance .GetDefaultByObjectTypeAndObjectIDOfPurpose(HStation.Xhs.DataType.XhsScheme, scheme.ID, HStation.Xhs.Purpose.Simulation); } if (relation == null) { return default; } var hydroInfo = await BLLFactory.Instance.GetByID(relation.ModelID); return hydroInfo; } /// /// 添加方案 /// 触发项目站方案增加事件 /// public void AppendScheme(XhsSchemeVmo scheme) { if (_project == null) { return; } if (_projectSite == null) { return; } if (scheme == null) { return; } var elementScheme = new DevExpress.XtraBars.Navigation.AccordionControlElement(); elementScheme.Style = DevExpress.XtraBars.Navigation.ElementStyle.Item; elementScheme.Text = scheme.Name; elementScheme.Hint = scheme.Description; elementScheme.Tag = scheme; elementScheme.ImageOptions.ImageIndex = 3; elementScheme.Click += async (sender, e) => { var hydroInfo = await GetHydroInfo(scheme, true); if (hydroInfo == null) { return; } Dictionary dict = null; if (_allSchemeWorkingCheckedListDict != null) { if (_allSchemeWorkingCheckedListDict.ContainsKey(scheme)) { dict = _allSchemeWorkingCheckedListDict[scheme]; } } this.ShowProjectSiteSimulationEvent?.Invoke(_project, _projectSite, scheme, hydroInfo, dict, this.svgImg32[3]); }; this.elementProjectSiteSchemeList.Elements.Add(elementScheme); this.elementProjectSiteSchemeList.Style = DevExpress.XtraBars.Navigation.ElementStyle.Group; if (_allSchemeHydroInfoDict == null) { _allSchemeHydroInfoDict = new Dictionary(); } if (_allSchemeWorkingCheckedListDict == null) { _allSchemeWorkingCheckedListDict = new Dictionary>(); } if (!_allSchemeWorkingCheckedListDict.ContainsKey(scheme)) { _allSchemeWorkingCheckedListDict.Add(scheme, new Dictionary()); } this.ProjectSiteSchemeAppendEvent?.Invoke(_project, _projectSite, scheme); } /// /// 更新方案 /// 触发项目站方案更新事件 /// public void UpdateScheme(XhsSchemeVmo scheme) { if (_project == null) { return; } if (_projectSite == null) { return; } if (scheme == null) { return; } var elementScheme = this.elementProjectSiteSchemeList.Elements .FirstOrDefault(x => (x.Tag is XhsSchemeVmo) && (x.Tag as XhsSchemeVmo).ID == scheme.ID); if (elementScheme == null) { return; } elementScheme.Text = scheme.Name; elementScheme.Hint = scheme.Description; elementScheme.Tag = scheme; if (_allSchemeHydroInfoDict != null && _allSchemeHydroInfoDict.Count > 0) { var schemeKey = _allSchemeHydroInfoDict.Keys.FirstOrDefault(x => x.ID == scheme.ID); if (schemeKey != null) { var hydroInfoValue = _allSchemeHydroInfoDict[schemeKey]; _allSchemeHydroInfoDict.Remove(schemeKey); _allSchemeHydroInfoDict.Add(scheme, hydroInfoValue); } } if (_allSchemeWorkingCheckedListDict != null && _allSchemeWorkingCheckedListDict.Count > 0) { var schemeKey = _allSchemeWorkingCheckedListDict.Keys.FirstOrDefault(x => x.ID == scheme.ID); if (schemeKey != null) { var workingCheckedValue = _allSchemeWorkingCheckedListDict[schemeKey]; _allSchemeWorkingCheckedListDict.Remove(schemeKey); _allSchemeWorkingCheckedListDict.Add(scheme, workingCheckedValue); } } this.ProjectSiteSchemeUpdateEvent?.Invoke(_project, _projectSite, scheme); } /// /// 移除方案 /// public void RemoveScheme(XhsSchemeVmo scheme) { if (_project == null) { return; } if (_projectSite == null) { return; } if (scheme == null) { return; } var elementScheme = this.elementProjectSiteSchemeList.Elements .FirstOrDefault(x => (x.Tag is XhsSchemeVmo) && (x.Tag as XhsSchemeVmo).ID == scheme.ID); if (elementScheme == null) { return; } if (elementScheme.Elements != null && elementScheme.Elements.Count > 0) { var workingElementList = elementScheme.Elements.ToList(); foreach (var workingElement in workingElementList) { if (workingElement.HeaderControl != null) { this.accordionControl1.Controls.Remove(workingElement.HeaderControl); } elementScheme.Elements.Remove(workingElement); } } this.elementProjectSiteSchemeList.Elements.Remove(elementScheme); if (this.elementProjectSiteSchemeList.Elements.Count < 1) { this.elementProjectSiteSchemeList.Style = DevExpress.XtraBars.Navigation.ElementStyle.Item; } if (_allSchemeHydroInfoDict != null && _allSchemeHydroInfoDict.Count > 0) { var schemeKey = _allSchemeHydroInfoDict.Keys.FirstOrDefault(x => x.ID == scheme.ID); if (schemeKey != null) { _allSchemeHydroInfoDict.Remove(schemeKey); } } if (_allSchemeWorkingCheckedListDict != null && _allSchemeWorkingCheckedListDict.Count > 0) { var schemeKey = _allSchemeWorkingCheckedListDict.Keys.FirstOrDefault(x => x.ID == scheme.ID); if (schemeKey != null) { _allSchemeWorkingCheckedListDict.Remove(schemeKey); } } this.ProjectSiteSchemeRemoveEvent?.Invoke(_project, _projectSite, scheme); } /// /// 添加工况 /// 触发项目站工况增加事件 /// public void AppendWorking(XhsSchemeVmo scheme, Yw.Vmo.HydroWorkingVmo working) { if (_project == null) { return; } if (_projectSite == null) { return; } if (working == null) { return; } if (scheme == null) { var ckEdit = new CheckEdit(); ckEdit.Properties.AutoWidth = true; ckEdit.Properties.Caption = string.Empty; ckEdit.Checked = false; ckEdit.CheckedChanged += (sender, e) => { if (_allWorkingCheckedListDict != null) { if (_allWorkingCheckedListDict.ContainsKey(working)) { _allWorkingCheckedListDict[working] = ckEdit.Checked; } } this.ProjectSiteWorkingCheckedEvent?.Invoke(_project, _projectSite, null, working, ckEdit.Checked); }; this.accordionControl1.Controls.Add(ckEdit); var elementWorking = new DevExpress.XtraBars.Navigation.AccordionControlElement(); elementWorking.HeaderControl = ckEdit; elementWorking.Style = DevExpress.XtraBars.Navigation.ElementStyle.Item; elementWorking.Text = working.Name; elementWorking.Hint = working.Description; elementWorking.Tag = working; elementWorking.Click += async (sender, e) => { var hydroInfo = await GetHydroInfo(null, true); this.ShowProjectSiteWorkingEvent?.Invoke(_project, _projectSite, null, hydroInfo, working, this.svgImg32[4]); }; this.elementProjectSiteSimulation.Elements.Add(elementWorking); this.elementProjectSiteSimulation.Style = DevExpress.XtraBars.Navigation.ElementStyle.Group; if (_allWorkingCheckedListDict == null) { _allWorkingCheckedListDict = new Dictionary(); } if (!_allWorkingCheckedListDict.ContainsKey(working)) { _allWorkingCheckedListDict.Add(working, false); } } else { var elementScheme = this.elementProjectSiteSchemeList.Elements .FirstOrDefault(x => (x.Tag is XhsSchemeVmo) && (x.Tag as XhsSchemeVmo).ID == scheme.ID); if (elementScheme == null) { return; } var ckEdit = new CheckEdit(); ckEdit.Properties.AutoWidth = true; ckEdit.Properties.Caption = string.Empty; ckEdit.Checked = false; ckEdit.CheckedChanged += (sender, e) => { if (_allSchemeWorkingCheckedListDict != null) { if (_allSchemeWorkingCheckedListDict.ContainsKey(scheme)) { var workingCheckedDict = _allSchemeWorkingCheckedListDict[scheme]; if (workingCheckedDict.ContainsKey(working)) { workingCheckedDict[working] = ckEdit.Checked; } } } this.ProjectSiteWorkingCheckedEvent?.Invoke(_project, _projectSite, scheme, working, ckEdit.Checked); }; this.accordionControl1.Controls.Add(ckEdit); var elementWorking = new DevExpress.XtraBars.Navigation.AccordionControlElement(); elementWorking.HeaderControl = ckEdit; elementWorking.Style = DevExpress.XtraBars.Navigation.ElementStyle.Item; elementWorking.Text = working.Name; elementWorking.Hint = working.Description; elementWorking.Tag = working; elementWorking.Click += async (sender, e) => { var hydroInfo = await GetHydroInfo(scheme, true); this.ShowProjectSiteWorkingEvent?.Invoke(_project, _projectSite, scheme, hydroInfo, working, this.svgImg32[4]); }; elementScheme.Elements.Add(elementWorking); elementScheme.Style = DevExpress.XtraBars.Navigation.ElementStyle.Group; if (_allSchemeWorkingCheckedListDict == null) { _allSchemeWorkingCheckedListDict = new Dictionary>(); } if (_allSchemeWorkingCheckedListDict.ContainsKey(scheme)) { var workingCheckedDict = _allSchemeWorkingCheckedListDict[scheme]; if (workingCheckedDict != null) { if (!workingCheckedDict.ContainsKey(working)) { workingCheckedDict.Add(working, false); } } } } this.ProjectSiteWorkingAppendEvent?.Invoke(_project, _projectSite, scheme, working); } /// /// 更新工况 /// 更新,会触发更新事件 /// public void UpdateWorking(XhsSchemeVmo scheme, Yw.Vmo.HydroWorkingVmo working) { if (_project == null) { return; } if (_projectSite == null) { return; } if (working == null) { return; } if (scheme == null) { var element = this.elementProjectSiteSimulation.Elements. Where(x => (x.Tag is HydroWorkingVmo) && (x.Tag as HydroWorkingVmo).ID == working.ID).FirstOrDefault(); if (element == null) { return; } element.Tag = working; element.Text = working.Name; element.Hint = working.Description; if (_allWorkingCheckedListDict != null) { var key = _allWorkingCheckedListDict.Keys.FirstOrDefault(x => x.ID == working.ID); if (key != null) { var hasChecked = _allWorkingCheckedListDict[key]; _allWorkingCheckedListDict.Remove(key); _allWorkingCheckedListDict.Add(key, hasChecked); } } } else { var elementScheme = this.elementProjectSiteSchemeList.Elements .FirstOrDefault(x => (x.Tag is XhsSchemeVmo) && (x.Tag as XhsSchemeVmo).ID == scheme.ID); if (elementScheme == null) { return; } var element = elementScheme.Elements. Where(x => (x.Tag is HydroWorkingVmo) && (x.Tag as HydroWorkingVmo).ID == working.ID).FirstOrDefault(); if (element == null) { return; } element.Tag = working; element.Text = working.Name; element.Hint = working.Description; if (_allSchemeWorkingCheckedListDict != null) { var schemeKey = _allSchemeWorkingCheckedListDict.Keys.FirstOrDefault(x => x.ID == scheme.ID); if (schemeKey != null) { var workingCheckedDict = _allSchemeWorkingCheckedListDict[schemeKey]; if (workingCheckedDict != null) { var workingKey = workingCheckedDict.Keys.FirstOrDefault(x => x.ID == working.ID); if (workingKey != null) { var hasChecked = workingCheckedDict[workingKey]; workingCheckedDict.Remove(workingKey); workingCheckedDict.Add(working, hasChecked); } } } } } this.ProjectSiteWorkingUpdateEvent?.Invoke(_project, _projectSite, scheme, working); } /// /// 移除工况 /// 移除,会触发移除事件 /// public void RemoveWorking(XhsSchemeVmo scheme, Yw.Vmo.HydroWorkingVmo working) { if (_project == null) { return; } if (_projectSite == null) { return; } if (working == null) { return; } if (scheme == null) { var element = this.elementProjectSiteSimulation.Elements. Where(x => (x.Tag is HydroWorkingVmo) && (x.Tag as HydroWorkingVmo).ID == working.ID).FirstOrDefault(); if (element == null) { return; } if (element.HeaderControl != null) { this.accordionControl1.Controls.Remove(element.HeaderControl); } this.elementProjectSiteSimulation.Elements.Remove(element); if (this.elementProjectSiteSimulation.Elements.Count < 1) { this.elementProjectSiteSimulation.Style = DevExpress.XtraBars.Navigation.ElementStyle.Item; } if (_allWorkingCheckedListDict != null) { var key = _allWorkingCheckedListDict.Keys.FirstOrDefault(x => x.ID == working.ID); if (key != null) { _allWorkingCheckedListDict.Remove(key); } } } else { var elementScheme = this.elementProjectSiteSchemeList.Elements .FirstOrDefault(x => (x.Tag is XhsSchemeVmo) && (x.Tag as XhsSchemeVmo).ID == scheme.ID); if (elementScheme == null) { return; } var element = elementScheme.Elements. Where(x => (x.Tag is HydroWorkingVmo) && (x.Tag as HydroWorkingVmo).ID == working.ID).FirstOrDefault(); if (element == null) { return; } if (element.HeaderControl != null) { this.accordionControl1.Controls.Remove(element.HeaderControl); } elementScheme.Elements.Remove(element); if (elementScheme.Elements.Count < 1) { elementScheme.Style = DevExpress.XtraBars.Navigation.ElementStyle.Item; } if (_allSchemeWorkingCheckedListDict != null) { var schemeKey = _allSchemeWorkingCheckedListDict.Keys.FirstOrDefault(x => x.ID == scheme.ID); if (schemeKey != null) { var workingCheckedDict = _allSchemeWorkingCheckedListDict[schemeKey]; if (workingCheckedDict != null) { var workingKey = workingCheckedDict.Keys.FirstOrDefault(x => x.ID == working.ID); if (workingKey != null) { workingCheckedDict.Remove(workingKey); } } } } } this.ProjectSiteWorkingRemoveEvent?.Invoke(_project, _projectSite, scheme, working); } //显示信息 private async Task ShowInfo() { if (_project == null) { return; } if (_projectSite == null) { return; } var hydroInfo = await GetHydroInfo(null, true); if (hydroInfo == null) { return; } this.ShowProjectSiteInfoEvent?.Invoke(_project, _projectSite, hydroInfo, this.svgImg32[0]); } /// /// 保存 /// public async Task SaveModel(XhsSchemeVmo scheme, Yw.Model.HydroModelInfo hydroInfo) { if (hydroInfo == null) { return default; } var id = await BLLFactory.Instance.Save(hydroInfo); if (id < 1) { return default; } var db = await BLLFactory.Instance.GetByID(id); if (scheme == null) { _hydroInfo = db; return _hydroInfo; } if (_allSchemeHydroInfoDict == null || _allSchemeHydroInfoDict.Count < 1) { return default; } var schemeKey = _allSchemeHydroInfoDict.Keys.FirstOrDefault(x => x.ID == scheme.ID); if (schemeKey == null) { return default; } _allSchemeHydroInfoDict[schemeKey] = db; return db; } /// /// 刷新 /// public async Task RefreshModel(XhsSchemeVmo scheme) { return await GetHydroInfo(scheme, false); } #endregion } }