From 9f326f4000847e6167d8166fa2f6a66f53cb3734 Mon Sep 17 00:00:00 2001 From: 黄学彪 <hxb@hdlchina.com.cn> Date: 星期四, 17 十二月 2020 09:07:13 +0800 Subject: [PATCH] 新云端Ver1.3 --- ZigbeeApp/Shared/Phone/Common/Logic/HdlShardLogic.cs | 2561 +++++++++++++++++++++++++++++++---------------------------- 1 files changed, 1,347 insertions(+), 1,214 deletions(-) diff --git a/ZigbeeApp/Shared/Phone/Common/Logic/HdlShardLogic.cs b/ZigbeeApp/Shared/Phone/Common/Logic/HdlShardLogic.cs index e8b39fe..0689ba2 100644 --- a/ZigbeeApp/Shared/Phone/Common/Logic/HdlShardLogic.cs +++ b/ZigbeeApp/Shared/Phone/Common/Logic/HdlShardLogic.cs @@ -39,193 +39,29 @@ } } /// <summary> - /// 鍒嗕韩鐨勮澶囨枃浠�(key:璁惧涓婚敭,value:璁惧鏂囦欢) + /// 鍒嗕韩鍘嬬缉鏂囦欢鐨勫悕瀛� /// </summary> - private Dictionary<string, string> dicShardDeviceFile = new Dictionary<string, string>(); - - #endregion - - #region 鈻� 鑾峰彇鍒嗕韩鏂囦欢_______________________ - + private const string SHARED_BIN_FILE = "SharedData.bin"; /// <summary> - /// 灏嗗垎浜殑鏁版嵁瀛樺叆鏈湴,杩斿洖鐨勬槸鏂囦欢鍚嶅瓧(寮傚父鏃惰繑鍥瀗ull),璋冪敤 GetShardFileContent 鍙互鑾峰彇鏂囦欢鍐呯殑鍐呭 + /// 鍒嗕韩鐨勮澶囧璞� /// </summary> - /// <param name="dicFileKeys">key:鏂囦欢鐨勪富閿� value:鏂囦欢鍚嶇О</param> - /// <returns></returns> - private List<string> SetShardFileToLocation(Dictionary<string, string> dicFileKeys) - { - if (dicFileKeys.Count == 0) - { - return new List<string>(); - } - int listMarkCount = dicFileKeys.Count; - - List<string> listFile = new List<string>(); - //鏂囦欢澶� - string strDir = HdlFileNameResourse.DownLoadShardDirectory; - - //涓嶅厑璁告寜绯荤粺鐨勮繑鍥為敭 - Config.Instance.BackKeyCanClick = false; - HdlUserCenterResourse.AccountOption.AppCanSignout = false; - - //璁℃暟 - int nowCount = 0; - foreach (var fileKey in dicFileKeys.Keys) - { - nowCount++; - var pra = new { homeId = Config.Instance.Home.Id, homeShareId = fileKey }; - var result = HdlHttpLogic.Current.RequestByteFromZigbeeHttps("home-wisdom/home/share/downOne", RestSharp.Method.POST, pra, null, null, CheckMode.A璐﹀彿鏉冮檺, true, 10); - //妫�娴嬬姸鎬佺爜 - if (result == null) - { - //鍏佽鎸夌郴缁熺殑杩斿洖閿� - Config.Instance.BackKeyCanClick = true; - HdlUserCenterResourse.AccountOption.AppCanSignout = true; - return null; - } - //瀵瑰簲鏃х増鏈殑璁惧鏂囦欢 Device_OnoffOutput_abcdfrtgg_01 - string shareName = dicFileKeys[fileKey]; - if (shareName.StartsWith("Device_") == true) - { - var strArry = shareName.Split(new string[] { "_" }, StringSplitOptions.None); - if (strArry.Length == 4) - { - shareName = strArry[0] + "_" + strArry[2] + "_" + strArry[3]; - } - } - //鏂囦欢鍚嶅瓧 - listFile.Add(shareName); - //淇濆瓨鍒版寚瀹氭枃浠跺す涓� - HdlFileLogic.Current.SaveByteToFile(System.IO.Path.Combine(strDir, shareName), result); - //璁剧疆杩涘害鍊� - ProgressFormBar.Current.SetValue(nowCount, listMarkCount); - } - - //鍏佽鎸夌郴缁熺殑杩斿洖閿� - Config.Instance.BackKeyCanClick = true; - HdlUserCenterResourse.AccountOption.AppCanSignout = true; - - return listFile; - } - + private Dictionary<string, CommonDevice> DicDevices = null; /// <summary> - /// 鑾峰彇鍒嗕韩鏂囦欢鐨勫唴瀹� + /// 鍒嗕韩鐨勫満鏅璞� /// </summary> - /// <param name="fileName">鏂囦欢鍚嶇О(涓嶆槸鍏ㄨ矾寰�)</param> - /// <returns></returns> - public byte[] GetShardFileContent(string fileName) - { - string fullName = System.IO.Path.Combine(HdlFileNameResourse.DownLoadShardDirectory, fileName); - if (System.IO.File.Exists(fullName) == false) - { - return null; - } - string path = System.IO.Path.Combine(HdlFileNameResourse.DownLoadShardDirectory, fileName); - var varByte = HdlFileLogic.Current.ReadFileByteContent(path); - return varByte; - } - + private Dictionary<int, SceneUI> DicScenes = new Dictionary<int, SceneUI>(); /// <summary> - /// 鑾峰彇鏈湴鍏ㄩ儴鐨勫叡浜枃浠� + /// 鍒嗕韩鐨勬埧闂翠俊鎭� /// </summary> - /// <returns></returns> - public List<string> GetLocalAllShardFile() - { - return HdlFileLogic.Current.GetFileFromDirectory(HdlFileNameResourse.DownLoadShardDirectory); - } - + private Dictionary<string, Room> DicRooms = new Dictionary<string, Room>(); /// <summary> - /// 鏂囦欢鏄惁瀛樺湪 + /// 鍒嗕韩鐨勬ゼ灞備俊鎭� /// </summary> - /// <param name="fileName"></param> - /// <returns></returns> - public bool IsFileExists(string fileName) - { - string fullName = System.IO.Path.Combine(HdlFileNameResourse.DownLoadShardDirectory, fileName); - if (System.IO.File.Exists(fullName) == false) - { - return false; - } - return true; - } - - #endregion - - #region 鈻� 娣诲姞鍒嗕韩鏂囦欢_______________________ - + private Dictionary<string, string> DicFloor = new Dictionary<string, string>(); /// <summary> - /// 娣诲姞鍒嗕韩鏂囦欢鍒扮紦瀛� + /// 鍒嗕韩鐨勬枃浠剁殑涓婚敭(key:鏂囦欢鍚�,value:涓婚敭) /// </summary> - /// <param name="fileName">鍘熸牴鐩綍涓嬬殑鏂囦欢鍚�</param> - public void AddShardFile(string fileName) - { - if (Global.IsExistsByHomeId(fileName) == false) - { - return; - } - string oldName = System.IO.Path.Combine(Config.Instance.FullPath, fileName); - string newName = System.IO.Path.Combine(HdlFileNameResourse.DownLoadShardDirectory, fileName); - HdlFileLogic.Current.CopyFile(oldName, newName); - } - - /// <summary> - /// 娣诲姞鎴块棿瀵硅薄鍒扮紦瀛� - /// </summary> - /// <param name="room">鎴块棿瀵硅薄</param> - public void AddShardFile(Common.Room room) - { - room.IsSharedRoom = true; - string fullName = System.IO.Path.Combine(HdlFileNameResourse.DownLoadShardDirectory, room.FileName); - //鍐欏叆鍐呭 - HdlFileLogic.Current.SaveFileContent(fullName, room); - } - - /// <summary> - /// 娣诲姞鍦烘櫙瀵硅薄鍒扮紦瀛� - /// </summary> - /// <param name="scene">鍦烘櫙</param> - public void AddShardFile(Common.SceneUI scene) - { - scene.IsSharedScene = true; - string fullName = System.IO.Path.Combine(HdlFileNameResourse.DownLoadShardDirectory, scene.FileName); - //鍐欏叆鍐呭 - HdlFileLogic.Current.SaveFileContent(fullName, scene); - } - - /// <summary> - /// 娣诲姞妤煎眰瀵硅薄鍒扮紦瀛� - /// </summary> - /// <param name="dic">妤煎眰</param> - public void AddShardFile(Dictionary<string, string> dic) - { - string fullName = System.IO.Path.Combine(HdlFileNameResourse.DownLoadShardDirectory, HdlFileNameResourse.ShardFloorFile); - //鍐欏叆鍐呭 - HdlFileLogic.Current.SaveFileContent(fullName, dic); - } - - #endregion - - #region 鈻� 鍒犻櫎鍒嗕韩鏂囦欢_______________________ - - /// <summary> - /// 娣诲姞鍒嗕韩鏂囦欢鍒扮紦瀛� - /// </summary> - /// <param name="fileName">鎸囧畾鏂囦欢鍚嶅瓧</param> - public void DeleteShardFile(string fileName) - { - fileName = System.IO.Path.Combine(HdlFileNameResourse.DownLoadShardDirectory, fileName); - HdlFileLogic.Current.DeleteFile(fileName); - } - - /// <summary> - /// 娓呯┖鍏变韩鏂囦欢澶� - /// </summary> - public void ClearShardDirectory() - { - this.dicShardDeviceFile.Clear(); - //鍒涘缓鏂囦欢澶� - HdlFileLogic.Current.CreateDirectory(HdlFileNameResourse.DownLoadShardDirectory, true); - } + private Dictionary<string, string> DicShardKeys = new Dictionary<string, string>(); #endregion @@ -259,6 +95,19 @@ //鍏堢湅鐪嬭繖鍒嗕韩鏁版嵁閲岄潰鏈変粈涔堥 foreach (var info in listShardInfo) { + //濡傛灉鏄帇缂╂枃浠�,闇�瑕佺壒娈婂鐞� + if (info.FileName == SHARED_BIN_FILE) + { + //鍒ゆ柇Bin鏂囦欢鐨勬洿鏂版棩鏈� + if (dicUpdateTime.ContainsKey(info.FileName) == false + || info.CreateTime.CompareTo(dicUpdateTime[info.FileName]) > 0) + { + dicAddMark[info.Id] = info.FileName; + //鏇存柊鏃ユ洿鏂� + dicUpdateTime[info.FileName] = info.CreateTime; + } + continue; + } dicShardFile[info.FileName] = info.Id; //濡傛灉鏈湴娌℃湁,鎴栬�呮洿鏂版棩鏈熷ぇ浜庡墠鍥炴洿鏂版棩鏈熺殑鏃跺�� @@ -272,6 +121,8 @@ } } + //涓嶈蹇樿鍒濆鍖栬繖涓笢瑗� + this.DicDevices = new Dictionary<string, CommonDevice>(); //浠庝簯绔幏鍙栦笅鏉ユ枃浠� if (dicAddMark.Count > 0) { @@ -280,7 +131,6 @@ ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uShardDataIsSynchronizing)); //灏嗗垎浜殑鏁版嵁瀛樺叆鏈湴(鑾峰彇鐨勬槸鏈湴娌℃湁鐨�) - this.ClearShardDirectory(); var listDbFile = this.SetShardFileToLocation(dicAddMark); if (listDbFile == null) { @@ -289,125 +139,125 @@ return false; } - //鐢熸垚鏂囦欢 + //杞Щ鏂囦欢 foreach (string fileName in listDbFile) { - var oldPath = System.IO.Path.Combine(HdlFileNameResourse.DownLoadShardDirectory, fileName); - var newPath = System.IO.Path.Combine(Config.Instance.FullPath, fileName); - HdlFileLogic.Current.CopyFile(oldPath, newPath); + //涓嶆槸bin鏂囦欢,鍒欑Щ鍔ㄦ枃浠跺埌鏈湴 + if (fileName != SHARED_BIN_FILE) + { + var oldPath = Path.Combine(HdlFileNameResourse.DownLoadShardDirectory, fileName); + var newPath = Path.Combine(Config.Instance.FullPath, fileName); + HdlFileLogic.Current.CopyFile(oldPath, newPath); + } + else + { + //璇诲彇bin鏂囦欢鐨勫唴瀹� + var dataContent = this.GetShardFileContent(fileName); + if (dataContent != null) + { + //瑙f瀽bin鏂囦欢 + this.AdjustBinFileContent(Encoding.UTF8.GetString(dataContent)); + } + } } - //娓呯┖鍏变韩鏂囦欢澶� - this.ClearShardDirectory(); } //鍚屾鏈嶅姟鍣ㄧ殑鍙栨秷浜嗙殑鍒嗕韩鍐呭 - return this.SynchronizeDeleteSharedContent(dicShardFile, dicUpdateTime); + return this.SynchronizeSharedCancelContent(dicShardFile, dicUpdateTime); } /// <summary> /// 鍚屾鏈嶅姟鍣ㄧ殑鍙栨秷浜嗙殑鍒嗕韩鍐呭 /// </summary> - /// <param name="dicShardFile">浜戠涓婇潰鍒嗕韩鐨勬枃浠�,涓篘ull鏃朵粠鏂拌幏鍙� key:鏂囦欢鍚� value:涓婚敭</param> - /// <param name="dicUpdateTime">鍒嗕韩鏂囦欢鐨勬洿鏂版椂闂�,涓篘ull鏃朵粠鏂拌幏鍙�</param> + /// <param name="dicShardFile">浜戠涓婇潰鍒嗕韩鐨勬枃浠�,key:鏂囦欢鍚� value:涓婚敭</param> + /// <param name="dicUpdateTime">鍒嗕韩鏂囦欢鐨勬洿鏂版椂闂�,key:鏂囦欢鍚� value:鏃堕棿</param> /// <returns></returns> - public bool SynchronizeDeleteSharedContent(Dictionary<string, string> dicShardFile = null, Dictionary<string, string> dicUpdateTime = null) + private bool SynchronizeSharedCancelContent(Dictionary<string, string> dicShardFile, Dictionary<string, string> dicUpdateTime) { - if (HdlUserCenterResourse.ResidenceOption.AuthorityNo != 3) - { - //鍙湁鎴愬憳鎵嶆湁杩欎釜姒傚康 - return true; - } //寮�鍚繘搴︽潯 鍏变韩鏁版嵁鍚屾涓� ProgressFormBar.Current.Start(); ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uShardDataIsSynchronizing)); - if (dicUpdateTime == null) + //閲嶆柊璁剧疆妤煎眰 + Config.Instance.Home.FloorDics.Clear(); + foreach (var key in this.DicFloor.Keys) { - //鑾峰彇鍓嶅洖鍏变韩鏂囦欢鐨勬洿鏂版棩鏈�(keys: 鏂囦欢鍚嶅瓧, value: 鏇存柊鏃ユ湡) - dicUpdateTime = this.GetAllShardFileAgoUpdateTime(); + Config.Instance.Home.FloorDics[key] = this.DicFloor[key]; } - - //閲嶆柊鑾峰彇 - if (dicShardFile == null) + //鑾峰彇鍒嗕韩鐨勮澶囩殑鏂囦欢鍚� + var listShardDeviceFile = new HashSet<string>(); + foreach (var device in this.DicDevices.Values) { - dicShardFile = new Dictionary<string, string>(); - //鑾峰彇涓讳汉鍒嗕韩缁欐垚鍛樼殑鏂囦欢鍒楄〃 - var listShardData = this.GetShardFileListFromDb(Config.Instance.Guid); - if (listShardData == null) - { - //鍏抽棴 - ProgressFormBar.Current.Close(); - return false; - } - //鍏堢湅鐪嬭繖鍒嗕韩鏁版嵁閲岄潰鏈変粈涔堥 - foreach (var info in listShardData) - { - dicShardFile[info.FileName] = info.Id; - } + listShardDeviceFile.Add(device.FilePath); } + //浣忓畢鐨勬牴鐩綍 + var localPath = Config.Instance.FullPath; - //娓呯┖妤煎眰鏁版嵁 - Common.Config.Instance.Home.FloorDics.Clear(); //鐒跺悗妫�娴嬫湰鍦扮殑鏂囦欢 var listLocalFile = HdlFileLogic.Current.GetRootPathListFile(); foreach (string fileName in listLocalFile) { - if (fileName == HdlFileNameResourse.ShardFloorFile) + try { - //妤煎眰鏂囦欢 - var varData = Global.ReadFileByHomeId(fileName); - var dicFloor = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(Encoding.UTF8.GetString(varData)); - Common.Config.Instance.Home.FloorDics = dicFloor; - //鏆傛椂涓嶄繚瀛�,鐣欏湪鏈�鍚庨潰鎵嶄繚瀛� - Global.DeleteFilebyHomeId(fileName); - } - - if (dicShardFile.ContainsKey(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<Room>(Encoding.UTF8.GetString(roomData)); - if (nowRoom.IsSharedRoom == false) + if (dicShardFile.ContainsKey(fileName) == true) { - //杩欎釜鎴块棿鏄粬鑷繁鍒涘缓鐨� + //鏈湴鐨勮繖涓枃浠惰繕鍒嗕韩鐫�,娌℃湁闂,鎴栬搴旇鍙湁鍒嗕韩鍥剧墖 continue; } - //鍒犻櫎鎺夎繖涓埧闂存枃浠� - Global.DeleteFilebyHomeId(fileName); - dicUpdateTime.Remove(fileName); - } - //妫�娴嬫湰鍦板満鏅枃浠�,鏄惁瀛樺湪宸茬粡鍙栨秷浜嗗叡浜簡鐨� - else if (fileName.StartsWith("Scene_") == true) - { - var sceneData = Global.ReadFileByHomeId(fileName); - var nowScene = Newtonsoft.Json.JsonConvert.DeserializeObject<SceneUI>(Encoding.UTF8.GetString(sceneData)); - if (nowScene.IsSharedScene == false) + //妫�娴嬫湰鍦拌澶囨枃浠�,鏄惁瀛樺湪宸茬粡鍙栨秷浜嗗叡浜簡鐨� + if (fileName.StartsWith("Device_") == true) { - //杩欎釜鍦烘櫙鏄粬鑷繁鍒涘缓鐨� - continue; + //鍒ゆ柇鏄惁杩樺湪鍒嗕韩鐨刡in鏂囦欢閲岄潰 + if (listShardDeviceFile.Contains(fileName) == false) + { + //鍒犻櫎鎺夎繖涓澶囨枃浠� + HdlFileLogic.Current.DeleteFile(Path.Combine(localPath, fileName)); + dicUpdateTime.Remove(fileName); + } } - //鍒犻櫎鎺夎繖涓満鏅枃浠� - Global.DeleteFilebyHomeId(fileName); - dicUpdateTime.Remove(fileName); + //妫�娴嬫湰鍦版埧闂存枃浠�,鏄惁瀛樺湪宸茬粡鍙栨秷浜嗗叡浜簡鐨� + else if (fileName.StartsWith("Room_") == true) + { + var fullFile = Path.Combine(localPath, fileName); + var roomData = HdlFileLogic.Current.ReadFileTextContent(fullFile); + if (roomData != null) + { + var nowRoom = Newtonsoft.Json.JsonConvert.DeserializeObject<Room>(roomData); + if (nowRoom.IsSharedRoom == false || this.DicRooms.ContainsKey(nowRoom.Id) == true) + { + //杩欎釜鎴块棿鏄粬鑷繁鍒涘缓鐨�,鎴栬�呰繕鍦ㄥ垎浜潃 + continue; + } + //鍒犻櫎鎺夎繖涓埧闂存枃浠� + HdlFileLogic.Current.DeleteFile(fullFile); + dicUpdateTime.Remove(fileName); + } + } + //妫�娴嬫湰鍦板満鏅枃浠�,鏄惁瀛樺湪宸茬粡鍙栨秷浜嗗叡浜簡鐨� + else if (fileName.StartsWith("Scene_") == true) + { + var fullFile = Path.Combine(localPath, fileName); + var sceneData = HdlFileLogic.Current.ReadFileTextContent(fullFile); + var nowScene = Newtonsoft.Json.JsonConvert.DeserializeObject<SceneUI>(sceneData); + if (nowScene != null) + { + if (nowScene.IsSharedScene == false || this.DicScenes.ContainsKey(nowScene.Id) == true) + { + //杩欎釜鍦烘櫙鏄粬鑷繁鍒涘缓鐨�,鎴栬�呰繕鍦ㄥ垎浜潃 + continue; + } + //鍒犻櫎鎺夎繖涓満鏅枃浠� + HdlFileLogic.Current.DeleteFile(fullFile); + dicUpdateTime.Remove(fileName); + } + } } + catch { } } //淇濆瓨妤煎眰鏁版嵁 - Common.Config.Instance.Home.Save(false); + Config.Instance.Home.Save(false); //缃戝叧鏂囦欢闈炲悎娉曟�ф槸鍒锋柊璁惧鍒楄〃鐨勫嚱鏁伴噷闈㈠疄鐜� @@ -416,27 +266,10 @@ //鍏抽棴 ProgressFormBar.Current.Close(); + //閲婃斁缂撳瓨 + this.Dispone(); + return true; - } - - /// <summary> - /// 浠庝簯绔幏鍙栧垎浜殑鏂囦欢鍒楄〃 - /// </summary> - /// <param name="i_childAccountId">璐﹀彿鐨刬d,鎴愬憳鐧婚檰鐨勮瘽,鐩存帴浼犺处鍙峰瘑鐮佺櫥闄嗕箣鍚�,浜戠杩斿洖鐨勯偅涓猧d</param> - /// <returns></returns> - private List<ReceiveShardInfoResult> GetShardFileListFromDb(string i_childAccountId) - { - //鑾峰彇涓讳汉鍒嗕韩缁欐垚鍛樼殑鏂囦欢鍒楄〃 - var pra = new { homeId = Config.Instance.HomeId, childAccountId = i_childAccountId }; - var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/home/share/findAll", RestSharp.Method.POST, pra, null, null, CheckMode.A璐﹀彿鏉冮檺); - //妫�娴嬬姸鎬佺爜 - if (HdlCheckLogic.Current.CheckNetCode(result, ShowNetCodeMode.YES) == false) - { - return null; - } - var listShardInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ReceiveShardInfoResult>>(result.Data.ToString()); - - return listShardInfo; } #endregion @@ -471,501 +304,562 @@ #endregion - //----------------------------------鍒嗗壊绾�(鏁版嵁棰勫)------------------------------------------------- - - #region 鈻� 鏁版嵁棰勫___________________________ + #region 鈻� 鑾峰彇鍒嗕韩鏁版嵁鍒楄〃___________________ /// <summary> - /// 鑾峰彇鎴愬憳鍏变韩鍒楄〃鐒跺悗淇濆瓨鍒版湰鍦�(鐢ㄥ畬涔嬪悗鏈�濂借皟鐢ㄦ竻绌� ClearShardDirectory鍑芥暟娓呯┖) + /// 浠庝簯绔幏鍙栧垎浜殑鏂囦欢鍒楄〃 /// </summary> - /// <param name="memberShardInfo"> - /// <para>鎴愬憳鐨勫垎浜暟鎹�</para> - /// <para>濡傛灉涓嶇煡閬撹繖鏄粈涔堜笢瑗�,灏盢ew涓�涓�,鐒跺悗缂撳瓨璧锋潵,璋冪敤鍏朵粬鍑芥暟閮介渶瑕佽繖涓笢瑗�</para> - /// <para>New鐨勬椂鍊欒寰楀SubAccountDistributedMark璧嬪��,瀹冩槸鎴愬憳鍒楄〃鎺ュ彛杩斿洖鐨凷ubAccountDistributedMark</para> - /// </param> + /// <param name="i_childAccountId">璐﹀彿鐨刬d,鎴愬憳鐧婚檰鐨勮瘽,鐩存帴浼犺处鍙峰瘑鐮佺櫥闄嗕箣鍚�,浜戠杩斿洖鐨勯偅涓猧d</param> /// <returns></returns> - public bool GetMemberShardContentListAndSetToLocation(MemberShardInfoData memberShardInfo) + private List<ReceiveShardInfoResult> GetShardFileListFromDb(string i_childAccountId) { - if (memberShardInfo.Refresh == false) + //鑾峰彇涓讳汉鍒嗕韩缁欐垚鍛樼殑鏂囦欢鍒楄〃 + var pra = new { homeId = Config.Instance.HomeId, childAccountId = i_childAccountId }; + var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/app/home/share/findAll", RestSharp.Method.POST, pra, null, null, CheckMode.A璐﹀彿鏉冮檺); + //妫�娴嬬姸鎬佺爜 + if (HdlCheckLogic.Current.CheckNetCode(result, ShowNetCodeMode.YES) == false) { - //浠庢湰鍦拌幏鍙栨垚鍛樼殑鍒嗕韩鍒楄〃 - this.GetMemberShardContentListFromLocal(memberShardInfo); - return true; + return null; } - memberShardInfo.Refresh = false; + var listShardInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ReceiveShardInfoResult>>(result.Data.ToString()); - //姝e湪鑾峰彇鍒嗕韩鏁版嵁 - ProgressFormBar.Current.Start(); - ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uShardContentGetting)); - - //浠庝簯绔幏鍙栧垎浜殑鏂囦欢鍒楄〃 - var listData = this.GetShardFileListFromDb(memberShardInfo.ChildAccountId); - if (listData == null) - { - //鍏抽棴杩涘害鏉� - ProgressFormBar.Current.Close(); - return false; - } - //鍏堟竻绌哄叡浜枃浠跺す - this.ClearShardDirectory(); - - var dicFileKey = new Dictionary<string, string>(); - foreach (var data in listData) - { - //鎬ц兘浼樺寲锛氬鏋滄湰鍦版嫢鏈夎繖涓枃浠剁殑璇�,鐩存帴浣跨敤閭d釜鏂囦欢 - string fileName = data.FileName; - if (fileName.StartsWith("Device_") == true) - { - string[] Arry = fileName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); - if (Arry.Length == 4) - { - //瀵瑰簲鏃ф暟鎹細Device_OnOffOutput_abcjdffdfj_01 - fileName = Arry[0] + "_" + Arry[2] + "_" + Arry[3]; - } - } - //璁板綍璧峰畠鐨勪富閿� - memberShardInfo.dicAllShardKeys[fileName] = data.Id; - - if (fileName.StartsWith("Room_") == true || fileName.StartsWith("Scene_") == true) - { - //鎴块棿鏂囦欢鍜屽満鏅枃浠堕渶瑕侀噸鏂板弽搴忓垪鍖� - dicFileKey[data.Id] = data.FileName; - continue; - } - if (Shared.Common.Global.IsExistsByHomeId(fileName) == true) - { - //鍏朵粬鏂囦欢鐨勮瘽锛屽鏋滄湰鍦板瓨鍦紝鍒欎互鏈湴鏂囦欢涓哄噯 - this.AddShardFile(fileName); - continue; - } - dicFileKey[data.Id] = data.FileName; - } - - //灏嗗垎浜殑鏁版嵁瀛樺叆鏈湴,杩斿洖鐨勬槸鏂囦欢鍚嶅瓧(寮傚父鏃惰繑鍥瀗ull) - var listFile = this.SetShardFileToLocation(dicFileKey); - if (listFile == null) - { - //鍏抽棴杩涘害鏉� - ProgressFormBar.Current.Close(); - return false; - } - - //浠庢湰鍦拌幏鍙栨垚鍛樼殑鍒嗕韩鍒楄〃 - this.GetMemberShardContentListFromLocal(memberShardInfo); - - //鍏抽棴杩涘害鏉� - ProgressFormBar.Current.Close(); - - return true; + return listShardInfo; } /// <summary> - /// 浠庢湰鍦拌幏鍙栨垚鍛樼殑鍒嗕韩鍒楄〃 + /// 灏嗗垎浜殑鏁版嵁瀛樺叆鏈湴,杩斿洖鐨勬槸鏂囦欢鍚嶅瓧(寮傚父鏃惰繑鍥瀗ull) /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫垎浜暟鎹殑缂撳瓨(璋冪敤杩欎釜鍑芥暟浼氬埛鏂拌繖涓彉閲忕殑淇℃伅)</param> - private void GetMemberShardContentListFromLocal(MemberShardInfoData memberShardInfo) - { - memberShardInfo.dicShardRoom = new Dictionary<string, Common.Room>(); - this.dicShardDeviceFile.Clear(); - - //keys:涓婚敭 value:鏂囦欢鍚� - var dicDeviceFile = new Dictionary<string, string>(); - //keys:鍦烘櫙id value:鏂囦欢鍚� - var dicSceneFile = new Dictionary<int, string>(); - - 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<Common.Room>(valueData); - memberShardInfo.dicShardRoom[fileName] = roomTemp; - } - } - else if (fileName == HdlFileNameResourse.ShardFloorFile) - { - //妤煎眰鏂囦欢 - var byteData = this.GetShardFileContent(fileName); - if (byteData != null) - { - string valueData = System.Text.Encoding.UTF8.GetString(byteData); - memberShardInfo.dicShardFloor = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(valueData); - } - } - else if (fileName.StartsWith("Device_") == true) - { - string[] Arry = fileName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); - if (Arry.Length == 4) - { - //瀵瑰簲鏃ф暟鎹細Device_OnOffOutput_abcjdffdfj_01 - string mainKeys = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(Arry[2], Convert.ToInt32(Arry[3])); - this.dicShardDeviceFile[mainKeys] = Arry[0] + "_" + Arry[2] + "_" + Arry[3]; - //璁惧鏂囦欢 - dicDeviceFile[mainKeys] = this.dicShardDeviceFile[mainKeys]; - } - else - { - string mainKeys = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(Arry[1], Convert.ToInt32(Arry[2])); - 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<Common.SceneUI>(valueData); - - //鑾峰彇鍦烘櫙閲岄潰鐨勫叏閮ㄧ洰鏍�(2019.11.05杩藉姞鎿嶄綔,鏈夊彲鑳介偅涓澶囨槸鐢卞満鏅祵濂楁潵鐨�,鎵�浠ュ畠鏈夊彲鑳戒笉灞炰簬浠讳綍鎴块棿) - foreach (var data in tempUi.AdjustTargetList) - { - //璁惧 - if (data.Type == 0) - { - string mainkey = HdlDeviceCommonLogic.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 鈻� 鑾峰彇璁惧鏂囦欢鍚峗____________________ - - /// <summary> - /// 鑾峰彇璁惧鏂囦欢鍚�,涓嶅瓨鍦ㄦ椂,杩斿洖绌哄瓧绗︿覆(浠呴檺鍒嗕韩浜嗙殑璁惧) - /// </summary> - /// <param name="deviceKeys">璁惧涓婚敭</param> + /// <param name="dicFileKeys">key:鏂囦欢鐨勪富閿� value:鏂囦欢鍚嶇О</param> /// <returns></returns> - public string GetShardDeviceFileName(string deviceKeys) + private List<string> SetShardFileToLocation(Dictionary<string, string> dicFileKeys) { - if (this.dicShardDeviceFile.ContainsKey(deviceKeys) == true) + if (dicFileKeys.Count == 0) { - return this.dicShardDeviceFile[deviceKeys]; + return new List<string>(); } - return string.Empty; - } + //鍒涘缓鏂囦欢澶� + string strDir = HdlFileNameResourse.DownLoadShardDirectory; + HdlFileLogic.Current.CreateDirectory(strDir, true); - #endregion + int listMarkCount = dicFileKeys.Count; - //----------------------------------鍒嗗壊绾�(涓婁紶鏂扮殑鍒嗕韩)--------------------------------------------- - - #region 鈻� 鎵ц涓婁紶鏂扮殑鍒嗕韩___________________ - - /// <summary> - /// 鎵ц涓婁紶鏂扮殑鍒嗕韩 - /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫垎浜暟鎹�</param> - /// <param name="nowRoom">褰撳墠鐨勬埧闂村璞�</param> - /// <param name="listDevice">閫夋嫨涓婁紶鐨勮澶�</param> - /// <param name="listScene">閫夋嫨涓婁紶鐨勫満鏅�(涓嶈鑾峰彇瀹冮噷闈㈢殑缁戝畾鍒楄〃)</param> - /// <param name="BarMaxValue">杩涘害鏉$殑鏈�澶у��,濡傛灉涓嶄负-1,鍒欏唴閮ㄤ笉浼氳嚜鍔ㄥ脊鍑鸿繘搴︽潯</param> - /// <param name="listCheckFile">鏂囦欢閲嶅涓婁紶妫�娴�</param> - public bool DoUploadSharedContent(MemberShardInfoData memberShardInfo, Common.Room nowRoom, - List<CommonDevice> listDevice, List<Common.SceneUI> listScene, int BarMaxValue = -1, HashSet<string> listCheckFile = null) - { - if (listDevice.Count == 0 && listScene.Count == 0) - { - return true; - } - var listCheck = new HashSet<string>(); - - //鑾峰彇鍦烘櫙閲岄潰宓屽鐨勫瓙璁惧鍜屽瓙鍦烘櫙 - var listChirdDevice = new List<CommonDevice>(); - var listChirdScene = new List<Common.SceneUI>(); - 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<string, List<string>>(); - var dicBackScene = new Dictionary<string, List<int>>(); - //涓存椂澶囦唤鎴块棿璁惧鍒楄〃 - this.BackupRoomDevicelistTemporary(memberShardInfo, dicBackDevice, dicBackScene); - - //鑾峰彇涓婁紶鐨勬枃浠�,鐒跺悗灏嗘枃浠跺鍒跺埌鎸囧畾鏂囦欢澶� - var listDelPic = new List<string>(); - var listFile = this.GetUploadListFile(memberShardInfo, nowRoom, listDevice, listScene, listChirdDevice, listChirdScene, listDelPic); + List<string> listFile = new List<string>(); //涓嶅厑璁告寜绯荤粺鐨勮繑鍥為敭 Config.Instance.BackKeyCanClick = false; HdlUserCenterResourse.AccountOption.AppCanSignout = false; - if (BarMaxValue == -1) + //璁℃暟 + int nowCount = 0; + foreach (var fileKey in dicFileKeys.Keys) { - //鎵撳紑杩涘害鏉� - 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(); + nowCount++; + var pra = new { homeId = Config.Instance.Home.Id, homeShareId = fileKey }; + var result = HdlHttpLogic.Current.RequestByteFromZigbeeHttps("home-wisdom/app/home/share/downOne", RestSharp.Method.POST, pra, null, null, CheckMode.A璐﹀彿鏉冮檺, true, 10); + //妫�娴嬬姸鎬佺爜 + if (result == null) + { + //鍏佽鎸夌郴缁熺殑杩斿洖閿� + Config.Instance.BackKeyCanClick = true; + HdlUserCenterResourse.AccountOption.AppCanSignout = true; + return null; + } + string shareName = dicFileKeys[fileKey]; + //鏂囦欢鍚嶅瓧 + listFile.Add(shareName); + //淇濆瓨鍒版寚瀹氭枃浠跺す涓� + HdlFileLogic.Current.SaveByteToFile(System.IO.Path.Combine(strDir, shareName), result); + //璁剧疆杩涘害鍊� + ProgressFormBar.Current.SetValue(nowCount, listMarkCount); } //鍏佽鎸夌郴缁熺殑杩斿洖閿� Config.Instance.BackKeyCanClick = true; HdlUserCenterResourse.AccountOption.AppCanSignout = true; - if (result == false) + return listFile; + } + + #endregion + + + #region 鈻� 鍒濆鍖栨垚鍛樺垎浜暟鎹甠________________ + + /// <summary> + /// 鍒濆鍖栨垚鍛樺叡浜垪琛ㄧ劧鍚庝繚瀛樺埌鏈湴 + /// </summary> + /// <param name="i_ChildAccountId">鎴愬憳ID</param> + /// <returns></returns> + public bool InitMemberShardContentListAndSetToLocation(string i_ChildAccountId) + { + if (DicDevices != null) { - //鎭㈠鍘熸暟鎹� - if (memberShardInfo.TempRoom == null) - { - memberShardInfo.dicShardRoom[nowRoom.FileName].BackgroundImageType = BackgroundImageType; - memberShardInfo.dicShardRoom[nowRoom.FileName].BackgroundImage = BackgroundImage; - } - this.RecoverRoomDevicelistTemporary(memberShardInfo, dicBackDevice, dicBackScene, listFile); + //宸茬粡鑾峰彇浜�,鍒欎笉鍐嶈幏鍙� + return true; } - else + + //姝e湪鑾峰彇鍒嗕韩鏁版嵁 + ProgressFormBar.Current.Start(); + ProgressFormBar.Current.SetMsg(Language.StringByID(R.MyInternationalizationString.uShardContentGetting)); + + //浠庝簯绔幏鍙栧垎浜殑鏂囦欢鍒楄〃 + var listData = this.GetShardFileListFromDb(i_ChildAccountId); + if (listData == null) { - //瑕嗙洊鏁版嵁 - if (memberShardInfo.TempRoom != null) - { - memberShardInfo.dicShardRoom[nowRoom.FileName] = memberShardInfo.TempRoom; - } + //鍏抽棴杩涘害鏉� + ProgressFormBar.Current.Close(); + return false; } - memberShardInfo.TempRoom = null; + + //鍒嗕韩鐨勫帇缂╂枃浠剁殑涓婚敭 + string shardBinKey = string.Empty; + foreach (var data in listData) + { + //濡傛灉鏄繖涓帇缂╂枃浠� + if (data.FileName == SHARED_BIN_FILE) + { + shardBinKey = data.Id; + } + //璁板綍璧峰畠浠殑涓婚敭 + this.DicShardKeys[data.FileName] = data.Id; + } + + //涓嬭浇鍘嬬缉鐨刡in鏂囦欢,鐒跺悗杩涜瑙f瀽,鍏朵粬鏂囦欢涓嶇敤鐞嗕細 + bool result = this.DownloadBinFileAndAdjust(shardBinKey); + //鍏抽棴杩涘害鏉� + ProgressFormBar.Current.Close(); return result; } /// <summary> - /// 鑾峰彇涓婁紶鐨勬枃浠跺悕 + /// 涓嬭浇鍘嬬缉鐨刡in鏂囦欢,鐒跺悗杩涜瑙f瀽 /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫垎浜暟鎹�</param> - /// <param name="nowRoom">闇�瑕佷笂浼犲埌浜戠鐨勬埧闂村璞�(娉ㄦ剰,杩欎釜鎴块棿鏄富浜虹殑鎴块棿瀵硅薄,鑰屼笉鏄櫄鎷熺殑)</param> - /// <param name="listDevice">鍒嗕韩鐨勮澶囧垪琛�(娉ㄦ剰,杩欎釜涓滆タ鏄富浜虹殑)</param> - /// <param name="listScene">鍒嗕韩鐨勫満鏅垪琛�(娉ㄦ剰,杩欎釜涓滆タ鏄富浜虹殑)</param> - /// <param name="listChirdDevice">鍦烘櫙閲岄潰閫掑綊鑾峰彇鐨勮澶�</param> - /// <param name="listChirdScene">鍦烘櫙閲岄潰閫掑綊鑾峰彇鐨勫満鏅�</param> - /// <param name="listDelPic">闇�瑕佸垹闄ょ殑鍥剧墖</param> + /// <param name="i_binFileId">鍘嬬缉鏂囦欢鐨勪富閿�</param> /// <returns></returns> - private List<string> GetUploadListFile(MemberShardInfoData memberShardInfo, Common.Room nowRoom, List<CommonDevice> listDevice, List<Common.SceneUI> listScene, - List<CommonDevice> listChirdDevice, List<Common.SceneUI> listChirdScene, List<string> listDelPic) + private bool DownloadBinFileAndAdjust(string i_binFileId) { - var listFile = new List<string>(); - - Common.Room roomTemp = null; - if (memberShardInfo.dicShardRoom.ContainsKey(nowRoom.FileName) == false) + if (i_binFileId == string.Empty) { - //鍏嬮殕涓�涓璞� - 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); - } + //涓嶈蹇樿瑕佸垵濮嬪寲杩欎釜涓滆タ + this.DicDevices = new Dictionary<string, CommonDevice>(); + return true; } - else + var pra = new { homeId = Config.Instance.Home.Id, homeShareId = i_binFileId }; + var result = HdlHttpLogic.Current.RequestByteFromZigbeeHttps("home-wisdom/app/home/share/downOne", RestSharp.Method.POST, pra, null, null, CheckMode.A璐﹀彿鏉冮檺, true, 10); + //妫�娴嬬姸鎬佺爜 + if (result == null) { - 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; - } + return false; } + //涓嶈蹇樿瑕佸垵濮嬪寲杩欎釜涓滆タ + this.DicDevices = new Dictionary<string, CommonDevice>(); - foreach (var device in listDevice) - { - //璁惧 - listFile.Add(device.FilePath); - this.AddShardFile(device.FilePath); + //鐩存帴椋欏埌100% + ProgressFormBar.Current.SetValue(1); - //鍔犵偣缂撳瓨 - string mainKeys = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device); - this.dicShardDeviceFile[mainKeys] = device.FilePath; + var fileContent = Encoding.UTF8.GetString(result); + //瑙f瀽鍘嬬缉鐨刡in鏂囦欢 + this.AdjustBinFileContent(fileContent); - 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[HdlDeviceCommonLogic.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(HdlFileNameResourse.ShardFloorFile); - - return listFile; + return true; } /// <summary> - /// 鑾峰彇鍦烘櫙鐨勭洰鏍囪澶囧垪琛�(杩欎釜涓嶈兘浠庡垎浜暟鎹腑鑾峰彇) + /// 瑙f瀽鍘嬬缉鐨刡in鏂囦欢 + /// </summary> + /// <param name="i_content"></param> + private void AdjustBinFileContent(string i_content) + { + var deviceType = string.Empty; + + //鏍规嵁鎹㈣绗﹀垏鍒嗘暟鎹枃鏈� + string[] arryData = i_content.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); + string strContentData = string.Empty; + foreach (string strData in arryData) + { + if (strData == "#START#") + { + //鏃犻檮鍔犳暟鎹殑銆愭暟鎹爣棰樸�� + continue; + } + if (strData.StartsWith("#DeviceInfo START#") == true) + { + //闄勫姞鏁版嵁:璁惧瀵硅薄绫诲瀷 + deviceType = strData.Substring(18); + continue; + } + //鎵ц鏁版嵁澶勭悊 + try + { + //鍦烘櫙瀵硅薄 + if (strData == "#Scene END#") + { + var scene = Newtonsoft.Json.JsonConvert.DeserializeObject<SceneUI>(strContentData); + this.DicScenes[scene.Id] = scene; + + strContentData = string.Empty; + continue; + } + //妤煎眰瀵硅薄 + else if (strData == "#FloorInfo END#") + { + this.DicFloor = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(strContentData); + + strContentData = string.Empty; + continue; + } + //鎴块棿瀵硅薄 + else if (strData == "#RoomInfo END#") + { + var room = Newtonsoft.Json.JsonConvert.DeserializeObject<Room>(strContentData); + this.DicRooms[room.Id] = room; + + strContentData = string.Empty; + continue; + } + //璁惧瀵硅薄 + else if (strData == "#DeviceInfo END#") + { + //鍙嶅簭鍒楀寲璁惧 + CommonDevice device = null; + if (HdlCheckLogic.Current.CheckIsNumber(deviceType) == true) + { + //鏁板�煎瀷涓烘柊鏁版嵁,鐩存帴杞崲 + device = CommonDevice.CommonDeviceByByteString(Convert.ToInt32(deviceType), strContentData); + } + else + { + //瀛楃涓插瀷涓烘棫鏁版嵁,闇�瑕佺壒娈婂鐞� + var myType = (DeviceType)Enum.Parse(typeof(DeviceType), deviceType); + device = CommonDevice.CommonDeviceByByteString((int)myType, strContentData); + } + if (device != null) + { + this.DicDevices[HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device)] = device; + } + strContentData = string.Empty; + continue; + } + else + { + strContentData += strData; + } + } + catch (Exception ex) + { + HdlLogLogic.Current.WriteLog(ex, "鍒嗕韩bin鏂囦欢鍑洪棶棰榎r\n" + strContentData); + strContentData = string.Empty; + } + } + } + + #endregion + + + #region 鈻� 涓婁紶鍒嗕韩鍐呭_______________________ + + /// <summary> + /// 鎵ц涓婁紶鏂扮殑鍒嗕韩(璁惧鍜屽満鏅粎闄愬悓涓�涓埧闂�) + /// </summary> + /// <param name="i_ChildAccountId">鎴愬憳鐨処D</param> + /// <param name="i_nowRoom">鎸囧畾鐨勬埧闂�</param> + /// <param name="i_listDevice">閫夋嫨涓婁紶鐨勮澶�(浠呴檺涓�涓埧闂�)</param> + /// <param name="i_listScene">閫夋嫨涓婁紶鐨勫満鏅�(浠呴檺涓�涓埧闂�,涓嶈鑾峰彇瀹冮噷闈㈢殑缁戝畾鍒楄〃)</param> + public bool UploadSharedContent(string i_ChildAccountId, Room i_nowRoom, List<CommonDevice> i_listDevice, List<SceneUI> i_listScene) + { + if (i_listDevice.Count == 0 && i_listScene.Count == 0) + { + return true; + } + //鎵撳紑杩涘害鏉� + ProgressBar.Show(); + + var listCheck = new HashSet<string>(); + + //鑾峰彇鍦烘櫙閲岄潰宓屽鐨勫瓙璁惧鍜屽瓙鍦烘櫙(杩欏嚑涓笢瑗夸笉鍔犲埌鎴块棿) + var listChirdDevice = new List<CommonDevice>(); + var listChirdScene = new List<SceneUI>(); + foreach (var SceneTemp in i_listScene) + { + //浠庣紦瀛樿幏鍙栧満鏅殑鎵ц鐩爣 + this.GetSceneAdjustTargetListFromLocal(SceneTemp, listCheck, listChirdScene, listChirdDevice); + } + //鍏嬮殕涓�涓埧闂村嚭鏉� + var cloneRoom = HdlRoomLogic.Current.CloneRoomClass(i_nowRoom); + if (this.DicRooms.ContainsKey(cloneRoom.Id) == true) + { + //鎶婂師鏉ョ殑鐨勪笢瑗夸篃澶嶅埗杩囨潵 + cloneRoom.ListDevice.AddRange(this.DicRooms[cloneRoom.Id].ListDevice); + cloneRoom.ListDeviceMac.AddRange(this.DicRooms[cloneRoom.Id].ListDeviceMac); + cloneRoom.ListSceneId.AddRange(this.DicRooms[cloneRoom.Id].ListSceneId); + } + else + { + //杩欓噷鏈夌偣鐗规畩,濡傛灉涓嶅瓨鍦ㄧ殑璇�,鎶婄湡瀹炶澶囩殑鍖哄煙涓㈣繃鍘�,鍥犱负鍙槸涓婚敭鑰屽凡 + cloneRoom.ListDeviceMac.AddRange(i_nowRoom.ListDeviceMac); + } + //鐒跺悗鎶婂満鏅拰璁惧涓㈠埌杩欎釜鍏嬮殕鐨勫璞¢噷闈㈠幓 + foreach (var device in i_listDevice) + { + string mainKey = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device); + if (cloneRoom.ListDevice.Contains(mainKey) == false) + { + //涓㈣澶囪繃鍘� + cloneRoom.ListDevice.Add(mainKey); + } + } + foreach (var secne in i_listScene) + { + if (cloneRoom.ListSceneId.Contains(secne.Id) == false) + { + //涓㈠満鏅繃鍘� + cloneRoom.ListSceneId.Add(secne.Id); + } + } + //鑾峰彇闇�瑕佷笂浼犵殑鍥剧墖 + var listUploadPic = this.GetUploadPictrueFile(new List<Room> { cloneRoom }, i_listScene, listChirdScene); + //鐢熸垚鍒嗕韩Bin鏂囦欢鍐呭 + var binfFileContent = this.CreatShardBinContentOnAdd(new List<Room> { cloneRoom }, i_listDevice, i_listScene, listChirdDevice, listChirdScene); + + //璁剧疆鏈�澶у�� + ProgressBar.SetMaxValue(listUploadPic.Count + 1); + + //涓婁紶bin鏂囦欢 + var fileKey = this.DoUploadShardContent(i_ChildAccountId, SHARED_BIN_FILE, Encoding.UTF8.GetBytes(binfFileContent)); + if (fileKey == null) + { + ProgressBar.Close(); + return false; + } + ProgressBar.SetValue(1); + + //璁板綍涓婚敭 + this.DicShardKeys[SHARED_BIN_FILE] = fileKey; + binfFileContent = null; + + //涓婁紶鍥剧墖 + foreach (var fileName in listUploadPic) + { + var byteData = HdlFileLogic.Current.ReadFileByteContent(Path.Combine(Config.Instance.FullPath, fileName)); + if (byteData != null) + { + fileKey = this.DoUploadShardContent(i_ChildAccountId, fileName, byteData); + if (fileKey == null) + { + ProgressBar.Close(); + return false; + } + //璁板綍涓婚敭 + this.DicShardKeys[SHARED_BIN_FILE] = fileKey; + } + ProgressBar.SetValue(1); + } + //濡傛灉鍏ㄩ儴鎴愬姛浜嗙殑璇�,瑕嗙洊缂撳瓨 + this.DicDevices.Clear(); + this.DicScenes.Clear(); + this.DicRooms.Clear(); + this.DicFloor.Clear(); + this.AdjustBinFileContent(binfFileContent); + + //鍒犻櫎宸茬粡涓嶅啀鍒嗕韩鐨勫浘鐗� + this.DeleteNotShardPictrue(); + + ProgressBar.Close(); + + return true; + } + + /// <summary> + /// 鎵ц涓婁紶鏂扮殑鍒嗕韩鎴块棿(鏁翠釜鎴块棿鍒嗕韩) + /// </summary> + /// <param name="i_ChildAccountId">鎴愬憳鐨処D</param> + /// <param name="i_listRoom">闇�瑕佸垎浜殑鎴块棿</param> + public bool UploadSharedRoom(string i_ChildAccountId, List<Room> i_listRoom) + { + //鎵撳紑杩涘害鏉� + ProgressBar.Show(); + + //璁╄澶囧拰鍦烘櫙涓嶉噸澶嶇殑涓滆タ + var listCheck = new HashSet<string>(); + //鍏嬮殕鎴块棿 + var listCloneRoom = new List<Room>(); + //娣诲姞鐨勮澶� + var listDevice = new List<CommonDevice>(); + //娣诲姞鐨勫満鏅� + var listScene = new List<SceneUI>(); + + foreach (var room in i_listRoom) + { + //鍏嬮殕涓�涓埧闂村嚭鏉� + var cloneRoom = HdlRoomLogic.Current.CloneRoomClass(room); + if (this.DicRooms.ContainsKey(cloneRoom.Id) == true) + { + //鎶婂師鏉ョ殑鐨勪笢瑗夸篃澶嶅埗杩囨潵 + cloneRoom.ListDevice.AddRange(this.DicRooms[cloneRoom.Id].ListDevice); + cloneRoom.ListDeviceMac.AddRange(this.DicRooms[cloneRoom.Id].ListDeviceMac); + cloneRoom.ListSceneId.AddRange(this.DicRooms[cloneRoom.Id].ListSceneId); + } + else + { + //杩欓噷鏈夌偣鐗规畩,濡傛灉涓嶅瓨鍦ㄧ殑璇�,鎶婄湡瀹炶澶囩殑鍖哄煙涓㈣繃鍘�,鍥犱负鍙槸涓婚敭鑰屽凡 + cloneRoom.ListDeviceMac.AddRange(room.ListDeviceMac); + } + listCloneRoom.Add(cloneRoom); + + //鑾峰彇璁惧瀵硅薄 + foreach (var mainkey in cloneRoom.ListDevice) + { + var device = HdlDeviceCommonLogic.Current.GetDevice(mainkey); + if (device != null) + { + listDevice.Add(device); + } + listCheck.Add(mainkey); + } + //鑾峰彇鍦烘櫙瀵硅薄 + foreach (var sceneId in cloneRoom.ListSceneId) + { + var scene = HdlSceneLogic.Current.GetSceneUIBySceneId(sceneId); + if (scene != null) + { + listScene.Add(scene); + } + listCheck.Add(sceneId.ToString()); + //浠庣紦瀛樿幏鍙栧満鏅殑鎵ц鐩爣 + this.GetSceneAdjustTargetListFromLocal(scene, listCheck, listScene, listDevice); + } + } + + //鑾峰彇闇�瑕佷笂浼犵殑鍥剧墖 + var listUploadPic = this.GetUploadPictrueFile(listCloneRoom, listScene, new List<SceneUI>()); + //鐢熸垚鍒嗕韩Bin鏂囦欢鍐呭 + var binfFileContent = this.CreatShardBinContentOnAdd(listCloneRoom, listDevice, listScene, new List<CommonDevice>(), new List<SceneUI>()); + + //璁剧疆鏈�澶у�� + ProgressBar.SetMaxValue(listUploadPic.Count + 1); + + //涓婁紶bin鏂囦欢 + var fileKey = this.DoUploadShardContent(i_ChildAccountId, SHARED_BIN_FILE, Encoding.UTF8.GetBytes(binfFileContent)); + if (fileKey == null) + { + ProgressBar.Close(); + return false; + } + ProgressBar.SetValue(1); + + //璁板綍涓婚敭 + this.DicShardKeys[SHARED_BIN_FILE] = fileKey; + binfFileContent = null; + + //涓婁紶鍥剧墖 + foreach (var fileName in listUploadPic) + { + var byteData = HdlFileLogic.Current.ReadFileByteContent(Path.Combine(Config.Instance.FullPath, fileName)); + if (byteData != null) + { + fileKey = this.DoUploadShardContent(i_ChildAccountId, fileName, byteData); + if (fileKey == null) + { + ProgressBar.Close(); + return false; + } + //璁板綍涓婚敭 + this.DicShardKeys[SHARED_BIN_FILE] = fileKey; + } + ProgressBar.SetValue(1); + } + //濡傛灉鍏ㄩ儴鎴愬姛浜嗙殑璇�,瑕嗙洊缂撳瓨 + this.DicDevices.Clear(); + this.DicScenes.Clear(); + this.DicRooms.Clear(); + this.DicFloor.Clear(); + this.AdjustBinFileContent(binfFileContent); + + //鍒犻櫎宸茬粡涓嶅啀鍒嗕韩鐨勫浘鐗� + this.DeleteNotShardPictrue(); + + ProgressBar.Close(); + + return true; + } + + /// <summary> + /// 鍒犻櫎宸茬粡涓嶅啀鍒嗕韩鐨勫浘鐗�(涓嶇敤绠¤繑鍥炲��,鍗充娇澶辫触涔熸病浜�) + /// </summary> + private void DeleteNotShardPictrue() + { + var listPictrue = new List<string>(); + foreach (var room in this.DicRooms.Values) + { + if (room.BackgroundImageType != 0) + { + //鎴块棿鍥剧墖 + listPictrue.Add(room.BackgroundImage); + } + } + foreach (var scene in this.DicScenes.Values) + { + if (scene.IconPathType != 0) + { + //鍦烘櫙鍥剧墖 + listPictrue.Add(scene.IconPath); + } + } + var listDeleteFile = new List<string>(); + foreach (var fileName in this.DicShardKeys.Keys) + { + //濡傛灉鏄埧闂存垨鑰呭満鏅殑鍥剧墖 + if (fileName.StartsWith("RoomIcon_") == true || fileName.StartsWith("SceneIcon_") == true) + { + if (listPictrue.Contains(fileName) == false) + { + //杩欎釜鍥剧墖鍙樻洿浜�,闇�瑕佸垹闄ゆ帀 + listDeleteFile.Add(fileName); + } + } + } + //鍒犻櫎鍥剧墖 + this.DoDeleteSharedContent(listDeleteFile, ShowNetCodeMode.No); + } + + /// <summary> + /// 涓婁紶鍒嗕韩鍐呭(杩斿洖涓婚敭) + /// </summary> + /// <param name="i_childAccountId">瀛愯处鍙风殑涓婚敭</param> + /// <param name="i_fileName">鏂囦欢鍚嶅瓧</param> + /// <param name="i_content">鏂囦欢鍐呭</param> + /// <returns></returns> + private string DoUploadShardContent(string i_childAccountId, string i_fileName, byte[] i_content) + { + var dicQuery = new Dictionary<string, object>(); + dicQuery["homeId"] = Config.Instance.Home.Id; + dicQuery["childAccountId"] = i_childAccountId; + dicQuery["fileName"] = i_fileName; + + var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/app/home/share/add", RestSharp.Method.POST, i_content, dicQuery, null, CheckMode.A璐﹀彿鏉冮檺, true, 10); + //妫�娴嬬姸鎬佺爜 + if (HdlCheckLogic.Current.CheckNetCode(result, ShowNetCodeMode.YES) == false) + { + return null; + } + var info = Newtonsoft.Json.JsonConvert.DeserializeObject<ReceiveShardInfoResult>(result.Data.ToString()); + return info.Id; + } + + #endregion + + #region 鈻� 涓婁紶鍒嗕韩鍐呭杈呭姪鏂规硶_______________ + + /// <summary> + /// 浠庢湰鍦拌幏鍙栧満鏅噷闈㈢殑鎵ц鐩爣鍒楄〃 /// </summary> /// <param name="scene">鍦烘櫙</param> /// <param name="listCheck">閲嶅妫�娴嬬敤</param> /// <param name="listSceneUI">娣诲姞鍒嗕韩鐨勫満鏅垪琛�</param> /// <param name="listDevice">娣诲姞鍒嗕韩鐨勮澶囧垪琛�</param> /// <returns></returns> - public void GetSceneDeviceList(Common.SceneUI scene, HashSet<string> listCheck, List<Common.SceneUI> listSceneUI, List<CommonDevice> listDevice) + private void GetSceneAdjustTargetListFromLocal(SceneUI scene, HashSet<string> listCheck, List<SceneUI> listSceneUI, List<CommonDevice> listDevice) { foreach (var data in scene.AdjustTargetList) { @@ -1002,383 +896,209 @@ if (sceneUi != null) { listSceneUI.Add(sceneUi); + //閫掑綊鑾峰彇鎵ц鐩爣 + this.GetSceneAdjustTargetListFromLocal(sceneUi, listCheck, listSceneUI, listDevice); } } } + } + + /// <summary> + /// 鑾峰彇闇�瑕佷笂浼犵殑鍥剧墖鍚嶅瓧 + /// </summary> + /// <param name="i_listRoom">鎴块棿瀵硅薄</param> + /// <param name="i_listScene">鍦烘櫙瀵硅薄</param> + /// <param name="i_listChirdScene">鍦烘櫙瀵硅薄</param> + /// <returns></returns> + private List<string> GetUploadPictrueFile(List<Room> i_listRoom, List<SceneUI> i_listScene, List<SceneUI> i_listChirdScene) + { + var listPic = new List<string>(); + foreach (var room in i_listRoom) + { + if (room.BackgroundImageType != 0 && this.DicShardKeys.ContainsKey(room.BackgroundImage) == false) + { + //鑷畾涔夊浘鐗� + listPic.Add(room.BackgroundImage); + } + } + foreach (var scene in i_listScene) + { + if (scene.IconPathType != 0 && this.DicShardKeys.ContainsKey(scene.IconPath) == false) + { + //鑷畾涔夊浘鐗� + listPic.Add(scene.IconPath); + } + } + foreach (var scene in i_listChirdScene) + { + if (scene.IconPathType != 0 && this.DicShardKeys.ContainsKey(scene.IconPath) == false) + { + //鑷畾涔夊浘鐗� + listPic.Add(scene.IconPath); + } + } + return listPic; } #endregion - #region 鈻� 涓婁紶鏂扮殑鍒嗕韩_______________________ + + #region 鈻� 鍒犻櫎鍒嗕韩鍐呭_______________________ /// <summary> - /// 涓婁紶鍒嗕韩(杩斿洖浜戠鍒嗕韩鏂囦欢鐨勪富閿�:DistributedMark) + /// 绉婚櫎鎸囧畾鍒嗕韩鍐呭(璁惧鍜屽満鏅粎闄愬悓涓�涓埧闂�) /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫垎浜暟鎹�</param> - /// <param name="listFile">涓婁紶鐨勬枃浠跺悕</param> - /// <param name="listCheckFile">閲嶅鏂囦欢涓婁紶妫�娴�</param> + /// <param name="i_ChildAccountId">鎴愬憳ID</param> + /// <param name="i_nowRoom">鎸囧畾鐨勬埧闂�</param> + /// <param name="i_listDevice">閫夋嫨涓婁紶鐨勮澶�(浠呴檺涓�涓埧闂�)</param> + /// <param name="i_listScene">閫夋嫨涓婁紶鐨勫満鏅�(浠呴檺涓�涓埧闂�,涓嶈鑾峰彇瀹冮噷闈㈢殑缁戝畾鍒楄〃)</param> /// <returns></returns> - private bool DoUploadShardContent(MemberShardInfoData memberShardInfo, List<string> listFile, HashSet<string> listCheckFile) + public bool DeleteSharedContent(string i_ChildAccountId, Room i_nowRoom, + List<CommonDevice> i_listDevice, List<SceneUI> i_listScene) { - var dicKeys = new Dictionary<string, string>(); - for (int i = 0; i < listFile.Count; i++) + //鍏嬮殕涓�涓埧闂村嚭鏉� + var cloneRoom = HdlRoomLogic.Current.CloneRoomClass(i_nowRoom); + if (this.DicRooms.ContainsKey(cloneRoom.Id) == true) { - string fileName = listFile[i]; - if (listCheckFile != null) - { - if (listCheckFile.Contains(fileName) == true) - { - //閲嶅鏂囦欢涓嶅啀涓婁紶 - continue; - } - listCheckFile.Add(fileName); - } - var shareByte = this.GetShardFileContent(fileName); - //涓婁紶鏂囦欢 - var shardId = this.DoUploadShardContent(memberShardInfo.ChildAccountId, fileName, shareByte); - if (shardId == null) - { - return false; - } - //鏀堕泦涓婚敭 - dicKeys[fileName] = shardId; - //璁剧疆杩涘害鍊� - ProgressBar.SetValue(1); - } - //濡傛灉娌℃湁閿欒,鍒欐坊鍔犱复鏃剁紦瀛� - foreach (var keys in dicKeys.Keys) - { - memberShardInfo.dicAllShardKeys[keys] = dicKeys[keys]; + //鎶婂師鏉ョ殑鐨勪笢瑗夸篃澶嶅埗杩囨潵 + cloneRoom.ListDevice.AddRange(this.DicRooms[cloneRoom.Id].ListDevice); + cloneRoom.ListDeviceMac.AddRange(this.DicRooms[cloneRoom.Id].ListDeviceMac); + cloneRoom.ListSceneId.AddRange(this.DicRooms[cloneRoom.Id].ListSceneId); } - return true; - } - - /// <summary> - /// 涓婁紶鍒嗕韩鍐呭(杩斿洖涓婚敭) - /// </summary> - /// <param name="i_childAccountId">瀛愯处鍙风殑涓婚敭</param> - /// <param name="i_fileName">鏂囦欢鍚嶅瓧</param> - /// <param name="i_content">鏂囦欢鍐呭</param> - /// <returns></returns> - private string DoUploadShardContent(string i_childAccountId, string i_fileName, byte[] i_content) - { - var dicQuery = new Dictionary<string, object>(); - dicQuery["homeId"] = Config.Instance.Home.Id; - dicQuery["childAccountId"] = i_childAccountId; - dicQuery["fileName"] = i_fileName; - - var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/home/share/add", RestSharp.Method.POST, i_content, dicQuery, null, CheckMode.A璐﹀彿鏉冮檺, true, 10); - //妫�娴嬬姸鎬佺爜 - if (HdlCheckLogic.Current.CheckNetCode(result, ShowNetCodeMode.YES) == false) - { - return null; - } - var info = Newtonsoft.Json.JsonConvert.DeserializeObject<ReceiveShardInfoResult>(result.Data.ToString()); - return info.Id; - } - - #endregion - - #region 鈻� 涓存椂澶囦唤鎴块棿璁惧鍒楄〃_______________ - - /// <summary> - /// 涓存椂澶囦唤鎴块棿璁惧鍒楄〃 - /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫垎浜暟鎹�</param> - /// <param name="dicBackDevice">绌虹殑璁惧澶囦唤鍒楄〃</param> - /// <param name="dicBackScene">绌虹殑鍦烘櫙澶囦唤鍒楄〃</param> - private void BackupRoomDevicelistTemporary(MemberShardInfoData memberShardInfo, Dictionary<string, List<string>> dicBackDevice, - Dictionary<string, List<int>> dicBackScene) - { - foreach (var roomKeys in memberShardInfo.dicShardRoom.Keys) - { - dicBackDevice[roomKeys] = new List<string>(); - dicBackScene[roomKeys] = new List<int>(); - - dicBackDevice[roomKeys].AddRange(memberShardInfo.dicShardRoom[roomKeys].ListDevice); - dicBackScene[roomKeys].AddRange(memberShardInfo.dicShardRoom[roomKeys].ListSceneId); - } - } - - /// <summary> - /// 杩樺師涓存椂澶囦唤鐨勬埧闂磋澶囧垪琛� - /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫垎浜暟鎹�</param> - /// <param name="dicBackDevice">涓存椂澶囦唤鐨勮澶囧浠藉垪琛�</param> - /// <param name="dicBackScene">涓存椂澶囦唤鐨勫満鏅浠藉垪琛�</param> - /// <param name="listFile">涓婁紶鐨勬枃浠跺悕</param> - private void RecoverRoomDevicelistTemporary(MemberShardInfoData memberShardInfo, Dictionary<string, List<string>> dicBackDevice, - Dictionary<string, List<int>> dicBackScene, List<string> 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 鈻� 绉婚櫎鎸囧畾鍒嗕韩鍐呭___________________ - - /// <summary> - /// 绉婚櫎鎸囧畾鍒嗕韩鍐呭 - /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫垎浜俊鎭�</param> - /// <param name="nowRoom">褰撳墠鎴块棿</param> - /// <param name="listDevice">瑕佸彇娑堢殑璁惧</param> - /// <param name="listSceneUI">瑕佸彇娑堢殑鍦烘櫙</param> - /// <returns></returns> - public bool DoDeleteSharedContent(MemberShardInfoData memberShardInfo, Common.Room nowRoom, - List<CommonDevice> listDevice, List<SceneUI> listSceneUI) - { - var roomTemp = memberShardInfo.dicShardRoom[nowRoom.FileName]; - //闃叉鍑洪敊,鍏堝浠藉垪琛� - var listBackDevice = new List<string>(); - listBackDevice.AddRange(roomTemp.ListDevice); - var listBackScene = new List<int>(); - listBackScene.AddRange(roomTemp.ListSceneId); - - var listMark = new List<string>(); - //瑕佸垹闄ょ殑鏂囦欢鍚嶅瓧 - var listDeleteFile = new List<string>(); - - //闄や簡瑕佸垹闄ょ殑鐩爣澶栵紝杩樺垎浜殑鏁版嵁 - var listHadShardKeys = this.GetAllShardedKeysFromDictionary(memberShardInfo, nowRoom, listDevice, listSceneUI); - - //鍏堝紕璁惧 - foreach (var device in listDevice) - { - string deviceFileName = device.FilePath; - string mainKeys = HdlDeviceCommonLogic.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<string, string>(); - var listBindScene = new List<SceneUI>(); - 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, 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 鈻� 鎵ц绉婚櫎鍒嗕韩鏁版嵁___________________ - - /// <summary> - /// 鎵ц绉婚櫎鍒嗕韩鏁版嵁 - /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫垎浜唴瀹�</param> - /// <param name="listMark">瑕佺Щ闄ょ殑涓婚敭</param> - /// <param name="listDeleteFile">瑕佸垹闄ょ殑鏂囦欢(鎴块棿鏂囦欢闇�瑕佸垹闄ょ殑璇�,蹇呴』鏀惧湪鏈�鍚�)</param> - /// <returns></returns> - private bool DoDeleteSharedContent(MemberShardInfoData memberShardInfo, List<string> listMark, List<string> listDeleteFile) - { - if (listMark.Count == 0) - { - //鏈夊彲鑳藉彧鍒犻櫎涓�涓洖璺紝鑰岃繖涓洖璺槸鍒嗛厤鍒板涓埧闂寸殑 - return true; - } - - //寮�鍚繘搴︽潯 - ProgressBar.Show(); + //璁╄澶囧拰鍦烘櫙涓嶉噸澶嶆坊鍔犵殑涓滆タ var listCheck = new HashSet<string>(); - foreach (var markKeys in listMark) - { - //閲岄潰浼间箮鏈夊彲鑳戒細鍑虹幇閲嶅 - if (listCheck.Contains(markKeys) == true) { continue; } - listCheck.Add(markKeys); - var pra = new { homeId = Config.Instance.Home.Id, homeShareId = markKeys }; - //鎵ц鍒犻櫎 - var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/home/share/delete", RestSharp.Method.POST, pra, null, null, CheckMode.A璐﹀彿鏉冮檺); - //妫�娴嬬姸鎬佺爜 - if (HdlCheckLogic.Current.CheckNetCode(result, ShowNetCodeMode.YES) == false) - { - //鍏抽棴杩涘害鏉� - ProgressBar.Close(); - return false; - } + //鐒跺悗鎶婂満鏅拰璁惧浠庤繖涓厠闅嗙殑瀵硅薄閲岄潰绉婚櫎鎺�(鐪熷疄鐗╃悊璁惧鐨勬埧闂翠笉鐢ㄧ悊) + foreach (var device in i_listDevice) + { + string mainKey = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device); + cloneRoom.ListDevice.Remove(mainKey); + + listCheck.Add(mainKey); } - //鍏抽棴杩涘害鏉� + foreach (var secne in i_listScene) + { + cloneRoom.ListSceneId.Remove(secne.Id); + + listCheck.Add(secne.Id.ToString()); + } + //濡傛灉閮界Щ闄ゅ畬鐨勮瘽,鍒欑洿鎺ヨ蛋鍒犻櫎鍒嗕韩鎴块棿鐨勬柟娉� + if (cloneRoom.ListDevice.Count == 0 && cloneRoom.ListSceneId.Count == 0) + { + //鎵ц鏁翠釜鎴块棿鍒犻櫎鐨勬柟娉� + return this.DeleteSharedRoom(i_ChildAccountId, new List<Room> { i_nowRoom }); + } + //鑾峰彇鍦烘櫙閲岄潰宓屽鐨勫瓙璁惧鍜屽瓙鍦烘櫙 + foreach (var sceneTemp in i_listScene) + { + //浠庣紦瀛樿幏鍙栧満鏅殑鎵ц鐩爣 + this.GetSceneAdjustTargetListFromShard(sceneTemp, listCheck, i_listScene, i_listDevice); + } + //鍦ㄥ垹闄や竴涓埧闂翠腑鐨勪竴浜涜澶囩殑妯″紡涓�,妫�娴嬭澶囧拰鍦烘櫙鏄惁鑳藉鍒犻櫎(鏈夊彲鑳藉畠杩樺湪鍒殑鎴块棿鎴栬�呭満鏅綋涓�) + var listDelDevice = new List<CommonDevice>(); + var listDelScene = new List<SceneUI>(); + this.CheckDeviceAndSceneCanDeleteOnDeleteSome(i_listDevice, i_listScene, ref listDelDevice, ref listDelScene, cloneRoom); + + //鐢熸垚鍒嗕韩Bin鏂囦欢鍐呭(杩欓噷涓嶇敤鍒犻櫎鎴块棿) + var binfFileContent = this.CreatShardBinContentOnDelete(new List<Room>(), listDelDevice, listDelScene); + + //涓婁紶bin鏂囦欢 + var fileKey = this.DoUploadShardContent(i_ChildAccountId, SHARED_BIN_FILE, Encoding.UTF8.GetBytes(binfFileContent)); + if (fileKey == null) + { + ProgressBar.Close(); + return false; + } + ProgressBar.SetValue(1); + + //璁板綍涓婚敭 + this.DicShardKeys[SHARED_BIN_FILE] = fileKey; + binfFileContent = null; + + //濡傛灉鍏ㄩ儴鎴愬姛浜嗙殑璇�,瑕嗙洊缂撳瓨 + this.DicDevices.Clear(); + this.DicScenes.Clear(); + this.DicRooms.Clear(); + this.DicFloor.Clear(); + this.AdjustBinFileContent(binfFileContent); + + //鍒犻櫎宸茬粡涓嶅啀鍒嗕韩鐨勫浘鐗� + this.DeleteNotShardPictrue(); + 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; + } + + /// <summary> + /// 绉婚櫎鎸囧畾鍒嗕韩鍐呭(鏁翠釜鎴块棿鍒犻櫎) + /// </summary> + /// <param name="i_ChildAccountId">鎴愬憳ID</param> + /// <param name="i_listRoom">闇�瑕佹暣涓垹闄ょ殑鎴块棿</param> + /// <returns></returns> + public bool DeleteSharedRoom(string i_ChildAccountId, List<Room> i_listRoom) + { + //鎵撳紑杩涘害鏉� + ProgressBar.Show(); + //璁剧疆鏈�澶у�� + ProgressBar.SetMaxValue(1); + + //鑾峰彇鍒犻櫎鎴块棿鐨勫叏閮ㄥ叏閮ㄨ澶囧拰鍦烘櫙 + var listDevice = new List<CommonDevice>(); + var listScene = new List<SceneUI>(); + this.GetDeleteRoomAllDeviceAndScene(i_listRoom, ref listDevice, ref listScene); + + //鍒犻櫎鐨勬埧闂碔D + var listDeleteRoom = new List<string>(); + foreach (var room in i_listRoom) + { + //鍒ゆ柇鍦烘櫙鍜岃澶囨槸鍚﹁兘鍒犻櫎鏃朵娇鐢� + listDeleteRoom.Add(room.Id); } + //鍦ㄥ垹闄ゆ暣涓埧闂寸殑妯″紡涓�,妫�娴嬭澶囧拰鍦烘櫙鏄惁鑳藉鍒犻櫎(鏈夊彲鑳藉畠杩樺湪鍒殑鎴块棿鎴栬�呭満鏅綋涓�) + var listDelDevice = new List<CommonDevice>(); + var listDelScene = new List<SceneUI>(); + this.CheckDeviceAndSceneCanDeleteOnDeleteRoom(listDevice, listScene, ref listDelDevice, ref listDelScene, listDeleteRoom); + + //鐢熸垚鍒嗕韩Bin鏂囦欢鍐呭 + var binfFileContent = this.CreatShardBinContentOnDelete(i_listRoom, listDelDevice, listDelScene); + + //涓婁紶bin鏂囦欢 + var fileKey = this.DoUploadShardContent(i_ChildAccountId, SHARED_BIN_FILE, Encoding.UTF8.GetBytes(binfFileContent)); + if (fileKey == null) + { + ProgressBar.Close(); + return false; + } + ProgressBar.SetValue(1); + + //璁板綍涓婚敭 + this.DicShardKeys[SHARED_BIN_FILE] = fileKey; + binfFileContent = null; + + //濡傛灉鍏ㄩ儴鎴愬姛浜嗙殑璇�,瑕嗙洊缂撳瓨 + this.DicDevices.Clear(); + this.DicScenes.Clear(); + this.DicRooms.Clear(); + this.DicFloor.Clear(); + this.AdjustBinFileContent(binfFileContent); + + //鍒犻櫎宸茬粡涓嶅啀鍒嗕韩鐨勫浘鐗� + this.DeleteNotShardPictrue(); + + ProgressBar.Close(); + return true; } /// <summary> /// 鎵ц绉婚櫎鍒嗕韩鏁版嵁 /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫垎浜唴瀹�</param> /// <param name="listDelFile">鍒犻櫎鐨勬枃浠�</param> + /// <param name="mode">澶辫触鏃舵槸鍚︽樉绀簍ip娑堟伅</param> /// <returns></returns> - private bool DoDeleteSharedContent(MemberShardInfoData memberShardInfo, List<string> listDelFile) + private bool DoDeleteSharedContent(List<string> listDelFile, ShowNetCodeMode mode = ShowNetCodeMode.YES) { if (listDelFile.Count == 0) { @@ -1386,232 +1106,645 @@ } foreach (var fileName in listDelFile) { - if (memberShardInfo.dicAllShardKeys.ContainsKey(fileName) == false) + if (this.DicShardKeys.ContainsKey(fileName) == false) { //鎴戜篃涓嶇煡閬撲负浠�涔堜細鎵句笉鍒颁富閿� continue; } - var pra = new { homeId = Config.Instance.Home.Id, homeShareId = memberShardInfo.dicAllShardKeys[fileName] }; + var pra = new { homeId = Config.Instance.Home.Id, homeShareId = this.DicShardKeys[fileName] }; //鎵ц鍒犻櫎 - var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/home/share/delete", RestSharp.Method.POST, pra, null, null, CheckMode.A璐﹀彿鏉冮檺); + var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/app/home/share/delete", RestSharp.Method.POST, pra, null, null, CheckMode.A璐﹀彿鏉冮檺); //妫�娴嬬姸鎬佺爜 - if (HdlCheckLogic.Current.CheckNetCode(result, ShowNetCodeMode.YES) == false) + if (HdlCheckLogic.Current.CheckNetCode(result, mode) == false) { return false; } - } - for (int i = 0; i < listDelFile.Count; i++) - { - string fileName = listDelFile[i]; - memberShardInfo.dicAllShardKeys.Remove(fileName); - - this.DeleteShardFile(fileName); + //绉婚櫎缂撳瓨 + this.DicShardKeys.Remove(fileName); } return true; } #endregion - #region 鈻� 涓婁紶鎴块棿瀵硅薄_______________________ + #region 鈻� 鍒犻櫎鍒嗕韩鍐呭杈呭姪鏂规硶_______________ /// <summary> - /// 涓婁紶鎴块棿瀵硅薄 + /// 鑾峰彇鍒犻櫎鎴块棿鐨勫叏閮ㄥ叏閮ㄨ澶囧拰鍦烘櫙 /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫叡浜唴瀹�</param> - /// <param name="upDateRoom">闇�瑕佷笂浼犲埌浜戠鐨勬埧闂村璞�</param> - /// <returns></returns> - private bool DoUploadRoomObject(MemberShardInfoData memberShardInfo, Common.Room upDateRoom) + /// <param name="i_listRoom">鍒犻櫎鐨勬埧闂�</param> + /// <param name="listDevice">鍏ㄩ儴璁惧(杩斿洖鍊�)</param> + /// <param name="listScene">鍏ㄩ儴鍦烘櫙(杩斿洖鍊�)</param> + private void GetDeleteRoomAllDeviceAndScene(List<Room> i_listRoom, ref List<CommonDevice> listDevice, ref List<SceneUI> listScene) { - if (upDateRoom.Id == "Other") + var listCheck = new HashSet<string>(); + foreach (var room in i_listRoom) { - return true; - } - var data = Newtonsoft.Json.JsonConvert.SerializeObject(upDateRoom); - var byteData = System.Text.Encoding.UTF8.GetBytes(data); - //涓婁紶鍐呭 - var shardId = this.DoUploadShardContent(memberShardInfo.ChildAccountId, upDateRoom.FileName, byteData); - if (shardId == null) - { - return false; - } - //灏嗘埧闂村璞″簭鍒楀寲鍒扮紦瀛� - this.AddShardFile(upDateRoom); + //鑾峰彇璁惧 + foreach (var mainkey in room.ListDevice) + { + if (listCheck.Contains(mainkey) == true) { continue; } + listCheck.Add(mainkey); - return true; + //鍒嗕韩鏁版嵁閲岄潰鏈夋墠娣诲姞 + if (this.DicDevices.ContainsKey(mainkey) == true) + { + listDevice.Add(this.DicDevices[mainkey]); + } + } + //鐒跺悗鍐嶈幏鍙栧満鏅� + foreach (var sceneId in room.ListSceneId) + { + if (listCheck.Contains(sceneId.ToString()) == true) { continue; } + listCheck.Add(sceneId.ToString()); + + //鍒嗕韩鏁版嵁閲岄潰鏈夋墠娣诲姞 + if (this.DicScenes.ContainsKey(sceneId) == true) + { + var sceneTemp = this.DicScenes[sceneId]; + listScene.Add(sceneTemp); + + //鑾峰彇鍦烘櫙閲岄潰宓屽鐨勫瓙璁惧鍜屽瓙鍦烘櫙 + this.GetSceneAdjustTargetListFromShard(sceneTemp, listCheck, listScene, listDevice); + } + } + } } - #endregion - - #region 鈻� 涓婁紶妤煎眰瀵硅薄_______________________ - /// <summary> - /// 涓婁紶妤煎眰瀵硅薄 + /// 鍦ㄥ垹闄ゆ暣涓埧闂寸殑妯″紡涓�,妫�娴嬭澶囧拰鍦烘櫙鏄惁鑳藉鍒犻櫎(鏈夊彲鑳藉畠杩樺湪鍒殑鎴块棿鎴栬�呭満鏅綋涓�) /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫叡浜唴瀹�</param> - /// <returns></returns> - private bool DoUploadFloorObject(MemberShardInfoData memberShardInfo) + /// <param name="i_listDevice">鐞嗚涓婅鍒犻櫎鐨勮澶�</param> + /// <param name="i_listScene">鐞嗚涓婅鍒犻櫎鐨勫満鏅�</param> + /// <param name="listDeleteDevice">鐪熷疄鑳藉鍒犻櫎鐨勮澶�(杩斿洖鍊�)</param> + /// <param name="listDeleteScene">鐪熷疄鑳藉鍒犻櫎鐨勫満鏅�(杩斿洖鍊�)</param> + /// <param name="i_listDelleteRoom">鍒犻櫎鐨勬埧闂�</param> + private void CheckDeviceAndSceneCanDeleteOnDeleteRoom(List<CommonDevice> i_listDevice, List<SceneUI> i_listScene, + ref List<CommonDevice> listDeleteDevice, ref List<SceneUI> listDeleteScene, List<string> i_listNotCheckRoom) { - var data = Newtonsoft.Json.JsonConvert.SerializeObject(memberShardInfo.dicShardFloor); - var byteData = System.Text.Encoding.UTF8.GetBytes(data); - //涓婁紶鍐呭 - var shardId = this.DoUploadShardContent(memberShardInfo.ChildAccountId, HdlFileNameResourse.ShardFloorFile, byteData); - if (shardId == null) + //娉ㄦ剰锛氳繖涓嚱鏁板拰涓嬮潰鐨凜heckDeviceAndSceneCanDeleteOnDeleteSome鏈夋湰璐ㄥ尯鍒� + //杩欎釜鍙槸瀹屽叏鍒犻櫎涓�涓埧闂村唴鐨勮澶囨垨鑰呭満鏅�,鍥犳鍙渶瑕佸幓鍒ゆ柇鍒犻櫎浠ュ鐨勫氨鍙互浜� + + //鑾峰彇鐞嗚涓婇渶瑕佸垹闄ょ殑鍦烘櫙ID + var listSceneId = new List<int>(); + foreach (var scene in i_listScene) { - return false; + listSceneId.Add(scene.Id); + } + var listShardDevice = new HashSet<string>(); + var listShardScene = new HashSet<int>(); + //鑾峰彇闄や簡鐞嗚涓婇渶瑕佸垹闄ょ殑鍦烘櫙涔嬪锛岀洰鍓嶈繕鍒嗕韩鐨勫満鏅殑鎵ц鐩爣閲岄潰鐨勮澶� + foreach (var scene in this.DicScenes.Values) + { + //杩欎釜鏄鍒犻櫎鐨勫満鏅� + if (listSceneId.Contains(scene.Id) == true) { continue; } + + foreach (var data in scene.AdjustTargetList) + { + //璁惧 + if (data.Type == 0) + { + var mainkey = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(data.DeviceAddr, data.Epoint); + if (listShardDevice.Contains(mainkey) == false) + { + listShardDevice.Add(mainkey); + } + } + //瀛愬満鏅� + else if (data.Type == 1) + { + if (listShardScene.Contains(data.ElseScenesId) == false) + { + listShardScene.Add(data.ElseScenesId); + } + } + } + } + //鑾峰彇闄や簡鐞嗚涓婇渶瑕佸垹闄ょ殑鎴块棿涔嬪锛岀洰鍓嶈繕鍒嗕韩鐨勮澶� + foreach (var room in this.DicRooms.Values) + { + //杩欎釜鏄鍒犻櫎鐨勬埧闂� + if (i_listNotCheckRoom.Contains(room.Id) == true) { continue; } + + foreach (var mainkey in room.ListDevice) + { + if (listShardDevice.Contains(mainkey) == false) + { + listShardDevice.Add(mainkey); + } + } + foreach (var sceneId in room.ListSceneId) + { + if (listShardScene.Contains(sceneId) == false) + { + listShardScene.Add(sceneId); + } + } } - //灏嗘埧闂村璞″簭鍒楀寲鍒扮紦瀛� - this.AddShardFile(memberShardInfo.dicShardFloor); - - return true; + //鍒ゆ柇瀹為檯鑳藉鍒犻櫎鐨勮澶� + foreach (var device in i_listDevice) + { + var mainkey = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device); + if (listShardDevice.Contains(mainkey) == false) + { + //杩欎釜璁惧宸茬粡涓嶅湪鍒嗕韩 + listDeleteDevice.Add(device); + } + } + //鍒ゆ柇瀹為檯鑳藉鍒犻櫎鐨勫満鏅� + foreach (var scene in i_listScene) + { + if (listShardScene.Contains(scene.Id) == false) + { + //杩欎釜鍦烘櫙宸茬粡涓嶅湪鍒嗕韩 + listDeleteScene.Add(scene); + } + } } - #endregion + /// <summary> + /// 鍦ㄥ垹闄や竴涓埧闂翠腑鐨勪竴浜涜澶囩殑妯″紡涓�,妫�娴嬭澶囧拰鍦烘櫙鏄惁鑳藉鍒犻櫎(鏈夊彲鑳藉畠杩樺湪鍒殑鎴块棿鎴栬�呭満鏅綋涓�) + /// </summary> + /// <param name="i_listDevice">鐞嗚涓婅鍒犻櫎鐨勮澶�</param> + /// <param name="i_listScene">鐞嗚涓婅鍒犻櫎鐨勫満鏅�</param> + /// <param name="listDeleteDevice">鐪熷疄鑳藉鍒犻櫎鐨勮澶�(杩斿洖鍊�)</param> + /// <param name="listDeleteScene">鐪熷疄鑳藉鍒犻櫎鐨勫満鏅�(杩斿洖鍊�)</param> + /// <param name="i_nowCloneRoom">褰撳墠鎴块棿(鍏嬮殕)</param> + private void CheckDeviceAndSceneCanDeleteOnDeleteSome(List<CommonDevice> i_listDevice, List<SceneUI> i_listScene, + ref List<CommonDevice> listDeleteDevice, ref List<SceneUI> listDeleteScene, Room i_nowCloneRoom) + { + //娉ㄦ剰锛氳繖涓嚱鏁板拰涓婇潰鐨凜heckDeviceAndSceneCanDeleteOnDeleteRoom鏈夋湰璐ㄥ尯鍒� + //杩欎釜鍙槸鍒犻櫎涓�涓埧闂村唴鐨勯儴鍒嗚澶囨垨鑰呭満鏅�,鍥犳瀹冩湁鍙兘鑷韩灏卞祵濂楃潃瑕佸垹闄ょ殑璁惧鎴栬�呭満鏅� - #region 鈻� 绉婚櫎鍏变韩鐨勪竴鑸柟娉昣________________ + //鍏堣幏鍙栫洰鍓嶈繕鍦ㄥ垎浜殑璁惧鍜屽満鏅� + var listShardDevice = new HashSet<string>(); + var listShardScene = new HashSet<int>(); + + foreach (var roomId in this.DicRooms.Keys) + { + //濡傛灉鏄綋鍓嶅厠闅嗙殑鎴块棿,鍒欑敤鍏嬮殕鐨勬埧闂存潵澶勭悊,鍏嬮殕鐨勬埧闂村凡缁忔妸鐞嗚涓婅鍒犻櫎鐨勮澶囧拰鍦烘櫙閮藉垹闄や簡 + var room = i_nowCloneRoom.Id != roomId ? this.DicRooms[roomId] : i_nowCloneRoom; + //杩樺湪鍒嗕韩鐨勮澶� + foreach (var mainkey in room.ListDevice) + { + if (listShardDevice.Contains(mainkey) == false) + { + listShardDevice.Add(mainkey); + } + } + //杩樺湪鍒嗕韩鐨勫満鏅� + foreach (var sceneId in room.ListSceneId) + { + if (listShardScene.Contains(sceneId) == false) + { + listShardScene.Add(sceneId); + } + //浠庡満鏅殑鎵ц鐩爣褰撳墠鑾峰彇 + if (this.DicScenes.ContainsKey(sceneId) == true) + { + foreach (var data in this.DicScenes[sceneId].AdjustTargetList) + { + //瀛愯澶� + if (data.Type == 0) + { + var mainkey = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(data.DeviceAddr, data.Epoint); + if (listShardDevice.Contains(mainkey) == false) + { + listShardDevice.Add(mainkey); + } + } + //瀛愬満鏅� + else if (data.Type == 1) + { + if (listShardScene.Contains(data.ElseScenesId) == false) + { + listShardScene.Add(data.ElseScenesId); + } + } + } + } + } + } + //鍒ゆ柇瀹為檯鑳藉鍒犻櫎鐨勮澶� + foreach (var device in i_listDevice) + { + var mainkey = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device); + if (listShardDevice.Contains(mainkey) == false) + { + //杩欎釜璁惧宸茬粡涓嶅湪鍒嗕韩 + listDeleteDevice.Add(device); + } + } + //鍒ゆ柇瀹為檯鑳藉鍒犻櫎鐨勫満鏅� + foreach (var scene in i_listScene) + { + if (listShardScene.Contains(scene.Id) == false) + { + //杩欎釜鍦烘櫙宸茬粡涓嶅湪鍒嗕韩 + listDeleteScene.Add(scene); + } + } + } /// <summary> - /// 浠庣紦瀛樺瓧鍏镐腑鑾峰彇宸茬粡鍒嗕韩浜嗙殑鍏ㄩ儴璁惧涓婚敭鍜屽満鏅殑ID + /// 浠庡垎浜暟鎹噷闈㈣幏鍙栧満鏅噷闈㈢殑鎵ц鐩爣鍒楄〃 /// </summary> - /// <param name="memberShardInfo">鎴愬憳鐨勫垎浜俊鎭�</param> - /// <param name="nowRoom">褰撳墠鎴块棿</param> - /// <param name="listDeleteDevice">瑕佸垹闄ょ殑璁惧鍒楄〃</param> - /// <param name="listDeleteScene">瑕佸垹闄ょ殑鍦烘櫙鍒楄〃</param> + /// <param name="scene">鍦烘櫙</param> + /// <param name="listCheck">閲嶅妫�娴嬬敤</param> + /// <param name="listSceneUI">娣诲姞鍒嗕韩鐨勫満鏅垪琛�</param> + /// <param name="listDevice">娣诲姞鍒嗕韩鐨勮澶囧垪琛�</param> /// <returns></returns> - private HashSet<string> GetAllShardedKeysFromDictionary(MemberShardInfoData memberShardInfo, Common.Room nowRoom, - List<CommonDevice> listDeleteDevice, List<Common.SceneUI> listDeleteScene) + private void GetSceneAdjustTargetListFromShard(SceneUI scene, HashSet<string> listCheck, List<SceneUI> listSceneUI, List<CommonDevice> listDevice) { - //鑾峰彇鍏ㄩ儴瑕佸垹闄ょ殑鏂囦欢鍚嶅瓧 - var dicDeleteDeviceFile = new Dictionary<string, string>(); - foreach (var device in listDeleteDevice) - { - dicDeleteDeviceFile[HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device)] = device.FilePath; - } - var dicDeleteSceneFile = new Dictionary<int, string>(); - foreach (var scene in listDeleteScene) - { - dicDeleteSceneFile[scene.Id] = scene.FileName; - } - - var listShardKeys = new HashSet<string>(); - //鑾峰彇杩樺浜庡垎浜姸鎬佺殑涓婚敭 - foreach (var roomTemp in memberShardInfo.dicShardRoom.Values) + foreach (var data in scene.AdjustTargetList) { //璁惧 - foreach (var deviceKeys in roomTemp.ListDevice) + if (data.Type == 0) { - if (dicDeleteDeviceFile.ContainsKey(deviceKeys) == true) + string mainKeys = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(data.DeviceAddr, data.Epoint); + if (listCheck.Contains(mainKeys) == true) { - //鍥犱负涓�涓洖璺彧鑳藉垎閰嶄竴涓尯鍩�,鎵�浠ュ彲浠ョ洿鎺ュ垽鏂� + //涓嶉噸澶嶆坊鍔� continue; } - if (listShardKeys.Contains(deviceKeys) == false) + listCheck.Add(mainKeys); + if (this.DicDevices.ContainsKey(mainKeys) == true) { - //杩欎釜鏂囦欢杩樺垎浜潃 - listShardKeys.Add(deviceKeys); + listDevice.Add(this.DicDevices[mainKeys]); } - } //鍦烘櫙 - foreach (var sceneId in roomTemp.ListSceneId) + else if (data.Type == 1) { - if (roomTemp.FileName == nowRoom.FileName) + string mainKeys = data.ElseScenesId.ToString(); + if (listCheck.Contains(mainKeys) == true) { - //濡傛灉寰幆鍒颁簡褰撳墠鎴块棿 - 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<Common.SceneUI>(valueData); + listCheck.Add(mainKeys); - //鑾峰彇鍦烘櫙閲岄潰鐨勫叏閮ㄧ洰鏍� - var listTempKeys = new HashSet<string>(); - //浠庡満鏅璞¢噷闈㈣幏鍙栧叏閮ㄧ殑缁戝畾鐩爣鐨勪富閿�(杩欓噷闈㈢殑涓滆タ蹇呴』浠庡垎浜暟鎹腑鑾峰彇) - this.GetSceneBindListKeys(sceneTemp, ref listTempKeys); + //鑾峰彇鍦烘櫙瀵硅薄 + if (this.DicScenes.ContainsKey(data.ElseScenesId) == true) + { + var sceneUi = this.DicScenes[data.ElseScenesId]; + listSceneUI.Add(sceneUi); - if (listShardKeys.Contains(sceneId.ToString()) == false) - { - //鍦烘櫙鑷韩 - listShardKeys.Add(sceneId.ToString()); - } - foreach (string myKeys2 in listTempKeys) - { - if (listShardKeys.Contains(myKeys2) == false) - { - listShardKeys.Add(myKeys2); - } + //閫掑綊鑾峰彇鎵ц鐩爣 + this.GetSceneAdjustTargetListFromShard(sceneUi, listCheck, listSceneUI, listDevice); } } } - return listShardKeys; + } + + + #endregion + + + #region 鈻� 鐢熸垚鍒嗕韩Bin鏂囦欢鍐呭________________ + + /// <summary> + /// 鐢熸垚鍒嗕韩Bin鏂囦欢鍐呭(鏂板妯″紡) + /// </summary> + /// <param name="i_listNewRoom">鏂扮殑鎴块棿瀵硅薄闆嗗悎(涔熷氨鏄彉鏇翠簡鐨勬埧闂�)</param> + /// <param name="i_listDevice">杩欎釜鏄渶瑕佽拷鍔犵殑鍒嗕韩璁惧</param> + /// <param name="i_listScene">杩欎釜鏄渶瑕佽拷鍔犵殑鍒嗕韩鍦烘櫙</param> + /// <param name="i_listChirdDevice">杩欎釜鏄敱鍦烘櫙鐨勬墽琛岀洰鏍囨潵鐨�</param> + /// <param name="i_listChirdScene">杩欎釜鏄敱鍦烘櫙鐨勬墽琛岀洰鏍囨潵鐨�</param> + /// <returns></returns> + private string CreatShardBinContentOnAdd(List<Room> i_listNewRoom, List<CommonDevice> i_listDevice, List<SceneUI> i_listScene, + List<CommonDevice> i_listChirdDevice, List<SceneUI> i_listChirdScene) + { + string writeText = string.Empty; + //鐢熸垚鍐欏叆鏂囦欢鐨勩�愯澶囧璞℃暟鎹�� + this.CreatWriteCommonDeviceData(i_listDevice, i_listChirdDevice, false, ref writeText); + + //鐢熸垚鍐欏叆鏂囦欢鐨勩�愬満鏅暟鎹�� + this.CreatWriteSceneData(i_listScene, i_listChirdScene, false, ref writeText); + + //鐢熸垚鍐欏叆鏂囦欢鐨勩�愬満鏅暟鎹�� + this.CrearWriteRoomData(i_listNewRoom, false, ref writeText); + + return writeText; } /// <summary> - /// 浠庡満鏅璞¢噷闈㈣幏鍙栧叏閮ㄧ殑缁戝畾鐩爣鐨勪富閿�(杩欓噷闈㈢殑涓滆タ蹇呴』浠庡垎浜暟鎹腑鑾峰彇) + /// 鐢熸垚鍒嗕韩Bin鏂囦欢鍐呭(鍒犻櫎妯″紡) /// </summary> - /// <param name="scene">鍦烘櫙</param> - /// <param name="dicDeviceKeys">璁惧涓婚敭鍒楄〃(閲岄潰娌℃湁鍦烘櫙),keys:涓婚敭,value:鏂囦欢鍚�</param> - /// <param name="listBindScene">缁戝畾鐨勫満鏅璞�</param> - private void GetSceneBindListKeys(Common.SceneUI scene, ref Dictionary<string, string> dicDeviceKeys, ref List<SceneUI> listBindScene) + /// <param name="i_listDelRoom">瑕佸垹闄ょ殑鎴块棿</param> + /// <param name="i_listDevice">杩欎釜鏄渶瑕佸垹闄ょ殑鍒嗕韩璁惧</param> + /// <param name="i_listScene">杩欎釜鏄渶瑕佸垹闄ょ殑鍒嗕韩鍦烘櫙</param> + /// <returns></returns> + private string CreatShardBinContentOnDelete(List<Room> i_listDelRoom, List<CommonDevice> i_listDevice, List<SceneUI> i_listScene) { - foreach (var data in scene.AdjustTargetList) + string writeText = string.Empty; + //鐢熸垚鍐欏叆鏂囦欢鐨勩�愯澶囧璞℃暟鎹�� + this.CreatWriteCommonDeviceData(i_listDevice, new List<CommonDevice>(), true, ref writeText); + + //鐢熸垚鍐欏叆鏂囦欢鐨勩�愬満鏅暟鎹�� + this.CreatWriteSceneData(i_listScene, new List<SceneUI>(), true, ref writeText); + + //鐢熸垚鍐欏叆鏂囦欢鐨勩�愬満鏅暟鎹�� + this.CrearWriteRoomData(i_listDelRoom, true, ref writeText); + + return writeText; + } + + /// <summary> + /// 鐢熸垚鍐欏叆鏂囦欢鐨勩�愯澶囧璞℃暟鎹�� + /// </summary> + /// <param name="writeText"></param> + private void CreatWriteCommonDeviceData(List<CommonDevice> i_listDevice, List<CommonDevice> i_listChirdDevice, bool i_isDel, ref string writeText) + { + //鍚堝苟璁惧鍒颁竴涓柊鐨勫璞″綋涓� + var dicNewDevice = this.MergeNewShardDevices(i_listDevice, i_listChirdDevice, i_isDel); + var listCheck = new HashSet<string>(); + foreach (var device in dicNewDevice.Values) { - //璁惧 - if (data.Type == 0) + //璁惧绔偣 + writeText += "#DeviceInfo START#" + (int)device.Type + "\r\n"; + string dataInfo = Newtonsoft.Json.JsonConvert.SerializeObject(device); + writeText += dataInfo + "\r\n"; + writeText += "#DeviceInfo END#\r\n\r\n"; + + //娣诲姞Ota璁惧瀵硅薄鐨勭紦瀛� + if (listCheck.Contains(device.DeviceAddr) == false) { - string mainkey = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(data.DeviceAddr, data.Epoint); - if (dicShardDeviceFile.ContainsKey(mainkey) == true && dicDeviceKeys.ContainsKey(mainkey) == false) + listCheck.Add(device.DeviceAddr); + var otaDevice = HdlDeviceCommonLogic.Current.GetOTADevice(device.DeviceAddr); + if (otaDevice != null) { - 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<Common.SceneUI>(valueData); - listBindScene.Add(sceneTemp); + writeText += "#DeviceInfo START#" + (int)otaDevice.Type + "\r\n"; + string dataInfo2 = Newtonsoft.Json.JsonConvert.SerializeObject(otaDevice); + writeText += dataInfo2 + "\r\n"; + writeText += "#DeviceInfo END#\r\n\r\n"; } } } } /// <summary> - /// 浠庡満鏅璞¢噷闈㈣幏鍙栧叏閮ㄧ殑缁戝畾鐩爣鐨勪富閿�(杩欓噷闈㈢殑涓滆タ蹇呴』浠庡垎浜暟鎹腑鑾峰彇) + /// 鐢熸垚鍐欏叆鏂囦欢鐨勩�愬満鏅暟鎹�� /// </summary> - /// <param name="scene">鍦烘櫙</param> - /// <param name="listKeys">涓婚敭鍒楄〃(璁惧鍜屽満鏅�)</param> - private void GetSceneBindListKeys(Common.SceneUI scene, ref HashSet<string> listKeys) + /// <param name="i_listScene">杩欎釜鏄渶瑕佽拷鍔犵殑鍒嗕韩鍦烘櫙</param> + /// <param name="i_listChirdScene">杩欎釜鏄敱鍦烘櫙鐨勬墽琛岀洰鏍囨潵鐨�</param> + /// <param name="writeText"></param> + private void CreatWriteSceneData(List<SceneUI> i_listScene, List<SceneUI> i_listChirdScene, bool i_isDel, ref string writeText) { - foreach (var data in scene.AdjustTargetList) + //鍚堝苟鍦烘櫙鍒颁竴涓柊鐨勫璞″綋涓� + var dicNewScene = this.MergeNewShardScenes(i_listScene, i_listChirdScene, i_isDel); + + foreach (var scene in dicNewScene.Values) { - //璁惧 - if (data.Type == 0) + writeText += "#START#\r\n"; + string dataInfo = Newtonsoft.Json.JsonConvert.SerializeObject(scene); + writeText += dataInfo + "\r\n"; + writeText += "#SceneTemplate END#\r\n\r\n"; + } + } + + /// <summary> + /// 鐢熸垚鍐欏叆鏂囦欢鐨勩�愭埧闂存ā鏉挎暟鎹�� + /// </summary> + /// <param name="i_listNewRoom">鏂扮殑鎴块棿瀵硅薄闆嗗悎(涔熷氨鏄彉鏇翠簡鐨勬埧闂�)</param> + /// <param name="writeText"></param> + private void CrearWriteRoomData(List<Room> i_listNewRoom, bool i_isDel, ref string writeText) + { + var dicNewFloor = new Dictionary<string, string>(); + //鍚堝苟鍒嗕韩鐨勬埧闂村埌涓�涓柊鐨勫璞′腑 + var dicNewRoom = this.MergeNewShardRooms(i_listNewRoom, i_isDel); + foreach (var room in dicNewRoom.Values) + { + writeText += "#START#\r\n"; + string dataInfo2 = Newtonsoft.Json.JsonConvert.SerializeObject(room); + writeText += dataInfo2 + "\r\n"; + writeText += "#RoomInfo END#\r\n\r\n"; + + if (room.FloorId != string.Empty) { - string mainkey = HdlDeviceCommonLogic.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()); - } + dicNewFloor[room.FloorId] = HdlResidenceLogic.Current.GetFloorNameById(room.FloorId); } } + //妤煎眰鏁版嵁 + writeText += "#START#\r\n"; + string dataInfo1 = Newtonsoft.Json.JsonConvert.SerializeObject(dicNewFloor); + writeText += dataInfo1 + "\r\n"; + writeText += "#FloorInfo END#\r\n\r\n"; + } + + #endregion + + #region 鈻� 鐢熸垚鍒嗕韩Bin鏂囦欢鍐呭杈呭姪鏂规硶________ + + /// <summary> + /// 鍚堝苟鍒嗕韩鐨勮澶囧埌涓�涓柊鐨勫璞′腑 + /// </summary> + /// <param name="i_listDevice">杩欎釜鏄渶瑕佽拷鍔犵殑鍒嗕韩璁惧</param> + /// <param name="i_listChirdDevice">杩欎釜鏄敱鍦烘櫙鐨勬墽琛岀洰鏍囨潵鐨�</param> + /// <param name="i_isDel">鏄惁鏄垹闄ゅ垎浜ā寮�</param> + /// <returns></returns> + private Dictionary<string, CommonDevice> MergeNewShardDevices(List<CommonDevice> i_listDevice, List<CommonDevice> i_listChirdDevice, bool i_isDel) + { + var dicNewDevice = new Dictionary<string, CommonDevice>(); + //鍏堝悎骞跺師鏉ョ殑 + foreach (var key in this.DicDevices.Keys) + { + dicNewDevice[key] = this.DicDevices[key]; + } + //鍐嶅悎骞舵柊娣诲姞鐨� + foreach (var device in i_listDevice) + { + string mainkey = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device); + if (i_isDel == false) + { + //鐩存帴瑕嗙洊,娌¢棶棰� + dicNewDevice[mainkey] = device; + } + else + { + //鍒犻櫎妯″紡 + dicNewDevice.Remove(mainkey); + } + } + foreach (var device in i_listChirdDevice) + { + string mainkey = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device); + //鐩存帴瑕嗙洊,娌¢棶棰� + dicNewDevice[mainkey] = device; + } + return dicNewDevice; + } + + /// <summary> + /// 鍚堝苟鍒嗕韩鐨勫満鏅埌涓�涓柊鐨勫璞′腑 + /// </summary> + /// <param name="i_listScene">杩欎釜鏄渶瑕佽拷鍔犵殑鍒嗕韩鍦烘櫙</param> + /// <param name="i_listChirdScene">杩欎釜鏄敱鍦烘櫙鐨勬墽琛岀洰鏍囨潵鐨�</param> + /// <param name="i_isDel">鏄惁鏄垹闄ゅ垎浜ā寮�</param> + /// <returns></returns> + private Dictionary<int, SceneUI> MergeNewShardScenes(List<SceneUI> i_listScene, List<SceneUI> i_listChirdScene, bool i_isDel) + { + var dicNewScene = new Dictionary<int, SceneUI>(); + //鍏堝悎骞跺師鏉ョ殑 + foreach (var key in this.DicScenes.Keys) + { + dicNewScene[key] = this.DicScenes[key]; + } + //鍐嶅悎骞舵柊娣诲姞鐨� + foreach (var scene in i_listScene) + { + if (i_isDel == false) + { + //鐩存帴瑕嗙洊,娌¢棶棰� + dicNewScene[scene.Id] = scene; + } + else + { + //鍒犻櫎妯″紡 + dicNewScene.Remove(scene.Id); + } + } + foreach (var scene in i_listChirdScene) + { + //鐩存帴瑕嗙洊,娌¢棶棰� + dicNewScene[scene.Id] = scene; + } + return dicNewScene; + } + + /// <summary> + /// 鍚堝苟鍒嗕韩鐨勬埧闂村埌涓�涓柊鐨勫璞′腑 + /// </summary> + /// <param name="i_listNewRoom">鏂扮殑鎴块棿瀵硅薄闆嗗悎(涔熷氨鏄彉鏇翠簡鐨勬埧闂�)</param> + /// <param name="i_isDel">鏄惁鏄垹闄ゅ垎浜ā寮�</param> + /// <returns></returns> + private Dictionary<string, Room> MergeNewShardRooms(List<Room> i_listNewRoom, bool i_isDel) + { + var dicNewRoom = new Dictionary<string, Room>(); + //鍏堝悎骞跺師鏉ョ殑 + foreach (var key in this.DicRooms.Keys) + { + dicNewRoom[key] = this.DicRooms[key]; + } + //鍐嶅悎骞舵柊娣诲姞鐨� + foreach (var room in i_listNewRoom) + { + if (i_isDel == false) + { + //鐩存帴瑕嗙洊,娌¢棶棰� + dicNewRoom[room.Id] = room; + } + else + { + //鍒犻櫎妯″紡 + dicNewRoom.Remove(room.Id); + } + } + return dicNewRoom; + } + + #endregion + + + #region 鈻� 鑾峰彇鍒嗕韩缂撳瓨鏂规硶___________________ + + /// <summary> + /// 浠庣紦瀛樺綋涓幏鍙栧垎浜殑璁惧 + /// </summary> + /// <param name="i_deviceKey">璁惧鐨勪富閿�</param> + /// <returns></returns> + public CommonDevice GetShardDeviceFromMemory(string i_deviceKey) + { + if (this.DicDevices.ContainsKey(i_deviceKey) == true) + { + return this.DicDevices[i_deviceKey]; + } + return null; + } + + /// <summary> + /// 浠庣紦瀛樺綋涓幏鍙栧垎浜殑鍦烘櫙 + /// </summary> + /// <param name="i_sceneId">鍦烘櫙ID</param> + /// <returns></returns> + public SceneUI GetShardSceneFromMemory(int i_sceneId) + { + if (this.DicScenes.ContainsKey(i_sceneId) == true) + { + return this.DicScenes[i_sceneId]; + } + return null; + } + + /// <summary> + /// 浠庣紦瀛樺綋涓幏鍙栧垎浜殑鎴块棿 + /// </summary> + /// <returns></returns> + public Dictionary<string, Room> GetShardRoomFromMemory() + { + return this.DicRooms; + } + + /// <summary> + /// 浠庣紦瀛樺綋涓幏鍙栧垎浜殑鎴块棿 + /// </summary> + /// <param name="i_roomId">鎴块棿ID</param> + /// <returns></returns> + public Room GetShardRoomFromMemory(string i_roomId) + { + if (this.DicRooms.ContainsKey(i_roomId) == true) + { + return this.DicRooms[i_roomId]; + } + return null; + } + + /// <summary> + /// 浠庣紦瀛樺綋涓幏鍙栧垎浜殑妤煎眰 + /// </summary> + /// <returns></returns> + public Dictionary<string, string> GetShardFloorFormMemory() + { + return this.DicFloor; + } + + #endregion + + #region 鈻� 涓�鑸柟娉昣__________________________ + + /// <summary> + /// 鑾峰彇鍒嗕韩鏂囦欢鐨勫唴瀹� + /// </summary> + /// <param name="fileName">鏂囦欢鍚嶇О(涓嶆槸鍏ㄨ矾寰�)</param> + /// <returns></returns> + private byte[] GetShardFileContent(string fileName) + { + string fullName = System.IO.Path.Combine(HdlFileNameResourse.DownLoadShardDirectory, fileName); + if (System.IO.File.Exists(fullName) == false) + { + return null; + } + var varByte = HdlFileLogic.Current.ReadFileByteContent(fullName); + return varByte; + } + + /// <summary> + /// 娓呯┖鍏变韩缂撳瓨 + /// </summary> + public void Dispone() + { + this.DicDevices = null; + this.DicScenes.Clear(); + this.DicRooms.Clear(); + this.DicShardKeys.Clear(); + this.DicFloor.Clear(); + + //娓呯┖鏂囦欢澶� + string strDir = HdlFileNameResourse.DownLoadShardDirectory; + HdlFileLogic.Current.CreateDirectory(strDir, true); + + m_Current = null; } #endregion -- Gitblit v1.8.0