using AutoMapper; using Entities.Contracts; using Entities.DTO; using Microsoft.EntityFrameworkCore; using SharedDATA.Api; using SharedDATA.Context; using TechHelper.Services; namespace TechHelper.Server.Services { public class SubmissionServices : ISubmissionServices { private readonly IUnitOfWork _unitOfWork; private readonly IMapper _mapper; private readonly IRepository _submissionRepository; private readonly IRepository _submissionDetailRepository; public SubmissionServices(IMapper mapper, IUnitOfWork unitOfWork) { _mapper = mapper; _unitOfWork = unitOfWork; _submissionRepository = _unitOfWork.GetRepository(); _submissionDetailRepository = _unitOfWork.GetRepository(); } public async Task AddAsync(Submission model) { try { model.SubmissionTime = DateTime.Now; model.IsDeleted = false; await _submissionRepository.InsertAsync(model); await _unitOfWork.SaveChangesAsync(); var result = _mapper.Map(model); return ApiResponse.Success("提交成功。", result); } catch (Exception ex) { return ApiResponse.Error($"添加提交失败: {ex.Message}"); } } public async Task DeleteAsync(Guid id) { try { var submission = await _submissionRepository.GetFirstOrDefaultAsync(predicate: s => s.Id == id); if (submission == null) { return ApiResponse.Error("未找到要删除的提交。", 404); } submission.IsDeleted = true; _submissionRepository.Update(submission); var submissionDetails = await _submissionDetailRepository.GetPagedListAsync(predicate: sd => sd.SubmissionId == id); foreach (var detail in submissionDetails.Items) { detail.IsDeleted = true; _submissionDetailRepository.Update(detail); } await _unitOfWork.SaveChangesAsync(); return ApiResponse.Success("提交及相关详情删除成功。", null); } catch (Exception ex) { return ApiResponse.Error($"删除提交失败: {ex.Message}"); } } public async Task GetAllAsync(QueryParameter query) { try { var pagedSubmissions = await _submissionRepository.GetPagedListAsync( pageIndex: query.PageIndex, pageSize: query.PageSize, orderBy: s => s.OrderByDescending(s => s.SubmissionTime), predicate: s => !s.IsDeleted, include: i => i.Include(s => s.Student) .Include(s => s.Assignment)); var submissionDtos = _mapper.Map>(pagedSubmissions.Items); return ApiResponse.Success("获取所有提交成功。", new PagedList { PageIndex = pagedSubmissions.PageIndex, PageSize = pagedSubmissions.PageSize, TotalCount = pagedSubmissions.TotalCount, TotalPages = pagedSubmissions.TotalPages, Items = submissionDtos }); } catch (Exception ex) { return ApiResponse.Error($"获取所有提交失败: {ex.Message}"); } } public async Task GetAllErrorQuestionsAsync(Guid userId) { try { var errorSDs = await _submissionDetailRepository.GetPagedListAsync( predicate: sd => sd.StudentId == userId && sd.IsCorrect == false && (sd.Status == SubmissionStatus.Submitted || sd.Status == SubmissionStatus.Graded), include: i => i .Include(s => s.AssignmentQuestion) .ThenInclude(aq => aq.Question)); var errorQuestions = errorSDs.Items.Select(sd => sd.AssignmentQuestion.Question) .Where(q => q != null) .DistinctBy(q => q.Id) .ToList(); var result = _mapper.Map>(errorQuestions); return ApiResponse.Success("获取所有错题成功。", result); } catch (Exception ex) { return ApiResponse.Error($"获取所有错题失败: {ex.Message}"); } } public async Task GetAllErrorQuestionTypeDisAsync(Guid assignmentId, Guid userId) { try { var errorSDs = await _submissionDetailRepository.GetPagedListAsync( predicate: sd => sd.Submission.AssignmentId == assignmentId && sd.StudentId == userId && sd.IsCorrect == false && (sd.Status == SubmissionStatus.Submitted || sd.Status == SubmissionStatus.Graded), include: i => i .Include(s => s.AssignmentQuestion) .ThenInclude(aq => aq.Question)); // 对错题按类型进行分组计数 var errorTypeDistribution = errorSDs.Items .Where(sd => sd.AssignmentQuestion?.Question != null) .GroupBy(sd => sd.AssignmentQuestion.Question.Type) .Select(g => new { QuestionType = g.Key.ToString(), Count = g.Count() }) .ToList(); return ApiResponse.Success("获取错题类型分布成功。", errorTypeDistribution); } catch (Exception ex) { return ApiResponse.Error($"获取错题类型分布失败: {ex.Message}"); } } public async Task GetAssignmentAllStudentsError(Guid assignmentId, Guid teacherId) { try { var submissionDetails = await _submissionDetailRepository.GetPagedListAsync( predicate: sd => sd.Submission.AssignmentId == assignmentId && sd.IsCorrect == false && (sd.Status == SubmissionStatus.Submitted || sd.Status == SubmissionStatus.Graded), include: i => i.Include(sd => sd.Student)); var studentsErrorSummary = submissionDetails.Items .Where(sd => sd.Student != null) .GroupBy(sd => new { sd.StudentId, sd.Student.UserName }) .Select(g => new { StudentId = g.Key.StudentId, StudentName = g.Key.UserName, ErrorQuestionCount = g.Count() }) .ToList(); return ApiResponse.Success("获取作业中所有学生的错题情况成功。", studentsErrorSummary); } catch (Exception ex) { return ApiResponse.Error($"获取作业中所有学生的错题情况失败: {ex.Message}"); } } public async Task GetAssignmentErrorQuestionsAsync(Guid assignmentId, Guid userId) { try { var errorSDs = await _submissionDetailRepository.GetPagedListAsync( predicate: sd => sd.Submission.AssignmentId == assignmentId && sd.StudentId == userId && sd.IsCorrect == false && (sd.Status == SubmissionStatus.Submitted || sd.Status == SubmissionStatus.Graded), include: i => i .Include(s => s.AssignmentQuestion) .ThenInclude(aq => aq.Question)); var errorQuestions = errorSDs.Items.Select(sd => sd.AssignmentQuestion.Question) .Where(q => q != null) .DistinctBy(q => q.Id) .ToList(); var result = _mapper.Map>(errorQuestions); return ApiResponse.Success("获取指定作业错题成功。", result); } catch (Exception ex) { return ApiResponse.Error($"获取指定作业错题失败: {ex.Message}"); } } public async Task GetAssignmentErrorQuestionTypeDisAsync(Guid assignmentId, Guid userId) { try { var errorSDs = await _submissionDetailRepository.GetPagedListAsync( predicate: sd => sd.Submission.AssignmentId == assignmentId && sd.StudentId == userId && sd.IsCorrect == false && (sd.Status == SubmissionStatus.Submitted || sd.Status == SubmissionStatus.Graded), include: i => i .Include(s => s.AssignmentQuestion) .ThenInclude(aq => aq.Question)); var errorTypeDistribution = errorSDs.Items .Where(sd => sd.AssignmentQuestion?.Question != null) .GroupBy(sd => sd.AssignmentQuestion.Question.Type) .Select(g => new { QuestionType = g.Key.ToString(), Count = g.Count() }) .ToList(); return ApiResponse.Success("获取指定作业错题类型分布成功。", errorTypeDistribution); } catch (Exception ex) { return ApiResponse.Error($"获取指定作业错题类型分布失败: {ex.Message}"); } } public async Task GetAsync(Guid id) { try { var submission = await _submissionRepository.GetFirstOrDefaultAsync( predicate: s => s.Id == id && !s.IsDeleted, include: i => i.Include(s => s.Student) .Include(s => s.Assignment) .Include(s => s.Grader) .Include(s => s.SubmissionDetails) .ThenInclude(sd => sd.AssignmentQuestion) .ThenInclude(aq => aq.Question)); if (submission == null) { return ApiResponse.Error("未找到提交。", 404); } var submissionDto = _mapper.Map(submission); return ApiResponse.Success("获取提交成功。", submissionDto); } catch (Exception ex) { return ApiResponse.Error($"获取提交失败: {ex.Message}"); } } public async Task GetQuestionErrorStudents(Guid assignmentQuestionId) { try { var errorSubmissionDetails = await _submissionDetailRepository.GetPagedListAsync( predicate: sd => sd.AssignmentQuestionId == assignmentQuestionId && sd.IsCorrect == false && (sd.Status == SubmissionStatus.Submitted || sd.Status == SubmissionStatus.Graded), include: i => i .Include(sd => sd.Student) .Include(sd => sd.AssignmentQuestion) .ThenInclude(aq => aq.Question)); var errorStudentsByQuestion = errorSubmissionDetails.Items .Where(sd => sd.AssignmentQuestion?.Question != null && sd.Student != null) .GroupBy(sd => new { sd.AssignmentQuestionId, sd.AssignmentQuestion.Question.Title }) .Select(g => new { AssignmentQuestionId = g.Key.AssignmentQuestionId, QuestionTitle = g.Key.Title, ErrorStudents = g.Select(sd => new { StudentId = sd.StudentId, StudentName = sd.Student.UserName }).Distinct().ToList() }) .ToList(); return ApiResponse.Success("获取出现错题的学生成功。", errorStudentsByQuestion); } catch (Exception ex) { return ApiResponse.Error($"获取出现错题的学生失败: {ex.Message}"); } } public async Task IsHasSubmissionAsync(Guid assignment, Guid studentId) { try { var result = await _unitOfWork.GetRepository().GetAllAsync(predicate: s => s.AssignmentId == assignment && s.StudentId == studentId); return (byte)result.Count; } catch (Exception ex) { throw; } } public async Task UpdateAsync(Submission model) { try { var existingSubmission = await _submissionRepository.GetFirstOrDefaultAsync(predicate: s => s.Id == model.Id && !s.IsDeleted); if (existingSubmission == null) { return ApiResponse.Error("未找到要更新的提交。", 404); } _mapper.Map(model, existingSubmission); _submissionRepository.Update(existingSubmission); await _unitOfWork.SaveChangesAsync(); var result = _mapper.Map(existingSubmission); return ApiResponse.Success("更新提交成功。", result); } catch (Exception ex) { return ApiResponse.Error($"更新提交失败: {ex.Message}"); } } } }