using Shared.Common; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Net; using System.Text; using ZigBee.Device; namespace Shared.Phone.UserCenter { /// /// 分享的逻辑 /// public class HdlShardLogic { #region ■ 变量声明___________________________ /// /// 分享的逻辑 /// private static HdlShardLogic m_Current = null; /// /// 分享的逻辑 /// public static HdlShardLogic Current { get { if (m_Current == null) { m_Current = new HdlShardLogic(); } return m_Current; } set { m_Current = value; } } /// /// 分享的设备文件(key:设备主键,value:设备文件) /// private Dictionary dicShardDeviceFile = new Dictionary(); #endregion #region ■ 获取分享文件_______________________ /// /// 将分享的数据存入本地,返回的是文件名字(异常时返回null),调用 GetShardFileContent 可以获取文件内的内容 /// /// /// private List SetShardFileToLocation(List listDistributedMark) { if (listDistributedMark.Count == 0) { return new List(); } int listMarkCount = listDistributedMark.Count; List listFile = new List(); //文件夹 string strDir = System.IO.Path.Combine(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory); //不允许按系统的返回键 Shared.Common.CommonPage.BackKeyCanClick = false; UserCenterResourse.AccountOption.AppCanSignout = false; for (int i = 0; i < listDistributedMark.Count; i++) { string keys = listDistributedMark[i]; var dataPra = new { DistributedMark = keys, HouseDistributedMark = Common.Config.Instance.Home.Id, IsOtherAccountControl = Common.Config.Instance.Home.IsOthreShare }; var result = UserCenterLogic.GetResponseDataByRequestHttps("ZigbeeDataShare/GetOneShareData", false, dataPra, null, true); if (string.IsNullOrEmpty(result) == true) { //允许按系统的返回键 Shared.Common.CommonPage.BackKeyCanClick = true; UserCenterResourse.AccountOption.AppCanSignout = true; return null; } var dataResult = Newtonsoft.Json.JsonConvert.DeserializeObject(result); //文件名字 listFile.Add(dataResult.ShareName); //保存到指定文件夹下 Global.WriteFileToDirectoryByBytes(strDir, dataResult.ShareName, dataResult.ShareDataBytes); //设置进度值 ProgressFormBar.Current.SetValue(i + 1, listMarkCount); } //允许按系统的返回键 Shared.Common.CommonPage.BackKeyCanClick = true; UserCenterResourse.AccountOption.AppCanSignout = true; return listFile; } /// /// 获取分享文件的内容 /// /// 文件名称(不是全路径) /// public byte[] GetShardFileContent(string fileName) { string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory, fileName); if (System.IO.File.Exists(fullName) == false) { return null; } string path = System.IO.Path.Combine(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory); var varByte = Global.ReadFileByDirectory(path, fileName); return varByte; } /// /// 获取本地全部的共享文件 /// /// public List GetLocalAllShardFile() { string path = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory); var listFile = HdlAutoBackupLogic.GetFileFromDirectory(path); return listFile; } /// /// 文件是否存在 /// /// /// public bool IsFileExists(string fileName) { string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory, fileName); if (System.IO.File.Exists(fullName) == false) { return false; } return true; } #endregion #region ■ 添加分享文件_______________________ /// /// 添加分享文件到缓存 /// /// 原根目录下的文件名 public void AddShardFile(string fileName) { if (Global.IsExistsByHomeId(fileName) == false) { return; } string oldName = UserCenterLogic.CombinePath(fileName); string newName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory, fileName); System.IO.File.Copy(oldName, newName, true); } /// /// 添加房间对象到缓存 /// /// 房间对象 public void AddShardFile(Common.Room room) { room.IsSharedRoom = true; var data = Newtonsoft.Json.JsonConvert.SerializeObject(room); var byteData = System.Text.Encoding.UTF8.GetBytes(data); string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory, room.FileName); //写入内容 Shared.IO.FileUtils.WriteFileByBytes(fullName, byteData); } /// /// 添加场景对象到缓存 /// /// 场景 public void AddShardFile(Common.SceneUI scene) { scene.IsSharedScene = true; var data = Newtonsoft.Json.JsonConvert.SerializeObject(scene); var byteData = System.Text.Encoding.UTF8.GetBytes(data); string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory, scene.FileName); //写入内容 Shared.IO.FileUtils.WriteFileByBytes(fullName, byteData); } /// /// 添加楼层对象到缓存 /// /// 楼层 public void AddShardFile(Dictionary dic) { var data = Newtonsoft.Json.JsonConvert.SerializeObject(dic); var byteData = System.Text.Encoding.UTF8.GetBytes(data); string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory, DirNameResourse.ShardFloorFile); //写入内容 Shared.IO.FileUtils.WriteFileByBytes(fullName, byteData); } #endregion #region ■ 删除分享文件_______________________ /// /// 添加分享文件到缓存 /// /// 指定文件名字 public void DeleteShardFile(string fileName) { fileName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory, fileName); if (System.IO.File.Exists(fileName) == true) { System.IO.File.Delete(fileName); } } /// /// 清空共享文件夹 /// public void ClearShardDirectory() { this.dicShardDeviceFile.Clear(); //创建文件夹 string strDir = System.IO.Path.Combine(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory); Global.CreateEmptyDirectory(strDir, true); } #endregion #region ■ 同步服务器的分享内容_______________ /// /// 同步服务器的分享内容(里面只负责把东西存入本地) /// public bool SynchronizeDbSharedContent() { if (UserCenterResourse.UserInfo.AuthorityNo != 3) { //只有成员才有这个概念 return true; } //获取主人分享给成员的文件列表 var infoPra = new { DistributedMark = Config.Instance.Guid, HouseDistributedMark = Common.Config.Instance.Home.Id, IsOtherAccountControl = Common.Config.Instance.Home.IsOthreShare }; var result = UserCenterLogic.GetResponseDataByRequestHttps("ZigbeeDataShare/GetShareDataBySubAccount", false, infoPra); if (string.IsNullOrEmpty(result) == true) { return false; } var listShardInfo = Newtonsoft.Json.JsonConvert.DeserializeObject>(result); //主键 var listAddMark = new List(); //检测取消了共享的操作使用 var listShardFile = new HashSet(); //获取前回共享文件的更新日期(keys:文件名字,value:更新日期) var dicUpdateTime = this.GetAllShardFileAgoUpdateTime(); //先看看这分享数据里面有什么鬼 foreach (var info in listShardInfo) { string updateTime = info.TimeSpan; string fileName = info.ShareName; listShardFile.Add(fileName); //如果本地没有,或者更新日期大于前回更新日期的时候 if (Global.IsExistsByHomeId(fileName) == false || dicUpdateTime.ContainsKey(fileName) == false || updateTime.CompareTo(dicUpdateTime[fileName]) > 0) { listAddMark.Add(info.DistributedMark); //更新日更新 dicUpdateTime[fileName] = updateTime; } } //从云端获取下来文件 if (listAddMark.Count > 0) { //开启进度条 共享数据同步中 ProgressFormBar.Current.Start(); ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uShardDataIsSynchronizing)); //将分享的数据存入本地(获取的是本地没有的) this.ClearShardDirectory(); var listDbFile = this.SetShardFileToLocation(listAddMark); if (listDbFile == null) { //关闭 ProgressFormBar.Current.Close(); return false; } //生成文件 foreach (string fileName in listDbFile) { var oldPath = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory, fileName); var newPath = System.IO.Path.Combine(Config.Instance.FullPath, fileName); System.IO.File.Copy(oldPath, newPath, true); if (fileName.StartsWith("Room_") == true) { //房间文件特殊处理 Config.Instance.Home.AddRoomId(fileName.Replace("Room_", string.Empty).Replace(".json", string.Empty)); } } //清空共享文件夹 this.ClearShardDirectory(); } //同步服务器的取消了的分享内容 return this.SynchronizeDeleteSharedContent(listShardFile, dicUpdateTime); } /// /// 同步服务器的取消了的分享内容 /// /// 云端上面分享的文件,为Null时从新获取 /// 分享文件的更新时间,为Null时从新获取 /// public bool SynchronizeDeleteSharedContent(HashSet listShardFile = null, Dictionary dicUpdateTime = null) { if (UserCenterResourse.UserInfo.AuthorityNo != 3) { //只有成员才有这个概念 return true; } //开启进度条 共享数据同步中 ProgressFormBar.Current.Start(); ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uShardDataIsSynchronizing)); if (dicUpdateTime == null) { //获取前回共享文件的更新日期(keys: 文件名字, value: 更新日期) dicUpdateTime = this.GetAllShardFileAgoUpdateTime(); } //重新获取 if (listShardFile == null) { listShardFile = new HashSet(); //获取主人分享给成员的文件列表 var infoPra = new { DistributedMark = Config.Instance.Guid, HouseDistributedMark = Common.Config.Instance.Home.Id, IsOtherAccountControl = Common.Config.Instance.Home.IsOthreShare }; var result = UserCenterLogic.GetResponseDataByRequestHttps("ZigbeeDataShare/GetShareDataBySubAccount", false, infoPra); if (string.IsNullOrEmpty(result) == true) { //关闭 ProgressFormBar.Current.Close(); return false; } var listShardData = Newtonsoft.Json.JsonConvert.DeserializeObject>(result); //先看看这分享数据里面有什么鬼 foreach (var info in listShardData) { listShardFile.Add(info.ShareName); } } //清空楼层数据 Common.Config.Instance.Home.FloorDics.Clear(); //然后检测本地的文件 var listLocalFile = Global.FileListByHomeId(); foreach (string fileName in listLocalFile) { if (fileName == DirNameResourse.ShardFloorFile) { //楼层文件 var varData = Global.ReadFileByHomeId(fileName); var dicFloor = Newtonsoft.Json.JsonConvert.DeserializeObject>(Encoding.UTF8.GetString(varData)); Common.Config.Instance.Home.FloorDics = dicFloor; //暂时不保存,留在最后面才保存 Global.DeleteFilebyHomeId(fileName); } if (listShardFile.Contains(fileName) == true) { //本地的这个文件还分享着,没有问题 continue; } //检测本地设备文件,是否存在已经取消了共享了的 if (fileName.StartsWith("Device_") == true) { //删除掉这个设备文件 Global.DeleteFilebyHomeId(fileName); dicUpdateTime.Remove(fileName); } //检测本地房间文件,是否存在已经取消了共享了的 else if (fileName.StartsWith("Room_") == true) { var roomData = Global.ReadFileByHomeId(fileName); var nowRoom = Newtonsoft.Json.JsonConvert.DeserializeObject(Encoding.UTF8.GetString(roomData)); if (nowRoom.IsSharedRoom == false) { //这个房间是他自己创建的 continue; } //删除掉这个房间文件 Global.DeleteFilebyHomeId(fileName); dicUpdateTime.Remove(fileName); Config.Instance.Home.RemoveRoomId(nowRoom.Id); } //检测本地场景文件,是否存在已经取消了共享了的 else if (fileName.StartsWith("Scene_") == true) { var sceneData = Global.ReadFileByHomeId(fileName); var nowScene = Newtonsoft.Json.JsonConvert.DeserializeObject(Encoding.UTF8.GetString(sceneData)); if (nowScene.IsSharedScene == false) { //这个场景是他自己创建的 continue; } //删除掉这个场景文件 Global.DeleteFilebyHomeId(fileName); dicUpdateTime.Remove(fileName); } } //保存楼层数据 Common.Config.Instance.Home.Save(false); //网关文件非合法性是刷新设备列表的函数里面实现 //保存全部分享文件的更新日期 this.SaveAllShardFileAgoUpdateTime(dicUpdateTime); //关闭 ProgressFormBar.Current.Close(); return true; } #endregion #region ■ 同步内容更新时间___________________ /// /// 获取全部分享文件的前回更新日期 /// /// private Dictionary GetAllShardFileAgoUpdateTime() { var dicTime = new Dictionary(); var data = Global.ReadFileByDirectory(DirNameResourse.LocalMemoryDirectory, DirNameResourse.ShardFileUpdateTimeFile); if (data == null) { //目标文件不存在 return dicTime; } dicTime = Newtonsoft.Json.JsonConvert.DeserializeObject>(System.Text.Encoding.UTF8.GetString(data)); return dicTime; } /// /// 保存全部分享文件的更新日期 /// /// private void SaveAllShardFileAgoUpdateTime(Dictionary dicTime) { var data = Newtonsoft.Json.JsonConvert.SerializeObject(dicTime); var byteData = System.Text.Encoding.UTF8.GetBytes(data); Global.WriteFileToDirectoryByBytes(DirNameResourse.LocalMemoryDirectory, DirNameResourse.ShardFileUpdateTimeFile, byteData); } #endregion //----------------------------------分割线(数据预备)------------------------------------------------- #region ■ 数据预备___________________________ /// /// 获取成员共享列表然后保存到本地(用完之后最好调用清空 ClearShardDirectory函数清空) /// /// /// 成员的分享数据 /// 如果不知道这是什么东西,就New一个,然后缓存起来,调用其他函数都需要这个东西 /// New的时候记得对SubAccountDistributedMark赋值,它是成员列表接口返回的SubAccountDistributedMark /// /// public bool GetMemberShardContentListAndSetToLocation(MemberShardInfoData memberShardInfo) { if (memberShardInfo.Refresh == false) { //从本地获取成员的分享列表 this.GetMemberShardContentListFromLocal(memberShardInfo); return true; } memberShardInfo.Refresh = false; //正在获取分享数据 ProgressFormBar.Current.Start(); ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uShardContentGetting)); var infoPra = new { DistributedMark = memberShardInfo.SubAccountDistributedMark, HouseDistributedMark = Shared.Common.Config.Instance.HomeId, IsOtherAccountControl = Common.Config.Instance.Home.IsOthreShare }; var result = UserCenterLogic.GetResponseDataByRequestHttps("ZigbeeDataShare/GetShareDataBySubAccount", false, infoPra); if (string.IsNullOrEmpty(result) == true) { //关闭进度条 ProgressFormBar.Current.Close(); return false; } var listData = Newtonsoft.Json.JsonConvert.DeserializeObject>(result); //先清空共享文件夹 this.ClearShardDirectory(); var listMark = new List(); foreach (var data in listData) { //性能优化:如果本地拥有这个文件的话,直接使用那个文件 string fileName = data.ShareName; //记录起它的主键 memberShardInfo.dicAllShardKeys[fileName] = data.DistributedMark; if (fileName.StartsWith("Room_") == true || fileName.StartsWith("Scene_") == true) { //房间文件和场景文件需要重新反序列化 listMark.Add(data.DistributedMark); continue; } if (Shared.Common.Global.IsExistsByHomeId(fileName) == true) { //其他文件的话,如果本地存在,则以本地文件为准 this.AddShardFile(fileName); continue; } listMark.Add(data.DistributedMark); } //将分享的数据存入本地,返回的是文件名字(异常时返回null) var listFile = this.SetShardFileToLocation(listMark); if (listFile == null) { //关闭进度条 ProgressFormBar.Current.Close(); return false; } //从本地获取成员的分享列表 this.GetMemberShardContentListFromLocal(memberShardInfo); //关闭进度条 ProgressFormBar.Current.Close(); return true; } /// /// 从本地获取成员的分享列表 /// /// 成员的分享数据的缓存(调用这个函数会刷新这个变量的信息) private void GetMemberShardContentListFromLocal(MemberShardInfoData memberShardInfo) { memberShardInfo.dicShardRoom = new Dictionary(); this.dicShardDeviceFile.Clear(); //keys:主键 value:文件名 var dicDeviceFile = new Dictionary(); //keys:场景id value:文件名 var dicSceneFile = new Dictionary(); var listFile = this.GetLocalAllShardFile(); //先初始化房间 foreach (string fileName in listFile) { try { if (fileName.StartsWith("Room_") == true) { //房间文件 var byteData = this.GetShardFileContent(fileName); if (byteData != null) { string valueData = System.Text.Encoding.UTF8.GetString(byteData); var roomTemp = Newtonsoft.Json.JsonConvert.DeserializeObject(valueData); memberShardInfo.dicShardRoom[fileName] = roomTemp; } } else if (fileName == DirNameResourse.ShardFloorFile) { //楼层文件 var byteData = this.GetShardFileContent(fileName); if (byteData != null) { string valueData = System.Text.Encoding.UTF8.GetString(byteData); memberShardInfo.dicShardFloor = Newtonsoft.Json.JsonConvert.DeserializeObject>(valueData); } } else if (fileName.StartsWith("Device_") == true) { string[] Arry = fileName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(Arry[2], Convert.ToInt32(Arry[3])); this.dicShardDeviceFile[mainKeys] = fileName; //设备文件 dicDeviceFile[mainKeys] = fileName; } else if (fileName.StartsWith("Scene_") == true) { //场景文件 dicSceneFile[(Convert.ToInt32(fileName.Replace("Scene_", string.Empty).Replace(".json", string.Empty)))] = fileName; } } catch (Exception ex) { HdlLogLogic.Current.WriteLog(ex); } } //检查设备的匹配情况 foreach (var tempRoom in memberShardInfo.dicShardRoom.Values) { //检查设备 for (int i = 0; i < tempRoom.ListDevice.Count; i++) { string deviceKeys = tempRoom.ListDevice[i]; if (dicDeviceFile.ContainsKey(deviceKeys) == false) { //移除掉这个不对劲的路径 tempRoom.ListDevice.RemoveAt(i); i--; continue; } //这个设备文件匹配得到房间 dicDeviceFile.Remove(deviceKeys); } //检查场景 for (int i = 0; i < tempRoom.ListSceneId.Count; i++) { int intId = tempRoom.ListSceneId[i]; if (dicSceneFile.ContainsKey(intId) == false) { //移除掉这个不对劲的路径 tempRoom.ListSceneId.RemoveAt(i); i--; continue; } var byteData = this.GetShardFileContent(dicSceneFile[intId]); //这个场景文件匹配得到房间 dicSceneFile.Remove(intId); if (byteData == null) { //移除掉这个不对劲的路径 tempRoom.ListSceneId.RemoveAt(i); i--; continue; } string valueData = System.Text.Encoding.UTF8.GetString(byteData); var tempUi = Newtonsoft.Json.JsonConvert.DeserializeObject(valueData); //获取场景里面的全部目标(2019.11.05追加操作,有可能那个设备是由场景嵌套来的,所以它有可能不属于任何房间) foreach (var data in tempUi.AdjustTargetList) { //设备 if (data.Type == 0) { string mainkey = LocalDevice.Current.GetDeviceMainKeys(data.DeviceAddr, data.Epoint); if (dicShardDeviceFile.ContainsKey(mainkey) == true ) { //这个设备文件匹配得到 dicDeviceFile.Remove(mainkey); } } if (data.Type == 1) { //这个场景文件匹配得到 dicSceneFile.Remove(data.ElseScenesId); } } } } //如果存在匹配不上的文件 if (dicDeviceFile.Count != 0 || dicSceneFile.Count != 0) { //创建一个临时房间来存储 var roomTemp = new Room(); roomTemp.Id = "Other"; roomTemp.FloorId = "Other"; memberShardInfo.dicShardRoom[roomTemp.FileName] = roomTemp; roomTemp.Name = Language.StringByID(R.MyInternationalizationString.uUnallocated); //还原设备对象 foreach (string deviceKeys in dicDeviceFile.Keys) { roomTemp.ListDevice.Add(deviceKeys); } //还原场景对象 foreach (int intId in dicSceneFile.Keys) { roomTemp.ListSceneId.Add(intId); } } } #endregion #region ■ 获取设备文件名_____________________ /// /// 获取设备文件名,不存在时,返回空字符串(仅限分享了的设备) /// /// 设备主键 /// public string GetShardDeviceFileName(string deviceKeys) { if (this.dicShardDeviceFile.ContainsKey(deviceKeys) == true) { return this.dicShardDeviceFile[deviceKeys]; } return string.Empty; } #endregion //----------------------------------分割线(上传新的分享)--------------------------------------------- #region ■ 执行上传新的分享___________________ /// /// 执行上传新的分享 /// /// 成员的分享数据 /// 当前的房间对象 /// 选择上传的设备 /// 选择上传的场景(不要获取它里面的绑定列表) /// 进度条的最大值,如果不为-1,则内部不会自动弹出进度条 /// 文件重复上传检测 public bool DoUploadSharedContent(MemberShardInfoData memberShardInfo, Common.Room nowRoom, List listDevice, List listScene, int BarMaxValue = -1, HashSet listCheckFile = null) { if (listDevice.Count == 0 && listScene.Count == 0) { return true; } var listCheck = new HashSet(); //获取场景里面嵌套的子设备和子场景 var listChirdDevice = new List(); var listChirdScene = new List(); foreach (var SceneTemp in listScene) { //从缓存获取场景的执行目标 this.GetSceneDeviceList(SceneTemp, listCheck, listChirdScene, listChirdDevice); } //这个也是备份 int BackgroundImageType = 0; string BackgroundImage = string.Empty; if (memberShardInfo.dicShardRoom.ContainsKey(nowRoom.FileName) == true) { BackgroundImageType = memberShardInfo.dicShardRoom[nowRoom.FileName].BackgroundImageType; BackgroundImage = memberShardInfo.dicShardRoom[nowRoom.FileName].BackgroundImage; } //防止出现错误,暂时保存两个列表(虽然没那么麻烦,不过既然已经这样写了就这样了) var dicBackDevice = new Dictionary>(); var dicBackScene = new Dictionary>(); //临时备份房间设备列表 this.BackupRoomDevicelistTemporary(memberShardInfo, dicBackDevice, dicBackScene); //获取上传的文件,然后将文件复制到指定文件夹 var listDelPic = new List(); var listFile = this.GetUploadListFile(memberShardInfo, nowRoom, listDevice, listScene, listChirdDevice, listChirdScene, listDelPic); //不允许按系统的返回键 Shared.Common.CommonPage.BackKeyCanClick = false; UserCenterResourse.AccountOption.AppCanSignout = false; if (BarMaxValue == -1) { //打开进度条 ProgressBar.Show(); //设置最大值 ProgressBar.SetMaxValue(listFile.Count); } else { //设置最大值 ProgressBar.SetMaxValue(BarMaxValue); } //上传分享 var result = this.DoUploadShardContent(memberShardInfo, listFile, listCheckFile); if (result == true) { //删除指定自定义图片 result = this.DoDeleteSharedContent(memberShardInfo, listDelPic); } if (BarMaxValue == -1) { //关闭进度条 ProgressBar.Close(); } //允许按系统的返回键 Shared.Common.CommonPage.BackKeyCanClick = true; UserCenterResourse.AccountOption.AppCanSignout = true; if (result == false) { //恢复原数据 if (memberShardInfo.TempRoom == null) { memberShardInfo.dicShardRoom[nowRoom.FileName].BackgroundImageType = BackgroundImageType; memberShardInfo.dicShardRoom[nowRoom.FileName].BackgroundImage = BackgroundImage; } this.RecoverRoomDevicelistTemporary(memberShardInfo, dicBackDevice, dicBackScene, listFile); } else { //覆盖数据 if (memberShardInfo.TempRoom != null) { memberShardInfo.dicShardRoom[nowRoom.FileName] = memberShardInfo.TempRoom; } } memberShardInfo.TempRoom = null; return result; } /// /// 获取上传的文件名 /// /// 成员的分享数据 /// 需要上传到云端的房间对象(注意,这个房间是主人的房间对象,而不是虚拟的) /// 分享的设备列表(注意,这个东西是主人的) /// 分享的场景列表(注意,这个东西是主人的) /// 场景里面递归获取的设备 /// 场景里面递归获取的场景 /// 需要删除的图片 /// private List GetUploadListFile(MemberShardInfoData memberShardInfo, Common.Room nowRoom, List listDevice, List listScene, List listChirdDevice, List listChirdScene, List listDelPic) { var listFile = new List(); Common.Room roomTemp = null; if (memberShardInfo.dicShardRoom.ContainsKey(nowRoom.FileName) == false) { //克隆一个对象 roomTemp = HdlRoomLogic.Current.CloneRoomClass(nowRoom); memberShardInfo.TempRoom = roomTemp; //新分享的房间,如果图片是自定义的,并且这个图片是存在的,则上传图片 if (roomTemp.BackgroundImageType != 0 && Common.Global.IsExistsByHomeId(roomTemp.BackgroundImage) == true) { //自定义的图片,它存在于本地,但是它是全路径 listFile.Add(roomTemp.BackgroundImage); this.AddShardFile(roomTemp.BackgroundImage); } } else { roomTemp = memberShardInfo.dicShardRoom[nowRoom.FileName]; //如果云端分享的房间的图片和主人的不一样的时候 if (roomTemp.BackgroundImage != nowRoom.BackgroundImage) { if (roomTemp.BackgroundImageType != 0) { //删除自定义图片 listDelPic.Add(roomTemp.BackgroundImage); } if (nowRoom.BackgroundImageType != 0 && Common.Global.IsExistsByHomeId(nowRoom.BackgroundImage) == true) { //自定义的图片,它存在于本地,但是它是全路径 listFile.Add(nowRoom.BackgroundImage); this.AddShardFile(nowRoom.BackgroundImage); } //变更图片设置 roomTemp.BackgroundImageType = nowRoom.BackgroundImageType; roomTemp.BackgroundImage = nowRoom.BackgroundImage; } } foreach (var device in listDevice) { //设备 listFile.Add(device.FilePath); this.AddShardFile(device.FilePath); //加点缓存 string mainKeys = LocalDevice.Current.GetDeviceMainKeys(device); this.dicShardDeviceFile[mainKeys] = device.FilePath; if (roomTemp.ListDevice.Contains(mainKeys) == false) { roomTemp.ListDevice.Add(mainKeys); } } //递归获取的设备不需要加入到房间 foreach (var device in listChirdDevice) { //设备 listFile.Add(device.FilePath); this.AddShardFile(device.FilePath); //加点缓存 this.dicShardDeviceFile[LocalDevice.Current.GetDeviceMainKeys(device)] = device.FilePath; } //场景 foreach (var secene in listScene) { if (secene.IconPathType != 0 && Common.Global.IsExistsByHomeId(secene.IconPath) == true) { //自定义的图片,它存在于本地 listFile.Add(secene.IconPath); this.AddShardFile(secene.IconPath); } listFile.Add(secene.FileName); this.AddShardFile(secene); if (roomTemp.ListSceneId.Contains(secene.Id) == false) { roomTemp.ListSceneId.Add(secene.Id); } } //递归获取的场景不需要加入到房间 foreach (var secene in listChirdScene) { listFile.Add(secene.FileName); this.AddShardFile(secene); } //房间文件也给过去 listFile.Add(roomTemp.FileName); this.AddShardFile(roomTemp); //反正楼层文件很小,一起给过去吧 if (roomTemp.FloorId != string.Empty) { memberShardInfo.dicShardFloor[roomTemp.FloorId] = HdlResidenceLogic.Current.GetFloorNameById(roomTemp.FloorId); } this.AddShardFile(memberShardInfo.dicShardFloor); listFile.Add(DirNameResourse.ShardFloorFile); return listFile; } /// /// 获取场景的目标设备列表(这个不能从分享数据中获取) /// /// 场景 /// 重复检测用 /// 添加分享的场景列表 /// 添加分享的设备列表 /// public void GetSceneDeviceList(Common.SceneUI scene, HashSet listCheck, List listSceneUI, List listDevice) { foreach (var data in scene.AdjustTargetList) { //设备 if (data.Type == 0) { string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(data.DeviceAddr, data.Epoint); if (listCheck.Contains(mainKeys) == true) { //不重复添加 continue; } listCheck.Add(mainKeys); var device = Common.LocalDevice.Current.GetDevice(data.DeviceAddr, data.Epoint); if (device != null) { listDevice.Add(device); } } //场景 else if (data.Type == 1) { string mainKeys = data.ElseScenesId.ToString(); if (listCheck.Contains(mainKeys) == true) { //不重复添加 continue; } listCheck.Add(mainKeys); //获取场景对象 var sceneUi = HdlSceneLogic.Current.GetSceneUIBySceneId(data.ElseScenesId); if (sceneUi != null) { listSceneUI.Add(sceneUi); } } } } #endregion #region ■ 上传新的分享_______________________ /// /// 上传分享(返回云端分享文件的主键:DistributedMark) /// /// 成员的分享数据 /// 上传的文件名 /// 重复文件上传检测 /// private bool DoUploadShardContent(MemberShardInfoData memberShardInfo, List listFile, HashSet listCheckFile) { var dicKeys = new Dictionary(); for (int i = 0; i < listFile.Count; i++) { string fileName = listFile[i]; if (listCheckFile != null) { if (listCheckFile.Contains(fileName) == true) { //重复文件不再上传 continue; } listCheckFile.Add(fileName); } if (fileName.EndsWith(".png") == true) { //上传图片 var result = this.UpLoadBigBackupFileToDB(memberShardInfo, fileName); if (result == null) { return false; } dicKeys[fileName] = result; } else { var info = new UploadShardContent(); info.SubAccountDistributedMark = memberShardInfo.SubAccountDistributedMark; info.ShareName = fileName; info.ShareDataBytes = HdlShardLogic.Current.GetShardFileContent(fileName); //追加共享 if (memberShardInfo.dicAllShardKeys.ContainsKey(fileName) == false) { var result = UserCenterLogic.GetResponseDataByRequestHttps("ZigbeeDataShare/AddShareData", false, info, null, true); if (string.IsNullOrEmpty(result) == true) { return false; } //这里有点特殊,接口是直接返回主键回来的,而不是Jsoin dicKeys[fileName] = result; } else { info.DistributedMark = memberShardInfo.dicAllShardKeys[fileName]; var result = UserCenterLogic.GetResultStatuByRequestHttps("ZigbeeDataShare/EditShareData", false, info, null, true); if (result == false) { return false; } dicKeys[fileName] = info.DistributedMark; } } //设置进度值 ProgressBar.SetValue(1); } //如果没有错误,则添加临时缓存 foreach (var keys in dicKeys.Keys) { memberShardInfo.dicAllShardKeys[keys] = dicKeys[keys]; } return true; } /// /// 上传图片文件到云端 /// /// 文件夹的全路径 /// 图片文件列表 /// private string UpLoadBigBackupFileToDB(MemberShardInfoData memberShardInfo, string fileName) { string fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DownLoadShardDirectory, fileName); if (System.IO.File.Exists(fullName) == false) { return null; } var nvc = new NameValueCollection(); nvc.Add("ShareName", fileName); nvc.Add("HouseDistributedMark", Common.Config.Instance.Home.Id); nvc.Add("SubAccountDistributedMark", memberShardInfo.SubAccountDistributedMark); nvc.Add("ShareDataBytes", Convert.ToBase64String(this.GetShardFileContent(fileName))); //追加共享 if (memberShardInfo.dicAllShardKeys.ContainsKey(fileName) == false) { //这里有点特殊,接口是直接返回主键回来的,而不是Jsoin var result = this.DoUpLoadBigBackupFileToDB("ZigbeeDataShare/AddShareData", fullName, nvc); return result; } else { nvc.Add("DistributedMark", memberShardInfo.dicAllShardKeys[fileName]); var result = this.DoUpLoadBigBackupFileToDB("ZigbeeDataShare/EditShareData", fullName, nvc); if (result == null) { return null; } return memberShardInfo.dicAllShardKeys[fileName]; } } /// /// 执行上传大文件 /// /// 请求接口 /// 文件名字(含路径) /// /// private string DoUpLoadBigBackupFileToDB(string RequestName, string fullFileName, NameValueCollection nvc) { string paramName = "file"; string contentType = "application/octet-stream"; string requestUrl = $"{CommonPage.RequestHttpsHost}/{RequestName}"; string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); var wr = (HttpWebRequest)WebRequest.Create(requestUrl); wr.ContentType = "multipart/form-data; boundary=" + boundary; wr.Method = "POST"; wr.KeepAlive = true; wr.Credentials = System.Net.CredentialCache.DefaultCredentials; wr.Headers.Add(HttpRequestHeader.Authorization, Config.Instance.Token); var rs = wr.GetRequestStream(); string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; foreach (string key in nvc.Keys) { rs.Write(boundarybytes, 0, boundarybytes.Length); string formitem = string.Format(formdataTemplate, key, nvc[key]); byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); rs.Write(formitembytes, 0, formitembytes.Length); } rs.Write(boundarybytes, 0, boundarybytes.Length); string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; string header = string.Format(headerTemplate, paramName, fullFileName, contentType); byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); rs.Write(headerbytes, 0, headerbytes.Length); var fileStream = new FileStream(fullFileName, FileMode.Open, FileAccess.Read); byte[] buffer = new byte[4096]; int bytesRead = 0; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { rs.Write(buffer, 0, bytesRead); } fileStream.Close(); byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); rs.Write(trailer, 0, trailer.Length); rs.Close(); WebResponse wresp = null; try { wresp = wr.GetResponse(); Stream stream2 = wresp.GetResponseStream(); StreamReader reader2 = new StreamReader(stream2); string result = reader2.ReadToEnd(); var data = Newtonsoft.Json.JsonConvert.DeserializeObject(result); bool flage = UserCenterLogic.CheckNotEorrorMsg(data, requestUrl); if (flage == true) { //编辑的时候,这个东西会是null return data.ResponseData == null ? "1" : data.ResponseData.ToString(); } //Log出力 IMessageCommon.Current.GetMsgByRequestName(RequestName, data, nvc); return null; } catch { return null; } finally { if (wresp != null) { wresp.Close(); wresp = null; } wr = null; } } #endregion #region ■ 临时备份房间设备列表_______________ /// /// 临时备份房间设备列表 /// /// 成员的分享数据 /// 空的设备备份列表 /// 空的场景备份列表 private void BackupRoomDevicelistTemporary(MemberShardInfoData memberShardInfo, Dictionary> dicBackDevice, Dictionary> dicBackScene) { foreach (var roomKeys in memberShardInfo.dicShardRoom.Keys) { dicBackDevice[roomKeys] = new List(); dicBackScene[roomKeys] = new List(); dicBackDevice[roomKeys].AddRange(memberShardInfo.dicShardRoom[roomKeys].ListDevice); dicBackScene[roomKeys].AddRange(memberShardInfo.dicShardRoom[roomKeys].ListSceneId); } } /// /// 还原临时备份的房间设备列表 /// /// 成员的分享数据 /// 临时备份的设备备份列表 /// 临时备份的场景备份列表 /// 上传的文件名 private void RecoverRoomDevicelistTemporary(MemberShardInfoData memberShardInfo, Dictionary> dicBackDevice, Dictionary> dicBackScene, List listFile) { foreach (string fileName in listFile) { //生成的文件全部删除,房间文件的话,下面会重新生成 this.DeleteShardFile(fileName); } foreach (var roomKeys in memberShardInfo.dicShardRoom.Keys) { if (dicBackDevice.ContainsKey(roomKeys) == false) { continue; } memberShardInfo.dicShardRoom[roomKeys].ListDevice.Clear(); memberShardInfo.dicShardRoom[roomKeys].ListDevice.AddRange(dicBackDevice[roomKeys]); memberShardInfo.dicShardRoom[roomKeys].ListSceneId.Clear(); memberShardInfo.dicShardRoom[roomKeys].ListSceneId.AddRange(dicBackScene[roomKeys]); //覆盖房间文件 this.AddShardFile(memberShardInfo.dicShardRoom[roomKeys]); } } #endregion //----------------------------------分割线(删除指定分享)--------------------------------------------- #region ■ 移除指定分享内容___________________ /// /// 移除指定分享内容 /// /// 成员的分享信息 /// 当前房间 /// 要取消的设备 /// 要取消的场景 /// public bool DoDeleteSharedContent(MemberShardInfoData memberShardInfo, Common.Room nowRoom, List listDevice, List listSceneUI) { var roomTemp = memberShardInfo.dicShardRoom[nowRoom.FileName]; //防止出错,先备份列表 var listBackDevice = new List(); listBackDevice.AddRange(roomTemp.ListDevice); var listBackScene = new List(); listBackScene.AddRange(roomTemp.ListSceneId); var listMark = new List(); //要删除的文件名字 var listDeleteFile = new List(); //除了要删除的目标外,还分享的数据 var listHadShardKeys = this.GetAllShardedKeysFromDictionary(memberShardInfo, nowRoom, listDevice, listSceneUI); //先弄设备 foreach (var device in listDevice) { string deviceFileName = device.FilePath; string mainKeys = LocalDevice.Current.GetDeviceMainKeys(device); //移除路径列表 roomTemp.ListDevice.Remove(mainKeys); if (listHadShardKeys.Contains(mainKeys) == true) { //其他场景分享有这个设备,所以不删除这个设备的根源文件,只是把房间的设备列表路径移除 continue; } //设备主键 if (memberShardInfo.dicAllShardKeys.ContainsKey(deviceFileName) == true) { listMark.Add(memberShardInfo.dicAllShardKeys[deviceFileName]); } listDeleteFile.Add(device.FilePath); } //再弄场景 foreach (var sceneUI in listSceneUI) { //移除缓存 roomTemp.ListSceneId.Remove(sceneUI.Id); //其他场景还嵌套着这个场景,所以不删除这个场景的根源文件,只是把房间的场景列表路径移除 //但是它绑定的设备目标要删除 if (listHadShardKeys.Contains(sceneUI.Id.ToString()) == true) { continue; } //获取要删除的分享主键 if (memberShardInfo.dicAllShardKeys.ContainsKey(sceneUI.FileName) == true) { listMark.Add(memberShardInfo.dicAllShardKeys[sceneUI.FileName]); } listDeleteFile.Add(sceneUI.FileName); //删除自定义图片,它存在于本地,但是它是全路径 if (sceneUI.IconPathType != 0) { string[] Arry = sceneUI.IconPath.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries); string sceneFile = Arry[Arry.Length - 1]; listDeleteFile.Add(sceneFile); if (memberShardInfo.dicAllShardKeys.ContainsKey(sceneFile) == true) { listMark.Add(memberShardInfo.dicAllShardKeys[sceneFile]); } } //执行删除嵌套的设备 var dicDeviceKeys = new Dictionary(); var listBindScene = new List(); this.GetSceneBindListKeys(sceneUI, ref dicDeviceKeys, ref listBindScene); //设备的 foreach (var myKeys in dicDeviceKeys.Keys) { if (listHadShardKeys.Contains(myKeys) == true) { continue; } //获取要删除的分享主键 string fileName = dicDeviceKeys[myKeys]; if (memberShardInfo.dicAllShardKeys.ContainsKey(fileName) == true) { listMark.Add(memberShardInfo.dicAllShardKeys[fileName]); } listDeleteFile.Add(fileName); } //场景的 foreach (var seceUi in listBindScene) { if (seceUi.IconPathType != 0) { //删除自定义场景图片,它存在于本地,但是它是全路径 string[] Arry = seceUi.IconPath.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries); string sceneFile = Arry[Arry.Length - 1]; listDeleteFile.Add(sceneFile); if (memberShardInfo.dicAllShardKeys.ContainsKey(sceneFile) == true) { listMark.Add(memberShardInfo.dicAllShardKeys[sceneFile]); } } } } //如果这个房间的分享设备和场景全部删除的话,把分享房间文件也一起删除 if (roomTemp.ListDevice.Count == 0 && roomTemp.ListSceneId.Count == 0) { //房间删除 if (memberShardInfo.dicAllShardKeys.ContainsKey(nowRoom.FileName) == true) { listMark.Add(memberShardInfo.dicAllShardKeys[nowRoom.FileName]); } listDeleteFile.Add(nowRoom.FileName); if (nowRoom.BackgroundImageType != 0) { //删除自定义房间图片,它存在于本地,但是它是全路径 string[] Arry = nowRoom.BackgroundImage.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries); string roomFile = Arry[Arry.Length - 1]; listDeleteFile.Add(roomFile); if (memberShardInfo.dicAllShardKeys.ContainsKey(roomFile) == true) { listMark.Add(memberShardInfo.dicAllShardKeys[roomFile]); } } } //执行移除分享数据 var result = this.DoDeleteSharedContent(memberShardInfo, nowRoom, listMark, listDeleteFile); //同步房间文件 if (result == true && listDeleteFile.Contains(roomTemp.FileName) == false) { //执行上传房间对象 result = this.DoUploadRoomObject(memberShardInfo, roomTemp); } //同步楼层数据 if (result == true && listDeleteFile.Contains(roomTemp.FileName) == true) { int floorCount = 0; foreach (var myRoom in memberShardInfo.dicShardRoom.Values) { //2020.03.24追加:不能是自身房间 if (myRoom.FloorId == roomTemp.FloorId && myRoom.Id != roomTemp.Id) { floorCount++; } } if (floorCount == 0) { //如果该楼层已经删完房间了,则更新楼层 memberShardInfo.dicShardFloor.Remove(roomTemp.FloorId); //执行上传对象 result = this.DoUploadFloorObject(memberShardInfo); } } if (result == false) { //恢复 roomTemp.ListDevice.Clear(); roomTemp.ListDevice.AddRange(listBackDevice); roomTemp.ListSceneId.Clear(); roomTemp.ListSceneId.AddRange(listBackScene); } return result; } #endregion #region ■ 执行移除分享数据___________________ /// /// 执行移除分享数据 /// /// 成员的分享内容 /// 当前房间 /// 要移除的主键 /// 要删除的文件(房间文件需要删除的话,必须放在最后) /// private bool DoDeleteSharedContent(MemberShardInfoData memberShardInfo, Common.Room nowRoom, List listMark, List listDeleteFile) { if (listMark.Count == 0) { //有可能只删除一个回路,而这个回路是分配到多个房间的 return true; } var info = new DeleteShardInfo(); //开启进度条 ProgressBar.Show(); var listCheck = new HashSet(); foreach (var markKeys in listMark) { //里面似乎有可能会出现重复 if (listCheck.Contains(markKeys) == true) { continue; } listCheck.Add(markKeys); info.DistributedMark = markKeys; //执行删除 var result = UserCenterLogic.GetResultStatuByRequestHttps("ZigbeeDataShare/DeleteShareData", false, info, null, true); if (result == false) { //关闭进度条 ProgressBar.Close(); return false; } } //关闭进度条 ProgressBar.Close(); for (int i = 0; i < listDeleteFile.Count; i++) { string fileName = listDeleteFile[i]; if (i == listDeleteFile.Count - 1 && fileName.StartsWith("Room_") == true) { //最后一个固定可能是房间文件,直接移除整个对象 memberShardInfo.dicShardRoom.Remove(fileName); } memberShardInfo.dicAllShardKeys.Remove(fileName); this.DeleteShardFile(fileName); } return true; } /// /// 执行移除分享数据 /// /// 成员的分享内容 /// 删除的文件 /// private bool DoDeleteSharedContent(MemberShardInfoData memberShardInfo, List listDelFile) { if (listDelFile.Count == 0) { return true; } var info = new DeleteShardInfo(); foreach (var fileName in listDelFile) { if (memberShardInfo.dicAllShardKeys.ContainsKey(fileName) == false) { //我也不知道为什么会找不到主键 continue; } info.DistributedMark = memberShardInfo.dicAllShardKeys[fileName]; //执行删除 var result = UserCenterLogic.GetResultStatuByRequestHttps("ZigbeeDataShare/DeleteShareData", false, info, null, true); if (result == false) { return false; } } for (int i = 0; i < listDelFile.Count; i++) { string fileName = listDelFile[i]; memberShardInfo.dicAllShardKeys.Remove(fileName); this.DeleteShardFile(fileName); } return true; } #endregion #region ■ 上传房间对象_______________________ /// /// 上传房间对象 /// /// 成员的共享内容 /// 需要上传到云端的房间对象 /// private bool DoUploadRoomObject(MemberShardInfoData memberShardInfo, Common.Room upDateRoom) { if (upDateRoom.Id == "Other") { return true; } var info = new EditorShardContent(); info.DistributedMark = memberShardInfo.dicAllShardKeys[upDateRoom.FileName]; info.ShareName = upDateRoom.FileName; info.SubAccountDistributedMark = memberShardInfo.SubAccountDistributedMark; var data = Newtonsoft.Json.JsonConvert.SerializeObject(upDateRoom); var byteData = System.Text.Encoding.UTF8.GetBytes(data); info.ShareDataBytes = byteData; var result = UserCenterLogic.GetResultStatuByRequestHttps("ZigbeeDataShare/EditShareData", false, info, null, true); if (result == false) { return false; } //将房间对象序列化到缓存 this.AddShardFile(upDateRoom); return true; } #endregion #region ■ 上传楼层对象_______________________ /// /// 上传楼层对象 /// /// 成员的共享内容 /// private bool DoUploadFloorObject(MemberShardInfoData memberShardInfo) { var info = new EditorShardContent(); info.DistributedMark = memberShardInfo.dicAllShardKeys[DirNameResourse.ShardFloorFile]; info.ShareName = DirNameResourse.ShardFloorFile; info.SubAccountDistributedMark = memberShardInfo.SubAccountDistributedMark; var data = Newtonsoft.Json.JsonConvert.SerializeObject(memberShardInfo.dicShardFloor); var byteData = System.Text.Encoding.UTF8.GetBytes(data); info.ShareDataBytes = byteData; var result = UserCenterLogic.GetResultStatuByRequestHttps("ZigbeeDataShare/EditShareData", false, info, null, true); if (result == false) { return false; } //将房间对象序列化到缓存 this.AddShardFile(memberShardInfo.dicShardFloor); return true; } #endregion #region ■ 移除共享的一般方法_________________ /// /// 从缓存字典中获取已经分享了的全部设备主键和场景的ID /// /// 成员的分享信息 /// 当前房间 /// 要删除的设备列表 /// 要删除的场景列表 /// private HashSet GetAllShardedKeysFromDictionary(MemberShardInfoData memberShardInfo, Common.Room nowRoom, List listDeleteDevice, List listDeleteScene) { //获取全部要删除的文件名字 var dicDeleteDeviceFile = new Dictionary(); foreach (var device in listDeleteDevice) { dicDeleteDeviceFile[LocalDevice.Current.GetDeviceMainKeys(device)] = device.FilePath; } var dicDeleteSceneFile = new Dictionary(); foreach (var scene in listDeleteScene) { dicDeleteSceneFile[scene.Id] = scene.FileName; } var listShardKeys = new HashSet(); //获取还处于分享状态的主键 foreach (var roomTemp in memberShardInfo.dicShardRoom.Values) { //设备 foreach (var deviceKeys in roomTemp.ListDevice) { if (dicDeleteDeviceFile.ContainsKey(deviceKeys) == true) { //因为一个回路只能分配一个区域,所以可以直接判断 continue; } if (listShardKeys.Contains(deviceKeys) == false) { //这个文件还分享着 listShardKeys.Add(deviceKeys); } } //场景 foreach (var sceneId in roomTemp.ListSceneId) { if (roomTemp.FileName == nowRoom.FileName) { //如果循环到了当前房间 if (dicDeleteSceneFile.ContainsKey(sceneId) == true) { //如果是删除目标,则不添加 continue; } } var byteData = this.GetShardFileContent($"Scene_{sceneId}.json"); if (byteData == null) { continue; } string valueData = System.Text.Encoding.UTF8.GetString(byteData); var sceneTemp = Newtonsoft.Json.JsonConvert.DeserializeObject(valueData); //获取场景里面的全部目标 var listTempKeys = new HashSet(); //从场景对象里面获取全部的绑定目标的主键(这里面的东西必须从分享数据中获取) this.GetSceneBindListKeys(sceneTemp, ref listTempKeys); if (listShardKeys.Contains(sceneId.ToString()) == false) { //场景自身 listShardKeys.Add(sceneId.ToString()); } foreach (string myKeys2 in listTempKeys) { if (listShardKeys.Contains(myKeys2) == false) { listShardKeys.Add(myKeys2); } } } } return listShardKeys; } /// /// 从场景对象里面获取全部的绑定目标的主键(这里面的东西必须从分享数据中获取) /// /// 场景 /// 设备主键列表(里面没有场景),keys:主键,value:文件名 /// 绑定的场景对象 private void GetSceneBindListKeys(Common.SceneUI scene, ref Dictionary dicDeviceKeys, ref List listBindScene) { foreach (var data in scene.AdjustTargetList) { //设备 if (data.Type == 0) { string mainkey = LocalDevice.Current.GetDeviceMainKeys(data.DeviceAddr, data.Epoint); if (dicShardDeviceFile.ContainsKey(mainkey) == true && dicDeviceKeys.ContainsKey(mainkey) == false) { dicDeviceKeys[mainkey] = dicShardDeviceFile[mainkey]; } } if (data.Type == 1) { var byteData = this.GetShardFileContent($"Scene_{data.ElseScenesId}.json"); if (byteData != null) { string valueData = System.Text.Encoding.UTF8.GetString(byteData); var sceneTemp = Newtonsoft.Json.JsonConvert.DeserializeObject(valueData); listBindScene.Add(sceneTemp); } } } } /// /// 从场景对象里面获取全部的绑定目标的主键(这里面的东西必须从分享数据中获取) /// /// 场景 /// 主键列表(设备和场景) private void GetSceneBindListKeys(Common.SceneUI scene, ref HashSet listKeys) { foreach (var data in scene.AdjustTargetList) { //设备 if (data.Type == 0) { string mainkey = LocalDevice.Current.GetDeviceMainKeys(data.DeviceAddr, data.Epoint); if (listKeys.Contains(mainkey) == false) { listKeys.Add(mainkey); } } if (data.Type == 1) { if (listKeys.Contains(data.ElseScenesId.ToString()) == false) { listKeys.Add(data.ElseScenesId.ToString()); } } } } #endregion #region ■ 结构体类___________________________ /// /// 上传分享的内容 /// private class UploadShardContent : IfacePraCommon { /// /// 分享数据的主键 /// public string DistributedMark = string.Empty; /// /// 分享名字 /// public string ShareName = string.Empty; /// /// 住宅ID /// public string HouseDistributedMark = Common.Config.Instance.Home.Id; /// /// 子账号的guid /// public string SubAccountDistributedMark = string.Empty; /// /// 分享内容 /// public byte[] ShareDataBytes = null; } /// /// 删除共享的内容 /// private class DeleteShardInfo : IfacePraCommon { /// /// 共享数据的唯一标识 /// public string DistributedMark = null; /// /// 住宅ID /// public string HouseDistributedMark = Common.Config.Instance.Home.Id; } /// /// 编辑共享内容 /// private class EditorShardContent : IfacePraCommon { /// /// 主键 /// public string DistributedMark = string.Empty; /// /// 分享名字 /// public string ShareName = string.Empty; /// /// 住宅ID /// public string HouseDistributedMark = Common.Config.Instance.Home.Id; /// /// 分享内容 /// public byte[] ShareDataBytes = null; /// /// 子账号的Guid /// public string SubAccountDistributedMark = string.Empty; } /// /// 接收分享数据 /// private class ReceiveShardInfoResult { /// /// 文件名字 /// public string ShareName = string.Empty; /// /// 主键 /// public string DistributedMark = string.Empty; } #endregion } }