tangxu
2024-12-19 9acdf3c826311bd67180821ce19c625d0e384ca8
Calc/IStation.Calc.Core/CalcPrj.cs
@@ -9,71 +9,65 @@
{
    public class CalcPrjHelper
    {
        bool isLimitLevel = false;
        bool isIgnoreOpenLimitAble = false;
        //bool isLimitLevel = false;
        private List<Model.ElecPriceMonthSetting> _elePriceMonthList = null;
        private List<IStation.CalcModel.PumpInfo> _allCalcPumpInfos;
        public CalcPrjHelper() { }
        public CalcPrjHelper()
        { }
        public string Calc(IStation.CalcModel.AnaRequest anaRequest, out AnaPrj defaultPrj)
        public string Calc(IStation.CalcModel.AnaRequest anaRequest, out AnaPrj optPrj)
        {
            if (!InitalPumpInfo())
            {
                defaultPrj = null;
                optPrj = null;
                return "数据初始化失败";
            }
            InitialElePrice();
            var calcHelper = GetCalcHelper(anaRequest);
            string error_info;
            var anaPrjs = calcHelper.CalcOptPrjs(out error_info);
            optPrj = calcHelper.CalcOptPrj(out error_info);
            if (!string.IsNullOrEmpty(error_info) || anaPrjs == null || anaPrjs.Count() == 0)
            if (!string.IsNullOrEmpty(error_info) || optPrj == null)
            {
                defaultPrj = null;
                optPrj = null;
                return error_info;
            }
            anaPrjs.Sort(new AnaPrj.Comparer(anaRequest.CalcOptType));
            //anaPrjs.Sort(new AnaPrj.Comparer(anaRequest.CalcOptType));
            //optPrj = anaPrjs.First();
            defaultPrj = anaPrjs.First();
            defaultPrj.Name = DateTime.Now.ToString();
            //
            double maxHeight = 0;
            DateTime maxHeightTime = optPrj.StartTime;
            if (optPrj.BlockTimes != null)
            {
                foreach (var bt in optPrj.BlockTimes)
                {
                    if (bt.OpenPumpIndexs == null)
                        continue;
                    if (bt.PointTimes != null)
                    {
                        foreach (var bt2 in bt.PointTimes)
                        {
                            if (maxHeight < bt2.WaterLevelH)
                            {
                                maxHeight = bt2.WaterLevelH;
                                //maxHeight = Math.Max(maxHeight, bt2.WaterLevelH);
                                maxHeightTime = bt2.Time;
                            }
                        }
                    }
                }
            }
            optPrj.MaxWaterLevelH = maxHeight;
            optPrj.MaxWaterLevelTime = maxHeightTime;
            return null;
        }
        public static  int[] GetOpenPumpIndexs(int pump_count)
        {//根据同扬程下 流量从大到小的泵 2->5->3->1->4
            if(pump_count == 0)
            {
                return null;
            }
            if (pump_count == 1)
            {
                return new int[] { 1 };
            }
            if (pump_count == 2)
            {
                return new int[] { 1,4 };
            }
            if (pump_count == 3)
            {
                return new int[] { 1, 4,2 };
            }
            if (pump_count == 4)
            {
                return new int[] { 1, 4, 2, 0 };
            }
            if (pump_count == 5)
            {
                return new int[] { 1, 4, 2, 0,3 };
            }
            return null;
        }
        /// <summary>
        /// 构建计算辅助类
@@ -81,26 +75,21 @@
        /// <param name="isIgnoreOpenLimitAble"></param>
        /// <returns></returns>
        private IStation.Calc.ErQuCalcBaseHelper GetCalcHelper(IStation.CalcModel.AnaRequest anaRequest)
        {
            IStation.Calc.ErQuCalcBaseHelper calcHelper = IStation.Calc.ErQuCalcBaseHelper.Build();
        {
            IStation.Calc.ErQuCalcBaseHelper calcHelper = IStation.Calc.ErQuCalcBaseHelper.Build(anaRequest);
            calcHelper.MinOpenPumpMinute = IStation.AnaGlobalParas.Setting.MinOpenTimeMinute;
            calcHelper.MinSwitchPumpMinute = IStation.AnaGlobalParas.Setting.MinSwitchTimeMinute;
            calcHelper.SetOptimalPumpIndexs(
                IStation.AnaGlobalParas.Setting.OptimalPumpIndexSequence,
                IStation.AnaGlobalParas.Setting.UnablePumpIndexArray);
            if (isLimitLevel)
            {
                calcHelper.CalcSpaceMinute = IStation.AnaGlobalParas.Setting.CalcSpaceMinuteL;
                calcHelper.MaxPumpSwitchCount = IStation.AnaGlobalParas.Setting.MaxPumpSwitchCountL;
            }
            else
            {
                calcHelper.CalcSpaceMinute = IStation.AnaGlobalParas.Setting.CalcSpaceMinuteQ;
                calcHelper.MaxPumpSwitchCount = IStation.AnaGlobalParas.Setting.MaxPumpSwitchCountQ;
            }
            calcHelper.CalcSpaceMinute = IStation.AnaGlobalParas.Setting.CalcSpaceMinute;
            calcHelper.MaxPumpSwitchCount = IStation.AnaGlobalParas.Setting.MaxPumpSwitchCount;
            DateTime rangeStartTime = anaRequest.StartTime;
            DateTime rangeEndTime = anaRequest.EndTime;
            calcHelper.SetPumpInfo(_allCalcPumpInfos);
            calcHelper.SetCalcTimeRange(rangeStartTime, rangeEndTime);
            calcHelper.StartOpenCount = anaRequest.StartOpenCount;// Convert.ToInt32(imageComboCurrentOpenCount.EditValue);
            calcHelper.SetCalcTimeRange(rangeStartTime, rangeEndTime, IStation.AnaGlobalParas.Setting.CalcSpaceMinute);
            calcHelper.ElecPrice = _elePriceMonthList;
@@ -110,9 +99,6 @@
                //if (tabPageDebug.PageVisible)
                //    this.listBoxDebug.Items.Add(info);
            };
            //不许切泵时间
            if (IStation.AnaGlobalParas.Setting.SwitchPumpIgnoreTimes != null && IStation.AnaGlobalParas.Setting.SwitchPumpIgnoreTimes.Count > 0)
@@ -140,7 +126,6 @@
    rangeStartTime.Day, st_h, t.StartMinute, 0);
                    }
                    bool isNext = ed_h > 23 ? true : false;
                    if (isNext)
                    {
@@ -161,127 +146,91 @@
                calcHelper.LimitSwitchPumpTimes = limit_times;
            }
            CalcLimitOpenPumpTime(ref calcHelper, anaRequest);
            //不许开泵时间
            if (isIgnoreOpenLimitAble == true && IStation.AnaGlobalParas.Setting.OpenPumpTimes != null &&
                IStation.AnaGlobalParas.Setting.OpenPumpTimes.Count > 0)
            {
                List<IStation.CalcModel.TimeRange> limit_times = new List<IStation.CalcModel.TimeRange>();
                var listUse = (from x in IStation.AnaGlobalParas.Setting.OpenPumpTimes where x.IsUse select x).ToList();
                if (listUse.Count == 1)
                {
                    if (listUse[0].StartHour > 0 || listUse[0].StartMinute > 0)
                    {
                        limit_times.Add(new IStation.CalcModel.TimeRange()
                        {
                            Start = rangeStartTime,
                            End = new DateTime(
                                rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
                                listUse[0].StartHour,
                                listUse[0].StartMinute,
                                0)
                        });
                    }
                    if (listUse[0].EndHour < 24)
                    {
                        limit_times.Add(new IStation.CalcModel.TimeRange()
                        {
                            Start = new DateTime(
                                rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
                                listUse.Last().EndHour,
                                listUse.Last().EndMinute,
                                0),
                            End = new DateTime(rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day, 23, 59, 59),
                        });
                    }
                }
                else if (listUse.Count() > 1)
                {
                    for (int i = 0; i < listUse.Count(); i++)
                    {
                        if (i == 0)
                        {
                            if (listUse[0].StartHour > 0 || listUse[0].StartMinute > 0)
                            {
                                limit_times.Add(new IStation.CalcModel.TimeRange()
                                {
                                    Start = rangeStartTime,
                                    End = new DateTime(
                                        rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
                                        listUse[0].StartHour,
                                        listUse[0].StartMinute,
                                        0)
                                });
                            }
                        }
                        else if (i == listUse.Count() - 1)
                        {
                            if (listUse.Last().EndHour < 24)
                            {
                                limit_times.Add(new IStation.CalcModel.TimeRange()
                                {
                                    Start = new DateTime(
                                        rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
                                        listUse.Last().EndHour,
                                        listUse.Last().EndHour,
                                        0),
                                    End = new DateTime(
                                        rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
                                        23,
                                        59,
                                        59)
                                });
                            }
                        }
                        else
                        {
                            limit_times.Add(new IStation.CalcModel.TimeRange()
                            {
                                Start = new DateTime(
        rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
        listUse[i - 1].EndHour,
        listUse[i - 1].EndHour,
        0),
                                End = new DateTime(
        rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
        listUse[i].StartHour,
        listUse[i].StartHour,
        0)
                            });
                        }
                    }
                }
                calcHelper.LimitOpenPumpTimes = limit_times;
                if (limit_times.Count > 0)
                {
                    if (limit_times[0].Start == rangeStartTime)
                    {
                        anaRequest.StartOpenCount = -1;//不考虑
                    }
                }
            }
            calcHelper.SetAnaRequest(anaRequest);
            return calcHelper;
        }
        //不许开泵时间
        private void CalcLimitOpenPumpTime(ref IStation.Calc.ErQuCalcBaseHelper calcHelper, IStation.CalcModel.AnaRequest anaRequest)
        {
            calcHelper.LimitOpenPumpTimes = null;
            if (IStation.AnaGlobalParas.Setting.OpenPumpTimes == null)
                return;
            if (IStation.AnaGlobalParas.Setting.OpenPumpTimes.Count == 0)
                return;
            var listUse = (from x in IStation.AnaGlobalParas.Setting.OpenPumpTimes where x.IsUse select x).ToList();
            if (listUse.Count == 0)
                return;
            //LogHelper.Info("Json转换" + JsonHelper.Object2Json(listUse));
            DateTime rangeStartTime = anaRequest.StartTime;
            DateTime rangeEndTime = anaRequest.EndTime;
            List<IStation.CalcModel.TimeRange> limit_times = new List<IStation.CalcModel.TimeRange>();
            IStation.CalcModel.TimeRange last_range = null;
            for (DateTime dt = rangeStartTime; dt <= rangeEndTime; dt = dt.AddMinutes(5))
            {
                var ttt = dt.Hour * 60 + dt.Minute;
                bool isOkOpen = false;
                foreach (var openTime in listUse)
                {
                    if (ttt >= openTime.StartHour * 60 + openTime.StartMinute && ttt <= openTime.EndHour * 60 + openTime.EndMinute)
                    {
                        isOkOpen = true;
                        break;
                    }
                }
                if (!isOkOpen)
                {//限制开泵
                    if (last_range == null)
                    {
                        last_range = new TimeRange();
                        last_range.Start = dt;
                    }
                }
                else
                {
                    if (last_range != null)
                    {
                        last_range.End = dt;
                        limit_times.Add(new IStation.CalcModel.TimeRange(last_range));
                        last_range = null;
                    }
                }
            }
            calcHelper.LimitOpenPumpTimes = limit_times;
            if (limit_times.Count > 0)
            {
                //LogHelper.Info("limit_times[0].Start时间:" + limit_times[0].Start.ToString());
                //LogHelper.Info("rangeStartTime时间:" + rangeStartTime.ToString());
                if (limit_times[0].Start == rangeStartTime)
                {
                    if (anaRequest.StartOpenPumpIndexArray != null)
                        anaRequest.StartOpenPumpIndexArray.Clear();
                    else
                        anaRequest.StartOpenPumpIndexArray = new List<int>();
                    anaRequest.IsKnownStartOpenPump = true;//不考虑 ???
                }
            }
        }
        #region 初始化
        /// <summary>
        ///
        ///
        /// </summary>
        private bool InitalPumpInfo()
        {
             var allCurveList = IStation.Common.PumpCurve.GetAll();
            var allCurveList = IStation.Common.PumpCurve.GetAll();
            if (allCurveList == null)
                return false;
            var allPumpMapList = IStation.Common.PumpCurveMapping.GetAll();
@@ -310,17 +259,16 @@
            }
            return true;
        }
        /// <summary>
        ///
        ///
        /// </summary>
        private void InitialElePrice()
        {
            var allPrices = IStation.Common.ElecPrice.GetAll();
            _elePriceMonthList = allPrices.First().Settings.MonthList;
        }
        #endregion
        #endregion 初始化
    }
}
}