This commit is contained in:
tanglong 2025-12-31 14:07:16 +08:00
parent 011f3fa3a4
commit fbbc82d081
40 changed files with 1074 additions and 44 deletions

View File

@ -134,6 +134,14 @@ namespace YD_AllHeartRates.Api.Entitys
[Column(TypeName = "int")]
public int Value { get; set; }
/// <summary>
///瞬时心率
/// </summary>
[Display(Name = "瞬时心率")]
[Comment("瞬时心率")]
[Column(TypeName = "int")]
public int InstantValue { get; set; }
/// <summary>
///电量
/// </summary>
@ -141,5 +149,31 @@ namespace YD_AllHeartRates.Api.Entitys
[Comment("电量")]
[Column(TypeName = "int")]
public int QuantityOfElectricity { get; set; }
/// <summary>
///上传时间
/// </summary>
[Display(Name = "上传时间")]
[Comment("上传时间")]
[Column(TypeName = "datetime")]
[Editable(true)]
public DateTime UploadTime { get; set; }
/// <summary>
///创建时间
/// </summary>
[Display(Name = "创建时间")]
[Comment("创建时间")]
[Column(TypeName = "datetime")]
[Editable(true)]
public DateTime CreateTime { get; set; }
/// <summary>
///行政区
/// </summary>
[Display(Name = "行政区")]
[Comment("行政区")]
[Column(TypeName = "nvarchar(100)")]
public string Area { get; set; }
}
}

View File

@ -1597,6 +1597,90 @@
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimSportsRoutineReportResponse.msgSetString">
<summary>设置 SportsRoutineReportResponse.set_msg(SportsRoutineReportResponse this, String value) 的 填充码</summary>
</member>
<member name="T:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo">
<summary>YD_AllHeartRates.Commons.Dto.DataPush.StudentCacheInfo 的填充码类型</summary>
</member>
<member name="M:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.#ctor">
<summary>初始化新的填充码实例</summary>
</member>
<member name="M:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.#ctor(YD_AllHeartRates.Commons.Dto.DataPush.StudentCacheInfo)">
<summary>初始化给定实例的新填充码</summary>
</member>
<member name="T:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.AllInstances">
<summary>为所有实例成员定义填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.AllInstances.ClassNameGet">
<summary>设置 StudentCacheInfo.get_ClassName(StudentCacheInfo this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.AllInstances.ClassNameSetString">
<summary>设置 StudentCacheInfo.set_ClassName(StudentCacheInfo this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.AllInstances.EduIdGet">
<summary>设置 StudentCacheInfo.get_EduId(StudentCacheInfo this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.AllInstances.EduIdSetString">
<summary>设置 StudentCacheInfo.set_EduId(StudentCacheInfo this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.AllInstances.GradeGet">
<summary>设置 StudentCacheInfo.get_Grade(StudentCacheInfo this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.AllInstances.GradeSetString">
<summary>设置 StudentCacheInfo.set_Grade(StudentCacheInfo this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.AllInstances.NameGet">
<summary>设置 StudentCacheInfo.get_Name(StudentCacheInfo this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.AllInstances.NameSetString">
<summary>设置 StudentCacheInfo.set_Name(StudentCacheInfo this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.AllInstances.SchoolGet">
<summary>设置 StudentCacheInfo.get_School(StudentCacheInfo this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.AllInstances.SchoolSetString">
<summary>设置 StudentCacheInfo.set_School(StudentCacheInfo this, String value) 的 填充码</summary>
</member>
<member name="M:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.BehaveAsCurrent">
<summary>为已填充的类型的所有方法分配“Current”行为</summary>
</member>
<member name="M:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.BehaveAsNotImplemented">
<summary>为已填充的类型的所有方法分配“NotImplemented”行为</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.Behavior">
<summary>为已填充的类型的所有方法分配行为</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.ClassNameGet">
<summary>设置 StudentCacheInfo.get_ClassName(StudentCacheInfo this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.ClassNameSetString">
<summary>设置 StudentCacheInfo.set_ClassName(StudentCacheInfo this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.Constructor">
<summary>设置 StudentCacheInfo.StudentCacheInfo(StudentCacheInfo this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.EduIdGet">
<summary>设置 StudentCacheInfo.get_EduId(StudentCacheInfo this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.EduIdSetString">
<summary>设置 StudentCacheInfo.set_EduId(StudentCacheInfo this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.GradeGet">
<summary>设置 StudentCacheInfo.get_Grade(StudentCacheInfo this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.GradeSetString">
<summary>设置 StudentCacheInfo.set_Grade(StudentCacheInfo this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.NameGet">
<summary>设置 StudentCacheInfo.get_Name(StudentCacheInfo this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.NameSetString">
<summary>设置 StudentCacheInfo.set_Name(StudentCacheInfo this, String value) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.SchoolGet">
<summary>设置 StudentCacheInfo.get_School(StudentCacheInfo this) 的 填充码</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentCacheInfo.SchoolSetString">
<summary>设置 StudentCacheInfo.set_School(StudentCacheInfo this, String value) 的 填充码</summary>
</member>
<member name="T:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.ShimStudentData">
<summary>YD_AllHeartRates.Commons.Dto.DataPush.StudentData 的填充码类型</summary>
</member>
@ -1813,6 +1897,24 @@
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.StubSportsRoutineReportResponse.InstanceObserver">
<summary>获取或设置实例观察者。</summary>
</member>
<member name="T:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.StubStudentCacheInfo">
<summary>YD_AllHeartRates.Commons.Dto.DataPush.StudentCacheInfo 的存根类型</summary>
</member>
<member name="M:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.StubStudentCacheInfo.#ctor">
<summary>初始化新实例</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.StubStudentCacheInfo.CallBase">
<summary>获取或设置一个值,该值指示是否应调用基方法而不调用回退行为</summary>
</member>
<member name="M:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.StubStudentCacheInfo.InitializeStub">
<summary>初始化 type StubStudentCacheInfo 的新实例</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.StubStudentCacheInfo.InstanceBehavior">
<summary>获取或设置实例行为。</summary>
</member>
<member name="P:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.StubStudentCacheInfo.InstanceObserver">
<summary>获取或设置实例观察者。</summary>
</member>
<member name="T:YD_AllHeartRates.Commons.Dto.DataPush.Fakes.StubStudentData">
<summary>YD_AllHeartRates.Commons.Dto.DataPush.StudentData 的存根类型</summary>
</member>

View File

@ -1,6 +1,9 @@
using Newtonsoft.Json;
using System;
using YD_AllHeartRates.Api.Context;
using YD_AllHeartRates.Api.Entitys;
using YD_AllHeartRates.Api.Services.Interface;
using YD_AllHeartRates.Api.Utilities;
using YD_AllHeartRates.Commons.Dto.DataPush;
using YD_AllHeartRates.Commons.MemoryCaches;
using YD_AllHeartRates.Commons.Utils;
@ -13,6 +16,7 @@ namespace YD_AllHeartRates.Api.Middlewares
private Timer _timer;
private readonly ICaching _caching;
public UserContext _userContext;
private static string[] ChangXing = new string[]
{
@ -94,33 +98,48 @@ namespace YD_AllHeartRates.Api.Middlewares
"朱紫芸"
};
private static List<string> _eduIds = new List<string>();
private readonly List<StudentCacheInfo> _students = new();
public SportsRoutineReportJob(IDataPushService dataPushService, ICaching caching)
public SportsRoutineReportJob(IDataPushService dataPushService, UserContext userContext, ICaching caching)
{
_dataPushService = dataPushService;
_userContext = userContext;
_caching = caching;
// 尝试从 Redis 获取缓存
var cachedEduIds = _caching.Get<List<string>>("StudentEduIds");
if (cachedEduIds != null && cachedEduIds.Count > 0)
// Redis 中缓存键
const string redisKey = "StudentEduInfos";
// 1. 尝试从 Redis 获取缓存
var cachedList = _caching.Get<List<StudentCacheInfo>>(redisKey);
if (cachedList != null && cachedList.Count > 0)
{
_eduIds = cachedEduIds;
Console.WriteLine("从 Redis 加载学生 EduId 完成。");
return; // 已有缓存直接返回
_students = cachedList;
Console.WriteLine("从 Redis 加载学生信息完成。");
return;
}
// 2. 缓存不存在 → 调用接口获取
var result = new List<StudentCacheInfo>();
// 正大中学
foreach (var name in ZhengDa)
{
var student = _dataPushService
.GetStudentEduId("上海市崇明区正大中学", "七年级", "5班", name, "")
.Result
.Result?
.FirstOrDefault();
if (student != null)
{
_eduIds.Add(student.EduId);
result.Add(new StudentCacheInfo
{
School = "上海市崇明区正大中学",
Grade = "七年级",
ClassName = "5班",
Name = name,
EduId = student.EduId
});
Console.WriteLine($"正大中学:[{DateTime.Now}] {name}: {student.EduId}");
}
}
@ -130,23 +149,33 @@ namespace YD_AllHeartRates.Api.Middlewares
{
var student = _dataPushService
.GetStudentEduId("上海市崇明区长兴小学", "二年级", "二年级2班", name, "")
.Result
.Result?
.FirstOrDefault();
if (student != null)
{
_eduIds.Add(student.EduId);
result.Add(new StudentCacheInfo
{
School = "上海市崇明区长兴小学",
Grade = "二年级",
ClassName = "二年级2班",
Name = name,
EduId = student.EduId
});
Console.WriteLine($"长兴小学:[{DateTime.Now}] {name}: {student.EduId}");
}
}
var json = JsonConvert.SerializeObject(_eduIds);
_caching.AddObject("StudentEduIds", json);
Console.WriteLine("学生 EduId 已缓存到 Redis。");
// 写入 Redis(直接存对象,不再存 json 字符串)
_caching.AddObject(redisKey, result);
_students = result;
Console.WriteLine("学生信息已缓存到 Redis。");
}
public Task StartAsync(CancellationToken cancellationToken)
{
{
// 每分钟检查一次时间,看是否在8-16点并整点执行
_timer = new Timer(async _ => await DoWork(), null, TimeSpan.Zero, TimeSpan.FromMinutes(1));
return Task.CompletedTask;
@ -156,40 +185,71 @@ namespace YD_AllHeartRates.Api.Middlewares
{
var now = DateTime.Now;
// 定时任务:每天 8:30 ~ 18:30,每小时执行一次
var heartRateDatas = new List<HeartRateData>();
// 每天 8:30 ~ 18:30,每小时的第 30 分钟执行
if (now.Hour >= 8 && now.Hour <= 18 && now.Minute == 30)
{
var random = new Random();
var data = new List<StudentData>();
for (int i = 0; i < _eduIds.Count; i++)
for (int i = 0; i < _students.Count; i++)
{
var stu = _students[i]; // 学生完整信息(含学校/班级/姓名/EduId)
var hdsjList = new List<HeartRateRecordDto>();
// 每个学生生成 60 条心率数据,间隔可平均分在过去 24 小时
var beginTime = now.AddHours(-24);
var intervalMinutes = 24 * 60 / 60; // 24 小时 / 60 条 = 每条间隔分钟数
// 从当前时间往前推 59 分钟
var recordTime = now.AddMinutes(-59);
for (int j = 0; j < 60; j++)
{
var recordTime = beginTime.AddMinutes(j * intervalMinutes);
var xl = random.Next(70, 111);
var jxxl = random.Next(60, 91);
hdsjList.Add(new HeartRateRecordDto
{
SJSJ = recordTime.ToString("yyyy-MM-dd HH:mm:ss"),
XL = random.Next(70, 111), // 正常心率 70~110
JXXL = random.Next(60, 91) // 静息心率
XL = xl,
JXXL = jxxl
});
recordTime = recordTime.AddMinutes(1); // 间隔 1 分钟
heartRateDatas.Add(new HeartRateData()
{
SchoolCode = stu.School,
Area = "本部",
Code = stu.EduId,
GradeName = stu.Grade,
ClassName = stu.ClassName,
GradeId = 1,
ClassId = 1,
StudentName = stu.Name,
Sex = 0,
Consumption = 0,
CreateTime = now,
UploadTime = now,
Value = xl,
InstantValue = jxxl,
ScoreTime = recordTime,
MotionDuration = 0,
Strength = 0,
QuantityOfElectricity = 0,
StudentNo = stu.EduId
});
}
// SBID = 设备编号(按顺序递增)
var student = new StudentData
{
SBID = (i + 1).ToString("D2"),
XSEDUID = _eduIds[i],
XSEDUID = stu.EduId,
HDSJ = hdsjList
};
data.Add(student);
Console.WriteLine(
$"生成数据 → {stu.School}-{stu.Grade}-{stu.ClassName}-{stu.Name} | EduId:{stu.EduId}");
}
try
@ -201,10 +261,22 @@ namespace YD_AllHeartRates.Api.Middlewares
{
Console.WriteLine($"[{DateTime.Now}] HeartRate job msg:{ex.Message}");
}
try
{
await _userContext.HeartRateData.AddRangeAsync(heartRateDatas);
await _userContext.SaveChangesAsync();
Console.WriteLine($"[{DateTime.Now}] HeartRate Add:{heartRateDatas.Count}");
}
catch (Exception ex)
{
Console.WriteLine($"[{DateTime.Now}] HeartRate Add:{ex.Message}");
}
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
_timer?.Change(Timeout.Infinite, 0);

View File

@ -0,0 +1,319 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using YD_AllHeartRates.Api.Context;
#nullable disable
namespace YD_AllHeartRates.Api.Migrations
{
[DbContext(typeof(UserContext))]
[Migration("20251217092150_12051217v1")]
partial class _12051217v1
{
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("YD_AllHeartRates.Api.Entitys.HeartRateData", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasComment("Id");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1);
b.Property<int>("ClassId")
.HasColumnType("int")
.HasComment("班级Id");
b.Property<string>("ClassName")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("班级名称");
b.Property<string>("Code")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("AI设备的唯一编码");
b.Property<int?>("Consumption")
.HasColumnType("int")
.HasComment("运动消耗");
b.Property<DateTime>("CreateTime")
.HasColumnType("datetime")
.HasComment("创建时间");
b.Property<int?>("GradeId")
.HasColumnType("int")
.HasComment("年级编号");
b.Property<string>("GradeName")
.HasColumnType("nvarchar(100)")
.HasComment("年级名称");
b.Property<int>("InstantValue")
.HasColumnType("int")
.HasComment("瞬时心率");
b.Property<int>("MotionDuration")
.HasColumnType("int")
.HasComment("运动时长/分钟");
b.Property<int>("QuantityOfElectricity")
.HasColumnType("int")
.HasComment("电量");
b.Property<string>("SchoolCode")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("学校Code");
b.Property<DateTime>("ScoreTime")
.HasColumnType("datetime")
.HasComment("测试时间");
b.Property<int>("Sex")
.HasColumnType("int")
.HasComment("学校Co性别de");
b.Property<int>("Strength")
.HasColumnType("int")
.HasComment("运动强度");
b.Property<string>("StudentName")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("姓名");
b.Property<string>("StudentNo")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("学号");
b.Property<DateTime>("UploadTime")
.HasColumnType("datetime")
.HasComment("上传时间");
b.Property<int>("Value")
.HasColumnType("int")
.HasComment("心率");
b.HasKey("Id");
b.ToTable("HeartRateData");
});
modelBuilder.Entity("YD_AllHeartRates.Api.Entitys.JumpRopeData", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasComment("Id");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1);
b.Property<int>("ClassId")
.HasColumnType("int")
.HasComment("班级Id");
b.Property<string>("ClassName")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("班级名称");
b.Property<string>("Code")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("AI设备的唯一编码");
b.Property<int>("ErrorNumber")
.HasColumnType("int")
.HasComment("错误个数");
b.Property<int>("GradeId")
.HasColumnType("int")
.HasComment("年级编号");
b.Property<string>("GradeName")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("年级名称");
b.Property<int>("JumpValue")
.HasColumnType("int")
.HasComment("正确个数");
b.Property<int>("QuantityOfElectricity")
.HasColumnType("int")
.HasComment("电量");
b.Property<string>("SchoolCode")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("学校Code");
b.Property<DateTime>("ScoreTime")
.HasColumnType("datetime")
.HasComment("测试时间");
b.Property<int>("Sex")
.HasColumnType("int")
.HasComment("学校Co性别de");
b.Property<string>("StudentName")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("姓名");
b.Property<string>("StudentNo")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("学号");
b.HasKey("Id");
b.ToTable("JumpRopeData");
});
modelBuilder.Entity("YD_AllHeartRates.Api.Entitys.User", b =>
{
b.Property<int>("User_Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasComment("Id");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("User_Id"), 1L, 1);
b.Property<string>("Address")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("地址");
b.Property<DateTime?>("BirthDate")
.HasColumnType("datetime")
.HasComment("出生日期");
b.Property<DateTime?>("CreateDate")
.HasColumnType("datetime")
.HasComment("创建时间");
b.Property<int?>("Creator")
.HasColumnType("int)")
.HasComment("创建人");
b.Property<string>("Email")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)")
.HasComment("Email");
b.Property<byte>("Enable")
.HasColumnType("tinyint")
.HasComment("是否可用");
b.Property<int?>("Gender")
.HasColumnType("int")
.HasComment("性别");
b.Property<string>("HeadImageUrl")
.HasMaxLength(500)
.HasColumnType("nvarchar(500)")
.HasComment("头像");
b.Property<double?>("Height")
.HasColumnType("float")
.HasComment("身高");
b.Property<int?>("Modifier")
.HasColumnType("int)")
.HasComment("修改人");
b.Property<DateTime?>("ModifyDate")
.HasColumnType("datetime")
.HasComment("修改时间");
b.Property<string>("PhoneNo")
.HasMaxLength(11)
.HasColumnType("nvarchar(11)")
.HasComment("手机号");
b.Property<Guid>("RelevanceId")
.HasColumnType("uniqueidentifier");
b.Property<string>("Remarks")
.HasColumnType("text")
.HasComment("备注");
b.Property<string>("RoleName")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("角色");
b.Property<int>("Role_Id")
.HasColumnType("int")
.HasComment("角色Id");
b.Property<string>("SchoolCode")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("学校编号");
b.Property<string>("UserName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)")
.HasComment("帐号");
b.Property<string>("UserPwd")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("密码");
b.Property<string>("UserTrueName")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("姓名");
b.Property<double?>("Weight")
.HasColumnType("float")
.HasComment("体重");
b.Property<string>("wx_HeadImgUrl")
.HasMaxLength(2000)
.HasColumnType("nvarchar(2000)")
.HasComment("微信头像");
b.Property<string>("wx_NickName")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("微信昵称");
b.Property<string>("wx_OpenID")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("微信OpenId");
b.Property<string>("wx_UnionID")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("微信UnionId");
b.HasKey("User_Id");
b.ToTable("User");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,97 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace YD_AllHeartRates.Api.Migrations
{
public partial class _12051217v1 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<int>(
name: "JumpValue",
table: "JumpRopeData",
type: "int",
nullable: false,
defaultValue: 0,
comment: "正确个数",
oldClrType: typeof(int),
oldType: "int",
oldNullable: true,
oldComment: "正确个数");
migrationBuilder.AlterColumn<int>(
name: "ErrorNumber",
table: "JumpRopeData",
type: "int",
nullable: false,
defaultValue: 0,
comment: "错误个数",
oldClrType: typeof(int),
oldType: "int",
oldNullable: true,
oldComment: "错误个数");
migrationBuilder.AddColumn<DateTime>(
name: "CreateTime",
table: "HeartRateData",
type: "datetime2",
nullable: false,
defaultValue: DateTime.MinValue, // 0001-01-01
comment: "创建时间");
migrationBuilder.AddColumn<DateTime>(
name: "UploadTime",
table: "HeartRateData",
type: "datetime2",
nullable: false,
defaultValue: DateTime.MinValue,
comment: "上传时间");
migrationBuilder.AddColumn<int>(
name: "InstantValue",
table: "HeartRateData",
type: "int",
nullable: false,
defaultValue: 0,
comment: "瞬时心率");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "CreateTime",
table: "HeartRateData");
migrationBuilder.DropColumn(
name: "InstantValue",
table: "HeartRateData");
migrationBuilder.DropColumn(
name: "UploadTime",
table: "HeartRateData");
migrationBuilder.AlterColumn<int>(
name: "JumpValue",
table: "JumpRopeData",
type: "int",
nullable: true,
comment: "正确个数",
oldClrType: typeof(int),
oldType: "int",
oldComment: "正确个数");
migrationBuilder.AlterColumn<int>(
name: "ErrorNumber",
table: "JumpRopeData",
type: "int",
nullable: true,
comment: "错误个数",
oldClrType: typeof(int),
oldType: "int",
oldComment: "错误个数");
}
}
}

View File

@ -0,0 +1,324 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using YD_AllHeartRates.Api.Context;
#nullable disable
namespace YD_AllHeartRates.Api.Migrations
{
[DbContext(typeof(UserContext))]
[Migration("20251217095824_12051217v2")]
partial class _12051217v2
{
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("YD_AllHeartRates.Api.Entitys.HeartRateData", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasComment("Id");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1);
b.Property<string>("Area")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("行政区");
b.Property<int>("ClassId")
.HasColumnType("int")
.HasComment("班级Id");
b.Property<string>("ClassName")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("班级名称");
b.Property<string>("Code")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("AI设备的唯一编码");
b.Property<int?>("Consumption")
.HasColumnType("int")
.HasComment("运动消耗");
b.Property<DateTime>("CreateTime")
.HasColumnType("datetime")
.HasComment("创建时间");
b.Property<int?>("GradeId")
.HasColumnType("int")
.HasComment("年级编号");
b.Property<string>("GradeName")
.HasColumnType("nvarchar(100)")
.HasComment("年级名称");
b.Property<int>("InstantValue")
.HasColumnType("int")
.HasComment("瞬时心率");
b.Property<int>("MotionDuration")
.HasColumnType("int")
.HasComment("运动时长/分钟");
b.Property<int>("QuantityOfElectricity")
.HasColumnType("int")
.HasComment("电量");
b.Property<string>("SchoolCode")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("学校Code");
b.Property<DateTime>("ScoreTime")
.HasColumnType("datetime")
.HasComment("测试时间");
b.Property<int>("Sex")
.HasColumnType("int")
.HasComment("学校Co性别de");
b.Property<int>("Strength")
.HasColumnType("int")
.HasComment("运动强度");
b.Property<string>("StudentName")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("姓名");
b.Property<string>("StudentNo")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("学号");
b.Property<DateTime>("UploadTime")
.HasColumnType("datetime")
.HasComment("上传时间");
b.Property<int>("Value")
.HasColumnType("int")
.HasComment("心率");
b.HasKey("Id");
b.ToTable("HeartRateData");
});
modelBuilder.Entity("YD_AllHeartRates.Api.Entitys.JumpRopeData", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasComment("Id");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1);
b.Property<int>("ClassId")
.HasColumnType("int")
.HasComment("班级Id");
b.Property<string>("ClassName")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("班级名称");
b.Property<string>("Code")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("AI设备的唯一编码");
b.Property<int>("ErrorNumber")
.HasColumnType("int")
.HasComment("错误个数");
b.Property<int>("GradeId")
.HasColumnType("int")
.HasComment("年级编号");
b.Property<string>("GradeName")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("年级名称");
b.Property<int>("JumpValue")
.HasColumnType("int")
.HasComment("正确个数");
b.Property<int>("QuantityOfElectricity")
.HasColumnType("int")
.HasComment("电量");
b.Property<string>("SchoolCode")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("学校Code");
b.Property<DateTime>("ScoreTime")
.HasColumnType("datetime")
.HasComment("测试时间");
b.Property<int>("Sex")
.HasColumnType("int")
.HasComment("学校Co性别de");
b.Property<string>("StudentName")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("姓名");
b.Property<string>("StudentNo")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("学号");
b.HasKey("Id");
b.ToTable("JumpRopeData");
});
modelBuilder.Entity("YD_AllHeartRates.Api.Entitys.User", b =>
{
b.Property<int>("User_Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasComment("Id");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("User_Id"), 1L, 1);
b.Property<string>("Address")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("地址");
b.Property<DateTime?>("BirthDate")
.HasColumnType("datetime")
.HasComment("出生日期");
b.Property<DateTime?>("CreateDate")
.HasColumnType("datetime")
.HasComment("创建时间");
b.Property<int?>("Creator")
.HasColumnType("int)")
.HasComment("创建人");
b.Property<string>("Email")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)")
.HasComment("Email");
b.Property<byte>("Enable")
.HasColumnType("tinyint")
.HasComment("是否可用");
b.Property<int?>("Gender")
.HasColumnType("int")
.HasComment("性别");
b.Property<string>("HeadImageUrl")
.HasMaxLength(500)
.HasColumnType("nvarchar(500)")
.HasComment("头像");
b.Property<double?>("Height")
.HasColumnType("float")
.HasComment("身高");
b.Property<int?>("Modifier")
.HasColumnType("int)")
.HasComment("修改人");
b.Property<DateTime?>("ModifyDate")
.HasColumnType("datetime")
.HasComment("修改时间");
b.Property<string>("PhoneNo")
.HasMaxLength(11)
.HasColumnType("nvarchar(11)")
.HasComment("手机号");
b.Property<Guid>("RelevanceId")
.HasColumnType("uniqueidentifier");
b.Property<string>("Remarks")
.HasColumnType("text")
.HasComment("备注");
b.Property<string>("RoleName")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("角色");
b.Property<int>("Role_Id")
.HasColumnType("int")
.HasComment("角色Id");
b.Property<string>("SchoolCode")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("学校编号");
b.Property<string>("UserName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)")
.HasComment("帐号");
b.Property<string>("UserPwd")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("密码");
b.Property<string>("UserTrueName")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("姓名");
b.Property<double?>("Weight")
.HasColumnType("float")
.HasComment("体重");
b.Property<string>("wx_HeadImgUrl")
.HasMaxLength(2000)
.HasColumnType("nvarchar(2000)")
.HasComment("微信头像");
b.Property<string>("wx_NickName")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("微信昵称");
b.Property<string>("wx_OpenID")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("微信OpenId");
b.Property<string>("wx_UnionID")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)")
.HasComment("微信UnionId");
b.HasKey("User_Id");
b.ToTable("User");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,27 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace YD_AllHeartRates.Api.Migrations
{
public partial class _12051217v2 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Area",
table: "HeartRateData",
type: "nvarchar(100)",
nullable: false,
defaultValue: "",
comment: "行政区");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Area",
table: "HeartRateData");
}
}
}

View File

@ -31,6 +31,11 @@ namespace YD_AllHeartRates.Api.Migrations
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1);
b.Property<string>("Area")
.IsRequired()
.HasColumnType("nvarchar(100)")
.HasComment("行政区");
b.Property<int>("ClassId")
.HasColumnType("int")
.HasComment("班级Id");
@ -49,6 +54,10 @@ namespace YD_AllHeartRates.Api.Migrations
.HasColumnType("int")
.HasComment("运动消耗");
b.Property<DateTime>("CreateTime")
.HasColumnType("datetime")
.HasComment("创建时间");
b.Property<int?>("GradeId")
.HasColumnType("int")
.HasComment("年级编号");
@ -57,6 +66,10 @@ namespace YD_AllHeartRates.Api.Migrations
.HasColumnType("nvarchar(100)")
.HasComment("年级名称");
b.Property<int>("InstantValue")
.HasColumnType("int")
.HasComment("瞬时心率");
b.Property<int>("MotionDuration")
.HasColumnType("int")
.HasComment("运动时长/分钟");
@ -92,6 +105,10 @@ namespace YD_AllHeartRates.Api.Migrations
.HasColumnType("nvarchar(100)")
.HasComment("学号");
b.Property<DateTime>("UploadTime")
.HasColumnType("datetime")
.HasComment("上传时间");
b.Property<int>("Value")
.HasColumnType("int")
.HasComment("心率");
@ -124,7 +141,7 @@ namespace YD_AllHeartRates.Api.Migrations
.HasColumnType("nvarchar(100)")
.HasComment("AI设备的唯一编码");
b.Property<int?>("ErrorNumber")
b.Property<int>("ErrorNumber")
.HasColumnType("int")
.HasComment("错误个数");
@ -137,7 +154,7 @@ namespace YD_AllHeartRates.Api.Migrations
.HasColumnType("nvarchar(100)")
.HasComment("年级名称");
b.Property<int?>("JumpValue")
b.Property<int>("JumpValue")
.HasColumnType("int")
.HasComment("正确个数");

View File

@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("YD_AllHeartRates.Api")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+24ee15b7b50692742c8b3b473f35816e9066b2b1")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+011f3fa3a42013578e38a444dc772a11385294fb")]
[assembly: System.Reflection.AssemblyProductAttribute("YD_AllHeartRates.Api")]
[assembly: System.Reflection.AssemblyTitleAttribute("YD_AllHeartRates.Api")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
9974da8b4c2c60d16c128ae3f34b19149b967ee33d081a58b7674b52fa6c3185
ecffa5d967cb875f0853baf5a760205cf86862807fa88bc6d1529980a4227736

View File

@ -1 +1 @@
567f2220a101ec6f7987622521fa90162c707a3dd991877160fc0262bc9e514b
ace2f8cd508a97aab61fe53ad211290a1089ef674bbdabf4d3660f4e95ac0455

View File

@ -271,11 +271,31 @@
心率
</summary>
</member>
<member name="P:YD_AllHeartRates.Api.Entitys.HeartRateData.InstantValue">
<summary>
瞬时心率
</summary>
</member>
<member name="P:YD_AllHeartRates.Api.Entitys.HeartRateData.QuantityOfElectricity">
<summary>
电量
</summary>
</member>
<member name="P:YD_AllHeartRates.Api.Entitys.HeartRateData.UploadTime">
<summary>
上传时间
</summary>
</member>
<member name="P:YD_AllHeartRates.Api.Entitys.HeartRateData.CreateTime">
<summary>
创建时间
</summary>
</member>
<member name="P:YD_AllHeartRates.Api.Entitys.HeartRateData.Area">
<summary>
行政区
</summary>
</member>
<member name="T:YD_AllHeartRates.Api.Entitys.JumpRopeData">
<summary>
跳绳数据

View File

@ -143,7 +143,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.101\\RuntimeIdentifierGraph.json"
}
}
},
@ -235,7 +235,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.101\\RuntimeIdentifierGraph.json"
}
}
}

View File

@ -7340,7 +7340,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.101\\RuntimeIdentifierGraph.json"
}
}
}

View File

@ -1,6 +1,6 @@
{
"version": 2,
"dgSpecHash": "nEMOlcYlR+g=",
"dgSpecHash": "INeCvY02y7M=",
"success": true,
"projectFilePath": "C:\\Users\\tangl\\Desktop\\Git\\YD_AllHeartRates.Api\\YD_AllHeartRates.Api\\YD_AllHeartRates.Api.csproj",
"expectedPackageFiles": [

View File

@ -10157,7 +10157,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.101\\RuntimeIdentifierGraph.json"
}
},
"runtimes": {

View File

@ -1,6 +1,6 @@
{
"version": 2,
"dgSpecHash": "7OYOAiPONks=",
"dgSpecHash": "FJU+n2AUOOQ=",
"success": true,
"projectFilePath": "C:\\Users\\tangl\\Desktop\\Git\\YD_AllHeartRates.Api\\YD_AllHeartRates.Api\\YD_AllHeartRates.Api.csproj",
"expectedPackageFiles": [

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace YD_AllHeartRates.Commons.Dto.DataPush
{
public class StudentCacheInfo
{
public string School { get; set; }
public string Grade { get; set; }
public string ClassName { get; set; }
public string Name { get; set; }
public string EduId { get; set; }
}
}

View File

@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("YD_AllHeartRates.Commons")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+24ee15b7b50692742c8b3b473f35816e9066b2b1")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+011f3fa3a42013578e38a444dc772a11385294fb")]
[assembly: System.Reflection.AssemblyProductAttribute("YD_AllHeartRates.Commons")]
[assembly: System.Reflection.AssemblyTitleAttribute("YD_AllHeartRates.Commons")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
5ff03eace3a6603ede58a64881e5f61ecc32706ffbd9bd5953b29181564fa8be
9f65588d9b03ce7a818fcd204c4449109376bfc3f4de79f74a9fc3bf306fd9f5

View File

@ -1 +1 @@
8e02dde6e94a4a804cc21d90f5877c232cd302195aeeb06a472732d2f1368c3b
5617ddf650573efc2a5b590948cc293b00556029726aefa94703a4ffd27eb76e

View File

@ -92,7 +92,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.101\\RuntimeIdentifierGraph.json"
}
}
}

View File

@ -1054,7 +1054,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100\\RuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.101\\RuntimeIdentifierGraph.json"
}
}
}

View File

@ -1,6 +1,6 @@
{
"version": 2,
"dgSpecHash": "66S6RYy996A=",
"dgSpecHash": "ooOpzCmP9kE=",
"success": true,
"projectFilePath": "C:\\Users\\tangl\\Desktop\\Git\\YD_AllHeartRates.Api\\YD_AllHeartRates.Commons\\YD_AllHeartRates.Commons.csproj",
"expectedPackageFiles": [