This commit is contained in:
tanglong 2025-07-25 09:56:00 +08:00
parent 7b9f68a308
commit 55e1246e83
21 changed files with 73 additions and 36 deletions

View File

@ -34,8 +34,6 @@ namespace YD_AllHeartRates.Api.Mqtt
private readonly ICaching _caching;
private readonly IServiceScopeFactory _scopeFactory;
private readonly List<StudentDto> _studentList = new();
private readonly List<S_Device> _devices = new();
private readonly List<HeartRateData> _pendingHeartRates = new();
private DateTime _lastHeartRateSaveTime = DateTime.Now;
@ -60,28 +58,6 @@ namespace YD_AllHeartRates.Api.Mqtt
_smartSportsContext = smartSportsContext;
_caching = caching;
_scopeFactory = scopeFactory;
_studentList = (from d in _smartSportsContext.Device
join s in _smartSportsContext.Student on d.StudentNo equals s.StudentNo
join c in _smartSportsContext.Class on s.ClassId equals c.Id
where s.StudentStatus == 1
select new StudentDto
{
SchoolCode = s.SchoolCode,
StudentNo = s.StudentNo,
StudentName = s.StudentName,
Sex = s.Sex,
Age = s.Age,
HeartRateId = d.Code,
JumpRopeId = d.Code,
ClassId = s.ClassId,
ClassName = s.ClassName,
GradeId = c.GradeId,
GradeName = c.GradeName ?? "",
DeviceType = d.DeviceType,
}).ToList();
_devices = _smartSportsContext.Device.ToList();
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
@ -110,13 +86,47 @@ namespace YD_AllHeartRates.Api.Mqtt
await foreach (var batch in ReadBatchesAsync(stoppingToken))
{
List<StudentDto> studentList;
List<S_Device> devices;
studentList = _caching.Get<List<StudentDto>>(AppSettings.StudentListCacheKey);
devices = _caching.Get<List<S_Device>>(AppSettings.DeviceListCacheKey);
if (studentList == null || devices == null)
{
studentList = (from d in _smartSportsContext.Device
join s in _smartSportsContext.Student on d.StudentNo equals s.StudentNo
join c in _smartSportsContext.Class on s.ClassId equals c.Id
where s.StudentStatus == 1
select new StudentDto
{
SchoolCode = s.SchoolCode,
StudentNo = s.StudentNo,
StudentName = s.StudentName,
Sex = s.Sex,
Age = s.Age,
HeartRateId = d.Code,
JumpRopeId = d.Code,
ClassId = s.ClassId,
ClassName = s.ClassName,
GradeId = c.GradeId,
GradeName = c.GradeName ?? "",
DeviceType = d.DeviceType,
}).ToList();
devices = _smartSportsContext.Device.ToList();
_caching.AddObject(AppSettings.StudentListCacheKey, studentList, 28800);
_caching.AddObject(AppSettings.DeviceListCacheKey, devices, 28800);
}
var heartRateEntities = new ConcurrentBag<HeartRateData>();
var jumpRopeEntities = new ConcurrentBag<JumpRopeData>();
var deviceHMap = _devices.Where(x => x.DeviceType == 1).ToDictionary(x => x.Code, x => x.StudentNo);
var deviceJMap = _devices.Where(x => x.DeviceType == 2).ToDictionary(x => x.Code, x => x.StudentNo);
var deviceHMap = devices.Where(x => x.DeviceType == 1).ToDictionary(x => x.Code, x => x.StudentNo);
var deviceJMap = devices.Where(x => x.DeviceType == 2).ToDictionary(x => x.Code, x => x.StudentNo);
var studentMap = _studentList.GroupBy(x => x.StudentNo).ToDictionary(g => g.Key, g => g.First());
var studentMap = studentList.GroupBy(x => x.StudentNo).ToDictionary(g => g.Key, g => g.First());
Parallel.ForEach(batch, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, msg =>
{

View File

@ -12,6 +12,7 @@ using YD_AllHeartRates.Api.Utilities;
using YD_AllHeartRates.Commons.Dto;
using YD_AllHeartRates.Commons.Dto.Device;
using YD_AllHeartRates.Commons.Dto.LargeScreen;
using YD_AllHeartRates.Commons.MemoryCaches;
namespace YD_AllHeartRates.Api.Services.Impl
{
@ -24,15 +25,17 @@ namespace YD_AllHeartRates.Api.Services.Impl
public UserContext _userContext;
private readonly LoginContext _loginContext;
private string schoolCode;
private readonly ICaching _caching;
/// <summary>
/// 构造
/// </summary>
public DeviceService(SmartSportsContext sportsContext, UserContext userContext, LoginContext loginContext)
public DeviceService(SmartSportsContext sportsContext, UserContext userContext, LoginContext loginContext, ICaching caching)
{
_sportsContext = sportsContext;
_userContext = userContext;
_loginContext = loginContext;
_caching = caching;
schoolCode = _loginContext.SchoolCode;
}
@ -169,7 +172,14 @@ namespace YD_AllHeartRates.Api.Services.Impl
};
await _sportsContext.AddAsync(entity);
return await _sportsContext.SaveChangesAsync() > 0;
var res = await _sportsContext.SaveChangesAsync() > 0;
if (res)
{
_caching.Remove(AppSettings.DeviceListCacheKey);
return true;
}
return false;
}
/// <summary>
@ -198,7 +208,14 @@ namespace YD_AllHeartRates.Api.Services.Impl
device.Name = dto.DeviceType == 1 ? "心率设备" : "跳绳设备";
_sportsContext.Update(device);
return await _sportsContext.SaveChangesAsync() > 0;
var res = await _sportsContext.SaveChangesAsync() > 0;
if (res)
{
_caching.Remove(AppSettings.DeviceListCacheKey);
return true;
}
return false;
}
/// <summary>
@ -214,7 +231,14 @@ namespace YD_AllHeartRates.Api.Services.Impl
throw new Exception("更新的设备不存在");
_sportsContext.Device.Remove(device);
return await _sportsContext.SaveChangesAsync() > 0;
var res = await _sportsContext.SaveChangesAsync() > 0;
if (res)
{
_caching.Remove(AppSettings.DeviceListCacheKey);
return true;
}
return false;
}
/// <summary>

View File

@ -14,6 +14,8 @@
public static string[] CorsUrls { get; set; }
public static MqttConfig Mqtt { get; set; }
public static string StudentListCacheKey = "student_list";
public static string DeviceListCacheKey = "device_list";
public static void Init(IConfiguration configuration)
{
Logging = configuration.GetSection("Logging").Get<LoggingConfig>();

View File

@ -5,6 +5,7 @@
/*

View File

@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("YD_AllHeartRates.Api")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c01227dcc153e3533d4428f5edc7c1f1bf5bf552")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7b9f68a3083ca4505691f4f83599da73c25dca89")]
[assembly: System.Reflection.AssemblyProductAttribute("YD_AllHeartRates.Api")]
[assembly: System.Reflection.AssemblyTitleAttribute("YD_AllHeartRates.Api")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
6784db23a965b9ae2a3dfdaab50ae94c643a7dee1fcca8b9d9cb873fd2636867
3e3817ef6a7d7531bf57358bb5d2abdf866abc385932c9d17d07e9797a04f620

View File

@ -436,7 +436,7 @@
服务实现
</summary>
</member>
<member name="M:YD_AllHeartRates.Api.Services.Impl.DeviceService.#ctor(YD_AllHeartRates.Api.Context.SmartSportsContext,YD_AllHeartRates.Api.Context.UserContext,YD_AllHeartRates.Api.Utilities.LoginContext)">
<member name="M:YD_AllHeartRates.Api.Services.Impl.DeviceService.#ctor(YD_AllHeartRates.Api.Context.SmartSportsContext,YD_AllHeartRates.Api.Context.UserContext,YD_AllHeartRates.Api.Utilities.LoginContext,YD_AllHeartRates.Commons.MemoryCaches.ICaching)">
<summary>
构造
</summary>

View File

@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("YD_AllHeartRates.Commons")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c01227dcc153e3533d4428f5edc7c1f1bf5bf552")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7b9f68a3083ca4505691f4f83599da73c25dca89")]
[assembly: System.Reflection.AssemblyProductAttribute("YD_AllHeartRates.Commons")]
[assembly: System.Reflection.AssemblyTitleAttribute("YD_AllHeartRates.Commons")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
463029ebc318895442edb6fb3984092082e0f3a1f95e6c3cf59e09e021c6eec2
a15d75618d9a5f604592ebd59e64d2979ec0365ce6479e8233cedcc51f5c89ef