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(); /// /// 物理设备属于哪个房间的记录 /// private Dictionary dicDeviceRoomId = null; #endregion #region ■ 初始化_____________________________ /// /// 初始化房间信息 /// 从文件中全部读取所有的房间数据到内存 /// public void InitAllRoom() { this.NowMainPageRoom = null; this.NowCategoryRoom = null; //清空本地缓存 this.dicRooms.Clear(); //检测我的喜爱这个房间对象 this.CheckLoveRoom(); var listFile = HdlFileLogic.Current.GetRootPathListFile(); foreach (var fileName in listFile) { if (fileName.StartsWith("Room_") == true) { //从文件里面获取房间对象 var room = this.GetRoomByFilePath(fileName); if (room != null) { this.dicRooms[room.Id] = (room); } } } //顺便刷新场景 HdlSceneLogic.Current.ReFreshByLocal(); //刷新房间视图列表 this.RefreshRoomListView(); } /// /// 从本地重新加载全部的房间 /// public void RefreshAllRoomByLocation() { var listFile = HdlFileLogic.Current.GetRootPathListFile(); //我的喜爱的房间必须要在第0位才行 string fRoom = "Room_Favorite.json"; if (listFile.Contains(fRoom) == true) { listFile.Remove(fRoom); } var listRoomFile = new List(); foreach (string fileName in listFile) { if (fileName.StartsWith("Room_")) { string roomId = fileName.Replace("Room_", string.Empty).Replace(".json", string.Empty); listRoomFile.Add(fileName); } } //检测楼层数据的合法性 if (UserCenterResourse.UserInfo.AuthorityNo == 3) { this.CheckMemberFloorData(listRoomFile); } else { this.CheckAdminFloorData(listRoomFile); } this.InitAllRoom(); } /// /// 刷新房间视图列表 /// public void RefreshRoomListView() { Application.RunOnMainThread(() => { MainPage.LeftListRoomViewFrom.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) { return; } //添加到缓存 this.dicRooms[room.Id] = room; //生成文件 room.Save(); //备份 HdlAutoBackupLogic.AddOrEditorFile(room.FileName); if (refreshRoomView == true) { //刷新房间视图列表 this.RefreshRoomListView(); } } #endregion #region ■ 删除房间___________________________ /// /// 删除房间 /// /// 房间ID /// 是否刷新左滑界面(此变量目前是给删除全部房间用的) /// 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) { 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); } this.dicRooms.Remove(roomId); string roomFilePath = room.FileName; if (Global.IsExistsByHomeId(roomFilePath) == true) { //删除文件 Global.DeleteFilebyHomeId(roomFilePath); } HdlAutoBackupLogic.DeleteFile(roomFilePath); //根据房间ID,移除指定的真实物理设备的所属房间记录 HdlRoomLogic.Current.DeleteRealDeviceByRoomId(roomId); if (refreshLeftView == true) { //刷新房间视图列表 this.RefreshRoomListView(); } } /// /// 删除全部的房间 /// public void DeleteAllRoom() { var listRoomId = new List(); 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 #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.GetRoomName(room); } /// /// 获取房间名字(楼层+房间名) /// /// 房间名 /// 房间对象 public string GetRoomName(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 this.SortRoom(listRoom); } /// /// 获取全部的房间 /// /// public List GetAllListRooms() { var listRoom = new List(); foreach (var room in this.dicRooms.Values) { listRoom.Add(room); } return this.SortRoom(listRoom); } /// /// 获取当前楼层的房间(拼接了【常用】在第一位) /// /// /// 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 = this.SortRoom(listRoom); listRoom.Insert(0, GetLoveRoom()); return listRoom; } /// /// 获取网关所在的房间 /// /// 网关对象 /// public Room GetRoomByGateway(ZbGateway zbGateway) { return this.GetRoomByGateway(zbGateway.GwId); } /// /// 获取网关所在的房间 /// /// 网关ID /// public Room GetRoomByGateway(string gatewayId) { var localGateway = HdlGatewayLogic.Current.GetLocalGateway(gatewayId); if (localGateway == null) { return null; } return HdlRoomLogic.Current.GetRoomById(localGateway.RoomId); } /// /// 变更网关房间 /// /// 网关Id /// 房间ID public void ChangedGatewayRoom(string gwId, string roomId) { var localGateway = HdlGatewayLogic.Current.GetLocalGateway(gwId); if (localGateway != null) { localGateway.RoomId = roomId; localGateway.ReSave(); //添加备份 HdlAutoBackupLogic.AddOrEditorFile(localGateway.FilePath); } } #endregion #region ■ 物理设备所属房间___________________ /// /// 初始化物理设备所属房间的记录 /// public void InitRealDeviceRoomId() { this.dicDeviceRoomId = new Dictionary(); string fullName = DirNameResourse.DeviceRoomIdFile; var strData = HdlFileLogic.Current.ReadFileTextContent(fullName); if (strData != null) { this.dicDeviceRoomId = Newtonsoft.Json.JsonConvert.DeserializeObject>(strData); } } /// /// 获取全部物理设备所属房间的记录 /// /// public Dictionary GetAllRealDeviceRoomData() { return this.dicDeviceRoomId; } /// /// 保存物理设备所属房间的记录 /// /// 需要保存的设备对象 /// 需要保存的哪个设备的房间ID /// 如果只有一个回路,是否把回路的房间一起修改 public void SaveRealDeviceRoomId(List listDevice, string roomId, bool saveRoadDevice = true) { if (listDevice == null || listDevice.Count == 0) { return; } //如果设备只有一个回路,如果改变了真实设备区域,则它的回路的区域也一起改了 if (saveRoadDevice == true && listDevice.Count == 1) { if ((listDevice[0] is OTADevice) == false) { //ota设备不需要处理 HdlRoomLogic.Current.ChangedRoom(listDevice[0], roomId, false); } } bool save = false; if (roomId == string.Empty) { //选择的是未分配 this.dicDeviceRoomId.Remove(listDevice[0].DeviceAddr); save = true; } else { if (this.dicDeviceRoomId.ContainsKey(listDevice[0].DeviceAddr) == false) { this.dicDeviceRoomId[listDevice[0].DeviceAddr] = roomId; save = true; } else { //2020.05.18追加:如果记录的房间ID是不存在的话,则重新覆盖 var room = HdlRoomLogic.Current.GetRoomById(this.dicDeviceRoomId[listDevice[0].DeviceAddr]); if (room == null || this.dicDeviceRoomId[listDevice[0].DeviceAddr] != roomId) { this.dicDeviceRoomId[listDevice[0].DeviceAddr] = roomId; save = true; } } } if (save == true) { //保存记录 HdlFileLogic.Current.SaveFileContent(DirNameResourse.DeviceRoomIdFile, this.dicDeviceRoomId); //添加自动备份 HdlAutoBackupLogic.AddOrEditorFile(DirNameResourse.DeviceRoomIdFile); } } /// /// 获取真实物理设备的房间名字 /// /// 设备的某一个回路 /// public string GeteRealDeviceRoomName(CommonDevice device) { if (this.dicDeviceRoomId.ContainsKey(device.DeviceAddr) == false) { //未分配区域 return Language.StringByID(R.MyInternationalizationString.uDeviceNotAssignedRoom); } var room = HdlRoomLogic.Current.GetRoomById(this.dicDeviceRoomId[device.DeviceAddr]); return HdlRoomLogic.Current.GetRoomName(room); } /// /// 获取真实物理设备属于哪个房间 /// /// 设备的某一个回路 /// public Room GeteRealDeviceRoom(CommonDevice device) { if (this.dicDeviceRoomId.ContainsKey(device.DeviceAddr) == false) { return null; } return HdlRoomLogic.Current.GetRoomById(this.dicDeviceRoomId[device.DeviceAddr]); } /// /// 将真实物理设备从房间中移除 /// /// 随便一个回路 public void DeleteRealDeviceFromRoom(CommonDevice device) { //将真实物理设备从房间中移除 this.DeleteRealDeviceFromRoom(new List() { device.DeviceAddr }); } /// /// 将真实物理设备从房间中移除 /// /// 设备Mac地址 public void DeleteRealDeviceFromRoom(List listMac) { bool save = false; foreach (var deviceMacAddr in listMac) { if (this.dicDeviceRoomId.ContainsKey(deviceMacAddr) == true) { this.dicDeviceRoomId.Remove(deviceMacAddr); save = true; } } if (save == false) { //没有改变,不需要保存 return; } //保存记录 HdlFileLogic.Current.SaveFileContent(DirNameResourse.DeviceRoomIdFile, this.dicDeviceRoomId); //添加自动备份 HdlAutoBackupLogic.AddOrEditorFile(DirNameResourse.DeviceRoomIdFile); } /// /// 根据房间ID,移除指定的真实物理设备的所属房间记录 /// /// public void DeleteRealDeviceByRoomId(string i_RoomId) { var listDeleteKey = new List(); foreach (var deviceAddr in this.dicDeviceRoomId.Keys) { if (this.dicDeviceRoomId[deviceAddr] == i_RoomId && listDeleteKey.Contains(deviceAddr) == false) { listDeleteKey.Add(deviceAddr); } } //将真实物理设备从房间中移除 this.DeleteRealDeviceFromRoom(listDeleteKey); } #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.RefreshAllForm = 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.RefreshAllForm = true; } /// /// 房间名字是否有修改 /// /// 设备对象 /// 新房间Id /// public bool IsRoomChanged(CommonDevice device, string roomId) { var room = this.GetRoomByDevice(device); if (room == null || room.Id != roomId) { return true; } return false; } #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) { //如果只有一个回路,则修改真实物理设备的房间 this.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(); //添加收藏设备时,需要刷新主页 UserView.UserPage.Instance.RefreshAllForm = true; } } } #endregion #region ■ 删除设备___________________________ /// /// 删除设备(这个函数不删除我的喜爱) /// /// 要删除的设备对象 /// 是否删除真实物理设备的房间 public void DeleteDevice(CommonDevice device, bool deleteReal = true) { if (device == null) { return; } //如果它只有一个回路 if (deleteReal == true && LocalDevice.Current.GetDevicesCountByMac(device.DeviceAddr) == 1) { //删除掉它的真实物理设备的所在位置 HdlRoomLogic.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); //添加收藏设备时,需要刷新主页 UserView.UserPage.Instance.RefreshAllForm = true; } } #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; } var listRoom = new List(); foreach (var room in this.dicRooms.Values) { if (room.FloorId != i_floorKeys && i_floorKeys != string.Empty || room.IsLove == true) { //不是同一个楼层,不要我的喜爱 continue; } if (getShard == false && room.IsSharedRoom == true) { //不要分享的房间 continue; } listRoom.Add(room); } return this.SortRoom(listRoom); } /// /// 排序房间对象 /// /// /// public List SortRoom(List listRoom) { //从一堆文字中,获取这一堆文字里面数字字符串的最长长度 var listName = new List(); foreach (var room in listRoom) { listName.Add(room.Name); } int numberLength = this.GetNumberMaxLength(listName); var listSort = new List(); 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(); foreach (var strArry in listSort) { var room = this.GetRoomById(strArry[0]); listSortRoom.Add(room); } return listSortRoom; } /// /// 获取排序后的楼层 /// /// public Dictionary GetFloorSortList() { //没有楼层 if (Config.Instance.Home.FloorDics.Count == 0) { return new Dictionary(); } //从一堆文字中,获取这一堆文字里面数字字符串的最长长度 var listName = new List(); foreach (var floorName in Config.Instance.Home.FloorDics.Values) { listName.Add(floorName); } int numberLength = this.GetNumberMaxLength(listName); var listSort = new List(); 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(); foreach (var strArry in listSort) { dic[strArry[0]] = Config.Instance.Home.FloorDics[strArry[0]]; } return dic; } #endregion #region ■ 发送房间信息给网关_________________ /// /// 发送房间信息给网关 /// public void SetRoomInfoToGateway() { if (UserCenterResourse.UserInfo.AuthorityNo != 1 && UserCenterResourse.UserInfo.AuthorityNo != 2) { //不是主人和管理员,则不处理 return; } var realMain = ZbGateway.MainGateWay; if (realMain == null || Common.Config.Instance.Home.IsVirtually == true) { //没有主网关,则不理 return; } //获取房间全部的设备对象 string strSendDeviceRoomInfo = string.Empty; foreach (var room in this.dicRooms.Values) { if (room.IsSharedRoom || room.IsLove) { continue; } var listDevice = this.GetRoomListDevice(room); //发送给网关的设备房间json foreach (var device in listDevice) { if (strSendDeviceRoomInfo != string.Empty) { strSendDeviceRoomInfo += "\r\n"; } strSendDeviceRoomInfo += " " + this.SetDoublMark(device.DeviceAddr) + " "; strSendDeviceRoomInfo += this.SetDoublMark("0x" + Convert.ToString(device.DeviceEpoint, 16).PadLeft(2, '0')) + " "; strSendDeviceRoomInfo += this.SetDoublMark(LocalDevice.Current.GetDeviceEpointName(device).Replace(UserCenterResourse.douMarks, string.Empty)) + " "; strSendDeviceRoomInfo += this.SetDoublMark(room.Id); } } var listAreaSpaceInfo = new List(); //首先添加住宅 var houseInfo = new AreaSpaceInfo(); houseInfo.name = Common.Config.Instance.Home.Name; houseInfo.uid = Common.Config.Instance.Home.Id; houseInfo.parentId = null; listAreaSpaceInfo.Add(houseInfo); //然后添加楼层 foreach (var floorId in Common.Config.Instance.Home.FloorDics.Keys) { var floorInfo = new AreaSpaceInfo(); floorInfo.name = Common.Config.Instance.Home.FloorDics[floorId]; floorInfo.uid = floorId; floorInfo.parentId = Common.Config.Instance.Home.Id; listAreaSpaceInfo.Add(floorInfo); } //然后添加房间 var listRoom = this.GetAllListRooms(); foreach (var room in listRoom) { if (room.IsLove == true) { continue; } var roomInfo = new AreaSpaceInfo(); roomInfo.name = room.Name; roomInfo.uid = room.Id; if (Common.Config.Instance.Home.FloorDics.ContainsKey(room.FloorId) == true) { roomInfo.parentId = room.FloorId; } else { roomInfo.parentId = Common.Config.Instance.Home.Id; } listAreaSpaceInfo.Add(roomInfo); } //然后添加网关房间信息 var gatewayInfo = new GatewayAreaSpaceInfo(); var loaclGateway = HdlGatewayLogic.Current.GetLocalGateway(realMain.GwId); if (loaclGateway == null || loaclGateway.GwMac == string.Empty) { //没有mac,或者找不到对象,则不上传 return; } string gwMac = loaclGateway.GwMac.Replace(":", string.Empty); gatewayInfo.uid = "000101" + gwMac.Substring(2) + "07"; gatewayInfo.name = HdlGatewayLogic.Current.GetGatewayName(loaclGateway); var roomGateway = HdlRoomLogic.Current.GetRoomByGateway(loaclGateway); if (roomGateway != null) { gatewayInfo.parentId = roomGateway.Id; } gatewayInfo.hwInfo = new GatewayHwInfo(); gatewayInfo.pkgInfo = new GatewayPkgInfo { version = loaclGateway.LinuxFirmwareVersion.ToString() }; gatewayInfo.swInfo = new List { new GatewaySwInfo { ver = loaclGateway.LinuxFirmwareVersion.ToString() } }; gatewayInfo.ip = loaclGateway.GwIP; gatewayInfo.mac = loaclGateway.GwMac; var data = new { spaces = listAreaSpaceInfo, gateway = gatewayInfo }; string strSendRoomInfo = Newtonsoft.Json.JsonConvert.SerializeObject(data); HdlThreadLogic.Current.RunThread(async () => { //发送设备区域信息 if (strSendDeviceRoomInfo != string.Empty) { //创建文件对象 var result0 = await realMain.CreateFileAsync("DeviceRoomInfo.json"); if (result0 == null) { return; } if (result0.Result != 0 && result0.Result != 2) { //如果是2,允许上传 return; } //发送数据流 var byteData = ASCIIEncoding.UTF8.GetBytes(strSendDeviceRoomInfo); var result1 = await realMain.SendFileAsync(byteData); if (result1 == null || result1.Result != 0) { return; } } //创建文件对象 var result3 = await realMain.CreateFileAsync("space.json"); if (result3 == null) { return; } if (result3.Result != 0 && result3.Result != 2) { //如果是2,允许上传 return; } //发送区域信息 var byteData2 = ASCIIEncoding.UTF8.GetBytes(strSendRoomInfo); var result4 = await realMain.SendFileAsync(byteData2); }); } /// /// 设置双引号 /// /// /// private string SetDoublMark(string i_text) { return UserCenterResourse.douMarks + i_text + UserCenterResourse.douMarks; } /// /// 空间区域信息 /// private class AreaSpaceInfo { /// /// 住宅ID 或者 楼层ID 或者 房间ID /// public string uid = string.Empty; /// /// 住宅名称 或者 楼层名称 或者 房间名称 /// public string name = string.Empty; /// /// 当前ID的父ID,如果没有,则为带双引号的"null" 比如 楼层ID就填住宅ID 房间ID就填楼层ID /// public string parentId = string.Empty; } /// /// 网关空间区域信息 /// private class GatewayAreaSpaceInfo { /// /// 【000101】+绑定网关的时间戳转16进制+【07】 /// public string uid = string.Empty; /// /// 这个固定 /// public string name = "hdl_bus_gatway"; /// /// 网关所在的房间ID /// public string parentId = string.Empty; /// /// 这个固定 /// public int deviceType = 61184; /// /// 网关硬件信息 /// public GatewayHwInfo hwInfo = null; /// /// 网关标准信息 /// public GatewayPkgInfo pkgInfo = null; /// /// 网关固件版本 /// public List swInfo = null; /// /// 网关IP /// public string ip = string.Empty; /// /// 网关的Mac /// public string mac = string.Empty; } /// /// 网关硬件信息 /// private class GatewayHwInfo { /// /// 这个固定 /// public string brand = "MIPS"; /// /// 这个固定 /// public string model = "MT7688"; } /// /// 网关标准信息 /// private class GatewayPkgInfo { /// /// 这个是Linux的固件版本 /// public string version = string.Empty; } /// /// 网关固件版本 /// private class GatewaySwInfo { /// /// 这个固定 /// public string name = "HDL"; /// /// 这个是Linux的固件版本 /// public string ver = string.Empty; } #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.HumidityDevice = i_room.HumidityDevice; newRoom.Name = i_room.Name; newRoom.BackgroundImage = i_room.BackgroundImage; newRoom.BackgroundImageType = i_room.BackgroundImageType; return newRoom; } #endregion #region ■ 一般方法___________________________ /// /// 获取房间总数 /// /// public int GetRoomCount() { return this.dicRooms.Count; } /// /// 检测我的喜爱这个房间对象 /// private void CheckLoveRoom() { 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(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); this.dicRooms["Favorite"] = love; } } /// /// 从一堆文字中,获取这一堆文字里面数字字符串的最长长度 /// /// /// private int GetNumberMaxLength(List 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 } }