From b56bfa545c57d473a58e1af7323d9cbf4c04d459 Mon Sep 17 00:00:00 2001
From: tanglong <842690096@qq.com>
Date: Mon, 12 Jan 2026 16:54:43 +0800
Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=8A=E4=BC=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
VOL.Ai/IServices/IJingShiTiJiaoService.cs | 7 +
VOL.Ai/Services/AiAppService.cs | 84 +-
VOL.Ai/Services/JingShiTiJiaoService.cs | 41 +
VOL.Core/Configuration/AppSetting.cs | 2 +
.../20260112052447_20260112v1.Designer.cs | 7677 +++++++++++++++++
.../Migrations/20260112052447_20260112v1.cs | 37 +
.../Migrations/VOLContextModelSnapshot.cs | 8 +
VOL.Core/Utilities/JSSaTokenSignHelper.cs | 51 +
.../DomainModels/Ai/Ai_ClassRoomRecord.cs | 8 +
.../Business/School/S_HomeWork.cs | 8 +
VOL.Model/JingShiTiJiao/SportsDataPushDto.cs | 30 +
VOL.WebApi/appsettings.json | 4 +-
12 files changed, 7954 insertions(+), 3 deletions(-)
create mode 100644 VOL.Core/Migrations/20260112052447_20260112v1.Designer.cs
create mode 100644 VOL.Core/Migrations/20260112052447_20260112v1.cs
create mode 100644 VOL.Model/JingShiTiJiao/SportsDataPushDto.cs
diff --git a/VOL.Ai/IServices/IJingShiTiJiaoService.cs b/VOL.Ai/IServices/IJingShiTiJiaoService.cs
index 9858eff..c591d90 100644
--- a/VOL.Ai/IServices/IJingShiTiJiaoService.cs
+++ b/VOL.Ai/IServices/IJingShiTiJiaoService.cs
@@ -26,5 +26,12 @@ namespace VOL.Ai.IServices
///
///
Task GetStudentInfo(string stuNo);
+
+ ///
+ /// 上传数据
+ ///
+ ///
+ ///
+ Task PushSportsData(List list);
}
}
diff --git a/VOL.Ai/Services/AiAppService.cs b/VOL.Ai/Services/AiAppService.cs
index 597523c..c72c10c 100644
--- a/VOL.Ai/Services/AiAppService.cs
+++ b/VOL.Ai/Services/AiAppService.cs
@@ -2,6 +2,8 @@
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using System.Collections.Concurrent;
using VOL.Ai.IRepositories;
@@ -25,6 +27,7 @@ using VOL.Model.Norm.Response;
using VOL.Model.Training.Response;
using VOL.System.IRepositories;
using VOL.System.Repositories;
+using static Dapper.SqlMapper;
namespace VOL.Ai.Services
{
@@ -51,6 +54,7 @@ namespace VOL.Ai.Services
private readonly IClassroomSettingRepository _classroomSettingRepository;
private readonly IJingShiTiJiaoService _jingShiTiJiaoService;
+ private readonly ILogger _logger;
[ActivatorUtilitiesConstructor]
public AiAppService(IMapper mapper,
@@ -72,7 +76,8 @@ namespace VOL.Ai.Services
IClassroomStageRepository classroomStageRepository,
IClassroomSettingRepository classroomSettingRepository,
IAiAppVersionRepository aiAppVersionRepository,
- IJingShiTiJiaoService jingShiTiJiaoService
+ IJingShiTiJiaoService jingShiTiJiaoService,
+ ILogger logger
)
{
_mapper = mapper;
@@ -95,6 +100,7 @@ namespace VOL.Ai.Services
_classroomSettingRepository = classroomSettingRepository;
_aiAppVersionRepository = aiAppVersionRepository;
_jingShiTiJiaoService = jingShiTiJiaoService;
+ _logger = logger;
}
#region New
@@ -1062,9 +1068,42 @@ namespace VOL.Ai.Services
}
catch (Exception e)
{
-
+ _logger.LogError(e, "心率数据保存失败");
throw;
}
+
+ // 异步上传心率数据,不阻塞主流程
+ _ = Task.Run(async () =>
+ {
+ try
+ {
+ var uploadList = heartRateDatas.Select(hr => new SportsDataPushDto
+ {
+ StudentNo = hr.StudentNo,
+ SportsItem = AppSetting.JingShiTiJiao.SportsItem,
+ SportsDate = hr.ScoreTime.ToString("yyyy-MM-dd"),
+ SportsService = AppSetting.JingShiTiJiao.Channel,
+ SportsScene = "HeartRate",
+ SportsDetail = JsonConvert.SerializeObject(hr)
+ }).ToList();
+
+ var res = await _jingShiTiJiaoService.PushSportsData(uploadList);
+
+ if (res)
+
+ {
+ _logger.LogInformation($"心率数据同步成功: {JsonConvert.SerializeObject(uploadList)}");
+ }
+ else
+ {
+ _logger.LogError($"心率数据同步失败: {JsonConvert.SerializeObject(uploadList)}");
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "心率数据上传异常");
+ }
+ });
}
///
@@ -1107,6 +1146,38 @@ namespace VOL.Ai.Services
});
await _fastJumpRopeDataRepository.AddRangeAsync(fastJumpRopeDatas);
await _fastJumpRopeDataRepository.SaveChangesAsync();
+
+ // 2️⃣ 异步上传到极智体教平台
+ _ = Task.Run(async () =>
+ {
+ try
+ {
+ var uploadList = fastJumpRopeDatas.Select(d => new SportsDataPushDto
+ {
+ StudentNo = d.StudentNo,
+ SportsItem = AppSetting.JingShiTiJiao.SportsItem,
+ SportsDate = d.ScoreTime.ToString("yyyy-MM-dd"),
+ SportsService = AppSetting.JingShiTiJiao.Channel,
+ SportsScene = "FastJumpRope",
+ SportsDetail = JsonConvert.SerializeObject(d)
+ }).ToList();
+
+ var res = await _jingShiTiJiaoService.PushSportsData(uploadList);
+
+ if (res)
+ {
+ _logger.LogInformation($"速度跳绳数据同步成功: {JsonConvert.SerializeObject(uploadList)}");
+ }
+ else
+ {
+ _logger.LogError($"速度跳绳数据同步失败: {JsonConvert.SerializeObject(uploadList)}");
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "速度跳绳数据上传异常");
+ }
+ });
}
///
@@ -1245,6 +1316,15 @@ namespace VOL.Ai.Services
return new Ai_ClassRoomRecordDto();
}
+ var teacher = await _classRepository.DbContext.Set().Where(x => x.Id == paramDto.TeacherId).FirstOrDefaultAsync();
+
+ if (teacher==null)
+ {
+ Console.WriteLine("未找到老师信息");
+ return new Ai_ClassRoomRecordDto();
+ }
+
+ entity.TeacherNo = teacher.TeacherNo;
entity.ClassName = classInfo.ClassName;
entity.GradeId = (int)classInfo.GradeId;
entity.GradeName = classInfo.GradeName;
diff --git a/VOL.Ai/Services/JingShiTiJiaoService.cs b/VOL.Ai/Services/JingShiTiJiaoService.cs
index 03d087c..c7f60f9 100644
--- a/VOL.Ai/Services/JingShiTiJiaoService.cs
+++ b/VOL.Ai/Services/JingShiTiJiaoService.cs
@@ -1,4 +1,5 @@
using Newtonsoft.Json;
+using System.Text;
using VOL.Ai.IServices;
using VOL.Core.Configuration;
using VOL.Core.Extensions.AutofacManager;
@@ -134,5 +135,45 @@ namespace VOL.Ai.Services
return res;
}
+
+
+ ///
+ /// 上传成绩数据
+ ///
+ ///
+ ///
+ ///
+ public async Task PushSportsData(List list)
+ {
+ long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+ string nonce = SaTokenSignHelper.RandomString();
+
+ var paramMap = new Dictionary
+ {
+ { "channel", AppSetting.JingShiTiJiao.Channel },
+ { "timestamp", timestamp },
+ { "nonce", nonce }
+ };
+
+ string jsonBody = JsonConvert.SerializeObject(list);
+
+ // ⭐ POST JSON 的签名
+ string queryStr = SaTokenSignHelper.BuildPostJsonQueryString(
+ paramMap,
+ AppSetting.JingShiTiJiao.SecretKey,
+ jsonBody);
+
+ string url = $"{AppSetting.JingShiTiJiao.BaseUrl}/api/sports/data/push?{queryStr}";
+
+ using var client = new HttpClient();
+ var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
+
+ var response = await client.PostAsync(url, content);
+ string result = await response.Content.ReadAsStringAsync();
+
+ var res = JsonConvert.DeserializeObject>(result);
+
+ return res != null && res.Code == 0;
+ }
}
}
diff --git a/VOL.Core/Configuration/AppSetting.cs b/VOL.Core/Configuration/AppSetting.cs
index bedf7da..d687a49 100644
--- a/VOL.Core/Configuration/AppSetting.cs
+++ b/VOL.Core/Configuration/AppSetting.cs
@@ -262,5 +262,7 @@ namespace VOL.Core.Configuration
public string Channel { get; set; }
public string SecretKey { get; set; }
public string BaseUrl { get; set; }
+ public string SchoolCode { get; set; }
+ public string SportsItem { get; set; }
}
}
\ No newline at end of file
diff --git a/VOL.Core/Migrations/20260112052447_20260112v1.Designer.cs b/VOL.Core/Migrations/20260112052447_20260112v1.Designer.cs
new file mode 100644
index 0000000..ba5acda
--- /dev/null
+++ b/VOL.Core/Migrations/20260112052447_20260112v1.Designer.cs
@@ -0,0 +1,7677 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using VOL.Core.EFDbContext;
+
+#nullable disable
+
+namespace VOL.Core.Migrations
+{
+ [DbContext(typeof(VOLContext))]
+ [Migration("20260112052447_20260112v1")]
+ partial class _20260112v1
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "6.0.0")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1);
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_ActivitiestData", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("ActivitiesId")
+ .HasColumnType("int")
+ .HasComment("活动Id");
+
+ b.Property("AdditionalScore")
+ .HasColumnType("float")
+ .HasComment("附加分");
+
+ b.Property("CategoryValue")
+ .HasColumnType("int")
+ .HasComment("项目类型");
+
+ b.Property("ClassId")
+ .HasColumnType("int")
+ .HasComment("班级Id");
+
+ b.Property("ClassName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("班级名称");
+
+ b.Property("ClassRoomRecordId")
+ .HasColumnType("int")
+ .HasComment("课堂记录Id");
+
+ b.Property("Code")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("AI设备的唯一编码");
+
+ b.Property("CorrectJudge")
+ .HasColumnType("nvarchar(4000)")
+ .HasComment("动作解析");
+
+ b.Property("CorrectNumber")
+ .HasColumnType("int")
+ .HasComment("正确个数");
+
+ b.Property("DataType")
+ .HasColumnType("int")
+ .HasComment("模式类型");
+
+ b.Property("Duration")
+ .HasColumnType("int")
+ .HasComment("持续时间");
+
+ b.Property("EndTime")
+ .HasColumnType("datetime")
+ .HasComment("结束时间");
+
+ b.Property("ErrorNumber")
+ .HasColumnType("int")
+ .HasComment("错误个数");
+
+ b.Property("GradeId")
+ .HasColumnType("int")
+ .HasComment("年级编号");
+
+ b.Property("GradeName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("年级名称");
+
+ b.Property("IsDisplay")
+ .HasColumnType("bit")
+ .HasComment("是否显示");
+
+ b.Property("MaxValue")
+ .HasColumnType("int")
+ .HasComment("最大");
+
+ b.Property("MinValue")
+ .HasColumnType("int")
+ .HasComment("最小");
+
+ b.Property("ModeType")
+ .HasColumnType("int")
+ .HasComment("模式类型");
+
+ b.Property("ModelName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("模式名称");
+
+ b.Property("MotionDuration")
+ .HasColumnType("int")
+ .HasComment("运动时长/分钟");
+
+ b.Property("Rank")
+ .HasColumnType("int")
+ .HasComment("训练成绩等级");
+
+ b.Property("RankStr")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("等级");
+
+ b.Property("Remark")
+ .HasColumnType("nvarchar(4000)")
+ .HasComment("设备评价语");
+
+ b.Property("SchoolCode")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学校Code");
+
+ b.Property("Score")
+ .HasColumnType("float")
+ .HasComment("得分");
+
+ b.Property("ScoreTime")
+ .HasColumnType("datetime")
+ .HasComment("测试时间");
+
+ b.Property("Semester")
+ .HasColumnType("int)")
+ .HasComment("学期");
+
+ b.Property("Sex")
+ .HasColumnType("int")
+ .HasComment("学校Co性别de");
+
+ b.Property("StartTime")
+ .HasColumnType("datetime")
+ .HasComment("开始时间");
+
+ b.Property("StudentName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("姓名");
+
+ b.Property("StudentNo")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学号");
+
+ b.Property("TeacherId")
+ .HasColumnType("int")
+ .HasComment("老师Id");
+
+ b.Property("UniqueId")
+ .HasColumnType("bigint")
+ .HasComment("设备上传成绩时唯一标识, 重复时服务端不保存数据");
+
+ b.Property("Value")
+ .HasColumnType("float")
+ .HasComment("测试成绩");
+
+ b.Property("WrongResults")
+ .HasColumnType("float")
+ .HasComment("错误成绩");
+
+ b.Property("Year")
+ .HasColumnType("int)")
+ .HasComment("当前年份");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_ActivitiestData");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_AppVersion", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("AppType")
+ .HasColumnType("int")
+ .HasComment("AppType");
+
+ b.Property("CreateDate")
+ .HasColumnType("datetime")
+ .HasComment("创建时间");
+
+ b.Property("Remarks")
+ .HasColumnType("nvarchar(2000)")
+ .HasComment("备注");
+
+ b.Property("Url")
+ .HasColumnType("nvarchar(2000)")
+ .HasComment("下载地址");
+
+ b.Property("Version")
+ .HasColumnType("nvarchar(200)")
+ .HasComment("版本号");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_AppVersion");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_ClassRoomRecord", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("AddCount")
+ .HasColumnType("int")
+ .HasComment("新增人数");
+
+ b.Property("ClassId")
+ .HasColumnType("int")
+ .HasComment("班级Id");
+
+ b.Property("ClassName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("班级名称");
+
+ b.Property("Code")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("AI设备的唯一编码");
+
+ b.Property("EndTime")
+ .HasColumnType("datetime")
+ .HasComment("结束时间");
+
+ b.Property("GradeId")
+ .HasColumnType("int")
+ .HasComment("年级编号");
+
+ b.Property("GradeName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("年级名称");
+
+ b.Property("IsDisplay")
+ .HasColumnType("bit")
+ .HasComment("是否显示");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(200)")
+ .HasComment("名称");
+
+ b.Property("NoParticipateCount")
+ .HasColumnType("int")
+ .HasComment("缺勤人数");
+
+ b.Property("ParticipateCount")
+ .HasColumnType("int")
+ .HasComment("参与人数");
+
+ b.Property("Remarks")
+ .HasColumnType("text")
+ .HasComment("备注");
+
+ b.Property("SchoolCode")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学校Code");
+
+ b.Property("Semester")
+ .HasColumnType("int)")
+ .HasComment("学期");
+
+ b.Property("StartTime")
+ .HasColumnType("datetime")
+ .HasComment("开始时间");
+
+ b.Property("StudentCount")
+ .HasColumnType("int")
+ .HasComment("班级下学生人数");
+
+ b.Property("TeacherId")
+ .HasColumnType("int")
+ .HasComment("老师Id");
+
+ b.Property("TeacherName")
+ .HasColumnType("nvarchar(200)")
+ .HasComment("老师姓名");
+
+ b.Property("TeacherNo")
+ .HasColumnType("nvarchar(200)")
+ .HasComment("老师编号");
+
+ b.Property("TrainingModuleEnum")
+ .HasColumnType("int")
+ .HasComment("训练模块枚举");
+
+ b.Property("Year")
+ .HasColumnType("int)")
+ .HasComment("当前年份");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_ClassRoomRecord");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_ClassroomSetting", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("ClassRoomRecordId")
+ .HasColumnType("int")
+ .HasComment("课堂记录Id");
+
+ b.Property("ClassroomStageId")
+ .HasColumnType("int")
+ .HasComment("阶段Id");
+
+ b.Property("Density")
+ .HasColumnType("int")
+ .HasComment("密度");
+
+ b.Property("Duration")
+ .HasColumnType("int")
+ .HasComment("时长");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_ClassroomSetting");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_ClassroomStage", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(200)")
+ .HasComment("名称");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_ClassroomStage");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_ClassroomStudentRecord", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("Age")
+ .HasColumnType("int")
+ .HasComment("年龄");
+
+ b.Property("ClassId")
+ .HasColumnType("int")
+ .HasComment("班级Id");
+
+ b.Property("ClassName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("班级名称");
+
+ b.Property("ClassRoomRecordId")
+ .HasColumnType("int")
+ .HasComment("课堂记录Id");
+
+ b.Property("Code")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("AI设备的唯一编码");
+
+ b.Property("GradeId")
+ .HasColumnType("int")
+ .HasComment("年级编号");
+
+ b.Property("GradeName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("年级名称");
+
+ b.Property("IsDisplay")
+ .HasColumnType("bit")
+ .HasComment("是否显示");
+
+ b.Property("SchoolCode")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学校Code");
+
+ b.Property("Sex")
+ .HasColumnType("int")
+ .HasComment("学校Co性别de");
+
+ b.Property("StudentName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("姓名");
+
+ b.Property("StudentNo")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学号");
+
+ b.Property("TeacherId")
+ .HasColumnType("int")
+ .HasComment("老师Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ClassRoomRecordId");
+
+ b.ToTable("Ai_ClassroomStudentRecord");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_Device", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("Code")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("AI设备的唯一编码");
+
+ b.Property("CreateDate")
+ .HasColumnType("datetime")
+ .HasComment("创建时间");
+
+ b.Property("Creator")
+ .HasColumnType("int)")
+ .HasComment("创建人");
+
+ b.Property("DeviceType")
+ .HasColumnType("int")
+ .HasComment("设备类型");
+
+ b.Property("EndTime")
+ .HasColumnType("datetime")
+ .HasComment("有效期结束时间");
+
+ b.Property("Modifier")
+ .HasColumnType("int)")
+ .HasComment("修改人");
+
+ b.Property("ModifyDate")
+ .HasColumnType("datetime")
+ .HasComment("修改时间");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(200)")
+ .HasComment("AI设备名称");
+
+ b.Property("Remarks")
+ .HasColumnType("text")
+ .HasComment("备注");
+
+ b.Property("StartTime")
+ .HasColumnType("datetime")
+ .HasComment("有效期开始时间");
+
+ b.Property("Status")
+ .HasColumnType("int")
+ .HasComment("设备状态 固定值:1:启用2:禁用,禁用的设备无法使用");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_Device");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_DeviceAssocSchool", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("Code")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("AI设备的唯一编码");
+
+ b.Property("SchoolCode")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学校编号");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_DeviceAssocSchool");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_FastJumpRopeData", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("ClassId")
+ .HasColumnType("int")
+ .HasComment("班级Id");
+
+ b.Property("ClassName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("班级名称");
+
+ b.Property("ClassRoomRecordId")
+ .HasColumnType("int")
+ .HasComment("课堂记录Id");
+
+ b.Property("Code")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("AI设备的唯一编码");
+
+ b.Property("EndTime")
+ .HasColumnType("datetime")
+ .HasComment("结束时间");
+
+ b.Property("ErrorNumber")
+ .HasColumnType("int")
+ .HasComment("错误个数");
+
+ b.Property("GradeId")
+ .HasColumnType("int")
+ .HasComment("年级编号");
+
+ b.Property("GradeName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("年级名称");
+
+ b.Property("GroupId")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("GroupId");
+
+ b.Property("IsDisplay")
+ .HasColumnType("bit")
+ .HasComment("是否显示");
+
+ b.Property("JumpValue")
+ .HasColumnType("int")
+ .HasComment("正确个数");
+
+ b.Property("ModeType")
+ .HasColumnType("int")
+ .HasComment("模式类型");
+
+ b.Property("ModelName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("模式名称");
+
+ b.Property("MotionDuration")
+ .HasColumnType("int")
+ .HasComment("运动时长/秒");
+
+ b.Property("Rank")
+ .HasColumnType("int")
+ .HasComment("等级");
+
+ b.Property("RankEnum")
+ .HasColumnType("int")
+ .HasComment("训练成绩等级");
+
+ b.Property("SchoolCode")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学校Code");
+
+ b.Property("ScoreTime")
+ .HasColumnType("datetime")
+ .HasComment("测试时间");
+
+ b.Property("Sex")
+ .HasColumnType("int")
+ .HasComment("学校Co性别de");
+
+ b.Property("StartTime")
+ .HasColumnType("datetime")
+ .HasComment("开始时间");
+
+ b.Property("StudentCount")
+ .HasColumnType("int")
+ .HasComment("测试人数");
+
+ b.Property("StudentName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("姓名");
+
+ b.Property("StudentNo")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学号");
+
+ b.Property("TeacherId")
+ .HasColumnType("int")
+ .HasComment("老师Id");
+
+ b.Property("TrainingModule")
+ .HasColumnType("int")
+ .HasComment("训练模块[[1:专项教学/2:测评考级/3:AI赛场/4:AI体测]/5:速度跳绳");
+
+ b.Property("UniqueId")
+ .HasColumnType("bigint")
+ .HasComment("设备上传成绩时唯一标识, 重复时服务端不保存数据");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_FastJumpRopeData");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_HeartRateData", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("ClassId")
+ .HasColumnType("int")
+ .HasComment("班级Id");
+
+ b.Property("ClassName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("班级名称");
+
+ b.Property("ClassRoomRecordId")
+ .HasColumnType("int")
+ .HasComment("课堂记录Id");
+
+ b.Property("ClassroomStageId")
+ .HasColumnType("int")
+ .HasComment("阶段Id");
+
+ b.Property("Code")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("AI设备的唯一编码");
+
+ b.Property("Consumption")
+ .HasColumnType("int")
+ .HasComment("运动消耗");
+
+ b.Property("GradeId")
+ .HasColumnType("int")
+ .HasComment("年级编号");
+
+ b.Property("GradeName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("年级名称");
+
+ b.Property("IsDisplay")
+ .HasColumnType("bit")
+ .HasComment("是否显示");
+
+ b.Property("MotionDuration")
+ .HasColumnType("int")
+ .HasComment("运动时长/分钟");
+
+ b.Property("Remarks")
+ .HasColumnType("text")
+ .HasComment("备注");
+
+ b.Property("SchoolCode")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学校Code");
+
+ b.Property("ScoreTime")
+ .HasColumnType("datetime")
+ .HasComment("测试时间");
+
+ b.Property("Sex")
+ .HasColumnType("int")
+ .HasComment("学校Co性别de");
+
+ b.Property("Strength")
+ .HasColumnType("double")
+ .HasComment("运动强度");
+
+ b.Property("StudentName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("姓名");
+
+ b.Property("StudentNo")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学号");
+
+ b.Property("TeacherId")
+ .HasColumnType("int")
+ .HasComment("老师Id");
+
+ b.Property("Value")
+ .HasColumnType("double")
+ .HasComment("心率");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_HeartRateData");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_LevelExamData", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("AssessmentResults")
+ .HasColumnType("int")
+ .HasComment("是否通过");
+
+ b.Property("ClassId")
+ .HasColumnType("int")
+ .HasComment("班级Id");
+
+ b.Property("ClassName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("班级名称");
+
+ b.Property("ClassRoomRecordId")
+ .HasColumnType("int")
+ .HasComment("课堂记录Id");
+
+ b.Property("Code")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("AI设备的唯一编码");
+
+ b.Property("CorrectJudge")
+ .HasColumnType("nvarchar(4000)")
+ .HasComment("动作解析");
+
+ b.Property("CorrectNumber")
+ .HasColumnType("int")
+ .HasComment("正确个数");
+
+ b.Property("Duration")
+ .HasColumnType("int")
+ .HasComment("持续时间");
+
+ b.Property("EndTime")
+ .HasColumnType("datetime")
+ .HasComment("结束时间");
+
+ b.Property("ErrorNumber")
+ .HasColumnType("int")
+ .HasComment("错误个数");
+
+ b.Property("FileName")
+ .HasColumnType("nvarchar(2000)")
+ .HasComment("文件名称");
+
+ b.Property("FileUrl")
+ .HasColumnType("nvarchar(2000)")
+ .HasComment("文件路径");
+
+ b.Property("GradeId")
+ .HasColumnType("int")
+ .HasComment("年级编号");
+
+ b.Property("GradeName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("年级名称");
+
+ b.Property("IsDisplay")
+ .HasColumnType("bit")
+ .HasComment("是否显示");
+
+ b.Property("MaxValue")
+ .HasColumnType("int")
+ .HasComment("最大");
+
+ b.Property("MinValue")
+ .HasColumnType("int")
+ .HasComment("最小");
+
+ b.Property("MotionDuration")
+ .HasColumnType("int")
+ .HasComment("运动时长/分钟");
+
+ b.Property("Rank")
+ .HasColumnType("int")
+ .HasComment("专项测评等级");
+
+ b.Property("RankStr")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("专项测评等级");
+
+ b.Property("Remark")
+ .HasColumnType("nvarchar(4000)")
+ .HasComment("设备评价语");
+
+ b.Property("SchoolCode")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学校Code");
+
+ b.Property("Score")
+ .HasColumnType("float")
+ .HasComment("得分");
+
+ b.Property("ScoreTime")
+ .HasColumnType("datetime")
+ .HasComment("测试时间");
+
+ b.Property("Semester")
+ .HasColumnType("int)")
+ .HasComment("学期");
+
+ b.Property("Sex")
+ .HasColumnType("int")
+ .HasComment("学校Co性别de");
+
+ b.Property("SpecialId")
+ .HasColumnType("int")
+ .HasComment("专项类型Id");
+
+ b.Property("StartTime")
+ .HasColumnType("datetime")
+ .HasComment("开始时间");
+
+ b.Property("StudentName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("姓名");
+
+ b.Property("StudentNo")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学号");
+
+ b.Property("TeacherId")
+ .HasColumnType("int")
+ .HasComment("老师Id");
+
+ b.Property("TeacherPhone")
+ .HasColumnType("varchar(11)")
+ .HasComment("老师手机号");
+
+ b.Property("UniqueId")
+ .HasColumnType("bigint")
+ .HasComment("设备上传成绩时唯一标识, 重复时服务端不保存数据");
+
+ b.Property("Value")
+ .HasColumnType("float")
+ .HasComment("测试成绩");
+
+ b.Property("WrongResults")
+ .HasColumnType("float")
+ .HasComment("错误成绩");
+
+ b.Property("Year")
+ .HasColumnType("int)")
+ .HasComment("当前年份");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_LevelExamData");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_Mode", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("ModeEnum")
+ .HasColumnType("int")
+ .HasComment("模式枚举");
+
+ b.Property("ModeName")
+ .HasColumnType("nvarchar(200)")
+ .HasComment("AI模式名称");
+
+ b.Property("Remarks")
+ .HasColumnType("text")
+ .HasComment("备注");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_Mode");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_ModeAssocModule", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("ModeId")
+ .HasColumnType("int")
+ .HasComment("模式Id");
+
+ b.Property("TrainingModuleId")
+ .HasColumnType("int")
+ .HasComment("模块Id");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_ModeAssocModule");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_ScanCodeLogin", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("Code")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("AI设备的唯一编码");
+
+ b.Property("CreateDate")
+ .HasColumnType("datetime")
+ .HasComment("创建时间");
+
+ b.Property("SchoolCode")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("学校编号");
+
+ b.Property("TeacherId")
+ .HasColumnType("int")
+ .HasComment("老师Id");
+
+ b.Property("TeacherPhoneNo")
+ .HasColumnType("nvarchar(20)")
+ .HasComment("老师联系方式");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_ScanCodeLogin");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_Special", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("CreateDate")
+ .HasColumnType("datetime")
+ .HasComment("创建时间");
+
+ b.Property("Creator")
+ .HasColumnType("int")
+ .HasComment("创建人");
+
+ b.Property("ImageUrl")
+ .HasColumnType("nvarchar(2000)")
+ .HasComment("图片地址");
+
+ b.Property("Modifier")
+ .HasColumnType("int")
+ .HasComment("修改人");
+
+ b.Property("ModifyDate")
+ .HasColumnType("datetime")
+ .HasComment("修改时间");
+
+ b.Property("SpecialName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("专项名称");
+
+ b.HasKey("Id");
+
+ b.ToTable("Ai_Special");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_SpecialAction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("ActionName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("动作名称");
+
+ b.Property("ActionType")
+ .IsRequired()
+ .HasColumnType("nvarchar(100)")
+ .HasComment("动作类型");
+
+ b.Property("ActionVideoPath")
+ .HasColumnType("nvarchar(2000)")
+ .HasComment("动作示范-视频路径");
+
+ b.Property("CreateDate")
+ .HasColumnType("datetime")
+ .HasComment("创建时间");
+
+ b.Property("Creator")
+ .HasColumnType("int")
+ .HasComment("创建人");
+
+ b.Property("ExerciseVideoPath")
+ .HasColumnType("nvarchar(2000)")
+ .HasComment("练习方法-视频路径");
+
+ b.Property("ExplainVideoPath")
+ .HasColumnType("nvarchar(2000)")
+ .HasComment("要领讲解-视频路径");
+
+ b.Property("Modifier")
+ .HasColumnType("int")
+ .HasComment("修改人");
+
+ b.Property("ModifyDate")
+ .HasColumnType("datetime")
+ .HasComment("修改时间");
+
+ b.Property("SpecialLevelId")
+ .HasColumnType("int")
+ .HasComment("专项水平Id");
+
+ b.Property("StandardVideoPath")
+ .HasColumnType("nvarchar(2000)")
+ .HasComment("达标标准-视频路径");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SpecialLevelId");
+
+ b.ToTable("Ai_SpecialAction");
+ });
+
+ modelBuilder.Entity("VOL.Entity.DomainModels.Ai_SpecialLevel", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasComment("Id");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1);
+
+ b.Property("CreateDate")
+ .HasColumnType("datetime")
+ .HasComment("创建时间");
+
+ b.Property("Creator")
+ .HasColumnType("int")
+ .HasComment("创建人");
+
+ b.Property("EndGrade")
+ .HasColumnType("int")
+ .HasComment("结束年级");
+
+ b.Property("LevelName")
+ .HasColumnType("nvarchar(100)")
+ .HasComment("水平名称");
+
+ b.Property("Modifier")
+ .HasColumnType("int")
+ .HasComment("修改人");
+
+ b.Property("ModifyDate")
+ .HasColumnType("datetime")
+ .HasComment("修改时间");
+
+ b.Property