WJC
2020-01-15 c6ff92e84b6cb2815cb98065ecb0ecf95d0689c3
ZigbeeApp/Shared/Common/Room.cs
@@ -36,7 +36,7 @@
        /// 楼层Id
        /// 新增时使用Guid
        /// </summary>
        public string FloorId = "Floor1";
        public string FloorId = string.Empty;
        /// <summary>
        /// 楼层名称
        /// </summary>
@@ -44,7 +44,7 @@
        {
            get
            {
               return GetFloorNameById(FloorId);
               return Config.Instance.Home.GetFloorNameById(FloorId);
            }
        }
        /// <summary>
@@ -76,10 +76,26 @@
        /// </summary>
        public string HumidityDevice = string.Empty;
        /// <summary>
        /// 当前选择的房间
        /// </summary>
        private static Room m_CurrentRoom = null;
        /// <summary>
        /// 当前选择的房间
        /// </summary>
        public static Room CurrentRoom;
        [Newtonsoft.Json.JsonIgnore]
        public static Room CurrentRoom
        {
            get
            {
                if (m_CurrentRoom == null && Lists.Count > 0)
                {
                    return Lists[0];
                }
                return m_CurrentRoom;
            }
            set { m_CurrentRoom = value; }
        }
        /// <summary>
        /// 房间里所有的设备列表
@@ -116,12 +132,6 @@
        public bool IsSharedRoom = false;
        /// <summary>
        /// 是否可以刷新房间数据了
        /// 需要等初始化本地设备数据后在可以初始化房间数据
        /// </summary>
        public static bool CanInitAllRoom;
        /// <summary>
        /// 获取喜爱房间的所有设备路径
        /// </summary>
        /// <value>The love room device list.</value>
@@ -134,17 +144,34 @@
                {
                    return new List<string> { };
                }
                return GetLoveRoom().DeviceUIFilePathList;
                return CurrentRoom.GetLoveRoom().DeviceUIFilePathList;
            }
        }
        /// <summary>
        /// 所有房间的所有设备类型
        /// 先调用 GetAllRoomDeviceTypeList()
        /// </summary>
        /// <value>All room device type list.</value>
        [Newtonsoft.Json.JsonIgnore]
        public static List<DeviceType> AllRoomDeviceTypeList = new List<DeviceType> { };
        public static List<DeviceType> AllRoomDeviceTypeList
        {
            get
            {
                var typeList = new List<DeviceType> { };
                foreach (var deviceUI in AllRoomDeviceUIList)
                {
                    if (deviceUI == null || deviceUI.CommonDevice == null)
                    {
                        continue;
                    }
                    if (!typeList.Contains(deviceUI.CommonDevice.Type))
                    {
                        typeList.Add(deviceUI.CommonDevice.Type);
                    }
                }
                return typeList;
            }
        }
        /// <summary>
        /// 获取所有房间的所有场景
@@ -191,11 +218,41 @@
        /// <summary>
        /// 获取所有房间的所有设备
        /// 请先调用 GetAllRoomDeviceUIList()方法
        /// </summary>
        /// <value>All room device UIL ist.</value>
        [Newtonsoft.Json.JsonIgnore]
        public static List<DeviceUI> AllRoomDeviceUIList = new List<DeviceUI> { };
        public static List<DeviceUI> AllRoomDeviceUIList
        {
            get
            {
                List<DeviceUI> deviceList = new List<DeviceUI>();
                for (int i = 0; i < Lists.Count; i++)
                {
                    var room = Lists[i];
                    if (room.IsSharedRoom)
                    {
                        continue;
                    }
                    if (room.DeviceUIList.Count == 0)
                    {
                        continue;
                    }
                    for (int j = 0; j < room.DeviceUIList.Count; j++)
                    {
                        var device = room.DeviceUIList[j];
                        if (device == null || device.CommonDevice == null)
                        {
                            continue;
                        }
                        if (deviceList.Find((obj) => obj.FileName == device.FileName) == null)
                        {
                            deviceList.Add(device);
                        }
                    }
                }
                return deviceList;
            }
        }
        #endregion
@@ -219,20 +276,16 @@
        /// </summary>
        public static void InitAllRoom()
        {
            if (CanInitAllRoom == false)
            {
                return;
            }
            Lists.Clear();
            if (Config.Instance.Home.RoomFilePathList.Contains("Room_Favorite.json") == false)
            {
                //默认添加喜爱的房间--禁止修改房间名
                var love = new Room { Name = Language.StringByID(R.MyInternationalizationString.Favorite), BackgroundImage = "Room/r0.png", Id = LoveRoomId };
                love.Save(true);
                var love = new Room { Name = Language.StringByID(R.MyInternationalizationString.Favorite), BackgroundImage = "RoomIcon/0.JPG", Id = LoveRoomId };
                love.Save(false);
                //添加到house 房间路径列表
                var currentHome = Config.Instance.Home;
                currentHome.RoomFilePathList.Insert(0, love.FileName);
                currentHome.Save();
                currentHome.Save(false);
            }
            foreach (var roomFilePath in Config.Instance.Home.RoomFilePathList)
            {
@@ -242,11 +295,13 @@
                {
                    if (room.IsSharedRoom)
                    {
                        room.Name = $"({Language.StringByID(R.MyInternationalizationString.Shared)}){room.Name}";
                        room.Name = $"{room.Name}";
                    }
                    Lists.Add(room);
                }
            }
            Config.Instance.Home.InitFloor();
        }
        /// <summary>
@@ -276,7 +331,6 @@
                }
            }
            homeTemp.Save(false);
            CanInitAllRoom = true;
            InitAllRoom();
        }
@@ -349,7 +403,7 @@
        /// 获取喜爱房间
        /// </summary>
        /// <returns></returns>
        public static Room GetLoveRoom()
        public Room GetLoveRoom()
        {
            return CurrentRoom.GetRoomById(LoveRoomId);
        }
@@ -382,7 +436,7 @@
                    //设备(deviceUI)
                    beforeRoom.DeviceUIList.Clear();
                    foreach (var deviceFilePath in beforeRoom.DeviceUIFilePathList)
                    {
                    {
                        beforeRoom.DeviceUIList.Add(Common.LocalDevice.Current.GetDeviceUI(deviceFilePath));
                    }
                    //场景(SceneUI)
@@ -446,7 +500,21 @@
        /// <param name="roomId">房间ID</param>
        public Room GetRoomById(string roomId)
        {
            if (string.IsNullOrEmpty(roomId))
            {
                return null;
            }
            return Lists.Find((obj) => obj.Id == roomId);
        }
        /// <summary>
        /// 根据房间名字,获取房间对象
        /// </summary>
        /// <returns>The room by name.</returns>
        /// <param name="roomName">房间名</param>
        public Room GetRoomByName(string roomName)
        {
            return Lists.Find((obj) => obj.Name == roomName);
        }
        /// <summary>
@@ -477,11 +545,8 @@
        /// <param name="device">设备对象</param>
        public Room GetRoomByDevice(CommonDevice device)
        {
            var deviceUI = new DeviceUI { };
            deviceUI.DeviceAddr = device.DeviceAddr;
            deviceUI.DeviceEpoint = device.DeviceEpoint;
            return Lists.Find((obj) => obj.DeviceUIFilePathList.Contains(deviceUI.FileName));
            string deviceFile = device.FilePath;
            return Lists.Find((obj) => obj.IsLove == false && obj.DeviceUIFilePathList.Contains(deviceFile));
        }
        /// <summary>
@@ -508,6 +573,10 @@
        {
            foreach (var r in Lists)
            {
                if (r.IsLove)
                {
                    continue;
                }
                foreach (var scene in r.SceneUIList)
                {
                    if (scene.Id == sceneId)
@@ -519,6 +588,59 @@
            return null;
        }
        /// <summary>
        /// 获取当前楼层的房间
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public  List<Room> GetRoomsByFloorId(string id)
        {
            return Lists.FindAll((obj) => obj.FloorId==id);
        }
        /// <summary>
        /// 获取当前楼层的房间名称
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public  List<string> GetRoomNamesByFloorId(string id)
        {
            List<string> names = new List<string> { };
            foreach(var r in Lists)
            {
                if(r.FloorId==id)
                {
                    names.Add(r.Name);
                }
            }
            return names;
        }
        /// <summary>
        /// 获取当前楼层的房间(拼接了【常用】在第一位)
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public  List<Room> GetRoomsByFloorIdAppendLoveRoom(string id)
        {
            var r= Lists.FindAll((obj) => obj.FloorId == id);
            r.Insert(0, GetLoveRoom());
            return r;
        }
        /// <summary>
        /// 获取当前楼层的房间(拼接了【常用】在第一位)
        /// </summary>
        /// <returns></returns>
        public  List<Room> GetRoomsByCurrentFloorIdAppendLoveRoom()
        {
            if(Config.Instance.Home.FloorDics.Count==0)
            {
                return Lists;
            }
            var r = Lists.FindAll((obj) => obj.FloorId == Config.Instance.Home.CurrentFloorId);
            r.Insert(0, GetLoveRoom());
            return r;
        }
        #endregion
@@ -529,7 +651,8 @@
        /// </summary>
        /// <param name="device">设备对象</param>
        /// <param name="roomId">新房间Id</param>
        public void ChangedRoom(CommonDevice device, string roomId)
        /// <param name="saveRealRoom">是否修改真实物理设备的房间,不出意外,这个值默认为true即可</param>
        public void ChangedRoom(CommonDevice device, string roomId, bool saveRealRoom = true)
        {
            //房间是否修改
            if (this.IsRoomChanged(device, roomId) == false)
@@ -543,7 +666,7 @@
            var room = this.GetRoomById(roomId);
            if (room != null)
            {
                room.AddDevice(device);
                room.AddDevice(device, saveRealRoom);
            }
        }
@@ -632,7 +755,7 @@
        #region ◆ 添加设备________________________
        /// <summary>
        /// 添加设备
        /// 添加设备(此方法目前只给【我的喜爱】使用)
        /// </summary>
        /// <param name="deviceUIFilePath">Device UIF ile path.</param>
        public void AddDevice(string deviceUIFilePath)
@@ -641,9 +764,8 @@
            {
                return;
            }
            var jsonInfo = Encoding.UTF8.GetString(Global.ReadFileByHomeId(deviceUIFilePath));
            var deviceUI = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceUI>(jsonInfo);
            if (null == deviceUI || null == deviceUI.CommonDevice)
            var deviceUI = Common.LocalDevice.Current.GetDeviceUI(deviceUIFilePath);
            if (null == deviceUI.CommonDevice)
            {
                //当前对象数据无效
                return;
@@ -658,10 +780,11 @@
        }
        /// <summary>
        /// 添加设备
        /// 添加设备(此方法目前只给Room里面使用)
        /// </summary>
        /// <param name="device">要添加的设备对象</param>
        public void AddDevice(CommonDevice device)
        /// <param name="saveRealRoom">是否修改真实物理设备的房间,不出意外,这个值默认为true即可</param>
        public void AddDevice(CommonDevice device, bool saveRealRoom)
        {
            if (device == null)
            {
@@ -670,10 +793,7 @@
            //设备信息保存到本地
            device.Save();
            //添加自动备份
            HdlAutoBackupLogic.AddOrEditorFile(device.FilePath);
            DeviceUI deviceUI = Common.LocalDevice.Current.GetDeviceUI(device);
            var deviceUI = Common.LocalDevice.Current.GetDeviceUI(device);
            if (DeviceUIFilePathList.Contains(deviceUI.FileName) == false)
            {
                DeviceUIFilePathList.Add(deviceUI.FileName);
@@ -683,13 +803,17 @@
                //添加自动备份
                HdlAutoBackupLogic.AddOrEditorFile(FileName);
                if (saveRealRoom == true && LocalDevice.Current.GetDevicesCountByMac(device.DeviceAddr) == 1)
                {
                    //如果只有一个回路,则修改真实物理设备的房间
                    LocalDevice.Current.SaveRealDeviceRoomId(new List<CommonDevice>() { device }, this.Id, false);
                }
            }
        }
        #endregion
        #region ◆ 删除设备_________________________
        /// <summary>
        /// 删除功能-设备
        /// </summary>
@@ -697,11 +821,10 @@
        public void DeleteDevice(string deviceUIFilePath)
        {
            if (deviceUIFilePath == null) return;
            if (DeviceUIFilePathList.Contains(deviceUIFilePath) && Global.IsExistsByHomeId(deviceUIFilePath))
            if (DeviceUIFilePathList.Contains(deviceUIFilePath))
            {
                DeviceUIFilePathList.Remove(deviceUIFilePath);
                DeviceUIList.RemoveAll((obj) => obj.FileName == deviceUIFilePath);
                HdlAutoBackupLogic.DeleteFile(deviceUIFilePath);
                Save();
            }
        }
@@ -716,24 +839,21 @@
            {
                return;
            }
            DeviceUI deviceUI = new DeviceUI();
            deviceUI.DeviceAddr = device.DeviceAddr;
            deviceUI.DeviceEpoint = device.DeviceEpoint;
            //根据设备,获取所在的房间
            var room = this.GetRoomByDevice(device);
            if (room == null)
            {
                return;
            }
            string deviceFile = device.FilePath;
            //移除缓存
            if (room.DeviceUIFilePathList.Contains(deviceUI.FileName) == false)
            if (room.DeviceUIFilePathList.Contains(deviceFile) == false)
            {
                return;
            }
            room.DeviceUIFilePathList.Remove(deviceUI.FileName);
            room.DeviceUIFilePathList.Remove(deviceFile);
            room.DeviceUIList.RemoveAll((obj) => obj.FileName == deviceUI.FileName);
            room.DeviceUIList.RemoveAll((obj) => obj.FileName == deviceFile);
            room.Save();
            //更改自动备份
            HdlAutoBackupLogic.AddOrEditorFile(room.FileName);
@@ -744,39 +864,6 @@
        #region ◆ 获取设备_________________________
        /// <summary>
        /// 获取所有房间的所有设备
        /// </summary>
        public static void GetAllRoomDeviceUIList()
        {
            List<string> devicePathList = new List<string>();
            //所有房间的所有设备
            AllRoomDeviceUIList.Clear();
            foreach (var room in Shared.Common.Room.Lists)
            {
                if(room.IsSharedRoom)
                {
                    continue;
                }
                if (room.DeviceUIList.Count == 0)
                {
                    continue;
                }
                foreach (var device in room.DeviceUIList)
                {
                    if (device == null || device.CommonDevice == null)
                    {
                        continue;
                    }
                    if (!devicePathList.Contains(device.FileName))
                    {
                        AllRoomDeviceUIList.Add(device);
                        devicePathList.Add(device.FileName);
                    }
                }
            }
        }
        /// <summary>
        /// 根据设备获取它的UI对象,如果不存在则新建
        /// </summary>
        /// <returns>The device user interface.</returns>
@@ -784,25 +871,6 @@
        public DeviceUI GetDeviceUI(CommonDevice device)
        {
            return Common.LocalDevice.Current.GetDeviceUI(device);
        }
        /// <summary>
        /// 重新获取-所有房间的所有设备类型
        /// </summary>
        public static void GetAllRoomDeviceTypeList()
        {
            AllRoomDeviceTypeList.Clear();
            foreach (var deviceUI in AllRoomDeviceUIList)
            {
                if (deviceUI == null || deviceUI.CommonDevice == null)
                {
                    continue;
                }
                if (!AllRoomDeviceTypeList.Contains(deviceUI.CommonDevice.Type))
                {
                    AllRoomDeviceTypeList.Add(deviceUI.CommonDevice.Type);
                }
            }
        }
        /// <summary>
@@ -820,11 +888,87 @@
                }
                listDevice.Add(device.CommonDevice);
            }
            if (listDevice.Count == 0)
            {
                return listDevice;
            }
            return Common.LocalDevice.Current.SortDevice(listDevice);
            return listDevice;
        }
        /// <summary>
        /// 获取房间设备类型
        /// </summary>
        /// <param name="room"></param>
        /// <returns></returns>
        public static List<DeviceType> GetdeviceTypes(Room room)
        {
            List<DeviceType> typeList = new List<DeviceType> { };
            foreach (var deviceUI in room.DeviceUIList)
            {
                if (deviceUI == null || deviceUI.CommonDevice == null)
                {
                    continue;
                }
                if (!typeList.Contains(deviceUI.CommonDevice.Type))
                {
                    typeList.Add(deviceUI.CommonDevice.Type);
                }
            }
            return typeList;
        }
        /// <summary>
        /// 获取该类型的设备
        /// </summary>
        /// <param name="room"></param>
        /// <param name="deviceType"></param>
        /// <returns></returns>
        public static List<DeviceUI> GetDeviceUIs(Room room ,DeviceType deviceType)
        {
            List<DeviceUI> typeList = new List<DeviceUI> { };
            foreach (var deviceUI in room.DeviceUIList)
            {
                if (deviceUI == null || deviceUI.CommonDevice == null)
                {
                    continue;
                }
                if(deviceUI.CommonDevice.Type!=deviceType)
                {
                    continue;
                }
                if (!typeList.Contains(deviceUI))
                {
                    typeList.Add(deviceUI);
                }
            }
            return typeList;
        }
        /// <summary>
        /// 获取该楼层的场景
        /// </summary>
        /// <param name="floorId"></param>
        /// <returns></returns>
        public List<SceneUI> GetSceneUIsByFloorId(string floorId)
        {
            var rooms = GetRoomsByFloorId(floorId);
            if (rooms == null)
            {
                return null;
            }
            var sceneList = new List<SceneUI> { };
            foreach (var r in rooms)
            {
                if (r.SceneUIList.Count == 0)
                {
                    continue;
                }
                foreach (var sceneUI in r.SceneUIList)
                {
                    if (sceneUI == null)
                    {
                        continue;
                    }
                    sceneList.Add(sceneUI);
                }
            }
            return sceneList;
        }
        #endregion
@@ -841,25 +985,21 @@
        /// <param name="iconPathType">I场景背景图片来源类型 图片来源 0--本地图库 1--拍照 2--系统图库 默认0</param>
        public async System.Threading.Tasks.Task<int> AddScene(string sceneName, string sceneIconPath, List<ZigBee.Device.Scene.AddSceneMemberData> commons, int iconPathType = 0)
        {
            if (AllRoomSceneUIList.Find(s => s.Name == sceneName) != null)
            var scenes = GetSceneUIsByFloorId(FloorId);
            if(scenes!=null && scenes.Count>0)
            {
                return -1;
                if (scenes.Find(s => s.Name == sceneName) != null)
                {
                    return -1;
                }
            }
            var getSceneIdAllData = await ZigBee.Device.Scene.GetSceneNewIdAsync(sceneName);
            if (getSceneIdAllData == null || getSceneIdAllData.getSceneIdData == null)
            {
                return 0;
            }
            var getSceneIdData = getSceneIdAllData.getSceneIdData;
            //循环相同报错
            foreach (var tempSceneUI in AllRoomSceneUIList)
            {
                if (tempSceneUI.Id == getSceneIdAllData.getSceneIdData.NewScenesId)
                {
                    //场景已存在
                    return -1;
                }
            }
            bool result = true;
            foreach (var common in commons)
@@ -867,12 +1007,13 @@
                //添加新成员
                var addSceneMemberData = new ZigBee.Device.Scene.AddSceneMemberData
                {
                    DeviceAddr = common.DeviceAddr,
                    Type = common.Type,
                    DeviceAddr = common.DeviceAddr,
                    Epoint = common.Epoint,
                    ScenesId = getSceneIdData.NewScenesId,
                    TaskList = common.TaskList,
                    DelayTime = common.DelayTime,
                    MemberNumber=common.MemberNumber,
                    ElseScenesId = common.ElseScenesId
                };
                //common.ScenesId = getSceneIdData.NewScenesId;
@@ -922,17 +1063,30 @@
        /// <param name="scene">Scene.</param>
        public void AddScene(SceneUI scene)
        {
            var sceneUI = new SceneUI
            {
                Name = scene.Name,
                Id = scene.Id,
                IconPath = scene.IconPath,
                IconPathType = scene.IconPathType,
                AddSceneMemberDataList = scene.AddSceneMemberDataList
            };
            SceneUIList.Add(sceneUI);
            SceneUIFilePathList.Add(sceneUI.FileName);
            sceneUI.Save();
            //var sceneUI = new SceneUI
            //{
            //    Name = scene.Name,
            //    Id = scene.Id,
            //    IconPath = scene.IconPath,
            //    IconPathType = scene.IconPathType,
            //    AddSceneMemberDataList = scene.AddSceneMemberDataList
            //};
            SceneUIList.Add(scene);
            SceneUIFilePathList.Add(scene.FileName);
            scene.Save();
            Save();
        }
        /// <summary>
        /// 删除场景
        /// </summary>
        /// <param name="scene"></param>
        public void DeleteScene(SceneUI scene)
        {
            //scene.IsCollected = false;
            scene.Save();
            SceneUIList.Remove(scene);
            SceneUIFilePathList.Remove(scene.FileName);
            Save();
        }
@@ -1004,7 +1158,8 @@
                    ScenesId = sceneUI.Id,
                    TaskList = addCommon.TaskList,
                    DelayTime = addCommon.DelayTime,
                    ElseScenesId = addCommon.ElseScenesId
                    ElseScenesId = addCommon.ElseScenesId,
                    MemberNumber=addCommon.MemberNumber
                };
                //添加新成员 返回结果
                var addSceneMemberResponseAllData = await ZigBee.Device.Scene.AddSceneMemberAsync(addSceneMemberData);
@@ -1049,7 +1204,6 @@
            Save();
            Global.DeleteFilebyHomeId(sceneUI.FileName);
            HdlAutoBackupLogic.DeleteFile(sceneUI.FileName);
            HdlAutoBackupLogic.AddOrEditorFile(FileName);
        }
        #endregion
@@ -1065,6 +1219,10 @@
        {
            foreach (var r in Lists)
            {
                if (r.IsLove)
                {
                    continue;
                }
                foreach (var sceneUI in r.SceneUIList)
                {
                    if (sceneUI.Id == sceneId)
@@ -1076,6 +1234,21 @@
            return null;
        }
        /// <summary>
        /// 获取该楼层所有场景
        /// </summary>
        /// <param name="floorId"></param>
        /// <returns></returns>
        public List<SceneUI> GetSameFloorScenes(string floorId)
        {
            List<SceneUI> sceneUIs = new List<SceneUI> { };
            var rooms= CurrentRoom.GetRoomsByFloorId(floorId);
            foreach(var r in rooms)
            {
                sceneUIs.AddRange(r.SceneUIList);
            }
            return sceneUIs;
        }
        #endregion
        #region ◆ 刷新场景_________________________
@@ -1310,33 +1483,6 @@
        }
        #endregion
        #region ◆ 楼层___________________________
        /// <summary>
        /// 获取楼层名称
        /// </summary>
        /// <param name="floorId"></param>
        /// <returns></returns>
        public string GetFloorNameById(string floorId)
        {
            if (Config.Instance.Home.FloorDics.Count == 0)
            {
                return null;
            }
            foreach (var floor in Config.Instance.Home.FloorDics)
            {
                if (floorId == floor.Key)
                {
                    return floor.Value;
                }
            }
            return null;
        }
        #endregion
       
    }
}