using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using VOL.Ai.IServices; using VOL.Ai.Services; using VOL.Business.IServices; using VOL.Business.IServices.Training; using VOL.Core.Filters; using VOL.Core.Utilities; using VOL.Entity.DomainModels; using VOL.Entity.Enum; using VOL.Model; using VOL.Model.HomeWork; using VOL.Model.JingShiTiJiao; using VOL.Model.Training.Response; using VOL.System.IRepositories; using VOL.System.Repositories; namespace VOL.WebApi.Controllers.JingShiTiJiao { [Route("api/[controller]")] [ApiController] [ApiExplorerSettings(GroupName = "v3")] [TypeFilter(typeof(CustomApiResponseFilter))] [AllowAnonymous] public class JingShiTiJiaoController : ControllerBase { #region 初始化 private readonly IS_HomeWorkService _homeWorkService; private readonly IJingShiTiJiaoService _jingShiTiJiaoService; private readonly II_TrainingDataService _trainingDataService; private readonly S_StudentRepository _studentRepository; public JingShiTiJiaoController( IS_HomeWorkService homeWorkService, II_TrainingDataService trainingDataService,IJingShiTiJiaoService jingShiTiJiaoService, S_StudentRepository studentRepository) { _homeWorkService = homeWorkService; _trainingDataService = trainingDataService; _jingShiTiJiaoService = jingShiTiJiaoService; _studentRepository = studentRepository; } #endregion #region 作业 /// /// 作业列表 /// /// [HttpGet(nameof(GetHomeWorkPageList))] public async Task> GetHomeWorkPageList(HomeWorkPageListParam paramDto) { return await _homeWorkService.GetHomeWorkPageList(paramDto); } /// /// 作业下学生列表 /// /// [HttpGet(nameof(GetHomeWorkStudents))] public async Task> GetHomeWorkStudents(HomeWorkStudentsParam paramDto) { return await _homeWorkService.GetHomeWorkStudents(paramDto); } /// /// 作业详情 /// /// [HttpGet(nameof(GetSubmittedAssignments))] public async Task> GetSubmittedAssignments(int homeWorkId, string studentNo) { return await _homeWorkService.GetSubmittedAssignments(homeWorkId, studentNo); } #endregion #region 课堂报告 /// /// 课堂报告列表 /// /// [HttpGet(nameof(GetClassReportList))] public async Task> GetClassReportList(ClassReportListParam paramDto) { return await _trainingDataService.GetClassReportList(paramDto); } /// /// 课堂报告详情 /// /// [HttpGet(nameof(GetClassReportDetails))] public async Task GetClassReportDetails(int id) { return await _trainingDataService.GetClassReportDetails(id); } /// /// 学生课堂报告详情 /// /// [HttpGet(nameof(GetStudentClassReportDetails))] public async Task GetStudentClassReportDetails(GetStudentClassReportDetailsDto paramDto) { return await _trainingDataService.GetStudentClassReportDetails(paramDto); } #endregion /// /// 获取所有年级名称 /// /// /// /// 获取年级列表 /// /// [HttpGet(nameof(GetGradeList))] public async Task> GetGradeList(string schoolCode) { //if (string.IsNullOrWhiteSpace(schoolCode)) // return new List(); //var dbContext = _studentRepository.DbContext; //// 1️⃣ 先从数据库读取年级 //var grades = await dbContext.Set() // .Where(x => x.SchoolCode == schoolCode) // .Include(g => g.Classes) // .ToListAsync(); //// 2️⃣ 如果数据库有数据,直接返回 //if (grades != null && grades.Any()) //{ // return grades.Select(g => new GradeNameModel // { // Id = (int)g.Id, // GradeName = g.GradeName, // Class = g.Classes.Select(c => new ClassNameModel // { // Id = (int)c.Id, // ClassName = c.ClassName // }).ToList() // }).ToList(); //} //// 3️⃣ 数据库没有,调用京师接口获取学校年级班级 //var schoolClass = await _jingShiTiJiaoService.GetClassBySchoolAsync(schoolCode); //if (schoolClass?.Grades == null || !schoolClass.Grades.Any()) // throw new Exception("获取京师年级班级失败!"); //var gradeDtos = schoolClass.Grades; //// 4️⃣ 提取所有 GradeNo / ClassNo //var allGradeNos = gradeDtos // .Where(g => !string.IsNullOrWhiteSpace(g.GradeNo)) // .Select(g => g.GradeNo) // .ToList(); //var allClassNos = gradeDtos // .SelectMany(g => g.Classes ?? new List()) // .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo)) // .Select(c => c.ClassNo) // .ToList(); //// 5️⃣ 查询数据库中已存在的数据(幂等) //var existGrades = await dbContext.Set() // .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo)) // .ToListAsync(); //var existClasses = await dbContext.Set() // .Where(x => x.SchoolCode == schoolCode && allClassNos.Contains(x.ClassNo)) // .ToListAsync(); //var existGradeNoSet = existGrades.Select(x => x.GradeNo).ToHashSet(); //var existClassNoSet = existClasses.Select(x => x.ClassNo).ToHashSet(); //// 6️⃣ 构造待插入的年级 + 班级 //var newGrades = new List(); //foreach (var g in gradeDtos) //{ // if (string.IsNullOrWhiteSpace(g.GradeNo) || existGradeNoSet.Contains(g.GradeNo)) // continue; // var grade = new JS_Grade // { // SchoolCode = schoolCode, // Code = "SYSTEM", // 这里可以用默认值或 paramDto.Code // GradeNo = g.GradeNo, // GradeName = g.GradeName, // Classes = g.Classes? // .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo) && !existClassNoSet.Contains(c.ClassNo)) // .Select(c => new JS_Class // { // SchoolCode = schoolCode, // Code = "SYSTEM", // GradeNo = g.GradeNo, // GradeName = g.GradeName, // ClassNo = c.ClassNo, // ClassName = c.ClassName // }).ToList() ?? new List() // }; // newGrades.Add(grade); // existGradeNoSet.Add(g.GradeNo); // foreach (var c in grade.Classes) // existClassNoSet.Add(c.ClassNo); //} //if (newGrades.Any()) // await dbContext.Set().AddRangeAsync(newGrades); //// 7️⃣ 保存(并发幂等兜底) //try //{ // await dbContext.SaveChangesAsync(); //} //catch (DbUpdateException ex) when (ex.InnerException?.Message.Contains("UNIQUE") == true) //{ // // 并发冲突可忽略 //} //// 8️⃣ 回查数据库,组装返回 DTO //grades = await dbContext.Set() // .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo)) // .Include(g => g.Classes) // .ToListAsync(); //return grades.Select(g => new GradeNameModel //{ // Id = (int)g.Id, // GradeName = g.GradeName, // Class = g.Classes.Select(c => new ClassNameModel // { // Id = (int)c.Id, // ClassName = c.ClassName // }).ToList() //}).ToList(); if (string.IsNullOrWhiteSpace(schoolCode)) return new List(); //var dbContext = _studentRepository.DbContext; // 1️⃣ 先从数据库读取年级 //var grades = await dbContext.Set() // .Where(x => x.SchoolCode == schoolCode) // .Include(g => g.Classes) // .ToListAsync(); //// 2️⃣ 数据库有数据,直接返回 //if (grades != null && grades.Any()) //{ // return grades.Select(g => new GradeNameModel // { // Id = (int)g.Id, // GradeName = g.GradeName, // Class = g.Classes.Select(c => new ClassNameModel // { // Id = (int)c.Id, // ClassName = c.ClassName // }).ToList() // }).ToList(); //} // 3️⃣ 数据库没有数据,调用京师接口获取年级班级 var schoolClass = await _jingShiTiJiaoService.GetClassBySchoolAsync(schoolCode); if (schoolClass?.Grades == null || !schoolClass.Grades.Any()) return new List(); // 或抛异常 var gradeDtos = schoolClass.Grades; // 4️⃣ 直接组装 DTO 返回,不落库 var result = gradeDtos.Select(g => new GradeNameModel { Id = 0, // 京师接口数据没有数据库 Id,可以用 0 或其他占位 GradeName = g.GradeName, Class = g.Classes?.Select(c => new ClassNameModel { Id = 0, // 同上 ClassName = c.ClassName }).ToList() ?? new List() }).ToList(); return result; } } }