浏览代码

Merge branch 'master' of https://git.dev.tencent.com/xuhuo1234/saga

xulisong 6 年之前
父节点
当前提交
b534eb7c52

+ 33 - 35
MBI/SAGA.MBI/Calc/CalcContext.cs

@@ -189,46 +189,44 @@ namespace SAGA.MBI.Calc
         }
 
         /// <summary>
-        /// 集合不为null
+        /// 获取所有的岗位
         /// </summary>
         /// <returns></returns>
-        public bool HasItem()
+        public List<MRevitEquipBase> GetAllDutys()
         {
-            bool result = false;
-            foreach (PropertyInfo info in base.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance))
-            {
-                try
-                {
-                    Type type = info.PropertyType;
-                    if (type.IsClass && !type.IsAbstract)
-                    {
-                        InitAttribute[] customAttributes = info.GetCustomAttributes(typeof(InitAttribute), true) as InitAttribute[];
-                        if (customAttributes.Any<InitAttribute>())
-                        {
-                            if (type == typeof(string))
-                            {
-                                info.SetValue(this, string.Empty, null);
-                            }
-                            else
-                            {
-                                var item = info.GetValue(this) as IEnumerable;
-                                if (item?.GetCount() > 0)
-                                {
-                                    result = true;
-                                    break;
-                                }
-                            }
-
-                        }
-                    }
-                }
-                catch (Exception)
-                {
-                }
-            }
-            return result;
+            List<MRevitEquipBase> list=new List<MRevitEquipBase>();
+            list.AddRange(MSpaces);
+            list.AddRange(MEquipments);
+            list.AddRange(MEquipmentParts);
+            list.AddRange(MBeacons);
+            return list;
         }
         /// <summary>
+        /// 获取所有的关系
+        /// </summary>
+        /// <returns></returns>
+        public List<MGraphRelationBase> GetAllRelations()
+        {
+            List<MGraphRelationBase> relations=new List<MGraphRelationBase>();
+            relations.AddRange(RltEquipInSpaces);
+            relations.AddRange(RltBeaconinElementSps);
+            relations.AddRange(UnGroupDatas);
+            return relations;
+        }
+        /// <summary>
+        /// 设置数据的更新状态
+        /// </summary>
+        /// <param name="state"></param>
+        public void SetState(DocumentChangedOperator state)
+        {
+            var dutys = GetAllDutys();
+            dutys.ForEach(t => t.Operator = state);
+            var relations = GetAllRelations();
+            relations.ForEach(t=>t.Operator=state);
+        }
+
+
+        /// <summary>
         /// 写到临时日志文件
         /// </summary>
         /// <param name="operate"></param>

+ 7 - 6
MBI/SAGA.MBI/DataArrange/DalCommon.cs

@@ -345,18 +345,19 @@ namespace SAGA.MBI.DataArrange
                 }
             }
             JObject relJObject;
-            if (criteriasAdd.Any())
-            {
-                relJObject = new JObject();
-                relJObject.Add("criterias", criteriasAdd);
-                RelationRequest.AddRelation(relJObject);
-            }
+            //注意要先删除后增加
             if (criteriasDel.Any())
             {
                 relJObject = new JObject();
                 relJObject.Add("criterias", criteriasDel);
                 RelationRequest.DeleteRelation(relJObject);
             }
+            if (criteriasAdd.Any())
+            {
+                relJObject = new JObject();
+                relJObject.Add("criterias", criteriasAdd);
+                RelationRequest.AddRelation(relJObject);
+            }
         }
 
         /// <summary>

+ 108 - 85
MBI/SAGA.MBI/DataArrange/DalUploadFloor.cs

@@ -4,30 +4,27 @@
  * 创建日期:2018/3/30 18:16:55
  * ==============================================================================*/
 
-using System;
-using System.Collections.Generic;
-using System.Collections.ObjectModel;
-using System.IO;
-using System.Linq;
-using System.Reflection;
 using Autodesk.Revit.DB;
 using Autodesk.Revit.DB.Mechanical;
 using SAGA.DotNetUtils;
 using SAGA.DotNetUtils.Extend;
 using SAGA.DotNetUtils.Logger;
-using SAGA.DotNetUtils.Others;
 using SAGA.MBI.Calc;
 using SAGA.MBI.Common;
 using SAGA.MBI.Extend;
-using SAGA.MBI.FileStream;
-using SAGA.MBI.Interaction;
-using SAGA.MBI.JsonConvert;
 using SAGA.MBI.Model;
 using SAGA.MBI.RequestData;
 using SAGA.MBI.Tools;
 using SAGA.MBI.WinView.Upload;
 using SAGA.RevitUtils;
 using SAGA.RevitUtils.Extends;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using SAGA.RevitUtils.MEP;
 
 namespace SAGA.MBI.DataArrange
 {
@@ -224,10 +221,11 @@ namespace SAGA.MBI.DataArrange
         /// </summary>
         public static VMUploadModeManage PrepareUploadFloors()
         {
+            Log4Net.Info("PrepareUpload Start");
             string currentFloor = string.Empty;
+            VMUploadModeManage vm = new VMUploadModeManage();
             try
             {
-                VMUploadModeManage vm = new VMUploadModeManage();
                 //获取有模型文件的楼层
                 var allFloors = GetHasFileFloors();
                 //获取MD5改变的文件
@@ -240,74 +238,16 @@ namespace SAGA.MBI.DataArrange
                 foreach (UploadFloor uploadFloor in modifyFloors)
                 {
                     if (uploadFloor == null) continue;
-                    //检测到自己加锁 才读取日志
-                    if (uploadFloor.MFloor.FloorLock.LockState != MFloorLockState.LockBySelf)
-                        continue;
                     currentFloor = uploadFloor.MFloor.ToString();
-                    Document document = null;
                     try
                     {
-                        #region 同步空间名称
-                        document = ExternalDataWrapper.Current.App.OpenDocumentFile(uploadFloor.MFloor.FullPath);
-                        MBIModelInfoManager.SyncPlatformToRevit(document);
-                        #endregion
-
-                        #region 跟据日志整理跟要上传的数据
-                        //检测有日志文件,才上传
-                        var logs = DalLogOperate.GetLogs(uploadFloor.MFloor.Id);
-                        if (!logs.Any()) continue;
-                        uploadFloor.CalcContext = DalCommon.DownLoadCouldData(uploadFloor.MFloor);
-                        CalcContext context = uploadFloor.CalcContext;
-
-                        //按id分组后的日志
-                        var floorLogsGroupByBimId = logs.GroupBy(t => t.Id);
-                        //所有的拓扑图类型
-                        var tempGriphs = new List<MTopologyGriph>(topologyGriphs);
-                        foreach (IGrouping<string, DocumentChangedLogMode> logGroup in floorLogsGroupByBimId)
+                        #region 日志影响拓扑图
+                        foreach (var topologyGriph in topologyGriphs)
                         {
-                            DocumentChangedLogMode log = logGroup.LastOrDefault();
-                            if (log == null) continue;
-                            var bimId = CommonTool.GetCloudBIMId(log.DocName, log.Id);
-                            var elem = document.GetElement(log.Id.ToInt());
-                            //日志影响构件
-                            var operate =
-                                (DocumentChangedOperator)Enum.Parse(typeof(DocumentChangedOperator), log.Operator);
-                            var mode = context.FindItem(bimId);
-                            //模型和物理世界都找不到这条数据,Next
-                            if (mode == null && elem == null) continue;
-                            switch (operate)
-                            {
-                                case DocumentChangedOperator.Add:
-                                case DocumentChangedOperator.Modified:
-                                case DocumentChangedOperator.Delete:
-                                    OperateModifyLog(mode, elem, context);
-                                    break;
-                                case DocumentChangedOperator.DeleteSaveDuty:
-                                    OperateDelSaveDutyLog(mode);
-                                    break;
-                            }
-                            #region 日志影响拓扑图
-                            //日志影响拓扑图,影响则标记,从所有中移除
-                            var useGriphs = new List<MTopologyGriph>(topologyGriphs);
-                            foreach (var topologyGriph in tempGriphs)
-                            {
-                                if (topologyGriph.IsAffectGriph(log))
-                                {
-                                    useGriphs.Add(topologyGriph);
-                                    uploadFloor.ReferGriphs.Add(topologyGriph);
-                                }
-
-                            }
-                            tempGriphs.RemoveAll(t => useGriphs.Contains(t));
-
-                            #endregion
+                            uploadFloor.ReferGriphs.Add(topologyGriph);
                         }
-
-
                         #endregion
 
-                        //处理设备所在空间
-                        CheckEquipSpaceRlt(context);
                         uploadFloor.IsUpload = true;
 
                     }
@@ -317,18 +257,18 @@ namespace SAGA.MBI.DataArrange
                     }
                     finally
                     {
-                        document?.CloseDoc();
                     }
                 }
                 vm.UploadFloors = modifyFloors;
                 vm.MTopologyGriphs = PrepareMTopologyGriphs(modifyFloors);
-                return vm;
             }
             catch (Exception e)
             {
                 MessageShow.Show(e, strMessage: $"楼层 { currentFloor ?? string.Empty} 打开异常或网络异常,请检查后再进行操作!\r\n");
-                return null;
+                vm = null;
             }
+            Log4Net.Info("PrepareUpload Start");
+            return vm;
         }
 
         /// <summary>
@@ -353,7 +293,7 @@ namespace SAGA.MBI.DataArrange
             //不知什么原因,日志就显示add,但物理世界存在这条信息
             if (mode != null)
             {
-                IsEquipClassCodeChanged(mode,elem, revitmode, context);
+                IsEquipClassCodeChanged(mode, elem, revitmode, context);
             }
             else
             {
@@ -381,7 +321,7 @@ namespace SAGA.MBI.DataArrange
                         {
                             //待建模型清单新建的设备
                             cloudmode.BimID = revitmode.BimID;
-                            IsEquipClassCodeChanged(cloudmode,elem, revitmode, context);
+                            IsEquipClassCodeChanged(cloudmode, elem, revitmode, context);
                             context.Add(cloudmode);
                         }
                     }
@@ -397,7 +337,7 @@ namespace SAGA.MBI.DataArrange
         /// <param name="tempmode"></param>
         /// <param name="context"></param>
         /// <returns></returns>
-        private static bool IsEquipClassCodeChanged(MRevitEquipBase mode,Element elem, MRevitEquipBase tempmode, CalcContext context)
+        private static bool IsEquipClassCodeChanged(MRevitEquipBase mode, Element elem, MRevitEquipBase tempmode, CalcContext context)
         {
             bool result = false;
 
@@ -652,13 +592,96 @@ namespace SAGA.MBI.DataArrange
             list.Add(new MTopologyGriph() { Name = "空间流通网络" });
             return list;
         }
-    }
 
-    public enum UploadType
-    {
-        //文件模型修正
-        ModeModify,
-        //更新模型文件
-        FileReplace
+        /// <summary>
+        /// 新旧文件对比过后,需要添加的数据
+        /// </summary>
+        public static void WrapperContext(CalcContext cloudContext, CalcContext localContext)
+        {
+            CalcContext addContext = null;
+            CalcContext delContext = null;
+            CalcContext modifyContext = null;
+            var cloudDutys = cloudContext.GetAllDutys();
+            var localDutys = localContext.GetAllDutys();
+            //设置初始状态
+            cloudContext.SetState(DocumentChangedOperator.None);
+            localContext.SetState(DocumentChangedOperator.None);
+            #region Modify
+            foreach (var lduty in localContext.GetAllDutys())
+            {
+                string bimId = lduty.BimID;
+                var cdutys = cloudDutys.Where(t => t.BimID == bimId).ToList();
+                MRevitEquipBase cduty = null;
+                //如果对应多个岗位,仅保留信息点多的岗位,删除其它岗位
+                if (cdutys.Any())
+                {
+                    if (cdutys.Count() > 1)
+                    {//信息点的个数从大到小排序
+                        cdutys.Sort((x, y) => { return -x.CloundJObject.Count.CompareTo(y.CloundJObject.Count); });
+                        //删除多余的岗位
+                        for (int i = 1; i < cdutys.Count; i++)
+                        {
+                            cdutys[i].Operator = DocumentChangedOperator.Delete;
+                        }
+                    }
+                    cduty = cdutys.FirstOrDefault();
+                }
+                if (cduty == null)
+                    continue;
+                //判断族编码是否更改
+                if (EquipmentCodeMap.GetOriginCode(lduty.EquipClassCode) !=
+                    EquipmentCodeMap.GetOriginCode(cduty.EquipClassCode))
+                {
+                    //族编码更改。删除旧岗位,创建新岗位
+                    cduty.Operator = DocumentChangedOperator.Delete;
+                    lduty.Operator = DocumentChangedOperator.Add;
+                }
+                else
+                {
+                    lduty.Id = cduty.Id;
+                    lduty.Operator = DocumentChangedOperator.Modified;
+                    cduty.Operator = DocumentChangedOperator.Modified;
+                }
+                //处理设备所在空间的关系
+                //??删除重建??没错
+                var equipInSpace = localContext.RltEquipInSpaces.FirstOrDefault(t => t.MEquipment.BimID == bimId);
+                if (equipInSpace == null) continue;
+                equipInSpace.Operator = DocumentChangedOperator.Delete;
+                localContext.RltEquipInSpaces.Add(new RltEquipInSpace(equipInSpace.MSpace, equipInSpace.MEquipment) { Operator = DocumentChangedOperator.Add });
+            }
+            #endregion
+
+            #region Delete
+
+            //CloudDuty,有两种操作,更新和删除。更新等价于None
+            foreach (var duty in cloudDutys)
+            {
+                //物理世界修改,不做处理
+                if (duty.Operator == DocumentChangedOperator.Modified)
+                {
+                    duty.Operator = DocumentChangedOperator.None;
+                    continue;
+                }
+                duty.Operator = DocumentChangedOperator.Delete;
+                //删除时,会删除所在空间和所在楼层的关系
+            }
+
+            #endregion
+
+            #region Add
+
+            //LocalDuty,有两种操作,更新和增加。除Modify以外的全部为添加
+            foreach (var duty in localDutys)
+            {
+                if (duty.Operator == DocumentChangedOperator.Modified) continue;
+                duty.Operator = DocumentChangedOperator.Add;
+                //添加时,添加设备所在元空间关系
+                localContext.RltEquipInSpaces.Where(t => t.MEquipment.BimID == duty.BimID).ToList()
+                    .ForEach(t => t.Operator = DocumentChangedOperator.Add);
+            }
+
+            #endregion
+            
+        }
     }
 }

+ 1 - 1
MBI/SAGA.MBI/ToolsData/CheckDuplicationBIMId.cs

@@ -53,7 +53,7 @@ namespace SAGA.MBI.ToolsData
             return exceptionGroups;
         }
         /// <summary>
-        /// 修正Bimdid重复数据,保留信息点最
+        /// 修正Bimdid重复数据,保留信息点最
         /// </summary>
         /// <param name="groups"></param>
         private static void  Correct(IEnumerable<IGrouping<string, MRevitEquipBase>> groups)

+ 1 - 1
MBI/SAGA.MBI/WinView/Login/WinLogin.xaml

@@ -18,7 +18,7 @@
                  Text="{Binding Path=PhoneNumber,UpdateSourceTrigger=PropertyChanged}"></wpf:TextBox_PlusInt>
         <Label Canvas.Left="68" Canvas.Top="89"
                Content="验证码:"></Label>
-        <TextBox Canvas.Left="129" Canvas.Top="89" VerticalContentAlignment="Center"
+        <TextBox Canvas.Left="129" Canvas.Top="89" VerticalContentAlignment="Center" TabIndex="0" 
                  Width="100" Height="24"
                  IsEnabled="{Binding Path=CanInputIdentifyingCode,UpdateSourceTrigger=PropertyChanged}"
                  Text="{Binding Path=IdentifyingCode,UpdateSourceTrigger=PropertyChanged}"></TextBox>

+ 25 - 6
MBI/SAGA.MBI/WinView/Upload/VMUploadModeManage.cs

@@ -23,6 +23,7 @@ using SAGA.MBI.RequestData;
 using SAGA.MBIAssistData.BLL;
 using SAGA.MBI.Interaction;
 using SAGA.RevitUtils;
+using SAGA.RevitUtils.Extends;
 
 namespace SAGA.MBI.WinView.Upload
 {
@@ -102,6 +103,7 @@ namespace SAGA.MBI.WinView.Upload
         [Command]
         public void Upload(object param)
         {
+            Log4Net.Debug("UploadData Start");
             try
             {
                 Window mainWin = param as Window;
@@ -113,23 +115,36 @@ namespace SAGA.MBI.WinView.Upload
                     {
                         var upfloors = UploadFloors.Where(t =>
                             t.IsUpload && t.MFloor.FloorLock.LockState == MFloorLockState.LockBySelf).ToList();
-                        int i = 0, count = upfloors.Count();
+                        int i = 0, count = upfloors.Count;
                         List<string> successList = new List<string>();
                         List<string> failList = new List<string>();
                         foreach (var ufloor in upfloors)
                         {
                             try
                             {
+                                MFloor floor = ufloor.MFloor;
+                                if (floor == null) continue;
                                 i++;
                                 string floorName = ufloor.FloorName;
                                 failList.Add(floorName);
 
-                                CalcContext context = ufloor.CalcContext;
 
-                                if (context == null || !context.Upload())
-                                {
-                                    continue;
-                                }
+                                #region 同步空间名称
+                                var document = ExternalDataWrapper.Current.App.OpenDocumentFile(ufloor.MFloor.FullPath);
+                                MBIModelInfoManager.SyncPlatformToRevit(document);
+                                #endregion
+
+
+                                #region 准备并上传数据
+                                CalcContext serviceContext = DalCommon.DownLoadCouldData(ufloor.MFloor);
+                                CalcContext localContext = ObjectCalc.Calc(floor);
+                                DalUploadFloor.WrapperContext(serviceContext, localContext);
+                                serviceContext.Upload();
+                                localContext.Upload();
+                                #endregion
+
+                                #region 上传文件及上传完成后续动作
+
                                 if (FloorFileOperate.UploadFile(ufloor.MFloor.ToString(), ufloor.MFloor.FullPath, count, i))
                                 {
                                     //请除Duty和BIMID的关系
@@ -144,6 +159,9 @@ namespace SAGA.MBI.WinView.Upload
                                     successList.Add(floorName);
                                     failList.Remove(floorName);
                                 }
+
+                                #endregion
+
                             }
                             catch (Exception e)
                             {
@@ -195,6 +213,7 @@ namespace SAGA.MBI.WinView.Upload
             {
                 MessageShow.Show(e);
             }
+            Log4Net.Info("UploadData End");
 
         }
         public bool CanUpload(object param)