Compare commits

..

5 Commits

Author SHA1 Message Date
68664b8884 ff 2025-07-09 11:21:55 +08:00
a78947ea00 Merge branch 'aiapi2.0' into dev 2025-07-09 10:02:26 +08:00
5e3d8b2f62 dd 2025-07-09 10:01:31 +08:00
0849a3eb2b sss 2025-07-08 15:19:19 +08:00
c743659687 d 2025-07-08 14:30:49 +08:00
16 changed files with 7975 additions and 4 deletions

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VOL.Core.BaseProvider;
using VOL.Core.Extensions.AutofacManager;
using VOL.Entity.DomainModels;
namespace VOL.Ai.IRepositories
{
/// <summary>
/// Ai课堂设置
/// </summary>
public interface IClassroomSettingRepository : IDependency, IRepository<Ai_ClassroomSetting>
{
}
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VOL.Core.BaseProvider;
using VOL.Core.Extensions.AutofacManager;
using VOL.Entity.DomainModels;
namespace VOL.Ai.IRepositories
{
/// <summary>
/// Ai课堂阶段
/// </summary>
public interface IClassroomStageRepository : IDependency, IRepository<Ai_ClassroomStage>
{
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VOL.Core.BaseProvider;
using VOL.Core.Extensions.AutofacManager;
using VOL.Entity.DomainModels;
namespace VOL.Ai.IRepositories
{
/// <summary>
/// Ai扫码登陆
/// </summary>
public interface IScanCodeLoginRepository : IDependency, IRepository<Ai_ScanCodeLogin>
{
}
}

View File

@ -191,6 +191,21 @@ namespace VOL.Ai.IServices
/// <returns></returns>
Task<IsActivityInListDto> IsActivityInList(IsActivityInListRequest paramDto);
/// <summary>
/// Ai一体机扫描那登录轮询
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
Task<Ai_TeacherFaceInfo> ScanCodeLogin(Ai_Request paramDto);
/// <summary>
/// 退出登录
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
Task<bool> LogOut(LoginOutDto paramDto);
#endregion
}
}

View File

@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VOL.Ai.IRepositories;
using VOL.Business.IRepositories;
using VOL.Core.BaseProvider;
using VOL.Core.EFDbContext;
using VOL.Core.Extensions.AutofacManager;
using VOL.Entity.DomainModels;
namespace VOL.Ai.Repositories
{
/// <summary>
/// Ai课堂设置
/// </summary>
public partial class ClassroomSettingRepository : RepositoryBase<Ai_ClassroomSetting>, IClassroomSettingRepository
{
public ClassroomSettingRepository(VOLContext dbContext)
: base(dbContext)
{
}
public static IClassroomSettingRepository Instance
{
get { return AutofacContainerModule.GetService<IClassroomSettingRepository>(); }
}
}
}

View File

@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VOL.Ai.IRepositories;
using VOL.Business.IRepositories;
using VOL.Core.BaseProvider;
using VOL.Core.EFDbContext;
using VOL.Core.Extensions.AutofacManager;
using VOL.Entity.DomainModels;
namespace VOL.Ai.Repositories
{
/// <summary>
/// Ai课堂阶段
/// </summary>
public partial class ClassroomStageRepository : RepositoryBase<Ai_ClassroomStage>, IClassroomStageRepository
{
public ClassroomStageRepository(VOLContext dbContext)
: base(dbContext)
{
}
public static IClassroomStageRepository Instance
{
get { return AutofacContainerModule.GetService<IClassroomStageRepository>(); }
}
}
}

View File

@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VOL.Ai.IRepositories;
using VOL.Business.IRepositories;
using VOL.Core.BaseProvider;
using VOL.Core.EFDbContext;
using VOL.Core.Extensions.AutofacManager;
using VOL.Entity.DomainModels;
namespace VOL.Ai.Repositories
{
/// <summary>
/// Ai扫码登陆
/// </summary>
public partial class ScanCodeLoginRepository : RepositoryBase<Ai_ScanCodeLogin>, IScanCodeLoginRepository
{
public ScanCodeLoginRepository(VOLContext dbContext)
: base(dbContext)
{
}
public static IScanCodeLoginRepository Instance
{
get { return AutofacContainerModule.GetService<IScanCodeLoginRepository>(); }
}
}
}

View File

@ -33,7 +33,7 @@ namespace VOL.Ai.Services
private readonly IS_ClassRepository _classRepository;
private readonly IN_SportsTestCategoryRepository _sportsTestCategoryRepository;
private readonly IN_HealthStandardsRepository _healthStandardsRepository;
private readonly IN_SportsTestResultRepository _sportsTestResultRepository;
private readonly IScanCodeLoginRepository _scanCodeLoginRepository;
private readonly IN_SportsTrainingCategoryRepository _sportsTrainingCategoryRepository;
private readonly IClassRoomRecordRepository _classRoomRecordRepository;
private readonly IHeartRateDataRepository _heartRateDataRepository;
@ -50,7 +50,7 @@ namespace VOL.Ai.Services
IS_ClassRepository classRepository,
IN_SportsTestCategoryRepository sportsTestCategoryRepository,
IN_HealthStandardsRepository healthStandardsRepository,
IN_SportsTestResultRepository sportsTestResultRepository,
IScanCodeLoginRepository scanCodeLoginRepository,
IN_SportsTrainingCategoryRepository sportsTrainingCategoryRepository,
IClassRoomRecordRepository classRoomRecordRepository,
IHeartRateDataRepository heartRateDataRepository,
@ -65,7 +65,7 @@ namespace VOL.Ai.Services
_studentRepository = studentRepository;
_sportsTestCategoryRepository = sportsTestCategoryRepository;
_healthStandardsRepository = healthStandardsRepository;
_sportsTestResultRepository = sportsTestResultRepository;
_scanCodeLoginRepository = scanCodeLoginRepository;
_teacherRepository = teacherRepository;
_sportsTrainingCategoryRepository = sportsTrainingCategoryRepository;
_classRoomRecordRepository = classRoomRecordRepository;
@ -842,7 +842,7 @@ namespace VOL.Ai.Services
entity.Year = semesterDto.Year;
entity.Semester = semesterDto.Semester;
var student = await (from s in _studentRepository.FindAsIQueryable(x => x.SchoolCode == paramDto.SchoolCode && x.StudentNo == paramDto.StudentNo)
join c in _studentRepository.DbContext.Set<S_Class>() on s.ClassId equals c.Id
join c in _classRepository.DbContext.Set<S_Class>() on s.ClassId equals c.Id
select new
{
s.ClassId,
@ -1199,5 +1199,65 @@ namespace VOL.Ai.Services
return res;
}
/// <summary>
/// Ai一体机扫描那登录轮询
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
public async Task<Ai_TeacherFaceInfo> ScanCodeLogin(Ai_Request paramDto)
{
var loginInfo = await _scanCodeLoginRepository.FindAsIQueryable(x => x.Code == paramDto.Code && x.SchoolCode == paramDto.SchoolCode).FirstOrDefaultAsync();
if (loginInfo == null)
return new Ai_TeacherFaceInfo();
var res = await _teacherRepository.FindAsIQueryable(x => x.SchoolCode == paramDto.SchoolCode && x.TeacherStatus != TeacherStatus.Depart && x.TeacherPhoneNo == loginInfo.TeacherPhoneNo && x.Id == loginInfo.TeacherId)
.Select(x =>
new Ai_TeacherFaceInfo()
{
Id = x.Id,
Age = x.Age,
//SchoolCode = x.SchoolCode,
Sex = x.Sex,
Phone = x.TeacherPhoneNo,
TeacherName = x.TeacherName,
Photo = x.TeacherPhoto,
}).FirstOrDefaultAsync();
if (res == null)
throw new Exception("未查询到登陆信息");
var grades = await (
from t in _studentRepository.DbContext.Set<S_ClassAssocTeacher>()
join c in _studentRepository.DbContext.Set<S_Class>() on t.ClassId equals c.Id into classGroup
from c in classGroup.DefaultIfEmpty()
where t.TeacherId == res.Id && c != null
select new Classes()
{
Id = c.Id,
Name = $"{c.GradeName}-{c.ClassName}",
}).ToListAsync();
res.GradeAndClassList = grades;
return res;
}
/// <summary>
/// 退出登录
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
public async Task<bool> LogOut(LoginOutDto paramDto)
{
var teacher = await _scanCodeLoginRepository.FindAsIQueryable(x => x.Code == paramDto.Code && x.SchoolCode == paramDto.SchoolCode).FirstOrDefaultAsync();
if (teacher == null) return true;
_scanCodeLoginRepository.Delete(teacher);
return await _teacherRepository.SaveChangesAsync() > 0;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,62 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace VOL.Core.Migrations
{
public partial class _20250709v1 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "ClassroomStageId",
table: "Ai_ClassRoomRecord",
type: "int",
nullable: false,
defaultValue: 0,
comment: "阶段Id");
migrationBuilder.CreateTable(
name: "Ai_ClassroomSetting",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false, comment: "Id")
.Annotation("SqlServer:Identity", "1, 1"),
ClassRoomRecordId = table.Column<int>(type: "int", nullable: false, comment: "课堂记录Id"),
ClassroomStageId = table.Column<int>(type: "int", nullable: false, comment: "阶段Id"),
Duration = table.Column<int>(type: "int", nullable: false, comment: "时长"),
Density = table.Column<int>(type: "int", nullable: false, comment: "密度")
},
constraints: table =>
{
table.PrimaryKey("PK_Ai_ClassroomSetting", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Ai_ClassroomStage",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false, comment: "Id")
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(type: "nvarchar(200)", nullable: true, comment: "名称")
},
constraints: table =>
{
table.PrimaryKey("PK_Ai_ClassroomStage", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Ai_ClassroomSetting");
migrationBuilder.DropTable(
name: "Ai_ClassroomStage");
migrationBuilder.DropColumn(
name: "ClassroomStageId",
table: "Ai_ClassRoomRecord");
}
}
}

View File

@ -205,6 +205,10 @@ namespace VOL.Core.Migrations
.HasColumnType("nvarchar(100)")
.HasComment("班级名称");
b.Property<int>("ClassroomStageId")
.HasColumnType("int")
.HasComment("阶段Id");
b.Property<string>("Code")
.HasColumnType("nvarchar(100)")
.HasComment("AI设备的唯一编码");
@ -278,6 +282,54 @@ namespace VOL.Core.Migrations
b.ToTable("Ai_ClassRoomRecord");
});
modelBuilder.Entity("VOL.Entity.DomainModels.Ai_ClassroomSetting", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasComment("Id");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1);
b.Property<int>("ClassRoomRecordId")
.HasColumnType("int")
.HasComment("课堂记录Id");
b.Property<int>("ClassroomStageId")
.HasColumnType("int")
.HasComment("阶段Id");
b.Property<int>("Density")
.HasColumnType("int")
.HasComment("密度");
b.Property<int>("Duration")
.HasColumnType("int")
.HasComment("时长");
b.HasKey("Id");
b.ToTable("Ai_ClassroomSetting");
});
modelBuilder.Entity("VOL.Entity.DomainModels.Ai_ClassroomStage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasComment("Id");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1);
b.Property<string>("Name")
.HasColumnType("nvarchar(200)")
.HasComment("名称");
b.HasKey("Id");
b.ToTable("Ai_ClassroomStage");
});
modelBuilder.Entity("VOL.Entity.DomainModels.Ai_ClassroomStudentRecord", b =>
{
b.Property<int>("Id")

View File

@ -45,6 +45,14 @@ namespace VOL.Entity.DomainModels
[Column(TypeName = "nvarchar(200)")]
public string Name { get; set; }
/// <summary>
/// 阶段Id
/// </summary>
[Display(Name = "阶段Id")]
[Comment("阶段Id")]
[Column(TypeName = "int")]
public int ClassroomStageId { get; set; }
/// <summary>
/// 年级编号
/// </summary>

View File

@ -0,0 +1,57 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VOL.Entity.Enum;
using VOL.Entity.SystemModels;
namespace VOL.Entity.DomainModels
{
[Table("Ai_ClassroomSetting")]
[Entity(TableCnName = "Ai课堂设置表", TableName = "Ai_ClassroomSetting")]
public class Ai_ClassroomSetting : BaseEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Display(Description = "主键Id")]
[Comment("Id")]
public int Id { get; set; }
/// <summary>
/// 课堂记录Id
/// </summary>
[Display(Name = "课堂记录Id")]
[Comment("课堂记录Id")]
[Column(TypeName = "int")]
public int ClassRoomRecordId { get; set; }
/// <summary>
/// 阶段Id
/// </summary>
[Display(Name = "阶段Id")]
[Comment("阶段Id")]
[Column(TypeName = "int")]
public int ClassroomStageId { get; set; }
/// <summary>
/// 时长
/// </summary>
[Display(Name = "时长")]
[Comment("时长")]
[Column(TypeName = "int")]
public int Duration { get; set; }
/// <summary>
/// 密度
/// </summary>
[Display(Name = "密度")]
[Comment("密度")]
[Column(TypeName = "int")]
public int Density { get; set; }
}
}

View File

@ -0,0 +1,32 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VOL.Entity.Enum;
using VOL.Entity.SystemModels;
namespace VOL.Entity.DomainModels
{
[Table("Ai_ClassroomStage")]
[Entity(TableCnName = "Ai课堂阶段表", TableName = "Ai_ClassroomStage")]
public class Ai_ClassroomStage : BaseEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Display(Description = "主键Id")]
[Comment("Id")]
public int Id { get; set; }
/// <summary>
/// 名称
/// </summary>
[Display(Name = "名称")]
[Comment("名称")]
[Column(TypeName = "nvarchar(200)")]
public string Name { get; set; }
}
}

View File

@ -77,4 +77,17 @@ namespace VOL.Model.Ai
/// </summary>
//public string StudentNo { get; set; }
}
/// <summary>
/// 退出登录
/// </summary>
public class LoginOutDto : Ai_Request
{
/// <summary>
/// 教师Id
/// </summary>
public int TeacherId { get; set; }
}
}

View File

@ -436,5 +436,31 @@ namespace VOL.WebApi.Controllers
var result = await _aiAppService.FastJumpRopeRanking(paramDto);
return result;
}
/// <summary>
/// Ai一体机扫描那登录轮询
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
[HttpPost(nameof(ScanCodeLogin))]
public async Task<Ai_TeacherFaceInfo> ScanCodeLogin([FromBody] Ai_Request paramDto)
{
var result = await _aiAppService.ScanCodeLogin(paramDto);
return result;
}
/// <summary>
/// 退出登录
/// </summary>
/// <param name="paramDto"></param>
/// <returns></returns>
[HttpPost(nameof(LogOut))]
public async Task<bool> LogOut([FromBody] LoginOutDto paramDto)
{
var result = await _aiAppService.LogOut(paramDto);
return result;
}
}
}