using DevExpress.Utils.Extensions; using DevExpress.Utils.Svg; 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 ProjectSiteWorkingUpdateEvent; /// /// 项目站工况移除事件 /// public event Action ProjectSiteWorkingRemoveEvent; /// /// 创建项目站方案事件 /// public event Action CreateProjectSiteSchemeEvent; 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(); } #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()); } } /// /// 添加工况 /// 纯添加,不会触发事件 /// 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); } } } } } /// /// 更新工况 /// 更新,会触发更新事件 /// 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]); } #endregion //项目站概况 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]); } } }