diff --git a/DepartmentPortal/Common/ToolsModule/ManagmentSecurity/AccessOperation.cs b/DepartmentPortal/Common/ToolsModule/ManagmentSecurity/AccessOperation.cs index d44ca5d..3c52564 100644 --- a/DepartmentPortal/Common/ToolsModule/ManagmentSecurity/AccessOperation.cs +++ b/DepartmentPortal/Common/ToolsModule/ManagmentSecurity/AccessOperation.cs @@ -50,7 +50,9 @@ БазовыеКафедры = 112, - СинхронизацияПриказов = 150, + СинхронизацияПриказов = 113, + + ОценкиСтудентов = 114, #endregion // Меню Учебный процесс diff --git a/DepartmentPortal/Department/DepartmentBusinessLogic/BusinessLogics/GenericBusinessLogic/StudentMarkPassedDisciplineLogic.cs b/DepartmentPortal/Department/DepartmentBusinessLogic/BusinessLogics/GenericBusinessLogic/StudentMarkPassedDisciplineLogic.cs new file mode 100644 index 0000000..c59ee42 --- /dev/null +++ b/DepartmentPortal/Department/DepartmentBusinessLogic/BusinessLogics/GenericBusinessLogic/StudentMarkPassedDisciplineLogic.cs @@ -0,0 +1,17 @@ +using DepartmentContract.BindingModels; +using DepartmentContract.Logics.IGenericEntityLogic; +using DepartmentContract.Services.IGenericEntityService; +using DepartmentContract.ViewModels; +using ToolsModule.ManagmentEntity; +using ToolsModule.ManagmentSecurity; + +namespace DepartmentBusinessLogic.BusinessLogics.GenericBusinessLogic +{ + /// + /// Логика работы с оценками студентов за дисциплины + /// + public class StudentMarkPassedDisciplineLogic : GenericBusinessLogic, IStudentMarkPassedDisciplineLogic + { + public StudentMarkPassedDisciplineLogic(IStudentMarkPassedDisciplineService service) : base(service, "Оценки студентов", AccessOperation.ОценкиСтудентов) { } + } +} \ No newline at end of file diff --git a/DepartmentPortal/Department/DepartmentBusinessLogic/DepartmentLogicDependencyRegistration.cs b/DepartmentPortal/Department/DepartmentBusinessLogic/DepartmentLogicDependencyRegistration.cs index 9bd6845..8120242 100644 --- a/DepartmentPortal/Department/DepartmentBusinessLogic/DepartmentLogicDependencyRegistration.cs +++ b/DepartmentPortal/Department/DepartmentBusinessLogic/DepartmentLogicDependencyRegistration.cs @@ -45,6 +45,8 @@ namespace DepartmentBusinessLogic DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); diff --git a/DepartmentPortal/Department/DepartmentContract/BindingModels/StudentMarkPassedDisciplineBindingModels.cs b/DepartmentPortal/Department/DepartmentContract/BindingModels/StudentMarkPassedDisciplineBindingModels.cs new file mode 100644 index 0000000..e9524e8 --- /dev/null +++ b/DepartmentPortal/Department/DepartmentContract/BindingModels/StudentMarkPassedDisciplineBindingModels.cs @@ -0,0 +1,51 @@ +using CoreModels.Enums.Department; +using CoreModels.ModelsDepartment; +using System; +using System.ComponentModel.DataAnnotations; +using ToolsModule.ManagmentEntity; + +namespace DepartmentContract.BindingModels +{ + /// + /// Получение оценки студента за дисциплину + /// + public class StudentMarkPassedDisciplineGetBindingModel : GetBindingModel + { + public Guid? StudentGroupId { get; set; } + + public Guid? StudentId { get; set; } + + public Guid? DisciplineId { get; set; } + + public DateTime? DateStart { get; set; } + + public DateTime? DateFinish { get; set; } + } + + /// + /// Сохранение оценки студента за дисциплину + /// + public class StudentMarkPassedDisciplineSetBindingModel : SetBindingModel, IStudentMarkPassedDisciplineModel + { + [Required(ErrorMessage = "required")] + public Guid StudentId { get; set; } + + [Required(ErrorMessage = "required")] + public Guid DisciplineId { get; set; } + + [Required(ErrorMessage = "required")] + public Semester Semester { get; set; } + + [Required(ErrorMessage = "required")] + public MarkDisciplinePassedType Mark { get; set; } + + [Required(ErrorMessage = "required")] + public DateTime DateAffixing { get; set; } + + [Required(ErrorMessage = "required")] + public bool IsIncreaseMark { get; set; } + + [Required(ErrorMessage = "required")] + public bool IsDirection { get; set; } + } +} \ No newline at end of file diff --git a/DepartmentPortal/Department/DepartmentContract/Logics/IGenericEntityLogic/IStudentMarkPassedDisciplineLogic.cs b/DepartmentPortal/Department/DepartmentContract/Logics/IGenericEntityLogic/IStudentMarkPassedDisciplineLogic.cs new file mode 100644 index 0000000..e2ba075 --- /dev/null +++ b/DepartmentPortal/Department/DepartmentContract/Logics/IGenericEntityLogic/IStudentMarkPassedDisciplineLogic.cs @@ -0,0 +1,11 @@ +using DepartmentContract.BindingModels; +using DepartmentContract.ViewModels; +using ToolsModule.ManagmentEntity; + +namespace DepartmentContract.Logics.IGenericEntityLogic +{ + /// + /// Логика работы с оценками студентов за дисциплины + /// + public interface IStudentMarkPassedDisciplineLogic : IGenericEntityLogic { } +} \ No newline at end of file diff --git a/DepartmentPortal/Department/DepartmentContract/Services/IGenericEntityService/IStudentMarkPassedDisciplineService.cs b/DepartmentPortal/Department/DepartmentContract/Services/IGenericEntityService/IStudentMarkPassedDisciplineService.cs new file mode 100644 index 0000000..ec44c74 --- /dev/null +++ b/DepartmentPortal/Department/DepartmentContract/Services/IGenericEntityService/IStudentMarkPassedDisciplineService.cs @@ -0,0 +1,10 @@ +using DepartmentContract.BindingModels; +using ToolsModule.ManagmentEntity; + +namespace DepartmentContract.Services.IGenericEntityService +{ + /// + /// Хранение оценок студентов за дисциплины + /// + public interface IStudentMarkPassedDisciplineService : IGenericEntityService { } +} \ No newline at end of file diff --git a/DepartmentPortal/Department/DepartmentContract/ViewModels/StudentMarkPassedDisciplineViewModels.cs b/DepartmentPortal/Department/DepartmentContract/ViewModels/StudentMarkPassedDisciplineViewModels.cs new file mode 100644 index 0000000..aedb29d --- /dev/null +++ b/DepartmentPortal/Department/DepartmentContract/ViewModels/StudentMarkPassedDisciplineViewModels.cs @@ -0,0 +1,62 @@ +using CoreModels.Enums.Department; +using CoreModels.ModelsDepartment; +using System; +using ToolsModule.ManagmentEntity; +using ToolsModule.ManagmentMapping; + +namespace DepartmentContract.ViewModels +{ + /// + /// Список оценок студентов за дисциплины + /// + public class StudentMarkPassedDisciplineListViewModel : ListViewModel { } + + /// + /// Элемент оценка студента за дисциплину + /// + [ViewModelControlElementClass(HaveDependenceEntities = true, Width = 800, Height = 500)] + public class StudentMarkPassedDisciplineViewModel : ElementViewModel, IStudentMarkPassedDisciplineModel + { + [ViewModelControlElementProperty("Студент", ControlType.ControlGuid, MustHaveValue = true, ReadOnly = false, ControlTypeObject = "DepartmentWindowsDesktop.EntityControls.ControlStudentList, SecurityWindowsDesktop")] + public Guid StudentId { get; set; } + + [ViewModelControlElementProperty("Дисциплина", ControlType.ControlGuid, MustHaveValue = false, ReadOnly = false, ControlTypeObject = "DepartmentWindowsDesktop.EntityControls.ControlStudentList, DepartmentWindowsDesktop")] + public Guid DisciplineId { get; set; } + + [ViewModelControlListProperty("Студент", ColumnWidth = 120)] + [MapConfiguration("Student.ToString")] + public string Student { get; set; } + + [ViewModelControlListProperty("Дисциплина", ColumnWidth = 120)] + [MapConfiguration("Discipline.ToString")] + public string Discipline { get; set; } + + [ViewModelControlElementProperty("Семестр", ControlType.ControlEnum, MustHaveValue = true)] + public Semester Semester { get; set; } + + [ViewModelControlListProperty("Семестр", ColumnWidth = 120)] + public string SemesterTitle => Semester.ToString("G"); + + [ViewModelControlElementProperty("Оценка", ControlType.ControlEnum, MustHaveValue = true)] + public MarkDisciplinePassedType Mark { get; set; } + + [ViewModelControlListProperty("Оценка", ColumnWidth = 120)] + public string MarkTitle => Mark.ToString("G"); + + [ViewModelControlListProperty("Дата сдачи", ColumnWidth = 120, DefaultCellStyleFormat = "dd.MM.yyyy")] + [ViewModelControlElementProperty("Дата сдачи", ControlType.ControlDateTime, MustHaveValue = true)] + public DateTime DateAffixing { get; set; } + + [ViewModelControlElementProperty("Повышение оценки", ControlType.ControlBool, MustHaveValue = true)] + public bool IsIncreaseMark { get; set; } + + [ViewModelControlListProperty("Повышение оценки", ColumnWidth = 100)] + public string IsIncreaseMarkValue => IsIncreaseMark ? "Да" : "Нет"; + + [ViewModelControlElementProperty("По направлению", ControlType.ControlBool, MustHaveValue = true)] + public bool IsDirection { get; set; } + + [ViewModelControlListProperty("По направлению", ColumnWidth = 100)] + public string IsDirectionValue => IsDirection ? "Да" : "Нет"; + } +} \ No newline at end of file diff --git a/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/DepartmentImplementationDependencyRegistration.cs b/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/DepartmentImplementationDependencyRegistration.cs index ba9bf42..4c7f861 100644 --- a/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/DepartmentImplementationDependencyRegistration.cs +++ b/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/DepartmentImplementationDependencyRegistration.cs @@ -43,6 +43,8 @@ namespace DepartmentDatabaseImplementation DependencyManager.Instance.RegisterType(); DependencyManager.Instance.RegisterType(); + + DependencyManager.Instance.RegisterType(); } } } \ No newline at end of file diff --git a/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/Implementations/AbstractGenerticEntityService/LecturerService.cs b/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/Implementations/AbstractGenerticEntityService/LecturerService.cs index f0c065e..c34f369 100644 --- a/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/Implementations/AbstractGenerticEntityService/LecturerService.cs +++ b/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/Implementations/AbstractGenerticEntityService/LecturerService.cs @@ -75,15 +75,12 @@ namespace DepartmentDatabaseImplementation.Implementations.AbstractGenerticEntit protected override Lecturer GetUniqueEntity(LecturerSetBindingModel model, IQueryable query) => query.FirstOrDefault(x => x.LastName == model.LastName && x.FirstName == model.FirstName && x.Patronymic == model.Patronymic && x.Id != model.Id); - protected override IQueryable IncludingWhenReading(IQueryable query) - { - return query - .Include(x => x.LecturerAcademicRank) - .Include(x => x.LecturerAcademicDegree) - .Include(x => x.LecturerPosts).Include("LecturerPosts.Post"); - } + protected override IQueryable IncludingWhenReading(IQueryable query) => query + .Include(x => x.LecturerAcademicRank) + .Include(x => x.LecturerAcademicDegree) + .Include(x => x.LecturerPosts).Include("LecturerPosts.Post"); - protected override IQueryable OrderingWhenReading(IQueryable query) => query + protected override IQueryable OrderingWhenReading(IQueryable query) => query .OrderByDescending(x => x.LecturerPosts.Max(y => y.Post.Order)) .ThenBy(x => x.LecturerAcademicRank.Order) .ThenBy(x => x.LecturerAcademicDegree.Order) diff --git a/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/Implementations/AbstractGenerticEntityService/StudentMarkPassedDisciplineService.cs b/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/Implementations/AbstractGenerticEntityService/StudentMarkPassedDisciplineService.cs new file mode 100644 index 0000000..ab0c11c --- /dev/null +++ b/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/Implementations/AbstractGenerticEntityService/StudentMarkPassedDisciplineService.cs @@ -0,0 +1,63 @@ +using CoreDatabase; +using CoreDatabase.Models.Department; +using DepartmentContract.BindingModels; +using DepartmentContract.Services.IGenericEntityService; +using DepartmentContract.ViewModels; +using Microsoft.EntityFrameworkCore; +using System; +using System.Linq; +using ToolsModule.ManagmentEntity; + +namespace DepartmentDatabaseImplementation.Implementations.AbstractGenerticEntityService +{ + /// + /// Реализация IStudentMarkPassedDisciplineService + /// + public class StudentMarkPassedDisciplineService : + AbstractGenerticEntityService, + IStudentMarkPassedDisciplineService + { + protected override OperationResultModel AdditionalCheckingWhenAdding(DbContext context, StudentMarkPassedDisciplineSetBindingModel model) => OperationResultModel.Success(null); + + protected override OperationResultModel AdditionalCheckingWhenDeleting(DbContext context, StudentMarkPassedDiscipline entity, StudentMarkPassedDisciplineGetBindingModel model) => OperationResultModel.Success(null); + + protected override IQueryable AdditionalCheckingWhenReadingList(IQueryable query, StudentMarkPassedDisciplineGetBindingModel model) + { + if (model.DisciplineId.HasValue) + { + query = query.Where(x => x.DisciplineId == model.DisciplineId); + } + if (model.StudentId.HasValue) + { + query = query.Where(x => x.StudentId == model.StudentId); + } + if (model.StudentGroupId.HasValue) + { + query = query.Where(x => x.Student.StudentGroupId == model.StudentGroupId); + } + if (model.DateStart.HasValue && model.DateFinish.HasValue) + { + query = query.Where(x => x.DateAffixing >= model.DateStart.Value && x.DateAffixing <= model.DateFinish.Value); + } + return query; + } + + protected override OperationResultModel AdditionalCheckingWhenUpdateing(DbContext context, StudentMarkPassedDisciplineSetBindingModel model) => OperationResultModel.Success(null); + + protected override void AdditionalDeleting(DbContext context, StudentMarkPassedDiscipline entity, StudentMarkPassedDisciplineGetBindingModel model) + { + throw new NotImplementedException(); + } + + protected override StudentMarkPassedDiscipline GetUniqueEntity(StudentMarkPassedDisciplineSetBindingModel model, IQueryable query) => query.FirstOrDefault(x => x.StudentId == model.StudentId && x.DisciplineId == model.DisciplineId && + x.Semester == model.Semester && x.Mark == model.Mark && x.Id != model.Id); + + protected override IQueryable IncludingWhenReading(IQueryable query) => query + .Include(x => x.Student) + .Include(x => x.Discipline); + + protected override IQueryable OrderingWhenReading(IQueryable query) => query + .OrderByDescending(x => x.Student) + .ThenBy(x => x.DateAffixing); + } +} \ No newline at end of file