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
}
}