xm
2020-07-14 d87400af518ebc9274f4447f06476959c3aa5102
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlRoomLogic.cs
@@ -61,18 +61,20 @@
            this.dicRooms.Clear();
            //检测我的喜爱这个房间对象
            this.CheckLoveRoom();
            foreach (var roomId in Config.Instance.Home.ListRooms)
            var listFile = HdlFileLogic.Current.GetRootPathListFile();
            foreach (var fileName in listFile)
            {
                //从文件里面获取房间对象
                var room = this.GetRoomByFilePath($"Room_{roomId}.json");
                if (room != null)
                if (fileName.StartsWith("Room_") == true)
                {
                    this.dicRooms[room.Id] = (room);
                    //从文件里面获取房间对象
                    var room = this.GetRoomByFilePath(fileName);
                    if (room != null)
                    {
                        this.dicRooms[room.Id] = (room);
                    }
                }
            }
            //设置当前楼层的ID
            Config.Instance.Home.SetCurrentFloorId();
            //顺便刷新场景
            HdlSceneLogic.Current.ReFreshByLocal();
            //刷新房间视图列表
@@ -84,17 +86,13 @@
        /// </summary>
        public void RefreshAllRoomByLocation()
        {
            var homeTemp = Config.Instance.Home;
            homeTemp.ListRooms.Clear();
            var listFile = Global.FileListByHomeId();
            var listFile = HdlFileLogic.Current.GetRootPathListFile();
            //我的喜爱的房间必须要在第0位才行
            string fRoom = "Room_Favorite.json";
            if (listFile.Contains(fRoom) == true)
            {
                listFile.Remove(fRoom);
                homeTemp.ListRooms.Add("Favorite");
            }
            var listRoomFile = new List<string>();
@@ -103,7 +101,6 @@
                if (fileName.StartsWith("Room_"))
                {
                    string roomId = fileName.Replace("Room_", string.Empty).Replace(".json", string.Empty);
                    homeTemp.ListRooms.Add(roomId);
                    listRoomFile.Add(fileName);
                }
            }
@@ -117,8 +114,7 @@
                this.CheckAdminFloorData(listRoomFile);
            }
            homeTemp.Save(false);
            InitAllRoom();
            this.InitAllRoom();
        }
        /// <summary>
@@ -128,7 +124,7 @@
        {
            Application.RunOnMainThread(() =>
            {
                MainPage.ListRoomViewFrom.Instance?.RefreshListRoom();
                MainPage.LeftListRoomViewFrom.Instance?.RefreshListRoom();
            });
        }
@@ -215,15 +211,12 @@
        /// <param name="rorefreshRoomViewom">是否刷新房间视图列表界面</param>
        public void AddRoom(Room room, bool refreshRoomView = true)
        {
            if (Global.IsExistsByHomeId(room.FileName) == true
                || Config.Instance.Home.ListRooms.Contains(room.Id) == true)
            if (Global.IsExistsByHomeId(room.FileName) == true)
            {
                return;
            }
            //添加到缓存
            this.dicRooms[room.Id] = room;
            //把房间ID添加到住宅
            Config.Instance.Home.AddRoomId(room.Id);
            //生成文件
            room.Save();
            //备份
@@ -243,9 +236,21 @@
        /// 删除房间
        /// </summary>
        /// <param name="roomId">房间ID</param>
        /// <param name="refreshLeftView">是否刷新左滑界面(此变量目前是给删除全部房间用的)</param>
        /// <returns></returns>
        public void RemoveRoom(string roomId)
        public void RemoveRoom(string roomId, bool refreshLeftView = true)
        {
            if (this.NowMainPageRoom != null && this.NowMainPageRoom.Id == roomId)
            {
                //当删除的是主页的房间的时候
                this.NowMainPageRoom = this.GetLoveRoom();
            }
            if (this.NowCategoryRoom != null && this.NowCategoryRoom.Id == roomId)
            {
                //当删除的是分类的房间的时候
                this.NowCategoryRoom = this.GetLoveRoom();
            }
            //根据房间Id,获取房间对象
            var room = this.GetRoomById(roomId);
            if (room == null)
@@ -279,8 +284,6 @@
                }
                loveRoom.Save(false);
            }
            Config.Instance.Home.RemoveRoomId(roomId);
            this.dicRooms.Remove(roomId);
            string roomFilePath = room.FileName;
@@ -293,9 +296,31 @@
            //根据房间ID,移除指定的真实物理设备的所属房间记录
            Common.LocalDevice.Current.DeleteRealDeviceByRoomId(roomId);
            if (refreshLeftView == true)
            {
                //HdlAutoBackupLogic.DeleteFile(roomFilePath);
                //刷新房间视图列表
                this.RefreshRoomListView();
            }
        }
            //刷新房间视图列表
            this.RefreshRoomListView();
        /// <summary>
        /// 删除全部的房间
        /// </summary>
        public void DeleteAllRoom()
        {
            var listRoomId = new List<string>();
            foreach (var room in this.dicRooms.Values)
            {
                if (room.IsLove == false)
                {
                    listRoomId.Add(room.Id);
                }
            }
            foreach (var roomId in listRoomId)
            {
                this.RemoveRoom(roomId, false);
            }
        }
        #endregion
@@ -357,7 +382,7 @@
        public string GetRoomNameByDevice(CommonDevice device)
        {
            var room = this.GetRoomByDevice(device);
            return this.GetFloorRoomName(room);
            return this.GetRoomName(room);
        }
        /// <summary>
@@ -365,7 +390,7 @@
        /// </summary>
        /// <returns>房间名</returns>
        /// <param name="room">房间对象</param>
        public string GetFloorRoomName(Room room)
        public string GetRoomName(Room room)
        {
            if (room == null)
            {
@@ -466,7 +491,7 @@
                    }
                }
            }
            return listRoom;
            return this.SortRoom(listRoom);
        }
        /// <summary>
@@ -480,36 +505,7 @@
            {
                listRoom.Add(room);
            }
            return listRoom;
        }
        /// <summary>
        /// 获取当前楼层的房间名称
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public List<string> GetRoomNamesByFloorId(string id)
        {
            var listName = new List<string>();
            if (Config.Instance.Home.FloorDics.Count == 0)
            {
                //没有楼层
                foreach (var room in this.dicRooms.Values)
                {
                    listName.Add(room.Name);
                }
            }
            else
            {
                foreach (var room in this.dicRooms.Values)
                {
                    if (room.FloorId == id)
                    {
                        listName.Add(room.Name);
                    }
                }
            }
            return listName;
            return this.SortRoom(listRoom);
        }
        /// <summary>
@@ -541,17 +537,10 @@
                    }
                }
            }
            listRoom = this.SortRoom(listRoom);
            listRoom.Insert(0, GetLoveRoom());
            return listRoom;
        }
        /// <summary>
        /// 获取当前楼层的房间(拼接了【常用】在第一位)
        /// </summary>
        /// <returns></returns>
        public List<Room> GetRoomsByCurrentFloorIdAppendLoveRoom()
        {
            return this.GetRoomsByFloorIdAppendLoveRoom(Config.Instance.Home.CurrentFloorId);
        }
        #endregion
@@ -574,7 +563,7 @@
                //移除我的喜爱
                this.DeleteLoveDevice(device);
                //设备改变房间的话,主页需要重新刷新
                UserView.UserPage.Instance.RefreshForm = true;
                UserView.UserPage.Instance.RefreshAllForm = true;
                return;
            }
            //房间是否修改
@@ -592,7 +581,7 @@
                this.AddDevice(room, device, saveRealRoom);
            }
            //设备改变房间的话,主页需要重新刷新
            UserView.UserPage.Instance.RefreshForm = true;
            UserView.UserPage.Instance.RefreshAllForm = true;
        }
        /// <summary>
@@ -609,25 +598,6 @@
                return true;
            }
            return false;
        }
        /// <summary>
        /// 获取房间所在区域
        /// 楼层,房间名
        /// </summary>
        /// <returns></returns>
        public string GetZoneName(Room i_room)
        {
            if (string.IsNullOrEmpty(i_room.FloorId))
            {
                return i_room.Name;
            }
            var floorName = HdlResidenceLogic.Current.GetFloorNameById(i_room.FloorId);
            if (floorName == null)
            {
                return i_room.Name;
            }
            return $"{floorName},{i_room.Name}";
        }
        #endregion
@@ -684,6 +654,8 @@
                    //保存到本地
                    loveRoom.ListDevice.Add(mainkeys);
                    loveRoom.Save();
                    //添加收藏设备时,需要刷新主页
                    UserView.UserPage.Instance.RefreshAllForm = true;
                }
            }
        }
@@ -747,6 +719,8 @@
                loveRoom.Save();
                //更改自动备份
                HdlAutoBackupLogic.AddOrEditorFile(loveRoom.FileName);
                //添加收藏设备时,需要刷新主页
                UserView.UserPage.Instance.RefreshAllForm = true;
            }
        }
@@ -935,85 +909,87 @@
            {
                i_floorKeys = string.Empty;
            }
            Dictionary<string, List<string>> dicAllSort = new Dictionary<string, List<string>>();
            //读取房间顺序
            string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.RoomSortFile);
            var strData = UserCenterLogic.LoadFileContent(fullName);
            if (strData != null)
            {
                dicAllSort = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, List<string>>>(strData);
            }
            var listRoomSort = new List<string>();
            if (dicAllSort.ContainsKey(i_floorKeys) == true)
            {
                listRoomSort = dicAllSort[i_floorKeys];
            }
            else
            {
                dicAllSort[i_floorKeys] = listRoomSort;
            }
            var dicRoom = new Dictionary<string, Common.Room>();
            var listRoom = new List<Room>();
            foreach (var room in this.dicRooms.Values)
            {
                if (room.FloorId != i_floorKeys && i_floorKeys != string.Empty)
                if (room.FloorId != i_floorKeys && i_floorKeys != string.Empty
                    || room.IsLove == true)
                {
                    //不是同一个楼层
                    //不是同一个楼层,不要我的喜爱
                    continue;
                }
                if (room.IsLove == true)
                {
                    //不要我的喜爱
                    continue;
                }
                if (listRoomSort.Contains(room.Id) == false)
                {
                    //新添加的房间
                    listRoomSort.Add(room.Id);
                }
                if (getShard == false && room.IsSharedRoom == true)
                {
                    //不要分享的房间
                    continue;
                }
                dicRoom[room.Id] = room;
                listRoom.Add(room);
            }
            var listSortRoom = new List<Room>();
            for (int i = 0; i < listRoomSort.Count; i++)
            {
                if (dicRoom.ContainsKey(listRoomSort[i]) == true)
                {
                    listSortRoom.Add(dicRoom[listRoomSort[i]]);
                }
            }
            //保存顺序
            UserCenterLogic.SaveFileContent(fullName, dicAllSort);
            return listSortRoom;
            return this.SortRoom(listRoom);
        }
        /// <summary>
        /// 保存房间的顺序
        /// 排序房间对象
        /// </summary>
        /// <param name="i_floorKeys">楼层主键</param>
        /// <param name="listSort">房间顺序(房间的主键)</param>
        public void SaveRoomSort(string i_floorKeys, List<string> listSort)
        /// <param name="listRoom"></param>
        /// <returns></returns>
        public List<Room> SortRoom(List<Room> listRoom)
        {
            Dictionary<string, List<string>> dicAllSort = new Dictionary<string, List<string>>();
            //读取房间顺序
            string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.RoomSortFile);
            var strData = UserCenterLogic.LoadFileContent(fullName);
            if (strData != null)
            //从一堆文字中,获取这一堆文字里面数字字符串的最长长度
            var listName = new List<string>();
            foreach (var room in listRoom)
            {
                dicAllSort = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, List<string>>>(strData);
                listName.Add(room.Name);
            }
            int numberLength = this.GetNumberMaxLength(listName);
            //保存顺序
            dicAllSort[i_floorKeys] = listSort;
            UserCenterLogic.SaveFileContent(fullName, dicAllSort);
            dicAllSort.Clear();
            var listSort = new List<string[]>();
            foreach (var room in listRoom)
            {
                var strArry = new string[2];
                strArry[0] = room.Id;
                strArry[1] = string.Empty;
                string value = string.Empty;
                foreach (var c in room.Name)
                {
                    if (char.IsNumber(c) == true)
                    {
                        //数字
                        value += c.ToString();
                        continue;
                    }
                    else if (value != string.Empty)
                    {
                        //如果房间名字带有数字的话,则左边加零,因为这里有个排序的问题
                        strArry[1] += value.PadLeft(numberLength, '0');
                        value = string.Empty;
                    }
                    strArry[1] += c.ToString();
                }
                if (value != string.Empty)
                {
                    //以数字结尾的话
                    strArry[1] += value.PadLeft(numberLength, '0');
                }
                listSort.Add(strArry);
            }
            //排序
            listSort.Sort((obj1, obj2) =>
            {
                if (obj1[1].CompareTo(obj2[1]) > 0)
                {
                    return 1;
                }
                return -1;
            });
            var listSortRoom = new List<Room>();
            foreach (var strArry in listSort)
            {
                var room = this.GetRoomById(strArry[0]);
                listSortRoom.Add(room);
            }
            return listSortRoom;
        }
        /// <summary>
@@ -1022,46 +998,66 @@
        /// <returns></returns>
        public Dictionary<string, string> GetFloorSortList()
        {
            //读取楼层顺序
            var listFloorSort = new List<string>();
            string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.FloorSortFile);
            var strData = UserCenterLogic.LoadFileContent(fullName);
            if (strData != null)
            //没有楼层
            if (Config.Instance.Home.FloorDics.Count == 0)
            {
                listFloorSort = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(strData);
                return new Dictionary<string, string>();
            }
            foreach (string keys in Common.Config.Instance.Home.FloorDics.Keys)
            //从一堆文字中,获取这一堆文字里面数字字符串的最长长度
            var listName = new List<string>();
            foreach (var floorName in Config.Instance.Home.FloorDics.Values)
            {
                if (listFloorSort.Contains(keys) == false)
                {
                    //新添加的楼层
                    listFloorSort.Add(keys);
                }
                listName.Add(floorName);
            }
            int numberLength = this.GetNumberMaxLength(listName);
            var listSort = new List<string[]>();
            foreach (var floorId in Config.Instance.Home.FloorDics.Keys)
            {
                var strArry = new string[2];
                strArry[0] = floorId;
                strArry[1] = string.Empty;
                string value = string.Empty;
                string floorName = Config.Instance.Home.FloorDics[floorId];
                foreach (var c in floorName)
                {
                    if (char.IsNumber(c) == true)
                    {
                        //数字
                        value += c.ToString();
                        continue;
                    }
                    else if (value != string.Empty)
                    {
                        //如果房间名字带有数字的话,则左边加零,因为这里有个排序的问题
                        strArry[1] += value.PadLeft(numberLength, '0');
                        value = string.Empty;
                    }
                    strArry[1] += c.ToString();
                }
                if (value != string.Empty)
                {
                    //以数字结尾的话
                    strArry[1] += value.PadLeft(numberLength, '0');
                }
                listSort.Add(strArry);
            }
            //楼层排序
            listSort.Sort((obj1, obj2) =>
            {
                if (obj1[1].CompareTo(obj2[1]) > 0)
                {
                    return 1;
                }
                return -1;
            });
            var dic = new Dictionary<string, string>();
            for (int i = 0; i < listFloorSort.Count; i++)
            foreach (var strArry in listSort)
            {
                if (Config.Instance.Home.FloorDics.ContainsKey(listFloorSort[i]) == true)
                {
                    dic[listFloorSort[i]] = Config.Instance.Home.FloorDics[listFloorSort[i]];
                }
                dic[strArry[0]] = Config.Instance.Home.FloorDics[strArry[0]];
            }
            //保存顺序
            UserCenterLogic.SaveFileContent(fullName, listFloorSort);
            return dic;
        }
        /// <summary>
        /// 保存楼层的顺序
        /// </summary>
        /// <param name="listSort">楼层的主键</param>
        public void SaveFloorSort(List<string> listSort)
        {
            string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.FloorSortFile);
            //保存顺序
            UserCenterLogic.SaveFileContent(fullName, listSort);
        }
        #endregion
@@ -1094,24 +1090,78 @@
        #region ■ 一般方法___________________________
        /// <summary>
        /// 获取房间总数
        /// </summary>
        /// <returns></returns>
        public int GetRoomCount()
        {
            return this.dicRooms.Count;
        }
        /// <summary>
        /// 检测我的喜爱这个房间对象
        /// </summary>
        private void CheckLoveRoom()
        {
            if (Config.Instance.Home.ListRooms.Contains("Favorite") == false)
            if (this.dicRooms.ContainsKey("Favorite") == true)
            {
                return;
            }
            //读取本地我的喜爱文件
            string favoriteFile = System.IO.Path.Combine(Common.Config.Instance.FullPath, "Room_Favorite.json");
            var fileContent = HdlFileLogic.Current.ReadFileTextContent(favoriteFile);
            if (fileContent != null)
            {
                var love = Newtonsoft.Json.JsonConvert.DeserializeObject<Room>(fileContent);
                this.dicRooms["Favorite"] = love;
            }
            else
            {
                //默认添加喜爱的房间--禁止修改房间名
                var love = new Room { Name = Language.StringByID(R.MyInternationalizationString.Favorite), BackgroundImage = "RoomIcon/0.jpg", Id = "Favorite" };
                love.Save(false);
                //添加到house 房间路径列表
                var currentHome = Config.Instance.Home;
                currentHome.ListRooms.Insert(0, love.Id);
                currentHome.Save(false);
                this.dicRooms["Favorite"] = love;
            }
        }
        /// <summary>
        /// 从一堆文字中,获取这一堆文字里面数字字符串的最长长度
        /// </summary>
        /// <param name="listText"></param>
        /// <returns></returns>
        private int GetNumberMaxLength(List<string> listText)
        {
            int maxLength = 0;
            foreach (var text in listText)
            {
                string value = string.Empty;
                foreach (var c in text)
                {
                    if (char.IsNumber(c) == true)
                    {
                        //数字
                        value += c.ToString();
                        continue;
                    }
                    else if (value != string.Empty)
                    {
                        //判断数字长度
                        if (maxLength <= value.Length)
                        {
                            maxLength = value.Length;
                        }
                        value = string.Empty;
                    }
                }
                //判断数字长度
                if (maxLength <= value.Length)
                {
                    maxLength = value.Length;
                }
            }
            return maxLength;
        }
        #endregion
    }
}