From e3ca589482a056449963e7bbbd77824ded3928bc Mon Sep 17 00:00:00 2001
From: duheng <2784771470@qq.com>
Date: 星期五, 07 二月 2025 10:49:36 +0800
Subject: [PATCH] 过渡件匹配修改

---
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/07-matching/00-core/AssetsMatchingHelper.cs | 2083 +++++++++++++++++++++++++++++++----------------------------
 1 files changed, 1,098 insertions(+), 985 deletions(-)

diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/07-matching/00-core/AssetsMatchingHelper.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/07-matching/00-core/AssetsMatchingHelper.cs
index 7f5bb50..e720371 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/07-matching/00-core/AssetsMatchingHelper.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/07-matching/00-core/AssetsMatchingHelper.cs
@@ -1,8 +1,6 @@
-锘縰sing HStation.WinFrmUI.PhartRelation;
-using Swashbuckle.AspNetCore.SwaggerGen;
-using System.Linq;
-using System.Windows.Input;
-using Yw.WinFrmUI.Q3d;
+锘縰sing DevExpress.CodeParser;
+using System.Text.Json;
+using Yw.Ahart;
 
 namespace HStation.WinFrmUI
 {
@@ -14,7 +12,6 @@
         private const double _flowTolerance = 10;
         private const double _headTolerance = 5;
         private const double _powerTolerance = 0.05;
-
         private const double _valveLift = 10;//闃�闂ㄥ紑搴﹁寖鍥�
         private const int _angle = 1;//瑙掑害鑼冨洿
 
@@ -72,7 +69,7 @@
                 //涓夐�氬尮閰�
                 foreach (var item in assetsAutoMatchingView.Threelinks)
                 {
-                    if (MatchingThreelink(item, allThreeLink))
+                    if (Matching(item, allThreeLink))
                     {
                         IsMaching = true;
                     }
@@ -80,7 +77,7 @@
                 //鍥涢�氬尮閰�
                 foreach (var item in assetsAutoMatchingView.Fourlinks)
                 {
-                    if (MatchingFourlink(item, allFourLink))
+                    if (Matching(item, allFourLink))
                     {
                         IsMaching = true;
                     }
@@ -88,7 +85,7 @@
                 //绠¢亾鍖归厤
                 foreach (var item in assetsAutoMatchingView.Pipes)
                 {
-                    if (MatchingPipe(item, allPipeLine))
+                    if (Matching(item, allPipeLine))
                     {
                         IsMaching = true;
                     }
@@ -96,7 +93,7 @@
                 //闃�闂ㄥ尮閰�
                 foreach (var item in assetsAutoMatchingView.Valves)
                 {
-                    if (MatchingValve(item, allValve))
+                    if (Matching(item, allValve))
                     {
                         IsMaching = true;
                     }
@@ -104,7 +101,7 @@
                 //寮ご鍖归厤
                 foreach (var item in assetsAutoMatchingView.Elbows)
                 {
-                    if (MatchingElbow(item, allElbow))
+                    if (Matching(item, allElbow))
                     {
                         IsMaching = true;
                     }
@@ -112,13 +109,13 @@
                 //鍠峰ご鍖归厤
                 foreach (var item in assetsAutoMatchingView.Nozzles)
                 {
-                    if (MatchingSprinkler(item, allSprinkler))
+                    if (Matching(item, allSprinkler))
                     {
                         IsMaching = true;
                     }
                 }
 
-                //鍠峰ご鍖归厤
+                //鍐峰嵈濉斿尮閰�
                 foreach (var item in assetsAutoMatchingView.Coolings)
                 {
                     if (Matching(item, allCoolingMain))
@@ -129,7 +126,7 @@
                 //闂峰ご鍖归厤
                 foreach (var item in assetsAutoMatchingView.Bluntheads)
                 {
-                    if (MatchingBlunthead(item, allBluntheadMain))
+                    if (Matching(item, allBluntheadMain))
                     {
                         IsMaching = true;
                     }
@@ -153,7 +150,7 @@
                 //姘存睜鍖归厤
                 foreach (var item in assetsAutoMatchingView.Tanks)
                 {
-                    if (MatchingTank(item, allTankMain))
+                    if (Matching(item, allTankMain))
                     {
                         IsMaching = true;
                     }
@@ -177,7 +174,7 @@
                 //娑堢伀鏍撳尮閰�
                 foreach (var item in assetsAutoMatchingView.Hydrants)
                 {
-                    if (MatchingHydrant(item, allHydrantMain))
+                    if (Matching(item, allHydrantMain))
                     {
                         IsMaching = true;
                     }
@@ -185,7 +182,7 @@
                 //鍘嬪姏琛ㄥ尮閰�
                 foreach (var item in assetsAutoMatchingView.Pressmeters)
                 {
-                    if (MatchingPressmeter(item, allPressmeterMain))
+                    if (Matching(item, allPressmeterMain))
                     {
                         IsMaching = true;
                     }
@@ -193,7 +190,7 @@
                 //杩囨浮浠跺尮閰�
                 foreach (var item in assetsAutoMatchingView.Translations)
                 {
-                    if (MatchingTranslation(item, allTranslationMain))
+                    if (Matching(item, allTranslationMain))
                     {
                         IsMaching = true;
                     }
@@ -238,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)
                 {
@@ -301,164 +298,160 @@
                         InputModel.MatchingCurveQE.Add(new HydroCurvePointViewModel(item.X, item.Y));
                     }
                 }
+
                 return true;
             }
             return false;
         }
 
         //闃�闂ㄥ尮閰�
-        public static bool MatchingValve(HydroValveMatchingViewModel input, List<Vmo.AssetsValveMainVmo> valveMainVmos)
+        public static bool Matching(HydroValveMatchingViewModel input, List<AssetsValveMainVmo> valveMainVmos)
         {
-            bool isNotarize = false; //鏄惁纭畾
-            if (valveMainVmos == null)
+            //杈撳叆鍙傛暟楠岃瘉
+            if (input == null)
             {
-                return true;
+                return false;
             }
-            HStation.Vmo.AssetsValveMainVmo vmo = null;
-            //鍙e緞鏈�灏忓樊鍊�
-            // 缁濆鍖归厤
-            valveMainVmos = valveMainVmos.Where(x => (int)x.ValveType == (int)input.ValveType).ToList();
 
-            var nameMatching = valveMainVmos.Where(x =>
-        (x.KeyWords != null && x.KeyWords.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-        (x.KeyWords == null || !x.KeyWords.Any()) && GetIntersect(x.Name, input.ModelType) >= 1
-        ) //鍏堣繘琛岀瓫閫�,鍚庤繘琛屼粠澶у埌灏忔帓搴�
-       .OrderByDescending(x =>
-        (x.KeyWords != null && x.KeyWords.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-        (x.KeyWords == null || !x.KeyWords.Any()) && GetIntersect(x.Name, input.ModelType) >= 1)
-       .ToList();//浣跨敤鍨嬪彿鍚嶆垨鑰呭叧閿瓧鎵惧嚭鐩稿悓瀛楃鍦�1浠ヤ笂骞朵笖杩涜鎺掑簭
-
-            if (nameMatching.Count > 0)
+            //鏁版嵁婧愭病鏈夋暟鎹垯娌℃湁鍖归厤鎴愬姛
+            if (valveMainVmos == null || valveMainVmos.Count < 1)
             {
-                var absoluteMatching = nameMatching.Where(i =>
-              ((i.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - input.Diameter) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-               i.Material == input.Material  //鏉愭枡绾︽潫
-                 ).ToList();
-                if (absoluteMatching.Count > 1)
+                return false;
+            }
+
+            //鏉冮噸瀛楀吀
+            var dict = new Dictionary<AssetsValveMainVmo, double>();
+            foreach (var item in valveMainVmos)
+            {
+                dict.Add(item, 0);
+            }
+
+            //鍨嬪彿
+            int modelTypeWeight = 10;
+            if (!string.IsNullOrEmpty(input.ModelType))
+            {
+                foreach (var item in valveMainVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Name))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = valveMainVmos.First();
+                        var count = item.Name.ToLower().Intersect(input.ModelType.ToLower()).Count();
+                        dict[item] += count * modelTypeWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
-
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = valveMainVmos.First();
             }
-            else if (nameMatching.Count == 1)
-            {
-                isNotarize = true;
 
-                vmo = nameMatching.First();
-            }
-            else
+            //鏉愯川
+            int materialWeight = 5;
+            if (!string.IsNullOrEmpty(input.Material))
             {
-                var absoluteMatching = valveMainVmos.Where(i =>
-          ((i.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - input.Diameter) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-           i.Material == input.Material   //鏉愭枡绾︽潫
-             ).ToList();
-                if (absoluteMatching.Count > 1)
+                foreach (var item in valveMainVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Material))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = valveMainVmos.First();
+                        var count = item.Material.ToLower().Intersect(input.Material.ToLower()).Count();
+                        dict[item] += count * materialWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
-
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = valveMainVmos.First();
             }
-            if (vmo != null)
+
+            //鍙e緞
+            int caliberWeight = 1;
+            if (input.Diameter > 0)
             {
-                if (!isNotarize)
+                foreach (var item in valveMainVmos)
                 {
-                    if (input.CurveDbId == null)
+                    if (item.Caliber.HasValue)
                     {
-                        var list = Task.Run(async () => await new BLL.PhartDiagramRelation().GetExByObjectTypeAndObjectID(HStation.Assets.DataType.ValveMain, vmo.ID)).Result;
-                        if (list != null && list.Count > 0)
+                        var diff = Math.Abs(item.Caliber.Value - input.Diameter);
+                        dict[item] += diff / input.Diameter * 100 * caliberWeight;
+                    }
+                }
+            }
+
+            // 鍏抽敭瀛�
+            int keywordWeight = 1;
+            foreach (var item in valveMainVmos)
+            {
+                if (item.KeyWords != null && item.KeyWords.Count > 0)
+                {
+                    if (!string.IsNullOrEmpty(input.ModelType))
+                    {
+                        var count = item.KeyWords.Count(x => input.ModelType.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                    if (!string.IsNullOrEmpty(input.Material))
+                    {
+                        var count = item.KeyWords.Count(x => input.Material.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                }
+            }
+
+            //鏍囩
+            int flagWeight = 1000;//涓存椂淇敼,涔嬪墠涓�1
+            foreach (var item in valveMainVmos)
+            {
+                if (item.Flags != null && item.Flags.Count > 0)
+                {
+                    if (item.Flags.Contains(HStation.Assets.Flags.榛樿))
+                    {
+                        dict[item] += flagWeight;
+                    }
+                }
+            }
+            var valve = dict.OrderBy(x => x.Value).LastOrDefault().Key;
+            input.MatchingDbId = valve.ID.ToString();
+            if (string.IsNullOrEmpty(input.ModelType))
+            {
+                input.MatchingModelType = valve.Name;
+            }
+            if (string.IsNullOrEmpty(input.Material))
+            {
+                input.MatchingMaterial = valve.Material;
+            }
+            if (input.Diameter <= 0 && valve.Caliber.HasValue)
+            {
+                input.Diameter = valve.Caliber.Value;
+            }
+            if (input.MinorLoss < 0)
+            {
+                input.MatchingMinorLoss = valve.MinorLoss;
+            }
+            if (input.CurveDbId == null)
+            {
+                var list = Task.Run(async () =>
+                    await new BLL.PhartDiagramRelation().GetExByObjectTypeAndObjectID(HStation.Assets.DataType.ValveMain, valve.ID)).Result;
+                if (list != null && list.Count > 0)
+                {
+                    var def = list.OrderByDescending(x => x.Importance).First();
+                    input.MatchingCurveDbId = def.ID.ToString();
+                    //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++)
+                    {
+                        var curve = def.Diagram.GraphList[i].GetFeatPointList();
+                        if (def.Diagram.GraphList[i].GraphType == 11)
                         {
-                            var def = list.OrderByDescending(x => x.Importance).First();
-                            input.MatchingCurveDbId = def.ID.ToString();
-                            var curve = def.Diagram.GraphList[0].GetFeatPointList();
-                            if (vmo.ValveType == HStation.Assets.eValveType.GPV)
-                            {
-                                input.MatchingCurveQL = new List<HydroCurvePointViewModel>();
-                                foreach (var item in curve)
-                                {
-                                    input.MatchingCurveQL.Add(new HydroCurvePointViewModel(item.X, item.Y));
-                                }
-                            }
-                            else if (vmo.ValveType == HStation.Assets.eValveType.TCV)
-                            {
-                                input.MatchingCurveOL = new List<HydroCurvePointViewModel>();
-                                foreach (var item in curve)
-                                {
-                                    input.MatchingCurveOL.Add(new HydroCurvePointViewModel(item.X, item.Y));
-                                }
-                            }
-                        }
-                    }
-                    if (input.MinorLoss < 0)
-                    {
-                        input.MatchingMinorLoss = vmo.MinorLoss;
-                    }
-                    if (!input.MatchingDiameter.HasValue)
-                        input.MatchingDiameter = vmo.Caliber;
-                    if (input.ValveSetting == null)
-                        input.MatchingValveSetting = vmo.ValveSetting;
-                    if (input.DbId == null)
-                    {
-                        input.MatchingDbId = vmo.ID.ToString();
-                    }
-                }
-                else
-                {
-                    input.MatchingMinorLoss = vmo.MinorLoss;
-                    input.MatchingDbId = vmo.ID.ToString();
-                    input.MatchingDiameter = vmo.Caliber;
-                    input.MatchingMaterial = vmo.Material;
-                    input.MatchingModelType = vmo.Name;
-                    input.MatchingValveSetting = vmo.ValveSetting;
-                    input.MatchingValveType = (eValveType?)(int)vmo.ValveType;
-                    var list = Task.Run(async () => await new BLL.PhartDiagramRelation().GetExByObjectTypeAndObjectID(HStation.Assets.DataType.ValveMain, vmo.ID)).Result;
-                    if (list != null && list.Count > 0)
-                    {
-                        var def = list.OrderByDescending(x => x.Importance).First();
-                        input.MatchingCurveDbId = def.ID.ToString();
-                        var curve = def.Diagram.GraphList[0].GetFeatPointList();
-                        if (vmo.ValveType == HStation.Assets.eValveType.GPV)
-                        {
-                            input.MatchingCurveQL = new List<HydroCurvePointViewModel>();
+                            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)
                             {
-                                input.MatchingCurveQL.Add(new HydroCurvePointViewModel(item.X, item.Y));
+                                model.CurveData.Add(new HydroCurvePointViewModel(item.X, item.Y));
                             }
+                            input.MatchingCurvesQL.Add(model);
                         }
-                        else if (vmo.ValveType == HStation.Assets.eValveType.TCV)
+                        else if (def.Diagram.GraphList[i].GraphType == 12)
                         {
-                            input.MatchingCurveOL = new List<HydroCurvePointViewModel>();
                             foreach (var item in curve)
                             {
                                 input.MatchingCurveOL.Add(new HydroCurvePointViewModel(item.X, item.Y));
@@ -472,575 +465,477 @@
         }
 
         //绠¢亾鍖归厤
-        public static bool MatchingPipe(HydroPipeMatchingViewModel input, List<Vmo.AssetsPipeMainVmo> pipeLineMainVmos)
+        public static bool Matching(HydroPipeMatchingViewModel input, List<AssetsPipeMainVmo> pipeLineMainVmos)
         {
-            bool isNotarize = false; //鏄惁纭畾
-            if (pipeLineMainVmos == null)
+            //杈撳叆鍙傛暟楠岃瘉
+            if (input == null)
             {
-                return true;
+                return false;
             }
-            Vmo.AssetsPipeMainVmo vmo = null;
 
-            var nameMatching = pipeLineMainVmos.Where(x =>
-           (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-           (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1
-           ) //鍏堣繘琛岀瓫閫�,鍚庤繘琛屼粠澶у埌灏忔帓搴�
-          .OrderByDescending(x =>
-           (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-           (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1).ToList();
-
-            if (nameMatching.Count > 1)
+            //鏁版嵁婧愭病鏈夋暟鎹垯娌℃湁鍖归厤鎴愬姛
+            if (pipeLineMainVmos == null || pipeLineMainVmos.Count < 1)
             {
-                var absoluteMatching = nameMatching.Where(i =>
-              ((i.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - input.Diameter) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-               i.Material == input.Material  //鏉愭枡绾︽潫
-                 ).ToList();
-                if (absoluteMatching.Count > 1)
-                {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
-                    {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = pipeLineMainVmos.First();
-                    }
-                }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
-
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = pipeLineMainVmos.First();
+                return false;
             }
-            else if (nameMatching.Count == 1)
+
+            //鏉冮噸瀛楀吀
+            var dict = new Dictionary<AssetsPipeMainVmo, double>();
+            foreach (var item in pipeLineMainVmos)
             {
-                isNotarize = true;
-
-                vmo = nameMatching.First();
+                dict.Add(item, 0);
             }
-            else
+
+            //鍨嬪彿
+            int modelTypeWeight = 10;
+            if (!string.IsNullOrEmpty(input.ModelType))
             {
-                var absoluteMatching = pipeLineMainVmos.Where(i =>
-          ((i.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - input.Diameter) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-           i.Material == input.Material   //鏉愭枡绾︽潫
-             ).ToList();
-                if (absoluteMatching.Count > 1)
+                foreach (var item in pipeLineMainVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Name))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = pipeLineMainVmos.First();
+                        var count = item.Name.ToLower().Intersect(input.ModelType.ToLower()).Count();
+                        dict[item] += count * modelTypeWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = pipeLineMainVmos.First();
             }
-            if (vmo != null)
+
+            //鏉愯川
+            int materialWeight = 5;
+            if (!string.IsNullOrEmpty(input.Material))
             {
-                if (!isNotarize)
+                foreach (var item in pipeLineMainVmos)
                 {
-                    if (input.DbId == null)
-                        input.MatchingDbId = vmo.ID.ToString();
-                    if (input.Material == null)
-                        input.MatchingMaterial = vmo.Material;
-                    if (input.MinorLoss < 0)
-                        input.MatchingMinorLoss = vmo.MinorLoss;
-                    switch (input.eAlgorithmType)
+                    if (!string.IsNullOrEmpty(item.Material))
                     {
-                        case eAlgorithmType.Hazen:
-                            input.MatchingRoughness = vmo.Hazen;
-                            break;
-
-                        case eAlgorithmType.Manning:
-                            input.MatchingRoughness = vmo.Manning;
-                            break;
-
-                        case eAlgorithmType.Darcy:
-                            input.MatchingRoughness = vmo.Darcy;
-                            break;
-
-                        default:
-                            input.MatchingRoughness = vmo.Hazen;
-                            break;
+                        var count = item.Material.ToLower().Intersect(input.Material.ToLower()).Count();
+                        dict[item] += count * materialWeight;
                     }
                 }
-                else
-                {
-                    switch (input.eAlgorithmType)
-                    {
-                        case eAlgorithmType.Hazen:
-                            input.MatchingRoughness = vmo.Hazen;
-                            break;
-
-                        case eAlgorithmType.Manning:
-                            input.MatchingRoughness = vmo.Manning;
-                            break;
-
-                        case eAlgorithmType.Darcy:
-                            input.MatchingRoughness = vmo.Darcy;
-                            break;
-
-                        default:
-                            input.MatchingRoughness = vmo.Hazen;
-                            break;
-                    }
-                    input.MatchingDbId = vmo.ID.ToString();
-                    input.MatchingMaterial = vmo.Material;
-                    input.MatchingModelType = vmo.Name;
-                    input.MatchingMinorLoss = vmo.MinorLoss;
-                }
-                return true;
             }
-            return false;
-        }
 
-        //寮ご鍖归厤
-        public static bool MatchingElbow(HydroElbowMatchingViewModel input, List<Vmo.AssetsElbowMainVmo> elbowMainVmos)
-        {
-            bool isNotarize = false; //鏄惁纭畾
-            if (elbowMainVmos == null || input == null || elbowMainVmos.Count == 0)
+            //鍙e緞
+            int caliberWeight = 1;
+            if (input.Diameter > 0)
             {
-                return true;
+                foreach (var item in pipeLineMainVmos)
+                {
+                    if (item.Caliber.HasValue)
+                    {
+                        var diff = Math.Abs(item.Caliber.Value - input.Diameter);
+                        dict[item] += diff / input.Diameter * 100 * caliberWeight;
+                    }
+                }
             }
-            Vmo.AssetsElbowMainVmo vmo = null;
-            var nameMatching = elbowMainVmos.Where(x =>
-        (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-        (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1
-        ) //鍏堣繘琛岀瓫閫�,鍚庤繘琛屼粠澶у埌灏忔帓搴�
-       .OrderByDescending(x =>
-        (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-        (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1).ToList();
 
-            if (nameMatching.Count > 1)
+            // 鍏抽敭瀛�
+            int keywordWeight = 1;
+            foreach (var item in pipeLineMainVmos)
             {
-                var absoluteMatching = nameMatching.Where(i =>
-              ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-               i.Material == input.Material  //鏉愭枡绾︽潫
-                 ).ToList();
-                if (absoluteMatching.Count > 1)
+                if (item.KeyWords != null && item.KeyWords.Count > 0)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(input.ModelType))
                     {
-                        vmo = defaultList.First();
+                        var count = item.KeyWords.Count(x => input.ModelType.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
                     }
-                    else if (defaultList.Count <= 0)
+                    if (!string.IsNullOrEmpty(input.Material))
                     {
-                        vmo = elbowMainVmos.First();
+                        var count = item.KeyWords.Count(x => input.Material.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = elbowMainVmos.First();
             }
-            else if (nameMatching.Count == 1)
-            {
-                isNotarize = true;
-                vmo = nameMatching.First();
-            }
-            else
-            {
-                var absoluteMatching = elbowMainVmos.Where(i =>
-          ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-           i.Material == input.Material   //鏉愭枡绾︽潫
-             ).ToList();
-                if (absoluteMatching.Count > 1)
-                {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
-                    {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = elbowMainVmos.First();
-                    }
-                }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
 
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = elbowMainVmos.First();
-            }
-            if (vmo != null)
+            //鏍囩
+            int flagWeight = 1000;
+            foreach (var item in pipeLineMainVmos)
             {
-                if (!isNotarize)
+                if (item.Flags != null && item.Flags.Count > 0)
                 {
-                    if (!input.MinorLoss.HasValue)
+                    if (item.Flags.Contains(HStation.Assets.Flags.榛樿))
                     {
-                        input.MatchingMinorLoss = vmo.MinorLoss;
-                    }
-                    if (input.DbId == null)
-                    {
-                        input.MatchingDbId = vmo.ID.ToString();
-                    }
-                    if (input.Material == null)
-                    {
-                        input.MatchingMaterial = vmo.Material;
-                    }
-                    if (input.ModelType == null)
-                    {
-                        input.MatchingModelType = vmo.Material;
-                    }
-                    if (!input.ElbowType.HasValue)
-                    {
-                        input.MatchingElbowType = (eElbowType?)(int)vmo.ElbowType;
-                    }
-                    if (!input.BendingAngle.HasValue)
-                    {
-                        input.MatchingBendingAngle = vmo.Angle;
+                        dict[item] += flagWeight;
                     }
                 }
-                else
-                {
-                    input.MatchingMinorLoss = vmo.MinorLoss;
-                    input.MatchingDbId = vmo.ID.ToString();
-                    input.MatchingMaterial = vmo.Material;
-                    input.MatchingModelType = vmo.Name;
-                    input.MatchingElbowType = (eElbowType?)(int)vmo.ElbowType;
-                    input.MatchingBendingAngle = vmo.Angle;
-                }
-                return true;
             }
-            return false;
+
+            var pipe = dict.OrderBy(x => x.Value).LastOrDefault().Key;
+            input.MatchingDbId = pipe.ID.ToString();
+            if (string.IsNullOrEmpty(input.ModelType))
+            {
+                input.MatchingModelType = pipe.Name;
+            }
+
+            if (string.IsNullOrEmpty(input.Material))
+            {
+                input.MatchingMaterial = pipe.Material;
+            }
+            if (input.MinorLoss < 0)
+            {
+                input.MatchingMinorLoss = pipe.Hazen;
+            }
+
+            return true;
         }
 
         //涓夐�氬尮閰�
-        public static bool MatchingThreelink(HydroThreelinkMatchingViewModel input, List<Vmo.AssetsThreelinkMainVmo> threelinkVmos)
+        public static bool Matching(HydroThreelinkMatchingViewModel input, List<AssetsThreelinkMainVmo> threelinkVmos)
         {
-            bool isNotarize = false; //鏄惁纭畾
-            Vmo.AssetsThreelinkMainVmo vmo = null;
-            if (threelinkVmos == null || input == null || threelinkVmos.Count == 0)
+            //杈撳叆鍙傛暟楠岃瘉
+            if (input == null)
             {
-                return true;
+                return false;
             }
-            var nameMatching = threelinkVmos.Where(x =>
-        (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-        (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1
-        ) //鍏堣繘琛岀瓫閫�,鍚庤繘琛屼粠澶у埌灏忔帓搴�
-       .OrderByDescending(x =>
-        (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-        (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1).ToList();
 
-            if (nameMatching.Count > 1)
+            //鏁版嵁婧愭病鏈夋暟鎹垯娌℃湁鍖归厤鎴愬姛
+            if (threelinkVmos == null || threelinkVmos.Count < 1)
             {
-                var absoluteMatching = nameMatching.Where(i =>
-              ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-               i.Material == input.Material  //鏉愭枡绾︽潫
-                 ).ToList();
-                if (absoluteMatching.Count > 1)
+                return false;
+            }
+
+            //鏉冮噸瀛楀吀
+            var dict = new Dictionary<AssetsThreelinkMainVmo, double>();
+            foreach (var item in threelinkVmos)
+            {
+                dict.Add(item, 0);
+            }
+
+            //鍨嬪彿
+            int modelTypeWeight = 10;
+            if (!string.IsNullOrEmpty(input.ModelType))
+            {
+                foreach (var item in threelinkVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Name))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = threelinkVmos.First();
+                        var count = item.Name.ToLower().Intersect(input.ModelType.ToLower()).Count();
+                        dict[item] += count * modelTypeWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
-
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = threelinkVmos.First();
             }
-            else if (nameMatching.Count == 1)
-            {
-                isNotarize = true;
 
-                vmo = nameMatching.First();
-            }
-            else
+            //鏉愯川
+            int materialWeight = 5;
+            if (!string.IsNullOrEmpty(input.Material))
             {
-                var absoluteMatching = threelinkVmos.Where(i =>
-          ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-           i.Material == input.Material   //鏉愭枡绾︽潫
-             ).ToList();
-                if (absoluteMatching.Count > 1)
+                foreach (var item in threelinkVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Material))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = threelinkVmos.First();
+                        var count = item.Material.ToLower().Intersect(input.Material.ToLower()).Count();
+                        dict[item] += count * materialWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
+            }
 
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = threelinkVmos.First();
-            }
-            if (vmo != null)
+            //鍙e緞
+            int caliberWeight = 1;
+            if (input.Caliber > 0)
             {
-                if (!isNotarize)
+                foreach (var item in threelinkVmos)
                 {
-                    if (!input.MinorLoss.HasValue)
-                        input.MatchingMinorLoss = vmo.MinorLoss;
-                    if (input.DbId == null)
-                        input.MatchingDbId = vmo.ID.ToString();
-                    if (!input.RunningThroughLoss.HasValue)
-                        input.MatchingRunningThroughLoss = vmo.RunThroughMinorLoss;
-                    if (!input.MatchingBranchThroughLoss.HasValue)
-                        input.MatchingRunningThroughLoss = vmo.BranchThroughMinorLoss;
+                    if (item.Caliber.HasValue)
+                    {
+                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
+                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
+                    }
                 }
-                else
-                {
-                    input.MatchingMinorLoss = vmo.MinorLoss;
-                    input.MatchingDbId = vmo.ID.ToString();
-                    input.MatchingMaterial = vmo.Material;
-                    input.MatchingModelType = vmo.Name;
-                    input.MatchingRunningThroughLoss = vmo.RunThroughMinorLoss;
-                    input.MatchingBranchThroughLoss = vmo.BranchThroughMinorLoss;
-                }
-                return true;
             }
-            return false;
+
+            // 鍏抽敭瀛�
+            int keywordWeight = 1;
+            foreach (var item in threelinkVmos)
+            {
+                if (item.KeyWords != null && item.KeyWords.Count > 0)
+                {
+                    if (!string.IsNullOrEmpty(input.ModelType))
+                    {
+                        var count = item.KeyWords.Count(x => input.ModelType.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                    if (!string.IsNullOrEmpty(input.Material))
+                    {
+                        var count = item.KeyWords.Count(x => input.Material.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                }
+            }
+
+            //鏍囩
+            int flagWeight = 1000;
+            foreach (var item in threelinkVmos)
+            {
+                if (item.Flags != null && item.Flags.Count > 0)
+                {
+                    if (item.Flags.Contains(HStation.Assets.Flags.榛樿))
+                    {
+                        dict[item] += flagWeight;
+                    }
+                }
+            }
+
+            var threelink = dict.OrderBy(x => x.Value).LastOrDefault().Key;
+            input.MatchingDbId = threelink.ID.ToString();
+            if (string.IsNullOrEmpty(input.ModelType))
+            {
+                input.MatchingModelType = threelink.Name;
+            }
+            if (string.IsNullOrEmpty(input.Material))
+            {
+                input.MatchingMaterial = threelink.Material;
+            }
+            if (input.Caliber <= 0)
+            {
+                input.Caliber = threelink.Caliber ?? 0;
+            }
+
+            if (input.RunningThroughLoss <= 0)
+            {
+                input.MatchingRunningThroughLoss = threelink.RunThroughMinorLoss;
+            }
+            if (input.MatchingBranchThroughLoss <= 0)
+            {
+                input.MatchingBranchThroughLoss = threelink.BranchThroughMinorLoss;
+            }
+
+            return true;
         }
 
         //鍥涢�氬尮閰�
-        public static bool MatchingFourlink(HydroFourlinkMatchingViewModel input, List<Vmo.AssetsFourlinkMainVmo> fourLinkVmos)
+        public static bool Matching(HydroFourlinkMatchingViewModel input, List<AssetsFourlinkMainVmo> fourLinkVmos)
         {
-            bool isNotarize = false; //鏄惁纭畾
-            if (fourLinkVmos == null || input == null || fourLinkVmos.Count == 0)
+            //杈撳叆鍙傛暟楠岃瘉
+            if (input == null)
             {
-                return true;
+                return false;
             }
-            Vmo.AssetsFourlinkMainVmo vmo = null;
-            var nameMatching = fourLinkVmos.Where(x =>
-    (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-    (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1
-    ) //鍏堣繘琛岀瓫閫�,鍚庤繘琛屼粠澶у埌灏忔帓搴�
-    .OrderByDescending(x =>
-     (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-     (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1).ToList();
 
-            if (nameMatching.Count > 1)
+            //鏁版嵁婧愭病鏈夋暟鎹垯娌℃湁鍖归厤鎴愬姛
+            if (fourLinkVmos == null || fourLinkVmos.Count < 1)
             {
-                var absoluteMatching = nameMatching.Where(i =>
-              ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-               i.Material == input.Material  //鏉愭枡绾︽潫
-                 ).ToList();
-                if (absoluteMatching.Count > 1)
+                return false;
+            }
+
+            //鏉冮噸瀛楀吀
+            var dict = new Dictionary<AssetsFourlinkMainVmo, double>();
+            foreach (var item in fourLinkVmos)
+            {
+                dict.Add(item, 0);
+            }
+
+            //鍨嬪彿
+            int modelTypeWeight = 10;
+            if (!string.IsNullOrEmpty(input.ModelType))
+            {
+                foreach (var item in fourLinkVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Name))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = fourLinkVmos.First();
+                        var count = item.Name.ToLower().Intersect(input.ModelType.ToLower()).Count();
+                        dict[item] += count * modelTypeWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
-
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = fourLinkVmos.First();
             }
-            else if (nameMatching.Count == 1)
-            {
-                isNotarize = true;
 
-                vmo = nameMatching.First();
-            }
-            else
+            //鏉愯川
+            int materialWeight = 5;
+            if (!string.IsNullOrEmpty(input.Material))
             {
-                var absoluteMatching = fourLinkVmos.Where(i =>
-          ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-           i.Material == input.Material   //鏉愭枡绾︽潫
-             ).ToList();
-                if (absoluteMatching.Count > 1)
+                foreach (var item in fourLinkVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Material))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = fourLinkVmos.First();
+                        var count = item.Material.ToLower().Intersect(input.Material.ToLower()).Count();
+                        dict[item] += count * materialWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
+            }
 
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = fourLinkVmos.First();
-            }
-            if (vmo != null)
+            //鍙e緞
+            int caliberWeight = 1;
+            if (input.Caliber > 0)
             {
-                if (!isNotarize)
+                foreach (var item in fourLinkVmos)
                 {
-                    if (!input.MinorLoss.HasValue)
-                        input.MatchingMinorLoss = vmo.MinorLoss;
-                    if (input.DbId == null)
-                        input.MatchingDbId = vmo.ID.ToString();
-                    if (input.Material == null)
-                        input.MatchingMaterial = vmo.Material;
-                    if (input.ModelType == null)
-                        input.MatchingModelType = vmo.Name;
+                    if (item.Caliber.HasValue)
+                    {
+                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
+                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
+                    }
                 }
-                else
-                {
-                    input.MatchingMinorLoss = vmo.MinorLoss;
-                    input.MatchingDbId = vmo.ID.ToString();
-                    input.MatchingMaterial = vmo.Material;
-                    input.MatchingModelType = vmo.Name;
-                }
-                return true;
             }
-            return false;
+
+            // 鍏抽敭瀛�
+            int keywordWeight = 1;
+            foreach (var item in fourLinkVmos)
+            {
+                if (item.KeyWords != null && item.KeyWords.Count > 0)
+                {
+                    if (!string.IsNullOrEmpty(input.ModelType))
+                    {
+                        var count = item.KeyWords.Count(x => input.ModelType.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                    if (!string.IsNullOrEmpty(input.Material))
+                    {
+                        var count = item.KeyWords.Count(x => input.Material.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                }
+            }
+
+            //鏍囩
+            int flagWeight = 1000;
+            foreach (var item in fourLinkVmos)
+            {
+                if (item.Flags != null && item.Flags.Count > 0)
+                {
+                    if (item.Flags.Contains(HStation.Assets.Flags.榛樿))
+                    {
+                        dict[item] += flagWeight;
+                    }
+                }
+            }
+
+            var fourlink = dict.OrderBy(x => x.Value).LastOrDefault().Key;
+            input.MatchingDbId = fourlink.ID.ToString();
+            if (string.IsNullOrEmpty(input.ModelType))
+            {
+                input.MatchingModelType = fourlink.Name;
+            }
+            if (string.IsNullOrEmpty(input.Material))
+            {
+                input.MatchingMaterial = fourlink.Material;
+            }
+            if (input.Caliber <= 0)
+            {
+                input.Caliber = fourlink.Caliber ?? 0;
+            }
+            if (input.MinorLoss <= 0)
+            {
+                input.MatchingMinorLoss = fourlink.MinorLoss;
+            }
+
+            return true;
         }
 
         //鍠峰ご鍖归厤
-        public static bool MatchingSprinkler(HydroNozzleMatchingViewModel input, List<Vmo.AssetsSprinklerMainVmo> sprinklerVmos)
+        public static bool Matching(HydroNozzleMatchingViewModel input, List<AssetsSprinklerMainVmo> sprinklerVmos)
         {
-            bool isNotarize = false; //鏄惁纭畾
-            if (sprinklerVmos == null || input == null || sprinklerVmos.Count == 0)
+            //杈撳叆鍙傛暟楠岃瘉
+            if (input == null)
             {
-                return true;
+                return false;
             }
-            Vmo.AssetsSprinklerMainVmo vmo = null;
-            var nameMatching = sprinklerVmos.Where(x =>
-    (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-    (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1
-    ) //鍏堣繘琛岀瓫閫�,鍚庤繘琛屼粠澶у埌灏忔帓搴�
-    .OrderByDescending(x =>
-     (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-     (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1).ToList();
 
-            if (nameMatching.Count > 1)
+            //鏁版嵁婧愭病鏈夋暟鎹垯娌℃湁鍖归厤鎴愬姛
+            if (sprinklerVmos == null || sprinklerVmos.Count < 1)
             {
-                var absoluteMatching = nameMatching.Where(i =>
-              ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-               i.Material == input.Material  //鏉愭枡绾︽潫
-                 ).ToList();
-                if (absoluteMatching.Count > 1)
+                return false;
+            }
+
+            //鏉冮噸瀛楀吀
+            var dict = new Dictionary<AssetsSprinklerMainVmo, double>();
+            foreach (var item in sprinklerVmos)
+            {
+                dict.Add(item, 0);
+            }
+
+            //鍨嬪彿
+            int modelTypeWeight = 10;
+            if (!string.IsNullOrEmpty(input.ModelType))
+            {
+                foreach (var item in sprinklerVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Name))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = sprinklerVmos.First();
+                        var count = item.Name.ToLower().Intersect(input.ModelType.ToLower()).Count();
+                        dict[item] += count * modelTypeWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
-
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = sprinklerVmos.First();
             }
-            else if (nameMatching.Count == 1)
-            {
-                isNotarize = true;
 
-                vmo = nameMatching.First();
-            }
-            else
+            //鏉愯川
+            int materialWeight = 5;
+            if (!string.IsNullOrEmpty(input.Material))
             {
-                var absoluteMatching = sprinklerVmos.Where(i =>
-          ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-           i.Material == input.Material   //鏉愭枡绾︽潫
-             ).ToList();
-                if (absoluteMatching.Count > 1)
+                foreach (var item in sprinklerVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Material))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = sprinklerVmos.First();
+                        var count = item.Material.ToLower().Intersect(input.Material.ToLower()).Count();
+                        dict[item] += count * materialWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
+            }
 
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = sprinklerVmos.First();
-            }
-            if (vmo != null)
+            //鍙e緞
+            int caliberWeight = 1;
+            if (input.Caliber > 0)
             {
-                if (!isNotarize)
+                foreach (var item in sprinklerVmos)
                 {
-                    if (!input.MinorLoss.HasValue)
-                        input.MatchingMinorLoss = vmo.MinorLoss;
-                    if (input.DbId == null)
-                        input.MatchingDbId = vmo.ID.ToString();
-                    if (input.Material == null)
-                        input.MatchingMaterial = vmo.Material;
-                    if (input.ModelType == null)
-                        input.MatchingModelType = vmo.Name;
+                    if (item.Caliber.HasValue)
+                    {
+                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
+                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
+                    }
                 }
-                else
-                {
-                    input.MatchingMinorLoss = vmo.MinorLoss;
-                    input.MatchingDbId = vmo.ID.ToString();
-                    input.MatchingMaterial = vmo.Material;
-                    input.MatchingModelType = vmo.Name;
-                }
-                return true;
             }
-            return false;
+
+            // 鍏抽敭瀛�
+            int keywordWeight = 1;
+            foreach (var item in sprinklerVmos)
+            {
+                if (item.KeyWords != null && item.KeyWords.Count > 0)
+                {
+                    if (!string.IsNullOrEmpty(input.ModelType))
+                    {
+                        var count = item.KeyWords.Count(x => input.ModelType.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                    if (!string.IsNullOrEmpty(input.Material))
+                    {
+                        var count = item.KeyWords.Count(x => input.Material.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                }
+            }
+
+            //鏍囩
+            int flagWeight = 1000;
+            foreach (var item in sprinklerVmos)
+            {
+                if (item.Flags != null && item.Flags.Count > 0)
+                {
+                    if (item.Flags.Contains(HStation.Assets.Flags.榛樿))
+                    {
+                        dict[item] += flagWeight;
+                    }
+                }
+            }
+
+            var sprinkler = dict.OrderBy(x => x.Value).LastOrDefault().Key;
+            input.MatchingDbId = sprinkler.ID.ToString();
+            if (string.IsNullOrEmpty(input.ModelType))
+            {
+                input.MatchingModelType = sprinkler.Name;
+            }
+            if (string.IsNullOrEmpty(input.Material))
+            {
+                input.MatchingMaterial = sprinkler.Material;
+            }
+            if (input.Caliber <= 0)
+            {
+                input.Caliber = sprinkler.Caliber ?? 0;
+            }
+            if (input.MinorLoss <= 0)
+            {
+                input.MatchingMinorLoss = sprinkler.FlowMinorLoss;
+            }
+
+            return true;
         }
 
         //鎹㈢儹鍣ㄥ尮閰�
@@ -1127,7 +1022,7 @@
             }
 
             //鏍囩
-            int flagWeight = 1;
+            int flagWeight = 1000;
             foreach (var item in allExchangerList)
             {
                 if (item.Flags != null && item.Flags.Count > 0)
@@ -1266,7 +1161,7 @@
             }
 
             //鏍囩
-            int flagWeight = 1;
+            int flagWeight = 1000;
             foreach (var item in allCompressorList)
             {
                 if (item.Flags != null && item.Flags.Count > 0)
@@ -1322,198 +1217,227 @@
         }
 
         //闂峰ご鍖归厤
-        public static bool MatchingBlunthead(HydroBluntheadMatchingViewModel input, List<Vmo.AssetsBluntheadMainVmo> bluntheadVmos)
+        public static bool Matching(HydroBluntheadMatchingViewModel input, List<AssetsBluntheadMainVmo> bluntheadVmos)
         {
-            bool isNotarize = false; //鏄惁纭畾
-            if (bluntheadVmos == null || input == null || bluntheadVmos.Count == 0)
+            //杈撳叆鍙傛暟楠岃瘉
+            if (input == null)
             {
-                return true;
+                return false;
             }
-            Vmo.AssetsBluntheadMainVmo vmo = null;
-            var nameMatching = bluntheadVmos.Where(x =>
-    (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-    (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1
-    ) //鍏堣繘琛岀瓫閫�,鍚庤繘琛屼粠澶у埌灏忔帓搴�
-    .OrderByDescending(x =>
-     (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-     (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1).ToList();
 
-            if (nameMatching.Count > 1)
+            //鏁版嵁婧愭病鏈夋暟鎹垯娌℃湁鍖归厤鎴愬姛
+            if (bluntheadVmos == null || bluntheadVmos.Count < 1)
             {
-                var absoluteMatching = nameMatching.Where(i =>
-              ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-               i.Material == input.Material  //鏉愭枡绾︽潫
-                 ).ToList();
-                if (absoluteMatching.Count > 1)
+                return false;
+            }
+
+            //鏉冮噸瀛楀吀
+            var dict = new Dictionary<AssetsBluntheadMainVmo, double>();
+            foreach (var item in bluntheadVmos)
+            {
+                dict.Add(item, 0);
+            }
+
+            //鍨嬪彿
+            int modelTypeWeight = 10;
+            if (!string.IsNullOrEmpty(input.ModelType))
+            {
+                foreach (var item in bluntheadVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Name))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = bluntheadVmos.First();
+                        var count = item.Name.ToLower().Intersect(input.ModelType.ToLower()).Count();
+                        dict[item] += count * modelTypeWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
-
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = bluntheadVmos.First();
             }
-            else if (nameMatching.Count == 1)
-            {
-                isNotarize = true;
 
-                vmo = nameMatching.First();
-            }
-            else
+            //鏉愯川
+            int materialWeight = 5;
+            if (!string.IsNullOrEmpty(input.Material))
             {
-                var absoluteMatching = bluntheadVmos.Where(i =>
-              ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-               i.Material == input.Material  //鏉愭枡绾︽潫
-             ).ToList();
-                if (absoluteMatching.Count > 1)
+                foreach (var item in bluntheadVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Material))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = bluntheadVmos.First();
+                        var count = item.Material.ToLower().Intersect(input.Material.ToLower()).Count();
+                        dict[item] += count * materialWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
+            }
 
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = bluntheadVmos.First();
-            }
-            if (vmo != null)
+            //鍙e緞
+            int caliberWeight = 1;
+            if (input.Caliber > 0)
             {
-                if (!isNotarize)
+                foreach (var item in bluntheadVmos)
                 {
-                    if (input.MinorLoss < 0)
-                        input.MatchingMinorLoss = vmo.MinorLoss;
-                    if (input.DbId == null)
-                        input.MatchingDbId = vmo.ID.ToString();
-                    if (input.Material == null)
-                        input.MatchingMaterial = vmo.Material;
-                    if (input.ModelType == null)
-                        input.MatchingModelType = vmo.Name;
+                    if (item.Caliber.HasValue)
+                    {
+                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
+                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
+                    }
                 }
-                else
-                {
-                    input.MatchingMinorLoss = vmo.MinorLoss;
-                    input.MatchingDbId = vmo.ID.ToString();
-                    input.MatchingMaterial = vmo.Material;
-                    input.MatchingModelType = vmo.Name;
-                }
-                return true;
             }
-            return false;
+
+            // 鍏抽敭瀛�
+            int keywordWeight = 1;
+            foreach (var item in bluntheadVmos)
+            {
+                if (item.KeyWords != null && item.KeyWords.Count > 0)
+                {
+                    if (!string.IsNullOrEmpty(input.ModelType))
+                    {
+                        var count = item.KeyWords.Count(x => input.ModelType.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                    if (!string.IsNullOrEmpty(input.Material))
+                    {
+                        var count = item.KeyWords.Count(x => input.Material.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                }
+            }
+
+            //鏍囩
+            int flagWeight = 1000;
+            foreach (var item in bluntheadVmos)
+            {
+                if (item.Flags != null && item.Flags.Count > 0)
+                {
+                    if (item.Flags.Contains(HStation.Assets.Flags.榛樿))
+                    {
+                        dict[item] += flagWeight;
+                    }
+                }
+            }
+
+            var blunthead = dict.OrderBy(x => x.Value).LastOrDefault().Key;
+            input.MatchingDbId = blunthead.ID.ToString();
+            if (string.IsNullOrEmpty(input.ModelType))
+            {
+                input.MatchingModelType = blunthead.Name;
+            }
+            if (string.IsNullOrEmpty(input.Material))
+            {
+                input.MatchingMaterial = blunthead.Material;
+            }
+            if (input.Caliber <= 0)
+            {
+                input.Caliber = blunthead.Caliber ?? 0;
+            }
+            if (input.MinorLoss < 0)
+            {
+                input.MatchingMinorLoss = blunthead.MinorLoss;
+            }
+
+            return true;
         }
 
         //姘存睜鍖归厤
-        public static bool MatchingTank(HydroTankMatchingViewModel input, List<Vmo.AssetsTankMainVmo> tankVmos)
+        public static bool Matching(HydroTankMatchingViewModel input, List<AssetsTankMainVmo> tankVmos)
         {
-            bool isNotarize = false; //鏄惁纭畾
-            if (tankVmos == null || input == null || tankVmos.Count == 0)
+            //杈撳叆鍙傛暟楠岃瘉
+            if (input == null)
             {
-                return true;
+                return false;
             }
-            Vmo.AssetsTankMainVmo vmo = null;
-            var nameMatching = tankVmos.Where(x =>
-    (x.KeyWords != null && x.KeyWords.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-    (x.KeyWords == null || !x.KeyWords.Any()) && GetIntersect(x.Name, input.ModelType) >= 1
-    ) //鍏堣繘琛岀瓫閫�,鍚庤繘琛屼粠澶у埌灏忔帓搴�
-    .OrderByDescending(x =>
-     (x.KeyWords != null && x.KeyWords.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-     (x.KeyWords == null || !x.KeyWords.Any()) && GetIntersect(x.Name, input.ModelType) >= 1).ToList();
 
-            if (nameMatching.Count > 1)
+            //鏁版嵁婧愭病鏈夋暟鎹垯娌℃湁鍖归厤鎴愬姛
+            if (tankVmos == null || tankVmos.Count < 1)
             {
-                var defaultList = nameMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                //鍙栭粯璁�
-                if (defaultList.Count > 0)
-                {
-                    vmo = tankVmos.First();
-                }
-                else if (defaultList.Count <= 0)
-                {
-                    vmo = tankVmos.First();
-                }
+                return false;
             }
-            else if (nameMatching.Count == 1)
-            {
-                isNotarize = true;
 
-                vmo = nameMatching.First();
-            }
-            else
-                vmo = tankVmos.First();
-            if (vmo != null)
+            //鏉冮噸瀛楀吀
+            var dict = new Dictionary<AssetsTankMainVmo, double>();
+            foreach (var item in tankVmos)
             {
-                if (!isNotarize)
+                dict.Add(item, 0);
+            }
+
+            //鍨嬪彿
+            int modelTypeWeight = 10;
+            if (!string.IsNullOrEmpty(input.ModelType))
+            {
+                foreach (var item in tankVmos)
                 {
-                    if (input.DbId == null)
-                        input.MatchingDbId = vmo.ID.ToString();
-                    if (input.ModelType == null)
-                        input.MatchingModelType = vmo.Name;
-                    if (input.DN < 0)
-                        input.MatchingDN = vmo.DN;
-                    if (input.MinLevel < 0)
-                        input.MatchingMinLevel = vmo.MinLevel;
-                    if (input.CurveDbId == null)
+                    if (!string.IsNullOrEmpty(item.Name))
                     {
-                        var list = Task.Run(async () => await new BLL.PhartDiagramRelation().GetExByObjectTypeAndObjectID(HStation.Assets.DataType.ValveMain, vmo.ID)).Result;
-                        if (list != null && list.Count > 0)
-                        {
-                            var def = list.OrderByDescending(x => x.Importance).First();
-                            input.MatchingCurveDbId = def.ID.ToString();
-                            var curve = def.Diagram.GraphList[0].GetFeatPointList();
-                            input.MatchingVolCurve = new List<HydroCurvePointViewModel>();
-                            foreach (var item in curve)
-                            {
-                                input.MatchingVolCurve.Add(new HydroCurvePointViewModel(item.X, item.Y));
-                            }
-                        }
+                        var count = item.Name.ToLower().Intersect(input.ModelType.ToLower()).Count();
+                        dict[item] += count * modelTypeWeight;
                     }
                 }
-                else
+            }
+
+            // 鍏抽敭瀛�
+            int keywordWeight = 1;
+            foreach (var item in tankVmos)
+            {
+                if (item.KeyWords != null && item.KeyWords.Count > 0)
                 {
-                    input.MatchingDbId = vmo.ID.ToString();
-                    input.MatchingModelType = vmo.Name;
-                    input.MatchingDN = vmo.DN;
-                    input.MatchingMinLevel = vmo.MinLevel;
-                    input.MatchingOverFlow = vmo.OverFlow;
-                    var list = Task.Run(async () => await new BLL.PhartDiagramRelation().GetExByObjectTypeAndObjectID(HStation.Assets.DataType.ValveMain, vmo.ID)).Result;
-                    if (list != null && list.Count > 0)
+                    if (!string.IsNullOrEmpty(input.ModelType))
                     {
-                        var def = list.OrderByDescending(x => x.Importance).First();
-                        input.MatchingCurveDbId = def.ID.ToString();
-                        var curve = def.Diagram.GraphList[0].GetFeatPointList();
-                        input.MatchingVolCurve = new List<HydroCurvePointViewModel>();
-                        foreach (var item in curve)
-                        {
-                            input.MatchingVolCurve.Add(new HydroCurvePointViewModel(item.X, item.Y));
-                        }
+                        var count = item.KeyWords.Count(x => input.ModelType.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
                     }
                 }
-                return true;
             }
-            return false;
+
+            //鏍囩
+            int flagWeight = 1000;
+            foreach (var item in tankVmos)
+            {
+                if (item.Flags != null && item.Flags.Count > 0)
+                {
+                    if (item.Flags.Contains(HStation.Assets.Flags.榛樿))
+                    {
+                        dict[item] += flagWeight;
+                    }
+                }
+            }
+
+            var tank = dict.OrderBy(x => x.Value).LastOrDefault().Key;
+            input.MatchingDbId = tank.ID.ToString();
+            if (string.IsNullOrEmpty(input.ModelType))
+            {
+                input.MatchingModelType = tank.Name;
+            }
+
+            if (input.DN <= 0)
+            {
+                input.MatchingDN = tank.DN;
+            }
+            if (input.MinLevel <= 0)
+            {
+                input.MatchingMinLevel = tank.MinLevel;
+            }
+            input.MatchingOverFlow = tank.OverFlow;
+            if (input.MinVol <= 0)
+            {
+                input.MatchingMinVol = tank.MinVol;
+            }
+            if (input.MaxLevel <= 0)
+            {
+                input.MatchingMaxLevel = tank.MaxLevel;
+            }
+            if (input.CurveDbId == null)
+            {
+                var list = Task.Run(async () =>
+                    await new BLL.PhartDiagramRelation().GetExByObjectTypeAndObjectID(HStation.Assets.DataType.TankMain, tank.ID)).Result;
+                if (list != null && list.Count > 0)
+                {
+                    var def = list.OrderByDescending(x => x.Importance).First();
+                    input.MatchingCurveDbId = def.ID.ToString();
+                    var curve = def.Diagram.GraphList[0].GetFeatPointList();
+                    input.MatchingVolCurve = new List<HydroCurvePointViewModel>();
+                    foreach (var item in curve)
+                    {
+                        input.MatchingVolCurve.Add(new HydroCurvePointViewModel(item.X, item.Y));
+                    }
+                }
+            }
+            return true;
         }
 
         //姘磋〃鍖归厤
@@ -1567,7 +1491,7 @@
             }
 
             //鏍囩
-            int flagWeight = 10;
+            int flagWeight = 1000;
             foreach (var item in allMeterList)
             {
                 if (item.Flags != null && item.Flags.Count > 0)
@@ -1644,7 +1568,7 @@
             }
 
             //鏍囩
-            int flagWeight = 10;
+            int flagWeight = 1000;
             foreach (var item in allFlowmeterList)
             {
                 if (item.Flags != null && item.Flags.Count > 0)
@@ -1671,278 +1595,467 @@
         }
 
         //娑堢伀鏍撳尮閰�
-        public static bool MatchingHydrant(HydroHydrantMatchingViewModel input, List<Vmo.AssetsHydrantMainVmo> hydrantVmos)
+        public static bool Matching(HydroHydrantMatchingViewModel input, List<AssetsHydrantMainVmo> hydrantVmos)
         {
-            bool isNotarize = false; //鏄惁纭畾
-            if (hydrantVmos == null || input == null || hydrantVmos.Count == 0)
+            //杈撳叆鍙傛暟楠岃瘉
+            if (input == null)
             {
-                return true;
+                return false;
             }
-            Vmo.AssetsHydrantMainVmo vmo = null;
-            var nameMatching = hydrantVmos.Where(x =>
-    (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-    (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1
-    ) //鍏堣繘琛岀瓫閫�,鍚庤繘琛屼粠澶у埌灏忔帓搴�
-    .OrderByDescending(x =>
-     (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-     (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1).ToList();
 
-            if (nameMatching.Count > 1)
+            //鏁版嵁婧愭病鏈夋暟鎹垯娌℃湁鍖归厤鎴愬姛
+            if (hydrantVmos == null || hydrantVmos.Count < 1)
             {
-                var absoluteMatching = nameMatching.Where(i =>
-              ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-               i.Material == input.Material  //鏉愭枡绾︽潫
-                 ).ToList();
-                if (absoluteMatching.Count > 1)
-                {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
-                    {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = hydrantVmos.First();
-                    }
-                }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
+                return false;
+            }
 
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = hydrantVmos.First();
-            }
-            else if (nameMatching.Count == 1)
+            //鏉冮噸瀛楀吀
+            var dict = new Dictionary<AssetsHydrantMainVmo, double>();
+            foreach (var item in hydrantVmos)
             {
-                vmo = nameMatching.First();
+                dict.Add(item, 0);
             }
-            else
-            {
-                var absoluteMatching = hydrantVmos.Where(i =>
-          ((i.Caliber == null || input.Caliber == null) || Math.Abs(Convert.ToInt64(i.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance) &&  //鐩村緞绾︽潫
-           i.Material == input.Material   //鏉愭枡绾︽潫
-             ).ToList();
-                if (absoluteMatching.Count > 1)
-                {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
-                    {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = hydrantVmos.First();
-                    }
-                }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
 
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = hydrantVmos.First();
-            }
-            if (vmo != null)
+            //鍨嬪彿
+            int modelTypeWeight = 10;
+            if (!string.IsNullOrEmpty(input.ModelType))
             {
-                if (!isNotarize)
+                foreach (var item in hydrantVmos)
                 {
-                    if (input.MinorLoss < 0)
-                        input.MatchingMinorLoss = vmo.MinorLoss;
-                    if (input.DbId == null)
-                        input.MatchingDbId = vmo.ID.ToString();
-                    if (input.ModelType == null)
-                        input.MatchingModelType = vmo.Name;
+                    if (!string.IsNullOrEmpty(item.Name))
+                    {
+                        var count = item.Name.ToLower().Intersect(input.ModelType.ToLower()).Count();
+                        dict[item] += count * modelTypeWeight;
+                    }
                 }
-                else
-                {
-                    input.MatchingMinorLoss = vmo.MinorLoss;
-                    input.MatchingDbId = vmo.ID.ToString();
-                    input.MatchingMaterial = vmo.Material;
-                    input.MatchingModelType = vmo.Name;
-                }
-                return true;
             }
-            return false;
+
+            //鏉愯川
+            int materialWeight = 5;
+            if (!string.IsNullOrEmpty(input.Material))
+            {
+                foreach (var item in hydrantVmos)
+                {
+                    if (!string.IsNullOrEmpty(item.Material))
+                    {
+                        var count = item.Material.ToLower().Intersect(input.Material.ToLower()).Count();
+                        dict[item] += count * materialWeight;
+                    }
+                }
+            }
+
+            //鍙e緞
+            int caliberWeight = 1;
+            if (input.Caliber > 0)
+            {
+                foreach (var item in hydrantVmos)
+                {
+                    if (item.Caliber.HasValue)
+                    {
+                        var diff = Math.Abs(item.Caliber.Value - input.Caliber);
+                        dict[item] += diff / input.Caliber * 100 * caliberWeight;
+                    }
+                }
+            }
+
+            // 鍏抽敭瀛�
+            int keywordWeight = 1;
+            foreach (var item in hydrantVmos)
+            {
+                if (item.KeyWords != null && item.KeyWords.Count > 0)
+                {
+                    if (!string.IsNullOrEmpty(input.ModelType))
+                    {
+                        var count = item.KeyWords.Count(x => input.ModelType.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                    if (!string.IsNullOrEmpty(input.Material))
+                    {
+                        var count = item.KeyWords.Count(x => input.Material.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                }
+            }
+
+            //鏍囩
+            int flagWeight = 1000;
+            foreach (var item in hydrantVmos)
+            {
+                if (item.Flags != null && item.Flags.Count > 0)
+                {
+                    if (item.Flags.Contains(HStation.Assets.Flags.榛樿))
+                    {
+                        dict[item] += flagWeight;
+                    }
+                }
+            }
+
+            var hydrant = dict.OrderBy(x => x.Value).LastOrDefault().Key;
+            input.MatchingDbId = hydrant.ID.ToString();
+            if (string.IsNullOrEmpty(input.ModelType))
+            {
+                input.MatchingModelType = hydrant.Name;
+            }
+            if (string.IsNullOrEmpty(input.Material))
+            {
+                input.MatchingMaterial = hydrant.Material;
+            }
+            if (input.Caliber <= 0)
+            {
+                input.Caliber = hydrant.Caliber ?? 0;
+            }
+            if (input.MinorLoss < 0)
+            {
+                input.MatchingMinorLoss = hydrant.MinorLoss;
+            }
+
+            return true;
+        }
+
+        //寮ご鍖归厤
+        public static bool Matching(HydroElbowMatchingViewModel input, List<Vmo.AssetsElbowMainVmo> allElbowList)
+        {
+            //杈撳叆鍙傛暟楠岃瘉
+            if (input == null)
+            {
+                return false;
+            }
+
+            //鏁版嵁婧愭病鏈夋暟鎹垯娌℃湁鍖归厤鎴愬姛
+            if (allElbowList == null || allElbowList.Count < 1)
+            {
+                return false;
+            }
+            allElbowList = allElbowList.Where(x => x.Angle == 90).ToList();
+            //鏉冮噸瀛楀吀
+            var dict = new Dictionary<AssetsElbowMainVmo, double>();
+            foreach (var item in allElbowList)
+            {
+                dict.Add(item, 0);
+            }
+
+            //鍨嬪彿
+            int modelTypeWeight = 100;
+            if (!string.IsNullOrEmpty(input.ModelType))
+            {
+                foreach (var item in allElbowList)
+                {
+                    if (!string.IsNullOrEmpty(item.Name))
+                    {
+                        var count = item.Name.ToLower().Intersect(input.ModelType.ToLower()).Count();
+                        dict[item] += count * modelTypeWeight;
+                    }
+                }
+            }
+            //鍙e緞
+            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)
+            {
+                if (item.KeyWords != null && item.KeyWords.Count > 0)
+                {
+                    if (!string.IsNullOrEmpty(input.ModelType))
+                    {
+                        var count = item.KeyWords.Count(x => input.ModelType.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                }
+            }
+
+            //鏍囩
+            int flagWeight = 1000;
+            foreach (var item in allElbowList)
+            {
+                if (item.Flags != null && item.Flags.Count > 0)
+                {
+                    if (item.Flags.Contains(HStation.Assets.Flags.榛樿))
+                    {
+                        dict[item] += flagWeight;
+                    }
+                }
+            }
+
+            var elbow = dict.OrderBy(x => x.Value).LastOrDefault().Key;
+            input.MatchingDbId = elbow.ID.ToString();
+            if (string.IsNullOrEmpty(input.ModelType))
+            {
+                input.MatchingModelType = elbow.Name;
+            }
+            if (input.MinorLoss <= 0 || input.MinorLoss == null)
+            {
+                input.MatchingMinorLoss = elbow.MinorLoss;
+            }
+            if (input.BendingAngle <= 0 || input.BendingAngle == null)
+            {
+                input.MatchingBendingAngle = elbow.Angle;
+            }
+            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 <= 0)
+            {
+                input.MatchingCaliber = elbow.Caliber;
+            }
+            return true;
         }
 
         //鍘嬪姏琛ㄥ尮閰�
-        public static bool MatchingPressmeter(HydroPressmeterMatchingViewModel input, List<Vmo.AssetsPressmeterMainVmo> pressmeterVmos)
+        public static bool Matching(HydroPressmeterMatchingViewModel input, List<AssetsPressmeterMainVmo> pressmeterVmos)
         {
-            bool isNotarize = false; //鏄惁纭畾
-            if (pressmeterVmos == null || input == null || pressmeterVmos.Count == 0)
+            //杈撳叆鍙傛暟楠岃瘉
+            if (input == null)
             {
-                return true;
+                return false;
             }
-            Vmo.AssetsPressmeterMainVmo vmo = null;
-            var nameMatching = pressmeterVmos.Where(x =>
-    (x.KeyWords != null && x.KeyWords.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-    (x.KeyWords == null || !x.KeyWords.Any()) && GetIntersect(x.Name, input.ModelType) >= 1
-    ) //鍏堣繘琛岀瓫閫�,鍚庤繘琛屼粠澶у埌灏忔帓搴�
-    .OrderByDescending(x =>
-     (x.KeyWords != null && x.KeyWords.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-     (x.KeyWords == null || !x.KeyWords.Any()) && GetIntersect(x.Name, input.ModelType) >= 1).ToList();
 
-            if (nameMatching.Count > 1)
+            //鏁版嵁婧愭病鏈夋暟鎹垯娌℃湁鍖归厤鎴愬姛
+            if (pressmeterVmos == null || pressmeterVmos.Count < 1)
             {
-                var defaultList = nameMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                //鍙栭粯璁�
-                if (defaultList.Count > 0)
-                {
-                    vmo = pressmeterVmos.First();
-                }
-                else if (defaultList.Count <= 0)
-                {
-                    vmo = pressmeterVmos.First();
-                }
+                return false;
             }
-            else if (nameMatching.Count == 1)
-            {
-                isNotarize = true;
 
-                vmo = nameMatching.First();
-            }
-            else
+            //鏉冮噸瀛楀吀
+            var dict = new Dictionary<AssetsPressmeterMainVmo, double>();
+            foreach (var item in pressmeterVmos)
             {
-                vmo = pressmeterVmos.First();
+                dict.Add(item, 0);
             }
-            if (vmo != null)
+
+            //鍨嬪彿
+            int modelTypeWeight = 10;
+            if (!string.IsNullOrEmpty(input.ModelType))
             {
-                if (!isNotarize)
+                foreach (var item in pressmeterVmos)
                 {
-                    if (input.MinorLoss < 0)
-                        input.MatchingMinorLoss = vmo.MinorLoss;
-                    if (input.DbId == null)
-                        input.MatchingDbId = vmo.ID.ToString();
-                    if (input.ModelType == null)
-                        input.MatchingModelType = vmo.Name;
+                    if (!string.IsNullOrEmpty(item.Name))
+                    {
+                        var count = item.Name.ToLower().Intersect(input.ModelType.ToLower()).Count();
+                        dict[item] += count * modelTypeWeight;
+                    }
                 }
-                else
-                {
-                    input.MatchingMinorLoss = vmo.MinorLoss;
-                    input.MatchingDbId = vmo.ID.ToString();
-                    input.MatchingModelType = vmo.Name;
-                }
-                return true;
             }
-            return false;
+
+            // 鍏抽敭瀛�
+            int keywordWeight = 1;
+            foreach (var item in pressmeterVmos)
+            {
+                if (item.KeyWords != null && item.KeyWords.Count > 0)
+                {
+                    if (!string.IsNullOrEmpty(input.ModelType))
+                    {
+                        var count = item.KeyWords.Count(x => input.ModelType.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                }
+            }
+
+            //鏍囩
+            int flagWeight = 1000;
+            foreach (var item in pressmeterVmos)
+            {
+                if (item.Flags != null && item.Flags.Count > 0)
+                {
+                    if (item.Flags.Contains(HStation.Assets.Flags.榛樿))
+                    {
+                        dict[item] += flagWeight;
+                    }
+                }
+            }
+
+            var pressmeter = dict.OrderBy(x => x.Value).LastOrDefault().Key;
+            input.MatchingDbId = pressmeter.ID.ToString();
+            if (string.IsNullOrEmpty(input.ModelType))
+            {
+                input.MatchingModelType = pressmeter.Name;
+            }
+            if (input.MinorLoss < 0)
+            {
+                input.MatchingMinorLoss = pressmeter.MinorLoss;
+            }
+
+            return true;
         }
 
         //杩囨浮浠跺尮閰�
-        public static bool MatchingTranslation(HydroTranslationMatchingViewModel input, List<Vmo.AssetsTranslationMainVmo> translationVmos)
+        public static bool Matching(HydroTranslationMatchingViewModel input, List<AssetsTranslationMainVmo> translationVmos)
         {
-            bool isNotarize = false; //鏄惁纭畾
-
-            if (translationVmos == null || input == null || translationVmos.Count == 0)
+            //杈撳叆鍙傛暟楠岃瘉
+            if (input == null)
             {
-                return true;
+                return false;
             }
-            Vmo.AssetsTranslationMainVmo vmo = null;
-            var nameMatching = translationVmos.Where(x =>
-    (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-    (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1
-    ) //鍏堣繘琛岀瓫閫�,鍚庤繘琛屼粠澶у埌灏忔帓搴�
-    .OrderByDescending(x =>
-     (x.KeyWord != null && x.KeyWord.Any(keyword => GetIntersect(keyword, input.ModelType) >= 1)) ||
-     (x.KeyWord == null || !x.KeyWord.Any()) && GetIntersect(x.Name, input.ModelType) >= 1).ToList();
 
-            if (nameMatching.Count > 1)
+            //鏁版嵁婧愭病鏈夋暟鎹垯娌℃湁鍖归厤鎴愬姛
+            if (translationVmos == null || translationVmos.Count < 1)
             {
-                var absoluteMatching = nameMatching.Where(i =>
-                i.Material == input.Material  //鏉愭枡绾︽潫
-                 ).ToList();
-                if (absoluteMatching.Count > 1)
+                return false;
+            }
+
+            //鏉冮噸瀛楀吀
+            var dict = new Dictionary<AssetsTranslationMainVmo, double>();
+            foreach (var item in translationVmos)
+            {
+                dict.Add(item, 0);
+            }
+
+            //鍨嬪彿
+            int modelTypeWeight = 10;
+            if (!string.IsNullOrEmpty(input.ModelType))
+            {
+                foreach (var item in translationVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (!string.IsNullOrEmpty(item.Name))
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = translationVmos.First();
+                        var count = item.Name.ToLower().Intersect(input.ModelType.ToLower()).Count();
+                        dict[item] += count * modelTypeWeight;
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
-
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = translationVmos.First();
             }
-            else if (nameMatching.Count == 1)
-            {
-                isNotarize = true;
 
-                vmo = nameMatching.First();
-            }
-            else
+            // 涓婃父鍜屼笅娓哥洿寰�
+            int diameterWeight = 100;
+            if (input.StartDiameter > 0 && input.EndDiameter > 0)
             {
-                var absoluteMatching = translationVmos.Where(i =>
-            i.Material == input.Material   //鏉愭枡绾︽潫
-             ).ToList();
-                if (absoluteMatching.Count > 1)
+                foreach (var item in translationVmos)
                 {
-                    var defaultList = absoluteMatching.Where(x => x.Flags.Contains("榛樿鍊�")).ToList();
-                    //鍙栭粯璁�
-                    if (defaultList.Count > 0)
+                    if (item.StartDiameter > 0 && item.EndDiameter > 0)
                     {
-                        vmo = defaultList.First();
-                    }
-                    else if (defaultList.Count <= 0)
-                    {
-                        vmo = translationVmos.First();
+                        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;
+                            }
+                        }
                     }
                 }
-                else if (absoluteMatching.Count == 1)
-                {
-                    isNotarize = true;
-
-                    vmo = absoluteMatching.First();
-                }
-                else
-                    vmo = translationVmos.First();
             }
-            if (vmo != null)
+            //鏉愯川
+            int materialWeight = 5;
+            if (!string.IsNullOrEmpty(input.Material))
             {
-                if (!isNotarize)
+                foreach (var item in translationVmos)
                 {
-                    if (input.MinorLoss < 0)
-                        input.MatchingMinorLoss = vmo.MinorLoss;
-                    if (input.DbId == null)
-                        input.MatchingDbId = vmo.ID.ToString();
-                    if (input.ModelType == null)
-                        input.MatchingModelType = vmo.Name;
-                    if (input.Roughness < 0)
-                        input.MatchingRoughness = vmo.Roughness;
-                    if (input.EndDiameter < 0)
-                        input.MatchingEndDiameter = vmo.EndDiameter;
-                    if (input.StartDiameter < 0)
-                        input.MatchingStartDiameter = vmo.StartDiameter;
-                    if (input.Diameter < 0)
-                        input.MatchingDiameter = vmo.Diameter;
+                    if (!string.IsNullOrEmpty(item.Material))
+                    {
+                        var count = item.Material.ToLower().Intersect(input.Material.ToLower()).Count();
+                        dict[item] += count * materialWeight;
+                    }
                 }
-                else
-                {
-                    input.MatchingMinorLoss = vmo.MinorLoss;
-                    input.MatchingDbId = vmo.ID.ToString();
-                    input.MatchingMaterial = vmo.Material;
-                    input.MatchingModelType = vmo.Name;
-                    input.MatchingDiameter = vmo.Diameter;
-                    input.MatchingEndDiameter = vmo.EndDiameter;
-                    input.MatchingStartDiameter = vmo.StartDiameter;
-                    input.MatchingRoughness = vmo.Roughness;
-                }
-                return true;
             }
-            return false;
+
+            // 鍏抽敭瀛�
+            int keywordWeight = 1;
+            foreach (var item in translationVmos)
+            {
+                if (item.KeyWords != null && item.KeyWords.Count > 0)
+                {
+                    if (!string.IsNullOrEmpty(input.ModelType))
+                    {
+                        var count = item.KeyWords.Count(x => input.ModelType.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                    if (!string.IsNullOrEmpty(input.Material))
+                    {
+                        var count = item.KeyWords.Count(x => input.Material.ToLower().Contains(x.ToLower()));
+                        dict[item] += count * keywordWeight;
+                    }
+                }
+            }
+
+            //鏍囩
+            int flagWeight = 1000;
+            foreach (var item in translationVmos)
+            {
+                if (item.Flags != null && item.Flags.Count > 0)
+                {
+                    if (item.Flags.Contains(HStation.Assets.Flags.榛樿))
+                    {
+                        dict[item] += flagWeight;
+                    }
+                }
+            }
+
+            var translation = dict.OrderBy(x => x.Value).LastOrDefault().Key;
+            input.MatchingDbId = translation.ID.ToString();
+            if (string.IsNullOrEmpty(input.ModelType))
+            {
+                input.MatchingModelType = translation.Name;
+            }
+            if (string.IsNullOrEmpty(input.Material))
+            {
+                input.MatchingMaterial = translation.Material;
+            }
+            if (input.MinorLoss < 0)
+            {
+                input.MatchingMinorLoss = translation.MinorLoss;
+            }
+            if (input.Roughness < 0)
+            {
+                input.MatchingRoughness = translation.Roughness;
+            }
+            if (input.EndDiameter < 0)
+            {
+                input.MatchingEndDiameter = translation.EndDiameter;
+            }
+            if (input.StartDiameter < 0)
+            {
+                input.MatchingStartDiameter = translation.StartDiameter;
+            }
+            input.MatchingTranslationType = (Yw.WinFrmUI.eTranslationType)(int)translation.TranslationType;
+
+            return true;
         }
 
         //鍐峰嵈鍣ㄥ尮閰�
@@ -1997,14 +2110,14 @@
 
             //鍙e緞
             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;
                     }
                 }
             }
@@ -2029,7 +2142,7 @@
             }
 
             //鏍囩
-            int flagWeight = 1;
+            int flagWeight = 1000;
             foreach (var item in allCoolingList)
             {
                 if (item.Flags != null && item.Flags.Count > 0)
@@ -2051,9 +2164,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)
             {

--
Gitblit v1.9.3