黄学彪
2020-04-13 3793a9a38ac6c4c4111c2bba3a35a71c30601e82
ZigbeeApp/Shared/Phone/UserCenter/Device/DoorLock/DoorLockHistoryLogForm.cs
@@ -34,13 +34,17 @@
        /// </summary>
        private CommonDevice DeviceDoor = null;
        /// <summary>
        /// 检索对象的ID(-1:所有 空字符串:其他)
        /// 检索对象的ID(-1:所有 -9999:其他)
        /// </summary>
        private List<string> listSearchUserId = new List<string>() { "-1" };
        /// <summary>
        /// 检索开锁方式的ID(-1:所有 0:密码 15:指纹 3:IC卡)
        /// 检索开锁方式的ID(-1:所有 0:密码 15:指纹 3:IC卡 9000:常开模式(自定义的))
        /// </summary>
        private List<int> listSearchLockId = new List<int>() { -1 };
        /// <summary>
        /// 获取到的历史记录
        /// </summary>
        private List<HistoryInfo> listHistoryInfo = null;
        /// <summary>
        /// 其他消息的主键,它存在另外的一张数据库表中
        /// </summary>
@@ -109,7 +113,7 @@
            this.InitTitleSearchControl();
            //初始化记录列表
            this.InitLogListInfo();
            this.InitLogListInfo(true);
        }
        /// <summary>
@@ -134,37 +138,38 @@
            dateFromControl.DateSelectEvent += (dateValue) =>
            {
                //初始化记录列表
                this.InitLogListInfo();
                this.InitLogListInfo(true);
            };
            var btnTemp = new NormalViewControl(26, 58, true);
            btnTemp.Y = Application.GetRealHeight(29);
            btnTemp.X = Application.GetRealWidth(357);
            btnTemp.X = dateFromControl.Right + Application.GetRealWidth(12);
            btnTemp.TextColor = UserCenterColor.Current.TextGrayColor1;
            btnTemp.Text = "-";
            frameTitle.AddChidren(btnTemp, ChidrenBindMode.NotBind);
            dateToControl = new DateSelectControl(Language.StringByID(R.MyInternationalizationString.uEndDate));
            dateToControl.Y = Application.GetRealHeight(35);
            dateToControl.X = Application.GetRealWidth(395);
            dateToControl.X = btnTemp.Right + Application.GetRealWidth(12);
            dateToControl.dateValue = DateTime.Now.ToString("yyyyMMdd");
            frameTitle.AddChidren(dateToControl, ChidrenBindMode.NotBind);
            dateToControl.DateSelectEvent += (dateValue) =>
            {
                //初始化记录列表
                this.InitLogListInfo();
                this.InitLogListInfo(true);
            };
            //类型筛选
            var btnScreening = frameTitle.AddMostRightView(Language.StringByID(R.MyInternationalizationString.uScreeningType), 145);
            frameTitle.ChangedChidrenBindMode(btnScreening, ChidrenBindMode.NotBind);
            btnScreening.TextSize = 12;
            btnScreening.Width = btnScreening.GetRealWidthByText();
            btnScreening.X = frameTitle.Width - Application.GetRealWidth(58) - btnScreening.Width;
            btnScreening.ButtonClickEvent += (sender, e) =>
            {
                //显示类型筛选界面
                this.ShowDoorLockScreeningTypeForm();
            };
            frameTitle.ChangedChidrenBindMode(btnScreening, ChidrenBindMode.NotBind);
            //类型筛选的图标
            var btnScreeningIcon = new IconViewControl(69);
            btnScreeningIcon.X = btnScreening.X - Application.GetRealWidth(12) - btnScreeningIcon.IconSize;
@@ -188,7 +193,7 @@
            listView.BeginHeaderRefreshingAction += () =>
            {
                //下拉刷新
                this.InitLogListInfo();
                this.InitLogListInfo(true);
            };
        }
@@ -199,7 +204,8 @@
        /// <summary>
        /// 初始化记录列表
        /// </summary>
        private void InitLogListInfo()
        /// <param name="reReadData">是否从新从云端读取数据</param>
        private void InitLogListInfo(bool reReadData)
        {
            this.listView.frameTable.RemoveAll();
            listView.frameTable.Height = bodyFrameLayout.Height - Application.GetRealHeight(115 - 3);
@@ -211,6 +217,12 @@
                this.ShowMassage(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.uFromTimeIsOverToTime));
                return;
            }
            if (reReadData == true)
            {
                //置空后,重新获取
                this.listHistoryInfo = null;
            }
            HdlThreadLogic.Current.RunThread(async () =>
            {
                //打开进度条
@@ -223,8 +235,14 @@
                    this.CloseProgressBar(ShowReLoadMode.YES);
                    return;
                }
                //成员信息
                var dicMemberName = new Dictionary<string, string>();
                for (int i = 0; i < listMenberInfo.Count; i++)
                {
                    dicMemberName.Add(listMenberInfo[i].SubAccountDistributedMark, string.IsNullOrEmpty(listMenberInfo[i].UserName) == false ? listMenberInfo[i].UserName : listMenberInfo[i].Account);
                }
                //历史记录
                var historyLog = await this.GetHistoryLogInfo();
                var historyLog = await this.GetHistoryLogInfo(dicMemberName);
                if (historyLog == null)
                {
                    //关闭进度条
@@ -234,17 +252,12 @@
                //关闭进度条
                this.CloseProgressBar();
                var dic = new Dictionary<string, string>();
                for (int i = 0; i < listMenberInfo.Count; i++)
                {
                    dic.Add(listMenberInfo[i].SubAccountDistributedMark, string.IsNullOrEmpty(listMenberInfo[i].UserName) == false ? listMenberInfo[i].UserName : listMenberInfo[i].Account);
                }
                HdlThreadLogic.Current.RunMain(() =>
                {
                    for (int i = 0; i < historyLog.Count; i++)
                    {
                        //添加记录行
                        this.AddLogInfoRow(historyLog[i], dic, i != historyLog.Count - 1);
                        this.AddLogInfoRow(historyLog[i], dicMemberName, i != historyLog.Count - 1);
                    }
                    //隐藏下拉刷新特效
                    listView.EndHeaderRefreshing();
@@ -335,6 +348,10 @@
                    Common.LocalDevice.Current.SetDeviceIconToControl(btnIcon, device);
                }
            }
            else if (historyInfo.OpenLockMode == 9000)
            {
                btnIcon.UnSelectedImagePath = "Item/NormallyOpen.png";
            }
            else if (historyInfo.UnlockIsSuccess == true)
            {
                btnIcon.UnSelectedImagePath = "Item/UnLockSuccess.png";
@@ -346,7 +363,7 @@
            //信息
            var btnMsg = frameTable.AddTopView("", 600);
            if (historyInfo.OpenLockMode == -1)
            if (historyInfo.OpenLockMode == -1 || historyInfo.OpenLockMode == 9000)
            {
                //其他消息
                btnMsg.Text = historyInfo.AlarmMsg;
@@ -435,7 +452,7 @@
                listSearchLockId.Clear();
                listSearchLockId.AddRange(selectLock);
                //初始化记录列表
                this.InitLogListInfo();
                this.InitLogListInfo(false);
            };
        }
@@ -447,24 +464,18 @@
        /// 获取历史记录
        /// </summary>
        /// <returns></returns>
        private async Task<List<HistoryInfo>> GetHistoryLogInfo()
        private async Task<List<HistoryInfo>> GetHistoryLogInfo(Dictionary<string, string> dicMemberName)
        {
            //获取访问云端接口的启动参数
            var pra = this.GetDbInterfacePra();
            //清空上一次的其他ID
            this.listOtherMsgId = new List<string>();
            this.listOtherUserId = new List<string>();
            //全部成员信息
            var dicMemberName = new Dictionary<string, string>();
            for (int i = 0; i < listMenberInfo.Count; i++)
            if (this.listHistoryInfo != null)
            {
                dicMemberName.Add(listMenberInfo[i].SubAccountDistributedMark, string.IsNullOrEmpty(listMenberInfo[i].UserName) == false ? listMenberInfo[i].UserName : listMenberInfo[i].Account);
                //不二次获取,主要针对的是筛选功能
                return this.ScreeningHistoryData(dicMemberName);
            }
            //获取访问云端接口的启动参数
            var pra = this.GetReadHistoryPra();
            //获取门锁的打开和关闭记录
            var listAllLog = await this.GetDoorOpenHistoryLog(pra, dicMemberName);
            var listAllLog = await this.GetDoorOpenHistoryLog(pra);
            //获取门锁的其他记录
            var listOtherLog = await this.GetDoorOtherHistoryLog(pra.UnlockTimeBegin, pra.UnlockTimeEnd);
            listAllLog.AddRange(listOtherLog);
@@ -472,19 +483,9 @@
            //排序一下
            var dicAllData = new Dictionary<string, List<HistoryInfo>>();
            var listSortTime = new List<string>();
            //是否包含其他
            bool getOtherFlage = this.listSearchUserId.Contains("");
            foreach (var data in listAllLog)
            {
                //如果单独指定有该账号,可以显示
                if (this.listSearchUserId.Contains(data.CloudAccountId) == false)
                {
                    //如果这个账号没有指定,并且指定显示其他的话,并且无法识别这个用户ID才显示
                    if (getOtherFlage == true && dicMemberName.ContainsKey(data.CloudAccountId) == true)
                    {
                        continue;
                    }
                }
                //按时间分组
                if (dicAllData.ContainsKey(data.UnlockTime) == false)
                {
@@ -496,13 +497,13 @@
            //执行排序,时间大的在前面
            listSortTime.Sort();
            var listSortLog = new List<HistoryInfo>();
            this.listHistoryInfo = new List<HistoryInfo>();
            for (int i = listSortTime.Count - 1; i >= 0; i--)
            {
                listSortLog.AddRange(dicAllData[listSortTime[i]]);
                this.listHistoryInfo.AddRange(dicAllData[listSortTime[i]]);
            }
            return listSortLog;
            //筛选历史记录
            return this.ScreeningHistoryData(dicMemberName);
        }
        /// <summary>
@@ -510,7 +511,7 @@
        /// </summary>
        /// <param name="i_pra"></param>
        /// <returns></returns>
        private async Task<List<HistoryInfo>> GetDoorOpenHistoryLog(GetHistoryDataPra i_pra, Dictionary<string, string> dicMemberName)
        private async Task<List<HistoryInfo>> GetDoorOpenHistoryLog(GetHistoryDataPra i_pra)
        {
            var listLog = new List<HistoryInfo>();
@@ -524,16 +525,7 @@
                    return null;
                }
                var dataInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<GetHistoryDataResult>(result);
                foreach (var data in dataInfo.PageData)
                {
                    if (dicMemberName.ContainsKey(data.CloudAccountId) == false
                        && this.listOtherUserId.Contains(data.CloudAccountId) == false)
                    {
                        //收集无法识别的用户ID
                        this.listOtherUserId.Add(data.CloudAccountId);
                    }
                    listLog.Add(data);
                }
                listLog.AddRange(dataInfo.PageData);
                if (dataInfo.HasNextPage == false)
                {
@@ -555,50 +547,154 @@
        {
            var listLog = new List<HistoryInfo>();
            //是否包含其他
            bool getOtherFlage = this.listSearchUserId.Contains("") || this.listSearchUserId.Contains("-1");
            if (getOtherFlage == true)
            //去获取其他信息
            var pra2 = new MessageInfoPra();
            pra2.BeginTime = beginTime;
            pra2.EndTime = endTime;
            pra2.Topic = "/Alarms/SendAlarmInform";
            pra2.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
            var result = await UserCenterLogic.GetResponseDataByRequestHttps("MessageCenter/GetMessageCenterPagger", true, pra2);
            if (result == null)
            {
                //去获取其他信息
                var pra2 = new MessageInfoPra();
                pra2.BeginTime = beginTime;
                pra2.EndTime = endTime;
                pra2.Topic = "/Alarms/SendAlarmInform";
                pra2.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
                var result = await UserCenterLogic.GetResponseDataByRequestHttps("MessageCenter/GetMessageCenterPagger", true, pra2);
                if (result == null)
                return null;
            }
            var dataInfo2 = Newtonsoft.Json.JsonConvert.DeserializeObject<MessageCentetInfo>(result);
            string doorKey = this.DeviceDoor.DeviceAddr + "_" + this.DeviceDoor.DeviceEpoint;
            foreach (var myInfo in dataInfo2.PageData)
            {
                //设备对象
                var jobject = Newtonsoft.Json.Linq.JObject.Parse(myInfo.PayloadJson);
                string deviceAddr = jobject.Value<string>("DeviceAddr");
                int deviceEpoint = jobject.Value<int>("Epoint");
                if (doorKey != deviceAddr + "_" + deviceEpoint)
                {
                    return null;
                    //不是同一个门锁的记录
                    continue;
                }
                var dataInfo2 = Newtonsoft.Json.JsonConvert.DeserializeObject<MessageCentetInfo>(result);
                string doorKey = this.DeviceDoor.DeviceAddr + "_" + this.DeviceDoor.DeviceEpoint;
                foreach (var myInfo in dataInfo2.PageData)
                var data = new HistoryInfo();
                data.DeviceMac = deviceAddr;
                data.DeviceEpoint = deviceEpoint;
                //消息
                var msgInfo = HdlAlarmsLogic.Current.GetDoorLockAlarmInfo(jobject);
                data.AlarmMsg = msgInfo != null ? msgInfo.AlarmMsg : Language.StringByID(R.MyInternationalizationString.uDoorLocksAlarmHadTriggered);
                //时间
                data.UnlockTime = myInfo.CreatedOnUtc;
                //主键
                data.MsgKeyId = myInfo.Id;
                //消息区分
                if (msgInfo.MsgDiv == 9000)
                {
                    //设备对象
                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(myInfo.PayloadJson);
                    string deviceAddr = jobject.Value<string>("DeviceAddr");
                    int deviceEpoint = jobject.Value<int>("Epoint");
                    if (doorKey != deviceAddr + "_" + deviceEpoint)
                    {
                        //不是同一个门锁的记录
                        continue;
                    }
                    var data = new HistoryInfo();
                    data.DeviceMac = deviceAddr;
                    data.DeviceEpoint = deviceEpoint;
                    //消息
                    var msgInfo = HdlAlarmsLogic.Current.GetDoorLockAlarmInfo(jobject);
                    data.AlarmMsg = msgInfo != null ? msgInfo.AlarmMsg : Language.StringByID(R.MyInternationalizationString.uDoorLocksAlarmHadTriggered);
                    //时间
                    data.UnlockTime = myInfo.CreatedOnUtc;
                    listLog.Add(data);
                    this.listOtherMsgId.Add(myInfo.Id);
                    data.OpenLockMode = 9000;
                }
                listLog.Add(data);
            }
            return listLog;
        }
        #endregion
        #region ■ 筛选记录___________________________
        /// <summary>
        /// 筛选历史记录
        /// </summary>
        /// <returns></returns>
        private List<HistoryInfo> ScreeningHistoryData(Dictionary<string, string> dicMemberName)
        {
            //历史记录太麻烦了,存在不同的数据库表里,并且数据还不一样,只能这样一个个判断了
            var listScreeningData = new List<HistoryInfo>();
            //清除掉之前的记录
            this.listOtherUserId = new List<string>();
            this.listOtherMsgId = new List<string>();
            //是否选择全选用户
            bool selectAllUser = this.listSearchUserId.Contains("-1");
            //是否单选了其他
            bool selectOtherUser = this.listSearchUserId.Contains("-9999");
            //是否选择全选开锁方式
            bool selectAllLockMode = this.listSearchLockId.Contains(-1);
            //一个个去遍历
            foreach (var data in this.listHistoryInfo)
            {
                //检测该历史记录能否显示
                bool result = this.CheckHistoryDataCanShow(data, dicMemberName, selectAllUser, selectOtherUser, selectAllLockMode);
                if (result == true)
                {
                    listScreeningData.Add(data);
                }
            }
            return listScreeningData;
        }
        /// <summary>
        /// 检测该历史记录能否显示
        /// </summary>
        /// <param name="info">检测对象</param>
        /// <param name="dicMemberName">成员信息</param>
        /// <param name="selectAllUser">是否选择全选用户</param>
        /// <param name="selectOtherUser">是否单选了其他</param>
        /// <param name="slectAllLockMode">是否选择全选开锁方式</param>
        private bool CheckHistoryDataCanShow(HistoryInfo info, Dictionary<string, string> dicMemberName,
            bool selectAllUser, bool selectOtherUser, bool slectAllLockMode)
        {
            //如果没有选择  全选用户
            if (selectAllUser == false)
            {
                //如果这个用户ID不包含在指定选择的成员列表里面
                if (this.listSearchUserId.Contains(info.CloudAccountId) == false)
                {
                    if (dicMemberName.ContainsKey(info.CloudAccountId) == true)
                    {
                        //如果能够识别这个id的话,则表示它不属于其他类,并且也不再选择目标内
                        return false;
                    }
                    //如果没有选择 其他的话,不显示
                    if (selectOtherUser == false)
                    {
                        return false;
                    }
                }
            }
            //如果是成员身份,并且用户ID不为空
            if (UserCenterResourse.UserInfo.AuthorityNo == 3 && info.CloudAccountId != string.Empty)
            {
                //成员不能看到 其他人的记录(成员的时候,这个变量里面只有他自己一个)
                if (dicMemberName.ContainsKey(info.CloudAccountId) == false)
                {
                    return false;
                }
            }
            //如果没有选择  全选开锁方式
            if (slectAllLockMode == false)
            {
                //如果这个开锁方式不在选择的列表里面的话
                if (this.listSearchLockId.Contains(info.OpenLockMode) == false)
                {
                    return false;
                }
            }
            //另一张表的数据主键
            if (info.OpenLockMode == -1 || info.OpenLockMode == 9000)
            {
                if (info.MsgKeyId != string.Empty)
                {
                    //其他消息的主键,它存在另外的一张数据库表中
                    this.listOtherMsgId.Add(info.MsgKeyId);
                }
            }
            if (info.CloudAccountId != string.Empty && dicMemberName.ContainsKey(info.CloudAccountId) == false
                && this.listOtherUserId.Contains(info.CloudAccountId) == false)
            {
                //无法识别的开锁记录的用户ID(因为那个密码有可能没有分配给成员)
                this.listOtherUserId.Add(info.CloudAccountId);
            }
            return true;
        }
        #endregion
@@ -611,28 +707,10 @@
        private async void ClearAllHistoryLog()
        {
            //获取访问云端接口的启动参数
            var pra = this.GetDbInterfacePra();
            if (listSearchUserId.Contains("") == true)
            {
                //如果指定有其他,则用户ID重新设置
                pra.CloudAccountIdArr = new List<string>();
                pra.CloudAccountIdArr.AddRange(listSearchUserId);
                pra.CloudAccountIdArr.Remove("");
                if (this.listOtherUserId.Count > 0)
                {
                    pra.CloudAccountIdArr.AddRange(listOtherUserId);
                }
                else
                {
                    //这一步很重要,不然有可能单独选择其他的时候
                    //在没有数据的情况下,会清空掉全部的数据
                    pra.CloudAccountIdArr.Add("other");
                }
            }
            var pra = this.GetDeleteDataPra();
            //打开进度条
            this.ShowProgressBar();
            var result = await UserCenterLogic.GetResultStatuByRequestHttps("DoorLock/ClearDoorLockHistory", true, pra);
            if (result == false)
            {
@@ -663,6 +741,9 @@
            //清空
            this.listOtherMsgId = new List<string>();
            this.listOtherUserId = new List<string>();
            this.listHistoryInfo = null;
            HdlThreadLogic.Current.RunMain(() =>
            {
                this.listView.frameTable.RemoveAll();
@@ -678,24 +759,41 @@
        /// 获取访问云端接口的启动参数
        /// </summary>
        /// <returns></returns>
        private GetHistoryDataPra GetDbInterfacePra()
        private GetHistoryDataPra GetReadHistoryPra()
        {
            DateTime dateFrom = new DateTime(dateFromControl.Year, dateFromControl.Month, dateFromControl.Day, 0, 0, 0);
            DateTime dateTo = new DateTime(dateToControl.Year, dateToControl.Month, dateToControl.Day, 23, 59, 59);
            //全部读取
            var pra = new GetHistoryDataPra();
            pra.UnlockTimeBegin = dateFrom.ToUniversalTime().ToString();
            pra.UnlockTimeEnd = dateTo.ToUniversalTime().ToString();
            pra.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
            pra.DoorLockId = this.DeviceDoor.DeviceAddr + "_" + this.DeviceDoor.DeviceEpoint;
            return pra;
        }
        /// <summary>
        /// 获取删除数据的云端接口的启动参数
        /// </summary>
        /// <returns></returns>
        private DeleteHistoryDataPra GetDeleteDataPra()
        {
            DateTime dateFrom = new DateTime(dateFromControl.Year, dateFromControl.Month, dateFromControl.Day, 0, 0, 0);
            DateTime dateTo = new DateTime(dateToControl.Year, dateToControl.Month, dateToControl.Day, 23, 59, 59);
            List<string> listUser = null;
            //一旦指定了其他,则需要全部读取,因为有些开锁,它用的密码并没有分配给成员
            if (listSearchUserId.Contains("-1") == true || listSearchUserId.Contains("") == true)
            //指定用户
            if (listSearchUserId.Contains("-1") == false)
            {
                //全选即为Null
            }
            else
            {
                //指定用户
                listUser = new List<string>();
                listUser.AddRange(listSearchUserId);
                //移除其他,因为云端固定会给
                listUser.Remove("");
                //如果指定有其他
                if (listSearchUserId.Contains("-9999") == true)
                {
                    listUser.AddRange(this.listOtherUserId);
                }
            }
            //全选则为null
@@ -706,13 +804,13 @@
                listLock.AddRange(listSearchLockId);
            }
            var pra = new GetHistoryDataPra();
            var pra = new DeleteHistoryDataPra();
            pra.UnlockTimeBegin = dateFrom.ToUniversalTime().ToString();
            pra.UnlockTimeEnd = dateTo.ToUniversalTime().ToString();
            pra.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
            pra.DoorLockId = this.DeviceDoor.DeviceAddr + "_" + this.DeviceDoor.DeviceEpoint;
            pra.CloudAccountIdArr = listUser;
            pra.OpenLockModeArr = listLock;
            pra.CloudAccountIds = listUser;
            pra.OpenLockModes = listLock;
            return pra;
        }
@@ -784,12 +882,51 @@
        }
        /// <summary>
        /// 删除历史记录数据
        /// </summary>
        private class DeleteHistoryDataPra : IfacePraCommon
        {
            /// <summary>
            /// RequestVersion
            /// </summary>
            public string RequestVersion = Common.CommonPage.RequestVersion;
            /// <summary>
            /// Token
            /// </summary>
            public string LoginAccessToken = string.Empty;
            /// <summary>
            /// 住宅ID
            /// </summary>
            public string HomeId = Common.Config.Instance.Home.Id;
            /// <summary>
            /// 门锁的Mac地址
            /// </summary>
            public string DoorLockId = string.Empty;
            /// <summary>
            ///  Config.Instance.Guid 或者 MemberInfoRes.SubAccountDistributedMark
            /// </summary>
            public List<string> CloudAccountIds = null;
            /// <summary>
            ///  开锁方式(0:密码、15:指纹、3:IC卡)
            /// </summary>
            public List<int> OpenLockModes = null;
            /// <summary>
            /// 搜索开锁开始时间
            /// </summary>
            public string UnlockTimeBegin;
            /// <summary>
            /// 搜索开锁结束时间
            /// </summary>
            public string UnlockTimeEnd;
        }
        /// <summary>
        /// 历史记录的结果
        /// </summary>
        private class HistoryInfo
        {
            /// <summary>
            /// 开锁方式 0:密码  15:指纹  3:IC卡
            /// 开锁方式 0:密码  15:指纹  3:IC卡  9000:常开模式(自定义的)
            /// </summary>
            public int OpenLockMode = -1;
            /// <summary>
@@ -816,6 +953,10 @@
            /// 当开锁方式为-1时使用,设备端点
            /// </summary>
            public int DeviceEpoint = 0;
            /// <summary>
            /// 当开锁方式为-1时使用,消息的数据库主键
            /// </summary>
            public string MsgKeyId = string.Empty;
        }
        #endregion