From ba184943c48256ee135786ac76558b34ff1308b8 Mon Sep 17 00:00:00 2001 From: kotcheshir73 Date: Wed, 28 Apr 2021 17:58:52 +0400 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=81=D1=82=D1=83=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20+=20=D0=B2=D0=BE=D1=81=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9=20=D1=81?= =?UTF-8?q?=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractGenerticEntityService.cs | 30 +- .../DatabaseCore/Models/Department/Student.cs | 5 + .../BusinessLogics/GenericBusinessLogic.cs | 30 + .../Interfaces/IGenerticEntityService.cs | 7 + .../BindingModels/StudentBindingModels.cs | 6 + .../OrderSyncHistoryBusinessLogic.cs | 522 ++++++++++++------ .../ViewModels/StudentViewModels.cs | 4 + .../Implementations/StudentService.cs | 19 + 8 files changed, 465 insertions(+), 158 deletions(-) diff --git a/DepartmentPortal/Common/DatabaseCore/AbstractGenerticEntityService.cs b/DepartmentPortal/Common/DatabaseCore/AbstractGenerticEntityService.cs index ca40d27..5e46b66 100644 --- a/DepartmentPortal/Common/DatabaseCore/AbstractGenerticEntityService.cs +++ b/DepartmentPortal/Common/DatabaseCore/AbstractGenerticEntityService.cs @@ -59,7 +59,7 @@ namespace DatabaseCore using var transaction = context.Database.BeginTransaction(); try { - var entity = context.Set().FirstOrDefault(x => x.Id == model.Id); + var entity = await context.Set().FirstOrDefaultAsync(x => x.Id == model.Id); if (entity == null) { return OperationResultModel.Error("Error:", "Элемент не найден", ResultServiceStatusCode.NotFound); @@ -93,6 +93,30 @@ namespace DatabaseCore return OperationResultModel.Success(true); } + public async Task RestoreAsync(G model) + { + if (model.Id.HasValue || AdditionalCheckForSingleGet(model)) + { + using var context = DatabaseManager.GetContext; + var entity = model.Id.HasValue ? IncludingWhenReading(context.Set().AsQueryable()).FirstOrDefault(x => x.Id == model.Id.Value) + : GetSingleRecord(context.Set().AsQueryable(), model); + if (entity == null) + { + return OperationResultModel.Error("Error:", "Элемент не найден", ResultServiceStatusCode.NotFound); + } + else if (!entity.IsDeleted) + { + return OperationResultModel.Error("Error:", "Элемент не был удален", ResultServiceStatusCode.ExsistItem); + } + entity.IsDeleted = false; + + await context.SaveChangesAsync(); + + return OperationResultModel.Success(Mapper.MapToClass(entity, true)); + } + return OperationResultModel.Error("Error:", "Элемент не найден", ResultServiceStatusCode.NotFound); + } + public async Task ReadAsync(G model) { int countPages = 0; @@ -107,6 +131,10 @@ namespace DatabaseCore { return OperationResultModel.Error("Error:", "Элемент не найден", ResultServiceStatusCode.NotFound); } + if (entity.IsDeleted) + { + return OperationResultModel.Error("Error:", "Элемент удален", ResultServiceStatusCode.WasDelete); + } return OperationResultModel.Success(Mapper.MapToClass(entity, model.HaveRight)); } diff --git a/DepartmentPortal/Common/DatabaseCore/Models/Department/Student.cs b/DepartmentPortal/Common/DatabaseCore/Models/Department/Student.cs index b046a34..a24d2d6 100644 --- a/DepartmentPortal/Common/DatabaseCore/Models/Department/Student.cs +++ b/DepartmentPortal/Common/DatabaseCore/Models/Department/Student.cs @@ -29,6 +29,11 @@ namespace DatabaseCore.Models.Department [MapConfiguration("StudentGroupId")] public Guid? StudentGroupId { get; set; } + [DataMember] + [Required] + [MapConfiguration("Iduniv")] + public string Iduniv { get; set; } + [DataMember] [Required] [MapConfiguration("NumberOfBook")] diff --git a/DepartmentPortal/Common/ModuleTools/BusinessLogics/GenericBusinessLogic.cs b/DepartmentPortal/Common/ModuleTools/BusinessLogics/GenericBusinessLogic.cs index 0c30fe4..83275a8 100644 --- a/DepartmentPortal/Common/ModuleTools/BusinessLogics/GenericBusinessLogic.cs +++ b/DepartmentPortal/Common/ModuleTools/BusinessLogics/GenericBusinessLogic.cs @@ -187,5 +187,35 @@ namespace ModuleTools.BusinessLogics } return false; } + + /// + /// Восстанолвение записи + /// + /// + /// + public async Task RestoreAsync(G model) + { + Errors.Clear(); + try + { + if (NoAccess(model, AccessType.Change)) + { + return null; + } + var result = await Service.RestoreAsync(model); + if (!result.IsSucceeded) + { + Errors.AddRange(result.Errors); + return null; + } + + return result.Result as E; + } + catch (Exception ex) + { + Errors.Add(("Ошибка удаления", ex.Message)); + } + return null; + } } } \ No newline at end of file diff --git a/DepartmentPortal/Common/ModuleTools/Interfaces/IGenerticEntityService.cs b/DepartmentPortal/Common/ModuleTools/Interfaces/IGenerticEntityService.cs index bba2124..d9bc285 100644 --- a/DepartmentPortal/Common/ModuleTools/Interfaces/IGenerticEntityService.cs +++ b/DepartmentPortal/Common/ModuleTools/Interfaces/IGenerticEntityService.cs @@ -38,5 +38,12 @@ namespace ModuleTools.Interfaces /// /// Task DeleteAsync(G model); + + /// + /// Восстановление сущности + /// + /// + /// + Task RestoreAsync(G model); } } \ No newline at end of file diff --git a/DepartmentPortal/Department/DepartmentBusinessLogic/BindingModels/StudentBindingModels.cs b/DepartmentPortal/Department/DepartmentBusinessLogic/BindingModels/StudentBindingModels.cs index 88f3694..5c8ebf2 100644 --- a/DepartmentPortal/Department/DepartmentBusinessLogic/BindingModels/StudentBindingModels.cs +++ b/DepartmentPortal/Department/DepartmentBusinessLogic/BindingModels/StudentBindingModels.cs @@ -16,6 +16,8 @@ namespace DepartmentBusinessLogic.BindingModels public Guid? StudentGroupId { get; set; } public StudentState? StudentState { get; set; } + + public string NumberOfBook { get; set; } } /// @@ -30,6 +32,10 @@ namespace DepartmentBusinessLogic.BindingModels [MapConfiguration("StudentGroupId")] public Guid? StudentGroupId { get; set; } + [Required(ErrorMessage = "required")] + [MapConfiguration("Iduniv")] + public string Iduniv { get; set; } + [Required(ErrorMessage = "required")] [MapConfiguration("NumberOfBook")] public string NumberOfBook { get; set; } diff --git a/DepartmentPortal/Department/DepartmentBusinessLogic/BusinessLogics/OrderSyncHistoryBusinessLogic.cs b/DepartmentPortal/Department/DepartmentBusinessLogic/BusinessLogics/OrderSyncHistoryBusinessLogic.cs index 193c3d6..388aa67 100644 --- a/DepartmentPortal/Department/DepartmentBusinessLogic/BusinessLogics/OrderSyncHistoryBusinessLogic.cs +++ b/DepartmentPortal/Department/DepartmentBusinessLogic/BusinessLogics/OrderSyncHistoryBusinessLogic.cs @@ -161,19 +161,51 @@ namespace DepartmentBusinessLogic.BusinessLogics // студент не найден, значит он ушел с кафедры, выясняем почему if (studentSync == null) { - await SyncStudentOrders(history, student, groups.List, client, address.Value, studentSync.iduniv); + await SyncStudentOrders(history, student, groups.List, client, address.Value); } // не совпадение групп else if (student.StudentGroupName != studentSync.groupName) { - await SyncStudentOrders(history, student, groups.List, client, address.Value, studentSync.iduniv); + await SyncStudentOrders(history, student, groups.List, client, address.Value); } studentFromServer.CurrentStudentsList.Remove(studentSync); } - // новые студенты + // новые студенты и восстановленцы foreach (var student in studentFromServer.CurrentStudentsList) { + var deletedStudent = await _studentLogic.GetElementAsync(new StudentGetBindingModel { NumberOfBook = student.recordBookName }); + if (deletedStudent == null && _studentLogic.Errors.FirstOrDefault(x => x.Message == "Элемент удален") != default) + { + // восстановленец + deletedStudent = await _studentLogic.RestoreAsync(new StudentGetBindingModel { NumberOfBook = student.recordBookName }); + if (deletedStudent == null) + { + var errors = _studentLogic.Errors; + errors.Add(("Ошибка при восстановлении студента", $"Не удалось восстановить студента {student.lastName} {student.firstName} {student.patronymicName}")); + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) + }); + continue; + } + var deletedUser = await _userLogic.RestoreAsync(new UserGetBindingModel { Id = deletedStudent.UserId }); + if (deletedUser == null) + { + var errors = _userLogic.Errors; + errors.Add(("Ошибка при восстановлении пользователя студента", $"Не удалось восстановить пользователя студента {student.lastName} {student.firstName} {student.patronymicName}")); + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) + }); + continue; + } + await SyncStudentOrders(history, deletedStudent, groups.List, client, address.Value); + continue; + } + var userName = $"{student.lastName}{(student.firstName.IsNotEmpty() ? $" {student.firstName[0]}." : string.Empty)}{(student.patronymicName.IsNotEmpty() ? $"{student.patronymicName[0]}." : string.Empty)}"; var result = await _userLogic.GetListAsync(new UserGetBindingModel { UserNameForSearch = userName }); @@ -196,12 +228,13 @@ namespace DepartmentBusinessLogic.BusinessLogics var newStudent = await _studentLogic.CreateAsync(new StudentSetBindingModel { + Iduniv = student.iduniv, + NumberOfBook = student.recordBookName, UserId = newuser.Id, FirstName = student.firstName, LastName = student.lastName, Patronymic = student.patronymicName, - NumberOfBook = student.recordBookName, - StudentState = GetStudentState(student.stateName), + StudentState = StudentState.Неопределен, Description = student.presenatationOfRecordBook }); @@ -223,7 +256,7 @@ namespace DepartmentBusinessLogic.BusinessLogics Information = $"Добавлен студент {newStudent}" }); - await SyncStudentOrders(history, newStudent, groups.List, client, address.Value, student.iduniv); + await SyncStudentOrders(history, newStudent, groups.List, client, address.Value); studentFromServer.CurrentStudentsList.Remove(student); } @@ -231,13 +264,6 @@ namespace DepartmentBusinessLogic.BusinessLogics return true; } - private static StudentState GetStudentState(string state) => state switch - { - "Является студентом" => StudentState.Учится, - "Находится в академическом отпуске" => StudentState.Академ, - _ => StudentState.Неопределен, - }; - /// /// Синхронизация приказов по студенту /// @@ -246,11 +272,10 @@ namespace DepartmentBusinessLogic.BusinessLogics /// /// /// - /// /// - private async Task SyncStudentOrders(OrderSyncHistoryViewModel history, StudentViewModel student, List groups, HttpClient client, string address, string iduniv) + private async Task SyncStudentOrders(OrderSyncHistoryViewModel history, StudentViewModel student, List groups, HttpClient client, string address) { - HttpResponseMessage response = await client.GetAsync($"{address}/univer_Testing/hs/Ulstu_StudentsInfo/v1/GetStudentOrdersByIdAndRecordBook?iduniv={iduniv}&recordBookName={student.NumberOfBook}&allOrders=sppd"); + HttpResponseMessage response = await client.GetAsync($"{address}/univer_Testing/hs/Ulstu_StudentsInfo/v1/GetStudentOrdersByIdAndRecordBook?iduniv={student.Iduniv}&recordBookName={student.NumberOfBook}&allOrders=sppd"); if (!response.IsSuccessStatusCode) { Errors.Add(("Ошибка получения данных", "Не удалось получить список приказов по студенту")); @@ -265,159 +290,342 @@ namespace DepartmentBusinessLogic.BusinessLogics foreach (var syncOrder in syncOrders.StudentOrders) { var orderType = GetOrderType(syncOrder.orderSubTypeName); - // отбираем только приказы, которые нас интересуют - if (orderType != OrderType.Неопределено) + + // пропускаем приказы, которые нас не интересуют + if (orderType == OrderType.Неопределено) { - // пытаемся найти приказ - var order = await _orderLogic.GetElementAsync(new OrderGetBindingModel + continue; + } + + // пытаемся найти приказ + var order = await _orderLogic.GetElementAsync(new OrderGetBindingModel + { + OrderNumber = syncOrder.clericNumber, + OrderDate = Convert.ToDateTime(syncOrder.clericDate) + }); + if (order == null) + { + // если не нашли - пытаемся создать + order = await _orderLogic.CreateAsync(new OrderSetBindingModel { OrderNumber = syncOrder.clericNumber, - OrderDate = Convert.ToDateTime(syncOrder.clericDate) + OrderDate = Convert.ToDateTime(syncOrder.clericDate), + OrderType = orderType }); if (order == null) { - // если не нашли - пытаемся создать - order = await _orderLogic.CreateAsync(new OrderSetBindingModel - { - OrderNumber = syncOrder.clericNumber, - OrderDate = Convert.ToDateTime(syncOrder.clericDate), - OrderType = orderType - }); - if (order == null) - { - var errors = _orderLogic.Errors; - errors.Add(("Ошибка добавления приказа", $"Не удалось добавить приказ {syncOrder.clericNumber} {syncOrder.clericDate}")); - await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel - { - OrderSyncHistoryId = history.Id, - Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) - }); - continue; - } - } - - // ищем в приказе запись по студенту - var studentOrder = await _orderStudentRecordLogic.GetElementAsync(new OrderStudentRecordGetBindingModel - { - OrderId = order.Id, - StudentId = student.Id - }); - if (studentOrder == null) - { - Guid? studentGroupFromId = null; - Guid? studentGroupToId = null; - string info = string.Empty; - if (syncOrder.groupNameBefore.IsNotEmpty()) - { - studentGroupFromId = groups.FirstOrDefault(x => x.ToString() == syncOrder.groupNameBefore)?.Id; - } - if (syncOrder.groupNameAfter.IsNotEmpty()) - { - studentGroupToId = groups.FirstOrDefault(x => x.ToString() == syncOrder.groupNameAfter)?.Id; - } - OrderStudentMoveType orderStudentMoveType = OrderStudentMoveType.Неопределено; - - switch (syncOrder.orderSubTypeName) - { - case "Перевод": - // внутренний перевод - if (studentGroupFromId.HasValue && studentGroupToId.HasValue) - { - orderStudentMoveType = OrderStudentMoveType.ПереводВГруппу; - info = $"Перевод студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} в группу {groups.First(x => x.Id == studentGroupToId)}"; - } - else if (!studentGroupFromId.HasValue && studentGroupToId.HasValue) - { - orderStudentMoveType = OrderStudentMoveType.ЗачислитьПоПереводу; - info = $"Зачисление переовдом студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}"; - } - else if (studentGroupFromId.HasValue && !studentGroupToId.HasValue) - { - orderStudentMoveType = OrderStudentMoveType.ОтчислитьВСвязиСПереводом; - info = $"Отчисление студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} в связи с переводом"; - } - break; - case "Зачисление в вуз": - orderStudentMoveType = OrderStudentMoveType.Зачисление; - info = $"Зачисление студента {student}"; - break; - case "Распределение по группам": - orderStudentMoveType = OrderStudentMoveType.Распределение; - info = $"Распределение студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}"; - break; - case "Перевод на следующий курс": - orderStudentMoveType = OrderStudentMoveType.ПереводНаКурс; - info = $"Перевод студента {student} на следующий курс"; - break; - } - - if (orderStudentMoveType == OrderStudentMoveType.Неопределено) - { - continue; - } - - // создаем, если не нашли - studentOrder = await _orderStudentRecordLogic.CreateAsync(new OrderStudentRecordSetBindingModel - { - OrderId = order.Id, - StudentId = student.Id, - Info = info, - OrderStudentMoveType = orderStudentMoveType, - StudentGroupFromId = studentGroupFromId, - StudentGroupToId = studentGroupToId - }); - if (studentOrder == null) - { - var errors = _orderStudentRecordLogic.Errors; - errors.Add(("Ошибка добавления записи приказа по студенту", $"Не удалось добавить запись приказа {syncOrder.orderSubTypeName} по студенту {student}")); - await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel - { - OrderSyncHistoryId = history.Id, - Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) - }); - continue; - } - - if (student.StudentGroupId != studentGroupToId) - { - var st = Mapper.MapToClass(student, true); - st.StudentGroupId = studentGroupToId; - var studentName = student.ToString(); - student = await _studentLogic.UpdateAsync(st); - if (student == null) - { - var errors = _studentLogic.Errors; - errors.Add(("Ошибка изменения по студенту", $"Не удалось изменить группу у студента {studentName}")); - await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel - { - OrderSyncHistoryId = history.Id, - Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) - }); - continue; - } - await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel - { - OrderSyncHistoryId = history.Id, - Information = $"У студента {student} сменилась группа на {student.StudentGroupName}" - }); - } - + var errors = _orderLogic.Errors; + errors.Add(("Ошибка добавления приказа", $"Не удалось добавить приказ {syncOrder.clericNumber} {syncOrder.clericDate}")); await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel { OrderSyncHistoryId = history.Id, - Information = $"Добавили запись к приказу {order.OrderNumber} по студенту {student} с формулировкой {info}" + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) }); - - if (orderStudentMoveType == OrderStudentMoveType.ОтчислитьВСвязиСПереводом || - orderStudentMoveType == OrderStudentMoveType.ОтчислитьЗаНевыходСАкадема || - orderStudentMoveType == OrderStudentMoveType.ОтчислитьЗаНеуспевамость || - orderStudentMoveType == OrderStudentMoveType.ОтчислитьПоЗавершению || - orderStudentMoveType == OrderStudentMoveType.ОтчислитьПоСобственному) - { - return; - } + continue; } } + + // ищем в приказе запись по студенту + var studentOrder = await _orderStudentRecordLogic.GetElementAsync(new OrderStudentRecordGetBindingModel + { + OrderId = order.Id, + StudentId = student.Id + }); + + // если такой приказ по студенту уже есть, просто пропускаем + if (studentOrder != null) + { + continue; + } + + Guid? studentGroupFromId = null; + Guid? studentGroupToId = null; + string info = string.Empty; + if (syncOrder.groupNameBefore.IsNotEmpty()) + { + studentGroupFromId = groups.FirstOrDefault(x => x.ToString() == syncOrder.groupNameBefore)?.Id; + } + if (syncOrder.groupNameAfter.IsNotEmpty()) + { + studentGroupToId = groups.FirstOrDefault(x => x.ToString() == syncOrder.groupNameAfter)?.Id; + } + // если был переведенец к нам, то игнорируем приказы, не связанные с нашими группами + if (!studentGroupFromId.HasValue && !studentGroupToId.HasValue) + { + continue; + } + OrderStudentMoveType orderStudentMoveType = OrderStudentMoveType.Неопределено; + + switch (syncOrder.orderTypeName) + { + case "Перевод": + if (syncOrder.orderSubTypeName == "Распределение по группам") + { + orderStudentMoveType = OrderStudentMoveType.Распределение; + info = $"Распределение студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}"; + } + // внутренний перевод + else if (studentGroupFromId.HasValue && studentGroupToId.HasValue) + { + orderStudentMoveType = OrderStudentMoveType.ПереводВГруппу; + info = $"Перевод студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} в группу {groups.First(x => x.Id == studentGroupToId)}"; + } + else if (!studentGroupFromId.HasValue && studentGroupToId.HasValue) + { + orderStudentMoveType = OrderStudentMoveType.ЗачислитьПоПереводу; + info = $"Зачисление переовдом студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}"; + } + else if (studentGroupFromId.HasValue && !studentGroupToId.HasValue) + { + orderStudentMoveType = OrderStudentMoveType.ОтчислитьВСвязиСПереводом; + info = $"Отчисление студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} в связи с переводом"; + } + break; + case "Зачисление в вуз вне приемной кампании": + orderStudentMoveType = OrderStudentMoveType.Зачисление; + info = $"Зачисление студента {student}"; + break; + case "Перевод на следующий курс": + orderStudentMoveType = OrderStudentMoveType.ПереводНаКурс; + info = $"Перевод студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} на следующий курс в группу {groups.First(x => x.Id == studentGroupToId)}"; + break; + case "Уход в академический отпуск": + orderStudentMoveType = OrderStudentMoveType.ВАкадем; + info = $"Уход в АО студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)}"; + break; + case "Продление академического отпуска": + orderStudentMoveType = OrderStudentMoveType.ПродлАкадем; + info = $"Продление АО студента {student}"; + break; + case "Восстановление из академического отпуска": + orderStudentMoveType = OrderStudentMoveType.ИзАкадема; + info = $"Выход из АО студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}"; + break; + case "Восстановление": // уточнить приказ + orderStudentMoveType = OrderStudentMoveType.Восстановить; + info = $"Восстановление отчисленного студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}"; + break; + case "Отчисление по собственному": // уточнить приказ + orderStudentMoveType = OrderStudentMoveType.ОтчислитьПоСобственному; + info = $"Отчисление студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} по собственному желанию"; + break; + case "Отчисление за неуспеваемость": // уточнить приказ + orderStudentMoveType = OrderStudentMoveType.ОтчислитьПоСобственному; + info = $"Отчисление студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} за неуспеваемость"; + break; + case "Отчисление по невыходу из академа": // уточнить приказ + orderStudentMoveType = OrderStudentMoveType.ОтчислитьПоСобственному; + info = $"Отчисление студента {student} по невыходу из академа"; + break; + case "Хавершение обучения": // уточнить приказ + orderStudentMoveType = OrderStudentMoveType.ОтчислитьПоСобственному; + info = $"Отчисление студента {student} в связи с окончанием обучения"; + break; + } + + if (orderStudentMoveType == OrderStudentMoveType.Неопределено) + { + continue; + } + + // создаем, если не нашли + studentOrder = await _orderStudentRecordLogic.CreateAsync(new OrderStudentRecordSetBindingModel + { + OrderId = order.Id, + StudentId = student.Id, + Info = info, + OrderStudentMoveType = orderStudentMoveType, + StudentGroupFromId = studentGroupFromId, + StudentGroupToId = studentGroupToId + }); + if (studentOrder == null) + { + var errors = _orderStudentRecordLogic.Errors; + errors.Add(("Ошибка добавления записи приказа по студенту", $"Не удалось добавить запись приказа {syncOrder.orderSubTypeName} по студенту {student}")); + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) + }); + continue; + } + + var st = Mapper.MapToClass(student, true); + var studentName = student.ToString(); + if (student.StudentGroupId != studentGroupToId) + { + st.StudentGroupId = studentGroupToId; + student = await _studentLogic.UpdateAsync(st); + if (student == null) + { + var errors = _studentLogic.Errors; + errors.Add(("Ошибка изменения по студенту", $"Не удалось изменить группу у студента {studentName}")); + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) + }); + continue; + } + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = $"У студента {student} сменилась группа на {student.StudentGroupName}" + }); + } + + if ((orderStudentMoveType == OrderStudentMoveType.Зачисление || orderStudentMoveType == OrderStudentMoveType.ЗачислитьПоПереводу + || orderStudentMoveType == OrderStudentMoveType.ПереводВГруппу) && student.StudentState != StudentState.Учится) + { + st.StudentState = StudentState.Учится; + student = await _studentLogic.UpdateAsync(st); + if (student == null) + { + var errors = _studentLogic.Errors; + errors.Add(("Ошибка изменения по студенту", $"Не удалось изменить статус у студента {studentName}")); + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) + }); + continue; + } + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = $"У студента {student} сменился статус на {StudentState.Учится}" + }); + } + + if ((orderStudentMoveType == OrderStudentMoveType.ВАкадем || orderStudentMoveType == OrderStudentMoveType.ПродлАкадем) + && student.StudentState != StudentState.Академ) + { + st.StudentState = StudentState.Академ; + student = await _studentLogic.UpdateAsync(st); + if (student == null) + { + var errors = _studentLogic.Errors; + errors.Add(("Ошибка изменения по студенту", $"Не удалось изменить статус у студента {studentName}")); + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) + }); + continue; + } + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = $"У студента {student} сменился статус на {StudentState.Академ}" + }); + } + + if (orderStudentMoveType == OrderStudentMoveType.ИзАкадема && student.StudentState != StudentState.Учится) + { + st.StudentState = StudentState.Учится; + student = await _studentLogic.UpdateAsync(st); + if (student == null) + { + var errors = _studentLogic.Errors; + errors.Add(("Ошибка изменения по студенту", $"Не удалось изменить статус у студента {studentName}")); + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) + }); + continue; + } + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = $"У студента {student} сменился статус на {StudentState.Учится}" + }); + } + + if ((orderStudentMoveType == OrderStudentMoveType.ОтчислитьВСвязиСПереводом || orderStudentMoveType == OrderStudentMoveType.ОтчислитьЗаНевыходСАкадема + || orderStudentMoveType == OrderStudentMoveType.ОтчислитьЗаНеуспевамость || orderStudentMoveType == OrderStudentMoveType.ОтчислитьПоСобственному + || orderStudentMoveType == OrderStudentMoveType.ОтчислитьПоЗавершению) && student.StudentState != StudentState.Отчислен) + { + st.StudentState = orderStudentMoveType == OrderStudentMoveType.ОтчислитьПоЗавершению ? StudentState.Завершил : StudentState.Отчислен; + student = await _studentLogic.UpdateAsync(st); + if (student == null) + { + var errors = _studentLogic.Errors; + errors.Add(("Ошибка изменения по студенту", $"Не удалось изменить статус у студента {studentName}")); + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) + }); + continue; + } + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = $"У студента {student} сменился статус на {(orderStudentMoveType == OrderStudentMoveType.ОтчислитьПоЗавершению ? StudentState.Завершил : StudentState.Отчислен)}" + }); + var result = await _studentLogic.DeleteAsync(new StudentGetBindingModel { Id = student.Id }); + if (!result) + { + var errors = _userLogic.Errors; + errors.Add(("Ошибка удаления студента", $"Не удалось удалить студента {studentName}")); + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) + }); + continue; + } + result = await _userLogic.DeleteAsync(new UserGetBindingModel { Id = student.UserId }); + if (!result) + { + var errors = _userLogic.Errors; + errors.Add(("Ошибка удаления пользователя по студенту", $"Не удалось удалить пользователя по студенту {studentName}")); + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) + }); + continue; + } + } + + if (orderStudentMoveType == OrderStudentMoveType.Восстановить && student.StudentState != StudentState.Учится) + { + st.StudentState = StudentState.Учится; + student = await _studentLogic.UpdateAsync(st); + if (student == null) + { + var errors = _studentLogic.Errors; + errors.Add(("Ошибка изменения по студенту", $"Не удалось изменить статус у студента {studentName}")); + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = string.Join(Environment.NewLine, errors.Select(x => x.Message)) + }); + continue; + } + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = $"У студента {student} сменился статус на {StudentState.Учится}" + }); + } + + await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel + { + OrderSyncHistoryId = history.Id, + Information = $"Добавили запись к приказу {order.OrderNumber} по студенту {student} с формулировкой {info}" + }); + + if (orderStudentMoveType == OrderStudentMoveType.ОтчислитьВСвязиСПереводом || + orderStudentMoveType == OrderStudentMoveType.ОтчислитьЗаНевыходСАкадема || + orderStudentMoveType == OrderStudentMoveType.ОтчислитьЗаНеуспевамость || + orderStudentMoveType == OrderStudentMoveType.ОтчислитьПоЗавершению || + orderStudentMoveType == OrderStudentMoveType.ОтчислитьПоСобственному) + { + return; + } } } diff --git a/DepartmentPortal/Department/DepartmentBusinessLogic/ViewModels/StudentViewModels.cs b/DepartmentPortal/Department/DepartmentBusinessLogic/ViewModels/StudentViewModels.cs index fc29b36..b13072b 100644 --- a/DepartmentPortal/Department/DepartmentBusinessLogic/ViewModels/StudentViewModels.cs +++ b/DepartmentPortal/Department/DepartmentBusinessLogic/ViewModels/StudentViewModels.cs @@ -30,6 +30,10 @@ namespace DepartmentBusinessLogic.ViewModels [MapConfiguration("StudentGroup.ToString", IsDifficle = true)] public string StudentGroupName { get; set; } + [ViewModelControlElementProperty("Идентификатор универа", ControlType.ControlString, MustHaveValue = true, ReadOnly = true)] + [MapConfiguration("Iduniv")] + public string Iduniv { get; set; } + [ViewModelControlListProperty("Номер зачетки")] [ViewModelControlElementProperty("Номер зачетки", ControlType.ControlString, MustHaveValue = true, ReadOnly = true)] [MapConfiguration("NumberOfBook")] diff --git a/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/Implementations/StudentService.cs b/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/Implementations/StudentService.cs index 1b0c02d..00c55c6 100644 --- a/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/Implementations/StudentService.cs +++ b/DepartmentPortal/Department/DepartmentDatabaseImplementation.csproj/Implementations/StudentService.cs @@ -4,6 +4,7 @@ using DepartmentBusinessLogic.BindingModels; using DepartmentBusinessLogic.Interfaces; using DepartmentBusinessLogic.ViewModels; using Microsoft.EntityFrameworkCore; +using ModuleTools.Extensions; using ModuleTools.Models; using System; using System.Linq; @@ -56,5 +57,23 @@ namespace DepartmentDatabaseImplementation.Implementations protected override IQueryable IncludingWhenReading(IQueryable query) => query.Include(x => x.StudentGroup).Include(x => x.User); protected override IQueryable OrderingWhenReading(IQueryable query) => query.OrderBy(x => x.StudentGroup.AcademicCourse).ThenBy(x => x.StudentGroup.GroupNumber).ThenBy(x => x.LastName).ThenBy(x => x.FirstName); + + protected override bool AdditionalCheckForSingleGet(StudentGetBindingModel model) + { + if (model.NumberOfBook.IsNotEmpty()) + { + return true; + } + return base.AdditionalCheckForSingleGet(model); + } + + protected override Student GetSingleRecord(IQueryable list, StudentGetBindingModel model) + { + if (model.NumberOfBook.IsNotEmpty()) + { + return list.FirstOrDefault(x => x.NumberOfBook == model.NumberOfBook); + } + return base.GetSingleRecord(list, model); + } } } \ No newline at end of file