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 IAiAppVersionRepository _aiAppVersionRepository;
private readonly IN_SportsTrainingCategoryRepository _sportsTrainingCategoryRepository; private readonly IN_SportsTrainingCategoryRepository _sportsTrainingCategoryRepository;
private readonly IClassRoomRecordRepository _classRoomRecordRepository; private readonly IClassRoomRecordRepository _classRoomRecordRepository;
private readonly IHeartRateDataRepository _heartRateDataRepository;
private readonly IActivitiestDataRepository _activitiestDataRepository; private readonly IActivitiestDataRepository _activitiestDataRepository;
private readonly ILevelExamDataRepository _levelExamDataRepository; private readonly ILevelExamDataRepository _levelExamDataRepository;
private readonly ISportsTestDataRepository _sportsTestDataRepository; private readonly ISportsTestDataRepository _sportsTestDataRepository;
private readonly ITrainingDataRepository _trainingDataRepository; private readonly ITrainingDataRepository _trainingDataRepository;
private readonly IFastJumpRopeDataRepository _fastJumpRopeDataRepository; private readonly IFastJumpRopeDataRepository _fastJumpRopeDataRepository;
private readonly IHeartRateDataRepository _heartRateDataRepository;
private readonly ISys_UserRepository _userRepository; private readonly ISys_UserRepository _userRepository;
private readonly IClassroomStageRepository _classroomStageRepository; private readonly IClassroomStageRepository _classroomStageRepository;
private readonly IClassroomSettingRepository _classroomSettingRepository; private readonly IClassroomSettingRepository _classroomSettingRepository;
@ -60,12 +60,12 @@ namespace VOL.Ai.Services
IScanCodeLoginRepository scanCodeLoginRepository, IScanCodeLoginRepository scanCodeLoginRepository,
IN_SportsTrainingCategoryRepository sportsTrainingCategoryRepository, IN_SportsTrainingCategoryRepository sportsTrainingCategoryRepository,
IClassRoomRecordRepository classRoomRecordRepository, IClassRoomRecordRepository classRoomRecordRepository,
IHeartRateDataRepository heartRateDataRepository,
IActivitiestDataRepository activitiestDataRepository, IActivitiestDataRepository activitiestDataRepository,
ILevelExamDataRepository levelExamDataRepository, ILevelExamDataRepository levelExamDataRepository,
ISportsTestDataRepository sportsTestDataRepository, ISportsTestDataRepository sportsTestDataRepository,
ITrainingDataRepository trainingDataRepository, ITrainingDataRepository trainingDataRepository,
IFastJumpRopeDataRepository fastJumpRopeDataRepository, IFastJumpRopeDataRepository fastJumpRopeDataRepository,
IHeartRateDataRepository heartRateDataRepository,
ISys_UserRepository userRepository, ISys_UserRepository userRepository,
IClassroomStageRepository classroomStageRepository, IClassroomStageRepository classroomStageRepository,
IClassroomSettingRepository classroomSettingRepository, IClassroomSettingRepository classroomSettingRepository,
@ -80,13 +80,13 @@ namespace VOL.Ai.Services
_teacherRepository = teacherRepository; _teacherRepository = teacherRepository;
_sportsTrainingCategoryRepository = sportsTrainingCategoryRepository; _sportsTrainingCategoryRepository = sportsTrainingCategoryRepository;
_classRoomRecordRepository = classRoomRecordRepository; _classRoomRecordRepository = classRoomRecordRepository;
_heartRateDataRepository = heartRateDataRepository;
_activitiestDataRepository = activitiestDataRepository; _activitiestDataRepository = activitiestDataRepository;
_levelExamDataRepository = levelExamDataRepository; _levelExamDataRepository = levelExamDataRepository;
_sportsTestDataRepository = sportsTestDataRepository; _sportsTestDataRepository = sportsTestDataRepository;
_trainingDataRepository = trainingDataRepository; _trainingDataRepository = trainingDataRepository;
_classRepository = classRepository; _classRepository = classRepository;
_fastJumpRopeDataRepository = fastJumpRopeDataRepository; _fastJumpRopeDataRepository = fastJumpRopeDataRepository;
_heartRateDataRepository = heartRateDataRepository;
_userRepository = userRepository; _userRepository = userRepository;
_classroomStageRepository = classroomStageRepository; _classroomStageRepository = classroomStageRepository;
_classroomSettingRepository = classroomSettingRepository; _classroomSettingRepository = classroomSettingRepository;
@ -906,41 +906,41 @@ namespace VOL.Ai.Services
} }
var heartRateDatas = _mapper.Map<List<Ai_HeartRateData>>(paramDto.Datas); 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 classIds = paramDto.Datas.Select(x => x.ClassId).Distinct().ToList();
var classList = await _classRepository.FindAsIQueryable(x => x.SchoolCode == paramDto.SchoolCode && classIds.Contains(x.Id)).ToListAsync(); //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 timeNow = DateTime.Now;
var classDict = classList.ToDictionary(x => x.Id, x => x);
heartRateDatas.ForEach(heartRateData => heartRateDatas.ForEach(heartRateData =>
{ {
if (classDict.TryGetValue(heartRateData.ClassId, out var classInfo)) //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.Code = paramDto.Code;
heartRateData.SchoolCode = paramDto.SchoolCode; heartRateData.SchoolCode = paramDto.SchoolCode;
heartRateData.ClassRoomRecordId = paramDto.ClassRoomRecordId; heartRateData.ClassRoomRecordId = paramDto.ClassRoomRecordId;
heartRateData.ClassroomStageId = paramDto.ClassroomStageId; heartRateData.ClassroomStageId = paramDto.ClassroomStageId;
heartRateData.TeacherId = paramDto.TeacherId; heartRateData.TeacherId = paramDto.TeacherId;
heartRateData.GradeId = classInfo.GradeId;
heartRateData.GradeName = classInfo.GradeName;
heartRateData.ScoreTime = timeNow; heartRateData.ScoreTime = timeNow;
heartRateData.IsDisplay = true; heartRateData.IsDisplay = true;
}
}); });
try
{
await _heartRateDataRepository.AddRangeAsync(heartRateDatas); await _heartRateDataRepository.AddRangeAsync(heartRateDatas);
await _heartRateDataRepository.SaveChangesAsync(); await _heartRateDataRepository.SaveChangesAsync();
} }
catch (Exception e)
{
throw;
}
}
/// <summary> /// <summary>
/// 速度跳绳成绩上传 /// 速度跳绳成绩上传
@ -958,10 +958,10 @@ namespace VOL.Ai.Services
var fastJumpRopeDatas = _mapper.Map<List<Ai_FastJumpRopeData>>(paramDto.Datas); 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 classList = await _classRepository.FindAsync(x => x.SchoolCode == paramDto.SchoolCode && classIds.Contains(x.Id));
var classDict = classList.ToDictionary(x => x.Id, x => x); var classDict = classList.ToDictionary(x => x.Id, x => x);
fastJumpRopeDatas.ForEach(data => fastJumpRopeDatas.ForEach(data =>
{ {
if (classDict.TryGetValue(data.ClassId, out var classInfo)) 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 //配置HttpContext
app.UseStaticHttpContext(); app.UseStaticHttpContext();
app.UseSwagger(); //app.UseSwagger();
app.UseSwaggerUI(c => //app.UseSwaggerUI(c =>
{ //{
//2个下拉框选项 选择对应的文档 // //2个下拉框选项 选择对应的文档
//c.SwaggerEndpoint("/swagger/v1/swagger.json", "VOL.Core后台Api"); // //c.SwaggerEndpoint("/swagger/v1/swagger.json", "VOL.Core后台Api");
//c.SwaggerEndpoint("/swagger/v2/swagger.json", "测试第三方Api"); // //c.SwaggerEndpoint("/swagger/v2/swagger.json", "测试第三方Api");
//c.SwaggerEndpoint("/swagger/v3/swagger.json", "SmartSportsServer-Api"); // //c.SwaggerEndpoint("/swagger/v3/swagger.json", "SmartSportsServer-Api");
//c.SwaggerEndpoint("/swagger/v4/swagger.json", "物联网-Api"); // //c.SwaggerEndpoint("/swagger/v4/swagger.json", "物联网-Api");
//c.SwaggerEndpoint("/swagger/v5/swagger.json", "Ai-Api"); // //c.SwaggerEndpoint("/swagger/v5/swagger.json", "Ai-Api");
c.SwaggerEndpoint("/swagger/v6/swagger.json", "AiApp-Api"); // c.SwaggerEndpoint("/swagger/v6/swagger.json", "AiApp-Api");
c.RoutePrefix = ""; // c.RoutePrefix = "";
}); //});
app.UseRouting(); app.UseRouting();
app.UseCors(); app.UseCors();