using AutoMapper; using Entities.Contracts; using Entities.DTO; using Microsoft.VisualBasic; using SharedDATA.Api; using TechHelper.Context; using TechHelper.Server.Repositories; using TechHelper.Services; namespace TechHelper.Server.Services { public class ExamService : IExamService { private readonly IUnitOfWork _unitOfWork; private readonly IExamRepository _examRepository; private readonly IMapper _mapper; public ExamService(IUnitOfWork unitOfWork, IExamRepository examRepository, IMapper mapper) { _unitOfWork = unitOfWork; _examRepository = examRepository; _mapper = mapper; } public async Task CreateExamAsync(AssignmentDto assignmentDto) { Assignment newAssi = _mapper.Map(assignmentDto); await _examRepository.AddAsync(newAssi); var context = _unitOfWork.GetDbContext(); foreach (var entry in context.ChangeTracker.Entries()) { if (entry.State == Microsoft.EntityFrameworkCore.EntityState.Added) { if(entry.Entity is Question newQues) { newQues.CreatorId = newAssi.CreatorId; } } } await _unitOfWork.SaveChangesAsync(); return ApiResponse.Success(); } private async void ParseStruct(AssignmentStructDto assignmentStruct, Guid ParentID) { var newStruct = _mapper.Map(assignmentStruct); newStruct.ParentStructId = Guid.Empty == ParentID ? null : ParentID; await _examRepository.AddAsync(newStruct); foreach (var item in assignmentStruct.AssignmentQuestions) { var newQuestion = _mapper.Map(item); //newQuestion.ParentQuestionId = item.ParentQuestion == null ? null : item.ParentQuestion.Id; await _examRepository.AddAsync(newQuestion); //await ParseAssignmentQuestion(assignmentStruct, item, newQuestion); } foreach (var item in assignmentStruct.ChildrenGroups) { ParseStruct(item, assignmentStruct.Id); } } private async Task ParseAssignmentQuestion(AssignmentStructDto assignmentStruct, QuestionDto item, Question newQuestion) { AssignmentQuestion newAssignQues = new AssignmentQuestion(); newAssignQues.QuestionId = newQuestion.Id; newAssignQues.AssignmentStructId = assignmentStruct.Id; newAssignQues.CreatedAt = DateTime.UtcNow; newAssignQues.Score = item.Score; await _examRepository.AddAsync(newAssignQues); } private void SetEntityIdsAndRelations(AssignmentStruct group, Guid? assignmentId, Guid creatorId) { group.Id = Guid.NewGuid(); group.AssignmentId = assignmentId; foreach (var aq in group.AssignmentQuestions) { aq.Id = Guid.NewGuid(); aq.AssignmentStructId = group.Id; aq.Question.Id = Guid.NewGuid(); aq.Question.CreatorId = creatorId; aq.CreatedAt = DateTime.UtcNow; // ... 其他默认值 } foreach (var childGroup in group.ChildrenGroups) { // 子题组的 AssignmentId 为 null,通过 ParentGroup 关联 SetEntityIdsAndRelations(childGroup, null, creatorId); childGroup.ParentStructId = group.Id; } } public async Task GetExamByIdAsync(Guid id) { var assignment = await _examRepository.GetFullExamByIdAsync(id); if (assignment == null) { throw new InvalidOperationException(""); } return _mapper.Map(assignment); } public async Task> GetAllExamPreviewsAsync(Guid userId) { var assignments = await _examRepository.GetExamPreviewsByUserAsync(userId); return _mapper.Map>(assignments); } public Task GetAllAsync(QueryParameter query) { throw new NotImplementedException(); } public Task GetAsync(Guid id) { throw new NotImplementedException(); } public Task AddAsync(AssignmentDto model) { throw new NotImplementedException(); } public Task UpdateAsync(AssignmentDto model) { throw new NotImplementedException(); } public Task DeleteAsync(Guid id) { throw new NotImplementedException(); } Task IExamService.GetAllExamPreviewsAsync(Guid userId) { throw new NotImplementedException(); } } }