duheng
2025-02-07 80ef0be2e44f42d6f7dc0f9c928de0dbe7362138
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/07-matching/00-core/AssetsMatchingHelper.cs
@@ -1,8 +1,6 @@
using HStation.WinFrmUI.PhartRelation;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Linq;
using System.Windows.Input;
using Yw.WinFrmUI.Q3d;
using DevExpress.CodeParser;
using System.Text.Json;
using Yw.Ahart;
namespace HStation.WinFrmUI
{
@@ -117,7 +115,7 @@
                    }
                }
                //喷头匹配
                //冷却塔匹配
                foreach (var item in assetsAutoMatchingView.Coolings)
                {
                    if (Matching(item, allCoolingMain))
@@ -237,9 +235,9 @@
            {
                // 尝试区间匹配
                var rangeMatch = AssetsPumpMainVmos.Where(item =>
                   (InputModel.RatedN.HasValue ? Math.Abs(InputModel.RatedN.Value - item.RatedSpeed) <= _speedTolerance : true) &&
                   (InputModel.RatedQ.HasValue ? Math.Abs(InputModel.RatedQ.Value - item.RatedFlow) <= _flowTolerance : true) &&
                   (InputModel.RatedH.HasValue ? Math.Abs(InputModel.RatedH.Value - item.RatedHead) <= _headTolerance : true) &&
                   (InputModel.RatedN > 0 ? Math.Abs(InputModel.RatedN - item.RatedSpeed) <= _speedTolerance : true) &&
                   (InputModel.RatedQ > 0 ? Math.Abs(InputModel.RatedQ - item.RatedFlow) <= _flowTolerance : true) &&
                   (InputModel.RatedH > 0 ? Math.Abs(InputModel.RatedH - item.RatedHead) <= _headTolerance : true) &&
                   (Math.Abs(InputModel.RatedP - item.RatedPower) <= _powerTolerance)).ToList();
                if (rangeMatch != null && rangeMatch.Count != 0)
                {
@@ -390,7 +388,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;//临时修改,之前为1
            foreach (var item in valveMainVmos)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -401,7 +399,6 @@
                    }
                }
            }
            var valve = dict.OrderBy(x => x.Value).LastOrDefault().Key;
            input.MatchingDbId = valve.ID.ToString();
            if (string.IsNullOrEmpty(input.ModelType))
@@ -420,10 +417,6 @@
            {
                input.MatchingMinorLoss = valve.MinorLoss;
            }
            if (input.ValveSetting == null)
            {
                input.MatchingValveSetting = valve.ValveSetting;
            }
            if (input.CurveDbId == null)
            {
                var list = Task.Run(async () =>
@@ -432,27 +425,43 @@
                {
                    var def = list.OrderByDescending(x => x.Importance).First();
                    input.MatchingCurveDbId = def.ID.ToString();
                    var curve = def.Diagram.GraphList[0].GetFeatPointList();
                    if (valve.ValveType == HStation.Assets.eValveType.GPV)
                    //var curve = def.Diagram.GraphList[0].GetFeatPointList();
                    //var curve1 = def.Diagram.GraphList[1].GetFeatPointList();
                    //input.MatchingCurveQL = new List<HydroCurvePointViewModel>();
                    /*   foreach (var item in curve)
                       {
                           input.MatchingCurveQL.Add(new HydroCurvePointViewModel(item.X, item.Y));
                       }*/
                    input.MatchingCurveOL = new List<HydroCurvePointViewModel>();
                    input.MatchingCurvesQL = new List<HydroFactorCurveViewModel>();
                    for (int i = 0; i < def.Diagram.GraphList.Count; i++)
                    {
                        input.MatchingCurveQL = new List<HydroCurvePointViewModel>();
                        foreach (var item in curve)
                        var curve = def.Diagram.GraphList[i].GetFeatPointList();
                        if (def.Diagram.GraphList[i].GraphType == 11)
                        {
                            input.MatchingCurveQL.Add(new HydroCurvePointViewModel(item.X, item.Y));
                            var opening = Yw.WinFrmUI.PhartGraphHelper.GetGraphParas<Yw.WinFrmUI.Phart.QLGraphParasViewModel>((Yw.Ahart.eCurveType)def.Diagram.GraphList[i].GraphType, def.Diagram.GraphList[i].GraphParas);
                            var model = new HydroFactorCurveViewModel();
                            model.CurveFactor = opening.Opening ?? 0;
                            model.CurveData = new List<HydroCurvePointViewModel>();
                            foreach (var item in curve)
                            {
                                model.CurveData.Add(new HydroCurvePointViewModel(item.X, item.Y));
                            }
                            input.MatchingCurvesQL.Add(model);
                        }
                    }
                    else if (valve.ValveType == HStation.Assets.eValveType.TCV)
                    {
                        input.MatchingCurveOL = new List<HydroCurvePointViewModel>();
                        foreach (var item in curve)
                        else if (def.Diagram.GraphList[i].GraphType == 12)
                        {
                            input.MatchingCurveOL.Add(new HydroCurvePointViewModel(item.X, item.Y));
                            foreach (var item in curve)
                            {
                                input.MatchingCurveOL.Add(new HydroCurvePointViewModel(item.X, item.Y));
                            }
                        }
                    }
                }
                return true;
            }
            return true;
            return false;
        }
        //管道匹配
@@ -539,7 +548,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in pipeLineMainVmos)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -557,17 +566,14 @@
            {
                input.MatchingModelType = pipe.Name;
            }
            if (input.Roughness == 0)
            {
                input.MatchingRoughness = pipe.Hazen;
            }
            if (string.IsNullOrEmpty(input.Material))
            {
                input.MatchingMaterial = pipe.Material;
            }
            if (input.MinorLoss < 0)
            {
                input.MatchingMinorLoss = pipe.MinorLoss;
                input.MatchingMinorLoss = pipe.Hazen;
            }
            return true;
@@ -625,14 +631,14 @@
            //口径
            int caliberWeight = 1;
            if (input.Caliber.HasValue)
            if (input.Caliber > 0)
            {
                foreach (var item in threelinkVmos)
                {
                    if (item.Caliber.HasValue)
                    {
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber.Value);
                        dict[item] += diff / input.Caliber.Value * 100 * caliberWeight;
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
                    }
                }
            }
@@ -657,7 +663,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in threelinkVmos)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -679,19 +685,16 @@
            {
                input.MatchingMaterial = threelink.Material;
            }
            if (!input.Caliber.HasValue || input.Caliber.Value <= 0)
            if (input.Caliber <= 0)
            {
                input.Caliber = threelink.Caliber;
                input.Caliber = threelink.Caliber ?? 0;
            }
            if (!input.MinorLoss.HasValue)
            {
                input.MatchingMinorLoss = threelink.MinorLoss;
            }
            if (!input.RunningThroughLoss.HasValue)
            if (input.RunningThroughLoss <= 0)
            {
                input.MatchingRunningThroughLoss = threelink.RunThroughMinorLoss;
            }
            if (!input.MatchingBranchThroughLoss.HasValue)
            if (input.MatchingBranchThroughLoss <= 0)
            {
                input.MatchingBranchThroughLoss = threelink.BranchThroughMinorLoss;
            }
@@ -751,14 +754,14 @@
            //口径
            int caliberWeight = 1;
            if (input.Caliber.HasValue)
            if (input.Caliber > 0)
            {
                foreach (var item in fourLinkVmos)
                {
                    if (item.Caliber.HasValue)
                    {
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber.Value);
                        dict[item] += diff / input.Caliber.Value * 100 * caliberWeight;
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
                    }
                }
            }
@@ -783,7 +786,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in fourLinkVmos)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -805,11 +808,11 @@
            {
                input.MatchingMaterial = fourlink.Material;
            }
            if (!input.Caliber.HasValue || input.Caliber.Value <= 0)
            if (input.Caliber <= 0)
            {
                input.Caliber = fourlink.Caliber;
                input.Caliber = fourlink.Caliber ?? 0;
            }
            if (!input.MinorLoss.HasValue)
            if (input.MinorLoss <= 0)
            {
                input.MatchingMinorLoss = fourlink.MinorLoss;
            }
@@ -869,14 +872,14 @@
            //口径
            int caliberWeight = 1;
            if (input.Caliber.HasValue)
            if (input.Caliber > 0)
            {
                foreach (var item in sprinklerVmos)
                {
                    if (item.Caliber.HasValue)
                    {
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber.Value);
                        dict[item] += diff / input.Caliber.Value * 100 * caliberWeight;
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
                    }
                }
            }
@@ -901,7 +904,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in sprinklerVmos)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -923,13 +926,13 @@
            {
                input.MatchingMaterial = sprinkler.Material;
            }
            if (!input.Caliber.HasValue || input.Caliber.Value <= 0)
            if (input.Caliber <= 0)
            {
                input.Caliber = sprinkler.Caliber;
                input.Caliber = sprinkler.Caliber ?? 0;
            }
            if (!input.MinorLoss.HasValue)
            if (input.MinorLoss <= 0)
            {
                input.MatchingMinorLoss = sprinkler.MinorLoss;
                input.MatchingMinorLoss = sprinkler.FlowMinorLoss;
            }
            return true;
@@ -1019,7 +1022,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in allExchangerList)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -1158,7 +1161,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in allCompressorList)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -1265,14 +1268,14 @@
            //口径
            int caliberWeight = 1;
            if (input.Caliber.HasValue)
            if (input.Caliber > 0)
            {
                foreach (var item in bluntheadVmos)
                {
                    if (item.Caliber.HasValue)
                    {
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber.Value);
                        dict[item] += diff / input.Caliber.Value * 100 * caliberWeight;
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
                    }
                }
            }
@@ -1297,7 +1300,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in bluntheadVmos)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -1319,9 +1322,9 @@
            {
                input.MatchingMaterial = blunthead.Material;
            }
            if (!input.Caliber.HasValue || input.Caliber.Value <= 0)
            if (input.Caliber <= 0)
            {
                input.Caliber = blunthead.Caliber;
                input.Caliber = blunthead.Caliber ?? 0;
            }
            if (input.MinorLoss < 0)
            {
@@ -1382,7 +1385,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in tankVmos)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -1488,7 +1491,7 @@
            }
            //标签
            int flagWeight = 10;
            int flagWeight = 1000;
            foreach (var item in allMeterList)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -1565,7 +1568,7 @@
            }
            //标签
            int flagWeight = 10;
            int flagWeight = 1000;
            foreach (var item in allFlowmeterList)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -1643,14 +1646,14 @@
            //口径
            int caliberWeight = 1;
            if (input.Caliber.HasValue)
            if (input.Caliber > 0)
            {
                foreach (var item in hydrantVmos)
                {
                    if (item.Caliber.HasValue)
                    {
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber.Value);
                        dict[item] += diff / input.Caliber.Value * 100 * caliberWeight;
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
                    }
                }
            }
@@ -1675,7 +1678,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in hydrantVmos)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -1697,9 +1700,9 @@
            {
                input.MatchingMaterial = hydrant.Material;
            }
            if (!input.Caliber.HasValue || input.Caliber.Value <= 0)
            if (input.Caliber <= 0)
            {
                input.Caliber = hydrant.Caliber;
                input.Caliber = hydrant.Caliber ?? 0;
            }
            if (input.MinorLoss < 0)
            {
@@ -1723,7 +1726,7 @@
            {
                return false;
            }
            allElbowList = allElbowList.Where(x => x.Angle == 90).ToList();
            //权重字典
            var dict = new Dictionary<AssetsElbowMainVmo, double>();
            foreach (var item in allElbowList)
@@ -1744,7 +1747,40 @@
                    }
                }
            }
            //口径
            int caliberWeight = 1;
            if (input.Caliber > 0)
            {
                foreach (var item in allElbowList)
                {
                    if (item.Caliber.HasValue)
                    {
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
                    }
                }
            }
            // 角度
            int angleWeight = 1000;
            if (input.BendingAngle > 0)
            {
                foreach (var item in allElbowList)
                {
                    if (item.Angle > 0)
                    {
                        var count = Math.Abs(item.Angle.Value - input.BendingAngle);
                        if (count != 0)
                        {
                            dict[item] += (1.0 / count) * angleWeight;
                        }
                        else
                        {
                            // 如果 count 为 0,表示完全匹配,给予最大权重
                            dict[item] += angleWeight * 100;
                        }
                    }
                }
            }
            // 关键字
            int keywordWeight = 1;
            foreach (var item in allElbowList)
@@ -1760,7 +1796,7 @@
            }
            //标签
            int flagWeight = 10;
            int flagWeight = 1000;
            foreach (var item in allElbowList)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -1786,13 +1822,18 @@
            {
                input.MatchingBendingAngle = elbow.Angle;
            }
            input.MatchingElbowType = (Yw.WinFrmUI.eElbowType)(int)elbow.ElbowType;
            if (elbow.ElbowType != null)
            {
                input.MatchingElbowType = (Yw.WinFrmUI.eElbowType)(int)elbow.ElbowType;
            }
            if (input.Material == null || input.Material == string.Empty)
            {
                input.MatchingMaterial = elbow.Material;
            }
            if (!input.Caliber.HasValue)
            if (input.Caliber <= 0)
            {
                input.MatchingCaliber = elbow.Caliber;
            }
            return true;
        }
@@ -1800,6 +1841,7 @@
        public static bool Matching(HydroPressmeterMatchingViewModel input, List<AssetsPressmeterMainVmo> pressmeterVmos)
        {
            //输入参数验证
            if (input == null)
            {
                return false;
@@ -1847,7 +1889,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in pressmeterVmos)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -1909,6 +1951,37 @@
                }
            }
            // 上游和下游直径
            int diameterWeight = 100;
            if (input.StartDiameter > 0 && input.EndDiameter > 0)
            {
                foreach (var item in translationVmos)
                {
                    if (item.StartDiameter > 0 && item.EndDiameter > 0)
                    {
                        var startCount = Math.Abs(item.StartDiameter - input.StartDiameter);
                        var endCount = Math.Abs(item.EndDiameter - input.EndDiameter);
                        if (startCount == 0 && endCount == 0)
                        {
                            // 如果 startCount 和 endCount 都为 0,表示完全匹配,给予最大权重
                            dict[item] += diameterWeight * 100;
                        }
                        else
                        {
                            // 否则,分别计算权重
                            if (startCount != 0)
                            {
                                dict[item] += (1.0 / startCount) * diameterWeight;
                            }
                            if (endCount != 0)
                            {
                                dict[item] += (1.0 / endCount) * diameterWeight;
                            }
                        }
                    }
                }
            }
            //材质
            int materialWeight = 5;
            if (!string.IsNullOrEmpty(input.Material))
@@ -1943,7 +2016,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in translationVmos)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -1965,11 +2038,11 @@
            {
                input.MatchingMaterial = translation.Material;
            }
            if (input.MinorLoss < 0)
            if (input.MinorLoss <= 0)
            {
                input.MatchingMinorLoss = translation.MinorLoss;
            }
            if (input.Roughness < 0)
            if (input.Roughness <= 0)
            {
                input.MatchingRoughness = translation.Roughness;
            }
@@ -1981,10 +2054,7 @@
            {
                input.MatchingStartDiameter = translation.StartDiameter;
            }
            if (input.Diameter < 0)
            {
                input.MatchingDiameter = translation.Diameter;
            }
            input.MatchingTranslationType = (Yw.WinFrmUI.eTranslationType)(int)translation.TranslationType;
            return true;
        }
@@ -2041,14 +2111,14 @@
            //口径
            int caliberWeight = 1;
            if (input.Caliber.HasValue)
            if (input.Caliber > 0)
            {
                foreach (var item in allCoolingList)
                {
                    if (item.Caliber.HasValue)
                    {
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber.Value);
                        dict[item] += diff / input.Caliber.Value * 100 * caliberWeight;
                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
                    }
                }
            }
@@ -2073,7 +2143,7 @@
            }
            //标签
            int flagWeight = 1;
            int flagWeight = 1000;
            foreach (var item in allCoolingList)
            {
                if (item.Flags != null && item.Flags.Count > 0)
@@ -2095,9 +2165,9 @@
            {
                input.MatchingMaterial = cooling.Material;
            }
            if (!input.Caliber.HasValue || input.Caliber.Value <= 0)
            if (input.Caliber <= 0)
            {
                input.Caliber = cooling.Caliber;
                input.Caliber = cooling.Caliber ?? 0;
            }
            if (input.Coefficient <= 1)
            {