302 lines
11 KiB
C#
302 lines
11 KiB
C#
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 作业
|
||
|
||
/// <summary>
|
||
/// 作业列表
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet(nameof(GetHomeWorkPageList))]
|
||
public async Task<PageDataDto<HomeWorkListModel>> GetHomeWorkPageList(HomeWorkPageListParam paramDto)
|
||
{
|
||
return await _homeWorkService.GetHomeWorkPageList(paramDto);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 作业下学生列表
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet(nameof(GetHomeWorkStudents))]
|
||
public async Task<PageDataDto<HomeWorkStudentsModel>> GetHomeWorkStudents(HomeWorkStudentsParam paramDto)
|
||
{
|
||
return await _homeWorkService.GetHomeWorkStudents(paramDto);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 作业详情
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet(nameof(GetSubmittedAssignments))]
|
||
public async Task<List<SubmittedAssignmentsModel>> GetSubmittedAssignments(int homeWorkId, string studentNo)
|
||
{
|
||
return await _homeWorkService.GetSubmittedAssignments(homeWorkId, studentNo);
|
||
}
|
||
#endregion
|
||
|
||
|
||
#region 课堂报告
|
||
|
||
/// <summary>
|
||
/// 课堂报告列表
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet(nameof(GetClassReportList))]
|
||
public async Task<PageDataDto<ClassReportModel>> GetClassReportList(ClassReportListParam paramDto)
|
||
{
|
||
return await _trainingDataService.GetClassReportList(paramDto);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 课堂报告详情
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet(nameof(GetClassReportDetails))]
|
||
public async Task<GetClassReportDetailsModel> GetClassReportDetails(int id)
|
||
{
|
||
return await _trainingDataService.GetClassReportDetails(id);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 学生课堂报告详情
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet(nameof(GetStudentClassReportDetails))]
|
||
public async Task<GetStudentClassReportDetailsModel> GetStudentClassReportDetails(GetStudentClassReportDetailsDto paramDto)
|
||
{
|
||
return await _trainingDataService.GetStudentClassReportDetails(paramDto);
|
||
}
|
||
|
||
#endregion
|
||
|
||
|
||
/// <summary>
|
||
/// 获取所有年级名称
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
/// <summary>
|
||
/// 获取年级列表
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet(nameof(GetGradeList))]
|
||
public async Task<List<GradeNameModel>> GetGradeList(string schoolCode)
|
||
{
|
||
//if (string.IsNullOrWhiteSpace(schoolCode))
|
||
// return new List<GradeNameModel>();
|
||
|
||
//var dbContext = _studentRepository.DbContext;
|
||
|
||
//// 1️⃣ 先从数据库读取年级
|
||
//var grades = await dbContext.Set<JS_Grade>()
|
||
// .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<JingShiClassDto>())
|
||
// .Where(c => !string.IsNullOrWhiteSpace(c.ClassNo))
|
||
// .Select(c => c.ClassNo)
|
||
// .ToList();
|
||
|
||
//// 5️⃣ 查询数据库中已存在的数据(幂等)
|
||
//var existGrades = await dbContext.Set<JS_Grade>()
|
||
// .Where(x => x.SchoolCode == schoolCode && allGradeNos.Contains(x.GradeNo))
|
||
// .ToListAsync();
|
||
|
||
//var existClasses = await dbContext.Set<JS_Class>()
|
||
// .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<JS_Grade>();
|
||
//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<JS_Class>()
|
||
// };
|
||
|
||
// newGrades.Add(grade);
|
||
|
||
// existGradeNoSet.Add(g.GradeNo);
|
||
// foreach (var c in grade.Classes)
|
||
// existClassNoSet.Add(c.ClassNo);
|
||
//}
|
||
|
||
//if (newGrades.Any())
|
||
// await dbContext.Set<JS_Grade>().AddRangeAsync(newGrades);
|
||
|
||
//// 7️⃣ 保存(并发幂等兜底)
|
||
//try
|
||
//{
|
||
// await dbContext.SaveChangesAsync();
|
||
//}
|
||
//catch (DbUpdateException ex) when (ex.InnerException?.Message.Contains("UNIQUE") == true)
|
||
//{
|
||
// // 并发冲突可忽略
|
||
//}
|
||
|
||
//// 8️⃣ 回查数据库,组装返回 DTO
|
||
//grades = await dbContext.Set<JS_Grade>()
|
||
// .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<GradeNameModel>();
|
||
|
||
var dbContext = _studentRepository.DbContext;
|
||
|
||
// 1️⃣ 先从数据库读取年级
|
||
var grades = await dbContext.Set<JS_Grade>()
|
||
.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<GradeNameModel>(); // 或抛异常
|
||
|
||
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<ClassNameModel>()
|
||
}).ToList();
|
||
|
||
return result;
|
||
}
|
||
}
|
||
}
|