using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Nodes;
using System.Threading.Tasks;
using Crm.Core.MsgTool.Domain.Dto;
namespace Crm.Core.MsgTool.Domain
{
///
/// 企微任务助手处理类
///
public class MsgToolTaskEventSingleton
{
private readonly IConfiguration _configuration;
private readonly IHttpClient _httpClient;
private readonly ICacheDomain _cacheDomain;
private readonly SystemConfig _systemConfig;
private readonly IOracleRepository _crmRepository;
private List _msgToolTasks = new();
public MsgToolTaskEventSingleton(
IConfiguration configuration,
IHttpClient httpClient,
ICacheDomain cacheDomain,
IOracleRepository crmRepository)
{
_configuration = configuration;
_httpClient = httpClient;
_cacheDomain = cacheDomain;
_crmRepository = crmRepository;
_systemConfig = configuration.GetSection("SystemConfig").Get();
}
///
/// 获取任务队列
///
///
public List GetMsgToolTaskEvents() => _msgToolTasks;
///
/// 移除任务队列
///
///
///
public List RemoveTimingTask(MsgToolTask task)
{
var taskid = task.PKID;
if (_msgToolTasks.Any(x => x.TaskId.Equals(taskid)))
{
_msgToolTasks.Remove(_msgToolTasks.First(x => x.TaskId == taskid));
}
return _msgToolTasks;
}
///
/// 批量移除任务队列
///
///
///
public List RemoveTimingTasks(List tasks)
{
foreach (var taks in tasks)
{
RemoveTimingTask(taks);
}
return _msgToolTasks;
}
///
/// 加入任务队列
///
///
///
///
public List AddTimingTask(string? appid, MsgToolTask task)
{
var taskid = task.PKID;
var now = DateTime.Now;
var planTimes = new List();
if (_msgToolTasks.Any(x => x.TaskId.Equals(taskid)))
{
_msgToolTasks.Remove(_msgToolTasks.First(x => x.TaskId == taskid));
}
// 如果超过了过期时间就直接返回,不新增
if (!task.PLANEXETIME.HasValue)
{
return _msgToolTasks;
}
if (task.SENDTYPE == "tim")
{
planTimes.Add(task.PLANEXETIME.Value);
_msgToolTasks.Add(new MsgToolTaskEventDto
{
Appid = appid,
TaskId = taskid,
TaskName = task.PLANNAME,
PlanTimes = planTimes
});
return _msgToolTasks;
}
if (!task.DUEDATE.HasValue || task.DUEDATE < now || string.IsNullOrEmpty(task.PLANEXEHOUR)) return _msgToolTasks;
var planTime = task.PLANEXETIME.Value;
if (task.SENDTYPE == "daily")
{
var ts = task.DUEDATE.Value - planTime;
for (var day = 0; day <= ts.Days; day++)
{
if (DateTime.TryParse($"{planTime.AddDays(day):yyyy-MM-dd} {task.PLANEXEHOUR}", out DateTime time)
&& time > now)
{
planTimes.Add(time);
}
}
}
else if (task.SENDTYPE == "week" && !string.IsNullOrEmpty(task.PLANEXECYCLE))
{
var planExecycle = JsonSerializer.Deserialize>(task.PLANEXECYCLE);
var ts = task.DUEDATE.Value - planTime;
for (var day = 0; day <= ts.Days; day++)
{
if (DateTime.TryParse($"{planTime.AddDays(day):yyyy-MM-dd} {task.PLANEXEHOUR}", out DateTime time)
&& time > now
&& planExecycle != null
&& planExecycle.Contains((int)time.DayOfWeek == 0 ? 7 : (int)time.DayOfWeek))
{
planTimes.Add(time);
}
}
}
else if (task.SENDTYPE == "month")
{
var ts = task.DUEDATE.Value - planTime;
var planExecycle = JsonSerializer.Deserialize>(task.PLANEXECYCLE);
for (var day = 0; day <= ts.Days; day++)
{
if (DateTime.TryParse($"{planTime.AddDays(day):yyyy-MM-dd} {task.PLANEXEHOUR}", out DateTime time)
&& time > now
&& planExecycle != null && planExecycle.Contains(time.Day))
{
planTimes.Add(time);
}
}
}
if (planTimes == null || !planTimes.Any()) return _msgToolTasks;
_msgToolTasks.Add(new MsgToolTaskEventDto
{
Appid = appid,
TaskId = taskid,
TaskName = task.PLANNAME,
PlanTimes = planTimes
});
return _msgToolTasks;
}
}
}