using Shared.Common; using System; using System.Collections.Generic; using System.Text; using ZigBee.Device; namespace Shared.Phone.UserCenter { /// /// 房间的逻辑 /// public class HdlRoomLogic { #region ■ 变量声明___________________________ /// /// 房间的逻辑 /// private static HdlRoomLogic m_Current = null; /// /// 房间的逻辑 /// public static HdlRoomLogic Current { get { if (m_Current == null) { m_Current = new HdlRoomLogic(); } return m_Current; } } /// /// 当前主页选择的房间对象 /// public Room NowMainPageRoom = null; /// /// 当前分类选择的房间对象 /// public Room NowCategoryRoom = null; /// /// 所有的房间信息 /// private Dictionary dicRooms = new Dictionary(); #endregion #region ■ 初始化_____________________________ /// /// 初始化房间信息 /// 从文件中全部读取所有的房间数据到内存 /// public void InitAllRoom() { this.NowMainPageRoom = null; this.NowCategoryRoom = null; //清空本地缓存 this.dicRooms.Clear(); //检测我的喜爱这个房间对象 this.CheckLoveRoom(); foreach (var roomId in Config.Instance.Home.ListRooms) { //从文件里面获取房间对象 var room = this.GetRoomByFilePath($"Room_{roomId}.json"); if (room != null) { this.dicRooms[room.Id] = (room); } } //设置当前楼层的ID Config.Instance.Home.SetCurrentFloorId(); //顺便刷新场景 HdlSceneLogic.Current.ReFreshByLocal(); //刷新房间视图列表 this.RefreshRoomListView(); } /// /// 从本地重新加载全部的房间 /// public void RefreshAllRoomByLocation() { var homeTemp = Config.Instance.Home; homeTemp.ListRooms.Clear(); var listFile = Global.FileListByHomeId(); //我的喜爱的房间必须要在第0位才行 string fRoom = "Room_Favorite.json"; if (listFile.Contains(fRoom) == true) { listFile.Remove(fRoom); homeTemp.ListRooms.Add("Favorite"); } var listRoomFile = new List(); foreach (string fileName in listFile) { if (fileName.StartsWith("Room_")) { string roomId = fileName.Replace("Room_", string.Empty).Replace(".json", string.Empty); homeTemp.ListRooms.Add(roomId); listRoomFile.Add(fileName); } } //检测楼层数据的合法性 if (UserCenterResourse.UserInfo.AuthorityNo == 3) { this.CheckMemberFloorData(listRoomFile); } else { this.CheckAdminFloorData(listRoomFile); } homeTemp.Save(false); InitAllRoom(); } /// /// 刷新房间视图列表 /// public void RefreshRoomListView() { Application.RunOnMainThread(() => { MainPage.ListRoomViewFrom.Instance?.RefreshListRoom(); }); } /// /// 检测楼层数据的合法性 /// /// private void CheckAdminFloorData(List listRoomFile) { //没有楼层,则无需处理 if (Config.Instance.Home.FloorDics.Count == 0) { return; } //主人或者管理员的话,就检测是否存在未分配楼层的房间 for (int i = 0; i < listRoomFile.Count; i++) { try { var byteData = Global.ReadFileByHomeId(listRoomFile[i]); string valueData = System.Text.Encoding.UTF8.GetString(byteData); var roomTemp = Newtonsoft.Json.JsonConvert.DeserializeObject(valueData); //检测多个手机来回创建,然后又删除之后,楼层数据不能保证100%同步的问题 if (roomTemp.FloorId != string.Empty && Config.Instance.Home.FloorDics.ContainsKey(roomTemp.FloorId) == false) { //未知楼层 Config.Instance.Home.FloorDics[roomTemp.FloorId] = Language.StringByID(R.MyInternationalizationString.uUnKnownFloor); } } catch (Exception ex) { HdlLogLogic.Current.WriteLog(ex); } } } /// /// 检测楼层数据的合法性 /// /// private void CheckMemberFloorData(List listRoomFile) { //没有楼层,则无需处理 if (Config.Instance.Home.FloorDics.Count == 0) { return; } //成员的话,就检测是否存在没有房间的楼层 var listEsixtFloor = new List(); for (int i = 0; i < listRoomFile.Count; i++) { try { var byteData = Global.ReadFileByHomeId(listRoomFile[i]); string valueData = System.Text.Encoding.UTF8.GetString(byteData); var roomTemp = Newtonsoft.Json.JsonConvert.DeserializeObject(valueData); if (roomTemp.FloorId != string.Empty && listEsixtFloor.Contains(roomTemp.FloorId) == false) { //收集楼层 listEsixtFloor.Add(roomTemp.FloorId); } } catch (Exception ex) { HdlLogLogic.Current.WriteLog(ex); } } var listDeleteId = new List(); foreach (var flootId in Config.Instance.Home.FloorDics.Keys) { if (listEsixtFloor.Contains(flootId) == false) { //如果这个id不存在于任何房间的话,收集它 listDeleteId.Add(flootId); } } foreach (var deleteId in listDeleteId) { //删除这个id Config.Instance.Home.FloorDics.Remove(deleteId); } Config.Instance.Home.Save(false); } #endregion #region ■ 添加房间___________________________ /// /// 增加房间 /// /// Room. /// 是否刷新房间视图列表界面 public void AddRoom(Room room, bool refreshRoomView = true) { if (Global.IsExistsByHomeId(room.FileName) == true || Config.Instance.Home.ListRooms.Contains(room.Id) == true) { return; } //添加到缓存 this.dicRooms[room.Id] = room; //把房间ID添加到住宅 Config.Instance.Home.AddRoomId(room.Id); //生成文件 room.Save(); //备份 HdlAutoBackupLogic.AddOrEditorFile(room.FileName); if (refreshRoomView == true) { //刷新房间视图列表 this.RefreshRoomListView(); } } #endregion #region ■ 删除房间___________________________ /// /// 删除房间 /// /// 房间ID /// public void RemoveRoom(string roomId) { //根据房间Id,获取房间对象 var room = this.GetRoomById(roomId); if (room == null) { return; } //删除来自拍照或者系统图库的房间背景图片 if (room.BackgroundImageType == 1 || room.BackgroundImageType == 2) { //删除掉原来的自定义图片 if (Global.IsExistsByHomeId(room.BackgroundImage) == true) { Global.DeleteFilebyHomeId(room.BackgroundImage); //删除备份 HdlAutoBackupLogic.DeleteFile(room.BackgroundImage); } } //我的喜爱 var loveRoom = this.GetLoveRoom(); if (loveRoom != null) { //移除我的喜爱里面的设备 for (int i = 0; i < room.ListDevice.Count; i++) { loveRoom.ListDevice.Remove(room.ListDevice[i]); } //移除我的喜爱里面的场景 for (int i = 0; i < room.ListSceneId.Count; i++) { loveRoom.ListSceneId.Remove(room.ListSceneId[i]); } loveRoom.Save(false); } Config.Instance.Home.RemoveRoomId(roomId); this.dicRooms.Remove(roomId); string roomFilePath = room.FileName; if (Global.IsExistsByHomeId(roomFilePath) == true) { //删除文件 Global.DeleteFilebyHomeId(roomFilePath); } HdlAutoBackupLogic.DeleteFile(roomFilePath); //根据房间ID,移除指定的真实物理设备的所属房间记录 Common.LocalDevice.Current.DeleteRealDeviceByRoomId(roomId); //刷新房间视图列表 this.RefreshRoomListView(); } #endregion #region ■ 获取房间___________________________ /// /// 获取喜爱房间 /// /// public Room GetLoveRoom() { //检测我的喜爱这个房间对象 this.CheckLoveRoom(); return this.dicRooms["Favorite"]; } /// /// 通过路径获取房间 /// /// The room by file path. /// Room file path. private Room GetRoomByFilePath(string roomFilePath) { try { var roomFile = Global.ReadFileByHomeId(roomFilePath); var nowRoom = Newtonsoft.Json.JsonConvert.DeserializeObject(Encoding.UTF8.GetString(roomFile)); return nowRoom; } catch (Exception ex) { HdlLogLogic.Current.WriteLog(ex); return null; } } /// /// 根据房间Id,获取房间对象 /// /// The room by name. /// 房间ID public Room GetRoomById(string roomId) { if (this.dicRooms.ContainsKey(roomId) == false) { return null; } return this.dicRooms[roomId]; } /// /// 根据设备获取房间名字(楼层+房间名) /// /// 房间名 /// 设备对象 public string GetRoomNameByDevice(CommonDevice device) { var room = this.GetRoomByDevice(device); return this.GetFloorRoomName(room); } /// /// 获取房间名字(楼层+房间名) /// /// 房间名 /// 房间对象 public string GetFloorRoomName(Room room) { if (room == null) { //未分配区域 return Language.StringByID(R.MyInternationalizationString.uDeviceNotAssignedRoom); } if (Config.Instance.Home.FloorDics.ContainsKey(room.FloorId) == true) { //(楼层+房间名) return Config.Instance.Home.FloorDics[room.FloorId] + " " + room.Name; } return room.Name; } /// /// 获取设备所在的房间(没有设置有房间则返回null) /// /// The room by device. /// 设备对象 public Room GetRoomByDevice(CommonDevice device) { string mainKeys = LocalDevice.Current.GetDeviceMainKeys(device); foreach (var room in this.dicRooms.Values) { if (room.IsLove == true) { //喜爱房间不处理 continue; } if (room.ListDevice.Contains(mainKeys) == true) { return room; } } return null; } /// /// 通过场景id获取房间名 /// /// The room name by scene identifier. /// Scene identifier. public string GetRoomNameBySceneId(int sceneId) { var room = GetRoomBySceneId(sceneId); if (room == null) { return null; } return room.Name; } /// /// 通过场景id获取房间对象 /// /// The room by scene identifier. /// Scene identifier. public Room GetRoomBySceneId(int sceneId) { foreach (var room in this.dicRooms.Values) { if (room.IsLove == true) { //喜爱房间不处理 continue; } if (room.ListSceneId.Contains(sceneId) == true) { return room; } } return null; } /// /// 获取当前楼层的房间 /// /// /// public List GetRoomsByFloorId(string id) { var listRoom = new List(); if (Config.Instance.Home.FloorDics.Count == 0) { //没有楼层 foreach (var room in this.dicRooms.Values) { listRoom.Add(room); } } else { foreach (var room in this.dicRooms.Values) { if (room.FloorId == id) { listRoom.Add(room); } } } return listRoom; } /// /// 获取全部的房间 /// /// public List GetAllListRooms() { var listRoom = new List(); foreach (var room in this.dicRooms.Values) { listRoom.Add(room); } return listRoom; } /// /// 获取当前楼层的房间名称 /// /// /// public List GetRoomNamesByFloorId(string id) { var listName = new List(); 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; } /// /// 获取当前楼层的房间(拼接了【常用】在第一位) /// /// /// public List GetRoomsByFloorIdAppendLoveRoom(string id) { var listRoom = new List(); if (Config.Instance.Home.FloorDics.Count == 0) { //没有楼层 foreach (var room in this.dicRooms.Values) { if (room.IsLove == false) { listRoom.Add(room); } } } else { foreach (var room in this.dicRooms.Values) { if (room.FloorId == id && room.IsLove == false) { listRoom.Add(room); } } } listRoom.Insert(0, GetLoveRoom()); return listRoom; } /// /// 获取当前楼层的房间(拼接了【常用】在第一位) /// /// public List GetRoomsByCurrentFloorIdAppendLoveRoom() { return this.GetRoomsByFloorIdAppendLoveRoom(Config.Instance.Home.CurrentFloorId); } #endregion #region ■ 房间方法___________________________ /// /// 设备的房间变更 /// /// 设备对象 /// 新房间Id /// 是否修改真实物理设备的房间,不出意外,这个值默认为true即可 public void ChangedRoom(CommonDevice device, string roomId, bool saveRealRoom = true) { //选择的是未分配 if (roomId == string.Empty) { //从原来的房间移除设备 this.DeleteDevice(device); //移除我的喜爱 this.DeleteLoveDevice(device); //设备改变房间的话,主页需要重新刷新 UserView.UserPage.Instance.RefreshForm = true; return; } //房间是否修改 if (this.IsRoomChanged(device, roomId) == false) { return; } //从原来的房间移除设备,这里不删除真实设备的房间 this.DeleteDevice(device, false); //添加到新的房间 var room = this.GetRoomById(roomId); if (room != null) { this.AddDevice(room, device, saveRealRoom); } //设备改变房间的话,主页需要重新刷新 UserView.UserPage.Instance.RefreshForm = true; } /// /// 房间名字是否有修改 /// /// 设备对象 /// 新房间Id /// public bool IsRoomChanged(CommonDevice device, string roomId) { var room = this.GetRoomByDevice(device); if (room == null || room.Id != roomId) { return true; } return false; } /// /// 获取房间所在区域 /// 楼层,房间名 /// /// 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 #region ■ 添加设备___________________________ /// /// 添加设备 /// /// 房间对象 /// 要添加的设备对象 /// 是否修改真实物理设备的房间,不出意外,这个值默认为true即可 public void AddDevice(Room i_room, CommonDevice device, bool saveRealRoom) { if (device == null) { return; } //设备信息保存到本地 device.Save(); string mainkeys = LocalDevice.Current.GetDeviceMainKeys(device); if (i_room.ListDevice.Contains(mainkeys) == false) { //保存到本地 i_room.ListDevice.Add(mainkeys); i_room.Save(); if (i_room.IsLove == false && saveRealRoom == true && LocalDevice.Current.GetDevicesCountByMac(device.DeviceAddr) == 1) { //如果只有一个回路,则修改真实物理设备的房间 LocalDevice.Current.SaveRealDeviceRoomId(new List() { device }, i_room.Id, false); } } } /// /// 添加喜爱设备 /// /// 要添加的设备对象 public void AddLoveDevice(CommonDevice device) { if (device == null) { return; } //我的喜爱 var loveRoom = this.GetLoveRoom(); if (loveRoom != null) { string mainkeys = LocalDevice.Current.GetDeviceMainKeys(device); if (loveRoom.ListDevice.Contains(mainkeys) == false) { //保存到本地 loveRoom.ListDevice.Add(mainkeys); loveRoom.Save(); } } } #endregion #region ■ 删除设备___________________________ /// /// 删除设备(这个函数不删除我的喜爱) /// /// 要删除的设备对象 /// 是否删除真实物理设备的房间 public void DeleteDevice(CommonDevice device, bool deleteReal = true) { if (device == null) { return; } //如果它只有一个回路 if (deleteReal == true && LocalDevice.Current.GetDevicesCountByMac(device.DeviceAddr) == 1) { //删除掉它的真实物理设备的所在位置 LocalDevice.Current.DeleteRealDeviceFromRoom(device); } //根据设备,获取所在的房间 var room = this.GetRoomByDevice(device); if (room == null) { return; } //移除缓存 string mainkeys = LocalDevice.Current.GetDeviceMainKeys(device); room.ListDevice.Remove(mainkeys); room.Save(); //更改自动备份 HdlAutoBackupLogic.AddOrEditorFile(room.FileName); //递归:删除掉以前的旧数据导致的多个房间的问题 this.DeleteDevice(device, deleteReal); } /// /// 删除我的喜爱的设备 /// /// 要删除的设备对象 public void DeleteLoveDevice(CommonDevice device) { if (device == null) { return; } //我的喜爱 var loveRoom = this.GetLoveRoom(); if (loveRoom != null) { //移除缓存 string mainkeys = LocalDevice.Current.GetDeviceMainKeys(device); loveRoom.ListDevice.Remove(mainkeys); loveRoom.Save(); //更改自动备份 HdlAutoBackupLogic.AddOrEditorFile(loveRoom.FileName); } } #endregion #region ■ 获取设备___________________________ /// /// 获取当前房间下的全部设备 /// /// public List GetRoomListDevice(Room i_room) { var dicSort = new Dictionary>(); foreach (var mainKeys in i_room.ListDevice) { var device = LocalDevice.Current.GetDevice(mainKeys); if (device != null) { if (dicSort.ContainsKey(device.DeviceAddr) == false) { dicSort[device.DeviceAddr] = new List(); } dicSort[device.DeviceAddr].Add(device.DeviceEpoint); } } var listDevice = new List(); foreach (var strMac in dicSort.Keys) { var listEpont = dicSort[strMac]; //排序 listEpont.Sort(); for (int i = 0; i < listEpont.Count; i++) { var device = LocalDevice.Current.GetDevice(strMac, listEpont[i]); listDevice.Add(device); } } return listDevice; } /// /// 获取房间设备类型 /// /// /// public List GetDeviceTypes(Room i_room) { var typeList = new List(); foreach (var mainKeys in i_room.ListDevice) { var device = LocalDevice.Current.GetDevice(mainKeys); if (device != null) { typeList.Add(device.Type); } } return typeList; } /// /// 获取该类型的设备 /// /// /// /// public List GetRoomListDevice(Room room, DeviceType deviceType) { List typeList = new List(); foreach (var mainKeys in room.ListDevice) { var device = LocalDevice.Current.GetDevice(mainKeys); if (device != null && device.Type == deviceType) { typeList.Add(device); } } return typeList; } /// /// 获取未分配区域设备 /// /// public List GetUnalloctedDevice() { var listDevice = new List(); //已经存在的设备 var listEsxit = new HashSet(); foreach (var room in this.dicRooms.Values) { if (room.IsLove == true) { //不包含收藏房间 continue; } foreach (string mainkeys in room.ListDevice) { if (listEsxit.Contains(mainkeys) == false) { listEsxit.Add(mainkeys); } } } //所有设备 var commonDeviceList = LocalDevice.Current.listAllDevice; foreach (var device in commonDeviceList) { //判断该设备能否显示在主页 if (LocalDevice.Current.CanShowInHomeHomeMainPage(device) == false) { continue; } string mainkeys = LocalDevice.Current.GetDeviceMainKeys(device); if (listEsxit.Contains(mainkeys) == false) { listDevice.Add(device); } } return listDevice; } /// /// 获取全部房间全部的设备 /// /// public List GetAllRoomListDevice() { var listDevice = new List(); foreach (var room in this.dicRooms.Values) { if (room.IsSharedRoom || room.IsLove) { continue; } listDevice.AddRange(this.GetRoomListDevice(room)); } return listDevice; } #endregion #region ■ 设备是否收藏_______________________ /// /// 是否是收藏设备 /// /// /// public bool IsCollectInRoom(CommonDevice device) { string mainkeys = LocalDevice.Current.GetDeviceMainKeys(device); //喜爱房间 var room = this.GetLoveRoom(); return room.ListDevice.Contains(mainkeys); } /// /// 是否是收藏设备 /// /// /// public bool IsCollectInRoom(SceneUI scene) { //喜爱房间 var room = this.GetLoveRoom(); return room.ListSceneId.Contains(scene.Id); } #endregion #region ■ 楼层和房间顺序相关_________________ /// /// 根据楼层的主键获取排序后的房间列表(支持无楼层模式,不获取收藏房间) /// /// 楼层的主键 /// 分享的房间是否也获取 /// public List GetFloorSortRoom(string i_floorKeys, bool getShard = true) { if (i_floorKeys == null) { i_floorKeys = string.Empty; } Dictionary> dicAllSort = new Dictionary>(); //读取房间顺序 string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.RoomSortFile); var strData = UserCenterLogic.LoadFileContent(fullName); if (strData != null) { dicAllSort = Newtonsoft.Json.JsonConvert.DeserializeObject>>(strData); } var listRoomSort = new List(); if (dicAllSort.ContainsKey(i_floorKeys) == true) { listRoomSort = dicAllSort[i_floorKeys]; } else { dicAllSort[i_floorKeys] = listRoomSort; } var dicRoom = new Dictionary(); foreach (var room in this.dicRooms.Values) { if (room.FloorId != i_floorKeys && i_floorKeys != string.Empty) { //不是同一个楼层 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; } var listSortRoom = new List(); 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; } /// /// 保存房间的顺序 /// /// 楼层主键 /// 房间顺序(房间的主键) public void SaveRoomSort(string i_floorKeys, List listSort) { Dictionary> dicAllSort = new Dictionary>(); //读取房间顺序 string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.RoomSortFile); var strData = UserCenterLogic.LoadFileContent(fullName); if (strData != null) { dicAllSort = Newtonsoft.Json.JsonConvert.DeserializeObject>>(strData); } //保存顺序 dicAllSort[i_floorKeys] = listSort; UserCenterLogic.SaveFileContent(fullName, dicAllSort); dicAllSort.Clear(); } /// /// 获取排序后的楼层 /// /// public Dictionary GetFloorSortList() { //读取楼层顺序 var listFloorSort = new List(); string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.FloorSortFile); var strData = UserCenterLogic.LoadFileContent(fullName); if (strData != null) { listFloorSort = Newtonsoft.Json.JsonConvert.DeserializeObject>(strData); } foreach (string keys in Common.Config.Instance.Home.FloorDics.Keys) { if (listFloorSort.Contains(keys) == false) { //新添加的楼层 listFloorSort.Add(keys); } } var dic = new Dictionary(); for (int i = 0; i < listFloorSort.Count; i++) { if (Config.Instance.Home.FloorDics.ContainsKey(listFloorSort[i]) == true) { dic[listFloorSort[i]] = Config.Instance.Home.FloorDics[listFloorSort[i]]; } } //保存顺序 UserCenterLogic.SaveFileContent(fullName, listFloorSort); return dic; } /// /// 保存楼层的顺序 /// /// 楼层的主键 public void SaveFloorSort(List listSort) { string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.FloorSortFile); //保存顺序 UserCenterLogic.SaveFileContent(fullName, listSort); } #endregion #region ■ 克隆房间对象_______________________ /// /// 克隆房间对象 /// /// public Room CloneRoomClass(Room i_room) { var newRoom = new Room(); //克隆属性 newRoom.Id = i_room.Id; newRoom.FloorId = i_room.FloorId; newRoom.TemperatrueDevice = i_room.TemperatrueDevice; newRoom.Temperatrue = i_room.Temperatrue; newRoom.HumidityDevice = i_room.HumidityDevice; newRoom.Humidity = i_room.Humidity; newRoom.Name = i_room.Name; newRoom.BackgroundImage = i_room.BackgroundImage; newRoom.BackgroundImageType = i_room.BackgroundImageType; return newRoom; } #endregion #region ■ 一般方法___________________________ /// /// 检测我的喜爱这个房间对象 /// private void CheckLoveRoom() { if (Config.Instance.Home.ListRooms.Contains("Favorite") == false) { //默认添加喜爱的房间--禁止修改房间名 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; } } #endregion } }