Compare commits
No commits in common. "8daf528de7bcc7e4ba6c88e9492a08cf099b5197" and "0c72b644b3808d71dd4971073429ee98d22b3f60" have entirely different histories.
8daf528de7
...
0c72b644b3
@ -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,36 +906,27 @@ 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).Distinct().ToList();
|
var classIds = paramDto.Datas.Select(x => x.ClassId).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 timeNow = DateTime.Now;
|
var timeNow = DateTime.Now;
|
||||||
|
|
||||||
heartRateDatas.ForEach(heartRateData =>
|
heartRateDatas.ForEach(heartRateData =>
|
||||||
{
|
{
|
||||||
//if (classDict.TryGetValue(heartRateData.ClassId, out var classInfo))
|
var classInfo = classList.Where(x => x.Id == heartRateData.ClassId).First();
|
||||||
//{
|
|
||||||
// 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;
|
||||||
|
//HeartRateQueueData.Add(heartRateData);
|
||||||
});
|
});
|
||||||
|
|
||||||
await _heartRateDataRepository.AddRangeAsync(heartRateDatas);
|
await _heartRateDataRepository.AddRangeAsync(heartRateDatas);
|
||||||
@ -958,27 +949,25 @@ 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).Distinct().ToList();
|
var classIds = paramDto.Datas.Select(x => x.ClassId).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);
|
|
||||||
|
|
||||||
fastJumpRopeDatas.ForEach(data =>
|
fastJumpRopeDatas.ForEach(data =>
|
||||||
{
|
{
|
||||||
if (classDict.TryGetValue(data.ClassId, out var classInfo))
|
var classInfo = classList.Where(x => x.Id == data.ClassId).First();
|
||||||
{
|
|
||||||
data.Code = paramDto.Code;
|
data.Code = paramDto.Code;
|
||||||
data.SchoolCode = paramDto.SchoolCode;
|
data.SchoolCode = paramDto.SchoolCode;
|
||||||
data.ClassRoomRecordId = paramDto.ClassRoomRecordId;
|
data.ClassRoomRecordId = paramDto.ClassRoomRecordId;
|
||||||
data.GroupId = paramDto.GroupId;
|
data.GroupId = paramDto.GroupId;
|
||||||
data.TeacherId = paramDto.TeacherId;
|
data.TeacherId = paramDto.TeacherId;
|
||||||
data.GradeId = classInfo.GradeId;
|
data.GradeId = classInfo.GradeId;
|
||||||
data.GradeName = classInfo.GradeName;
|
data.GradeName = classInfo.GradeName;
|
||||||
data.ClassName = classInfo.ClassName;
|
data.ClassName = classInfo.ClassName;
|
||||||
data.ScoreTime = paramDto.ScoreTime;
|
data.ScoreTime = paramDto.ScoreTime;
|
||||||
data.ModeType = paramDto.ModeType;
|
data.ModeType = paramDto.ModeType;
|
||||||
data.ModelName = paramDto.ModeType.GetDescription();
|
data.ModelName = paramDto.ModeType.GetDescription();
|
||||||
data.UniqueId = paramDto.UniqueId;
|
data.UniqueId = paramDto.UniqueId;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
await _fastJumpRopeDataRepository.AddRangeAsync(fastJumpRopeDatas);
|
await _fastJumpRopeDataRepository.AddRangeAsync(fastJumpRopeDatas);
|
||||||
await _fastJumpRopeDataRepository.SaveChangesAsync();
|
await _fastJumpRopeDataRepository.SaveChangesAsync();
|
||||||
|
143
VOL.Core/Services/HeartRateQueueData.cs
Normal file
143
VOL.Core/Services/HeartRateQueueData.cs
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user