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