YD_SmartSports.Api/VOL.Core/Services/HeartRateQueueData.cs
2025-06-06 16:55:14 +08:00

144 lines
6.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}