/// <summary> /// 刷新微信公众账号Block模型。刷新意味关重新把所有公众账号中的IsBlocked,修改为false。 /// 以便WXRobot(微信机器人),可以重新尝试这些公众账号。 /// 刷新时,会考虑消息队列新加入的,同时也加入到微信公众账号Block模型中。 /// </summary> /// <param name="wxPublicAccountBlockStatusModel"></param> /// <param name="messageQueues"></param> /// <returns></returns> private static IEnumerable <WXPublicAccountBlockStatusModel> RefreshWXPublicAccountBlockStatusModel(IEnumerable <WXPublicAccountBlockStatusModel> wxPublicAccountBlockStatusModel, IEnumerable <Proc_GetRobotServerMessageQueueForWXRobot_Result> messageQueues) { var wxPublicAccountBlockStatusModelList = wxPublicAccountBlockStatusModel.ToList(); var messageQueuesDistinctList = Common.Lists.ListHandler.DistinctBy(messageQueues, m => m.PublicAccountID).ToList(); WXPublicAccountBlockStatusModel thePublicAccount = null; Proc_GetRobotServerMessageQueueForWXRobot_Result[] messageQueuesArray = new Proc_GetRobotServerMessageQueueForWXRobot_Result[messageQueuesDistinctList.Count]; messageQueuesDistinctList.CopyTo(messageQueuesArray); //不存在的公众账号,加入到模型中 foreach (var mqa in messageQueuesArray) { thePublicAccount = wxPublicAccountBlockStatusModel.FirstOrDefault(p => p.PublicAccountID == mqa.PublicAccountID); if (thePublicAccount == null) { wxPublicAccountBlockStatusModelList.Add(new WXPublicAccountBlockStatusModel() { PublicAccountID = (int)mqa.PublicAccountID, BlockedDateTime = DateTime.MinValue, IsBlocked = false }); } } wxPublicAccountBlockStatusModel = wxPublicAccountBlockStatusModel.Select(c => { c.IsBlocked = false; return(c); }).AsEnumerable(); return(wxPublicAccountBlockStatusModel); }
/// <summary> /// 同步公众账号Block模型。 /// </summary> /// <param name="wxPublicAccountBlockStatusModel"></param> /// <param name="messageQueues"></param> /// <param name="refresh">是否重新刷新WXPublicAccountBlockStatusModel。如果是:把WXPublicAccountBlockStatusModel下所有的IsBlocked改回为false。</param> /// <param name="autoRefreshAfter15">超过15秒的,是否自动把对应的公众账号修改为IsBlocked = false。</param> /// <returns></returns> private static IEnumerable <WXPublicAccountBlockStatusModel> SyncWXPublicAccountBlockStatusModel(IEnumerable <WXPublicAccountBlockStatusModel> wxPublicAccountBlockStatusModel, IEnumerable <Proc_GetRobotServerMessageQueueForWXRobot_Result> messageQueues, bool refresh, bool autoRefreshAfter15, double checkWXIntervalWhenBlock) { var wxPublicAccountBlockStatusModelList = wxPublicAccountBlockStatusModel.ToList(); var messageQueuesDistinctList = Common.Lists.ListHandler.DistinctBy(messageQueues, m => m.PublicAccountID).ToList(); #region 如果公众Block模型中,在消息队列不存在,要删除 Proc_GetRobotServerMessageQueueForWXRobot_Result theMessageQueue = null; WXPublicAccountBlockStatusModel[] wxPublicAccountBlockStatusModelArray = new WXPublicAccountBlockStatusModel[wxPublicAccountBlockStatusModelList.Count]; wxPublicAccountBlockStatusModelList.CopyTo(wxPublicAccountBlockStatusModelArray); foreach (var pba in wxPublicAccountBlockStatusModelArray) { theMessageQueue = messageQueuesDistinctList.FirstOrDefault(mqd => mqd.PublicAccountID == pba.PublicAccountID); if (theMessageQueue == null) { wxPublicAccountBlockStatusModelList.Remove(pba); } } #endregion #region 确保公众账号中,加入了消息队列中,新进的公众账号,也要记录 WXPublicAccountBlockStatusModel thePublicAccount = null; Proc_GetRobotServerMessageQueueForWXRobot_Result[] messageQueuesArray = new Proc_GetRobotServerMessageQueueForWXRobot_Result[messageQueuesDistinctList.Count]; messageQueuesDistinctList.CopyTo(messageQueuesArray); foreach (var mqd in messageQueuesArray) { thePublicAccount = wxPublicAccountBlockStatusModelList.FirstOrDefault(p => p.PublicAccountID == mqd.PublicAccountID); if (thePublicAccount == null) { wxPublicAccountBlockStatusModelList.Add(new WXPublicAccountBlockStatusModel() { PublicAccountID = (int)mqd.PublicAccountID, IsBlocked = false, BlockedDateTime = DateTime.MinValue }); } } #endregion if (refresh) { wxPublicAccountBlockStatusModelList = wxPublicAccountBlockStatusModelList.Select(c => { c.IsBlocked = false; return(c); }).ToList(); } else if (autoRefreshAfter15) //如果没有强制指定要刷新,但那些超过15秒的公众账号,也应该自动刷新为IsBlocked = false { DateTime currentDT = Common.Time.NowHandler.GetNowByTimeZone(); wxPublicAccountBlockStatusModelList = wxPublicAccountBlockStatusModelList.Select(p => { if (p.BlockedDateTime != DateTime.MinValue && p.BlockedDateTime < currentDT.AddSeconds(-checkWXIntervalWhenBlock)) { p.IsBlocked = false; } return(p); }).ToList(); } return(wxPublicAccountBlockStatusModelList); }