HDL Home App 第二版本 旧平台金堂用 正在使用
ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonInfo.cs
old mode 100755 new mode 100644
@@ -7,836 +7,1285 @@
namespace Shared.Phone.UserCenter.DoorLock
{
    public class DoorLockCommonInfo : CommonDevice
  public class DoorLockCommonInfo : CommonDevice
  {
    #region  本地变量
    /// <summary>
    /// 更新“逻辑常开”界面的回调
    /// </summary>
    public static Action<bool> LogicAction = null;
    /// <summary>
    /// 更新当前门锁涉及的状态【主要用于门锁操作常开模式的回调】
    /// </summary>
    public static Action<string, bool> UpdateCurrentDoorlockAction = null;
    /// <summary>
    /// 网关(门锁)所在的时间
    /// </summary>
    public static DateTime DoorlockZoneTime = DateTime.Now;
    /// <summary>
    /// 所有门锁中的常开模式值[用于推送查询,提示门锁失效)
    /// keys:门锁mac+epoint value:是否常开模式
    /// ture:常开; false:关闭
    /// </summary>
    public static Dictionary<string, bool?> DoorLockNormallyMode = new Dictionary<string, bool?> { };
    /// <summary>
    /// 常开模式执行时间
    /// </summary>
    public static int NormallyOpenModeInvalidTime = 12;
    /// <summary>
    /// 是否支持修改
    /// </summary>
    public static bool IsModify = false;
    /// <summary>
    /// 是否显示临时密码
    /// </summary>
    public static bool InTempPasswordVisiable = false;
    /// <summary>
    /// 有效日期“年”
    /// </summary>
    public static int ValidDateYear = 0;
    /// <summary>
    /// 有效日期“月”
    /// </summary>
    public static int ValidDateMonth = 0;
    /// <summary>
    /// 有效日期“日”
    /// </summary>
    public static int ValidDateDay = 0;
    /// <summary>
    /// 有效日期“时”
    /// </summary>
    public static int ValidDateHour = 100;
    /// <summary>
    /// 有效日期“分”
    /// </summary>
    public static int ValidDateMinute = 100;
    /// <summary>
    /// 有效日期“秒”
    /// </summary>
    public static int ValidDateSecond = 0;
    /// <summary>
    /// 失效效日期“年”
    /// </summary>
    public static int InValidDateYear = 0;
    /// <summary>
    /// 失效效日期“月”
    /// </summary>
    public static int InValidDateMonth = 0;
    /// <summary>
    /// 失效效日期“日”
    /// </summary>
    public static int InValidDateDay = 0;
    /// <summary>
    /// 失效效日期“时”
    /// </summary>
    public static int InValidDateHour = 100;
    /// <summary>
    /// 失效效日期“分”
    /// </summary>
    public static int InValidDateMinute = 100;
    /// <summary>
    /// 失效效日期“秒”
    /// </summary>
    public static int InValidDateSecond = 0;
    /// <summary>
    /// 门锁操作类型
    /// </summary>
    public enum DoorLockMessType
    {
        #region  本地变量
        /// <summary>
        /// 是否常开模式[当数据获取失败,返回空]
        /// </summary>
        public static bool? IsDoorLockNormallyMode = new bool?();
        /// <summary>
        /// 常开模式时间
        /// </summary>
        public static int NormallyOpenModeInvalidTime = 12;
        /// <summary>
        /// 是否支持修改
        /// </summary>
        public static bool IsModify = false;
        /// <summary>
        /// 是否显示临时密码
        /// </summary>
        public static bool InTempPasswordVisiable = false;
        /// <summary>
        /// 有效日期“年”
        /// </summary>
        public static int ValidDateYear = 0;
        /// <summary>
        /// 有效日期“月”
        /// </summary>
        public static int ValidDateMonth = 0;
        /// <summary>
        /// 有效日期“日”
        /// </summary>
        public static int ValidDateDay = 0;
        /// <summary>
        /// 有效日期“时”
        /// </summary>
        public static int ValidDateHour = 100;
        /// <summary>
        /// 有效日期“分”
        /// </summary>
        public static int ValidDateMinute = 100;
        /// <summary>
        /// 有效日期“秒”
        /// </summary>
        public static int ValidDateSecond = 0;
        /// <summary>
        /// 失效效日期“年”
        /// </summary>
        public static int InValidDateYear = 0;
        /// <summary>
        /// 失效效日期“月”
        /// </summary>
        public static int InValidDateMonth = 0;
        /// <summary>
        /// 失效效日期“日”
        /// </summary>
        public static int InValidDateDay = 0;
        /// <summary>
        /// 失效效日期“时”
        /// </summary>
        public static int InValidDateHour = 100;
        /// <summary>
        /// 失效效日期“分”
        /// </summary>
        public static int InValidDateMinute = 100;
        /// <summary>
        /// 失效效日期“秒”
        /// </summary>
        public static int InValidDateSecond = 0;
        #endregion
        /// <summary>
        /// 获取当前门锁的常开模式
        /// </summary>
        /// <param name="doorLock:当前门锁"></param>
        /// <returns></returns>
        public static async System.Threading.Tasks.Task<bool?> GetNormallyOpenMode(ZigBee.Device.DoorLock doorLock)
        {
            var result = await doorLock.ReadNormallyOpenModeFuncAsync();
            //共通错误检测
            string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
            if (result == null || result.errorMessageBase != null || result.errorResponData != null)
            {
                IsDoorLockNormallyMode = null;
            }
            if (result.command == "10")
            {
                IsDoorLockNormallyMode = true;
            }
            if (result.command == "11")
            {
                IsDoorLockNormallyMode = false;
            }
            return IsDoorLockNormallyMode;
        }
        /// <summary>
        /// 门锁是否支持常开[这里暂时只有S-One门锁支持,H06C不支持, 后期通过能力值支持]
        /// </summary>
        /// <param name="doorLock:当前门锁"></param>
        /// <returns></returns>
        public static bool CanNormallyOpen(ZigBee.Device.DoorLock doorLock)
        {
            var listDevice = new List<CommonDevice> { };
            listDevice.Add(doorLock);
            var devTemp = Common.LocalDevice.Current.GetMyDeviceEnumInfo(listDevice);
            if (devTemp.ConcreteType == DeviceConcreteType.IntelligentLocks_Sone)
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 门锁是否支持音量[这里暂时只有S-One门锁支持,H06C不支持,后期通过能力值支持]
        /// </summary>
        /// <param name="doorLock:当前门锁"></param>
        /// <returns></returns>
        public static bool CanVolume(ZigBee.Device.DoorLock doorLock)
        {
            var listDevice = new List<CommonDevice> { };
            listDevice.Add(doorLock);
            var devTemp = Common.LocalDevice.Current.GetMyDeviceEnumInfo(listDevice);
            if (devTemp.ConcreteType == DeviceConcreteType.IntelligentLocks_Sone)
            {
                return true;
            }
            return false;
        }
        #region 从云端获取的方法
        /// <summary>
        /// 获取当前账户门锁操作权限(是否被冻结)
        /// </summary>
        /// <param name="doorLock:当前门锁"></param>
        /// <param name="subAccountDistributedMark:登录账户的GUID"></param>
        /// <returns></returns>
        public static async System.Threading.Tasks.Task<bool> GetDoorLockOperateAccess(ZigBee.Device.DoorLock doorLock, string subAccountDistributedMark)
        {
            return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<bool>>)(async () =>
            {
                if (doorLock.IsFreezeAccount.ContainsKey(subAccountDistributedMark) == false)
                {
                    doorLock.IsFreezeAccount.Add(subAccountDistributedMark, false);
                }
                var resultList = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetAccountDoorLockUserList(doorLock, subAccountDistributedMark);
                var d = resultList.Find((obj) => { return obj.IsFreezeUser == true; });
                if (d != null)
                {
                    doorLock.IsFreezeAccount[subAccountDistributedMark] = true;
                }
                else
                {
                    doorLock.IsFreezeAccount[subAccountDistributedMark] = false;
                }
                return doorLock.IsFreezeAccount[subAccountDistributedMark];
            }));
        }
        /// <summary>
        /// 获取当前账户门锁远程开锁权限(是否被拥有远程开锁权限)
        /// </summary>
        /// <param name="doorLock:当前门锁"></param>
        /// <param name="subAccountDistributedMark:登录账户的GUID"></param>
        /// <returns></returns>
        public static async System.Threading.Tasks.Task<bool> GetDoorLockUnlockAccess(ZigBee.Device.DoorLock doorLock, string subAccountDistributedMark)
        {
            return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<bool>>)(async () =>
            {
                if (doorLock.HasRemoteUnlockAccess.ContainsKey(subAccountDistributedMark) == false)
                {
                    doorLock.HasRemoteUnlockAccess.Add(subAccountDistributedMark, false);
                }
                var resultList = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetAccountDoorLockUserList(doorLock, subAccountDistributedMark);
                var d = resultList.Find((obj) => { return obj.IsTempUnlockAuthority == true; });
                if (d != null)
                {
                    doorLock.HasRemoteUnlockAccess[subAccountDistributedMark] = true;
                }
                else
                {
                    doorLock.HasRemoteUnlockAccess[subAccountDistributedMark] = false;
                }
                return doorLock.HasRemoteUnlockAccess[subAccountDistributedMark];
            }));
        }
        /// <summary>
        ///  获取当前账户列表(门锁只对主人和拥有管理员权限对成员用)
        /// </summary>
        public static async System.Threading.Tasks.Task<List<Shared.Phone.UserCenter.MemberInfoRes>> LocalAccountList()
        {
            return await System.Threading.Tasks.Task.Run(async () =>
            {
                List<Shared.Phone.UserCenter.MemberInfoRes> localAccountList = new List<Shared.Phone.UserCenter.MemberInfoRes> { };
                List<Shared.Phone.UserCenter.MemberInfoRes> SubAccounList = new List<Shared.Phone.UserCenter.MemberInfoRes> { };
                //只有主人才有权限获取自己的子账户
                if (UserCenterResourse.UserInfo.AuthorityNo == 1)
                {
                    var SubAccounListTemp = await ZigBee.Device.DoorLock.GetSubAccountByDistributedMark();
                    var SubAccounListDictionary = new Dictionary<string, Shared.Phone.UserCenter.MemberInfoRes> { };
                    foreach (var member in SubAccounListTemp)
                    {
                        //判断一个账户绑定了邮箱的情况
                        if (SubAccounListDictionary.ContainsKey(member.DistributedMark) == true
                        || member.Account == UserCenterResourse.UserInfo.Phone
                        || member.Account == UserCenterResourse.UserInfo.Email)
                        {
                            //如果是它自己的话,不显示,账户和绑定的邮箱只显示其中之一
                            continue;
                        }
                        //去掉子账户中普通成员,留下拥有管理员权限的成员
                        //(因为分配账户给普通成员,普通成员在app中不能进入设备管理那里,所以没发查看主人分配对账户)
                        if (member.AccountType != 1)
                        {
                            continue;
                        }
                        SubAccounListDictionary.Add(member.DistributedMark, member);
                    }
                    foreach (var addMemberID in SubAccounListDictionary.Keys)
                    {
                        SubAccounList.Add(SubAccounListDictionary[addMemberID]);
                    }
                }
                // 注意:SubAccountDistributedMark这个值很有用,“添加门锁”到云端信息中,CloudAccountId如果是子账户,则是SubAccountDistributedMark这个值很有用,如果是管理员或者主人则是登录到G
                var masterAccount = new Shared.Phone.UserCenter.MemberInfoRes();
                masterAccount.Account = Shared.Common.Config.Instance.Account;
                masterAccount.AccountType = Shared.Common.Config.Instance.AccountType;
                masterAccount.SubAccountDistributedMark = Shared.Common.Config.Instance.Guid;
                masterAccount.UserName = UserCenterResourse.UserInfo.UserName;
                localAccountList.Add(masterAccount);
                localAccountList.AddRange(SubAccounList);
                return localAccountList;
            });
        }
        /// <summary>
        ///  获取所有账户和门锁包含的信息
        /// </summary>
        public static async System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>> GetDoorLockAllAcountUserlist(ZigBee.Device.DoorLock doorLock)
        {
            return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>>>)(async () =>
            {
                //1、读取门锁信息
                var getDoorLockInfo = await doorLock.GetDoorlockUserInfoAsync();
                //本地门锁列表处理
                foreach (var curAccountObj in doorLock.localAllAccountList)
                {
                    if (getDoorLockInfo == null)
                    {
                        doorLock.IsFailedToGetDoorLockInfo[curAccountObj.SubAccountDistributedMark] = true;
                    }
                    else
                    {
                        doorLock.IsFailedToGetDoorLockInfo[curAccountObj.SubAccountDistributedMark] = false;
                    }
                }
                // 用户信息处理
                if (getDoorLockInfo != null && getDoorLockInfo.doorLockUserDetailData != null)
                {
                    doorLock.localDoorLockUserList.Clear();
                    var dataList = getDoorLockInfo.doorLockUserDetailData.UserObjList;
                    foreach (var doorData in dataList)
                    {
                        var localDoorLockObj1 = new ZigBee.Device.DoorLock.LocaDoorLockObj()
                        {
                            UserID = doorData.UserId,
                            UnlockType = doorData.UserType
                        };
                        if ((doorLock.localDoorLockUserList.ContainsKey(localDoorLockObj1.UserID)) == false)
                        {
                            doorLock.localDoorLockUserList.Add(localDoorLockObj1.UserID, localDoorLockObj1);
                        }
                    }
                    //2、读取云端门锁信息
                    var getDoorLockInfoAllList = new List<ZigBee.Device.DoorLock.CloudDoorLockObj> { };
                    var getDoorLockInfoList = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetDoorLockAllAccountInfolist(doorLock);
                    if (getDoorLockInfoList != null)
                    {
                        if (getDoorLockInfoList.PageData.Count != 0)
                        {
                            getDoorLockInfoAllList = getDoorLockInfoList.PageData;
                        }
                    }
                    if (getDoorLockInfoList.TotalPages > 1)
                    {
                        for (int j = 1; j < getDoorLockInfoList.TotalPages; j++)
                        {
                            var getDoorLockInfoListTemp = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetDoorLockAllAccountInfolist(doorLock, j + 1);
                            if (getDoorLockInfoListTemp != null)
                            {
                                if (getDoorLockInfoListTemp.PageData.Count != 0)
                                {
                                    foreach (var curDoorLockUser in getDoorLockInfoListTemp.PageData)
                                    {
                                        getDoorLockInfoAllList.Add(curDoorLockUser);
                                    }
                                }
                            }
                        }
                    }
                    if (getDoorLockInfoAllList.Count != 0)
                    {
                        foreach (var curDoorLockUser in getDoorLockInfoAllList)
                        {
                            if (string.IsNullOrEmpty(curDoorLockUser.DoorLockLocalUserId))
                            {
                                continue;
                            }
                            if (doorLock.localDoorLockUserList.ContainsKey(int.Parse(curDoorLockUser.DoorLockLocalUserId)))
                            {
                                var doorLockObj = new ZigBee.Device.DoorLock.LocaDoorLockObj() { };
                                doorLockObj.UserID = int.Parse(curDoorLockUser.DoorLockLocalUserId);
                                doorLockObj.UnlockType = curDoorLockUser.OpenLockMode;
                                doorLockObj.PrimaryId = curDoorLockUser.Id;
                                doorLockObj.EntryTime = curDoorLockUser.EntryTime;
                                doorLockObj.UserName = curDoorLockUser.UserIdRemarks;
                                doorLockObj.ConnectedAccount = curDoorLockUser.CloudAccountId;
                                doorLock.localDoorLockUserList[int.Parse(curDoorLockUser.DoorLockLocalUserId)] = doorLockObj;
                            }
                            else
                            {
                                if (curDoorLockUser.DoorLockLocalUserId != null)
                                {
                                    //门锁中没有,云端有用户ID,后台删除云端这些ID
                                    var deleteDoorLockData = new ZigBee.Device.DoorLock.DeleteDoorLockData();
                                    if (UserCenterResourse.UserInfo.AuthorityNo != 1)
                                    {
                                        deleteDoorLockData.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
                                        deleteDoorLockData.IsOtherAccountCtrl = true;
                                    }
                                    if (doorLock.DeviceAddr != null)
                                    {
                                        deleteDoorLockData.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
                                    }
                                    deleteDoorLockData.DoorLockLocalUserId = curDoorLockUser.DoorLockLocalUserId;
                                    deleteDoorLockData.PrimaryId = curDoorLockUser.Id;
                                    deleteDoorLockData.DelDoorLockDelType = 2;
                                    var result = await ZigBee.Device.DoorLock.SendDoorLockToServer("DoorLock/DelDoorLock", deleteDoorLockData);
                                }
                            }
                        }
                        doorLock.ReSave();
                    }
                }
                return doorLock.localDoorLockUserList;
            }));
        }
        /// <summary>
        ///  获取当前账户中门锁信息
        /// </summary>
        public static async System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>> GetLocaDoorLocklist(ZigBee.Device.DoorLock doorLock, Shared.Phone.UserCenter.MemberInfoRes curAccountObj)
        {
            return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>>>)(async () =>
            {
                //读取设备中的信息
                doorLock.localDoorLockUserList.Clear();
                var getDoorLockInfo = await doorLock.GetDoorlockUserInfoAsync();
                if (getDoorLockInfo == null)
                {
                    doorLock.IsFailedToGetDoorLockInfo[curAccountObj.SubAccountDistributedMark] = true;
                }
                else
                {
                    doorLock.IsFailedToGetDoorLockInfo[curAccountObj.SubAccountDistributedMark] = false;
                    if (getDoorLockInfo != null && getDoorLockInfo.doorLockUserDetailData != null)
                    {
                        var dataList = getDoorLockInfo.doorLockUserDetailData.UserObjList;
                        foreach (var doorData in dataList)
                        {
                            var localDoorLockObj1 = new ZigBee.Device.DoorLock.LocaDoorLockObj()
                            {
                                UserID = doorData.UserId,
                                UnlockType = doorData.UserType
                            };
                            if ((doorLock.localDoorLockUserList.ContainsKey(localDoorLockObj1.UserID)) == false)
                            {
                                doorLock.localDoorLockUserList.Add(localDoorLockObj1.UserID, localDoorLockObj1);
                            }
                        }
                    }
                    //  读取云端门锁设备中的信息
                    var getDoorLockInfoAllList = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetDoorLockAllInfolist(doorLock, curAccountObj.SubAccountDistributedMark);
                    if (getDoorLockInfoAllList.Count != 0)
                    {
                        foreach (var getDoorLockInfoList in getDoorLockInfoAllList)
                        {
                            if (getDoorLockInfoList != null)
                            {
                                foreach (var curDoorLockUser in getDoorLockInfoList.PageData)
                                {
                                    if (string.IsNullOrEmpty(curDoorLockUser.DoorLockLocalUserId))
                                    {
                                        continue;
                                    }
                                    if (doorLock.localDoorLockUserList.ContainsKey(int.Parse(curDoorLockUser.DoorLockLocalUserId)))
                                    {
                                        var doorLockObj = new ZigBee.Device.DoorLock.LocaDoorLockObj() { };
                                        doorLockObj.UserID = int.Parse(curDoorLockUser.DoorLockLocalUserId);
                                        doorLockObj.UnlockType = curDoorLockUser.OpenLockMode;
                                        doorLockObj.PrimaryId = curDoorLockUser.Id;
                                        doorLockObj.EntryTime = curDoorLockUser.EntryTime;
                                        doorLockObj.UserName = curDoorLockUser.UserIdRemarks;
                                        doorLockObj.ConnectedAccount = curDoorLockUser.CloudAccountId;
                                        doorLock.localDoorLockUserList[int.Parse(curDoorLockUser.DoorLockLocalUserId)] = doorLockObj;
                                    }
                                    else
                                    {
                                        if (curDoorLockUser.DoorLockLocalUserId != null)
                                        {
                                            //门锁中没有,云端有用户ID,后台删除云端这些ID
                                            var deleteDoorLockData = new ZigBee.Device.DoorLock.DeleteDoorLockData();
                                            if (UserCenterResourse.UserInfo.AuthorityNo != 1)
                                            {
                                                deleteDoorLockData.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
                                                deleteDoorLockData.IsOtherAccountCtrl = true;
                                            }
                                            if (doorLock.DeviceAddr != null)
                                            {
                                                deleteDoorLockData.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
                                            }
                                            deleteDoorLockData.DoorLockLocalUserId = curDoorLockUser.DoorLockLocalUserId;
                                            deleteDoorLockData.PrimaryId = curDoorLockUser.Id;
                                            deleteDoorLockData.DelDoorLockDelType = 2;
                                            var result = await ZigBee.Device.DoorLock.SendDoorLockToServer("DoorLock/DelDoorLock", deleteDoorLockData);
                                        }
                                    }
                                }
                                doorLock.ReSave();
                            }
                        }
                    }
                }
                return doorLock.localDoorLockUserList;
            }));
        }
        /// <summary>
        ///  获取当前账户中云端存储的门锁信息
        /// </summary>
        public static async System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>> GetCloudLocalDoorLocklist(ZigBee.Device.DoorLock doorLock, string subAccountDistributedMark)
        {
            return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>>>)(async () =>
            {
                var getDoorLockInfoAllList = new List<ZigBee.Device.DoorLock.CloudDoorLockObj> { };
                //  读取云端门锁设备中的信息
                var localDoorLockObj = new ZigBee.Device.DoorLock.GetDoorLockData() { };
                if (UserCenterResourse.UserInfo.AuthorityNo != 1)
                {
                    localDoorLockObj.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
                    localDoorLockObj.IsOtherAccountCtrl = true;
                }
                localDoorLockObj.CloudAccountId = subAccountDistributedMark;
                if (doorLock.DeviceAddr != null)
                {
                    localDoorLockObj.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
                }
                var getDoorLockInfoList = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
                if (getDoorLockInfoList != null)
                {
                    if (getDoorLockInfoList.PageData.Count != 0)
                    {
                        getDoorLockInfoAllList = getDoorLockInfoList.PageData;
                    }
                }
                if (getDoorLockInfoList.TotalPages > 1)
                {
                    for (int j = 1; j < getDoorLockInfoList.TotalPages; j++)
                    {
                        var pageSetting = new ZigBee.Device.DoorLock.PageSetting() { };
                        pageSetting.Page = j + 1;
                        localDoorLockObj.pageSetting = pageSetting;
                        var getDoorLockInfoListTemp = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
                        if (getDoorLockInfoListTemp != null)
                        {
                            if (getDoorLockInfoListTemp.PageData.Count != 0)
                            {
                                foreach (var curDoorLockUser in getDoorLockInfoListTemp.PageData)
                                {
                                    getDoorLockInfoAllList.Add(curDoorLockUser);
                                }
                            }
                        }
                    }
                }
                if (getDoorLockInfoAllList.Count != 0)
                {
                    foreach (var curDoorLockUser in getDoorLockInfoAllList)
                    {
                        if (string.IsNullOrEmpty(curDoorLockUser.DoorLockLocalUserId))
                        {
                            continue;
                        }
                        if (doorLock.localDoorLockUserList.ContainsKey(int.Parse(curDoorLockUser.DoorLockLocalUserId)))
                        {
                            var doorLockObj = new ZigBee.Device.DoorLock.LocaDoorLockObj() { };
                            doorLockObj.UserID = int.Parse(curDoorLockUser.DoorLockLocalUserId);
                            doorLockObj.UnlockType = curDoorLockUser.OpenLockMode;
                            doorLockObj.PrimaryId = curDoorLockUser.Id;
                            doorLockObj.EntryTime = curDoorLockUser.EntryTime;
                            doorLockObj.UserName = curDoorLockUser.UserIdRemarks;
                            doorLockObj.ConnectedAccount = curDoorLockUser.CloudAccountId;
                            doorLock.localDoorLockUserList[int.Parse(curDoorLockUser.DoorLockLocalUserId)] = doorLockObj;
                        }
                    }
                    doorLock.ReSave();
                }
                return doorLock.localDoorLockUserList;
            }));
        }
        /// <summary>
        ///  获取云端存储的当前账户的门锁信
        /// </summary>
        public static async System.Threading.Tasks.Task<List<ZigBee.Device.DoorLock.CloudDoorLockObj>> GetAccountDoorLockUserList(ZigBee.Device.DoorLock doorLock, string subAccountDistributedMark)
        {
            List<ZigBee.Device.DoorLock.CloudDoorLockObj> curAccountDoorLockUserList = new List<ZigBee.Device.DoorLock.CloudDoorLockObj> { };
            return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<List<ZigBee.Device.DoorLock.CloudDoorLockObj>>>)(async () =>
            {
                //  读取云端门锁设备中的信息
                var getAllDoorLockInfoList = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetDoorLockAllInfolist(doorLock, subAccountDistributedMark);
                if (getAllDoorLockInfoList != null)
                {
                    foreach (var getDoorLockInfoList in getAllDoorLockInfoList)
                    {
                        //获取云端存储的门锁成员信息
                        foreach (var curDoorLockUser in getDoorLockInfoList.PageData)
                        {
                            if (string.IsNullOrEmpty(curDoorLockUser.CloudAccountId) || curDoorLockUser.CloudAccountId != subAccountDistributedMark)
                            {
                                continue;
                            }
                            else
                            {
                                curAccountDoorLockUserList.Add(curDoorLockUser);
                            }
                        }
                    }
                }
                return curAccountDoorLockUserList;
            }));
        }
        /// <summary>
        ///  获取当前账户门锁的所有信息
        /// </summary>
        public static async System.Threading.Tasks.Task<List<ZigBee.Device.DoorLock.GetDoorLockDataRes>> GetDoorLockAllInfolist(ZigBee.Device.DoorLock doorLock, string subAccountDistributedMark)
        {
            return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<List<ZigBee.Device.DoorLock.GetDoorLockDataRes>>>)(async () =>
            {
                var getDoorLockInfoAllList = new List<ZigBee.Device.DoorLock.GetDoorLockDataRes> { };
                //  读取云端门锁设备中的信息
                var localDoorLockObj = new ZigBee.Device.DoorLock.GetDoorLockData() { };
                if (UserCenterResourse.UserInfo.AuthorityNo != 1)
                {
                    localDoorLockObj.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
                    localDoorLockObj.IsOtherAccountCtrl = true;
                }
                localDoorLockObj.CloudAccountId = subAccountDistributedMark;
                if (doorLock.DeviceAddr != null)
                {
                    localDoorLockObj.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
                }
                var getDoorLockInfoList = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
                if (getDoorLockInfoList == null)
                {
                    getDoorLockInfoAllList = null;
                }
                else
                {
                    if (getDoorLockInfoList != null)
                    {
                        if (getDoorLockInfoList.PageData.Count != 0)
                        {
                            getDoorLockInfoAllList.Add(getDoorLockInfoList);
                        }
                    }
                    if (getDoorLockInfoList.TotalPages > 1)
                    {
                        for (int j = 1; j < getDoorLockInfoList.TotalPages; j++)
                        {
                            var pageSetting = new ZigBee.Device.DoorLock.PageSetting() { };
                            pageSetting.Page = j + 1;
                            localDoorLockObj.pageSetting = pageSetting;
                            var getDoorLockInfoListTemp = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
                            if (getDoorLockInfoListTemp != null)
                            {
                                getDoorLockInfoAllList.Add(getDoorLockInfoListTemp);
                            }
                        }
                    }
                }
                return getDoorLockInfoAllList;
            }));
        }
        /// <summary>
        ///  获取当前账户门锁的所有信息
        /// </summary>
        public static async System.Threading.Tasks.Task<ZigBee.Device.DoorLock.GetDoorLockDataRes> GetDoorLockAllAccountInfolist(ZigBee.Device.DoorLock doorLock, int curPage = 1)
        {
            return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<ZigBee.Device.DoorLock.GetDoorLockDataRes>>)(async () =>
            {
                //  读取云端门锁设备中的信息
                var localDoorLockObj = new ZigBee.Device.DoorLock.GetDoorLockData() { };
                if (UserCenterResourse.UserInfo.AuthorityNo != 1)
                {
                    localDoorLockObj.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
                    localDoorLockObj.IsOtherAccountCtrl = true;
                }
                if (doorLock.DeviceAddr != null)
                {
                    localDoorLockObj.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
                }
                var pageSetting = new ZigBee.Device.DoorLock.PageSetting() { };
                pageSetting.Page = curPage;
                localDoorLockObj.pageSetting = pageSetting;
                var getDoorLockInfoList = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
                return getDoorLockInfoList;
            }));
        }
        /// <summary>
        ///  获取云端存储的门锁成员信息
        /// </summary>
        public static async System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>> GetLocaDoorLockAccountlist(ZigBee.Device.DoorLock doorLock, Shared.Phone.UserCenter.MemberInfoRes curAccountObj, int curPage)
        {
            return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>>>)(async () =>
            {
                //  读取云端门锁设备中的信息
                var localDoorLockObj = new ZigBee.Device.DoorLock.GetDoorLockData() { };
                if (UserCenterResourse.UserInfo.AuthorityNo != 1)
                {
                    localDoorLockObj.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
                    localDoorLockObj.IsOtherAccountCtrl = true;
                }
                localDoorLockObj.CloudAccountId = curAccountObj.SubAccountDistributedMark;
                {
                    localDoorLockObj.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
                }
                if (doorLock.DeviceAddr != null)
                {
                    localDoorLockObj.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
                }
                var pageSetting = new ZigBee.Device.DoorLock.PageSetting() { };
                pageSetting.Page = curPage;
                localDoorLockObj.pageSetting = pageSetting;
                var getDoorLockInfoList = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
                if (getDoorLockInfoList != null)
                {
                    foreach (var curDoorLockUser in getDoorLockInfoList.PageData)
                    {
                        var doorLockObj = new ZigBee.Device.DoorLock.LocaDoorLockObj() { };
                        if (curDoorLockUser.DoorLockLocalUserId != null)
                        {
                            doorLockObj.UserID = int.Parse(curDoorLockUser.DoorLockLocalUserId);
                            doorLockObj.UnlockType = curDoorLockUser.OpenLockMode;
                            doorLockObj.UserName = curDoorLockUser.UserIdRemarks;
                        }
                        doorLockObj.PrimaryId = curDoorLockUser.Id;
                        doorLockObj.EntryTime = curDoorLockUser.EntryTime;
                        doorLockObj.ConnectedAccount = curDoorLockUser.CloudAccountId;
                        if (doorLock.localDoorLockAccountList.ContainsKey(curDoorLockUser.CloudAccountId) == false)
                        {
                            doorLock.localDoorLockAccountList.Add(doorLockObj.ConnectedAccount, doorLockObj);
                        }
                        else
                        {
                            doorLock.localDoorLockAccountList[curDoorLockUser.DoorLockLocalUserId] = doorLockObj;
                        }
                    }
                }
                return doorLock.localDoorLockUserList;
            }));
        }
        /// <summary>
        ///  获取本地匹配成员的门锁用户信息列表
        /// </summary>
        public static async System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>> GetMatchDoorlockAccountList(ZigBee.Device.DoorLock doorLock, Shared.Phone.UserCenter.MemberInfoRes curAccountObj)
        {
            return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>>>)(async () =>
            {
                var curAccountDoorLockUserList = new Dictionary<int, ZigBee.Device.DoorLock.LocaDoorLockObj>();
                foreach (var curUserId in doorLock.localDoorLockAccountList.Keys)
                {
                    var curDoorLockUser = doorLock.localDoorLockAccountList[curUserId];
                    if (string.IsNullOrEmpty(curDoorLockUser.ConnectedAccount) || curDoorLockUser.ConnectedAccount != curAccountObj.SubAccountDistributedMark)
                    {
                        continue;
                    }
                    else
                    {
                        curAccountDoorLockUserList.Add(curDoorLockUser.UserID, curDoorLockUser);
                    }
                }
                return curAccountDoorLockUserList;
            }));
        }
        /// <summary>
        /// 生成6位临时密码
        /// </summary>
        /// <returns></returns>
        public static string GetTempPassword()
        {
            string password = "";
            password = new Random().Next(100000, 999999).ToString();
            return password;
        }
        /// <summary>
        /// 将UNIX时间戳转换成系统时间(精确到秒)
        /// <returns></returns>
        public static DateTime GetLocalTime(int unixTimeStamp)
        {
            DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
            long lTime = long.Parse(unixTimeStamp + "0000000");
            TimeSpan toNow = new TimeSpan(lTime);
            DateTime dtResult = dtStart.Add(toNow);
            return dtResult;
        }
        /// <summary>
        /// 将系统时间转换成UNIX时间戳(精确到秒)
        /// </summary>
        /// <param name="dateTime">北京时间</param>
        /// <param name="accurateToMilliseconds">精确到毫秒,否到秒</param>
        /// <returns>返回一个长整数时间戳</returns>
        public static string GetUnixTimeStamp(DateTime dateTime)
        {
            DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
            //DateTime dtNow = DateTime.Parse(DateTime.Now.ToString());
            TimeSpan toNow = dateTime.Subtract(dtStart);
            string timeStamp = toNow.Ticks.ToString();
            timeStamp = timeStamp.Substring(0, timeStamp.Length - 7);
            return timeStamp;
        }
        /// <summary>
        /// 门锁编程事件通知
        /// </summary>
        [System.Serializable]
        public class LocaDoorLockObj
        {
            /// <summary>
            /// 用户id
            /// <para>管理员10个,0~9,</para>             ///<para>普通用户220个,10~234</para>             ///<para>一次性用户10个,235~245</para>             ///<para>临时密码密码10个,245~255,</para>             ///<para>其中指纹100,密码100,卡56</para>
            ///<para>门锁本地录入的密码、指纹、感应卡都有唯一对应的用户Id</para>
            /// </summary>
            public int UserID = -1;
            /// <summary>
            /// 开锁类型
            /// <para>常用:</para>
            /// <para>0:Keypad(键盘/密码);3:RFID(射频卡);15:指纹</para>
            /// <para>不常用:
            /// <para>1:RF(Zigbee无线);2:Manual(手动);255:Indeterminate(不确定)</para>
            /// </summary>
            public int UnlockType;
            /// <summary>
            ///  关联账户的ID
            /// </summary>
            public string ConnectedAccount = string.Empty;
            /// <summary>
            ///  门锁用户名
            /// </summary>
            public string UserName = string.Empty;
            /// <summary>
            /// 门锁录入的时
            /// </summary>
            public DateTime EntryTime = System.DateTime.MinValue;
            /// <summary>
            /// PrimaryId 门锁云端主 键(非更新字段,以下均为更新字段) -->键名 : PrimaryId默认值: null
            /// </summary>
            public string PrimaryId = "";
        }
        #endregion
        #region 一般方法
        /// <summary>
        /// 显示错误信息窗口
        /// </summary>
        /// <param name="msg"></param>
        private void ShowErrorMsg(string msg)
        {
            Application.RunOnMainThread(() =>
            {
                var contr = new ShowMsgControl(ShowMsgType.Error, msg);
                contr.Show();
            });
        }
        /// <summary>
        /// 显示Tip信息窗口
        /// </summary>
        /// <param name="msg"></param>
        private void ShowTipMsg(string msg)
        {
            Application.RunOnMainThread(() =>
            {
                var contr = new ShowMsgControl(ShowMsgType.Tip, msg);
                contr.Show();
            });
        }
        #endregion
      /// <summary>
      /// app操作
      /// </summary>
      AppOperate = 0,
      /// <summary>
      /// 通过门锁操作设备上报
      /// </summary>
      DeviceReport = 1,
      /// <summary>
      /// 通过服务器推送
      /// </summary>
      ServicePush = 2,
    }
    #endregion
    #region 常开模式 API
    /// <summary>
    /// 获取当前门锁的常开模式
    /// </summary>
    /// <param name="doorLock:当前门锁"></param>
    /// <returns>null:没有回复  ; true:门锁常开;false:门锁常关</returns>
    public static async System.Threading.Tasks.Task<bool?> GetNormallyOpenMode(ZigBee.Device.DoorLock doorLock)
    {
      bool? IsDoorLockNormallyMode = null;
      var result = await doorLock.ReadNormallyOpenModeFuncAsync();
      //共通错误检测
      string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
      if (result == null || result.errorMessageBase != null || result.errorResponData != null)
      {
        IsDoorLockNormallyMode = null;
      }
      if (result.command == "10")
      {
        IsDoorLockNormallyMode = true;
      }
      if (result.command == "11")
      {
        IsDoorLockNormallyMode = false;
      }
      return IsDoorLockNormallyMode;
    }
    /// <summary>
    /// 门锁是否支持常开[这里暂时只有S-One门锁支持,H06C不支持, 后期通过能力值支持]
    /// </summary>
    /// <param name="doorLock:当前门锁"></param>
    /// <returns>true:支持常开;false: 不支持常开</returns>
    public static bool CanNormallyOpen(ZigBee.Device.DoorLock doorLock)
    {
      var listDevice = new List<CommonDevice> { };
      listDevice.Add(doorLock);
      var devTemp = Common.LocalDevice.Current.GetMyDeviceEnumInfo(listDevice);
      if (devTemp.ConcreteType != DeviceConcreteType.IntelligentLocks_H06C)
      {
        return true;
      }
      return false;
    }
    /// <summary>
    /// 设置本地门锁的常开模式值
    /// </summary>
    public static void NormallyOpenModeValue(ZigBee.Device.DoorLock doorLock, bool value)
    {
      doorLock.IsDoorLockNormallyMode = value;
      if (DoorLockCommonInfo.DoorLockNormallyMode.ContainsKey(doorLock.DeviceAddr + doorLock.DeviceEpoint))
      {
        DoorLockCommonInfo.DoorLockNormallyMode[doorLock.DeviceAddr + doorLock.DeviceEpoint] = value;
      }
      else
      {
        DoorLockCommonInfo.DoorLockNormallyMode.Add(doorLock.DeviceAddr + doorLock.DeviceEpoint, value);
      }
    }
    /// <summary>
    /// 常开模式失效处理【弹窗】
    /// </summary>
    /// <param name="doorLock">当前门锁</param>
    /// <param name="doorLockMessType">导致门锁失效的操作类型</param>
    /// <param name="haveLogic">网关中是否存在逻辑常开模式</param>
    /// <param name="action">回调处理更新内容</param>
    /// <param name="type">1:确认常开模式已经开启;0:常开模式失效提示</param>
    public static async void NomallyOpenModeInvalidDialog(ZigBee.Device.DoorLock doorLock, DoorLockMessType doorLockMessType, bool haveLogic, Action<bool> action = null, int type = 0)
    {
      //常开模式只能主人操作
      if (UserCenterResourse.UserInfo.AuthorityNo != 1)
      {
        Application.RunOnMainThread(() =>
        {
          string msg0 = Language.StringByID(R.MyInternationalizationString.OnlyMasterOperate);
          ShowTipMsg(msg0);
        });
        return;
      }
      //常开模式将被取消弹窗
      string msg = Language.StringByID(R.MyInternationalizationString.NomallyModeIsCanceled).Replace("{0}", "\r\n");
      var confirm = Language.StringByID(R.MyInternationalizationString.SureCancel);
      var alert = new ShowDoorLockMsgControl(ShowDoorLockMsgControl.DoorLockMsgType.NomallyOpenMode, msg, confirm);
      if (haveLogic)
      {
        //有逻辑设置的弹窗
        alert = new ShowDoorLockMsgControl(ShowDoorLockMsgControl.DoorLockMsgType.CancelNomallyOpenModeWithLogic, msg, confirm);
      }
      alert.Show();
      alert.MsgControlClickEvent += async () =>
      {
        if (doorLockMessType == DoorLockMessType.DeviceReport || doorLockMessType == DoorLockMessType.ServicePush)
        {
                //上报“常开模式”已被取消,app默认了“常开模式”被取消
                DoorLockCommonInfo.NormallyOpenModeValue(doorLock, false);
          if (LogicAction != null)
          {
            LogicAction(false);
          }
          if (haveLogic)
          {
                  //此处删除温居城的常开模式特殊逻辑
                  var resTemp1 = await Shared.Phone.Device.Logic.SkipView.DelAllLogic(doorLock);
          }
        }
        else
        {
                //保持常开
                NormallyOpenModeValue(doorLock, true);
        }
        action?.Invoke(doorLock.IsDoorLockNormallyMode);
        action = null;
      };
      alert.CancelClickEvent += async () =>
      {
        if (doorLockMessType == DoorLockMessType.DeviceReport || doorLockMessType == DoorLockMessType.ServicePush)
        {
                //上报“常开模式”已被取消
                Application.RunOnMainThread(() => { CommonPage.Loading.Start(""); });
                //app重新开启“常开模式”
                var result = await doorLock.SetNormallyOpenModeFuncAsync(true);
          if (result == null || result.defaultControlResponseData == null)
          {
            Application.RunOnMainThread(() =>
                  {
                    string msg0 = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime);
                    ShowTipMsg(msg0);
                    NormallyOpenModeValue(doorLock, false);
                    CommonPage.Loading.Hide();
                  });
            action?.Invoke(doorLock.IsDoorLockNormallyMode);
            action = null;
            if (LogicAction != null)
            {
              LogicAction(false);
            }
            return;
          }
          if (result.defaultControlResponseData.status != 0)
          {
            Application.RunOnMainThread(() =>
                  {
                    string msg1 = Language.StringByID(R.MyInternationalizationString.OpenNormallyOpenModeFailed);
                    ShowTipMsg(msg1);
                    NormallyOpenModeValue(doorLock, false);
                    CommonPage.Loading.Hide();
                  });
            action?.Invoke(doorLock.IsDoorLockNormallyMode);
            action = null;
            if (LogicAction != null)
            {
              LogicAction(false);
            }
            return;
          }
          else
          {
            Application.RunOnMainThread(() =>
                  {
                    string msg0 = Language.StringByID(R.MyInternationalizationString.OpenNormallyOpenModeSuccess);
                    ShowTipMsg(msg0);
                    NormallyOpenModeValue(doorLock, true);
                    CommonPage.Loading.Hide();
                    if (LogicAction != null)
                    {
                      LogicAction(true);
                    }
                  });
          }
        }
        else
        {
                //app操作不取消“常开模式”
                DoorLockCommonInfo.NormallyOpenModeValue(doorLock, true);
        }
        action?.Invoke(doorLock.IsDoorLockNormallyMode);
        action = null;
      };
      alert.ConfirmClickEvent += async () =>
      {
        if (doorLockMessType == DoorLockMessType.DeviceReport || doorLockMessType == DoorLockMessType.ServicePush)
        {
          NormallyOpenModeValue(doorLock, false);
          if (LogicAction != null)
          {
            LogicAction(false);
          }
          if (haveLogic)
          {
                  //此处删除温居城的常开模式特殊逻辑
                  var resTemp1 = await Shared.Phone.Device.Logic.SkipView.DelAllLogic(doorLock);
          }
        }
        else
        {
                //app操作取消“常开模式”
                Application.RunOnMainThread(() => { CommonPage.Loading.Start(""); });
          var result = await doorLock.SetNormallyOpenModeFuncAsync(false);
          if (result == null || result.defaultControlResponseData == null)
          {
            Application.RunOnMainThread(() =>
                  {
                    ShowTipMsg(Language.StringByID(R.MyInternationalizationString.GwResponseOvertime));
                    CommonPage.Loading.Hide();
                  });
            action?.Invoke(doorLock.IsDoorLockNormallyMode);
            action = null;
            if (LogicAction != null)
            {
              LogicAction(false);
            }
            return;
          }
          if (result.defaultControlResponseData.status != 0)
          {
            Application.RunOnMainThread(() =>
                  {
                    string msg1 = Language.StringByID(R.MyInternationalizationString.CloseNormallyOpenModeFailed);
                    ShowTipMsg(msg1);
                    CommonPage.Loading.Hide();
                  });
            action?.Invoke(doorLock.IsDoorLockNormallyMode);
            action = null;
            if (LogicAction != null)
            {
              LogicAction(false);
            }
            return;
          }
          else
          {
                  //添加App开启常开模式的历史记录
                  HdlDeviceDoorLockLogic.Current.AddDoorHistoryLog(doorLock, 9002, string.Empty);
                  //app确认取消“常开模式”成功
                  NormallyOpenModeValue(doorLock, false);
                  //删除设置常开模式创建的逻辑
                  if (haveLogic)
            {
                    //此处删除温居城的常开模式特殊逻辑
                    var resTemp1 = await Shared.Phone.Device.Logic.SkipView.DelAllLogic(doorLock);
            }
            Application.RunOnMainThread(() =>
                  {
                    string msg2 = Language.StringByID(R.MyInternationalizationString.CloseNormallyOpenModeSuccess);
                    ShowTipMsg(msg2);
                    CommonPage.Loading.Hide();
                  });
            if (LogicAction != null)
            {
              LogicAction(false);
            }
          }
        }
        action?.Invoke(doorLock.IsDoorLockNormallyMode);
        action = null;
      };
    }
    /// <summary>
    /// 删除常开模式
    /// </summary>
    /// <param name="doorLock">当前门锁</param>
    /// <param name="action">回调处理更新内容</param>
    /// <returns></returns>
    public static async System.Threading.Tasks.Task<bool> DelNormallyOpenMode(ZigBee.Device.DoorLock doorLock, Action action = null)
    {
      //app操作取消“常开模式”
      var result = await doorLock.SetNormallyOpenModeFuncAsync(false);
      if (result == null || result.defaultControlResponseData == null || result.defaultControlResponseData.status != 0)
      {
        action?.Invoke();
        return false;
      }
      if (result.defaultControlResponseData.status == 0)
      {
        //app确认取消“常开模式”成功
        NormallyOpenModeValue(doorLock, false);
        action?.Invoke();
        return true;
      }
      return false;
    }
    /// <summary>
    /// 设置常开模式
    /// </summary>
    /// <param name="doorLock">当前门锁</param>
    /// <param name="action">回调处理更新内容</param>
    /// <returns></returns>
    public static async System.Threading.Tasks.Task<bool> SetNormallyOpenModeFuncAsync(ZigBee.Device.DoorLock doorLock)
    {
      //app设置“常开模式”失败
      var result = await doorLock.SetNormallyOpenModeFuncAsync(true);
      if (result == null || result.defaultControlResponseData == null || result.defaultControlResponseData.status != 0)
      {
        return false;
      }
      if (result.defaultControlResponseData.status == 0)
      {
        //app设置“常开模式”成功
        NormallyOpenModeValue(doorLock, false);
        return true;
      }
      return false;
    }
    /// <summary>
    /// 启动常开模式【弹窗】
    /// </summary>
    /// <param name="doorLock">当前门锁</param>
    /// <param name="action">回调处理更新内容</param>
    public static async void NomallyOpenModeStartDialog(ZigBee.Device.DoorLock doorLock, Action action)
    {
      //常开模式只能主人操作ZigBee.Device.DoorLock doorLock
      if (UserCenterResourse.UserInfo.AuthorityNo != 1)
      {
        Application.RunOnMainThread(() =>
        {
          string msg0 = Language.StringByID(R.MyInternationalizationString.OnlyMasterOperate);
          ShowTipMsg(msg0);
        });
        return;
      }
      //设置常开模式后,您的门锁将始终处于打开状态,确认开启?
      string msg = Language.StringByID(R.MyInternationalizationString.SetDoorLockNomallyOpen).Replace("{0}", "\r\n");
      var confirm = Language.StringByID(R.MyInternationalizationString.Confrim);
      var alert = new ShowDoorLockMsgControl(ShowDoorLockMsgControl.DoorLockMsgType.Confirm, msg, confirm);
      alert.Show();
      alert.ConfirmClickEvent += async () =>
      {
        NomallyOpenModeInvalidTimeDialog(doorLock, action);
      };
    }
    /// <summary>
    /// 常开模式失效时间处理【弹窗】
    /// </summary>
    public static async void NomallyOpenModeInvalidTimeDialog(ZigBee.Device.DoorLock doorLock, Action action)
    {
      //失效设置
      string msgTimeInValidSetting = Language.StringByID(R.MyInternationalizationString.DoorLockOpenAllTheTime);
      var timeConfrim = Language.StringByID(R.MyInternationalizationString.Confrim);
      var alertTimeInValidSetting = new ShowDoorLockMsgControl(ShowDoorLockMsgControl.DoorLockMsgType.InValid, msgTimeInValidSetting, timeConfrim);
      alertTimeInValidSetting.Show();
      alertTimeInValidSetting.InvalidTimeAction += async (obj) =>
      {
              //常开模式失效时间设置成功
              var temp = int.Parse(obj);
        DoorLockCommonInfo.NormallyOpenModeInvalidTime = temp;
        Application.RunOnMainThread(() => { CommonPage.Loading.Start(""); });
        var result = await doorLock.SetNormallyOpenModeFuncAsync(true);
        if (result == null || result.defaultControlResponseData == null)
        {
          Application.RunOnMainThread(() =>
                {
                string msg0 = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime);
                ShowTipMsg(msg0);
                CommonPage.Loading.Hide();
              });
          return;
        }
        if (result.defaultControlResponseData.status != 0)
        {
          Application.RunOnMainThread(() =>
                {
                string msg1 = Language.StringByID(R.MyInternationalizationString.OpenNormallyOpenModeFailed);
                ShowTipMsg(msg1);
                CommonPage.Loading.Hide();
              });
          return;
        }
        else
        {
                //添加App开启常开模式的历史记录
                HdlDeviceDoorLockLogic.Current.AddDoorHistoryLog(doorLock, 9001, string.Empty);
          DoorLockCommonInfo.NormallyOpenModeValue(doorLock, true);
          action?.Invoke();
          Application.RunOnMainThread(() =>
                {
                CommonPage.Loading.Hide();
              });
        }
              //温居城方法???
              //此处是否要创建常开模式的特殊逻辑
            };
    }
    #endregion
    #region 音量
    /// <summary>
    /// 门锁是否支持音量[这里暂时只有S-One门锁支持,H06C不支持,后期通过能力值支持]
    /// </summary>
    /// <param name="doorLock:当前门锁"></param>
    /// <returns></returns>
    public static bool CanVolume(ZigBee.Device.DoorLock doorLock)
    {
      var listDevice = new List<CommonDevice> { };
      listDevice.Add(doorLock);
      var devTemp = Common.LocalDevice.Current.GetMyDeviceEnumInfo(listDevice);
      if (devTemp.ConcreteType != DeviceConcreteType.IntelligentLocks_H06C)
      {
        return true;
      }
      return false;
    }
    #endregion
    #region 从云端获取的方法
    /// <summary>
    /// 获取当前账户门锁操作权限(是否被冻结)
    /// </summary>
    /// <param name="doorLock:当前门锁"></param>
    /// <param name="subAccountDistributedMark:登录账户的GUID"></param>
    /// <returns></returns>
    public static async System.Threading.Tasks.Task<bool> GetDoorLockOperateAccess(ZigBee.Device.DoorLock doorLock, string subAccountDistributedMark)
    {
      return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<bool>>)(async () =>
      {
        if (doorLock.IsFreezeAccount.ContainsKey(subAccountDistributedMark) == false)
        {
          doorLock.IsFreezeAccount.Add(subAccountDistributedMark, false);
        }
        var resultList = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetAccountDoorLockUserList(doorLock, subAccountDistributedMark);
        var d = resultList.Find((obj) => { return obj.IsFreezeUser == true; });
        if (d != null)
        {
          doorLock.IsFreezeAccount[subAccountDistributedMark] = true;
        }
        else
        {
          doorLock.IsFreezeAccount[subAccountDistributedMark] = false;
        }
        return doorLock.IsFreezeAccount[subAccountDistributedMark];
      }));
    }
    /// <summary>
    /// 获取当前账户门锁远程开锁权限(是否被拥有远程开锁权限)
    /// </summary>
    /// <param name="doorLock:当前门锁"></param>
    /// <param name="subAccountDistributedMark:登录账户的GUID"></param>
    /// <returns></returns>
    public static async System.Threading.Tasks.Task<bool> GetDoorLockUnlockAccess(ZigBee.Device.DoorLock doorLock, string subAccountDistributedMark)
    {
      return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<bool>>)(async () =>
      {
        if (doorLock.HasRemoteUnlockAccess.ContainsKey(subAccountDistributedMark) == false)
        {
          doorLock.HasRemoteUnlockAccess.Add(subAccountDistributedMark, false);
        }
        var resultList = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetAccountDoorLockUserList(doorLock, subAccountDistributedMark);
        var d = resultList.Find((obj) => { return obj.IsTempUnlockAuthority == true; });
        if (d != null)
        {
          doorLock.HasRemoteUnlockAccess[subAccountDistributedMark] = true;
        }
        else
        {
          doorLock.HasRemoteUnlockAccess[subAccountDistributedMark] = false;
        }
        return doorLock.HasRemoteUnlockAccess[subAccountDistributedMark];
      }));
    }
    /// <summary>
    ///  获取当前账户列表(门锁只对主人和拥有管理员权限对成员用)
    /// </summary>
    public static async System.Threading.Tasks.Task<List<Shared.Phone.UserCenter.MemberInfoRes>> LocalAccountList()
    {
      return await System.Threading.Tasks.Task.Run(async () =>
      {
        List<Shared.Phone.UserCenter.MemberInfoRes> localAccountList = new List<Shared.Phone.UserCenter.MemberInfoRes> { };
        List<Shared.Phone.UserCenter.MemberInfoRes> SubAccounList = new List<Shared.Phone.UserCenter.MemberInfoRes> { };
              //只有主人才有权限获取自己的子账户
              if (UserCenterResourse.UserInfo.AuthorityNo == 1)
        {
          var SubAccounListTemp = await ZigBee.Device.DoorLock.GetSubAccountByDistributedMark();
          var SubAccounListDictionary = new Dictionary<string, Shared.Phone.UserCenter.MemberInfoRes> { };
          if (SubAccounListTemp != null)
          {
            foreach (var member in SubAccounListTemp)
            {
                    //判断一个账户绑定了邮箱的情况
                    if (SubAccounListDictionary.ContainsKey(member.DistributedMark) == true
                    || member.Account == UserCenterResourse.UserInfo.Phone
                    || member.Account == UserCenterResourse.UserInfo.Email)
              {
                      //如果是它自己的话,不显示,账户和绑定的邮箱只显示其中之一
                      continue;
              }
                    //去掉子账户中普通成员,留下拥有管理员权限的成员
                    //(因为分配账户给普通成员,普通成员在app中不能进入设备管理那里,所以没发查看主人分配对账户)
                    if (member.AccountType != 1)
              {
                continue;
              }
              SubAccounListDictionary.Add(member.DistributedMark, member);
            }
          }
          foreach (var addMemberID in SubAccounListDictionary.Keys)
          {
            SubAccounList.Add(SubAccounListDictionary[addMemberID]);
          }
        }
              // 注意:SubAccountDistributedMark这个值很有用,“添加门锁”到云端信息中,CloudAccountId如果是子账户,则是SubAccountDistributedMark这个值很有用,如果是管理员或者主人则是登录到G
              var masterAccount = new Shared.Phone.UserCenter.MemberInfoRes();
        masterAccount.Account = Shared.Common.Config.Instance.Account;
        masterAccount.AccountType = Shared.Common.Config.Instance.AccountType;
        masterAccount.SubAccountDistributedMark = Shared.Common.Config.Instance.Guid;
        masterAccount.UserName = UserCenterResourse.UserInfo.UserName;
        localAccountList.Add(masterAccount);
        localAccountList.AddRange(SubAccounList);
        return localAccountList;
      });
    }
    /// <summary>
    ///  获取所有账户和门锁包含的信息
    /// </summary>
    public static async System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>> GetDoorLockAllAcountUserlist(ZigBee.Device.DoorLock doorLock)
    {
      return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>>>)(async () =>
      {
              //1、读取门锁信息
              var getDoorLockInfo = await doorLock.GetDoorlockUserInfoAsync();
              //本地门锁列表处理
              foreach (var curAccountObj in doorLock.localAllAccountList)
        {
          if (getDoorLockInfo == null)
          {
            doorLock.IsFailedToGetDoorLockInfo[curAccountObj.SubAccountDistributedMark] = true;
          }
          else
          {
            doorLock.IsFailedToGetDoorLockInfo[curAccountObj.SubAccountDistributedMark] = false;
          }
        }
              // 用户信息处理
              if (getDoorLockInfo != null && getDoorLockInfo.doorLockUserDetailData != null)
        {
          doorLock.localDoorLockUserList.Clear();
          var dataList = getDoorLockInfo.doorLockUserDetailData.UserObjList;
          foreach (var doorData in dataList)
          {
            var localDoorLockObj1 = new ZigBee.Device.DoorLock.LocaDoorLockObj()
            {
              UserID = doorData.UserId,
              UnlockType = doorData.UserType
            };
            if ((doorLock.localDoorLockUserList.ContainsKey(localDoorLockObj1.UserID)) == false)
            {
              doorLock.localDoorLockUserList.Add(localDoorLockObj1.UserID, localDoorLockObj1);
            }
          }
                //2、读取云端门锁信息
                var getDoorLockInfoAllList = new List<ZigBee.Device.DoorLock.CloudDoorLockObj> { };
          var getDoorLockInfoList = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetDoorLockAllAccountInfolist(doorLock);
          if (getDoorLockInfoList != null)
          {
            if (getDoorLockInfoList.PageData.Count != 0)
            {
              getDoorLockInfoAllList = getDoorLockInfoList.PageData;
            }
          }
          if (getDoorLockInfoList.TotalPages > 1)
          {
            for (int j = 1; j < getDoorLockInfoList.TotalPages; j++)
            {
              var getDoorLockInfoListTemp = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetDoorLockAllAccountInfolist(doorLock, j + 1);
              if (getDoorLockInfoListTemp != null)
              {
                if (getDoorLockInfoListTemp.PageData.Count != 0)
                {
                  foreach (var curDoorLockUser in getDoorLockInfoListTemp.PageData)
                  {
                    getDoorLockInfoAllList.Add(curDoorLockUser);
                  }
                }
              }
            }
          }
          if (getDoorLockInfoAllList.Count != 0)
          {
            foreach (var curDoorLockUser in getDoorLockInfoAllList)
            {
              if (string.IsNullOrEmpty(curDoorLockUser.DoorLockLocalUserId))
              {
                continue;
              }
              if (doorLock.localDoorLockUserList.ContainsKey(int.Parse(curDoorLockUser.DoorLockLocalUserId)))
              {
                var doorLockObj = new ZigBee.Device.DoorLock.LocaDoorLockObj() { };
                doorLockObj.UserID = int.Parse(curDoorLockUser.DoorLockLocalUserId);
                doorLockObj.UnlockType = curDoorLockUser.OpenLockMode;
                doorLockObj.PrimaryId = curDoorLockUser.Id;
                doorLockObj.EntryTime = curDoorLockUser.EntryTime;
                doorLockObj.UserName = curDoorLockUser.UserIdRemarks;
                doorLockObj.ConnectedAccount = curDoorLockUser.CloudAccountId;
                doorLock.localDoorLockUserList[int.Parse(curDoorLockUser.DoorLockLocalUserId)] = doorLockObj;
              }
              else
              {
                if (curDoorLockUser.DoorLockLocalUserId != null)
                {
                        //门锁中没有,云端有用户ID,后台删除云端这些ID
                        var deleteDoorLockData = new ZigBee.Device.DoorLock.DeleteDoorLockData();
                  if (UserCenterResourse.UserInfo.AuthorityNo != 1)
                  {
                    deleteDoorLockData.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
                    deleteDoorLockData.IsOtherAccountCtrl = true;
                  }
                  if (doorLock.DeviceAddr != null)
                  {
                    deleteDoorLockData.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
                  }
                  deleteDoorLockData.DoorLockLocalUserId = curDoorLockUser.DoorLockLocalUserId;
                  deleteDoorLockData.PrimaryId = curDoorLockUser.Id;
                  deleteDoorLockData.DelDoorLockDelType = 2;
                  var result = await ZigBee.Device.DoorLock.SendDoorLockToServer("DoorLock/DelDoorLock", deleteDoorLockData);
                }
              }
            }
            doorLock.ReSave();
          }
        }
        return doorLock.localDoorLockUserList;
      }));
    }
    /// <summary>
    ///  获取当前账户中门锁信息
    /// </summary>
    public static async System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>> GetLocaDoorLocklist(ZigBee.Device.DoorLock doorLock, Shared.Phone.UserCenter.MemberInfoRes curAccountObj)
    {
      return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>>>)(async () =>
      {
              //读取设备中的信息
              doorLock.localDoorLockUserList.Clear();
        var getDoorLockInfo = await doorLock.GetDoorlockUserInfoAsync();
        if (getDoorLockInfo == null)
        {
          doorLock.IsFailedToGetDoorLockInfo[curAccountObj.SubAccountDistributedMark] = true;
        }
        else
        {
          doorLock.IsFailedToGetDoorLockInfo[curAccountObj.SubAccountDistributedMark] = false;
          if (getDoorLockInfo != null && getDoorLockInfo.doorLockUserDetailData != null)
          {
            var dataList = getDoorLockInfo.doorLockUserDetailData.UserObjList;
            foreach (var doorData in dataList)
            {
              var localDoorLockObj1 = new ZigBee.Device.DoorLock.LocaDoorLockObj()
              {
                UserID = doorData.UserId,
                UnlockType = doorData.UserType
              };
              if ((doorLock.localDoorLockUserList.ContainsKey(localDoorLockObj1.UserID)) == false)
              {
                doorLock.localDoorLockUserList.Add(localDoorLockObj1.UserID, localDoorLockObj1);
              }
            }
          }
                //  读取云端门锁设备中的信息
                var getDoorLockInfoAllList = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetDoorLockAllInfolist(doorLock, curAccountObj.SubAccountDistributedMark);
          if (getDoorLockInfoAllList.Count != 0)
          {
            foreach (var getDoorLockInfoList in getDoorLockInfoAllList)
            {
              if (getDoorLockInfoList != null)
              {
                foreach (var curDoorLockUser in getDoorLockInfoList.PageData)
                {
                  if (string.IsNullOrEmpty(curDoorLockUser.DoorLockLocalUserId))
                  {
                    continue;
                  }
                  if (doorLock.localDoorLockUserList.ContainsKey(int.Parse(curDoorLockUser.DoorLockLocalUserId)))
                  {
                    var doorLockObj = new ZigBee.Device.DoorLock.LocaDoorLockObj() { };
                    doorLockObj.UserID = int.Parse(curDoorLockUser.DoorLockLocalUserId);
                    doorLockObj.UnlockType = curDoorLockUser.OpenLockMode;
                    doorLockObj.PrimaryId = curDoorLockUser.Id;
                    doorLockObj.EntryTime = curDoorLockUser.EntryTime;
                    doorLockObj.UserName = curDoorLockUser.UserIdRemarks;
                    doorLockObj.ConnectedAccount = curDoorLockUser.CloudAccountId;
                    doorLock.localDoorLockUserList[int.Parse(curDoorLockUser.DoorLockLocalUserId)] = doorLockObj;
                  }
                  else
                  {
                    if (curDoorLockUser.DoorLockLocalUserId != null)
                    {
                            //门锁中没有,云端有用户ID,后台删除云端这些ID
                            var deleteDoorLockData = new ZigBee.Device.DoorLock.DeleteDoorLockData();
                      if (UserCenterResourse.UserInfo.AuthorityNo != 1)
                      {
                        deleteDoorLockData.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
                        deleteDoorLockData.IsOtherAccountCtrl = true;
                      }
                      if (doorLock.DeviceAddr != null)
                      {
                        deleteDoorLockData.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
                      }
                      deleteDoorLockData.DoorLockLocalUserId = curDoorLockUser.DoorLockLocalUserId;
                      deleteDoorLockData.PrimaryId = curDoorLockUser.Id;
                      deleteDoorLockData.DelDoorLockDelType = 2;
                      var result = await ZigBee.Device.DoorLock.SendDoorLockToServer("DoorLock/DelDoorLock", deleteDoorLockData);
                    }
                  }
                }
                doorLock.ReSave();
              }
            }
          }
        }
        return doorLock.localDoorLockUserList;
      }));
    }
    /// <summary>
    ///  获取当前账户中云端存储的门锁信息
    /// </summary>
    public static async System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>> GetCloudLocalDoorLocklist(ZigBee.Device.DoorLock doorLock, string subAccountDistributedMark)
    {
      return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>>>)(async () =>
      {
        var getDoorLockInfoAllList = new List<ZigBee.Device.DoorLock.CloudDoorLockObj> { };
              //  读取云端门锁设备中的信息
              var localDoorLockObj = new ZigBee.Device.DoorLock.GetDoorLockData() { };
        if (UserCenterResourse.UserInfo.AuthorityNo != 1)
        {
          localDoorLockObj.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
          localDoorLockObj.IsOtherAccountCtrl = true;
        }
        localDoorLockObj.CloudAccountId = subAccountDistributedMark;
        if (doorLock.DeviceAddr != null)
        {
          localDoorLockObj.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
        }
        var getDoorLockInfoList = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
        if (getDoorLockInfoList != null)
        {
          if (getDoorLockInfoList.PageData.Count != 0)
          {
            getDoorLockInfoAllList = getDoorLockInfoList.PageData;
          }
        }
        if (getDoorLockInfoList.TotalPages > 1)
        {
          for (int j = 1; j < getDoorLockInfoList.TotalPages; j++)
          {
            var pageSetting = new ZigBee.Device.DoorLock.PageSetting() { };
            pageSetting.Page = j + 1;
            localDoorLockObj.pageSetting = pageSetting;
            var getDoorLockInfoListTemp = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
            if (getDoorLockInfoListTemp != null)
            {
              if (getDoorLockInfoListTemp.PageData.Count != 0)
              {
                foreach (var curDoorLockUser in getDoorLockInfoListTemp.PageData)
                {
                  getDoorLockInfoAllList.Add(curDoorLockUser);
                }
              }
            }
          }
        }
        if (getDoorLockInfoAllList.Count != 0)
        {
          foreach (var curDoorLockUser in getDoorLockInfoAllList)
          {
            if (string.IsNullOrEmpty(curDoorLockUser.DoorLockLocalUserId))
            {
              continue;
            }
            if (doorLock.localDoorLockUserList.ContainsKey(int.Parse(curDoorLockUser.DoorLockLocalUserId)))
            {
              var doorLockObj = new ZigBee.Device.DoorLock.LocaDoorLockObj() { };
              doorLockObj.UserID = int.Parse(curDoorLockUser.DoorLockLocalUserId);
              doorLockObj.UnlockType = curDoorLockUser.OpenLockMode;
              doorLockObj.PrimaryId = curDoorLockUser.Id;
              doorLockObj.EntryTime = curDoorLockUser.EntryTime;
              doorLockObj.UserName = curDoorLockUser.UserIdRemarks;
              doorLockObj.ConnectedAccount = curDoorLockUser.CloudAccountId;
              doorLock.localDoorLockUserList[int.Parse(curDoorLockUser.DoorLockLocalUserId)] = doorLockObj;
            }
          }
          doorLock.ReSave();
        }
        return doorLock.localDoorLockUserList;
      }));
    }
    /// <summary>
    ///  获取云端存储的当前账户的门锁信
    /// </summary>
    public static async System.Threading.Tasks.Task<List<ZigBee.Device.DoorLock.CloudDoorLockObj>> GetAccountDoorLockUserList(ZigBee.Device.DoorLock doorLock, string subAccountDistributedMark)
    {
      List<ZigBee.Device.DoorLock.CloudDoorLockObj> curAccountDoorLockUserList = new List<ZigBee.Device.DoorLock.CloudDoorLockObj> { };
      return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<List<ZigBee.Device.DoorLock.CloudDoorLockObj>>>)(async () =>
      {
              //  读取云端门锁设备中的信息
              var getAllDoorLockInfoList = await Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetDoorLockAllInfolist(doorLock, subAccountDistributedMark);
        if (getAllDoorLockInfoList != null)
        {
          foreach (var getDoorLockInfoList in getAllDoorLockInfoList)
          {
                  //获取云端存储的门锁成员信息
                  foreach (var curDoorLockUser in getDoorLockInfoList.PageData)
            {
              if (string.IsNullOrEmpty(curDoorLockUser.CloudAccountId) || curDoorLockUser.CloudAccountId != subAccountDistributedMark)
              {
                continue;
              }
              else
              {
                curAccountDoorLockUserList.Add(curDoorLockUser);
              }
            }
          }
        }
        return curAccountDoorLockUserList;
      }));
    }
    /// <summary>
    ///  获取当前账户门锁的所有信息
    /// </summary>
    public static async System.Threading.Tasks.Task<List<ZigBee.Device.DoorLock.GetDoorLockDataRes>> GetDoorLockAllInfolist(ZigBee.Device.DoorLock doorLock, string subAccountDistributedMark)
    {
      return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<List<ZigBee.Device.DoorLock.GetDoorLockDataRes>>>)(async () =>
      {
        var getDoorLockInfoAllList = new List<ZigBee.Device.DoorLock.GetDoorLockDataRes> { };
              //  读取云端门锁设备中的信息
              var localDoorLockObj = new ZigBee.Device.DoorLock.GetDoorLockData() { };
        if (UserCenterResourse.UserInfo.AuthorityNo != 1)
        {
          localDoorLockObj.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
          localDoorLockObj.IsOtherAccountCtrl = true;
        }
        localDoorLockObj.CloudAccountId = subAccountDistributedMark;
        if (doorLock.DeviceAddr != null)
        {
          localDoorLockObj.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
        }
        var getDoorLockInfoList = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
        if (getDoorLockInfoList == null)
        {
          getDoorLockInfoAllList = null;
        }
        else
        {
          if (getDoorLockInfoList != null)
          {
            if (getDoorLockInfoList.PageData.Count != 0)
            {
              getDoorLockInfoAllList.Add(getDoorLockInfoList);
            }
          }
          if (getDoorLockInfoList.TotalPages > 1)
          {
            for (int j = 1; j < getDoorLockInfoList.TotalPages; j++)
            {
              var pageSetting = new ZigBee.Device.DoorLock.PageSetting() { };
              pageSetting.Page = j + 1;
              localDoorLockObj.pageSetting = pageSetting;
              var getDoorLockInfoListTemp = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
              if (getDoorLockInfoListTemp != null)
              {
                getDoorLockInfoAllList.Add(getDoorLockInfoListTemp);
              }
            }
          }
        }
        return getDoorLockInfoAllList;
      }));
    }
    /// <summary>
    ///  获取当前账户门锁的所有信息
    /// </summary>
    public static async System.Threading.Tasks.Task<ZigBee.Device.DoorLock.GetDoorLockDataRes> GetDoorLockAllAccountInfolist(ZigBee.Device.DoorLock doorLock, int curPage = 1)
    {
      return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<ZigBee.Device.DoorLock.GetDoorLockDataRes>>)(async () =>
      {
              //  读取云端门锁设备中的信息
              var localDoorLockObj = new ZigBee.Device.DoorLock.GetDoorLockData() { };
        if (UserCenterResourse.UserInfo.AuthorityNo != 1)
        {
          localDoorLockObj.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
          localDoorLockObj.IsOtherAccountCtrl = true;
        }
        if (doorLock.DeviceAddr != null)
        {
          localDoorLockObj.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
        }
        var pageSetting = new ZigBee.Device.DoorLock.PageSetting() { };
        pageSetting.Page = curPage;
        localDoorLockObj.pageSetting = pageSetting;
        var getDoorLockInfoList = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
        return getDoorLockInfoList;
      }));
    }
    /// <summary>
    ///  获取云端存储的门锁成员信息
    /// </summary>
    //public static async System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>> GetLocaDoorLockAccountlist(ZigBee.Device.DoorLock doorLock, Shared.Phone.UserCenter.MemberInfoRes curAccountObj, int curPage)
    //{
    //    return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>>>)(async () =>
    //    {
    //        //  读取云端门锁设备中的信息
    //        var localDoorLockObj = new ZigBee.Device.DoorLock.GetDoorLockData() { };
    //        if (UserCenterResourse.UserInfo.AuthorityNo != 1)
    //        {
    //            localDoorLockObj.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
    //            localDoorLockObj.IsOtherAccountCtrl = true;
    //        }
    //        localDoorLockObj.CloudAccountId = curAccountObj.SubAccountDistributedMark;
    //        {
    //            localDoorLockObj.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
    //        }
    //        if (doorLock.DeviceAddr != null)
    //        {
    //            localDoorLockObj.DoorLockId = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
    //        }
    //        var pageSetting = new ZigBee.Device.DoorLock.PageSetting() { };
    //        pageSetting.Page = curPage;
    //        localDoorLockObj.pageSetting = pageSetting;
    //        var getDoorLockInfoList = await ZigBee.Device.DoorLock.GetDoorLockInfoFromServer("DoorLock/GetDoorLockPager", localDoorLockObj);
    //        if (getDoorLockInfoList != null)
    //        {
    //            foreach (var curDoorLockUser in getDoorLockInfoList.PageData)
    //            {
    //                var doorLockObj = new ZigBee.Device.DoorLock.LocaDoorLockObj() { };
    //                if (curDoorLockUser.DoorLockLocalUserId != null)
    //                {
    //                    doorLockObj.UserID = int.Parse(curDoorLockUser.DoorLockLocalUserId);
    //                    doorLockObj.UnlockType = curDoorLockUser.OpenLockMode;
    //                    doorLockObj.UserName = curDoorLockUser.UserIdRemarks;
    //                }
    //                doorLockObj.PrimaryId = curDoorLockUser.Id;
    //                doorLockObj.EntryTime = curDoorLockUser.EntryTime;
    //                doorLockObj.ConnectedAccount = curDoorLockUser.CloudAccountId;
    //                if (doorLock.localDoorLockAccountList.ContainsKey(curDoorLockUser.CloudAccountId) == false)
    //                {
    //                    doorLock.localDoorLockAccountList.Add(doorLockObj.ConnectedAccount, doorLockObj);
    //                }
    //                else
    //                {
    //                    doorLock.localDoorLockAccountList[curDoorLockUser.DoorLockLocalUserId] = doorLockObj;
    //                }
    //            }
    //        }
    //        return doorLock.localDoorLockUserList;
    //    }));
    //}
    /// <summary>
    ///  获取本地匹配成员的门锁用户信息列表
    /// </summary>
    //public static async System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>> GetMatchDoorlockAccountList(ZigBee.Device.DoorLock doorLock, Shared.Phone.UserCenter.MemberInfoRes curAccountObj)
    //{
    //    return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<Dictionary<int, LocaDoorLockObj>>>)(async () =>
    //    {
    //        var curAccountDoorLockUserList = new Dictionary<int, ZigBee.Device.DoorLock.LocaDoorLockObj>();
    //        foreach (var curUserId in doorLock.localDoorLockAccountList.Keys)
    //        {
    //            var curDoorLockUser = doorLock.localDoorLockAccountList[curUserId];
    //            if (string.IsNullOrEmpty(curDoorLockUser.ConnectedAccount) || curDoorLockUser.ConnectedAccount != curAccountObj.SubAccountDistributedMark)
    //            {
    //                continue;
    //            }
    //            else
    //            {
    //                curAccountDoorLockUserList.Add(curDoorLockUser.UserID, curDoorLockUser);
    //            }
    //        }
    //        return curAccountDoorLockUserList;
    //    }));
    //}
    /// <summary>
    /// 生成6位临时密码
    /// </summary>
    /// <returns></returns>
    public static string GetTempPassword()
    {
      string password = "";
      password = new Random().Next(100000, 999999).ToString();
      return password;
    }
    //// <summary>
    /// 取得某月的最后一天
    /// </summary>
    /// <param name="datetime">要取得月份最后一天的时间</param>
    /// <returns></returns>
    public static DateTime LastDayOfMonth(DateTime datetime)
    {
      return datetime.AddDays(1 - datetime.Day).AddMonths(1).AddDays(-1);
    }
    /// <summary>
    /// 将UNIX时间戳转换成系统时间(精确到秒)
    /// <returns></returns>
    public static DateTime GetLocalTime(int unixTimeStamp)
    {
      DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
      long lTime = long.Parse(unixTimeStamp + "0000000");
      TimeSpan toNow = new TimeSpan(lTime);
      DateTime dtResult = dtStart.Add(toNow);
      return dtResult;
    }
    /// <summary>
    /// 将系统时间转换成UNIX时间戳(精确到秒)
    /// <param name="dateTime">北京时间</param>
    /// <param name="accurateToMilliseconds">精确到毫秒,否到秒</param>
    /// </summary>
    /// <param name="dateTime"></param>
    /// <returns>返回一个长整数时间戳</returns>
    public static string GetUnixTimeStamp(DateTime dateTime)
    {
      DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
      TimeSpan toNow = dateTime.Subtract(dtStart);
      string timeStamp = toNow.Ticks.ToString();
      timeStamp = timeStamp.Substring(0, timeStamp.Length - 7);
      return timeStamp;
    }
    /// <summary>
    /// 获取时区的时间
    /// </summary>
    /// <returns></returns>
    public static DateTime GetDoorLockZoneTime()
    {
      //通过经度获取时区
      var gwZone = int.Parse(CaculateTimeZone(Common.Config.Instance.Home.Longitude));
      //将本地时间转换成世界时
      var utc = DateTime.Now.AddHours(-gwZone);
      //世界时转换成时间戳
      var utcUnix = GetUnixTimeStamp(utc);
      //时区的时间戳
      var zoneUnix = int.Parse(utcUnix) + gwZone * 3600;
      var zoneDateTime = GetLocalTime(zoneUnix);
      DoorlockZoneTime = zoneDateTime;
      return zoneDateTime;
    }
    /// <summary>
    ///  获取时区
    /// </summary>
    /// <param name="currentLon">currentLon:"+"为东区,“-”为西区</param>
    /// <returns></returns>
    public static String CaculateTimeZone(double currentLon)
    {
      int timeZone;
      int shangValue = (int)(currentLon / 15);
      double yushuValue = Math.Abs(currentLon % 15);
      if (yushuValue <= 7.5)
      {
        timeZone = shangValue;
      }
      else
      {
        timeZone = shangValue + (currentLon > 0 ? 1 : -1);
      }
      return timeZone >= 0 ? "+" + Math.Abs(timeZone) : "-" + Math.Abs(timeZone);
    }
    /// <summary>
    /// 门锁编程事件通知
    /// </summary>
    [System.Serializable]
    public class LocaDoorLockObj
    {
      /// <summary>
      /// 用户id
      /// <para>管理员10个,0~9,</para>       ///<para>普通用户220个,10~234</para>       ///<para>一次性用户10个,235~245</para>       ///<para>临时密码密码10个,245~255,</para>       ///<para>其中指纹100,密码100,卡56</para>
      ///<para>门锁本地录入的密码、指纹、感应卡都有唯一对应的用户Id</para>
      /// </summary>
      public int UserID = -1;
      /// <summary>
      /// 开锁类型
      /// <para>常用:</para>
      /// <para>0:Keypad(键盘/密码);3:RFID(射频卡);15:指纹</para>
      /// <para>不常用:
      /// <para>1:RF(Zigbee无线);2:Manual(手动);255:Indeterminate(不确定)</para>
      /// </summary>
      public int UnlockType;
      /// <summary>
      ///  关联账户的ID
      /// </summary>
      public string ConnectedAccount = string.Empty;
      /// <summary>
      ///  门锁用户名
      /// </summary>
      public string UserName = string.Empty;
      /// <summary>
      /// 门锁录入的时
      /// </summary>
      public DateTime EntryTime = System.DateTime.MinValue;
      /// <summary>
      /// PrimaryId 门锁云端主 键(非更新字段,以下均为更新字段) -->键名 : PrimaryId默认值: null
      /// </summary>
      public string PrimaryId = "";
    }
    #endregion
    #region 一般方法
    /// <summary>
    /// 显示错误信息窗口
    /// </summary>
    /// <param name="msg"></param>
    private static void ShowErrorMsg(string msg)
    {
      Application.RunOnMainThread(() =>
      {
        var contr = new ShowMsgControl(ShowMsgType.Error, msg);
        contr.Show();
      });
    }
    /// <summary>
    /// 显示Tip信息窗口
    /// </summary>
    /// <param name="msg"></param>
    private static void ShowTipMsg(string msg)
    {
      Application.RunOnMainThread(() =>
      {
        var contr = new ShowMsgControl(ShowMsgType.Tip, msg);
        contr.Show();
      });
    }
    #endregion
  }
}