فهرست منبع

mxg:修改推荐算法

mengxiangge 6 سال پیش
والد
کامیت
26488db7ba
2فایلهای تغییر یافته به همراه36 افزوده شده و 13 حذف شده
  1. 1 1
      MBI/SAGA.MBI/JsonConvert/MatchFMConvert.cs
  2. 35 12
      MBI/SAGA.MBI/WinView/ModeInfoMaintenance/VMMatchFM.cs

+ 1 - 1
MBI/SAGA.MBI/JsonConvert/MatchFMConvert.cs

@@ -142,7 +142,7 @@ namespace SAGA.MBI.JsonConvert
                         {
                             mEquipFm.ImageList.Add(new MServiceAttachment(imageObj.GetValueEx("key"), imageObj.GetValueEx("name"), imageObj.GetValueEx("type").ConvertToServiceImageType()));
                         }
-                        mEquipFm.DistantImage = mEquipFm.ImageList.FirstOrDefault(t => t.ImageName == distantImageStr);
+                        mEquipFm.DistantImage = mEquipFm.ImageList.FirstOrDefault(t => t.ImageName == distantImageStr)?? mEquipFm.ImageList.FirstOrDefault();
                     }
 
                     mEquipFm.FMJson = fmInfos.ToString();

+ 35 - 12
MBI/SAGA.MBI/WinView/ModeInfoMaintenance/VMMatchFM.cs

@@ -376,7 +376,26 @@ namespace SAGA.MBI.WinView.ModeInfoMaintenance
         /// </summary>
         public string FloorName { get; set; }
     }
-
+    /// <summary>
+    /// 由近到远进行排序
+    /// </summary>
+    public class RecommendByDistanceComparer : IComparer<MEquipFM>
+    {
+        private XYZ origin;
+        public RecommendByDistanceComparer(XYZ origin)
+        {
+            this.origin = origin;
+        }
+        public int Compare(MEquipFM x, MEquipFM y)
+        {
+            XYZ xXyz = x.Location.ToXyz();
+            XYZ yXyz = y.Location.ToXyz();
+            return origin.DistanceTo(xXyz).CompareTo(origin.DistanceTo(yXyz));
+        }
+    }
+    /// <summary>
+    /// 推荐
+    /// </summary>
     public class RecommendFMData : BaseFMData
     {
 
@@ -402,20 +421,21 @@ namespace SAGA.MBI.WinView.ModeInfoMaintenance
             var tempList = list.Where(t => IsMathPlan1(t, equip));
             if (tempList.Any())
             {
+                List<MEquipFM> plan1List = new List<MEquipFM>();
                 var nodutyList = tempList.Where(t => t.EquipmentId.IsNotNullEmpty());
                 if (nodutyList.Any())
                 {
-                    foreach (MEquipFM fm in nodutyList)
-                    {
-                        FMList.Add(fm);
-                    }
+                    plan1List.AddRange(nodutyList);
                 }
                 else
                 {
-                    foreach (MEquipFM fm in tempList)
-                    {
-                        FMList.Add(fm);
-                    }
+                    plan1List.AddRange(tempList);
+                }
+                //按距离由近到远排序
+                plan1List.Sort(new RecommendByDistanceComparer(equip.Location.ToXyz()));
+                foreach (MEquipFM fm in plan1List)
+                {
+                    FMList.Add(fm);
                 }
             }
             else
@@ -428,7 +448,9 @@ namespace SAGA.MBI.WinView.ModeInfoMaintenance
             }
         }
         /// <summary>
-        /// 推荐方案1,同设备族and距离近
+        /// 推荐方案1,
+        /// 同一楼层
+        /// 同设备族and距离近
         /// </summary>
         /// <param name="equipFm"></param>
         /// <param name="equip"></param>
@@ -437,12 +459,13 @@ namespace SAGA.MBI.WinView.ModeInfoMaintenance
         {
             bool result = false;
             List<Func<MEquipFM, MRevitEquipBase, bool>> funcs = new List<Func<MEquipFM, MRevitEquipBase, bool>>();
+            funcs.Add(IsSameFloor);
             funcs.Add(IsLocationNear);
             while (true)
             {
                 if (equipFm.FamilyCode != equip.Family.Code)
                     break;
-                result = funcs.Any(t => t(equipFm, equip));
+                result = funcs.All(t => t(equipFm, equip));
                 break;
             }
             return result;
@@ -572,7 +595,7 @@ namespace SAGA.MBI.WinView.ModeInfoMaintenance
         private bool IsLocationNear(MEquipFM equipFm, MRevitEquipBase equip)
         {
             //推荐坐标的冗余值
-            double redundancy = 2000d;
+            double redundancy = 20000d;
             XYZ fmXyz = equipFm.Location.ToXyz();
             XYZ dutyXyz = equip.Location.ToXyz();
             bool result = false;