using DepartmentBusinessLogic.BindingModels; using DepartmentBusinessLogic.Enums; using DepartmentBusinessLogic.HelperModels; using DepartmentBusinessLogic.Interfaces; using DepartmentBusinessLogic.ViewModels; using ModuleTools.BusinessLogics; using ModuleTools.Enums; using ModuleTools.Extensions; using SecurityBusinessLogic.BindingModels; using SecurityBusinessLogic.BusinessLogics; 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; using System.Threading.Tasks; namespace DepartmentBusinessLogic.BusinessLogics { /// /// Логика работы с историями синхронизации приказов /// public class OrderSyncHistoryBusinessLogic : GenericBusinessLogic { public OrderSyncHistoryBusinessLogic(IOrderSyncHistoryService service) : base(service, "Синхронизация Приказов", AccessOperation.СинхронизацияПриказов) { } public async Task SyncOrders() { var history = await CreateAsync(new OrderSyncHistorySetBindingModel { SyncDate = DateTime.Now }); if (history == null) { Errors.Add(("Ошибка создание истории", "Не удалось создать историю")); return false; } var recordLogic = DependencyManager.Instance.Resolve(); var enviromentSettingLogic = DependencyManager.Instance.Resolve(); var address = (await enviromentSettingLogic.GetListAsync(new EnviromentSettingGetBindingModel { Key = "SyncStudentOrderIpAddress" }))?.List?.FirstOrDefault(); if (address == null || address.Value.IsEmpty()) { Errors = enviromentSettingLogic.Errors; Errors.Add(("Ошибка получения данных", "Не удалось получить адрес серверая для получения приказов по студентам")); await recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel { OrderSyncHistoryId = history.Id, Information = string.Join(Environment.NewLine, Errors.Select(x => x.Message)) }); return false; } var username = (await enviromentSettingLogic.GetListAsync(new EnviromentSettingGetBindingModel { Key = "SyncStudentOrderUserName" }))?.List?.FirstOrDefault(); if (username == null || username.Value.IsEmpty()) { Errors = enviromentSettingLogic.Errors; Errors.Add(("Ошибка получения данных", "Не удалось получить имя пользователя для получения приказов по студентам")); await recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel { OrderSyncHistoryId = history.Id, Information = string.Join(Environment.NewLine, Errors.Select(x => x.Message)) }); return false; } var password = (await enviromentSettingLogic.GetListAsync(new EnviromentSettingGetBindingModel { Key = "SyncStudentOrderPassword" }))?.List?.FirstOrDefault(); if (password == null || password.Value.IsEmpty()) { Errors = enviromentSettingLogic.Errors; Errors.Add(("Ошибка получения данных", "Не удалось получить пароль для получения приказов по студентам")); await recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel { OrderSyncHistoryId = history.Id, Information = string.Join(Environment.NewLine, Errors.Select(x => x.Message)) }); return false; } 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}"))); // авторизация // получение списка студентов HttpResponseMessage response = await client.GetAsync($"{address.Value}/univer_Testing/hs/Ulstu_StudentsInfo/v1/GetCurrentStudentsOfDepartment"); if (!response.IsSuccessStatusCode) { Errors.Add(("Ошибка получения данных", "Не удалось получить список студентов с сервера")); await recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel { OrderSyncHistoryId = history.Id, Information = string.Join(Environment.NewLine, Errors.Select(x => x.Message)) }); return false; } var studentFromServer = JsonSerializer.Deserialize(response.Content.ReadAsStringAsync().Result); if (studentFromServer.CurrentStudentsList.Count == 0) { await recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel { OrderSyncHistoryId = history.Id, Information = "Полученный список студентов пустой" }); return true; } var groupsLogic = DependencyManager.Instance.Resolve(); var groups = await groupsLogic.GetListAsync(new StudentGroupGetBindingModel()); if (groups == null || groups.List == null) { Errors = groupsLogic.Errors; Errors.Add(("Ошибка получения данных", "Не удалось получить список групп")); await recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel { OrderSyncHistoryId = history.Id, Information = string.Join(Environment.NewLine, Errors.Select(x => x.Message)) }); return false; } var studentLogic = DependencyManager.Instance.Resolve(); var userLogic = DependencyManager.Instance.Resolve(); foreach (var group in groups.List) { var students = await studentLogic.GetListAsync(new StudentGetBindingModel { StudentGroupId = group.Id }); foreach (var student in students.List) { var studentSync = studentFromServer.CurrentStudentsList.FirstOrDefault(x => x.recordBookName == student.NumberOfBook); // студент не найден, значит он ушел с кафедры, выясняем почему if (studentSync == null) { await SyncStudentOrders(history, student, client, address.Value, studentSync.iduniv); } // перевод в другую группу else if (group.GroupName != studentSync.groupName) { await SyncStudentOrders(history, student, client, address.Value, studentSync.iduniv); } studentFromServer.CurrentStudentsList.Remove(studentSync); } // новые студенты в группе var studentSyncs = studentFromServer.CurrentStudentsList.Where(x => x.groupName == group.GroupName); foreach (var student in studentSyncs) { 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 }); var newuser = await userLogic.CreateAsync(new UserSetBindingModel { Login = userName, Password = student.recordBookName }); if (newuser == 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; } var newStudent = await studentLogic.CreateAsync(new StudentSetBindingModel { UserId = newuser.Id, FirstName = student.firstName, LastName = student.lastName, Patronymic = student.patronymicName, NumberOfBook = student.recordBookName, StudentGroupId = group.Id, StudentState = GetStudentState(student.stateName), Description = student.presenatationOfRecordBook }); if (newStudent == 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; } await recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel { OrderSyncHistoryId = history.Id, Information = $"Добавлен студент {newStudent}" }); await SyncStudentOrders(history, newStudent, client, address.Value, student.iduniv); studentFromServer.CurrentStudentsList.Remove(student); } } return true; } private static StudentState GetStudentState(string state) => state switch { "Является студентом" => StudentState.Учится, "Находится в академическом отпуске" => StudentState.Академ, _ => StudentState.Неопределен, }; /// /// Синхронизация приказов по студенту /// /// /// /// /// /// /// private async Task SyncStudentOrders(OrderSyncHistoryViewModel history, StudentViewModel student, HttpClient client, string address, string iduniv) { var recordLogic = DependencyManager.Instance.Resolve(); var orderLogic = DependencyManager.Instance.Resolve(); HttpResponseMessage response = await client.GetAsync($"{address}/univer_Testing/hs/Ulstu_StudentsInfo/v1/GetStudentOrdersByIdAndRecordBook?iduniv={iduniv}&recordBookName={student.NumberOfBook}&allOrders=sppd"); if (!response.IsSuccessStatusCode) { Errors.Add(("Ошибка получения данных", "Не удалось получить список приказов по студенту")); await recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel { OrderSyncHistoryId = history.Id, Information = string.Join(Environment.NewLine, Errors.Select(x => x.Message)) }); return; } var syncOrders = JsonSerializer.Deserialize(response.Content.ReadAsStringAsync().Result); foreach(var syncOrder in syncOrders.StudentOrders) { var orderType = GetOrderType(syncOrder.orderSubTypeName); if (orderType != OrderType.Неопределено) { var order = await orderLogic.GetListAsync(new OrderGetBindingModel { OrderNumber = syncOrder.clericNumber, OrderDate = Convert.ToDateTime(syncOrder.clericDate) }); } } } private static OrderType GetOrderType(string orderTitle) => orderTitle switch { "Зачисление в вуз" => OrderType.ЗачислениеСтудентов, "Распределение по группам" => OrderType.РаспределениеСтудентов, "Перевод на следующий курс" => OrderType.ДвижениеСтудентов, _ => OrderType.Неопределено, }; } }