using Shared.Common; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using ZigBee.Device; namespace Shared.Phone.UserCenter { /// /// 场景的逻辑 /// public class HdlSceneLogic { #region ■ 变量声明___________________________ /// /// 场景的逻辑 /// private static HdlSceneLogic m_Current = null; /// /// 场景的逻辑 /// public static HdlSceneLogic Current { get { if (m_Current == null) { m_Current = new HdlSceneLogic(); } return m_Current; } } /// /// 场景对象 /// private Dictionary dicScenes = new Dictionary(); #endregion #region ■ 刷新场景___________________________ /// /// 从本地刷新场景 /// public void ReFreshByLocal() { //清空场景 this.dicScenes.Clear(); //获取全部文件 var listFile = this.GetAllSceneFile(); foreach (string fileName in listFile) { try { var jsonInfo = Encoding.UTF8.GetString(Global.ReadFileByHomeId(fileName)); var tempScene = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonInfo); if (tempScene == null) { continue; } this.dicScenes[tempScene.Id] = tempScene; } catch(Exception ex) { HdlLogLogic.Current.WriteLog(ex); try { //删掉错误文件 Global.DeleteFilebyHomeId(fileName); } catch { } } } } /// /// 刷新本地的全部场景 /// public async Task RefreshSceneUIList() { //获取网关存在的场景 var sceneList = await ZigBee.Device.Scene.GetSceneListAsync(); if (sceneList == null) { return false; } var listEsxit = new HashSet(); foreach (var scene in sceneList) { if (scene == null) { continue; } listEsxit.Add(scene.ScenesId); } var listDelete = new List(); foreach (var scId in this.dicScenes.Keys) { if (listEsxit.Contains(scId) == false) { //删除的对象 listDelete.Add(this.dicScenes[scId]); } } foreach (var sceneui in listDelete) { //执行删除 this.RemoveScene(sceneui); } return true; } #endregion #region ■ 添加场景___________________________ /// /// 添加新场景到网关(返回null代表出错) /// /// 场景名称 /// 执行目标 /// public async Task AddNewSceneToGateway(string sceneName, List listAdjustTarget) { var result1 = await Scene.GetSceneNewIdAsync(sceneName); //共通错误检测 string error = HdlCheckLogic.Current.CheckCommonErrorCode(result1); if (error != null) { this.ShowErrorMsg(error); return null; } if (result1 == null || result1.getSceneIdData == null) { //添加场景失败 string msg1 = Language.StringByID(R.MyInternationalizationString.AddSceneFail); //拼接上【网关回复超时】的Msg msg1 = UserCenterLogic.CombineGatewayTimeOutMsg(msg1, result1); this.ShowTipMsg(msg1); return null; } //添加执行目标 var listSuccess = await this.AddTargetToScene(result1.getSceneIdData.NewScenesId, listAdjustTarget); if (listSuccess == null) { return null; } //创建场景对象 var newScene = new SceneUI(); newScene.Name = sceneName; newScene.Id = result1.getSceneIdData.NewScenesId; newScene.AdjustTargetList.AddRange(listSuccess); //添加缓存 newScene.Save(); //加入缓存 this.dicScenes[newScene.Id] = newScene; return newScene; } /// /// 添加执行目标到指定的场景(返回成功添加的执行目标) /// /// 场景Id /// 执行目标 /// private async Task> AddTargetToScene(int sceneId, List listAdjustTarget) { var listSuccess = new List(); for (int i = 0; i < listAdjustTarget.Count; i++) { var data = listAdjustTarget[i]; var addData = new Scene.AddSceneMemberData(); if (data.Type == 0) { //设备 addData.Type = 0; addData.ScenesId = sceneId; addData.DeviceAddr = data.DeviceAddr; addData.Epoint = data.Epoint; addData.TaskList = data.TaskList; addData.DelayTime = 0; addData.MemberNumber = i + 1; } else if (data.Type == 1) { //场景 addData.Type = 1; addData.ScenesId = sceneId; addData.ElseScenesId = data.ElseScenesId; addData.DelayTime = 0; addData.MemberNumber = i + 1; } else { //延时 addData.Type = 2; addData.ScenesId = sceneId; addData.DelayTime = data.DelayTime; addData.MemberNumber = i + 1; } //添加新成员 返回结果 var result2 = await Scene.AddSceneMemberAsync(addData); if (result2 == null || result2.addSceneMemberResponseData == null || result2.addSceneMemberResponseData.Result != 1) { continue; } //拥有成功的 listSuccess.Add(data); } if (listSuccess.Count == 0) { //添加执行目标失败 string msg1 = Language.StringByID(R.MyInternationalizationString.uAddAdjustTargetFail); this.ShowTipMsg(msg1); return null; } //如果不是全部成功的话,提示 if (listSuccess.Count != listAdjustTarget.Count) { //个别执行目标添加失败 string msg1 = Language.StringByID(R.MyInternationalizationString.uSomeAdjustTargetAddFail); this.ShowTipMsg(msg1); } return listSuccess; } /// /// 添加场景(这个单纯只改房间) /// /// Scene. public void AddSceneToRoom(Room i_room, SceneUI scene) { //添加缓存 if (i_room.ListSceneId.Contains(scene.Id) == false) { i_room.ListSceneId.Add(scene.Id); i_room.Save(); } } /// /// 改变场景房间 /// /// 场景对象 /// 新的房间的ID public void ChangedSceneRoom(SceneUI scene, string newRoomId) { var room = HdlRoomLogic.Current.GetRoomBySceneId(scene.Id); if (room != null) { //房间没有改变 if (room.Id == newRoomId) { return; } //从房间中移除缓存 this.DeleteSceneFromRoom(room, scene); } //添加进新房间 var newRoom = HdlRoomLogic.Current.GetRoomById(newRoomId); this.AddSceneToRoom(newRoom, scene); } /// /// 添加搜藏场景 /// /// Scene. public void AddLoveScene(SceneUI scene) { var nowRoom = HdlRoomLogic.Current.GetLoveRoom(); //添加缓存 if (nowRoom.ListSceneId.Contains(scene.Id) == false) { nowRoom.ListSceneId.Add(scene.Id); nowRoom.Save(); } } /// /// 删除场景(这个只移除内存) /// /// public void DeleteSceneFromRoom(Room i_room, SceneUI scene) { //移除缓存 if (i_room.ListSceneId.Contains(scene.Id) == true) { i_room.ListSceneId.Remove(scene.Id); i_room.Save(); } } /// /// 删除搜藏场景 /// /// public void DeleteLoveScene(SceneUI scene) { var nowRoom = HdlRoomLogic.Current.GetLoveRoom(); //移除缓存 if (nowRoom.ListSceneId.Contains(scene.Id) == true) { nowRoom.ListSceneId.Remove(scene.Id); nowRoom.Save(); } } #endregion #region ■ 修改场景___________________________ /// /// 修改网关的场景 /// /// 场景对象 /// 全部的执行目标 /// public async Task EditorSceneFromGateway(SceneUI sceneUI, List listAdjustTarget) { //先清空全部的执行目标 var deleteData = new Scene.SceneRemoveMemberData(); var deleteTargetData = new List(); for (int i = 0; i < sceneUI.AdjustTargetList.Count; i++) { var data = sceneUI.AdjustTargetList[i]; var removeData = new Scene.RemoveSceneDeviceListInfo(); if (data.Type == 0) { //设备 removeData.Type = 0; removeData.DeviceAddr = data.DeviceAddr; removeData.Epoint = data.Epoint; removeData.MemberNumber = data.MemberNumber; } else if (data.Type == 1) { //场景 removeData.Type = 1; removeData.ElseScenesId = data.ElseScenesId; removeData.MemberNumber = data.MemberNumber; } else { //延时 removeData.Type = 2; removeData.DelayTime = data.DelayTime; removeData.MemberNumber = data.MemberNumber; } //拥有成功的 deleteTargetData.Add(removeData); } deleteData.DeviceList = deleteTargetData; deleteData.ScenesId = sceneUI.Id; //执行清空 var result = await Scene.RemoveSceneMemberAsync(deleteData); if (result == null || result.removeSceneMemberResponseData == null) { //初始化执行目标失败 string msg1 = Language.StringByID(R.MyInternationalizationString.uInitAdjustTargetFail); //拼接上【网关回复超时】的Msg msg1 = UserCenterLogic.CombineGatewayTimeOutMsg(msg1, result); this.ShowTipMsg(msg1); return false; } if (result.removeSceneMemberResponseData.Result != 0) { //初始化执行目标失败 string msg1 = Language.StringByID(R.MyInternationalizationString.uInitAdjustTargetFail); this.ShowTipMsg(msg1); return false; } //清空场景的执行目标列表的缓存 sceneUI.AdjustTargetList.Clear(); //然后重新添加 var listSuccess = await this.AddTargetToScene(sceneUI.Id, listAdjustTarget); if (listSuccess == null) { return false; } sceneUI.AdjustTargetList.AddRange(listSuccess); sceneUI.Save(); return true; } /// /// 修改网关的场景名称 /// /// 场景对象 /// 新的名字 /// public async Task EditorSceneNameFromGateway(SceneUI scene, string newName) { var result1 = await Scene.RenameSceneAsync(scene.Id, newName); //共通错误检测 string error = HdlCheckLogic.Current.CheckCommonErrorCode(result1); if (error != null) { this.ShowErrorMsg(error); return false; } if (result1 == null || result1.sceneRenameResponseData == null) { //修改场景名称失败 string msg1 = Language.StringByID(R.MyInternationalizationString.uEditorSceneNameFail); //拼接上【网关回复超时】的Msg msg1 = UserCenterLogic.CombineGatewayTimeOutMsg(msg1, result1); this.ShowTipMsg(msg1); return false; } if (result1.sceneRenameResponseData.Result == 2) { //目标场景不存在 string msg1 = Language.StringByID(R.MyInternationalizationString.uTargetSceneIsNotExsit); this.ShowTipMsg(msg1); return false; } if (result1.sceneRenameResponseData.Result != 1) { //修改场景名称失败 string msg1 = Language.StringByID(R.MyInternationalizationString.uEditorSceneNameFail); this.ShowTipMsg(msg1); return false; } return true; } #endregion #region ■ 删除场景___________________________ /// /// 移除场景--该仅进行了对本地场景数据的删除 /// /// Scene user interface. public void RemoveScene(SceneUI sceneUI) { //移除缓存 this.dicScenes.Remove(sceneUI.Id); var room = HdlRoomLogic.Current.GetRoomBySceneId(sceneUI.Id); if (room != null) { room.ListSceneId.Remove(sceneUI.Id); room.Save(); } //移除喜爱 var roomLove = HdlRoomLogic.Current.GetLoveRoom(); if (roomLove.ListSceneId.Contains(sceneUI.Id) == true) { roomLove.ListSceneId.Remove(sceneUI.Id); roomLove.Save(); } //删除文件 if (Global.IsExistsByHomeId(sceneUI.FileName) == true) { Global.DeleteFilebyHomeId(sceneUI.FileName); HdlAutoBackupLogic.DeleteFile(sceneUI.FileName); } //删除图片 if (sceneUI.IconPathType == 1 || sceneUI.IconPathType == 2) { if (Global.IsExistsByHomeId(sceneUI.IconPath)) { Global.DeleteFilebyHomeId(sceneUI.IconPath); HdlAutoBackupLogic.DeleteFile(sceneUI.IconPath); } } } #endregion #region ■ 获取场景___________________________ /// /// 通过场景id获取场景 /// /// The scene UIB y scene identifier. /// Scene identifier. public SceneUI GetSceneUIBySceneId(int sceneId) { if (this.dicScenes.ContainsKey(sceneId) == true) { return this.dicScenes[sceneId]; } return null; } /// /// 获取该楼层所有场景 /// /// /// public List GetSameFloorScenes(string floorId) { List sceneUIs = new List(); var rooms = HdlRoomLogic.Current.GetRoomsByFloorId(floorId); foreach (var r in rooms) { foreach (int sceneId in r.ListSceneId) { if (this.dicScenes.ContainsKey(sceneId) == true) { sceneUIs.Add(this.dicScenes[sceneId]); } } } return sceneUIs; } /// /// 根据场景Id,获取楼层和房间名字(楼层,房间名字) /// /// public string GetZoneById(int sceneId) { var room =HdlRoomLogic.Current.GetRoomBySceneId(sceneId); if (room == null) { return null; } var floorName = Shared.Common.Config.Instance.Home.GetFloorNameById(room.FloorId); if (floorName == null) { return room.Name; } return $"{floorName},{room.Name}"; } /// /// 获取未分配区域场景 /// /// public List GetUnalloctedScenes() { List sceneUIs = new List(); //已经存在的场景 var listEsxit = new HashSet(); var listAllRoom = HdlRoomLogic.Current.GetAllListRooms(); foreach (var room in listAllRoom) { if (room.IsLove == true) { //不包含收藏房间 continue; } foreach (int sceneId in room.ListSceneId) { if (listEsxit.Contains(sceneId) == false) { listEsxit.Add(sceneId); } } } foreach (var myScene in this.dicScenes.Values) { if (listEsxit.Contains(myScene.Id) == false) { sceneUIs.Add(myScene); } } if (sceneUIs.Count == 0) { return null; } return sceneUIs; } /// /// 获取全部房间的全部场景 /// /// public List GetAllRoomSceneList() { List sceneUIs = new List(); var listAllRoom = HdlRoomLogic.Current.GetAllListRooms(); foreach (var room in listAllRoom) { foreach (int sceneId in room.ListSceneId) { if (this.dicScenes.ContainsKey(sceneId) == true) { sceneUIs.Add(this.dicScenes[sceneId]); } } } return sceneUIs; } /// /// 获取指定房间的全部场景 /// /// public List GetRoomSceneList(Room i_room) { List sceneUIs = new List(); foreach (int sceneId in i_room.ListSceneId) { if (this.dicScenes.ContainsKey(sceneId) == true) { sceneUIs.Add(this.dicScenes[sceneId]); } } return sceneUIs; } #endregion #region ■ 调用场景___________________________ /// /// 调用场景 /// /// /// public async Task ControlScene(SceneUI scene) { if (scene.RemainTime > 0) { HdlThreadLogic.Current.RunMain(() => { //该场景正在延时,请稍后 var msgContr = new ShowMsgControl(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.TheSceneIsDelaying)); msgContr.Show(); }); return false; } //执行调用场景 var result = await Scene.ControlSceneAsync(scene.Id, scene.SceneDelayTime); if (result == null || result.sceneOpenData == null) { //控制场景失败 string msg = Language.StringByID(R.MyInternationalizationString.ControlSceneFail); //拼接上【网关回复超时】的Msg msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result); HdlThreadLogic.Current.RunMain(() => { //该场景正在延时,请稍后 var msgContr = new ShowMsgControl(ShowMsgType.Tip, msg); msgContr.Show(); }); return false; } if (result.sceneOpenData.Result == 0) { //控制场景失败 string msg = Language.StringByID(R.MyInternationalizationString.ControlSceneFail); HdlThreadLogic.Current.RunMain(() => { //该场景正在延时,请稍后 var msgContr = new ShowMsgControl(ShowMsgType.Tip, msg); msgContr.Show(); }); return false; } return true; } #endregion #region ■ 获取场景的执行目标列表_____________ /// /// 获取场景的执行目标列表 /// /// 场景对象 /// public async Task> GetAdjustTargetList(SceneUI i_scene) { var result = await Scene.GetSceneDeviceListAsync(i_scene.Id); //共通错误检测 string error = HdlCheckLogic.Current.CheckCommonErrorCode(result); if (error != null) { this.ShowErrorMsg(error); return null; } if (result == null || result.getSceneDeviceListInfo == null) { //获取执行目标失败 string msg = Language.StringByID(R.MyInternationalizationString.uGetAdjustTargetFail); //拼接上【网关回复超时】的Msg msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result); this.ShowTipMsg(msg); return null; } i_scene.AdjustTargetList = result.getSceneDeviceListInfo.DeviceList; //保存缓存 i_scene.Save(false); var listData = new List(); listData.AddRange(result.getSceneDeviceListInfo.DeviceList); return listData; } #endregion #region ■ 延时时间线程_______________________ /// /// 开启延时时间线程(旨在全部地方的同一场景时间同步) /// public void StartDelayTimeThread(SceneUI i_scene) { if (i_scene.RemainThreadAction == true) { //线程在运行中 return; } i_scene.RemainThreadAction = true; HdlThreadLogic.Current.RunThread(() => { while (i_scene.RemainTime > 0) { System.Threading.Thread.Sleep(1000); i_scene.RemainTime--; } i_scene.RemainThreadAction = false; }); } #endregion #region ■ 一般方法___________________________ /// /// 获取本地全部的场景文件 /// /// public List GetAllSceneFile() { List listSceneFile = new List(); List listAllFile = Global.FileListByHomeId(); foreach (string file in listAllFile) { if (file.StartsWith("Scene_") == false) { //如果不是场景文件 continue; } listSceneFile.Add(file); } return listSceneFile; } /// /// 显示错误信息窗口 /// /// private void ShowErrorMsg(string msg) { Application.RunOnMainThread(() => { var contr = new ShowMsgControl(ShowMsgType.Error, msg); contr.Show(); }); } /// /// 显示Tip信息窗口 /// /// private void ShowTipMsg(string msg) { Application.RunOnMainThread(() => { var contr = new ShowMsgControl(ShowMsgType.Tip, msg); contr.Show(); }); } #endregion } }