using Microsoft.AspNetCore.Hosting; using Newtonsoft.Json; using Quartz; using System.Text; using Tiobon.Core.Common.LogHelper; using Tiobon.Core.IServices; using Tiobon.Core.Model.Models; /// /// 这里要注意下,命名空间和程序集是一样的,不然反射不到 /// namespace Tiobon.Core.Tasks; public class Job_AccessTrendLog_Quartz : JobBase, IJob { private readonly IAccessTrendLogServices _accessTrendLogServices; private readonly IWebHostEnvironment _environment; public Job_AccessTrendLog_Quartz(IAccessTrendLogServices accessTrendLogServices, IWebHostEnvironment environment, ITasksQzServices tasksQzServices, ITasksLogServices tasksLogServices) : base(tasksQzServices, tasksLogServices) { _accessTrendLogServices = accessTrendLogServices; _environment = environment; _tasksQzServices = tasksQzServices; } public async Task Execute(IJobExecutionContext context) { var executeLog = await ExecuteJob(context, async () => await Run(context)); } public async Task Run(IJobExecutionContext context) { // 可以直接获取 JobDetail 的值 var jobKey = context.JobDetail.Key; var jobId = jobKey.Name; // 也可以通过数据库配置,获取传递过来的参数 JobDataMap data = context.JobDetail.JobDataMap; var lastestLogDatetime = (await _accessTrendLogServices.Query(null, d => d.UpdateTime, false)).FirstOrDefault()?.UpdateTime; if (lastestLogDatetime == null) { lastestLogDatetime = Convert.ToDateTime("2021-09-01"); } var accLogs = GetAccessLogs().Where(d => d.User != "" && d.BeginTime.ObjToDate() >= lastestLogDatetime).ToList(); var logUpdate = DateTime.Now; var activeUsers = (from n in accLogs group n by new { n.User } into g select new ActiveUserVM { user = g.Key.User, count = g.Count(), }).ToList(); foreach (var item in activeUsers) { var user = (await _accessTrendLogServices.Query(d => d.UserInfo != "" && d.UserInfo == item.user)).FirstOrDefault(); if (user != null) { user.Count += item.count; user.UpdateTime = logUpdate; await _accessTrendLogServices.Update(user); } else { await _accessTrendLogServices.Add(new AccessTrendLog() { Count = item.count, UpdateTime = logUpdate, UserInfo = item.user }); } } // 重新拉取 var actUsers = await _accessTrendLogServices.Query(d => d.UserInfo != "", d => d.Count, false); actUsers = actUsers.Take(15).ToList(); List activeUserVMs = new(); foreach (var item in actUsers) { activeUserVMs.Add(new ActiveUserVM() { user = item.UserInfo, count = item.Count }); } Parallel.For(0, 1, e => { LogLock.OutLogAOP("ACCESSTRENDLOG", "", new string[] { activeUserVMs.GetType().ToString(), JsonConvert.SerializeObject(activeUserVMs) }, false); }); } private List GetAccessLogs() { List userAccessModels = new(); var accessLogs = LogLock.ReadLog( Path.Combine(_environment.ContentRootPath, "Log"), "RecordAccessLogs_", Encoding.UTF8, ReadType.Prefix, 2 ).ObjToString().TrimEnd(','); try { return JsonConvert.DeserializeObject>("[" + accessLogs + "]"); } catch (Exception) { var accLogArr = accessLogs.Split("\n"); foreach (var item in accLogArr) { if (item.ObjToString() != "") { try { var accItem = JsonConvert.DeserializeObject(item.TrimEnd(',')); userAccessModels.Add(accItem); } catch (Exception) { } } } } return userAccessModels; } } public class UserAccessFromFIles { public string User { get; set; } public string IP { get; set; } public string API { get; set; } public string BeginTime { get; set; } public string OPTime { get; set; } public string RequestMethod { get; set; } = ""; public string Agent { get; set; } }