using Infrastructure; using Infrastructure.Helpers; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using OpenAuth.App.BaseApp.Base; using OpenAuth.App.Interface; using OpenAuth.App.ServiceApp.Algo.Request; using OpenAuth.App.ServiceApp.Response; using OpenAuth.Repository; using OpenAuth.Repository.Domain; using SqlSugar; namespace OpenAuth.App.ServiceApp { /// /// 消息推送模块 /// public class LasaPlatformPushApp : SqlSugarBaseApp { private readonly ILogger _logger; private readonly IConfiguration _configuration; public LasaPlatformPushApp(ILogger logger, ISugarUnitOfWork unitWork, ISimpleClient repository, IAuth auth, IConfiguration configuration) : base( unitWork, repository, auth) { _logger = logger; _configuration = configuration; } /// /// 获取推送平台 /// /// /// /// /// public async Task>>> GetPlatformList(int page, int limit, string key) { RefAsync totalCount = 0; using (var db = UnitWork.CreateContext()) { var list = await db.LasaPlatform.AsQueryable() .Where((a) => a.IsDelete == false) .WhereIF(!string.IsNullOrEmpty(key), (a) => a.PlatformName.Contains(key)) .ToPageListAsync(page, limit, totalCount); return new Response>> { Result = new PageInfo> { Items = list, Total = totalCount } }; } } /// /// 添加平台信息 /// /// /// public async Task> AddPlatform(LasaPlatform info) { using (var db = UnitWork.CreateContext()) { info.Id = Guid.NewGuid().ToString(); info.IsDelete = false; await db.LasaPlatform.InsertAsync(info); if (db.Commit()) return new Response { Result = true, Message = "添加成功" }; else return new Response { Result = false, Message = "添加失败" }; } } //修改平台信息 public async Task> UpdatePlatform(LasaPlatform info) { using (var db = UnitWork.CreateContext()) { // 编辑 await db.LasaPlatform.UpdateAsync(u => new LasaPlatform { Url = info.Url, PlatformName = info.PlatformName, RoutingKey = info.RoutingKey, Exchange = info.Exchange, Topic = info.Topic }, u => u.Id == info.Id); // 提交事务 if (db.Commit()) { return new Response { Result = true, Message = "修改成功" }; } else { return new Response { Result = false, Message = "修改失败" }; } } } //删除平台信息 public async Task> DeletePlatform(string id) { using (var db = UnitWork.CreateContext()) { // 编辑 await db.LasaPlatform.UpdateAsync(u => new LasaPlatform { IsDelete = true, }, u => u.Id == id); //await db.LasaPlatform.DeleteByIdAsync(id); if (db.Commit()) return new Response { Result = true, Message = "删除成功" }; else return new Response { Result = false, Message = "删除失败" }; } } /// /// 添加ai算法任务信息 /// /// /// public async Task> AddTaskAi(LasaTaskAi info) { using (var db = UnitWork.CreateContext()) { if (string.IsNullOrEmpty(info.Id)) info.Id = Guid.NewGuid().ToString(); await db.LasaTaskAi.InsertAsync(info); if (db.Commit()) return new Response { Result = true, Message = "添加成功" }; else return new Response { Result = false, Message = "添加失败" }; } } /// /// 添加ai算法推送log /// /// /// public async Task> AddTaskAiLog(LasaTaskAiLog info) { using (var db = UnitWork.CreateContext()) { if (string.IsNullOrEmpty(info.Id)) info.Id = Guid.NewGuid().ToString(); await db.LasaTaskAiLog.InsertAsync(info); if (db.Commit()) return new Response { Result = true, Message = "添加成功" }; else return new Response { Result = false, Message = "添加失败" }; } } /// /// 获取推送记录 /// /// /// /// /// public async Task>>> GetAiLogList(int page, int limit, string key) { RefAsync totalCount = 0; using (var db = UnitWork.CreateContext()) { var list = await db.LasaTaskAiLog.AsQueryable() .LeftJoin((a, b) => a.AiTaskId == b.Id) .WhereIF(!string.IsNullOrEmpty(key), (a, b) => a.Data.Contains(key)) .Select((a, b) => new LasaTaskAiLogResp() { Id = a.Id, AiTaskId = a.AiTaskId, State = a.State, CreateTime = a.CreateTime, Data = a.Data, Platform = b.Platform, }) .ToPageListAsync(page, limit, totalCount); return new Response>> { Result = new PageInfo> { Items = list, Total = totalCount } }; } } public async Task>>> GetAiLogListToday(int page, int limit, string platform) { var today = DateTime.Today; var tomorrow = today.AddDays(1); RefAsync totalCount = 0; using (var db = UnitWork.CreateContext()) { var list = await db.LasaTaskAiLog.AsQueryable() .LeftJoin((a, b) => a.AiTaskId == b.Id) .Where((a, b) => b.Platform.Contains(platform)) .Where((a, b) => a.CreateTime >= today && a.CreateTime < tomorrow) .Select((a, b) => new LasaTaskAiLogResp() { Id = a.Id, AiTaskId = a.AiTaskId, State = a.State, CreateTime = a.CreateTime, Data = a.Data, Platform = b.Platform, }) .ToPageListAsync(page, limit, totalCount); return new Response>> { Result = new PageInfo> { Items = list, Total = totalCount } }; } } public async Task> AddImgTopic(string payload) { using var db = UnitWork.CreateContext(); var aiinfo = JsonConvert.DeserializeObject(payload); if (aiinfo == null) { return new Response { Result = false, Message = "添加失败" }; } _logger.LogInformation("标签信息:{tag}", JsonConvert.SerializeObject(aiinfo.tag)); _logger.LogInformation("aiid:{aiid}", aiinfo.aiid); var imageBaseUrl = $"http://{_configuration["Minio:Endpoint"]}/{_configuration["Minio:BucketName"]}/"; var (lat, lng) = GetDroneLocation(aiinfo); // 一次性加载模型标签 var modelDict = (await db.LasaModelLabel.AsQueryable().Where(r => r.PId == aiinfo.aiid).ToListAsync()) .ToDictionary(x => x.EnumValue, x => x.Name); foreach (var tag in aiinfo.tag) { if (tag.confidence < 0.3) continue; var tagKey = tag.class_id.ToString(); var achievement = await db.LasaAiAchievement .GetFirstAsync(r => r.TaskId == aiinfo.taskid && r.Tag == tagKey); if (achievement == null) { await db.LasaAiAchievement.InsertAsync(new LasaAiAchievement { Id = Guid.NewGuid().ToString(), CreateTime = DateTime.Now, TaskId = aiinfo.taskid, AlgoId = aiinfo.aiid, AiModel = "yolo12x", Tag = tag.class_id.ToString(), Title = modelDict.TryGetValue(tag.class_id, out var name) ? name : string.Empty, ConfidenceLevel = (float)Math.Round(tag.confidence, 2) * 100, Cover = imageBaseUrl + aiinfo.path, Lat = (float)lat, Lng = (float)lng }); } await db.LasaAiAchievementDetail.InsertAsync(new LasaAiAchievementDetail { Id = Guid.NewGuid().ToString(), AiAchievementId = achievement.Id, Image = imageBaseUrl + aiinfo.path, Lat = lat, Lng = lng }); } if (db.Commit()) return new Response { Result = true, Message = "添加成功" }; else return new Response { Result = false, Message = "添加失败" }; } private static (double lat, double lng) GetDroneLocation(AiImgReq aiinfo) { if (aiinfo.drone_info?.data == null) return (0.0, 0.0); return ( aiinfo.drone_info.data.latitude ?? 0.0, aiinfo.drone_info.data.longitude ?? 0.0 ); } #region 推送统计 public async Task>> TaskAiStatistics() { var today = DateTime.Today; var tomorrow = today.AddDays(1); using (var db = UnitWork.CreateContext()) { var list = await db.LasaTaskAi.AsQueryable() .LeftJoin((t, p) => t.Id == p.AiTaskId) .Where((t, p) => t.CreateTime >= today && t.CreateTime < tomorrow) .GroupBy((t, p) => new { t.Platform, t.State }) .Select((t, p) => new { Platform = t.Platform, ConnectState = t.State, TodayPushCount = SqlFunc.AggregateCount(p.Id), TodaySuccessCount = SqlFunc.AggregateSum( SqlFunc.IIF(p.State == true, 1, 0) ) }).ToListAsync(); // 计算成功率 var result = list.Select(x => new PlatformDashboardResp { Platform = x.Platform, ConnectState = x.ConnectState, TodayPushCount = x.TodayPushCount, TodaySuccessCount = x.TodaySuccessCount, SuccessRate = x.TodayPushCount == 0 ? 0 : Math.Round((decimal)x.TodaySuccessCount / x.TodayPushCount * 100, 2) }).ToList(); return new Response> { Result = result, Message = "获取数据成功" }; } } //public async Task>> GetWeekPushChart() //{ // // 本周一 00:00 // var weekStart = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + 1); // // 下周一 00:00 // var weekEnd = weekStart.AddDays(7); // using (var db = UnitWork.CreateContext()) // { // var list = await db.LasaTaskAi.AsQueryable() // .InnerJoin((t, p) => t.AiTaskId == p.AiTaskId) // .Where((t, p) => p.CreateTime >= weekStart && p.CreateTime < weekEnd) // .GroupBy((t, p) => new // { // Year = SqlFunc.DateValue(p.CreateTime, DateType.Year), // Month = SqlFunc.DateValue(p.CreateTime, DateType.Month), // Day = SqlFunc.DateValue(p.CreateTime, DateType.Day), // t.Platform // }) // .Select((t, p) => new WeekPushChartResp // { // Year = SqlFunc.DateValue(p.CreateTime, DateType.Year), // Month = SqlFunc.DateValue(p.CreateTime, DateType.Month), // Day = SqlFunc.DateValue(p.CreateTime, DateType.Day), // Platform = t.Platform, // PushCount = SqlFunc.AggregateCount(p.Id) // }).MergeTable() // .OrderBy(it => it.Year) // .OrderBy(it => it.Month) // .OrderBy(it => it.Day) // .ToListAsync(); // return new Response> // { // Result = list, // Message = "获取数据成功" // }; // } //} public async Task> GetWeekPushChartNew() { // 本周一 00:00 var weekStart = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + 1); // 下周一 00:00 var weekEnd = weekStart.AddDays(7); using (var db = UnitWork.CreateContext()) { var rawList = await db.LasaTaskAiLog.AsQueryable() .InnerJoin((t, p) => t.AiTaskId == p.Id) .Where((t, p) => t.CreateTime >= weekStart && t.CreateTime < weekEnd) .GroupBy((t, p) => new { Day = t.CreateTime.ToString("yyyy-MM-dd"), p.Platform }) .Select((t, p) => new WeekPushChartResp { Day = t.CreateTime.ToString("yyyy-MM-dd"), Platform = p.Platform, PushCount = SqlFunc.AggregateCount(p.Platform) }) //.OrderBy((p, t) => p.CreateTime.Date) .ToListAsync(); //拼接格式 var today = DateTime.Now.Date.ToString("yyyy-MM-dd"); var platforms = rawList .Select(x => x.Platform) .Distinct() .ToList(); var platformList = platforms.Select(p => new { name = p, key = p }).ToList(); var todayList = rawList .Where(x => x.Day == today) .Select(x => new { platform = x.Platform, count = x.PushCount }).ToList(); var dataList = rawList .GroupBy(x => x.Day) .OrderBy(g => g.Key) .Select(g => { var dict = new Dictionary { { "time", g.Key } }; foreach (var pf in platformList) { var count = g.FirstOrDefault(x => x.Platform == pf.name)?.PushCount ?? 0; dict[pf.key] = count; } return dict; }).ToList(); var result = new { today = todayList, platform = platformList, data = dataList }; return new Response { Result = result, Message = "获取数据成功" }; } } #endregion } }