using AutoMapper; using Entities.Contracts; using Entities.DTO; using Microsoft.EntityFrameworkCore; using SharedDATA.Api; using TechHelper.Services.Beta; namespace TechHelper.Services.Beta { /// /// 教材服务实现类 /// public class TextbookService : ITextbookService { private readonly IUnitOfWork _work; private readonly IMapper _mapper; public TextbookService(IUnitOfWork work, IMapper mapper) { _work = work; _mapper = mapper; } public async Task GetAllAsync(QueryParameter query) { try { var repository = _work.GetRepository(); if (query.Search != null && !string.IsNullOrWhiteSpace(query.Search)) { var textbooks = await repository.GetPagedListAsync( predicate: t => t.Title.Contains(query.Search) || t.Grade.ToString().Contains(query.Search) || t.Publisher.ToString().Contains(query.Search) || t.SubjectArea.ToString().Contains(query.Search), pageSize: query.PageSize, pageIndex: query.PageIndex ); var textbookDtosFiltered = _mapper.Map>(textbooks.Items); return new ApiResponse(true, textbookDtosFiltered); } else { var textbooks = await repository.GetPagedListAsync( pageSize: query.PageSize, pageIndex: query.PageIndex ); var textbookDtos = _mapper.Map>(textbooks.Items); return new ApiResponse(true, textbookDtos); } } catch (Exception ex) { return new ApiResponse($"获取所有教材时发生错误: {ex.Message}"); } } public async Task GetAsync(Guid id) { try { var textbook = await _work.GetRepository().GetFirstOrDefaultAsync( predicate: t => t.Id == id, include: i => i .Include(t => t.Lessons)); if (textbook == null) { return new ApiResponse("教材未找到。"); } var textbookDto = _mapper.Map(textbook); return new ApiResponse(true, textbookDto); } catch (Exception ex) { return new ApiResponse($"获取教材时发生错误: {ex.Message}"); } } public async Task AddAsync(TextbookDto model) { try { // 检查是否已存在同名教材(考虑年级和学科领域) var existingTextbook = await _work.GetRepository().GetFirstOrDefaultAsync( predicate: t => t.Title == model.Title && t.Grade.ToString() == model.Grade && t.SubjectArea.ToString() == model.SubjectArea); if (existingTextbook != null) { return new ApiResponse($"教材 '{model.Title}' 在该年级和学科领域已存在。"); } var textbook = _mapper.Map(model); await _work.GetRepository().InsertAsync(textbook); if (await _work.SaveChangesAsync() > 0) { return new ApiResponse(true, textbook.Id); } return new ApiResponse("添加教材失败。"); } catch (Exception ex) { return new ApiResponse($"添加教材时发生错误: {ex.Message}"); } } public async Task UpdateAsync(TextbookDto model) { try { var existingTextbook = await _work.GetRepository().GetFirstOrDefaultAsync( predicate: t => t.Id == model.Id); if (existingTextbook == null) { return new ApiResponse("教材未找到。"); } // 检查是否要修改为已存在的教材名称(排除当前教材) var textbookWithSameName = await _work.GetRepository().GetFirstOrDefaultAsync( predicate: t => t.Title == model.Title && t.Grade.ToString() == model.Grade && t.SubjectArea.ToString() == model.SubjectArea && t.Id != model.Id); if (textbookWithSameName != null) { return new ApiResponse($"教材名称 '{model.Title}' 在该年级和学科领域已被其他教材使用。"); } _mapper.Map(model, existingTextbook); _work.GetRepository().Update(existingTextbook); if (await _work.SaveChangesAsync() > 0) { var textbookDto = _mapper.Map(existingTextbook); return new ApiResponse(true, textbookDto); } return new ApiResponse("更新教材失败。"); } catch (Exception ex) { return new ApiResponse($"更新教材时发生错误: {ex.Message}"); } } public async Task DeleteAsync(Guid id) { try { var existingTextbook = await _work.GetRepository().GetFirstOrDefaultAsync( predicate: t => t.Id == id); if (existingTextbook == null) { return new ApiResponse("教材未找到。"); } // 检查是否有相关课程 var hasLessons = existingTextbook.Lessons.Any(); if (hasLessons) { return new ApiResponse("无法删除该教材,因为它包含相关课程。"); } _work.GetRepository().Delete(existingTextbook); if (await _work.SaveChangesAsync() > 0) { return new ApiResponse(true, "教材删除成功。"); } return new ApiResponse("删除教材失败。"); } catch (Exception ex) { return new ApiResponse($"删除教材时发生错误: {ex.Message}"); } } } }