ningshuxia
2025-04-16 ed113213fc94c3d9886ea08dfddd09d08d9ba7d5
01-api/Service/IStation.Service/07-helper/01-analysis/AnalysisHelper.cs
@@ -11,7 +11,7 @@
        private readonly decimal _frequency_def = 50m;
        private readonly decimal _frequency_min = 25m;
        private readonly decimal _frequency_max = 50m;
        private readonly decimal _frequency_space = 0.2m;//频率间隔
        private readonly decimal _frequency_space = 0.1m;//频率间隔
        private readonly decimal _head_space = 0.1m;//扬程间隔
        private readonly DAL.SQLite.AnalysisPump _dal_analysis_pump = new();
@@ -154,6 +154,149 @@
        }
        /// <summary>
        /// 分析泵
        /// </summary>
        /// <param name="pumps"></param>
        /// <param name="analysis_factor_list"></param>
        /// <exception cref="Exception"></exception>
        public void AnalysisNew(List<Model.Pump> pumps, Dictionary<int, Dictionary<int, List<CurvePoint>>> flagHzCurveDict)
        {
            InsertLog("开始分析泵");
            if (pumps == null || pumps.Count < 1)
            {
                InsertLog("分析失败:没有泵数据!");
                return;
            }
            var ana_pump_list = new List<AnaPump>();
            foreach (var pump in pumps)
            {
                var ana_pump = new AnaPump(pump);
                if (!ana_pump.AllowCalc)
                {
                    throw new Exception("曲线数据异常!");
                }
                var hzCurveDict = flagHzCurveDict[pump.Flag];
                var ana_pump_fre_item_list = new List<AnaPumpFreItem>();
                if (!pump.IsBp)
                {
                    ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_def, _frequency_def, _frequency_space, pump, hzCurveDict);
                }
                else
                {
                    ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_min, _frequency_max, _frequency_space, pump, hzCurveDict);
                }
                ana_pump.AnaPumpFreItems = ana_pump_fre_item_list;
                ana_pump_list.Add(ana_pump);
            }
            if (!ana_pump_list.Any())
            {
                InsertLog($"分析进度:没有泵可分析");
                return;
            }
            for (int i = 0; i < ana_pump_list.Count; i++)
            {
                var pump = ana_pump_list[i];
                var ana_pump_fre_items = pump.AnaPumpFreItems;
                if (ana_pump_fre_items == null || !ana_pump_fre_items.Any())
                    continue;
                var run_flag = RunFlagHelper.Get(pump.Flag, pump.IsBp);
                InsertLog($"分析进度:第{i + 1}台泵");
                var list = new List<Entity.AnalysisPump>(pump.AnaPumpFreItems.Count);
                foreach (var freItem in ana_pump_fre_items)
                {
                    var analysis_pump = new Entity.AnalysisPump();
                    analysis_pump.ID = Yw.YitIdHelper.NextId();
                    analysis_pump.Flag = pump.Flag;
                    analysis_pump.Hz = freItem.Frequency;
                    analysis_pump.CurveQH = freItem.CurveQH.ToJson();
                    analysis_pump.CurveQP = freItem.CurveQP.ToJson();
                    freItem.CurveQH.GetMinMaxPointY(out double maxHead, out double minHead);
                    analysis_pump.MinFlow = Math.Round(freItem.CurveQH.Min, 4);
                    analysis_pump.MaxFlow = Math.Round(freItem.CurveQH.Max, 4);
                    analysis_pump.MaxHead = Math.Round(maxHead, 4);
                    analysis_pump.MinHead = Math.Round(minHead, 4);
                    list.Add(analysis_pump);
                }
                Inserts(i + 1, run_flag, list);
            }
            InsertLog($"分析进度:{pumps.Count}台泵,分析完毕!");
        }
        /// <summary>
        /// 获取分析泵变频项
        /// </summary>
        private static List<AnaPumpFreItem> GetAnaPumpFreItems(
             decimal fre_def,
             decimal fre_min,
             decimal fre_max,
             decimal fre_space,
            Model.Pump pump,
            Dictionary<int,List<CurvePoint>> hzCurveDict)
        {
            if (pump == null)
            {
                return default;
            }
            if (pump.CurveQH == null || pump.CurveQP == null)
            {
                return default;
            }
            var list = new List<AnaPumpFreItem>();
            for (int i = (int)fre_max; i >= fre_min; i--)
            {
                var hz = i;
                if (!hzCurveDict.ContainsKey(hz))
                {
                    continue;
                }
                var qhHzCurve = hzCurveDict[hz];
                if (pump.IsBp)
                {
                    for (decimal j = 0; j <= 0.9m; j += fre_space)
                    {
                        var fre = hz - j;
                        var qp = Curve.PumpCalculateHelper.CalculateSimilarQP(pump.CurveQP, (double)fre_def, (double)fre);
                        var qh = IStation.Curve.FitHelper.BuildCurveExpress(qhHzCurve);
                        //var qh2 = qh.GetFitPointsByXRange(pump.CurveQP.Min, pump.CurveQP.Max);
                        //var qh3 = IStation.Curve.FitHelper.BuildCurveExpress(qh2);
                        var freItem = new AnaPumpFreItem();
                        freItem.Frequency = (double)fre;
                        freItem.CurveQH = Curve.PumpCalculateHelper.CalculateSimilarQH(qh, (double)hz, (double)fre);
                        freItem.CurveQP = qp;
                        list.Add(freItem);
                    }
                }
                else
                {
                    var qh = IStation.Curve.FitHelper.BuildCurveExpress(qhHzCurve);
                    var qh2 = qh.GetFitPointsByXRange(pump.CurveQP.Min, pump.CurveQP.Max);
                    var qh3 = IStation.Curve.FitHelper.BuildCurveExpress(qh2);
                    var qp = pump.CurveQP;
                    var freItem = new AnaPumpFreItem();
                    freItem.Frequency = 50;
                    freItem.CurveQH = qh3;
                    freItem.CurveQP = qp;
                    list.Add(freItem);
                }
            }
            return list;
        }
        #endregion
        #region AnalysisParameter