This commit is contained in:
tanglong 2025-08-07 10:43:55 +08:00
parent a248cff18a
commit 8daf528de7
3 changed files with 43 additions and 186 deletions

View File

@ -39,12 +39,12 @@ namespace VOL.Ai.Services
private readonly IAiAppVersionRepository _aiAppVersionRepository;
private readonly IN_SportsTrainingCategoryRepository _sportsTrainingCategoryRepository;
private readonly IClassRoomRecordRepository _classRoomRecordRepository;
private readonly IHeartRateDataRepository _heartRateDataRepository;
private readonly IActivitiestDataRepository _activitiestDataRepository;
private readonly ILevelExamDataRepository _levelExamDataRepository;
private readonly ISportsTestDataRepository _sportsTestDataRepository;
private readonly ITrainingDataRepository _trainingDataRepository;
private readonly IFastJumpRopeDataRepository _fastJumpRopeDataRepository;
private readonly IHeartRateDataRepository _heartRateDataRepository;
private readonly ISys_UserRepository _userRepository;
private readonly IClassroomStageRepository _classroomStageRepository;
private readonly IClassroomSettingRepository _classroomSettingRepository;
@ -60,12 +60,12 @@ namespace VOL.Ai.Services
IScanCodeLoginRepository scanCodeLoginRepository,
IN_SportsTrainingCategoryRepository sportsTrainingCategoryRepository,
IClassRoomRecordRepository classRoomRecordRepository,
IHeartRateDataRepository heartRateDataRepository,
IActivitiestDataRepository activitiestDataRepository,
ILevelExamDataRepository levelExamDataRepository,
ISportsTestDataRepository sportsTestDataRepository,
ITrainingDataRepository trainingDataRepository,
IFastJumpRopeDataRepository fastJumpRopeDataRepository,
IHeartRateDataRepository heartRateDataRepository,
ISys_UserRepository userRepository,
IClassroomStageRepository classroomStageRepository,
IClassroomSettingRepository classroomSettingRepository,
@ -80,13 +80,13 @@ namespace VOL.Ai.Services
_teacherRepository = teacherRepository;
_sportsTrainingCategoryRepository = sportsTrainingCategoryRepository;
_classRoomRecordRepository = classRoomRecordRepository;
_heartRateDataRepository = heartRateDataRepository;
_activitiestDataRepository = activitiestDataRepository;
_levelExamDataRepository = levelExamDataRepository;
_sportsTestDataRepository = sportsTestDataRepository;
_trainingDataRepository = trainingDataRepository;
_classRepository = classRepository;
_fastJumpRopeDataRepository = fastJumpRopeDataRepository;
_heartRateDataRepository = heartRateDataRepository;
_userRepository = userRepository;
_classroomStageRepository = classroomStageRepository;
_classroomSettingRepository = classroomSettingRepository;
@ -906,40 +906,40 @@ namespace VOL.Ai.Services
}
var heartRateDatas = _mapper.Map<List<Ai_HeartRateData>>(paramDto.Datas);
heartRateDatas = heartRateDatas.Where(data => data.Value != 0).ToList();
var classIds = paramDto.Datas.Select(x => x.ClassId).ToList();
var classList = await _classRepository.FindAsIQueryable(x => x.SchoolCode == paramDto.SchoolCode && classIds.Contains(x.Id)).ToListAsync();
//var classIds = paramDto.Datas.Select(x => x.ClassId).Distinct().ToList();
//var classList = await _classRepository.FindAsync(x => x.SchoolCode == paramDto.SchoolCode && classIds.Contains(x.Id));
//var classDict = classList.ToDictionary(x => x.Id, x => x);
var timeNow = DateTime.Now;
var classDict = classList.ToDictionary(x => x.Id, x => x);
heartRateDatas.ForEach(heartRateData =>
{
if (classDict.TryGetValue(heartRateData.ClassId, out var classInfo))
{
heartRateData.Code = paramDto.Code;
heartRateData.SchoolCode = paramDto.SchoolCode;
heartRateData.ClassRoomRecordId = paramDto.ClassRoomRecordId;
heartRateData.ClassroomStageId = paramDto.ClassroomStageId;
heartRateData.TeacherId = paramDto.TeacherId;
heartRateData.GradeId = classInfo.GradeId;
heartRateData.GradeName = classInfo.GradeName;
heartRateData.ScoreTime = timeNow;
heartRateData.IsDisplay = true;
}
//if (classDict.TryGetValue(heartRateData.ClassId, out var classInfo))
//{
// heartRateData.Code = paramDto.Code;
// heartRateData.SchoolCode = paramDto.SchoolCode;
// heartRateData.ClassRoomRecordId = paramDto.ClassRoomRecordId;
// heartRateData.ClassroomStageId = paramDto.ClassroomStageId;
// heartRateData.TeacherId = paramDto.TeacherId;
// heartRateData.GradeId = classInfo.GradeId;
// heartRateData.GradeName = classInfo.GradeName;
// heartRateData.ClassName = classInfo.ClassName;
// heartRateData.ScoreTime = timeNow;
// heartRateData.IsDisplay = true;
//}
heartRateData.Code = paramDto.Code;
heartRateData.SchoolCode = paramDto.SchoolCode;
heartRateData.ClassRoomRecordId = paramDto.ClassRoomRecordId;
heartRateData.ClassroomStageId = paramDto.ClassroomStageId;
heartRateData.TeacherId = paramDto.TeacherId;
heartRateData.ScoreTime = timeNow;
heartRateData.IsDisplay = true;
});
try
{
await _heartRateDataRepository.AddRangeAsync(heartRateDatas);
await _heartRateDataRepository.SaveChangesAsync();
}
catch (Exception e)
{
throw;
}
await _heartRateDataRepository.AddRangeAsync(heartRateDatas);
await _heartRateDataRepository.SaveChangesAsync();
}
/// <summary>
@ -958,10 +958,10 @@ namespace VOL.Ai.Services
var fastJumpRopeDatas = _mapper.Map<List<Ai_FastJumpRopeData>>(paramDto.Datas);
var classIds = paramDto.Datas.Select(x => x.ClassId).ToList();
var classIds = paramDto.Datas.Select(x => x.ClassId).Distinct().ToList();
var classList = await _classRepository.FindAsync(x => x.SchoolCode == paramDto.SchoolCode && classIds.Contains(x.Id));
var classDict = classList.ToDictionary(x => x.Id, x => x);
fastJumpRopeDatas.ForEach(data =>
{
if (classDict.TryGetValue(data.ClassId, out var classInfo))

View File

@ -1,143 +0,0 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using VOL.Core.Configuration;
using VOL.Core.Const;
using VOL.Core.DBManager;
using VOL.Core.Enums;
using VOL.Core.Extensions;
using VOL.Core.WorkFlow;
using VOL.Entity.DomainModels;
namespace VOL.Core.Services
{
/// <summary>
/// 通过内部队列写入心率数据
/// </summary>
public static class HeartRateQueueData
{
public static ConcurrentQueue<Ai_HeartRateData> heartRateQueueData = new ConcurrentQueue<Ai_HeartRateData>();
static HeartRateQueueData()
{
Task.Run(() =>
{
Start();
if (DBType.Name != "MsSql")
{
return;
}
try
{
DBServerProvider.SqlDapper.ExcuteNonQuery("set global local_infile = 'ON';", null);
}
catch (Exception ex)
{
Console.WriteLine($"日志启动调用mysql数据库异常{ex.Message},{ex.StackTrace}");
}
});
}
public static void Add(Ai_HeartRateData heartRateData)
{
heartRateQueueData.Enqueue(heartRateData);
}
private static void Start()
{
DataTable queueTable = CreateEmptyTable();
while (true)
{
try
{
if (heartRateQueueData.Count() > 0)
{
DequeueToTable(queueTable); continue;
}
//每5秒写一次数据
Thread.Sleep(1000);
if (queueTable.Rows.Count == 0) { continue; }
DBServerProvider.SqlDapper.BulkInsert(queueTable, "Ai_HeartRateData", SqlBulkCopyOptions.Default);
queueTable.Clear();
}
catch (Exception ex)
{
Console.WriteLine($"心率数据同步失败:{ex.Message}");
Logger.Error($"心率数据同步失败:{ex.Message}");
Logger.Info(Enums.LoggerType.Add, $"Data:{queueTable.Serialize()}");
queueTable.Clear();
}
}
}
private static void DequeueToTable(DataTable queueTable)
{
// 从队列中取出日志
heartRateQueueData.TryDequeue(out Ai_HeartRateData heartRateData);
DataRow row = queueTable.NewRow();
// 填充 DataRow 的各个列
row["schoolcode"] = heartRateData.SchoolCode;
row["code"] = heartRateData.Code;
row["classroomrecordid"] = heartRateData.ClassRoomRecordId;
row["gradeid"] = heartRateData.GradeId;
row["classid"] = heartRateData.ClassId;
row["gradename"] = heartRateData.GradeName;
row["classname"] = heartRateData.ClassName;
//row["studentcount"] = heartRateData.StudentCount;
row["teacherid"] = heartRateData.TeacherId;
row["studentno"] = heartRateData.StudentNo;
row["studentname"] = heartRateData.StudentName;
row["sex"] = (int)heartRateData.Sex;
//row["starttime"] = heartRateData.StartTime;
//row["endtime"] = heartRateData.EndTime;
row["scoretime"] = heartRateData.ScoreTime;
row["motionduration"] = heartRateData.MotionDuration;
row["consumption"] = heartRateData.Consumption;
row["strength"] = heartRateData.Strength;
row["value"] = heartRateData.Value;
row["remarks"] = heartRateData.Remarks;
// 添加到 DataTable
queueTable.Rows.Add(row);
}
private static DataTable CreateEmptyTable()
{
DataTable queueTable = new DataTable();
// 定义与数据库中小写字段匹配的列
queueTable.Columns.Add("schoolcode", typeof(string)); // 学校Code
queueTable.Columns.Add("code", typeof(string)); // AI设备的唯一编码
queueTable.Columns.Add("classroomrecordid", typeof(int)); // 课堂记录Id
queueTable.Columns.Add("gradeid", typeof(int)); // 年级编号
queueTable.Columns.Add("classid", typeof(int)); // 班级Id
queueTable.Columns.Add("gradename", typeof(string)); // 年级名称
queueTable.Columns.Add("classname", typeof(string)); // 班级名称
//queueTable.Columns.Add("studentcount", typeof(int)); // 班级人数
queueTable.Columns.Add("teacherid", typeof(int)); // 老师Id
queueTable.Columns.Add("studentno", typeof(string)); // 学号
queueTable.Columns.Add("studentname", typeof(string)); // 姓名
queueTable.Columns.Add("sex", typeof(int)); // 性别SexType假设是int类型
//queueTable.Columns.Add("starttime", typeof(DateTime)); // 开始时间
//queueTable.Columns.Add("endtime", typeof(DateTime)); // 结束时间
queueTable.Columns.Add("scoretime", typeof(DateTime)); // 测试时间
queueTable.Columns.Add("motionduration", typeof(int)); // 运动时长/分钟
queueTable.Columns.Add("consumption", typeof(int)); // 运动消耗
queueTable.Columns.Add("strength", typeof(double)); // 运动强度
queueTable.Columns.Add("value", typeof(double)); // 心率
queueTable.Columns.Add("remarks", typeof(string)); // 备注
return queueTable;
}
}
}

View File

@ -318,18 +318,18 @@ namespace VOL.WebApi
//配置HttpContext
app.UseStaticHttpContext();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
//2个下拉框选项 选择对应的文档
//c.SwaggerEndpoint("/swagger/v1/swagger.json", "VOL.Core后台Api");
//c.SwaggerEndpoint("/swagger/v2/swagger.json", "测试第三方Api");
//c.SwaggerEndpoint("/swagger/v3/swagger.json", "SmartSportsServer-Api");
//c.SwaggerEndpoint("/swagger/v4/swagger.json", "物联网-Api");
//c.SwaggerEndpoint("/swagger/v5/swagger.json", "Ai-Api");
c.SwaggerEndpoint("/swagger/v6/swagger.json", "AiApp-Api");
c.RoutePrefix = "";
});
//app.UseSwagger();
//app.UseSwaggerUI(c =>
//{
// //2个下拉框选项 选择对应的文档
// //c.SwaggerEndpoint("/swagger/v1/swagger.json", "VOL.Core后台Api");
// //c.SwaggerEndpoint("/swagger/v2/swagger.json", "测试第三方Api");
// //c.SwaggerEndpoint("/swagger/v3/swagger.json", "SmartSportsServer-Api");
// //c.SwaggerEndpoint("/swagger/v4/swagger.json", "物联网-Api");
// //c.SwaggerEndpoint("/swagger/v5/swagger.json", "Ai-Api");
// c.SwaggerEndpoint("/swagger/v6/swagger.json", "AiApp-Api");
// c.RoutePrefix = "";
//});
app.UseRouting();
app.UseCors();