using AutoMapper; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using VOL.Business.IServices; using VOL.Business.IServices.Norm; using VOL.Business.IServices.School; using VOL.Business.IServices.SportsHall; using VOL.Business.Services.School; using VOL.Core.CacheManager; using VOL.Core.Extensions.AutofacManager; using VOL.Core.ManageUser; using VOL.Entity.DomainModels; using VOL.Entity.Enum; using VOL.Model; using VOL.Model.IOT.Request; using VOL.Model.SportsHall; using VOL.System.IRepositories; using VOL.System.Repositories; namespace VOL.Business.Services.SportsHall { /// /// 运动馆 /// public class SportsHallService : ISportsHallService, IDependency { #region 初始化 private readonly IS_ClassRepository _classRepository; private readonly IS_GradeRepository _gradeRepository; private readonly IS_ClassAssocTeacherRepository _classAssocTeacherRepository; private readonly IS_StudentRepository _studentRepository; [ActivatorUtilitiesConstructor] public SportsHallService(IS_ClassRepository classRepository, IS_GradeRepository gradeRepository, IS_ClassAssocTeacherRepository classAssocTeacherRepository, IS_StudentRepository studentRepository) { _classRepository = classRepository; _gradeRepository = gradeRepository; _classAssocTeacherRepository = classAssocTeacherRepository; _studentRepository = studentRepository; } #endregion /// /// 新增班级 /// /// /// public async Task AddClass(AddSportsHallClassParam paramDto) { var tenantId = UserContext.Current.TenantId; var grade = await _gradeRepository.FindAsIQueryable(x => x.GradeName == "运动馆").Select(x => new { x.Id, x.GradeName }).FirstAsync(); var exist = await _classRepository.ExistsAsync(x => x.SchoolCode == tenantId && x.ClassName == paramDto.ClassName && x.GradeId == grade.Id); if (exist) throw new Exception("班级名称已存在"); var classEntity = new S_Class() { GradeId = grade.Id, GradeName = grade.GradeName, ClassName = paramDto.ClassName, Creator = UserContext.Current.UserId, SchoolCode = UserContext.Current.TenantId, CreateDate = DateTime.Now }; using (var transaction = _classRepository.DbContext.Database.BeginTransaction()) { try { await _classRepository.AddAsync(classEntity); await _classRepository.SaveChangesAsync(); int classId = classEntity.Id; var classAssocTeacherList = new List(); paramDto.TeacherIds.ForEach(x => { classAssocTeacherList.Add(new S_ClassAssocTeacher() { ClassId = classId, TeacherId = x, Creator = UserContext.Current.UserId, CreateDate = DateTime.Now, Modifier = UserContext.Current.UserId, ModifyDate = DateTime.Now, }); }); await _classAssocTeacherRepository.AddRangeAsync(classAssocTeacherList); var students = await _studentRepository.FindAsync(x => paramDto.studentNoList.Contains(x.StudentNo)); foreach (var student in students) { student.ClassId = classId; int index = paramDto.studentNoList.IndexOf(student.StudentNo); student.OrderNo = index >= 0 ? index + 1 : 0; } _studentRepository.UpdateRange(students); await _studentRepository.SaveChangesAsync(); // 提交事务 transaction.Commit(); } catch (Exception ex) { // 发生错误,回滚事务 transaction.Rollback(); Console.WriteLine("事务回滚:" + ex.Message); } } } /// /// 更新班级 /// /// /// public async Task ModifyClass(ModifySportsHallClassParam paramDto) { var tenantId = UserContext.Current.TenantId; var classModel = await _classRepository.FindAsyncFirst(x => x.Id == paramDto.ClassId); var grade = await _gradeRepository.FindAsIQueryable(x => x.GradeName == "运动馆").Select(x => new { x.Id, x.GradeName }).FirstAsync(); if (classModel == null) throw new ArgumentNullException("未找到要更新得数据"); var exist = await _classRepository.ExistsAsync( x => x.SchoolCode == tenantId && x.ClassName == paramDto.ClassName && x.GradeId == grade.Id && x.Id != paramDto.ClassId); if (exist) throw new Exception("班级名称已存在"); classModel.ClassName = paramDto.ClassName; using (var transaction = _classRepository.DbContext.Database.BeginTransaction()) { try { _classRepository.Update(classModel); var teacherList = await _classAssocTeacherRepository.FindAsync(x => x.ClassId == paramDto.ClassId); _classAssocTeacherRepository.DbContext.RemoveRange(teacherList); var classAssocTeacherList = new List(); paramDto.TeacherIds.ForEach(x => { classAssocTeacherList.Add(new S_ClassAssocTeacher() { ClassId = paramDto.ClassId, TeacherId = x, Creator = UserContext.Current.UserId, CreateDate = DateTime.Now, Modifier = UserContext.Current.UserId, ModifyDate = DateTime.Now, }); }); await _classAssocTeacherRepository.AddRangeAsync(classAssocTeacherList); var oldStudents = await _studentRepository.FindAsync(x => x.ClassId == classModel.Id); var newStudents = await _studentRepository.FindAsync(x => paramDto.studentNoList.Contains(x.StudentNo)); var allStudents = oldStudents.UnionBy(newStudents, s => s.Id).ToList(); foreach (var student in allStudents) { if (paramDto.studentNoList.Contains(student.StudentNo)) { student.ClassId = classModel.Id; student.OrderNo = paramDto.studentNoList.IndexOf(student.StudentNo) + 1; } else { student.ClassId = 0; student.OrderNo = 0; } } _studentRepository.UpdateRange(allStudents); await _classRepository.SaveChangesAsync(); transaction.Commit(); } catch (Exception ex) { // 发生错误,回滚事务 transaction.Rollback(); Console.WriteLine("事务回滚:" + ex.Message); } } } } }