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; } } }