using DocumentFormat.OpenXml.Bibliography;
using Infrastructure;
using Infrastructure.Cache;
using Infrastructure.CloudSdk.minio;
using Infrastructure.Helpers;
using Microsoft.DotNet.InternalAbstractions;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using OpenAuth.App.BaseApp.Base;
using OpenAuth.App.BasicQueryService;
using OpenAuth.App.Interface;
using OpenAuth.App.ServiceApp.Algo;
using OpenAuth.App.ServiceApp.Algo.Request;
using OpenAuth.App.ServiceApp.Response;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using OpenAuth.WebApi;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenAuth.App.ServiceApp
{
///
/// 消息推送模块
///
public class LasaPlatformPushApp : SqlSugarBaseApp
{
private readonly ILogger _logger;
public LasaPlatformPushApp(ILogger logger, ISugarUnitOfWork unitWork, ISimpleClient repository, IAuth auth) : base(unitWork, repository, auth)
{
_logger = logger;
}
///
/// 获取推送平台
///
///
///
///
///
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()
{
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 config = ConfigHelper.GetConfigRoot();
var imageBaseUrl = $"http://{config["Minio:Endpoint"]}/{config["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.AiTaskId == p.Id)
.Where((t, p) => p.CreateTime >= today && p.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 = "获取数据成功"
};
}
}
#endregion
}
}