172 lines
6.6 KiB
C#
172 lines
6.6 KiB
C#
|
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();
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 给用户发消息
|
|||
|
/// </summary>
|
|||
|
public void Send(List<fl_member_info> 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<fl_newfans_hist_>("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)
|
|||
|
{ }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 获取通知的用户集合,针对没有下单的用户
|
|||
|
/// </summary>
|
|||
|
/// <param name="interval">时间间隔</param>
|
|||
|
/// <param name="isQuery">是否查询过</param>
|
|||
|
/// <returns></returns>
|
|||
|
public List<fl_member_info> InformMembers(double interval, bool isQuery)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
var session = ApiClient.GetSession();
|
|||
|
List<fl_member_info> members = null;
|
|||
|
members = session.Find<fl_member_info>("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<fl_statistics_record>("select * from fl_statistics_record", new { });
|
|||
|
var newfansHist = session.Find<fl_newfans_hist_>("select * from fl_newfans_hist_");
|
|||
|
|
|||
|
// 没有查询过的用户集合
|
|||
|
var not_query_member = new List<fl_member_info>();
|
|||
|
// 查询过的用户集合
|
|||
|
var query_member = new List<fl_member_info>();
|
|||
|
|
|||
|
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)
|
|||
|
{ }
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|