From f35f1397c980efdc2542dff7aaa23b1a7dbb65e7 Mon Sep 17 00:00:00 2001
From: 陈嘉乐 <cjl@hdlchina.com.cn>
Date: 星期三, 16 十二月 2020 10:53:34 +0800
Subject: [PATCH] 2020-12-16-1

---
 HDL_ON/Entity/Room.cs |  481 ++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 397 insertions(+), 84 deletions(-)

diff --git a/HDL_ON/Entity/Room.cs b/HDL_ON/Entity/Room.cs
index 5c0cdcb..dfcbf83 100644
--- a/HDL_ON/Entity/Room.cs
+++ b/HDL_ON/Entity/Room.cs
@@ -1,12 +1,14 @@
 锘縰sing System;
 using System.Collections.Generic;
+using HDL_ON.DAL.Server;
+using Shared;
 
 namespace HDL_ON.Entity
 {
     /// <summary>
     /// 璇诲彇鏈嶅姟鍣ㄧ┖闂翠俊鎭繑鍥炲埌鏁版嵁鍖�
     /// </summary>
-    public class RoomApiPack
+    public class SpatialApiPack
     {
         public List<SpatialInfo> list = new List<SpatialInfo>();
 
@@ -25,83 +27,174 @@
     /// </summary>
     public class SpatialInfo
     {
+        static SpatialInfo _currentSpatial;
+        public static SpatialInfo CurrentSpatial
+        {
+            get
+            {
+                if (_currentSpatial == null)
+                {
+                    _currentSpatial = new SpatialInfo();
+                }
+                return _currentSpatial;
+            }
+        }
+        public SpatialInfo()
+        {
+        }
+
+        public SpatialInfo(string spatialType)
+        {
+            roomType = "FLOOR";
+            parentId = DB_ResidenceData.Instance.CurrentRegion.RegionID;
+        }
+
         public string roomId = "";
         public string roomName = "";
-        public string roomImage = "";
+        //public string roomImage = "";
+        public string roomImage = "Classification/Room/Roombg.png";
         public string roomType = "";
         public string parentId = "";
         public string uid = Guid.NewGuid().ToString();
-
         public string createTime = "";
         public string modifyTime = "";
+        ///// <summary>
+        ///// 鍒犻櫎鏍囪 20201208锛氬彲娆�:APP鐨勫湪绾垮拰绂荤嚎闂锛屽垰鍒氱‘瀹氫簡锛岀绾挎棤娉曠紪杈戯紝鍙兘鎺у埗
+        ///// 闇�瑕佸垹闄ゆ暟鎹椂锛屾爣璁颁负锛歵rue
+        ///// 鐢变簯绔垹闄ゆ垚鍔熶箣鍚庯紝杩斿洖鏁版嵁鍐嶆竻闄ゆ湰鍦版暟鎹�
+        ///// </summary>
+        //public bool DeleteSign = false;
 
-        protected void SaveSpatialInfo()
+
+        protected ResponsePackNew SaveSpatialInfo()
         {
-            var pm = new DAL.Server.HttpServerRequest();
+            var pm = new HttpServerRequest();
+            var revPack = new ResponsePackNew();
             if (string.IsNullOrEmpty(createTime) && string.IsNullOrEmpty(modifyTime))
             {
-                pm.AddRoom(new List<SpatialInfo>() { this });
+                revPack = pm.AddRoom(new List<SpatialInfo>() { this });
             }
             else if (string.IsNullOrEmpty(createTime) && !string.IsNullOrEmpty(modifyTime))
             {
-                pm.DeleteRoom(new List<string>() { roomId });
+                revPack = pm.DeleteRoom(new List<string>() { roomId });
             }
             else if (!string.IsNullOrEmpty(createTime) && !string.IsNullOrEmpty(modifyTime))
             {
-                pm.UpdateRoom(new List<SpatialInfo>() { this });
+                revPack = pm.UpdateRoom(new List<SpatialInfo>() { this });
             }
+            return revPack;
         }
 
         /// <summary>
-        /// 鏇存柊妤煎眰淇℃伅
+        /// 涓嬭浇浜戠鎴块棿鏁版嵁
         /// </summary>
-        public void UpdateSpatialInfoData()
+        public void DownloadRoomList()
         {
-            if (roomType == "ROOM")
+            new System.Threading.Thread(() =>
             {
-
-            }
-            else if (roomType == "FLOOR")
-            {
-                var tempFloor = Floor.InsFloor.Floors.Find((obj) => obj.roomId == roomId);
-                if (tempFloor == null)
+                var pm = new HttpServerRequest();
+                var pack = pm.GetRoomList();
+                if (pack.Code == StateCode.SUCCESS)
                 {
-                    Floor.InsFloor.Floors.Add(this as Floor);
+                    var revData = Newtonsoft.Json.JsonConvert.DeserializeObject<SpatialApiPack>(pack.Data.ToString());
+                    if (revData != null)
+                    {
+                        CurrentSpatial.UpdateSpatialList(revData.list, OptionType.Cover);
+                    }
                 }
                 else
                 {
-                    tempFloor = this as Floor;
+                    MainPage.Log($"璇诲彇鎴块棿鏁版嵁澶辫触:\r\nCode:{pack.Code}; msg:{pack.message}");
                 }
-                var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(Floor.InsFloor.Floors));
-                FileUtils.WriteFileByBytes(Floor.InsFloor.FloorDataSavePath, ssd);
-                MainPage.Log("鏇存柊妤煎眰淇℃伅");
-            }
+            })
+            { IsBackground = true }.Start();
         }
-    }
 
-    /// <summary>
-    /// 鎴块棿瀵硅薄
-    /// </summary>
-    [Serializable]
-    public class Floor : SpatialInfo
-    {
-        #region 妤煎眰鏁版嵁鐩稿叧
-        static Floor ins_Floor ;
-        public static Floor InsFloor {
-            get {
-                if(ins_Floor== null)
+        /// <summary>
+        /// 鏇存柊绌洪棿淇℃伅
+        /// </summary>
+        /// <param name="spatials">绌洪棿淇℃伅</param>
+        /// <param name="optionType">鎿嶄綔绫诲瀷锛欰DD/UPDATE/DELETE</param>
+        public void UpdateSpatialList(List<SpatialInfo> spatials,OptionType optionType)
+        {
+            var roomUpdateList = spatials.FindAll((obj) => obj.roomType == "ROOM");
+            var floorUpdateList = spatials.FindAll((obj) => obj.roomType == "FLOOR");
+            //澶勭悊鎴块棿鍒楄〃
+            if (roomUpdateList != null && roomUpdateList.Count > 0)
+            {
+                if (optionType == OptionType.Update)
                 {
-                    ins_Floor = new Floor();
+                    foreach (var updateTemp in roomUpdateList)
+                    {
+                        var localRoom = CurrentSpatial.RoomList.Find((obj) => obj.roomId == updateTemp.roomId);
+                        if (localRoom != null)
+                        {
+                            if (localRoom.modifyTime != updateTemp.modifyTime)
+                            {
+                                localRoom.roomName = updateTemp.roomName;
+                                localRoom.roomImage = updateTemp.roomImage;
+                                localRoom.parentId = updateTemp.parentId;
+                                localRoom.createTime = updateTemp.createTime;
+                                localRoom.modifyTime = updateTemp.modifyTime;
+                                localRoom.SaveRoomData(false);
+                            }
+                        }else
+                        {
+                            updateTemp.SaveRoomData(false);
+                        }
+                    }
                 }
-                return ins_Floor;
+                else if (optionType == OptionType.Cover)
+                {
+                    CurrentSpatial.DeleteAllRoom();
+                    foreach(var newRoom in roomUpdateList)
+                    {
+                        newRoom.SaveRoomData(false);
+                        RoomList.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<Room>(
+                            Newtonsoft.Json.JsonConvert.SerializeObject(newRoom)));
+                    }
+                }
+            }
+            //妤煎眰鎴块棿鍒楄〃
+            if (floorUpdateList != null && floorUpdateList.Count > 0)
+            {
+                if (optionType == OptionType.Update)
+                {
+                    foreach(var updateTemp in floorUpdateList)
+                    {
+                        var localFloor = FloorList.Find((obj) => obj.roomId == updateTemp.roomId);
+                        if (localFloor == null)
+                        {
+                            FloorList.Add(updateTemp);
+                        }
+                        else
+                        {
+                            localFloor = updateTemp;
+                        }
+                    }
+                }
+                if(optionType == OptionType.Cover)
+                {
+                    FloorList.Clear();
+                    foreach (var updateTemp in floorUpdateList)
+                    {
+                        FloorList.Add(updateTemp);
+                    }
+                }
+                var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(FloorList));
+                Common.FileUtlis.Files.WriteFileByBytes(dataSavePath, ssd);
             }
         }
-        public string FloorDataSavePath = "FloorsData";
+
+        #region 妤煎眰鍒楄〃
         /// <summary>
         /// 妤煎眰鍒楄〃
         /// </summary>
-        List<Floor> floors;
-        public List<Floor> Floors
+        List<SpatialInfo> floors;
+        /// <summary>
+        /// 妤煎眰鍒楄〃
+        /// </summary>
+        public List<SpatialInfo> FloorList
         {
             get
             {
@@ -109,16 +202,16 @@
                 {
                     try
                     {
-                        var floorsDataBytes = FileUtils.ReadFile(FloorDataSavePath);
+                        var floorsDataBytes = Common.FileUtlis.Files.ReadFile("FloorsData");
                         if (floorsDataBytes != null)
                         {
                             var floorsDataString = System.Text.Encoding.UTF8.GetString(floorsDataBytes);
                             MainPage.Log(floorsDataString);
-                            floors = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Floor>>(floorsDataString);
-                            if (floors == null)
-                            {
-                                floors = new List<Floor>();
-                            }
+                            floors = Newtonsoft.Json.JsonConvert.DeserializeObject<List<SpatialInfo>>(floorsDataString);
+                        }
+                        if (floors == null)
+                        {
+                            floors = new List<SpatialInfo>();
                         }
                     }
                     catch (Exception ex)
@@ -129,50 +222,267 @@
                 return floors;
             }
         }
-
+        /// <summary>
+        /// 鏁版嵁淇濆瓨璺緞
+        /// </summary>
+        string dataSavePath
+        {
+            get
+            {
+                if(roomType == "ROOM")
+                {
+                    return "RoomPath_" + uid;
+                }
+                if(roomType == "FLOOR")
+                {
+                    return "FloorsData"; 
+                }
+                else
+                {
+                    return "SpatialInfo_"+uid;
+                }
+            }
+        }
         /// <summary>
         /// 澧炲姞妤煎眰
         /// </summary>
         /// <param name="floor"></param>
-        public void AddFloor(Floor floor)
+        public string AddFloor(SpatialInfo floor, out SpatialInfo newFloor)
         {
-            ins_Floor.floors.Add(floor);
-            floor.SaveFloorData();
+            var pm = new HttpServerRequest();
+            var revPack = new ResponsePackNew();
+            revPack = pm.AddRoom(new List<SpatialInfo>() { floor });
+            if (revPack.Code == StateCode.SUCCESS)
+            {
+                var revData = Newtonsoft.Json.JsonConvert.DeserializeObject<List<SpatialInfo>>(revPack.Data.ToString());
+                if (revData.Count > 0)
+                {
+                    var addFloor = revData.Find((obj) => obj.uid == floor.uid);
+                    if (addFloor != null)
+                    {
+                        CurrentSpatial.FloorList.Add(addFloor);
+                        floor = addFloor;
+                    }
+                }
+                var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(CurrentSpatial.FloorList));
+                Common.FileUtlis.Files.WriteFileByBytes(dataSavePath, ssd);
+            }
+            else
+            {
+                Utlis.ShowTip(Language.StringByID(StringId.AddFloorFail) + "\r\nCode:" + revPack.Code);
+            }
+            newFloor = floor;
+            return revPack.Code;
+        }
+        /// <summary>
+        /// 鏇存柊妤煎眰淇℃伅
+        /// </summary>
+        /// <param name="floor"></param>
+        public string UpdateFloor(SpatialInfo floor)
+        {
+            var pm = new HttpServerRequest();
+            var revPack = pm.UpdateRoom(new List<SpatialInfo>() { floor });
+            if (revPack.Code == StateCode.SUCCESS)
+            {
+                var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(FloorList));
+                Common.FileUtlis.Files.WriteFileByBytes(dataSavePath, ssd);
+            }
+            return revPack.Code;
         }
         /// <summary>
         /// 鍒犻櫎妤煎眰
         /// </summary>
         /// <param name="floor"></param>
-        public void DelFloor(Floor floor)
+        public string DelFloor(string floorId)
         {
-            var tRoom = ins_Floor.floors.Find((obj) => obj.uid == floor.uid);
-            if (tRoom != null)
+            if (string.IsNullOrEmpty( floorId))
+                return "";
+            var pm = new HttpServerRequest();
+            var code = pm.DeleteRoom(new List<string>() { floorId }).Code;
+            if (code == StateCode.SUCCESS)
             {
-                ins_Floor.floors.Remove(floor);
-                floor.modifyTime = "";
+                var tRoom = CurrentSpatial.FloorList.Find((obj) => obj.roomId == floorId);
+                if (tRoom != null)
+                {
+                    CurrentSpatial.FloorList.Remove(tRoom);
+                }
+                var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(FloorList));
+                Common.FileUtlis.Files.WriteFileByBytes(dataSavePath, ssd);
             }
-            SaveFloorData();
+            else
+            {
+                Utlis.ShowTip(Language.StringByID(StringId.DeleteFloorFail) + "\r\nCode:" + code);
+            }
+            return code;
         }
 
         #endregion
 
-        public Floor()
+        #region 鎴块棿鍒楄〃
+        /// <summary>
+        /// 鎴块棿鍒楄〃
+        /// </summary>
+        List<Room> rooms;
+        /// <summary>
+        /// 鎴块棿鍒楄〃
+        /// </summary>
+        public List<Room> RoomList
         {
-            roomType = "FLOOR";
-            parentId = DB_ResidenceData.residenceData.CurReginID;
+            get
+            {
+                if (rooms == null)
+                {
+                    try
+                    {
+                        rooms = new List<Room> { };
+                        var filePathList = Common.FileUtlis.Files.ReadFiles();
+
+                        foreach (var filePath in filePathList)
+                        {
+                            if (filePath.StartsWith("RoomData_"))
+                            {
+                                var roomDataBytes = Common.FileUtlis.Files.ReadFile(filePath);
+                                var roomDataString = System.Text.Encoding.UTF8.GetString(roomDataBytes);
+                                var room = Newtonsoft.Json.JsonConvert.DeserializeObject<Room>(roomDataString);
+                                if (room != null)
+                                {
+                                    rooms.Add(room);
+                                }
+                            }
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        MainPage.Log($"鍔熻兘鏁版嵁鍒濆鍖栧け璐ワ細{ex.Message}");
+                    }
+                }
+                return rooms;
+            }
         }
         /// <summary>
-        /// 淇濆瓨妤煎眰鏁版嵁
+        /// 澧炲姞鎴块棿
         /// </summary>
-        public void SaveFloorData()
+        /// <param name="room"></param>
+        public string AddRoom(Room room,out Room newRoom)
         {
-            var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(ins_Floor.floors));
-            FileUtils.WriteFileByBytes(FloorDataSavePath, ssd);
-            MainPage.Log($"Save floor Data");
-            base.SaveSpatialInfo();
+            var pm = new HttpServerRequest();
+            var pack = pm.AddRoom(new List<SpatialInfo>() { room });
+
+            if (pack.Code == StateCode.SUCCESS)
+            {
+                var revData = Newtonsoft.Json.JsonConvert.DeserializeObject<List<SpatialInfo>>(pack.Data.ToString());
+                if (revData != null)
+                {
+                    if (revData.Count > 0)
+                    {
+                        var tempRoom = revData.Find((obj) => obj.uid == room.uid);
+                        if (tempRoom != null)
+                        {
+                            room.roomId = tempRoom.roomId;
+                            CurrentSpatial.RoomList.Add(room);
+                            var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(room));
+                            Common.FileUtlis.Files.WriteFileByBytes(dataSavePath, ssd);
+                        }
+                    }
+                }
+            }
+            newRoom = room;
+            return pack.Code;
+        }
+        /// <summary>
+        /// 鍒犻櫎鎴块棿
+        /// </summary>
+        /// <param name="room"></param>
+        public string DelRoom(Room room)
+        {
+            var pm = new HttpServerRequest();
+            var pack = pm.DeleteRoom(new List<string>() { room.roomId });
+            if (pack.Code == StateCode.SUCCESS)
+            {
+                var tRoom = RoomList.Find((obj) => obj.roomId == room.roomId);
+                if (tRoom != null)
+                {
+                    CurrentSpatial.RoomList.Remove(room);
+                }
+                Common.FileUtlis.Files.DeleteFile(room.dataSavePath);
+            }
+            return pack.Code;
+        }
+        /// <summary>
+        /// 鍒犻櫎鎵�鏈夋埧闂�
+        /// </summary>
+        public void DeleteAllRoom()
+        {
+            foreach(var localRoom in RoomList)
+            {
+                Common.FileUtlis.Files.DeleteFile(localRoom.dataSavePath);
+            }
+            rooms = null;
         }
 
+        public void Clear()
+        {
+            if (_currentSpatial != null)
+            {
+                if (_currentSpatial.floors != null)
+                {
+                    _currentSpatial.floors.Clear();
+                }
+                if (_currentSpatial.rooms != null)
+                {
+                    _currentSpatial.rooms.Clear();
+                }
+                _currentSpatial = null;
+            }
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栨瘡涓埧闂寸殑鍔熻兘鏁版嵁
+        /// </summary>
+        public void InitRoomFunction()
+        {
+            new System.Threading.Thread(() =>
+            {
+                try
+                {
+                    //鍒濆鍖栦綇瀹呮墍鏈夋埧闂村姛鑳芥暟鎹�
+                    foreach (var r in RoomList)
+                    {
+                        r.GetRoomFunctions(true);
+                        r.GetRoomScenes(true);
+                    }
+                }
+                catch (Exception ex)
+                {
+                    MainPage.Log($"Init room function error : {ex.Message}");
+                }
+            })
+            { IsBackground = true }.Start();
+        }
+
+        /// <summary>
+        /// 淇濆瓨鎴块棿鏁版嵁
+        /// </summary>
+        public string SaveRoomData(bool upServer = true)
+        {
+            var packCode = StateCode.SUCCESS;
+            bool needSave = true;
+            if (upServer)
+            {
+                packCode = SaveSpatialInfo().Code;
+            }
+            if (needSave)
+            {
+                var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
+                Common.FileUtlis.Files.WriteFileByBytes(dataSavePath, ssd);
+            }
+            return packCode;
+        }
+        #endregion
+
     }
+
+
 
     [Serializable]
     public class Room : SpatialInfo
@@ -182,14 +492,27 @@
             roomType = "ROOM";
             roomName = "Room";
         }
-        public string backgroundImage = "Classification/Room/Roombg.png";
-        public string roomSavePath
+        //public string backgroundImage = "Classification/Room/Roombg.png";
+        public string backgroundImage
         {
             get
             {
-                return "RoomPath_" + uid;
+                if (string.IsNullOrEmpty(roomImage))
+                {
+                    return "Classification/Room/Roombg.png";
+                }
+                else
+                {
+                    return roomImage;
+                }
+            }
+            set
+            {
+                roomImage = value;
             }
         }
+
+
         /// <summary>
         /// 妤煎眰
         /// </summary>
@@ -198,9 +521,9 @@
         {
             get
             {
-                if (Floor.InsFloor.Floors.Count > 0)
+                if (CurrentSpatial.FloorList.Count > 0)
                 {
-                    var f = Floor.InsFloor.Floors.Find((obj) => obj.uid == parentId);
+                    var f = CurrentSpatial.FloorList.Find((obj) => obj.roomId == parentId);
                     if (f != null)
                     {
                         return f.roomName + " ";
@@ -225,9 +548,9 @@
             }
             if (functions.Count == 0)
             {
-                foreach (var f in DB_ResidenceData.functionList.GetAllFunction())
+                foreach (var f in FunctionList.List.GetDeviceFunctionList())
                 {
-                    if (f.roomIds.Contains(uid) && uid != null)
+                    if (f.roomIds.Contains(roomId) && roomId != null)
                     {
                         functions.Add(f);
                     }
@@ -267,9 +590,9 @@
             }
             if (scenes.Count == 0)
             {
-                foreach (var s in DB_ResidenceData.functionList.scenes)
+                foreach (var s in FunctionList.List.scenes)
                 {
-                    if (s.roomIds.Contains(uid) && uid != null)
+                    if (s.roomIds.Contains(roomId) && roomId != null)
                     {
                         scenes.Add(s);
                     }
@@ -294,16 +617,6 @@
         public void RemoveRoomScene(Scene scene)
         {
             scenes.Remove(scenes.Find((obj) => obj.sid == scene.sid));
-        }
-        /// <summary>
-        /// 淇濆瓨鎴块棿鏁版嵁
-        /// </summary>
-        public void SaveRoomData()
-        {
-            var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
-            FileUtils.WriteFileByBytes(roomSavePath, ssd);
-            MainPage.Log($"Save Room Data {roomName} : {this.uid}");
-            base.SaveSpatialInfo();
         }
     }
   

--
Gitblit v1.8.0