using Shared.Common; using System; using System.Collections.Generic; using System.Text; namespace Shared.Phone { /// /// 住宅对象的逻辑 /// public class HdlResidenceLogic { #region ■ 变量声明___________________________ /// /// 住宅对象的逻辑 /// private static HdlResidenceLogic m_Current = null; /// /// 住宅对象的逻辑 /// public static HdlResidenceLogic Current { get { if (m_Current == null) { m_Current = new HdlResidenceLogic(); } return m_Current; } } #endregion #region ■ 创建新住宅_________________________ /// /// 创建新的住宅(返回住宅id,null代表失败) /// /// 住宅名称 /// 自定义单元的标题名称(homeApp设置为null) /// 自定义单元的内容(homeApp设置为null) /// 1:无模板有设备 2:有模板有设备 3:无模板无设备 public string CreatNewResidence(string residenceName, List listUintName, List listUintContent, int TemplateMode = 1) { var pra = new { homeId = 0, homeName = residenceName, homeType = "ZIGBEE" }; //添加住宅 var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/app/home/add", RestSharp.Method.POST, pra); //检测状态码 if (HdlCheckLogic.Current.CheckNetCode(result, ShowNetCodeMode.YES) == false) { return null; } var newInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(result.Data.ToString()); if (listUintName != null) { //编辑住宅区域 var success = this.EditorResidenceArea(newInfo.Id, listUintName, listUintContent); if (success == false) { //编辑住宅区域失败 HdlMessageLogic.Current.ShowMassage(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.uEditorResidenceAreaFail)); } } //添加住宅到缓存 this.AddHouseToMemmory(newInfo.Id, residenceName, listUintName, listUintContent, TemplateMode); return newInfo.Id; } /// /// 添加住宅到缓存 /// /// 住宅id /// 住宅名称. /// 自定义单元的标题名称(homeApp设置为null) /// 自定义单元的内容(homeApp设置为null) /// 1:无模板有设备 2:有模板有设备 3:无模板无设备 /// 是否为其他主用户分享过来的住宅 /// 仅子账号登陆的时候使用,当【IsOthreShare】为"true",并且【AccountType】为"1"时,该账号拥有管理员权限 public void AddHouseToMemmory(string houseId, string houseName, List listUintName, List listUintContent, int TemplateMode = 1, bool isOthreShare = false, int accountType = 0) { var home = new Common.House(); home.Id = houseId; home.Name = houseName; home.IsOtherShare = isOthreShare; home.AccountType = accountType; if (listUintName != null) { home.ListUintName.AddRange(listUintName); home.ListUintContent.AddRange(listUintContent); } home.TemplateMode = TemplateMode; if (TemplateMode == 3) { //标记为虚拟住宅 home.IsVirtually = true; } //创建文件夹 Common.Global.CreateHomeDirectory(houseId); home.Save(); Common.Config.Instance.HomeFilePathList.Add(home.FileName); Common.Config.Instance.Save(); //如果当前没有住宅的话 if (Common.Config.Instance.Home.Id == string.Empty) { Common.Config.Instance.Home = this.GetHouseByFilePath(home.FileName); Common.Config.Instance.HomeId = home.Id; } } #endregion #region ■ 切换住宅___________________________ /// /// 切换住宅(注:它只切换内存,界面并未处理) /// /// /// public bool SwitchResidence(string residenceId) { //打开进度条 ProgressBar.Show(); Config.Instance.HomeId = residenceId; //重新初始化住宅对象 Config.Instance.Home = this.GetHouseByHouseId(residenceId); Config.Instance.Save(); //刷新个人中心的内存及线程 bool result = HdlUserCenterLogic.Current.InitUserCenterMenmoryAndThread(false); //关闭进度条 ProgressBar.Close(); return result; } #endregion #region ■ 编辑住宅___________________________ /// /// 编辑住宅 /// /// 住宅id /// 住宅名称 /// 自定义单元的标题名称(homeApp设置为null) /// 自定义单元的内容(homeApp设置为null) /// 1:无模板有设备 2:有模板有设备 3:无模板无设备 /// public bool EditorResidenceName(string residenceId, string residenceName, List listUintName, List listUintContent, int TemplateMode = 1) { var pra = new { homeId = Config.Instance.Home.Id, homeType = "ZIGBEE", homeName = residenceName }; var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/app/home/update", RestSharp.Method.POST, pra, null, null, CheckMode.A账号权限); //检测状态码 if (HdlCheckLogic.Current.CheckNetCode(result, ShowNetCodeMode.YES) == false) { return false; } if (listUintName != null) { //编辑住宅区域 var success = this.EditorResidenceArea(residenceId, listUintName, listUintContent); if (success == false) { //编辑住宅区域失败 HdlMessageLogic.Current.ShowMassage(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.uEditorResidenceAreaFail)); } } //刷新内存的住宅名 this.EditorHouseByHouseId(residenceId, residenceName, listUintName, listUintContent, TemplateMode); return true; } /// /// 编辑缓存住宅 /// /// 住宅id /// 住宅名称 /// 自定义单元的标题名称(homeApp设置为null) /// 自定义单元的内容(homeApp设置为null) /// 1:无模板有设备 2:有模板有设备 3:无模板无设备 public void EditorHouseByHouseId(string residenceId, string residenceName, List listUintName, List listUintContent, int TemplateMode = 1) { House home = Config.Instance.Home; if (Config.Instance.Home.Id != residenceId) { //从缓存中获取 home = GetHouseByHouseId(residenceId); } if (home == null) { return; } home.Name = residenceName; if (listUintName != null) { home.ListUintName.Clear(); home.ListUintName.AddRange(listUintName); home.ListUintContent.Clear(); home.ListUintContent.AddRange(listUintContent); } home.TemplateMode = TemplateMode; if (TemplateMode == 3) { //标记为虚拟住宅 home.IsVirtually = true; } home.Save(); //住宅修改名称的话,主页需要重新刷新 UserView.UserPage.Instance.RefreshAllForm = true; } /// /// 编辑住宅区域 /// /// 住宅id /// 自定义单元的标题名称 /// 自定义单元的内容 /// private bool EditorResidenceArea(string residenceId, List listUintName, List listUintContent) { //☆マーク☆ 住宅区域 return true; } #endregion #region ■ 编辑住宅经纬度_____________________ /// /// 编辑住宅经纬度 /// /// 纬度 /// 经度 /// 位置名称 /// 失败时是否显示tip消息 /// public bool EditorResidenceLongitudeAndLatitude(double i_latitude, double i_longitude, string i_addresName, ShowNetCodeMode mode = ShowNetCodeMode.YES) { //如果不是虚拟住宅,才更新云端 if (Config.Instance.Home.IsVirtually == true) { //保存缓存 Config.Instance.Home.Longitude = i_longitude; Config.Instance.Home.Latitude = i_latitude; Config.Instance.Home.ResidenceAddressName = i_addresName; Config.Instance.Home.Save(); return true; } var pra = new { homeId = Config.Instance.Home.Id, homeType = "ZIGBEE", latitude = i_latitude, longitude = i_longitude }; var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/app/home/update", RestSharp.Method.POST, pra, null, null, CheckMode.A账号权限); //检测状态码 if (HdlCheckLogic.Current.CheckNetCode(result, mode) == false) { return false; } //保存缓存 Config.Instance.Home.Longitude = i_longitude; Config.Instance.Home.Latitude = i_latitude; Config.Instance.Home.ResidenceAddressName = i_addresName; Config.Instance.Home.Save(); //设置全部网关的住宅地址 var listGateway = HdlGatewayLogic.Current.GetAllLocalGateway(); foreach (var gateway in listGateway) { //不判断是否失败 HdlGatewayLogic.Current.SetGatewaySite(gateway.GwId, i_longitude, i_latitude, ShowErrorMode.NO); } return true; } #endregion #region ■ 获取住宅___________________________ /// /// 通过【id】获取住宅 /// /// The house by house identifier. /// 住宅id public House GetHouseByHouseId(string houseId) { var path = System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, Config.Instance.Guid, houseId, $"House_{houseId}.json"); var file = HdlFileLogic.Current.ReadFileByteContent(path); if (file == null) { return null; } return Newtonsoft.Json.JsonConvert.DeserializeObject(System.Text.Encoding.UTF8.GetString(file)); } /// /// 通过【文件路径】获取住宅 /// /// The house by file path. /// 文件路径 public House GetHouseByFilePath(string filePath) { var path = System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, Config.Instance.Guid, GetHouseIdByFilePath(filePath), filePath); var file = HdlFileLogic.Current.ReadFileByteContent(path); if (file == null) { return null; } return Newtonsoft.Json.JsonConvert.DeserializeObject(System.Text.Encoding.UTF8.GetString(file)); } #endregion #region ■ 获取云端住宅列表___________________ /// /// 登陆的时候,获取云端住宅列表(0:当前没有网络的情况下加载本地住宅 1:通过联网加载及校验本地住宅) /// /// 失败时是否显示tip消息 /// public int GetHomeListsFromDbOnLogin(ShowNetCodeMode mode = ShowNetCodeMode.YES) { //获取云端住宅数据 var listHouseData = this.GetHomeListsFromDb(mode); if (listHouseData == null) { return 0; } //清空当前住宅列表 Config.Instance.HomeFilePathList.Clear(); var listHouse = new List(); foreach (var residence in listHouseData) { //刷新住宅对象的缓存 var house = this.RefreshResidenceMemory(residence); listHouse.Add(house); } //检测本地的住宅文件是否合法 var listLocal = this.GetAllLocalResidenceListByDirectory(); foreach (var myHouse in listLocal) { //如果本地存在不属于他的住宅文件,则删除 if (myHouse.HouseDataDiv == 1 && Config.Instance.HomeFilePathList.Contains(myHouse.FileName) == false) { string housePath = System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, Config.Instance.Guid, myHouse.Id); HdlFileLogic.Current.DeleteDirectory(housePath); } } //如果切换了账号,或者原来的id不存在,则重置住宅ID if (Config.Instance.TheSameLoginAccount == false || Config.Instance.HomeFilePathList.Find((obj) => obj == $"House_{Config.Instance.HomeId}.json") == null) { Config.Instance.HomeId = listHouse.Count > 0 ? listHouse[0].Id : string.Empty; foreach (var house in listHouse) { //初始选择它自己的住宅 if (house.IsOtherShare == false) { Config.Instance.HomeId = house.Id; Config.Instance.Home = GetHouseByHouseId(house.Id); break; } } } Config.Instance.Save(); return 1; } /// /// 获取云端住宅列表 /// /// 失败时是否显示tip消息 /// public List GetHomeListsFromDb(ShowNetCodeMode mode = ShowNetCodeMode.YES) { var pra = new { homeType = "ZIGBEE" }; var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/app/home/list", RestSharp.Method.POST, pra); //检测状态码 if (HdlCheckLogic.Current.CheckNetCode(result, mode) == false) { return null; } var listTemp = Newtonsoft.Json.JsonConvert.DeserializeObject>(result.Data.ToString()); var listData = new List(); foreach (var data in listTemp) { if (data.HomeType == "ZIGBEE") { listData.Add(data); } } return this.SortHouse(listData); } /// /// 刷新住宅对象的缓存 /// /// 云端返回的数据转换成的数据 public House RefreshResidenceMemory(ResidenceInformation i_residence) { string fileName = $"House_{i_residence.Id}.json"; if (Config.Instance.HomeFilePathList.Contains(fileName) == false) { Config.Instance.HomeFilePathList.Add(fileName); } var house = this.GetHouseByHouseId(i_residence.Id); if (house == null) { house = new House(); } house.Id = i_residence.Id; house.Name = i_residence.HomeName; house.IsOtherShare = i_residence.IsOtherShare; house.AccountType = i_residence.AccountType == "ADMIN" ? 1 : 0; house.Longitude = i_residence.Longitude; house.Latitude = i_residence.Latitude; house.IsRemoteControl = i_residence.IsRemoteControl; house.LastEditorTime = HdlCommonLogic.Current.ConvertUtcTimeToLocalTime2(i_residence.ModifyTime).ToString("yyyy/MM/dd HH:mm"); Global.CreateHomeDirectory(i_residence.Id); house.Save(false); return house; } /// /// 从云端,刷新住宅的区域(true:会刷新i_house的List变量, false:什么都不处理) /// /// 住宅ID public bool RefreshHomeAreaFromDb(string i_homeId) { var house = this.GetHouseByHouseId(i_homeId); if (house == null) { return false; } //var pra2 = new //{ // RequestVersion = CommonPage.RequestVersion, // RequestSource = 5, // LoginAccessToken = Common.Config.Instance.Token, // HomeId = i_house.Id //}; //var result = UserCenterLogic.GetResponseDataByRequestHttps("App/GetHomeDirectory", false, pra2, new List { "NotCheck" }); //if (result != null) //{ // var listData = Newtonsoft.Json.JsonConvert.DeserializeObject>(result); // //初始化 // i_house.ListUintContent = new List(); // i_house.ListUintName = new List(); // foreach (var data in listData) // { // i_house.ListUintName.Add(data.Tag); // i_house.ListUintContent.Add(data.Remark); // } // return true; //} return false; } #endregion #region ■ 获取本地住宅列表___________________ /// /// 获取本地住宅列表 /// /// public List GetLocalResidenceList() { //如果是虚拟住宅,则从根目录中获取 if (Common.Config.Instance.Home.IsVirtually == true) { //从文件夹中获取全部的住宅对象 return this.GetAllLocalResidenceListByDirectory(); } var listHome = new List(); foreach (var housePath in Common.Config.Instance.HomeFilePathList) { var home = this.GetHouseByFilePath(housePath); if (home == null) { continue; } listHome.Add(home); } return this.SortHouse(listHome); } /// /// 从文件夹中获取全部的住宅对象 /// /// 是否获取网关ID(存在listGatewayId里面) /// public List GetAllLocalResidenceListByDirectory(bool getGatewayId = false) { var strPath = System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, Common.Config.Instance.Guid); var listHome = new List(); //获取全部的文件夹 var listDirectory = new List(); var arryDirs = System.IO.Directory.GetDirectories(strPath); foreach (var file in arryDirs) { string[] arry = file.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries); listDirectory.Add(arry[arry.Length - 1]); } foreach (var myDir in listDirectory) { //获取各个文件夹里面的住宅文件 string nowPath = System.IO.Path.Combine(strPath, myDir); var arryHouse = System.IO.Directory.GetFiles(nowPath, "House_*"); if (arryHouse.Length > 0) { //读取文件内容 var textValue = HdlFileLogic.Current.ReadFileTextContent(System.IO.Path.Combine(nowPath, arryHouse[0])); if (textValue == null) { continue; } var myHouse = Newtonsoft.Json.JsonConvert.DeserializeObject(textValue); listHome.Add(myHouse); //如果读取网关id的话 if (getGatewayId == true) { //标识初始化完成 myHouse.listGatewayId = new List(); //获取网关文件 var arryGateway = System.IO.Directory.GetFiles(nowPath, "Gateway_*"); foreach (var myFile in arryGateway) { string[] Arry = myFile.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); if (Arry.Length >= 3) { //获取其网关id myHouse.listGatewayId.Add(Arry[2]); } } } } } return this.SortHouse(listHome); } /// /// 从文件夹中获取全部备份住宅对象 /// /// public List GetAllLocalBackupResidenceListByDirectory() { var strPath = System.IO.Path.Combine(IO.FileUtils.RootPath, Config.Instance.Guid); var listHome = new List(); //获取全部的文件夹 var listDirectory = new List(); var arryDirs = System.IO.Directory.GetDirectories(strPath); foreach (var file in arryDirs) { string[] arry = file.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries); listDirectory.Add(arry[arry.Length - 1]); } foreach (var myDir in listDirectory) { if (myDir.StartsWith("BackupResidenceData") == false && myDir.StartsWith("DownLoadResidenceData") == false) { //只要手动备份和云端下载的 continue; } //获取各个文件夹里面的住宅文件 string nowPath = System.IO.Path.Combine(strPath, myDir); var arryHouse = System.IO.Directory.GetFiles(nowPath, "House_*"); if (arryHouse.Length > 0) { //读取文件内容 var textValue = HdlFileLogic.Current.ReadFileTextContent(System.IO.Path.Combine(nowPath, arryHouse[0])); if (textValue == null) { continue; } var myHouse = Newtonsoft.Json.JsonConvert.DeserializeObject(textValue); if (myHouse.Id != Config.Instance.Home.Id) { //不是这个住宅的备份 continue; } if (myDir.StartsWith("BackupResidenceData") == true) { //此住宅数据是临时备份数据 myHouse.HouseDataDiv = 2; myHouse.SaveDirctoryName = myDir; } else if (myDir.StartsWith("DownLoadResidenceData") == true) { //此住宅数据是从云端下载的备份数据 myHouse.HouseDataDiv = 3; myHouse.SaveDirctoryName = myDir; } listHome.Add(myHouse); } } return listHome; } #endregion #region ■ 住宅排序___________________________ /// /// 住宅排序 /// /// /// public List SortHouse(List i_listHouse) { //从一堆文字中,获取这一堆文字里面数字字符串的最长长度 var listName = new List(); foreach (var house in i_listHouse) { listName.Add(house.Name); } int numberLength = HdlCommonLogic.Current.GetNumberMaxLength(listName); var listSort = new List(); var dicHouse = new Dictionary(); foreach (var house in i_listHouse) { //临时缓存 dicHouse[house.Id] = house; var strArry = new string[2]; strArry[0] = house.Id; strArry[1] = string.Empty; string value = string.Empty; foreach (var c in house.Name) { if (char.IsNumber(c) == true) { //数字 value += c.ToString(); continue; } else if (value != string.Empty) { //如果房间名字带有数字的话,则左边加零,因为这里有个排序的问题 strArry[1] += value.PadLeft(numberLength, '0'); value = string.Empty; } strArry[1] += c.ToString(); } if (value != string.Empty) { //以数字结尾的话 strArry[1] += value.PadLeft(numberLength, '0'); } listSort.Add(strArry); } //排序 listSort.Sort((obj1, obj2) => { if (obj1[1].CompareTo(obj2[1]) > 0) { return 1; } return -1; }); var listSortHouse = new List(); foreach (var strArry in listSort) { listSortHouse.Add(dicHouse[strArry[0]]); } return listSortHouse; } /// /// 云端住宅排序 /// /// /// public List SortHouse(List i_listData) { //从一堆文字中,获取这一堆文字里面数字字符串的最长长度 var listName = new List(); foreach (var house in i_listData) { listName.Add(house.HomeName); } int numberLength = HdlCommonLogic.Current.GetNumberMaxLength(listName); var listSort = new List(); var dicHouse = new Dictionary(); foreach (var house in i_listData) { //临时缓存 dicHouse[house.Id] = house; var strArry = new string[2]; strArry[0] = house.Id; strArry[1] = string.Empty; string value = string.Empty; foreach (var c in house.HomeName) { if (char.IsNumber(c) == true) { //数字 value += c.ToString(); continue; } else if (value != string.Empty) { //如果房间名字带有数字的话,则左边加零,因为这里有个排序的问题 strArry[1] += value.PadLeft(numberLength, '0'); value = string.Empty; } strArry[1] += c.ToString(); } if (value != string.Empty) { //以数字结尾的话 strArry[1] += value.PadLeft(numberLength, '0'); } listSort.Add(strArry); } //排序 listSort.Sort((obj1, obj2) => { if (obj1[1].CompareTo(obj2[1]) > 0) { return 1; } return -1; }); var listSortHouse = new List(); foreach (var strArry in listSort) { listSortHouse.Add(dicHouse[strArry[0]]); } return listSortHouse; } #endregion #region ■ 删除住宅___________________________ /// /// 删除云端住宅 /// /// 删除指定住宅 /// public bool DeleteCloundHouse(string houseId) { var pra = new { homeId = houseId }; var result = HdlHttpLogic.Current.RequestResponseFromZigbeeHttps("home-wisdom/app/home/delete", RestSharp.Method.POST, pra); //检测状态码 if (HdlCheckLogic.Current.CheckNetCode(result, ShowNetCodeMode.YES) == false) { return false; } return true; } /// /// 删除住宅 /// /// File path. public void DeleteHouseMemmory(string houseId) { string filePath = this.GetHouseFilePathByHouseId(houseId); var delPath = System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, Config.Instance.Guid, GetHouseIdByFilePath(filePath)); if (System.IO.Directory.Exists(delPath) == false) { return; } var fileList = GetHouseFileListByHomeId(houseId); foreach (var file in fileList) { //删除文件 System.IO.File.Delete(System.IO.Path.Combine(delPath, file)); } //删除文件夹 System.IO.Directory.Delete(delPath, true); //HomeFilePathList中删除该列表 Common.Config.Instance.HomeFilePathList.RemoveAll((obj) => obj == filePath); Config.Instance.Save(); } #endregion #region ■ 获取该住宅的文件列表_______________ /// /// 通过【houseId】获取该住宅的文件列表 /// /// The house file list by home identifier. /// House identifier. public List GetHouseFileListByHomeId(string houseId) { var list = new List { }; var path = System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, Config.Instance.Guid, houseId); if (!System.IO.Directory.Exists(path)) { return new List { }; } var files = System.IO.Directory.GetFiles(path); foreach (var file in files) { var f = file.Substring(path.Length + 1); System.Console.WriteLine(f); list.Add(f); } return list; } #endregion #region ■ 一般方法___________________________ /// /// 获取楼层名称 /// /// 楼层ID /// public string GetFloorNameById(string i_FloorId) { if (i_FloorId == null) { return string.Empty; } if (Config.Instance.Home.FloorDics.ContainsKey(i_FloorId) == false) { return string.Empty; } return Config.Instance.Home.FloorDics[i_FloorId]; } /// /// 通过【文件路径】获取住宅id /// /// The house identifier by file path. /// 文件路径 public string GetHouseIdByFilePath(string filePath) { string[] sArray = filePath.Split(new string[] { "House_", ".json" }, StringSplitOptions.RemoveEmptyEntries); if (sArray.Length >= 1) { return sArray[0]; } return null; } /// /// 通过【住宅id】获取住宅路径 /// /// The house identifier by file path. /// 住宅id public string GetHouseFilePathByHouseId(string houseId) { return $"House_{houseId}.json"; } /// /// 获取住宅的区域文本 /// /// /// public string GetResidenceAreaText(House i_house) { return this.GetResidenceAreaText(i_house.ListUintName, i_house.ListUintContent); } /// /// 获取住宅的区域文本 /// /// 单元标题 /// 单元内容 /// public string GetResidenceAreaText(List i_ListUintName, List i_ListUintContent) { string textArea = string.Empty; for (int i = 0; i < i_ListUintName.Count; i++) { textArea += i_ListUintContent[i] + i_ListUintName[i] + "_"; } return textArea.TrimEnd('_'); } #endregion } }