黄学彪
2020-04-08 4dce704aaf8587cf3f91cf88f2208315a03c4cbb
ZigbeeApp/Shared/Phone/UserCenter/Device/DoorLock/DoorLockHistoryLogForm.cs
@@ -42,9 +42,13 @@
        /// </summary>
        private List<int> listSearchLockId = new List<int>() { -1 };
        /// <summary>
        /// 其他消息的主键
        /// 其他消息的主键,它存在另外的一张数据库表中
        /// </summary>
        private List<string> listOtherId = new List<string>();
        private List<string> listOtherMsgId = new List<string>();
        /// <summary>
        /// 无法识别的开锁记录的用户ID(因为那个密码有可能没有分配给成员)
        /// </summary>
        private List<string> listOtherUserId = new List<string>();
        #endregion
@@ -80,8 +84,11 @@
                    //确认清空当前记录?
                    this.ShowMassage(ShowMsgType.Confirm, Language.StringByID(R.MyInternationalizationString.uConfirmClearNowLog), () =>
                    {
                        //清空所有记录
                        this.ClearAllHistoryLog();
                        HdlThreadLogic.Current.RunThread(() =>
                        {
                            //清空所有记录
                            this.ClearAllHistoryLog();
                        });
                    });
                });
            };
@@ -383,7 +390,7 @@
            //人物
            string perName = dicName.ContainsKey(historyInfo.CloudAccountId) == true ? dicName[historyInfo.CloudAccountId] : Language.StringByID(R.MyInternationalizationString.uOther);
            var btnpersion = frameTable.AddBottomView(perName, 600);
            frameTable.AddBottomView(perName, 600);
            //时间
            if (this.dateFromControl.dateValue == this.dateToControl.dateValue)
@@ -445,40 +452,117 @@
            //获取访问云端接口的启动参数
            var pra = this.GetDbInterfacePra();
            int nowPage = 0;
            //清空上一次的其他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++)
            {
                dicMemberName.Add(listMenberInfo[i].SubAccountDistributedMark, string.IsNullOrEmpty(listMenberInfo[i].UserName) == false ? listMenberInfo[i].UserName : listMenberInfo[i].Account);
            }
            //获取门锁的打开和关闭记录
            var listAllLog = await this.GetDoorOpenHistoryLog(pra, dicMemberName);
            //获取门锁的其他记录
            var listOtherLog = await this.GetDoorOtherHistoryLog(pra.UnlockTimeBegin, pra.UnlockTimeEnd);
            listAllLog.AddRange(listOtherLog);
            //排序一下
            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)
                {
                    dicAllData[data.UnlockTime] = new List<HistoryInfo>();
                    listSortTime.Add(data.UnlockTime);
                }
                dicAllData[data.UnlockTime].Add(data);
            }
            //执行排序,时间大的在前面
            listSortTime.Sort();
            var listSortLog = new List<HistoryInfo>();
            for (int i = listSortTime.Count - 1; i >= 0; i--)
            {
                listSortLog.AddRange(dicAllData[listSortTime[i]]);
            }
            return listSortLog;
        }
        /// <summary>
        /// 获取门锁的打开和关闭记录
        /// </summary>
        /// <param name="i_pra"></param>
        /// <returns></returns>
        private async Task<List<HistoryInfo>> GetDoorOpenHistoryLog(GetHistoryDataPra i_pra, Dictionary<string, string> dicMemberName)
        {
            var listLog = new List<HistoryInfo>();
            int nowPage = 0;
            while (true)
            {
                //访问云端
                var result = await UserCenterLogic.GetResponseDataByRequestHttps("DoorLock/GetDoorLockHistoryPager", true, pra);
                var result = await UserCenterLogic.GetResponseDataByRequestHttps("DoorLock/GetDoorLockHistoryPager", true, i_pra);
                if (result == null)
                {
                    return null;
                }
                var dataInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<GetHistoryDataResult>(result);
                listLog.AddRange(dataInfo.PageData);
                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);
                }
                if (dataInfo.HasNextPage == false)
                {
                    break;
                }
                //获取下一页
                nowPage++;
                pra.PageSetting.Page = nowPage;
                i_pra.PageSetting.Page = nowPage;
            }
            //排序一下
            var dic = new Dictionary<string, List<HistoryInfo>>();
            var listSort = new List<string>();
            //清空上一次的其他ID
            this.listOtherId = new List<string>();
            return listLog;
        }
        /// <summary>
        /// 获取门锁的其他记录
        /// </summary>
        /// <returns></returns>
        private async Task<List<HistoryInfo>> GetDoorOtherHistoryLog(string beginTime, string endTime)
        {
            var listLog = new List<HistoryInfo>();
            //是否包含其他
            bool flage = this.listSearchUserId.Contains("") || this.listSearchUserId.Contains("-1");
            if (flage == true)
            bool getOtherFlage = this.listSearchUserId.Contains("") || this.listSearchUserId.Contains("-1");
            if (getOtherFlage == true)
            {
                //去获取其他信息
                var pra2 = new MessageInfoPra();
                pra2.BeginTime = pra.UnlockTimeBegin;
                pra2.EndTime = pra.UnlockTimeEnd;
                pra2.BeginTime = beginTime;
                pra2.EndTime = endTime;
                pra2.Topic = "/Alarms/SendAlarmInform";
                pra2.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
                var result = await UserCenterLogic.GetResponseDataByRequestHttps("MessageCenter/GetMessageCenterPagger", true, pra2);
@@ -487,53 +571,34 @@
                    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 data = new HistoryInfo();
                    if (dic.ContainsKey(myInfo.CreatedOnUtc) == false)
                    {
                        dic[myInfo.CreatedOnUtc] = new List<HistoryInfo>();
                        listSort.Add(myInfo.CreatedOnUtc);
                    }
                    //设备对象
                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(myInfo.PayloadJson);
                    data.DeviceMac = jobject.Value<string>("DeviceAddr");
                    data.DeviceEpoint = jobject.Value<int>("Epoint");
                    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);
                    dic[myInfo.CreatedOnUtc].Add(data);
                    //时间
                    data.UnlockTime = myInfo.CreatedOnUtc;
                    this.listOtherId.Add(myInfo.Id);
                    listLog.Add(data);
                    this.listOtherMsgId.Add(myInfo.Id);
                }
            }
            foreach (var data in listLog)
            {
                if (flage == false && string.IsNullOrEmpty(data.CloudAccountId) == true)
                {
                    //没有指定显示其他
                    continue;
                }
                if (dic.ContainsKey(data.UnlockTime) == false)
                {
                    dic[data.UnlockTime] = new List<HistoryInfo>();
                    listSort.Add(data.UnlockTime);
                }
                dic[data.UnlockTime].Add(data);
            }
            //执行排序,时间大的在前面
            listSort.Sort();
            var listSortLog = new List<HistoryInfo>();
            for (int i = listSort.Count - 1; i >= 0; i--)
            {
                listSortLog.AddRange(dic[listSort[i]]);
            }
            return listSortLog;
            return listLog;
        }
        #endregion
@@ -547,8 +612,27 @@
        {
            //获取访问云端接口的启动参数
            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");
                }
            }
            //打开进度条
            this.ShowProgressBar();
            var result = await UserCenterLogic.GetResultStatuByRequestHttps("DoorLock/ClearDoorLockHistory", true, pra);
            if (result == false)
            {
@@ -556,13 +640,13 @@
            }
            //删除其他消息
            if (listOtherId.Count > 0)
            if (listOtherMsgId.Count > 0)
            {
                var pra2 = new MessageReadStatuPra();
                pra2.LoginAccessToken = UserCenterLogic.GetConnectMainToken();
                for (int i = 0; i < listOtherId.Count; i++)
                for (int i = 0; i < listOtherMsgId.Count; i++)
                {
                    pra2.Id = listOtherId[i];
                    pra2.Id = listOtherMsgId[i];
                    result = await UserCenterLogic.GetResultStatuByRequestHttps("MessageCenter/DelMessageCenterItem", true, pra2);
                    if (result == false)
                    {
@@ -576,11 +660,14 @@
            {
                return;
            }
            this.listView.frameTable.RemoveAll();
            listView.frameTable.Height = bodyFrameLayout.Height - Application.GetRealHeight(115 - 3);
            //清空
            this.listOtherId = new List<string>();
            this.listOtherMsgId = new List<string>();
            HdlThreadLogic.Current.RunMain(() =>
            {
                this.listView.frameTable.RemoveAll();
                listView.frameTable.Height = bodyFrameLayout.Height - Application.GetRealHeight(115 - 3);
            });
        }
        #endregion
@@ -596,23 +683,16 @@
            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 = new List<string>();
            if (listSearchUserId.Count == 1 && listSearchUserId[0] == "")
            List<string> listUser = null;
            //一旦指定了其他,则需要全部读取,因为有些开锁,它用的密码并没有分配给成员
            if (listSearchUserId.Contains("-1") == true || listSearchUserId.Contains("") == true)
            {
                //如果单纯的只是选择其他,则让检索条件不成立即可
                listUser.Add("其他");
            }
            else if (listSearchUserId.Contains("-1") == true)
            {
                //全选
                for (int i = 0; i < listMenberInfo.Count; i++)
                {
                    listUser.Add(listMenberInfo[i].SubAccountDistributedMark);
                }
                //全选即为Null
            }
            else
            {
                //指定用户
                listUser = new List<string>();
                listUser.AddRange(listSearchUserId);
                //移除其他,因为云端固定会给
                listUser.Remove("");
@@ -627,12 +707,13 @@
            }
            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;
            pra.CloudAccountIdArr = listUser;
            pra.OpenLockModeArr = listLock;
            pra.UnlockTimeBegin = dateFrom.ToUniversalTime().ToString();
            pra.UnlockTimeEnd = dateTo.ToUniversalTime().ToString();
            return pra;
        }