duheng
2024-12-24 058adb7d84fa39cf4fc5ff1ab6ea337db6c21423
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/12-report/02-helper/SimulationWorkingReportCtrl.cs
@@ -1,5 +1,8 @@
using DevExpress.XtraEditors;
using DevExpress.XtraLayout;
using DevExpress.XtraLayout.Utils;
using DevExpress.XtraRichEdit.Model;
using NPOI.HPSF;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@@ -9,6 +12,7 @@
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Yw.Model;
using Yw.Vmo;
namespace HStation.WinFrmUI
@@ -21,50 +25,59 @@
            this.layoutControl1.SetupLayoutControl();
        }
        private SimulationProjectTitleCtrl _titleCtrl = null;
        private SimulationPumpSingleWorkingChartCtrl _workingChart = null;
        private HydroSingleWorkingLossCurveCtrl _lossCurve = null;
        private HydroSingleWorkingLossStatisticsCtrl _lossStatistics = null;
        private XhsProjectVmo _project = null;
        private Yw.Model.HydroModelInfo _hydroInfo = null;
        private List<HydroMonitorVmo> _allMonitorList = null;
        private HydroWorkingVmo _working = null;
        private HydroCalcuResult _calcuResult = null;
        private HydroVisualInfo _visual;
        /// <summary>
        /// 绑定数据
        /// </summary>
        public void SetBindingData
            (
                XhsProjectVmo project,
                Yw.Model.HydroModelInfo hydroInfo,
                List<HydroWorkingVmo> allWorkingList,
                List<HydroMonitorValueViewModel> allMonitorValueList
                List<HydroMonitorVmo> allMonitorList,
                HydroWorkingVmo working,
                HydroCalcuResult calcuResult,
                HydroVisualInfo visual
            )
        {
            if (hydroInfo == null)
            {
                return;
            }
            _project = project;
            _hydroInfo = hydroInfo;
            _allMonitorList = allMonitorList;
            _working = working;
            _calcuResult = calcuResult;
            _visual = visual;
            #region 项目信息
            #region 信息
            var projectGroup = this.layoutControl1.AddGroup();
            projectGroup.Text = "项目信息";
            projectGroup.ExpandButtonVisible = true;
            projectGroup.Expanded = false;
            projectGroup.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
            projectGroup.ExpandOnDoubleClick = true;
            _titleCtrl = new SimulationProjectTitleCtrl();
            _titleCtrl.SetBindingData(project);
            var basicItem = projectGroup.AddItem("项目信息", _titleCtrl);
            basicItem.TextVisible = false;
            basicItem.Height = 120;
            projectGroup.BestFit();
            projectGroup.LayoutMode = LayoutMode.Regular;
            projectGroup.AllowBorderColorBlending = true;
            projectGroup.AppearanceGroup.BorderColor = Color.FromArgb(0, 122, 204);
            //var basicGroup = this.layoutControl1.AddGroup();
            //basicGroup.Text = "工况信息";
            //basicGroup.ExpandButtonVisible = true;
            //basicGroup.Expanded = false;
            //basicGroup.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
            //basicGroup.ExpandOnDoubleClick = true;
            //var basicCtrl = new SetHydroWorkingBasicCtrl();
            //basicCtrl.SetBindingData(_hydroWorking);
            //var basicItem = basicGroup.AddItem("工况信息", basicCtrl);
            //basicItem.TextVisible = false;
            //basicItem.Height = 120;
            //basicGroup.BestFit();
            //basicGroup.LayoutMode = LayoutMode.Regular;
            //basicGroup.AllowBorderColorBlending = true;
            //basicGroup.AppearanceGroup.BorderColor = Color.FromArgb(0, 122, 204);
            //_basicCtrl = basicCtrl;
            #endregion
            #endregion 项目信息
            #region 能耗分析
            var energyGroup = this.layoutControl1.AddGroup();
            energyGroup.Text = "能耗分析";
@@ -73,111 +86,145 @@
            energyGroup.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
            energyGroup.ExpandOnDoubleClick = true;
            _workingChart = new SimulationPumpSingleWorkingChartCtrl();
            _workingChart.SetBindingData(working, hydroInfo, allMonitorList, calcuResult);
            var energyItem = energyGroup.AddItem("能耗分析", _workingChart);
            energyItem.TextVisible = false;
            energyItem.Height = 250;
            energyGroup.BestFit();
            energyGroup.LayoutMode = LayoutMode.Regular;
            energyGroup.AllowBorderColorBlending = true;
            energyGroup.AppearanceGroup.BorderColor = Color.FromArgb(0, 122, 204);
            //if (hydroInfo.Reservoirs != null && hydroInfo.Reservoirs.Count > 0)
            //{
            //    var group = this.layoutControl1.AddGroup();
            //    group.Text = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Reservoir);
            //    group.ExpandButtonVisible = true;
            //    group.Expanded = true;
            //    group.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
            //    group.ExpandOnDoubleClick = true;
            //    foreach (var visual in hydroInfo.Reservoirs)
            //    {
            //        var visualCtrl = new SetHydroWorkingReservoirCtrl();
            //        visualCtrl.HydroViewEvent += x => this.HydroViewEvent?.Invoke(x);
            //        var workingInfo = new HydroWorkingReservoirViewModel(visual);
            //        _working.WorkingInfo.AppendWorking(workingInfo);
            //        visualCtrl.SetBindingData(visual, workingInfo);
            //        var item = group.AddItem(visual.Name, visualCtrl);
            //        item.TextVisible = false;
            //        _visualCtrlList.Add(visualCtrl);
            //    }
            //    group.BestFit();
            //    group.LayoutMode = LayoutMode.Flow;
            //    group.AllowBorderColorBlending = true;
            //    group.AppearanceGroup.BorderColor = Color.FromArgb(0, 122, 204);
            //    foreach (LayoutControlItem item in group.Items)
            //    {
            //        item.Size = new Size(200, 80);
            //    }
            //}
            #endregion 能耗分析
            #endregion
            #region 损失曲线
            //#region 水池
            var lossCurveGroup = this.layoutControl1.AddGroup();
            lossCurveGroup.Text = "损失曲线";
            lossCurveGroup.ExpandButtonVisible = true;
            lossCurveGroup.Expanded = false;
            lossCurveGroup.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
            lossCurveGroup.ExpandOnDoubleClick = true;
            _lossCurve = new HydroSingleWorkingLossCurveCtrl();
            _lossCurve.SetBindingData(hydroInfo, calcuResult, visual);
            var lossCurveItem = lossCurveGroup.AddItem("损失曲线", _lossCurve);
            lossCurveItem.TextVisible = false;
            lossCurveItem.Height = 250;
            lossCurveGroup.BestFit();
            lossCurveGroup.LayoutMode = LayoutMode.Regular;
            lossCurveGroup.AllowBorderColorBlending = true;
            lossCurveGroup.AppearanceGroup.BorderColor = Color.FromArgb(0, 122, 204);
            //var tanks = hydroInfo.GetAllTanks();
            //if (tanks != null && tanks.Count > 0)
            //{
            //    var group = this.layoutControl1.AddGroup();
            //    group.Text = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Tank);
            //    group.ExpandButtonVisible = true;
            //    group.Expanded = true;
            //    group.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
            //    group.ExpandOnDoubleClick = true;
            //    foreach (var visual in tanks)
            //    {
            //        var visualCtrl = new SetHydroWorkingTankCtrl();
            //        visualCtrl.HydroViewEvent += x => this.HydroViewEvent?.Invoke(x);
            //        var workingInfo = new HydroWorkingTankViewModel(visual);
            //        _working.WorkingInfo.AppendWorking(workingInfo);
            //        visualCtrl.SetBindingData(visual, workingInfo);
            //        var item = group.AddItem(visual.Name, visualCtrl);
            //        item.TextVisible = false;
            //        _visualCtrlList.Add(visualCtrl);
            //    }
            //    group.BestFit();
            //    group.LayoutMode = LayoutMode.Flow;
            //    group.AllowBorderColorBlending = true;
            //    group.AppearanceGroup.BorderColor = Color.FromArgb(0, 122, 204);
            //    foreach (LayoutControlItem item in group.Items)
            //    {
            //        item.Size = new Size(200, 80);
            //    }
            //}
            #endregion 损失曲线
            //#endregion
            #region 损失统计
            //#region 水泵
            var lossStatisticsGroup = this.layoutControl1.AddGroup();
            lossStatisticsGroup.Text = "损失统计";
            lossStatisticsGroup.ExpandButtonVisible = true;
            lossStatisticsGroup.Expanded = false;
            lossStatisticsGroup.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
            lossStatisticsGroup.ExpandOnDoubleClick = true;
            _lossStatistics = new HydroSingleWorkingLossStatisticsCtrl();
            _lossStatistics.SetBindingData(hydroInfo, calcuResult);
            var lossStatisticsItem = lossStatisticsGroup.AddItem("损失统计", _lossStatistics);
            lossStatisticsItem.TextVisible = false;
            lossStatisticsItem.Height = 250;
            lossStatisticsGroup.BestFit();
            lossStatisticsGroup.LayoutMode = LayoutMode.Regular;
            lossStatisticsGroup.AllowBorderColorBlending = true;
            lossStatisticsGroup.AppearanceGroup.BorderColor = Color.FromArgb(0, 122, 204);
            //if (hydroInfo.Pumps != null && hydroInfo.Pumps.Count > 0)
            //{
            //    var group = this.layoutControl1.AddGroup();
            //    group.Text = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Pump);
            //    group.ExpandButtonVisible = true;
            //    group.Expanded = true;
            //    group.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
            //    group.ExpandOnDoubleClick = true;
            //    foreach (var visual in hydroInfo.Pumps)
            //    {
            //        var visualCtrl = new SetHydroWorkingPumpCtrl();
            //        visualCtrl.HydroViewEvent += x => this.HydroViewEvent?.Invoke(x);
            //        var workingInfo = new HydroWorkingPumpViewModel(visual);
            //        _working.WorkingInfo.AppendWorking(workingInfo);
            //        visualCtrl.SetBindingData(visual, workingInfo);
            //        var item = group.AddItem(visual.Name, visualCtrl);
            //        item.TextVisible = false;
            //        _visualCtrlList.Add(visualCtrl);
            //    }
            //    group.BestFit();
            //    group.LayoutMode = LayoutMode.Flow;
            //    group.AllowBorderColorBlending = true;
            //    group.AppearanceGroup.BorderColor = Color.FromArgb(0, 122, 204);
            //    foreach (LayoutControlItem item in group.Items)
            //    {
            //        item.Size = new Size(200, 100);
            //    }
            //}
            //#endregion
            #endregion 损失统计
        }
        private const string _tempFoler = "workingImageTemp";
        private const string _energyAnalyImageFileName = "energy_analy.png";
        private const string _lossCurveImageFileName = "loss_curve.png";
        private const string _energyInputImageFileName = "energy_input.png";
        private const string _energyLossImageFileName = "energy_loss.png";
        private const string _energyStatisticsImageFileName = "energy_statistics.png";
        //获取图片路径
        private string GetImageFilePath(string fileName)
        {
            var tempFolder = Path.Combine(Yw.Service.ConfigHelper.DataPath, HStation.Settings.XhsParasHelper.Xhs.DataFolder, _tempFoler);
            //如果存在临时文件夹,则删除临时文件夹及子目录与文件
            if (!Directory.Exists(tempFolder))
            {
                Directory.CreateDirectory(tempFolder);
            }
            //创建临时文件夹
            return Path.Combine(tempFolder, fileName);
        }
        /// <summary>
        /// 获取视图
        /// </summary>
        public async Task<HStation.ReportFile.SimulationWorkingReportViewModel> GetViewModel()
        {
            var vm = new HStation.ReportFile.SimulationWorkingReportViewModel();
            vm.ReportType = "模拟工况运行报告";
            vm.Info = new HStation.ReportFile.SimulationReportInfoItemViewModel()
            {
                Name = _project.Name,
                Description = _project.Description,
            };
            vm.Pumps = new List<HStation.ReportFile.SimulationReportPumpItemViewModel>();
            var pumps = _hydroInfo.Pumps;
            foreach (var pump in _hydroInfo.Pumps)
            {
                var pumpItem = new HStation.ReportFile.SimulationReportPumpItemViewModel();
                pumpItem.Name = pump.Name;
                pumpItem.ModelType = pumpItem.ModelType;
                pumpItem.SerialNO = (_hydroInfo.Pumps.IndexOf(pump) + 1).ToString();
                pumpItem.RatedQ = $"{pump.RatedQ ?? 0}m³/h";
                pumpItem.RatedH = $"{pump.RatedH ?? 0}m";
                pumpItem.RatedP = $"{pump.RatedP}kW";
                pumpItem.RatedN = $"{pump.RatedN ?? 0}r/min";
                vm.Pumps.Add(pumpItem);
                var pumpDb = await BLLFactory<HStation.BLL.AssetsPumpMain>.Instance.GetByIDEx(long.Parse(pump.DbId));
                if (pumpDb != null)
                {
                    if (pumpDb.PropContent != null && pumpDb.PropContent.Count > 0)
                    {
                        var ratedUProp = pumpDb.PropContent.Find(x => x.TagName == HStation.Assets.PumpDataType.RatedVoltage);
                        if (ratedUProp != null)
                        {
                            pumpItem.RatedU = ratedUProp.PropValue;
                        }
                        var ratedIProp = pumpDb.PropContent.Find(x => x.TagName == HStation.Assets.PumpDataType.RatedCurrent);
                        if (ratedIProp != null)
                        {
                            pumpItem.RatedI = ratedIProp.PropValue;
                        }
                        var ratedFProp = pumpDb.PropContent.Find(x => x.TagName == HStation.Assets.PumpDataType.RatedFactor);
                        if (ratedFProp != null)
                        {
                            pumpItem.RatedF = ratedFProp.PropValue;
                        }
                    }
                }
            }
            vm.Working = new HStation.ReportFile.SimulationReportWorkingItemViewModel();
            vm.Working.Name = _working.Name;
            if (string.IsNullOrEmpty(vm.Working.Name))
            {
                vm.Working.Name = "当前计算工况";
            }
            vm.Working.EnergyAnalyImagePath = GetImageFilePath(_energyAnalyImageFileName);
            _workingChart.ExportToImage(vm.Working.EnergyAnalyImagePath);
            vm.Working.LossCurveImagePath = GetImageFilePath(_lossCurveImageFileName);
            _lossCurve.ExportToImage(vm.Working.LossCurveImagePath);
            vm.Working.EnergyInputImagePath = GetImageFilePath(_energyInputImageFileName);
            _lossStatistics.ExportInputToImage(vm.Working.EnergyInputImagePath);
            vm.Working.EnergyLossImagePath = GetImageFilePath(_energyLossImageFileName);
            _lossStatistics.ExportLossToImage(vm.Working.EnergyLossImagePath);
            vm.Working.EnergyStatisticsImagePath = GetImageFilePath(_energyStatisticsImageFileName);
            _lossStatistics.ExportStatisticsToImage(vm.Working.EnergyStatisticsImagePath);
            return vm;
        }
    }
}
}