using AutoMapper; using Entities.Contracts; using Entities.DTO; using Microsoft.EntityFrameworkCore; using SharedDATA.Api; using TechHelper.Context; using TechHelper.Repository; using TechHelper.Server.Repositories; using TechHelper.Services; namespace TechHelper.Server.Services { public class StudentSubmissionService : IStudentSubmissionService { private readonly IUnitOfWork _unitOfWork; private readonly IMapper _mapper; private readonly IRepository _submissionRepository; private readonly IRepository _assignmentRepository; private readonly IRepository _userRepository; public StudentSubmissionService( IUnitOfWork unitOfWork, IMapper mapper, IRepository submissionRepository, IRepository assignmentRepository, IRepository userRepository) { _unitOfWork = unitOfWork; _mapper = mapper; _submissionRepository = submissionRepository; _assignmentRepository = assignmentRepository; _userRepository = userRepository; } public async Task GetStudentSubmissionsAsync(Guid studentId) { try { var submissions = await _submissionRepository .GetAll(s => s.StudentId == studentId) .Include(s => s.Assignment) .ThenInclude(a => a.Creator) .OrderByDescending(s => s.SubmissionTime) .ToListAsync(); var result = new List(); foreach (var submission in submissions) { var summary = new StudentSubmissionSummaryDto { Id = submission.Id, AssignmentName = submission.Assignment?.Title ?? "未知作业", ErrorCount = await CalculateErrorCountAsync(submission.Id), CreatedDate = submission.SubmissionTime, Score = (int)submission.OverallGrade, TotalQuestions = submission.Assignment?.TotalQuestions ?? 0, StudentName = submission.Assignment?.Creator?.UserName ?? "未知老师", Status = submission.Status.ToString() }; result.Add(summary); } return ApiResponse.Success(result: result); } catch (Exception ex) { return ApiResponse.Error($"获取学生提交信息失败: {ex.Message}"); } } public async Task GetStudentSubmissionsPagedAsync(Guid studentId, int pageNumber = 1, int pageSize = 10) { try { var totalCount = await _submissionRepository .GetAll(s => s.StudentId == studentId) .CountAsync(); var submissions = await _submissionRepository .GetAll(s => s.StudentId == studentId) .Include(s => s.Assignment) .ThenInclude(a => a.Creator) .OrderByDescending(s => s.SubmissionTime) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) .ToListAsync(); var result = new List(); foreach (var submission in submissions) { var summary = new StudentSubmissionSummaryDto { Id = submission.Id, AssignmentName = submission.Assignment?.Title ?? "未知作业", ErrorCount = await CalculateErrorCountAsync(submission.Id), CreatedDate = submission.SubmissionTime, Score = submission.OverallGrade, TotalQuestions = submission.Assignment?.TotalQuestions ?? 0, StudentName = submission.Assignment?.Creator?.UserName ?? "未知老师", Status = submission.Status.ToString() }; result.Add(summary); } var response = new StudentSubmissionSummaryResponseDto { Submissions = result, TotalCount = totalCount }; return ApiResponse.Success(result: response); } catch (Exception ex) { return ApiResponse.Error($"获取学生提交信息失败: {ex.Message}"); } } private async Task CalculateErrorCountAsync(Guid submissionId) { var submissionDetails = await _unitOfWork.GetRepository() .GetAll(sd => sd.SubmissionId == submissionId) .ToListAsync(); return submissionDetails.Select(x => !x.IsCorrect).Count(); } // 以下方法是IBaseService接口的实现,可以根据需要实现 public Task GetAllAsync() => throw new NotImplementedException(); public Task GetAsync(Guid id) => throw new NotImplementedException(); public Task AddAsync(StudentSubmissionSummaryDto model) => throw new NotImplementedException(); public Task UpdateAsync(StudentSubmissionSummaryDto model) => throw new NotImplementedException(); public Task DeleteAsync(Guid id) => throw new NotImplementedException(); public Task GetAllAsync(QueryParameter query) { throw new NotImplementedException(); } } }