黄学彪
2020-12-17 9f326f4000847e6167d8166fa2f6a66f53cb3734
ZigbeeApp/Shared/Phone/Common/Logic/HdlResidenceLogic.cs
New file
@@ -0,0 +1,908 @@
using Shared.Common;
using System;
using System.Collections.Generic;
using System.Text;
namespace Shared.Phone
{
    /// <summary>
    /// 住宅对象的逻辑
    /// </summary>
    public class HdlResidenceLogic
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 住宅对象的逻辑
        /// </summary>
        private static HdlResidenceLogic m_Current = null;
        /// <summary>
        /// 住宅对象的逻辑
        /// </summary>
        public static HdlResidenceLogic Current
        {
            get
            {
                if (m_Current == null)
                {
                    m_Current = new HdlResidenceLogic();
                }
                return m_Current;
            }
        }
        #endregion
        #region ■ 创建新住宅_________________________
        /// <summary>
        /// 创建新的住宅(返回住宅id,null代表失败)
        /// </summary>
        /// <param name="residenceName">住宅名称</param>
        /// <param name="listUintName">自定义单元的标题名称(homeApp设置为null)</param>
        /// <param name="listUintContent">自定义单元的内容(homeApp设置为null)</param>
        /// <param name="TemplateMode">1:无模板有设备  2:有模板有设备  3:无模板无设备</param>
        public string CreatNewResidence(string residenceName, List<string> listUintName,
            List<string> 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<IdInfoClass>(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;
        }
        /// <summary>
        /// 添加住宅到缓存
        /// </summary>
        /// <param name="houseId">住宅id</param>
        /// <param name="houseName">住宅名称.</param>
        /// <param name="listUintName">自定义单元的标题名称(homeApp设置为null)</param>
        /// <param name="listUintContent">自定义单元的内容(homeApp设置为null)</param>
        /// <param name="TemplateMode">1:无模板有设备  2:有模板有设备  3:无模板无设备</param>
        /// <param name="isOthreShare">是否为其他主用户分享过来的住宅</param>
        /// <param name="accountType">仅子账号登陆的时候使用,当【IsOthreShare】为"true",并且【AccountType】为"1"时,该账号拥有管理员权限</param>
        public void AddHouseToMemmory(string houseId, string houseName,
            List<string> listUintName, List<string> 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 ■ 切换住宅___________________________
        /// <summary>
        /// 切换住宅(注:它只切换内存,界面并未处理)
        /// </summary>
        /// <param name="residenceId"></param>
        /// <returns></returns>
        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 ■ 编辑住宅___________________________
        /// <summary>
        /// 编辑住宅
        /// </summary>
        /// <param name="residenceId">住宅id</param>
        /// <param name="residenceName">住宅名称</param>
        /// <param name="listUintName">自定义单元的标题名称(homeApp设置为null)</param>
        /// <param name="listUintContent">自定义单元的内容(homeApp设置为null)</param>
        /// <param name="TemplateMode">1:无模板有设备  2:有模板有设备  3:无模板无设备</param>
        /// <returns></returns>
        public bool EditorResidenceName(string residenceId, string residenceName,
            List<string> listUintName, List<string> 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;
        }
        /// <summary>
        /// 编辑缓存住宅
        /// </summary>
        /// <param name="residenceId">住宅id</param>
        /// <param name="residenceName">住宅名称</param>
        /// <param name="listUintName">自定义单元的标题名称(homeApp设置为null)</param>
        /// <param name="listUintContent">自定义单元的内容(homeApp设置为null)</param>
        /// <param name="TemplateMode">1:无模板有设备  2:有模板有设备  3:无模板无设备</param>
        public void EditorHouseByHouseId(string residenceId, string residenceName,
            List<string> listUintName, List<string> 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;
        }
        /// <summary>
        /// 编辑住宅区域
        /// </summary>
        /// <param name="residenceId">住宅id</param>
        /// <param name="listUintName">自定义单元的标题名称</param>
        /// <param name="listUintContent">自定义单元的内容</param>
        /// <returns></returns>
        private bool EditorResidenceArea(string residenceId, List<string> listUintName, List<string> listUintContent)
        {
            //☆マーク☆ 住宅区域
            return true;
        }
        #endregion
        #region ■ 编辑住宅经纬度_____________________
        /// <summary>
        /// 编辑住宅经纬度
        /// </summary>
        /// <param name="i_latitude">纬度</param>
        /// <param name="i_longitude">经度</param>
        /// <param name="i_addresName">位置名称</param>
        /// <param name="mode">失败时是否显示tip消息</param>
        /// <returns></returns>
        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 ■ 获取住宅___________________________
        /// <summary>
        /// 通过【id】获取住宅
        /// </summary>
        /// <returns>The house by house identifier.</returns>
        /// <param name="houseId">住宅id</param>
        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<House>(System.Text.Encoding.UTF8.GetString(file));
        }
        /// <summary>
        /// 通过【文件路径】获取住宅
        /// </summary>
        /// <returns>The house by file path.</returns>
        /// <param name="filePath">文件路径</param>
        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<House>(System.Text.Encoding.UTF8.GetString(file));
        }
        #endregion
        #region ■ 获取云端住宅列表___________________
        /// <summary>
        /// 登陆的时候,获取云端住宅列表(0:当前没有网络的情况下加载本地住宅  1:通过联网加载及校验本地住宅)
        /// </summary>
        /// <param name="mode">失败时是否显示tip消息</param>
        /// <returns></returns>
        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<House>();
            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;
        }
        /// <summary>
        /// 获取云端住宅列表
        /// </summary>
        /// <param name="mode">失败时是否显示tip消息</param>
        /// <returns></returns>
        public List<ResidenceInformation> 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<List<ResidenceInformation>>(result.Data.ToString());
            var listData = new List<ResidenceInformation>();
            foreach (var data in listTemp)
            {
                if (data.HomeType == "ZIGBEE")
                {
                    listData.Add(data);
                }
            }
            return this.SortHouse(listData);
        }
        /// <summary>
        /// 刷新住宅对象的缓存
        /// </summary>
        /// <param name="i_residence">云端返回的数据转换成的数据</param>
        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;
        }
        /// <summary>
        /// 从云端,刷新住宅的区域(true:会刷新i_house的List变量, false:什么都不处理)
        /// </summary>
        /// <param name="i_homeId">住宅ID</param>
        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<string> { "NotCheck" });
            //if (result != null)
            //{
            //    var listData = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ResidenceAreaInfo>>(result);
            //    //初始化
            //    i_house.ListUintContent = new List<string>();
            //    i_house.ListUintName = new List<string>();
            //    foreach (var data in listData)
            //    {
            //        i_house.ListUintName.Add(data.Tag);
            //        i_house.ListUintContent.Add(data.Remark);
            //    }
            //    return true;
            //}
            return false;
        }
        #endregion
        #region ■ 获取本地住宅列表___________________
        /// <summary>
        /// 获取本地住宅列表
        /// </summary>
        /// <returns></returns>
        public List<Common.House> GetLocalResidenceList()
        {
            //如果是虚拟住宅,则从根目录中获取
            if (Common.Config.Instance.Home.IsVirtually == true)
            {
                //从文件夹中获取全部的住宅对象
                return this.GetAllLocalResidenceListByDirectory();
            }
            var listHome = new List<Common.House>();
            foreach (var housePath in Common.Config.Instance.HomeFilePathList)
            {
                var home = this.GetHouseByFilePath(housePath);
                if (home == null)
                {
                    continue;
                }
                listHome.Add(home);
            }
            return this.SortHouse(listHome);
        }
        /// <summary>
        /// 从文件夹中获取全部的住宅对象
        /// </summary>
        /// <param name="getGatewayId">是否获取网关ID(存在listGatewayId里面)</param>
        /// <returns></returns>
        public List<House> GetAllLocalResidenceListByDirectory(bool getGatewayId = false)
        {
            var strPath = System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, Common.Config.Instance.Guid);
            var listHome = new List<Common.House>();
            //获取全部的文件夹
            var listDirectory = new List<string>();
            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<Common.House>(textValue);
                    listHome.Add(myHouse);
                    //如果读取网关id的话
                    if (getGatewayId == true)
                    {
                        //标识初始化完成
                        myHouse.listGatewayId = new List<string>();
                        //获取网关文件
                        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);
        }
        /// <summary>
        /// 从文件夹中获取全部备份住宅对象
        /// </summary>
        /// <returns></returns>
        public List<House> GetAllLocalBackupResidenceListByDirectory()
        {
            var strPath = System.IO.Path.Combine(IO.FileUtils.RootPath, Config.Instance.Guid);
            var listHome = new List<House>();
            //获取全部的文件夹
            var listDirectory = new List<string>();
            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<House>(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 ■ 住宅排序___________________________
        /// <summary>
        /// 住宅排序
        /// </summary>
        /// <param name="i_listHouse"></param>
        /// <returns></returns>
        public List<House> SortHouse(List<House> i_listHouse)
        {
            //从一堆文字中,获取这一堆文字里面数字字符串的最长长度
            var listName = new List<string>();
            foreach (var house in i_listHouse)
            {
                listName.Add(house.Name);
            }
            int numberLength = HdlCommonLogic.Current.GetNumberMaxLength(listName);
            var listSort = new List<string[]>();
            var dicHouse = new Dictionary<string, House>();
            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<House>();
            foreach (var strArry in listSort)
            {
                listSortHouse.Add(dicHouse[strArry[0]]);
            }
            return listSortHouse;
        }
        /// <summary>
        /// 云端住宅排序
        /// </summary>
        /// <param name="i_listData"></param>
        /// <returns></returns>
        public List<ResidenceInformation> SortHouse(List<ResidenceInformation> i_listData)
        {
            //从一堆文字中,获取这一堆文字里面数字字符串的最长长度
            var listName = new List<string>();
            foreach (var house in i_listData)
            {
                listName.Add(house.HomeName);
            }
            int numberLength = HdlCommonLogic.Current.GetNumberMaxLength(listName);
            var listSort = new List<string[]>();
            var dicHouse = new Dictionary<string, ResidenceInformation>();
            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<ResidenceInformation>();
            foreach (var strArry in listSort)
            {
                listSortHouse.Add(dicHouse[strArry[0]]);
            }
            return listSortHouse;
        }
        #endregion
        #region ■ 删除住宅___________________________
        /// <summary>
        /// 删除云端住宅
        /// </summary>
        /// <param name="houseId">删除指定住宅</param>
        /// <returns></returns>
        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;
        }
        /// <summary>
        /// 删除住宅
        /// </summary>
        /// <param name="filePath">File path.</param>
        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 ■ 获取该住宅的文件列表_______________
        /// <summary>
        /// 通过【houseId】获取该住宅的文件列表
        /// </summary>
        /// <returns>The house file list by home identifier.</returns>
        /// <param name="houseId">House identifier.</param>
        public List<string> GetHouseFileListByHomeId(string houseId)
        {
            var list = new List<string> { };
            var path = System.IO.Path.Combine(Shared.IO.FileUtils.RootPath, Config.Instance.Guid, houseId);
            if (!System.IO.Directory.Exists(path))
            {
                return new List<string> { };
            }
            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 ■ 一般方法___________________________
        /// <summary>
        /// 获取楼层名称
        /// </summary>
        /// <param name="i_FloorId">楼层ID</param>
        /// <returns></returns>
        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];
        }
        /// <summary>
        /// 通过【文件路径】获取住宅id
        /// </summary>
        /// <returns>The house identifier by file path.</returns>
        /// <param name="filePath">文件路径</param>
        public string GetHouseIdByFilePath(string filePath)
        {
            string[] sArray = filePath.Split(new string[] { "House_", ".json" }, StringSplitOptions.RemoveEmptyEntries);
            if (sArray.Length >= 1)
            {
                return sArray[0];
            }
            return null;
        }
        /// <summary>
        /// 通过【住宅id】获取住宅路径
        /// </summary>
        /// <returns>The house identifier by file path.</returns>
        /// <param name="houseId">住宅id</param>
        public string GetHouseFilePathByHouseId(string houseId)
        {
            return $"House_{houseId}.json";
        }
        /// <summary>
        /// 获取住宅的区域文本
        /// </summary>
        /// <param name="i_house"></param>
        /// <returns></returns>
        public string GetResidenceAreaText(House i_house)
        {
            return this.GetResidenceAreaText(i_house.ListUintName, i_house.ListUintContent);
        }
        /// <summary>
        /// 获取住宅的区域文本
        /// </summary>
        /// <param name="i_ListUintName">单元标题</param>
        /// <param name="i_ListUintContent">单元内容</param>
        /// <returns></returns>
        public string GetResidenceAreaText(List<string> i_ListUintName, List<string> 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
    }
}