LASAPlatform/OpenAuth.App/ServiceApp/LasaPlatformPushApp.cs

502 lines
19 KiB
C#
Raw Permalink Normal View History

using Infrastructure;
2026-01-09 10:57:14 +08:00
using Infrastructure.Helpers;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
2026-01-09 10:57:14 +08:00
using Newtonsoft.Json;
using OpenAuth.App.BaseApp.Base;
using OpenAuth.App.Interface;
2026-01-09 10:57:14 +08:00
using OpenAuth.App.ServiceApp.Algo.Request;
2026-01-12 10:44:47 +08:00
using OpenAuth.App.ServiceApp.Response;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using SqlSugar;
namespace OpenAuth.App.ServiceApp
{
/// <summary>
/// 消息推送模块
/// </summary>
public class LasaPlatformPushApp : SqlSugarBaseApp<LasaPlatform, SugarDbContext>
{
2026-01-09 10:57:14 +08:00
private readonly ILogger<LasaPlatformPushApp> _logger;
private readonly IConfiguration _configuration;
public LasaPlatformPushApp(ILogger<LasaPlatformPushApp> logger,
ISugarUnitOfWork<SugarDbContext> unitWork,
ISimpleClient<LasaPlatform> repository, IAuth auth,
IConfiguration configuration) : base(
unitWork, repository, auth)
{
2026-01-09 10:57:14 +08:00
_logger = logger;
_configuration = configuration;
}
/// <summary>
/// 获取推送平台
/// </summary>
/// <param name="page"></param>
/// <param name="limit"></param>
/// <param name="key"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<LasaPlatform>>>> GetPlatformList(int page, int limit, string key)
{
RefAsync<int> 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<PageInfo<List<LasaPlatform>>>
{
Result = new PageInfo<List<LasaPlatform>> { Items = list, Total = totalCount }
};
}
}
/// <summary>
/// 添加平台信息
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public async Task<Response<bool>> 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<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
//修改平台信息
public async Task<Response<bool>> UpdatePlatform(LasaPlatform info)
{
using (var db = UnitWork.CreateContext())
{
// 编辑
await db.LasaPlatform.UpdateAsync(u => new LasaPlatform
{
Url = info.Url,
PlatformName = info.PlatformName,
RoutingKey = info.RoutingKey,
2026-01-13 09:41:14 +08:00
Exchange = info.Exchange,
Topic = info.Topic
}, u => u.Id == info.Id);
// 提交事务
if (db.Commit())
{
return new Response<bool>
{
Result = true,
Message = "修改成功"
};
}
else
{
return new Response<bool>
{
Result = false,
Message = "修改失败"
};
}
}
}
//删除平台信息
public async Task<Response<bool>> DeletePlatform(string id)
{
using (var db = UnitWork.CreateContext())
{
2026-01-13 09:50:57 +08:00
// 编辑
await db.LasaPlatform.UpdateAsync(u => new LasaPlatform
{
IsDelete = true,
}, u => u.Id == id);
//await db.LasaPlatform.DeleteByIdAsync(id);
if (db.Commit())
return new Response<bool>
{
Result = true,
Message = "删除成功"
};
else
return new Response<bool>
{
Result = false,
Message = "删除失败"
};
}
}
2025-12-29 13:46:19 +08:00
/// <summary>
/// 添加ai算法任务信息
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public async Task<Response<bool>> 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<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
2025-12-29 13:46:19 +08:00
/// <summary>
/// 添加ai算法推送log
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
2026-01-12 14:47:37 +08:00
public async Task<Response<bool>> AddTaskAiLog(LasaTaskAiLog info)
2025-12-29 13:46:19 +08:00
{
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<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
2026-01-09 10:57:14 +08:00
/// <summary>
/// 获取推送记录
/// </summary>
/// <param name="page"></param>
/// <param name="limit"></param>
/// <param name="key"></param>
/// <returns></returns>
2026-01-12 11:39:16 +08:00
public async Task<Response<PageInfo<List<LasaTaskAiLogResp>>>> GetAiLogList(int page, int limit, string key)
2026-01-09 10:57:14 +08:00
{
RefAsync<int> totalCount = 0;
using (var db = UnitWork.CreateContext())
{
var list = await db.LasaTaskAiLog.AsQueryable()
2026-01-13 09:50:57 +08:00
.LeftJoin<LasaTaskAi>((a, b) => a.AiTaskId == b.Id)
.WhereIF(!string.IsNullOrEmpty(key), (a, b) => a.Data.Contains(key))
.Select((a, b) => new LasaTaskAiLogResp()
2026-01-12 11:39:16 +08:00
{
2026-02-27 09:09:27 +08:00
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<PageInfo<List<LasaTaskAiLogResp>>>
{
Result = new PageInfo<List<LasaTaskAiLogResp>> { Items = list, Total = totalCount }
};
}
}
public async Task<Response<PageInfo<List<LasaTaskAiLogResp>>>> GetAiLogListToday(int page, int limit,
string platform)
2026-02-27 09:09:27 +08:00
{
var today = DateTime.Today;
var tomorrow = today.AddDays(1);
RefAsync<int> totalCount = 0;
using (var db = UnitWork.CreateContext())
{
var list = await db.LasaTaskAiLog.AsQueryable()
.LeftJoin<LasaTaskAi>((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,
2026-01-12 11:39:16 +08:00
AiTaskId = a.AiTaskId,
State = a.State,
CreateTime = a.CreateTime,
Data = a.Data,
Platform = b.Platform,
})
2026-01-09 10:57:14 +08:00
.ToPageListAsync(page, limit, totalCount);
2026-01-12 11:39:16 +08:00
return new Response<PageInfo<List<LasaTaskAiLogResp>>>
2026-01-09 10:57:14 +08:00
{
2026-01-12 11:39:16 +08:00
Result = new PageInfo<List<LasaTaskAiLogResp>> { Items = list, Total = totalCount }
2026-01-09 10:57:14 +08:00
};
}
}
public async Task<Response<bool>> AddImgTopic(string payload)
{
using var db = UnitWork.CreateContext();
var aiinfo = JsonConvert.DeserializeObject<AiImgReq>(payload);
if (aiinfo == null)
{
return new Response<bool>
{
2026-01-12 14:47:37 +08:00
Result = false,
Message = "添加失败"
2026-01-09 10:57:14 +08:00
};
}
_logger.LogInformation("标签信息:{tag}", JsonConvert.SerializeObject(aiinfo.tag));
_logger.LogInformation("aiid{aiid}", aiinfo.aiid);
var imageBaseUrl = $"http://{_configuration["Minio:Endpoint"]}/{_configuration["Minio:BucketName"]}/";
2026-01-09 10:57:14 +08:00
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);
2026-01-09 10:57:14 +08:00
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
});
}
2026-01-09 10:57:14 +08:00
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<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
2026-01-09 10:57:14 +08:00
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
);
}
2026-01-12 10:44:47 +08:00
#region 推送统计
public async Task<Response<List<PlatformDashboardResp>>> TaskAiStatistics()
{
var today = DateTime.Today;
var tomorrow = today.AddDays(1);
using (var db = UnitWork.CreateContext())
{
2026-01-12 11:39:16 +08:00
var list = await db.LasaTaskAi.AsQueryable()
2026-02-27 09:09:27 +08:00
.LeftJoin<LasaTaskAiLog>((t, p) => t.Id == p.AiTaskId)
.Where((t, p) => t.CreateTime >= today && t.CreateTime < tomorrow)
2026-01-12 10:44:47 +08:00
.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)
)
2026-01-12 11:39:16 +08:00
}).ToListAsync();
2026-01-12 10:44:47 +08:00
// 计算成功率
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)
2026-01-12 10:44:47 +08:00
}).ToList();
return new Response<List<PlatformDashboardResp>>
{
Result = result,
Message = "获取数据成功"
};
}
}
2026-02-26 15:59:06 +08:00
//public async Task<Response<List<WeekPushChartResp>>> 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<LasaTaskAiLog>((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<List<WeekPushChartResp>>
// {
// Result = list,
// Message = "获取数据成功"
// };
// }
//}
public async Task<Response<dynamic>> GetWeekPushChartNew()
2026-01-12 11:39:16 +08:00
{
// 本周一 00:00
var weekStart = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + 1);
// 下周一 00:00
var weekEnd = weekStart.AddDays(7);
using (var db = UnitWork.CreateContext())
{
2026-02-26 15:59:06 +08:00
var rawList = await db.LasaTaskAiLog.AsQueryable()
2026-02-27 09:09:27 +08:00
.InnerJoin<LasaTaskAi>((t, p) => t.AiTaskId == p.Id)
2026-02-26 15:59:06 +08:00
.Where((t, p) => t.CreateTime >= weekStart && t.CreateTime < weekEnd)
2026-01-12 11:39:16 +08:00
.GroupBy((t, p) => new
{
2026-02-26 15:59:06 +08:00
Day = t.CreateTime.ToString("yyyy-MM-dd"),
p.Platform
2026-01-12 11:39:16 +08:00
})
.Select((t, p) => new WeekPushChartResp
{
2026-02-26 15:59:06 +08:00
Day = t.CreateTime.ToString("yyyy-MM-dd"),
Platform = p.Platform,
PushCount = SqlFunc.AggregateCount(p.Platform)
})
//.OrderBy((p, t) => p.CreateTime.Date)
2026-01-12 11:39:16 +08:00
.ToListAsync();
2026-02-26 15:59:06 +08:00
//拼接格式
var today = DateTime.Now.Date.ToString("yyyy-MM-dd");
var platforms = rawList
.Select(x => x.Platform)
.Distinct()
.ToList();
var platformList = platforms.Select(p => new
2026-01-12 11:39:16 +08:00
{
2026-02-26 15:59:06 +08:00
name = p,
key = p
2026-02-27 09:09:27 +08:00
}).ToList();
2026-02-26 15:59:06 +08:00
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<string, object>
{
{ "time", g.Key }
};
foreach (var pf in platformList)
{
var count = g.FirstOrDefault(x => x.Platform == pf.name)?.PushCount ?? 0;
dict[pf.key] = count;
}
2026-02-26 15:59:06 +08:00
return dict;
}).ToList();
var result = new
{
today = todayList,
platform = platformList,
data = dataList
};
return new Response<dynamic>
{
Result = result,
2026-01-12 11:39:16 +08:00
Message = "获取数据成功"
};
}
}
2026-01-12 10:44:47 +08:00
#endregion
}
}