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
}
}