wxr
2021-07-01 43b0d5870d528f23ecd6aeceb6cfd4325188b46f
HDL_ON/Entity/Room.cs
@@ -1,66 +1,572 @@
using System;
using System.Collections.Generic;
using HDL_ON.DAL.Server;
using Shared;
namespace HDL_ON.Entity
{
    /// <summary>
    /// 房间对象
    /// 房间命名规则 typeof (Room).Name + "_" + etNameBox.Text.Trim ();
    /// 读取服务器空间信息返回到数据包
    /// </summary>
    [System.Serializable]
    public class Room
    public class SpatialApiPack
    {
        /// <summary>
        /// 房间名
        /// </summary>
        public string name = "Room";
        /// <summary>
        /// 房间ID
        /// </summary>
        public string sid;
        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.Instance.CurrentRegion.id;
        }
        public string homeId = "";
        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 floorRoomName = "";
        public string createTime = "";
        public string modifyTime = "";
        ///// <summary>
        ///// 删除标记 20201208:可欣:APP的在线和离线问题,刚刚确定了,离线无法编辑,只能控制
        ///// 需要删除数据时,标记为:true
        ///// 由云端删除成功之后,返回数据再清除本地数据
        ///// </summary>
        //public bool DeleteSign = false;
        /// <summary>
        /// 房间背景
        /// 更新空间信息
        /// </summary>
        public string backgroundImage = "Classification/Room/Roombg.png";
        /// <param name="spatials">空间信息</param>
        /// <param name="optionType">操作类型:ADD/UPDATE/DELETE</param>
        public void UpdateSpatialList(List<SpatialInfo> spatials)
        {
            var roomUpdateList = spatials.FindAll((obj) => obj.roomType == "ROOM");
            var floorUpdateList = spatials.FindAll((obj) => obj.roomType == "FLOOR");
            CurrentSpatial.DeleteAllRoom();
            FloorList.Clear();
            //处理房间列表
            if (roomUpdateList != null && roomUpdateList.Count > 0)
            {
                foreach (var newRoom in roomUpdateList)
                {
                    newRoom.SaveRoomFile();
                    RoomList.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<Room>(
                        Newtonsoft.Json.JsonConvert.SerializeObject(newRoom)));
                }
            }
            //楼层房间列表
            if (floorUpdateList != null && floorUpdateList.Count > 0)
            {
                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);
            }
        }
        #region 楼层列表
        /// <summary>
        /// 楼层列表
        /// </summary>
        List<SpatialInfo> floors;
        /// <summary>
        /// 楼层列表
        /// </summary>
        public List<SpatialInfo> FloorList
        {
            get
            {
                if (MainPage.NoLoginMode)
                {
                    if (floors == null)
                    {
                        floors = new List<SpatialInfo>();
                    }
                    return floors;
                }
                if (floors == null)
                {
                    try
                    {
                        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<SpatialInfo>>(floorsDataString);
                        }
                        if(floors == null)
                        {
                            floors = new List<SpatialInfo>();
                        }
                    }
                    catch (Exception ex)
                    {
                            floors = new List<SpatialInfo>();
                        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 string AddFloor(SpatialInfo floor, out SpatialInfo newFloor)
        {
            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 string DelFloor(string floorId)
        {
            if (string.IsNullOrEmpty( floorId))
                return "";
            var pm = new HttpServerRequest();
            var code = pm.DeleteRoom(new List<string>() { floorId }).Code;
            if (code == StateCode.SUCCESS)
            {
                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);
            }
            else
            {
                Utlis.ShowTip(Language.StringByID(StringId.DeleteFloorFail) + "\r\nCode:" + code);
            }
            return code;
        }
        #endregion
        #region 房间列表
        /// <summary>
        /// 房间列表
        /// </summary>
        List<Room> rooms;
        /// <summary>
        /// 房间列表
        /// </summary>
        public List<Room> RoomList
        {
            get
            {
                if(MainPage.NoLoginMode )
                {
                    if (rooms == null)
                    {
                        rooms = new List<Room>();
                    }
                    return rooms;
                }
                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>
        /// <param name="room"></param>
        public string AddRoom(Room room,out Room newRoom)
        {
            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()
        {
            for(int i=0;i< RoomList.Count;)
            {
                Common.FileUtlis.Files.DeleteFile(RoomList[i].dataSavePath);
                RoomList.RemoveAt(i);
            }
            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 InitRoomListFunctions()
        {
            new System.Threading.Thread(() =>
            {
                try
                {
                    //初始化住宅所有房间功能数据
                    foreach (var r in RoomList)
                    {
                        InitRoomFuntion(r);
                    }
                }
                catch (Exception ex)
                {
                    MainPage.Log($"Init room function error : {ex.Message}");
                }
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 初始化房间功能
        /// </summary>
        /// <param name="tempRoom"></param>
        public void InitRoomFuntion(Room tempRoom)
        {
            tempRoom.GetRoomFunctions(true);
            tempRoom.GetRoomScenes(true);
        }
        /// <summary>
        /// 保存房间数据文件
        /// </summary>
        public void SaveRoomFile()
        {
            var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
            Common.FileUtlis.Files.WriteFileByBytes(dataSavePath, ssd);
        }
        /// <summary>
        /// 更新房间数据
        /// </summary>
        public void UpdataRoomInfo()
        {
            new System.Threading.Thread(() =>
            {
                var pm = new HttpServerRequest();
                var pack = pm.UpdateRoom(new List<SpatialInfo>() { this });
                this.SaveRoomFile();
                if (pack.Code != StateCode.SUCCESS)
                {
                    IMessageCommon.Current.ShowErrorInfoAlter(pack.Code);
                }
            })
            { IsBackground = true }.Start();
        }
        #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 (CurrentSpatial.FloorList.Count > 0)
                {
                    if (floorIndex < DB_ResidenceData.residenceData.floors.Count)
                        str = DB_ResidenceData.residenceData.floors[floorIndex];
                    var f = CurrentSpatial.FloorList.Find((obj) => obj.uid == parentId);
                    if (f != null)
                    {
                        return f.roomName + " ";
                    }
                }
                return str;
                return "";
            }
        }
        /// <summary>
        /// 楼层索引
        /// </summary>
        public int floorIndex = -1;
        ///// <summary>
        ///// 房间功能列表
        ///// </summary>
        //List<Function> functions = new List<Function>();
        /// <summary>
        /// 房间功能列表
        /// 获取房间功能列表
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public List<Function> functionData = new List<Function>();
        public void RefreshFunctions()
        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))
            }
            var functions = new List<Function>();
            if (functions.Count == 0)
            {
                foreach (var f in FunctionList.List.GetDeviceFunctionList())
                {
                    funcList.Add(f);
                    if (f.roomIds.Contains(roomId) && roomId != null)
                    {
                        functions.Add(f);
                    }
                }
            }
            functionData = 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 FunctionList.List.scenes)
                {
                    if (s.roomIds.Contains(roomId) && roomId != 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));
        }
    }
}
}