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 bool RefreshSceneUIList() { //获取网关存在的场景 var sceneList = this.RefreshSceneListFromGateway(); if (sceneList == null) { return false; } var listEsxit = new HashSet(); foreach (var scene in sceneList) { if (scene == null) { continue; } listEsxit.Add(scene.ScenesId); //刷新scene的信息 this.RefreshScene(scene); } 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.DeleteLocalScene(sceneui); } return true; } /// /// 刷新scene的信息 /// /// private void RefreshScene(Scene.GetSceneAllInfo sceneInfo) { if (this.dicScenes.ContainsKey(sceneInfo.ScenesId) == true) { var localScene = this.dicScenes[sceneInfo.ScenesId]; //只刷新名字和绑定表 localScene.Name = sceneInfo.ScenesName; localScene.AdjustTargetList.Clear(); localScene.AdjustTargetList.AddRange(sceneInfo.DeviceList); localScene.Save(); } else { var newScene = new SceneUI(); newScene.Name = sceneInfo.ScenesName; newScene.IconPath = "SceneIcon/0.png"; newScene.Id = sceneInfo.ScenesId; newScene.AdjustTargetList.AddRange(sceneInfo.DeviceList); //添加缓存 newScene.Save(); //加入缓存 this.dicScenes[newScene.Id] = newScene; //备份 HdlAutoBackupLogic.AddOrEditorFile(newScene.FileName); } } /// /// 从网关重新刷新场景列表 /// /// private List RefreshSceneListFromGateway() { var mainGateway = ZbGateway.MainGateWay; if (mainGateway == null) { //获取网关对象失败 this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uGetGatewayTagartFail)); return null; } //超时时间 int TimeOut = 0; bool receiptAll = false; var listScene = new List(); Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); if (topic == gatewayID + "/" + "Scene/GetAllInfo_Respon") { var sceneGetAllInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); listScene.Add(sceneGetAllInfo); if (sceneGetAllInfo.ScenesNum == sceneGetAllInfo.ScenesSum) { //接收完成 receiptAll = true; TimeOut = 0; } } }; mainGateway.Actions += action; var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 807 } }; mainGateway.Send(("Scene/GetAllInfo"), System.Text.Encoding.UTF8.GetBytes(jObject.ToString())); int waitTime = 20 * 6; while (receiptAll == false && TimeOut < waitTime) { //全部接收才退出 System.Threading.Thread.Sleep(50); TimeOut++; } mainGateway.Actions -= action; action = null; if (receiptAll == false) { //网络不稳定,场景列表信息缺损 this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uNetworkUnStableAndSceneInfoIsNotFull)); return null; } return listScene; } #endregion #region ■ 添加场景___________________________ /// /// 添加新场景到网关(返回null代表出错) /// /// 场景名称 /// 执行目标 /// public async Task AddNewSceneToGateway(string sceneName, List listAdjustTarget) { int NewScenesId = -1; //如果当前住宅不是虚拟住宅 if (Common.Config.Instance.Home.IsVirtually == false) { 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; } NewScenesId = result1.getSceneIdData.NewScenesId; } else { //虚拟场景ID NewScenesId = Convert.ToInt32(DateTime.Now.ToString("HHmmss")); } //添加执行目标 var listSuccess = await this.AddTargetToScene(NewScenesId, listAdjustTarget); if (listSuccess == null) { return null; } //创建场景对象 var newScene = new SceneUI(); newScene.Name = sceneName; newScene.Id = NewScenesId; newScene.AdjustTargetList.AddRange(listSuccess); //添加缓存 newScene.Save(); //加入缓存 this.dicScenes[newScene.Id] = newScene; return newScene; } /// /// 添加执行目标到指定的场景(返回成功添加的执行目标) /// /// 场景Id /// 执行目标 /// private async Task> AddTargetToScene(int sceneId, List listAdjustTarget) { //如果当前住宅是虚拟住宅的话 if (Common.Config.Instance.Home.IsVirtually == true) { //不需要更新网关 return 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(); } } /// /// 添加虚拟场景 /// /// 指定场景id,如果为-1,则会内部自动编号(可能会重复) /// 场景名字 /// 绑定目标 /// public SceneUI AddVirtualScene(int sceneId, string sceneName, List listAdjustTarget) { if (sceneId == -1) { sceneId = Convert.ToInt32(DateTime.Now.ToString("HHmmss")); } //创建场景对象 var newScene = new SceneUI(); newScene.Name = sceneName; newScene.IconPath = "SceneIcon/0.png"; //虚拟场景ID newScene.Id = sceneId; if (listAdjustTarget != null) { newScene.AdjustTargetList.AddRange(listAdjustTarget); } //添加缓存 newScene.Save(); //加入缓存 this.dicScenes[newScene.Id] = newScene; return newScene; } #endregion #region ■ 修改场景___________________________ /// /// 修改网关的场景 /// /// 场景对象 /// 全部的执行目标 /// public async Task EditorSceneFromGateway(SceneUI sceneUI, List listAdjustTarget) { //如果当前住宅是虚拟住宅的话 if (Common.Config.Instance.Home.IsVirtually == true) { //清空场景的执行目标列表的缓存 sceneUI.AdjustTargetList.Clear(); sceneUI.AdjustTargetList.AddRange(listAdjustTarget); sceneUI.Save(); return true; } //先清空全部的执行目标 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) { //如果当前住宅是虚拟住宅的话 if (Common.Config.Instance.Home.IsVirtually == true) { //不需要更新网关 return true; } 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 DeleteLocalScene(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); } } } /// /// 删除场景(这个只移除内存) /// /// 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 ■ 获取场景___________________________ /// /// 通过场景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 = HdlResidenceLogic.Current.GetFloorNameById(room.FloorId); //更改代码:如果floorName=“”也要判断,否则有“,” if (string.IsNullOrEmpty(floorName)) { 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); } } return sceneUIs; } /// /// 获取全部房间的全部场景 /// /// public List GetAllRoomSceneList() { List sceneUIs = new List(); var listAllRoom = HdlRoomLogic.Current.GetAllListRooms(); foreach (var room in listAllRoom) { if (room.IsLove == true) { //不包含收藏房间 continue; } 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; } //如果是虚拟住宅 if (Common.Config.Instance.Home.IsVirtually == true) { //不调用网关 return true; } //执行调用场景 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) { //如果住宅为虚拟住宅 if (Common.Config.Instance.Home.IsVirtually == true) { var listAdjustTarget = new List(); listAdjustTarget.AddRange(i_scene.AdjustTargetList); return listAdjustTarget; } 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 } }