2022-03-18 22:08:29 +04:00
using CoreModels.Enums.Department ;
2021-04-27 15:14:35 +04:00
using DepartmentBusinessLogic.HelperModels ;
2022-03-19 22:48:13 +04:00
using DepartmentContract.BindingModels ;
using DepartmentContract.Logics.IGenericEntityLogic ;
using DepartmentContract.Services.IGenericEntityService ;
using DepartmentContract.ViewModels ;
using SecurityContract.BindingModels ;
using SecurityContract.Logics.IGenericEntityLogic ;
using SecurityContract.ViewModels ;
2021-04-27 15:14:35 +04:00
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Net.Http ;
using System.Net.Http.Headers ;
using System.Text ;
using System.Text.Json ;
2022-03-18 10:22:34 +04:00
using System.Threading.Tasks ;
2022-03-20 10:10:44 +04:00
using ToolsModule.ManagmentDependency ;
using ToolsModule.ManagmentEntity ;
using ToolsModule.ManagmentExtension ;
using ToolsModule.ManagmentSecurity ;
2021-04-27 15:14:35 +04:00
2022-03-19 22:48:13 +04:00
namespace DepartmentBusinessLogic.BusinessLogics.GenericBusinessLogic
2021-04-27 15:14:35 +04:00
{
2022-03-15 22:02:13 +04:00
/// <summary>
/// Логика работы с историями синхронизации приказов
/// </summary>
2022-03-19 22:48:13 +04:00
public class OrderSyncHistoryBusinessLogic : GenericBusinessLogic < OrderSyncHistoryGetBindingModel , OrderSyncHistorySetBindingModel , OrderSyncHistoryListViewModel , OrderSyncHistoryViewModel > , IOrderSyncHistoryLogic
2022-03-18 10:22:34 +04:00
{
2022-03-19 22:48:13 +04:00
private IOrderSyncHistoryRecordLogic _recordLogic ;
2022-03-18 10:22:34 +04:00
2022-03-19 22:48:13 +04:00
private IEnviromentSettingLogic _enviromentSettingLogic ;
2022-03-18 10:22:34 +04:00
2022-12-16 17:43:23 +04:00
private IAcademicPlanLogic _academicPlanLogic ;
2022-03-19 22:48:13 +04:00
private IStudentGroupLogic _groupsLogic ;
2022-03-18 10:22:34 +04:00
2022-03-19 22:48:13 +04:00
private IStudentLogic _studentLogic ;
2022-03-18 10:22:34 +04:00
2022-03-19 22:48:13 +04:00
private IUserLogic _userLogic ;
2022-03-18 10:22:34 +04:00
2022-03-19 22:48:13 +04:00
private IUserRoleLogic _userRoleLogic ;
2022-03-18 20:09:15 +04:00
2022-03-19 22:48:13 +04:00
private IRoleLogic _roleLogic ;
2022-03-18 20:09:15 +04:00
2022-03-19 22:48:13 +04:00
private IOrderLogic _orderLogic ;
2022-03-18 10:22:34 +04:00
2022-03-19 22:48:13 +04:00
private IOrderStudentRecordLogic _orderStudentRecordLogic ;
2022-03-18 10:22:34 +04:00
2022-03-29 13:33:32 +04:00
private OrderSyncHistoryViewModel _history ;
2022-12-16 17:43:23 +04:00
private StudentGroupListViewModel _groups ;
2022-03-18 10:22:34 +04:00
public OrderSyncHistoryBusinessLogic ( IOrderSyncHistoryService service ) : base ( service , "Синхронизация Приказов" , AccessOperation . С и н х р о н и з а ц и я П р и к а з о в ) { }
2022-12-16 17:43:23 +04:00
/// <summary>
/// Синхронизация приказов по всем студентам
/// </summary>
/// <returns></returns>
2022-03-18 10:22:34 +04:00
public async Task < bool > SyncOrders ( )
{
2022-03-18 20:09:15 +04:00
InitLogics ( ) ;
2022-12-16 17:43:23 +04:00
// создание логов по операции синхронизации приказов
2022-03-29 13:33:32 +04:00
if ( ! CreateHistory ( ) )
2022-03-18 10:22:34 +04:00
{
return false ;
}
2022-12-16 17:43:23 +04:00
// получение адреса сервера с приказами
2022-03-29 13:33:32 +04:00
var address = GetAddress ( ) ;
2022-03-19 11:53:10 +04:00
if ( address = = null )
2022-03-18 10:22:34 +04:00
{
return false ;
}
2022-12-16 17:43:23 +04:00
// подключение клиента для отправки запросов к серверу
2022-03-29 13:33:32 +04:00
var client = GetClinet ( address ) ;
2022-03-18 20:09:15 +04:00
if ( client = = null )
2022-03-18 10:22:34 +04:00
{
return false ;
}
// получение списка студентов
2022-03-29 13:33:32 +04:00
var response = await client . GetAsync ( $"{address.Value}/univer/hs/Ulstu_StudentsInfo/v1/GetCurrentStudentsOfDepartment" ) ;
2022-03-18 10:22:34 +04:00
if ( ! response . IsSuccessStatusCode )
{
2022-03-29 13:33:32 +04:00
SaveLog ( "Н е удалось получить список студентов с сервера" ) ;
2022-03-18 10:22:34 +04:00
return false ;
}
var studentFromServer = JsonSerializer . Deserialize < StudentListSyncModel > ( await response . Content . ReadAsStringAsync ( ) ) ;
2022-03-29 13:33:32 +04:00
if ( studentFromServer = = null | | studentFromServer . CurrentStudentsList = = null )
{
SaveLog ( "Н е удалось распознать список приказов по студенту" ) ;
return false ;
}
2022-03-18 10:22:34 +04:00
if ( studentFromServer . CurrentStudentsList . Count = = 0 )
{
2022-03-29 13:33:32 +04:00
SaveLog ( "Полученный список студентов пустой" ) ;
return false ;
2022-03-18 10:22:34 +04:00
}
2022-12-16 17:43:23 +04:00
_groups = GetStudentGroups ( ) ;
2022-03-18 10:22:34 +04:00
var students = _studentLogic . GetList ( new StudentGetBindingModel ( ) ) ;
if ( students = = null | | students . List = = null )
{
2022-03-29 13:33:32 +04:00
SaveErrors ( _studentLogic . Errors , "Ошибка получения данных" , "Н е удалось получить список студентов с базы" ) ;
2022-03-18 10:22:34 +04:00
return false ;
}
foreach ( var student in students . List )
{
var studentSync = studentFromServer . CurrentStudentsList . FirstOrDefault ( x = > x . recordBookName = = student . NumberOfBook ) ;
2022-12-16 17:43:23 +04:00
// студент не найден, значит он ушел с кафедры, выясняем почему ИЛИ не совпадение групп
if ( studentSync = = null | | student . StudentGroupName ! = studentSync . groupName )
2022-03-18 10:22:34 +04:00
{
2022-12-16 17:43:23 +04:00
await SyncStudentOrders ( student , client , address . Value ) ;
2022-03-18 10:22:34 +04:00
}
studentFromServer . CurrentStudentsList . Remove ( studentSync ) ;
}
// новые студенты и восстановленцы
foreach ( var student in studentFromServer . CurrentStudentsList )
{
2022-12-16 17:43:23 +04:00
// восстановленцы
2022-04-28 11:35:15 +04:00
var deletedStudent = _studentLogic . GetElement ( new StudentGetBindingModel { NumberOfBook = student . recordBookName , IgnoreDeleted = true } ) ;
2022-03-29 13:33:32 +04:00
if ( deletedStudent ! = null )
2022-03-18 10:22:34 +04:00
{
2022-12-16 17:43:23 +04:00
await SyncStudentOrders ( deletedStudent , client , address . Value ) ;
2022-03-18 20:09:15 +04:00
continue ;
2022-03-18 10:22:34 +04:00
}
2022-12-16 17:43:23 +04:00
// новые студенты
2022-03-29 13:33:32 +04:00
var newStudent = CreateNewStudent ( student ) ;
if ( newStudent ! = null )
2022-03-18 10:22:34 +04:00
{
2022-03-29 13:33:32 +04:00
SaveLog ( $"Добавлен студент {newStudent}" ) ;
2022-12-16 17:43:23 +04:00
await SyncStudentOrders ( newStudent , client , address . Value ) ;
2022-03-18 10:22:34 +04:00
}
}
2022-12-16 17:43:23 +04:00
foreach ( var group in _groups . List )
{
var grStudents = _studentLogic . GetList ( new StudentGetBindingModel { StudentGroupId = group . Id } ) ;
if ( grStudents ? . List ? . Count = = 0 )
{
_groupsLogic . Delete ( new StudentGroupGetBindingModel { Id = group . Id } ) ;
}
}
2022-03-18 10:22:34 +04:00
return true ;
}
2022-12-16 17:43:23 +04:00
/// <summary>
/// Синхронизация приказов по студенту
/// </summary>
/// <param name="studentId"></param>
/// <returns></returns>
2022-03-19 11:53:10 +04:00
public async Task < bool > SyncStudentOrders ( Guid studentId )
{
InitLogics ( ) ;
2022-03-29 13:33:32 +04:00
if ( ! CreateHistory ( ) )
2022-03-19 11:53:10 +04:00
{
return false ;
}
2022-03-29 13:33:32 +04:00
SaveLog ( "Синхронизация приказов по студенту" ) ;
2022-03-19 11:53:10 +04:00
2022-03-29 13:33:32 +04:00
var address = GetAddress ( ) ;
2022-03-19 11:53:10 +04:00
if ( address = = null )
{
return false ;
}
2022-03-29 13:33:32 +04:00
var client = GetClinet ( address ) ;
2022-03-19 11:53:10 +04:00
if ( client = = null )
{
return false ;
}
2022-12-16 17:43:23 +04:00
_groups = GetStudentGroups ( ) ;
2022-03-19 11:53:10 +04:00
var student = _studentLogic . GetElement ( new StudentGetBindingModel { Id = studentId } ) ;
if ( student = = null )
{
2022-03-29 13:33:32 +04:00
SaveErrors ( _studentLogic . Errors , "Ошибка получения данных" , "Н е удалось получить студента с базы" ) ;
2022-03-19 11:53:10 +04:00
return false ;
}
2022-12-16 17:43:23 +04:00
await SyncStudentOrders ( student , client , address . Value ) ;
2022-03-19 11:53:10 +04:00
return true ;
}
2022-12-16 17:43:23 +04:00
/// <summary>
/// Инициализаия всех логик для получения от них данных и сохранения новых
/// </summary>
2022-03-18 20:09:15 +04:00
private void InitLogics ( )
{
2022-03-19 22:48:13 +04:00
_recordLogic = DependencyManager . Instance . Resolve < IOrderSyncHistoryRecordLogic > ( ) ;
_enviromentSettingLogic = DependencyManager . Instance . Resolve < IEnviromentSettingLogic > ( ) ;
2022-12-16 17:43:23 +04:00
_academicPlanLogic = DependencyManager . Instance . Resolve < IAcademicPlanLogic > ( ) ;
2022-03-19 22:48:13 +04:00
_groupsLogic = DependencyManager . Instance . Resolve < IStudentGroupLogic > ( ) ;
_studentLogic = DependencyManager . Instance . Resolve < IStudentLogic > ( ) ;
_orderLogic = DependencyManager . Instance . Resolve < IOrderLogic > ( ) ;
_orderStudentRecordLogic = DependencyManager . Instance . Resolve < IOrderStudentRecordLogic > ( ) ;
_userLogic = DependencyManager . Instance . Resolve < IUserLogic > ( ) ;
_userRoleLogic = DependencyManager . Instance . Resolve < IUserRoleLogic > ( ) ;
_roleLogic = DependencyManager . Instance . Resolve < IRoleLogic > ( ) ;
2022-03-18 20:09:15 +04:00
}
2022-12-16 17:43:23 +04:00
/// <summary>
/// Создаение логера действий при синхронизации приказов
/// </summary>
/// <returns></returns>
2022-03-29 13:33:32 +04:00
private bool CreateHistory ( )
{
_history = Create ( new OrderSyncHistorySetBindingModel { SyncDate = DateTime . Now } ) ;
if ( _history = = null )
{
Errors . Add ( ( "Ошибка создание истории" , "Н е удалось создать историю" ) ) ;
return false ;
}
return true ;
}
2022-12-16 17:43:23 +04:00
/// <summary>
/// Получение адреса сервера
/// </summary>
/// <returns></returns>
2022-03-29 13:33:32 +04:00
private EnviromentSettingViewModel GetAddress ( )
2022-03-19 11:53:10 +04:00
{
var address = _enviromentSettingLogic . GetList ( new EnviromentSettingGetBindingModel { Key = "SyncStudentOrderIpAddress" } ) ? . List ? . FirstOrDefault ( ) ;
if ( address = = null | | address . Value . IsEmpty ( ) )
{
2022-03-29 13:33:32 +04:00
SaveErrors ( _enviromentSettingLogic . Errors , "Ошибка получения данных" , "Н е удалось получить адрес сервера для получения приказов по студентам" ) ;
2022-03-19 11:53:10 +04:00
return null ;
}
return address ;
}
2022-12-16 17:43:23 +04:00
/// <summary>
/// Получение клиента для работы с сервисом приказов
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
2022-03-29 13:33:32 +04:00
private HttpClient GetClinet ( EnviromentSettingViewModel address )
{
var username = _enviromentSettingLogic . GetList ( new EnviromentSettingGetBindingModel { Key = "SyncStudentOrderUserName" } ) ? . List ? . FirstOrDefault ( ) ;
if ( username = = null | | username . Value . IsEmpty ( ) )
{
SaveErrors ( _enviromentSettingLogic . Errors , "Ошибка получения данных" , "Н е удалось получить имя пользователя для получения приказов по студентам" ) ;
return null ;
}
var password = _enviromentSettingLogic . GetList ( new EnviromentSettingGetBindingModel { Key = "SyncStudentOrderPassword" } ) ? . List ? . FirstOrDefault ( ) ;
if ( password = = null | | password . Value . IsEmpty ( ) )
{
SaveErrors ( _enviromentSettingLogic . Errors , "Ошибка получения данных" , "Н е удалось получить пароль для получения приказов по студентам" ) ;
return null ;
}
var client = new HttpClient
{
BaseAddress = new Uri ( address . Value )
} ;
client . DefaultRequestHeaders . Accept . Clear ( ) ;
client . DefaultRequestHeaders . Accept . Add ( new MediaTypeWithQualityHeaderValue ( "application/json" ) ) ;
client . DefaultRequestHeaders . Authorization = new AuthenticationHeaderValue ( "Basic" , Convert . ToBase64String ( Encoding . UTF8 . GetBytes ( $"{username.Value}:{password.Value}" ) ) ) ;
return client ;
}
2022-12-16 17:43:23 +04:00
/// <summary>
/// Получение списка групп
/// </summary>
/// <returns></returns>
private StudentGroupListViewModel GetStudentGroups ( )
{
var sgs = _groupsLogic . GetList ( new StudentGroupGetBindingModel ( ) ) ;
if ( sgs = = null | | sgs . List = = null )
{
SaveErrors ( _groupsLogic . Errors , "Ошибка получения данных" , "Н е удалось получить список групп с базы" ) ;
return null ;
}
return sgs ;
}
/// <summary>
/// Получение пользователя-студента
/// </summary>
/// <param name="student"></param>
/// <returns></returns>
2022-03-29 13:33:32 +04:00
private UserViewModel WorkWithUser ( StudentSyncModel student )
{
var userName = $"{student.lastName}{(student.firstName.IsNotEmpty() ? $" { student . firstName [ 0 ] } . " : string.Empty)}{(student.patronymicName.IsNotEmpty() ? $" { student . patronymicName [ 0 ] } . " : string.Empty)}" ;
var user = _userLogic . GetOrCreateUser ( new UserGetBindingModel
{
Login = student . recordBookName
} , userName ) ;
if ( user = = null )
{
if ( _userLogic . Errors . Count > 0 )
{
SaveErrors ( _userLogic . Errors , "Ошибка получения пользователя под студента" , $"Н е удалось получить пользователя под студента {student.lastName} {student.firstName} {student.patronymicName}" ) ;
return null ;
}
}
var role = _roleLogic . GetElement ( new RoleGetBindingModel { RoleName = "Студент" } ) ;
if ( role = = null )
{
if ( _roleLogic . Errors . Count > 0 )
{
SaveErrors ( _roleLogic . Errors , "Ошибка получения роли студента" , $"Н е удалось получить роль под студента {student.lastName} {student.firstName} {student.patronymicName}" ) ;
return null ;
}
}
var link = _userRoleLogic . GetElement ( new UserRoleGetBindingModel { RoleId = role . Id , UserId = user . Id } ) ;
if ( link = = null )
{
var manager = DependencyManager . Instance . Resolve < ISecurityManager > ( ) ;
_userRoleLogic . Create ( new UserRoleSetBindingModel { RoleId = role . Id , UserId = user . Id , UserIdForAccess = manager ? . User } ) ;
if ( _userRoleLogic . Errors . Count > 0 )
{
SaveErrors ( _userRoleLogic . Errors , "Ошибка создания привязки студента к роли" , $"Н е удалось привязать студента {student.lastName} {student.firstName} {student.patronymicName} к роли" ) ;
return null ;
}
}
return user ;
}
2022-12-16 17:43:23 +04:00
/// <summary>
/// Создание нового студента
/// </summary>
/// <param name="student"></param>
/// <returns></returns>
2022-03-29 13:33:32 +04:00
private StudentViewModel CreateNewStudent ( StudentSyncModel student )
{
var user = WorkWithUser ( student ) ;
if ( user = = null )
{
return null ;
}
var newStudent = _studentLogic . Create ( new StudentSetBindingModel
{
Iduniv = student . iduniv ,
NumberOfBook = student . recordBookName ,
UserId = user . Id ,
FirstName = student . firstName ,
LastName = student . lastName ,
Patronymic = student . patronymicName ,
StudentState = StudentState . Н е о п р е д е л е н ,
Description = string . Empty
} ) ;
if ( newStudent = = null )
{
SaveErrors ( _studentLogic . Errors , "Ошибка добавления студента" , $"Н е удалось добавить студента {student.lastName} {student.firstName} {student.patronymicName}" ) ;
return null ;
}
return newStudent ;
}
2022-03-18 10:22:34 +04:00
/// <summary>
/// Синхронизация приказов по студенту
/// </summary>
/// <param name="history"></param>
/// <param name="student"></param>
/// <param name="groups"></param>
/// <param name="client"></param>
/// <param name="address"></param>
/// <returns></returns>
2022-12-16 17:43:23 +04:00
private async Task SyncStudentOrders ( StudentViewModel student , HttpClient client , string address )
2022-03-18 10:22:34 +04:00
{
var response = await client . GetAsync ( $"{address}/univer/hs/Ulstu_StudentsInfo/v1/GetStudentOrdersByIdAndRecordBook?iduniv={student.Iduniv}&recordBookName={student.NumberOfBook}&allOrders=sppd" ) ;
if ( ! response . IsSuccessStatusCode )
{
2022-03-29 13:33:32 +04:00
SaveLog ( "Н е удалось получить список приказов по студенту" ) ;
2022-03-18 10:22:34 +04:00
return ;
}
var syncOrders = JsonSerializer . Deserialize < StudentOrderListSyncModel > ( await response . Content . ReadAsStringAsync ( ) ) ;
2022-03-29 13:33:32 +04:00
if ( syncOrders = = null | | syncOrders . StudentOrders = = null )
{
SaveLog ( "Н е удалось распознать список приказов по студенту" ) ;
return ;
}
2022-03-18 10:22:34 +04:00
foreach ( var syncOrder in syncOrders . StudentOrders )
{
2022-03-18 20:09:15 +04:00
if ( syncOrder . orderTypeName = = "Утверждение тем курсовых работ" | |
syncOrder . orderTypeName = = "Утверждение тем В К Р " | |
syncOrder . orderTypeName = = "Назначение стипендии" )
{
continue ;
}
2022-03-18 10:22:34 +04:00
if ( syncOrder . markOfApprove . ToLower ( ) ! = "true" )
{
2022-03-29 13:33:32 +04:00
SaveLog ( $"Приказ {syncOrder.clericNumber} от {syncOrder.clericDate} ({syncOrder.orderTypeName}) по студенту {student} не утврежден" ) ;
2022-03-18 10:22:34 +04:00
continue ;
}
if ( syncOrder . clericNumber . IsEmpty ( ) )
{
2022-03-29 13:33:32 +04:00
SaveLog ( $"Приказ без номера от {syncOrder.clericDate} ({student})" ) ;
2022-03-18 10:22:34 +04:00
continue ;
}
if ( syncOrder . clericDate . IsEmpty ( ) )
{
2022-03-29 13:33:32 +04:00
SaveLog ( $"Приказ {syncOrder.clericNumber} - неизвестная дата ({student})" ) ;
2022-03-18 10:22:34 +04:00
continue ;
}
var orderType = GetOrderType ( syncOrder . orderTypeName ) ;
// пропускаем приказы, которые нас не интересуют
2022-03-18 20:09:15 +04:00
if ( orderType = = OrderType . И г н о р и р о в а т ь )
{
continue ;
}
2022-03-18 10:22:34 +04:00
if ( orderType = = OrderType . Н е о п р е д е л е н о )
{
2022-03-29 13:33:32 +04:00
if ( syncOrder . orderTypeName ! = "Корректировка" & & syncOrder . orderTypeName ! = "Смена ФИО" )
{
2022-12-16 17:43:23 +04:00
SaveLog ( $"Приказ {syncOrder.clericNumber} необрабатываемого типа {syncOrder.orderTypeName} по студенту {student}" ) ;
2022-03-29 13:33:32 +04:00
}
2022-03-18 10:22:34 +04:00
continue ;
}
// пытаемся найти приказ
var order = _orderLogic . GetElement ( new OrderGetBindingModel
{
2022-03-29 13:33:32 +04:00
OrderNumber = syncOrder . clericNumber ,
OrderDate = Convert . ToDateTime ( syncOrder . clericDate ) . Date ,
OrderType = orderType
2022-03-18 10:22:34 +04:00
} ) ;
if ( order = = null )
{
// если не нашли - пытаемся создать
order = _orderLogic . Create ( new OrderSetBindingModel
{
OrderNumber = syncOrder . clericNumber ,
2022-03-29 13:33:32 +04:00
OrderDate = Convert . ToDateTime ( syncOrder . clericDate ) . Date ,
2022-03-18 10:22:34 +04:00
OrderType = orderType
} ) ;
if ( order = = null )
{
2022-03-29 13:33:32 +04:00
SaveErrors ( _orderLogic . Errors , "Ошибка добавления приказа" , $"Н е удалось добавить приказ {syncOrder.clericNumber} {syncOrder.clericDate}" ) ;
2022-03-18 10:22:34 +04:00
continue ;
}
}
2022-12-16 17:43:23 +04:00
var studentGroupFrom = GetStudentGroup ( syncOrder . groupNameBefore , order , false ) ;
var studentGroupTo = GetStudentGroup ( syncOrder . groupNameAfter , order , syncOrder . orderSubTypeName = = "Распределение по группам" ) ;
2022-03-18 10:22:34 +04:00
// игнорируем приказы, не связанные с нашими группами
2022-12-16 17:43:23 +04:00
if ( studentGroupFrom = = null & & studentGroupTo = = null & & order . OrderType ! = OrderType . З а ч и с л е н и е С т у д е н т о в & &
syncOrder . reason ! = "на другой факультет" )
2022-03-18 10:22:34 +04:00
{
continue ;
}
2022-03-29 13:33:32 +04:00
var orderStudentMoveType = GetOrderStudentMoveType ( student , syncOrder , studentGroupFrom , studentGroupTo , out string info ) ;
2022-03-18 10:22:34 +04:00
if ( orderStudentMoveType = = OrderStudentMoveType . Н е о п р е д е л е н о )
{
2022-03-29 13:33:32 +04:00
SaveLog ( $"Неизветсный приказ {syncOrder.orderTypeName} ({syncOrder.reason}) по студенту {student}" ) ;
2022-03-18 10:22:34 +04:00
continue ;
}
// ищем в приказе запись по студенту
2022-03-18 20:09:15 +04:00
var exsistStudentOrder = _orderStudentRecordLogic . GetElement ( new OrderStudentRecordGetBindingModel
2022-03-18 10:22:34 +04:00
{
OrderId = order . Id ,
StudentId = student . Id ,
OrderStudentMoveType = orderStudentMoveType
} ) ;
// если такой приказ по студенту уже есть, просто пропускаем
2022-03-18 20:09:15 +04:00
if ( exsistStudentOrder ! = null )
2022-03-18 10:22:34 +04:00
{
continue ;
}
// создаем, если не нашли
2022-03-18 20:09:15 +04:00
var studentOrder = _orderStudentRecordLogic . Create ( new OrderStudentRecordSetBindingModel
2022-03-18 10:22:34 +04:00
{
OrderId = order . Id ,
StudentId = student . Id ,
Info = info ,
OrderStudentMoveType = orderStudentMoveType ,
2022-03-29 13:33:32 +04:00
StudentGroupFromId = studentGroupFrom ? . Id ,
2022-04-28 11:35:15 +04:00
StudentGroupToId = studentGroupTo ? . Id ,
StudentModel = student
2022-03-18 10:22:34 +04:00
} ) ;
if ( studentOrder = = null )
{
2022-03-29 13:33:32 +04:00
SaveErrors ( _orderStudentRecordLogic . Errors , "Ошибка добавления записи приказа по студенту" , $"Н е удалось добавить запись приказа {syncOrder.orderSubTypeName} по студенту {student}" ) ;
2022-03-18 10:22:34 +04:00
continue ;
}
2022-03-29 13:33:32 +04:00
SaveLog ( $"Добавили запись к приказу {order.OrderNumber} по студенту {student} с формулировкой {info}" ) ;
2022-03-18 10:22:34 +04:00
}
}
2022-12-16 17:43:23 +04:00
/// <summary>
/// Определение типа приказа
/// </summary>
/// <param name="orderTitle"></param>
/// <returns></returns>
2022-03-29 13:33:32 +04:00
private static OrderType GetOrderType ( string orderTitle ) = > orderTitle switch
2022-03-18 20:09:15 +04:00
{
2022-03-29 13:33:32 +04:00
"Зачисление в вуз вне приемной кампании" = > OrderType . З а ч и с л е н и е С т у д е н т о в ,
"Зачисление в вуз" = > OrderType . З а ч и с л е н и е С т у д е н т о в ,
"Перевод из другого вуза" = > OrderType . З а ч и с л е н и е С т у д е н т о в ,
"Перевод" = > OrderType . П е р е в о д ,
"Перевод на следующий курс" = > OrderType . Д в и ж е н и е С т у д е н т о в ,
"Завершение обучения" = > OrderType . О т ч и с л е н и е ,
"Уход в академический отпуск" = > OrderType . Д в и ж е н и е С т у д е н т о в ,
"Продление академического отпуска" = > OrderType . Д в и ж е н и е С т у д е н т о в ,
"Восстановление из академического отпуска" = > OrderType . Д в и ж е н и е С т у д е н т о в ,
"Отчисление" = > OrderType . О т ч и с л е н и е ,
"Восстановление" = > OrderType . П е р е в о д ,
"Выпуск" = > OrderType . Д в и ж е н и е С т у д е н т о в ,
"Утверждение тем В К Р " = > OrderType . И г н о р и р о в а т ь ,
_ = > OrderType . Н е о п р е д е л е н о ,
} ;
2022-03-18 20:09:15 +04:00
2022-12-16 17:43:23 +04:00
/// <summary>
/// Поиск группы по названию из приказа
/// </summary>
/// <param name="studetnGroupName"></param>
/// <param name="order"></param>
/// <param name="groups"></param>
/// <returns></returns>
private StudentGroupViewModel GetStudentGroup ( string studetnGroupName , OrderViewModel order , bool isGrouping )
{
if ( string . IsNullOrEmpty ( studetnGroupName ) )
{
return null ;
}
studetnGroupName = studetnGroupName . Replace ( "пбд" , "бд" ) ; // когда-то были группы-прикладники
int orderStudyYear = order . OrderDate . Year + ( order . OrderDate . Month / 7 ) - 1 ; // учебный год
var group = _groups . List . FirstOrDefault ( x = > GetGroupName ( x , orderStudyYear ) = = studetnGroupName ) ;
if ( group = = null & & isGrouping )
{
var academicPlan = _academicPlanLogic . GetElement ( new AcademicPlanGetBindingModel
{
EducationDirectionShortName = studetnGroupName . Split ( '-' ) [ 0 ] ,
Year = orderStudyYear
} ) ;
if ( academicPlan = = null )
{
SaveLog ( $"Н е найден учебный план для группы {studetnGroupName} за {orderStudyYear} год" ) ;
return null ;
}
int yearFinish = academicPlan . EducationDirectionQualification = = EducationDirectionQualification . Б а к а л а в р и а т ? orderStudyYear + 4 :
academicPlan . EducationDirectionQualification = = EducationDirectionQualification . М а г и с т р а т у р а ? orderStudyYear + 2 : 0 ;
var newGroup = _groupsLogic . Create ( new StudentGroupSetBindingModel
{
AcademicPlanId = academicPlan . Id ,
GroupNumber = Convert . ToInt32 ( studetnGroupName [ ^ 1 ] . ToString ( ) ) ,
LecturerId = null ,
YearEntrance = orderStudyYear ,
YearFinish = yearFinish
} ) ;
if ( newGroup = = null )
{
SaveErrors ( _groupsLogic . Errors , "Ошибка созданий группы" , "Н е удалось создать группу" ) ;
return null ;
}
_groups = GetStudentGroups ( ) ;
group = _groups . List . FirstOrDefault ( x = > GetGroupName ( x , orderStudyYear ) = = studetnGroupName ) ;
}
return group ;
}
/// <summary>
/// Получение именни группы в зависимости от нужного года
/// </summary>
/// <param name="group"></param>
/// <param name="orderStudyYear"></param>
/// <returns></returns>
private static string GetGroupName ( StudentGroupViewModel group , int orderStudyYear )
{
var course = orderStudyYear > group . YearFinish
? AcademicCourse . Н е о п р е д е л е н
: ( orderStudyYear - group . YearEntrance ) switch
{
0 = > AcademicCourse . К у р с _1 ,
1 = > AcademicCourse . К у р с _2 ,
2 = > AcademicCourse . К у р с _3 ,
3 = > AcademicCourse . К у р с _4 ,
4 = > AcademicCourse . К у р с _5 ,
_ = > AcademicCourse . Н е о п р е д е л е н ,
} ;
return $"{group.EducationDirectionShortName}-{((int)course)}{group.GroupNumber}" ;
}
/// <summary>
/// Определение подтипа приказа
/// </summary>
/// <param name="student"></param>
/// <param name="syncOrder"></param>
/// <param name="studentGroupFrom"></param>
/// <param name="studentGroupTo"></param>
/// <param name="info"></param>
/// <returns></returns>
2022-03-29 13:33:32 +04:00
private static OrderStudentMoveType GetOrderStudentMoveType ( StudentViewModel student , StudentOrderSyncModel syncOrder , StudentGroupViewModel studentGroupFrom ,
StudentGroupViewModel studentGroupTo , out string info )
{
switch ( syncOrder . orderTypeName )
2022-03-18 20:09:15 +04:00
{
2022-03-29 13:33:32 +04:00
case "Перевод" :
if ( syncOrder . orderSubTypeName = = "Распределение по группам" )
{
info = $"Распределение студента {student} в группу {studentGroupTo}" ;
return OrderStudentMoveType . Р а с п р е д е л и т ь ;
}
if ( studentGroupFrom ! = null & & studentGroupTo ! = null )
{
info = $"Перевод студента {student} из группы {studentGroupFrom} в группу {studentGroupTo}" ;
return OrderStudentMoveType . П е р е в е с т и Н а Д р у г о е Н а п р а в л е н и е К а ф е д р ы ;
}
if ( studentGroupFrom = = null & & studentGroupTo ! = null )
{
info = $"Перевод студента {student} c группы {syncOrder.groupNameBefore} другой кафедры в группу {studentGroupTo}" ;
return OrderStudentMoveType . П р и н я т ь П о П е р е в о д у ;
}
if ( studentGroupFrom ! = null & & studentGroupTo = = null )
{
info = $"Отчисление студента {student} из группы {studentGroupFrom} в связи с переводом" ;
return OrderStudentMoveType . О т ч и с л и т ь В С в я з и С П е р е в о д о м ;
}
info = string . Empty ;
return OrderStudentMoveType . Н е о п р е д е л е н о ;
case "Зачисление в вуз вне приемной кампании" :
info = $"Зачисление студента {student} по приказу" ;
return OrderStudentMoveType . З а ч и с л и т ь П о П р и к а з у ;
case "Зачисление в вуз" :
info = $"Зачисление студента {student} по приказу" ;
return OrderStudentMoveType . З а ч и с л и т ь П о П р и к а з у ;
case "Перевод из другого вуза" :
info = $"Перевод студента {student} с другого вуза" ;
return OrderStudentMoveType . П р и н я т ь П о П е р е в о д у с Д р у г о г о В у з а ;
case "Перевод на следующий курс" :
info = $"Перевод студента {student} из группы {studentGroupFrom} на следующий курс в группу {studentGroupTo}" ;
return OrderStudentMoveType . П е р е в е с т и Н а С т а р ш и й К у р с ;
case "Уход в академический отпуск" :
DateTime ? date = null ;
if ( syncOrder . dateEnd . IsNotEmpty ( ) )
{
date = Convert . ToDateTime ( syncOrder . dateEnd ) ;
}
info = $"Уход в А О студента {student} из группы {studentGroupFrom} до {date?.ToShortDateString() ?? string.Empty}" ;
return OrderStudentMoveType . О т п р а в и т ь В А к а д е м ;
case "Продление академического отпуска" :
info = $"Продление А О студента {student}" ;
return OrderStudentMoveType . П р о д л и т ь А к а д е м ;
case "Восстановление из академического отпуска" :
info = $"Выход из А О студента {student} в группу {studentGroupTo}" ;
return OrderStudentMoveType . В о с с т а н о в и т ь И з А к а д е м а ;
case "Отчисление" :
2022-12-16 17:43:23 +04:00
if ( syncOrder . reason . Contains ( "за невыполнение учебного плана" ) | |
syncOrder . reason . Contains ( "академическую неуспеваемость" ) | |
syncOrder . reason . Contains ( "в связи с невыполнением обучающимся обязанностей по добросовестному освоению" ) | |
syncOrder . reason . Contains ( "за невыполнение обязанностей по добросовестному освоению" ) )
{
info = $"Отчисление студента {student} из группы {studentGroupFrom} за неуспеваемость" ;
return OrderStudentMoveType . О т ч и с л и т ь З а Н е у с п е в а м о с т ь ;
}
if ( syncOrder . reason . Contains ( "по собственному желанию" ) )
{
info = $"Отчисление студента {student} из группы {studentGroupFrom} по собственному желанию" ;
return OrderStudentMoveType . О т ч и с л и т ь П о С о б с т в е н н о м у ;
}
if ( syncOrder . reason . Contains ( "в связи с невыходом из академического отпуска" ) )
2022-03-29 13:33:32 +04:00
{
2022-12-16 17:43:23 +04:00
info = $"Отчисление студента {student} из группы {studentGroupFrom} в связи с невыходм из академического отпуска" ;
return OrderStudentMoveType . О т ч и с л и т ь З а Н е в ы х о д С А к а д е м а ;
}
if ( syncOrder . reason . Contains ( "в связи с переводом в" ) )
{
info = $"Отчисление студента {student} из группы {studentGroupFrom} в связи с переводом" ;
return OrderStudentMoveType . О т ч и с л и т ь В С в я з и С П е р е в о д о м ;
2022-03-29 13:33:32 +04:00
}
2022-12-16 17:43:23 +04:00
if ( syncOrder . reason . Contains ( "за невыполнение условий договора" ) )
{
info = $"Отчисление студента {student} из группы {studentGroupFrom} в связи с не оплатой обучения" ;
return OrderStudentMoveType . О т ч и с л и т ь З а Н е о п л а т у ;
}
info = string . Empty ;
return OrderStudentMoveType . Н е о п р е д е л е н о ;
2022-03-29 13:33:32 +04:00
case "Восстановление" :
info = $"Восстановление отчисленного студента {student} в группу {studentGroupTo}" ;
return OrderStudentMoveType . В о с с т а н о в и т ь ;
case "Выпуск" :
info = $"Завершение обучения студента {student}" ;
return OrderStudentMoveType . О т ч и с л и т ь П о З а в е р ш е н и ю ;
default :
info = string . Empty ;
return OrderStudentMoveType . Н е о п р е д е л е н о ;
2022-03-18 20:09:15 +04:00
}
2022-03-29 13:33:32 +04:00
}
2022-03-18 20:09:15 +04:00
2022-12-16 17:43:23 +04:00
/// <summary>
/// Сохранение лога с ошибками
/// </summary>
/// <param name="errors"></param>
/// <param name="title"></param>
/// <param name="message"></param>
2022-03-29 13:33:32 +04:00
private void SaveErrors ( List < ( string Title , string Message ) > errors , string title , string message )
{
if ( _history = = null )
2022-03-18 20:09:15 +04:00
{
2022-03-29 13:33:32 +04:00
return ;
2022-03-18 20:09:15 +04:00
}
2022-03-29 13:33:32 +04:00
Errors = errors ? ? new List < ( string Title , string Message ) > ( ) ;
Errors . Add ( ( title , message ) ) ;
SaveLog ( string . Join ( Environment . NewLine , Errors . Select ( x = > x . Message ) ) ) ;
2022-03-18 20:09:15 +04:00
}
2022-12-16 17:43:23 +04:00
/// <summary>
/// Сохранение лога
/// </summary>
/// <param name="info"></param>
2022-03-29 13:33:32 +04:00
private void SaveLog ( string info )
2022-03-18 10:22:34 +04:00
{
2022-03-29 13:33:32 +04:00
_recordLogic . Create ( new OrderSyncHistoryRecordSetBindingModel
{
OrderSyncHistoryId = _history . Id ,
Information = info
} ) ;
}
2022-03-18 10:22:34 +04:00
}
2021-04-27 15:14:35 +04:00
}