using Api.Framework; using Api.Framework.Model; using Api.Framework.Tools; using NewFans.Entitys; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace NewFans { public class TaskJob { CancellationToken token; ManualResetEvent resetEvent = null; public TaskJob() { token = tokenSource.Token; resetEvent = new ManualResetEvent(true); } private bool ISRUN1 = false; public void Run() { ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(true), new WaitOrTimerCallback((state, timedout) => { if (!Class1.Config.isRun) return; if (ISRUN1) return; ISRUN1 = true; try { if (!string.IsNullOrWhiteSpace(Class1.Config.mess72)) Send(InformMembers(Class1.Config.hour72, true), Class1.Config.hour72, Class1.Config.mess72); if (!string.IsNullOrWhiteSpace(Class1.Config.mess48)) Send(InformMembers(Class1.Config.hour48, true), Class1.Config.hour48, Class1.Config.mess48); if (!string.IsNullOrWhiteSpace(Class1.Config.mess24)) Send(InformMembers(Class1.Config.hour24, true), Class1.Config.hour24, Class1.Config.mess24); if (!string.IsNullOrWhiteSpace(Class1.Config.mess3)) Send(InformMembers(Class1.Config.hour3, false), Class1.Config.hour3, Class1.Config.mess3); } catch (Exception ex) { } finally { ISRUN1 = false; } }), null, 30000, false); } private Random random = new Random(); /// /// 给用户发消息 /// public void Send(List members, int interval, string mess) { try { if (members == null || members.Count == 0) { } else { var session = ApiClient.GetSession(); foreach (var item in members) { try { if (token.IsCancellationRequested) return; // 初始化为true时执行WaitOne不阻塞 resetEvent.WaitOne(); var wx = Chat.Framework.ChatClient.WXClient.Values.FirstOrDefault(f => f.WeixinHao == item.robot_name && f.Status == Chat.Framework.WXSdk.WxStatus.在线); if (wx == null) continue; //var m = session.FindMemberInfoById(member); var friend = wx.GetContact(item.username); if (friend == null) continue; wx.SendMessage(item.username, mess); var hist = session.FindSingle("select * from fl_newfans_hist_ where uid = @uid", new { uid = item.id }); if (hist == null) hist = new fl_newfans_hist_() { uid = (int)item.id }; hist.time = interval; session.Saveable(hist).ExecuteCommand(); Thread.Sleep(3000 + random.Next(500, 5000)); } catch (Exception ex) { } } } } catch (Exception ex) { } } /// /// 获取通知的用户集合,针对没有下单的用户 /// /// 时间间隔 /// 是否查询过 /// public List InformMembers(double interval, bool isQuery) { try { var session = ApiClient.GetSession(); List members = null; members = session.Find("select * from fl_member_info where @begintime <= crt_time and crt_time <= @endtime and bind_order = 0", new { begintime = DateTime.Now.AddHours(-84), endtime = DateTime.Now.AddMinutes(-interval) }); var records = session.Find("select * from fl_statistics_record", new { }); var newfansHist = session.Find("select * from fl_newfans_hist_"); // 没有查询过的用户集合 var not_query_member = new List(); // 查询过的用户集合 var query_member = new List(); if (isQuery) { foreach (var item in members) { var record = records.FirstOrDefault(o => o.uid == item.id); if (record != null && record.querynum != 0) { var hist = newfansHist.FirstOrDefault(f => f.uid == item.id); if (hist == null || (hist != null && hist.time < interval)) query_member.Add(item); } } return query_member; } else { foreach (var item in members) { var record = records.FirstOrDefault(o => o.uid == item.id); if ((record != null && record.querynum == 0) || record == null) { var hist = newfansHist.FirstOrDefault(f => f.uid == item.id); if ((hist != null && hist.time < interval) || hist == null) not_query_member.Add(item); } } return not_query_member; } } catch (Exception ex) { } return null; } public static CancellationTokenSource tokenSource = new CancellationTokenSource(); public void Abort() { try { tokenSource.Cancel(); } catch (Exception ex) { } } } }