From 64dbbfe1d6488635e160189a704afccffc7d34d0 Mon Sep 17 00:00:00 2001
From: wxr <464027401@qq.com>
Date: 星期一, 07 十二月 2020 11:33:06 +0800
Subject: [PATCH] Merge branch 'WJC'

---
 HDL_ON/Entity/Room.cs |  600 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 566 insertions(+), 34 deletions(-)

diff --git a/HDL_ON/Entity/Room.cs b/HDL_ON/Entity/Room.cs
index 7884d78..f38f8fc 100644
--- a/HDL_ON/Entity/Room.cs
+++ b/HDL_ON/Entity/Room.cs
@@ -1,67 +1,599 @@
 锘縰sing System;
 using System.Collections.Generic;
+using HDL_ON.DAL.Server;
 
 namespace HDL_ON.Entity
 {
-
     /// <summary>
-    /// 鎴块棿瀵硅薄
-    /// 鎴块棿鍛藉悕瑙勫垯 typeof (Room).Name + "_" + etNameBox.Text.Trim ();
+    /// 璇诲彇鏈嶅姟鍣ㄧ┖闂翠俊鎭繑鍥炲埌鏁版嵁鍖�
     /// </summary>
-    [System.Serializable]
-    public class Room
+    public class SpatialApiPack
     {
+        public List<SpatialInfo> list = new List<SpatialInfo>();
+
+        public string totalCount = "0";
+
+        public string totalPage = "0";
+
+        public string pageNo = "0";
+
+        public string pageSize = "0";
+
+    }
+    /// <summary>
+    /// 绌洪棿淇℃伅鍩虹绫�
+    /// 鍖呭惈妤煎眰/鎴块棿
+    /// </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.residenceData.CurReginID;
+        }
+
+        public string roomId = "";
+        public string roomName = "";
+        //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>
-        /// 鎴块棿鍚�
+        /// 鍒犻櫎鏍囪
+        /// 闇�瑕佸垹闄ゆ暟鎹椂锛屾爣璁颁负锛歵rue
+        /// 鐢变簯绔垹闄ゆ垚鍔熶箣鍚庯紝杩斿洖鏁版嵁鍐嶆竻闄ゆ湰鍦版暟鎹�
         /// </summary>
-        public string name = "Room";
-        /// <summary>
-        /// 鎴块棿ID
-        /// </summary>
-        public string sid;
-        /// <summary>
-        /// 妤煎眰绱㈠紩
-        /// </summary>
-        public int floorIndex = -1;
+        public bool DeleteSign = false;
+
+
+        protected void SaveSpatialInfo()
+        {
+            var pm = new HttpServerRequest();
+            if (string.IsNullOrEmpty(createTime) && string.IsNullOrEmpty(modifyTime))
+            {
+                pm.AddRoom(new List<SpatialInfo>() { this });
+            }
+            else if (string.IsNullOrEmpty(createTime) && !string.IsNullOrEmpty(modifyTime))
+            {
+                pm.DeleteRoom(new List<string>() { roomId });
+            }
+            else if (!string.IsNullOrEmpty(createTime) && !string.IsNullOrEmpty(modifyTime))
+            {
+                pm.UpdateRoom(new List<SpatialInfo>() { this });
+            }
+        }
 
         /// <summary>
-        /// 鎴块棿鑳屾櫙
+        /// 涓嬭浇浜戠鎴块棿鏁版嵁
         /// </summary>
-        public string backgroundImage = "Classification/Room/Roombg.png";
+        public void DownloadRoomList()
+        {
+            new System.Threading.Thread(() =>
+            {
+                var pm = new HttpServerRequest();
+                var pack = pm.GetRoomList();
+                if (pack.Code == StateCode.SUCCESS)
+                {
+                    var revData = Newtonsoft.Json.JsonConvert.DeserializeObject<SpatialApiPack>(pack.Data.ToString());
+                    if (revData != null)
+                    {
+                        CurrentSpatial.UpdateSpatialList(revData.list, OptionType.Cover);
+                    }
+                }
+                else
+                {
+                    MainPage.Log($"璇诲彇鎴块棿鏁版嵁澶辫触:\r\nCode:{pack.Code}; msg:{pack.message}");
+                }
+            })
+            { IsBackground = true }.Start();
+        }
+
+        /// <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)
+                {
+                    foreach (var updateTemp in roomUpdateList)
+                    {
+                        var localDelRoom = CurrentSpatial.needDeleteRooms.Find((obj) => obj.roomId == updateTemp.roomId);
+                        if(localDelRoom!= null)
+                        {
+                                    DelRoom(localDelRoom);
+                           
+                            continue;
+                        }
+                        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();
+                            }
+                        }else
+                        {
+                            updateTemp.SaveRoomData();
+                        }
+                    }
+                }
+                else if (optionType == OptionType.Cover)
+                {
+                    CurrentSpatial.DeleteAllRoom();
+                    foreach(var newRoom in roomUpdateList)
+                    {
+                        newRoom.SaveRoomData();
+                        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;
+                        }
+                    }
+                    CurrentSpatial.SaveFloorData();
+                }
+                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));
+                    FileUtils.WriteFileByBytes(dataSavePath, ssd);
+                }
+            }
+        }
+
+        #region 妤煎眰鍒楄〃
+        /// <summary>
+        /// 妤煎眰鍒楄〃
+        /// </summary>
+        List<SpatialInfo> floors;
+        /// <summary>
+        /// 妤煎眰鍒楄〃
+        /// </summary>
+        public List<SpatialInfo> FloorList
+        {
+            get
+            {
+                if (floors == null)
+                {
+                    try
+                    {
+                        var floorsDataBytes = FileUtils.ReadFile("FloorsData");
+                        if (floorsDataBytes != null)
+                        {
+                            var floorsDataString = System.Text.Encoding.UTF8.GetString(floorsDataBytes);
+                            MainPage.Log(floorsDataString);
+                            floors = Newtonsoft.Json.JsonConvert.DeserializeObject<List<SpatialInfo>>(floorsDataString);
+                            if (floors == null)
+                            {
+                                floors = new List<SpatialInfo>();
+                            }
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        MainPage.Log($"妤煎眰鏁版嵁鍒濆鍖栧け璐ワ細{ex.Message}");
+                    }
+                }
+                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(SpatialInfo floor)
+        {
+            FloorList.Add(floor);
+            SaveFloorData();
+        }
+        /// <summary>
+        /// 鏇存柊妤煎眰淇℃伅
+        /// </summary>
+        /// <param name="floor"></param>
+        public void UpdateFloor()
+        {
+            SaveFloorData();
+        }
+        /// <summary>
+        /// 鍒犻櫎妤煎眰
+        /// </summary>
+        /// <param name="floor"></param>
+        public void DelFloor(SpatialInfo floor)
+        {
+            var tRoom = FloorList.Find((obj) => obj.uid == floor.uid);
+            if (tRoom != null)
+            {
+                FloorList.Remove(floor);
+                floor.DeleteSign = true;
+            }
+            SaveFloorData();
+        }
+
+        /// <summary>
+        /// 淇濆瓨妤煎眰鏁版嵁
+        /// </summary>
+        void SaveFloorData()
+        {
+            var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(FloorList));
+            FileUtils.WriteFileByBytes(dataSavePath, ssd);
+            MainPage.Log($"Save floor Data");
+            SaveSpatialInfo();
+        }
+
+
+        #endregion
+
+        #region 鎴块棿鍒楄〃
+        /// <summary>
+        /// 鎴块棿鍒楄〃
+        /// </summary>
+        List<Room> rooms;
+        /// <summary>
+        /// 鎴块棿鍒楄〃
+        /// </summary>
+        public List<Room> RoomList
+        {
+            get
+            {
+                if (rooms == null)
+                {
+                    try
+                    {
+                        rooms = new List<Room> { };
+                        var filePathList = FileUtils.ReadFiles();
+
+                        foreach (var filePath in filePathList)
+                        {
+                            if (filePath.StartsWith("RoomData_"))
+                            {
+                                var roomDataBytes = FileUtils.ReadFile(filePath);
+                                var roomDataString = System.Text.Encoding.UTF8.GetString(roomDataBytes);
+                                var room = Newtonsoft.Json.JsonConvert.DeserializeObject<Room>(roomDataString);
+                                if (room != null )
+                                {
+                                    if(room.DeleteSign)
+                                    {
+                                        needDeleteRooms.Add(room);
+                                    }else
+                                    {
+                                        rooms.Add(room);
+                                    }
+                                }
+                            }
+                        }
+                        if(needDeleteRooms.Count>0)
+                        {
+                            //鍒犻櫎宸茬粡鏍囪闇�瑕佸垹闄ょ殑鎴块棿
+                            new System.Threading.Thread(() =>
+                            {
+                                var delIds = new List<string>();
+                                foreach(var delTemp in needDeleteRooms)
+                                {
+                                    delIds.Add(delTemp.roomId);
+                                }
+                                var pm = new HttpServerRequest();
+                                var pack = pm.DeleteRoom(delIds);
+                                if (pack.Code == StateCode.SUCCESS)
+                                {
+                                    foreach (var delTemp in needDeleteRooms)
+                                    {
+                                        FileUtils.DeleteFile(delTemp.dataSavePath);
+                                    }
+                                    needDeleteRooms.Clear();
+                                }
+                            })
+                            { IsBackground = true }.Start();
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        MainPage.Log($"鍔熻兘鏁版嵁鍒濆鍖栧け璐ワ細{ex.Message}");
+                    }
+                }
+                return rooms;
+            }
+        }
+        /// <summary>
+        /// 闇�瑕佸垹闄ょ殑鎴块棿
+        /// 鏈湴鏍囪鍒犻櫎浜嗭紝浣嗘槸鏈嶅姟涓婃病鏈夊垹闄�
+        /// 鏃犳硶涓庢湇鍔″櫒閫氳閫犳垚鍒犻櫎涓嶆垚鍔燂紝閫氳鎴愬姛涔嬪悗瑕侀噸鏂板垹闄�
+        /// </summary>
+        List<Room> needDeleteRooms = new List<Room>();
+        /// <summary>
+        /// 澧炲姞鎴块棿
+        /// </summary>
+        /// <param name="room"></param>
+        public void AddRoom(Room room)
+        {
+            RoomList.Add(room);
+            room.SaveRoomData();
+        }
+        /// <summary>
+        /// 鍒犻櫎鎴块棿
+        /// </summary>
+        /// <param name="room"></param>
+        public void DelRoom(Room room)
+        {
+            new System.Threading.Thread(() =>
+            {
+                room.DeleteSign = true;
+                room.SaveRoomData();
+                var tRoom = RoomList.Find((obj) => obj.uid == room.uid);
+                if (tRoom != null)
+                {
+                    RoomList.Remove(room);
+                }
+                var temp = needDeleteRooms.Find((obj) => obj.uid == room.uid);
+                if (temp != null)
+                {
+                    needDeleteRooms.Add(room);
+                }
+                var pm = new HttpServerRequest();
+                var pack = pm.DeleteRoom(new List<string>() { room.roomId });
+                if (pack.Code == StateCode.SUCCESS)
+                {
+                    FileUtils.DeleteFile(room.dataSavePath);
+                    needDeleteRooms.Remove(room);
+                }
+            })
+            { IsBackground = true }.Start();
+        }
+        /// <summary>
+        /// 鍒犻櫎鎵�鏈夋埧闂�
+        /// </summary>
+        public void DeleteAllRoom()
+        {
+            foreach(var localRoom in RoomList)
+            {
+                FileUtils.DeleteFile(localRoom.dataSavePath);
+            }
+            RoomList.Clear();
+        }
+        /// <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 void SaveRoomData()
+        {
+            var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
+            FileUtils.WriteFileByBytes(dataSavePath, ssd);
+            MainPage.Log($"Save Room Data {roomName} : {uid}");
+            SaveSpatialInfo();
+        }
+        #endregion
+
+    }
+
+
+
+    [Serializable]
+    public class Room : SpatialInfo
+    {
+        public Room()
+        {
+            roomType = "ROOM";
+            roomName = "Room";
+        }
+        //public string backgroundImage = "Classification/Room/Roombg.png";
+        public string backgroundImage
+        {
+            get
+            {
+                if (string.IsNullOrEmpty(roomImage))
+                {
+                    return "Classification/Room/Roombg.png";
+                }
+                else
+                {
+                    return roomImage;
+                }
+            }
+            set
+            {
+                roomImage = value;
+            }
+        }
+
+
         /// <summary>
         /// 妤煎眰
         /// </summary>
-        public string floor {
+        [Newtonsoft.Json.JsonIgnore]
+        public string floorName
+        {
             get
             {
-                string str = "";
-                if (floorIndex != -1)
+                if (FloorList.Count > 0)
                 {
-                    if (floorIndex < DB_ResidenceData.residenceData.floors.Count)
-                        str = DB_ResidenceData.residenceData.floors[floorIndex];
+                    var f = FloorList.Find((obj) => obj.uid == parentId);
+                    if (f != null)
+                    {
+                        return f.roomName + " ";
+                    }
                 }
-                return str;
+                return "";
             }
         }
-       
 
         /// <summary>
         /// 鎴块棿鍔熻兘鍒楄〃
         /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public List<Function> functions = new List<Function>();
-
-        public void RefreshFunctions()
+        List<Function> functions = new List<Function>();
+        /// <summary>
+        /// 鑾峰彇鎴块棿鍔熻兘鍒楄〃
+        /// </summary>
+        public List<Function> GetRoomFunctions(bool needRefresh)
         {
-            List<Function> funcList = new List<Function>();
-            foreach (var f in DB_ResidenceData.residenceData.functionList.functions)
+            if (needRefresh)
             {
-                if (f.roomIdList.Contains(sid) && sid != null)
+                functions = new List<Function>();
+            }
+            if (functions.Count == 0)
+            {
+                foreach (var f in DB_ResidenceData.functionList.GetAllFunction())
                 {
-                    funcList.Add(f);
+                    if (f.roomIds.Contains(uid) && uid != null)
+                    {
+                        functions.Add(f);
+                    }
                 }
             }
-            functions = funcList;
+            return functions;
+        }
+        /// <summary>
+        /// 澧炲姞鎴块棿鍔熻兘
+        /// 鎿嶄綔鐨勬槸缂撳瓨鏁版嵁锛屼笉鐢ㄤ繚瀛�
+        /// </summary>
+        public void AddRoomFunction(Function function)
+        {
+            functions.Add(function);
+        }
+        /// <summary>
+        /// 鍒犻櫎鎴块棿鍔熻兘
+        /// 鎿嶄綔鐨勬槸缂撳瓨鏁版嵁锛屼笉鐢ㄤ繚瀛�
+        /// </summary>
+        public void RemoveRoomFunction(Function function)
+        {
+            functions.Remove(functions.Find((obj) => obj.sid == function.sid));
+        }
+        /// <summary>
+        /// 鎴块棿鍦烘櫙鍒楄〃
+        /// </summary>
+        List<Scene> scenes = new List<Scene>();
+        /// <summary>
+        /// 鑾峰彇鍦烘櫙鍒楄〃
+        /// </summary>
+        /// <returns></returns>
+        public List<Scene> GetRoomScenes(bool needRefresh)
+        {
+            if (needRefresh)
+            {
+                scenes = new List<Scene>();
+            }
+            if (scenes.Count == 0)
+            {
+                foreach (var s in DB_ResidenceData.functionList.scenes)
+                {
+                    if (s.roomIds.Contains(uid) && uid != null)
+                    {
+                        scenes.Add(s);
+                    }
+                }
+            }
+            return scenes;
+        }
+        /// <summary>
+        /// 澧炲姞鎴块棿鍦烘櫙
+        /// 鎿嶄綔鐨勬槸缂撳瓨鏁版嵁锛屼笉鐢ㄤ繚瀛�
+        /// </summary>
+        /// <param name="scene"></param>
+        public void AddRoomScene(Scene scene)
+        {
+            scenes.Add(scene);
+        }
+        /// <summary>
+        /// 绉婚櫎鎴块棿鍦烘櫙
+        /// 鎿嶄綔鐨勬槸缂撳瓨鏁版嵁锛屼笉鐢ㄤ繚瀛�
+        /// </summary>
+        /// <param name="scene"></param>
+        public void RemoveRoomScene(Scene scene)
+        {
+            scenes.Remove(scenes.Find((obj) => obj.sid == scene.sid));
         }
     }
-}
+  
+}
\ No newline at end of file

--
Gitblit v1.8.0