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)
{ }
}
}
}