Синхронизация студентов

This commit is contained in:
kotcheshir73 2021-04-29 18:10:30 +04:00
parent 5694e531b6
commit 61a84b6b68
5 changed files with 169 additions and 54 deletions

View File

@ -255,8 +255,19 @@ namespace DatabaseCore
/// <returns></returns> /// <returns></returns>
protected abstract IQueryable<T> IncludingWhenReading(IQueryable<T> query); protected abstract IQueryable<T> IncludingWhenReading(IQueryable<T> query);
/// <summary>
/// Дополнительыне проверки, если требуется получать единичную запись но не по id
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
protected virtual bool AdditionalCheckForSingleGet(G model) => false; protected virtual bool AdditionalCheckForSingleGet(G model) => false;
/// <summary>
/// Получение единичной записи но не по id
/// </summary>
/// <param name="list"></param>
/// <param name="model"></param>
/// <returns></returns>
protected virtual T GetSingleRecord(IQueryable<T> list, G model) => null; protected virtual T GetSingleRecord(IQueryable<T> list, G model) => null;
} }
} }

View File

@ -289,7 +289,7 @@ namespace DepartmentBusinessLogic.BusinessLogics
var syncOrders = JsonSerializer.Deserialize<StudentOrderListSyncModel>(response.Content.ReadAsStringAsync().Result); var syncOrders = JsonSerializer.Deserialize<StudentOrderListSyncModel>(response.Content.ReadAsStringAsync().Result);
foreach (var syncOrder in syncOrders.StudentOrders) foreach (var syncOrder in syncOrders.StudentOrders)
{ {
var orderType = GetOrderType(syncOrder.orderSubTypeName); var orderType = GetOrderType(syncOrder.orderTypeName);
// пропускаем приказы, которые нас не интересуют // пропускаем приказы, которые нас не интересуют
if (orderType == OrderType.Неопределено) if (orderType == OrderType.Неопределено)
@ -335,6 +335,11 @@ namespace DepartmentBusinessLogic.BusinessLogics
// если такой приказ по студенту уже есть, просто пропускаем // если такой приказ по студенту уже есть, просто пропускаем
if (studentOrder != null) if (studentOrder != null)
{ {
await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel
{
OrderSyncHistoryId = history.Id,
Information = $"Нерспознанный приказ {syncOrder.orderTypeName} для студента {student}"
});
continue; continue;
} }
@ -349,7 +354,7 @@ namespace DepartmentBusinessLogic.BusinessLogics
{ {
studentGroupToId = groups.FirstOrDefault(x => x.ToString() == syncOrder.groupNameAfter)?.Id; studentGroupToId = groups.FirstOrDefault(x => x.ToString() == syncOrder.groupNameAfter)?.Id;
} }
// если был переведенец к нам, то игнорируем приказы, не связанные с нашими группами // игнорируем приказы, не связанные с нашими группами
if (!studentGroupFromId.HasValue && !studentGroupToId.HasValue) if (!studentGroupFromId.HasValue && !studentGroupToId.HasValue)
{ {
continue; continue;
@ -361,66 +366,80 @@ namespace DepartmentBusinessLogic.BusinessLogics
case "Перевод": case "Перевод":
if (syncOrder.orderSubTypeName == "Распределение по группам") if (syncOrder.orderSubTypeName == "Распределение по группам")
{ {
orderStudentMoveType = OrderStudentMoveType.Распределение; orderStudentMoveType = OrderStudentMoveType.Распределить;
info = $"Распределение студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}"; info = $"Распределение студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}";
} }
// внутренний перевод // внутренний перевод
else if (studentGroupFromId.HasValue && studentGroupToId.HasValue) else if (studentGroupFromId.HasValue && studentGroupToId.HasValue)
{ {
orderStudentMoveType = OrderStudentMoveType.ПереводВГруппу; orderStudentMoveType = OrderStudentMoveType.ПеревестиНаДругоеНаправлениеКафедры;
info = $"Перевод студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} в группу {groups.First(x => x.Id == studentGroupToId)}"; info = $"Перевод студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} в группу {groups.First(x => x.Id == studentGroupToId)}";
} }
else if (!studentGroupFromId.HasValue && studentGroupToId.HasValue) else if (!studentGroupFromId.HasValue && studentGroupToId.HasValue)
{ {
orderStudentMoveType = OrderStudentMoveType.ЗачислитьПоПереводу; orderStudentMoveType = OrderStudentMoveType.ПринятьПоПереводу;
info = $"Зачисление переовдом студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}"; info = $"Перевод студента {student} c группы {syncOrder.groupNameBefore} другой кафедры в группу {groups.First(x => x.Id == studentGroupToId)}";
} }
else if (studentGroupFromId.HasValue && !studentGroupToId.HasValue) else if (studentGroupFromId.HasValue && !studentGroupToId.HasValue)
{ {
orderStudentMoveType = OrderStudentMoveType.ОтчислитьВСвязиСПереводом; orderStudentMoveType = OrderStudentMoveType.УбратьПоПереводу;
info = $"Отчисление студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} в связи с переводом"; info = $"Перевод студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} на другую кафедру";
} }
break; break;
case "Зачисление в вуз вне приемной кампании": case "Зачисление в вуз вне приемной кампании":
orderStudentMoveType = OrderStudentMoveType.Зачисление; orderStudentMoveType = OrderStudentMoveType.ЗачислитьПоПриказу;
info = $"Зачисление студента {student}"; info = $"Зачисление студента {student} по приказу";
break;
case "Зачисление в вуз":
orderStudentMoveType = OrderStudentMoveType.ЗачислитьПоПриказу;
info = $"Зачисление студента {student} по приказу";
break;
case "Перевод из другого вуза":
orderStudentMoveType = OrderStudentMoveType.ПринятьПоПереводусДругогоВуза;
info = $"Перевод студента {student} с другого вуза";
break; break;
case "Перевод на следующий курс": case "Перевод на следующий курс":
orderStudentMoveType = OrderStudentMoveType.ПереводНаКурс; orderStudentMoveType = OrderStudentMoveType.ПеревестиНаСтаршийКурс;
info = $"Перевод студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} на следующий курс в группу {groups.First(x => x.Id == studentGroupToId)}"; info = $"Перевод студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)} на следующий курс в группу {groups.First(x => x.Id == studentGroupToId)}";
break; break;
//case "Завершение обучения": // уточнить приказ
// orderStudentMoveType = OrderStudentMoveType.ОтчислитьПоСобственному;
// info = $"Отчисление студента {student} в связи с окончанием обучения";
// break;
case "Уход в академический отпуск": case "Уход в академический отпуск":
orderStudentMoveType = OrderStudentMoveType.ВАкадем; // дата
orderStudentMoveType = OrderStudentMoveType.ОтправитьВАкадем;
info = $"Уход в АО студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)}"; info = $"Уход в АО студента {student} из группы {groups.First(x => x.Id == studentGroupFromId)}";
break; break;
case "Продление академического отпуска": case "Продление академического отпуска":
orderStudentMoveType = OrderStudentMoveType.ПродлАкадем; orderStudentMoveType = OrderStudentMoveType.ПродлитьАкадем;
info = $"Продление АО студента {student}"; info = $"Продление АО студента {student}";
break; break;
case "Восстановление из академического отпуска": case "Восстановление из академического отпуска":
orderStudentMoveType = OrderStudentMoveType.ИзАкадема; orderStudentMoveType = OrderStudentMoveType.ВосстановитьИзАкадема;
info = $"Выход из АО студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}"; info = $"Выход из АО студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}";
break; break;
case "Восстановление": // уточнить приказ //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 "Отчисление":
{
}
break;
case "Восстановление":
orderStudentMoveType = OrderStudentMoveType.Восстановить; orderStudentMoveType = OrderStudentMoveType.Восстановить;
info = $"Восстановление отчисленного студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}"; info = $"Восстановление отчисленного студента {student} в группу {groups.First(x => x.Id == studentGroupToId)}";
break; 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.Неопределено) if (orderStudentMoveType == OrderStudentMoveType.Неопределено)
@ -474,8 +493,9 @@ namespace DepartmentBusinessLogic.BusinessLogics
}); });
} }
if ((orderStudentMoveType == OrderStudentMoveType.Зачисление || orderStudentMoveType == OrderStudentMoveType.ЗачислитьПоПереводу if ((orderStudentMoveType == OrderStudentMoveType.ЗачислитьПоПриказу || orderStudentMoveType == OrderStudentMoveType.ПринятьПоПереводу
|| orderStudentMoveType == OrderStudentMoveType.ПереводВГруппу) && student.StudentState != StudentState.Учится) || orderStudentMoveType == OrderStudentMoveType.ПринятьПоПереводусДругогоВуза || orderStudentMoveType == OrderStudentMoveType.ПеревестиНаДругоеНаправлениеКафедры)
&& student.StudentState != StudentState.Учится)
{ {
st.StudentState = StudentState.Учится; st.StudentState = StudentState.Учится;
student = await _studentLogic.UpdateAsync(st); student = await _studentLogic.UpdateAsync(st);
@ -497,7 +517,7 @@ namespace DepartmentBusinessLogic.BusinessLogics
}); });
} }
if ((orderStudentMoveType == OrderStudentMoveType.ВАкадем || orderStudentMoveType == OrderStudentMoveType.ПродлАкадем) if ((orderStudentMoveType == OrderStudentMoveType.ОтправитьВАкадем || orderStudentMoveType == OrderStudentMoveType.ПродлитьАкадем)
&& student.StudentState != StudentState.Академ) && student.StudentState != StudentState.Академ)
{ {
st.StudentState = StudentState.Академ; st.StudentState = StudentState.Академ;
@ -520,7 +540,7 @@ namespace DepartmentBusinessLogic.BusinessLogics
}); });
} }
if (orderStudentMoveType == OrderStudentMoveType.ИзАкадема && student.StudentState != StudentState.Учится) if (orderStudentMoveType == OrderStudentMoveType.ВосстановитьИзАкадема && student.StudentState != StudentState.Учится)
{ {
st.StudentState = StudentState.Учится; st.StudentState = StudentState.Учится;
student = await _studentLogic.UpdateAsync(st); student = await _studentLogic.UpdateAsync(st);
@ -612,6 +632,28 @@ namespace DepartmentBusinessLogic.BusinessLogics
}); });
} }
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 await _recordLogic.CreateAsync(new OrderSyncHistoryRecordSetBindingModel
{ {
OrderSyncHistoryId = history.Id, OrderSyncHistoryId = history.Id,
@ -631,9 +673,17 @@ namespace DepartmentBusinessLogic.BusinessLogics
private static OrderType GetOrderType(string orderTitle) => orderTitle switch private static OrderType GetOrderType(string orderTitle) => orderTitle switch
{ {
"Зачисление в вуз вне приемной кампании" => OrderType.ЗачислениеСтудентов,
"Зачисление в вуз" => OrderType.ЗачислениеСтудентов, "Зачисление в вуз" => OrderType.ЗачислениеСтудентов,
"Распределение по группам" => OrderType.РаспределениеСтудентов, "Перевод из другого вуза" => OrderType.ЗачислениеСтудентов,
"Перевод" => OrderType.Перевод,
"Перевод на следующий курс" => OrderType.ДвижениеСтудентов, "Перевод на следующий курс" => OrderType.ДвижениеСтудентов,
"Завершение обучения" => OrderType.Отчисление,
"Уход в академический отпуск" => OrderType.ДвижениеСтудентов,
"Продление академического отпуска" => OrderType.ДвижениеСтудентов,
"Восстановление из академического отпуска" => OrderType.ДвижениеСтудентов,
"Отчисление" => OrderType.Отчисление,
"Восстановление" => OrderType.Перевод,
_ => OrderType.Неопределено, _ => OrderType.Неопределено,
}; };
} }

View File

@ -5,38 +5,86 @@
/// </summary> /// </summary>
public enum OrderStudentMoveType public enum OrderStudentMoveType
{ {
Неопределено = -1, Неопределено = -1,
Зачисление = 0, /// <summary>
/// Студент зачисляется сразу на направление кафедры
/// </summary>
ЗачислитьПоПриказу = 0,
Распределение = 1, /// <summary>
/// Распределение студента в группу
/// </summary>
Распределить = 1,
ПереводНаКурс = 3, /// <summary>
/// Перевод на старший курс
/// </summary>
ПеревестиНаСтаршийКурс = 2,
ПереводВГруппу = 4, /// <summary>
/// Отчисление студента в связи с завершением обучения
/// </summary>
ОтчислитьПоЗавершению = 3,
Движение = 2, /// <summary>
/// Студент переводится с другой кафедры на нашу
/// </summary>
ПринятьПоПереводу = 5,
ИзАкадема = 5, /// <summary>
/// Студент переводится с другого вуза на нашу кафедру
/// </summary>
ПринятьПоПереводусДругогоВуза = 6,
ВАкадем = 6, /// <summary>
/// Переход с одного направления кафедоры на другое
/// </summary>
ПеревестиНаДругоеНаправлениеКафедры = 7,
ПродлАкадем = 13, /// <summary>
/// Студент переводится с нашей кафедры на другую
/// </summary>
УбратьПоПереводу = 8,
ОтчислитьЗаНеуспевамость = 7, /// <summary>
/// Уход в акакдем студента
/// </summary>
ОтправитьВАкадем = 10,
ОтчислитьВСвязиСПереводом = 8, /// <summary>
/// Продление академа студента
/// </summary>
ПродлитьАкадем = 11,
ОтчислитьПоСобственному = 9, /// <summary>
/// Выход из академа студента
/// </summary>
ВосстановитьИзАкадема = 12,
ЗачислитьПоПереводу = 10, /// <summary>
/// Отчисление студента в связи с не выходом из академа
/// </summary>
ОтчислитьЗаНевыходСАкадема = 13,
Восстановить = 11, /// <summary>
/// Уход студента в другой ВУЗ
/// </summary>
ОтчислитьВСвязиСПереводом = 20,
ОтчислитьПоЗавершению = 12, /// <summary>
/// Отчисление студента за долги
/// </summary>
ОтчислитьЗаНеуспевамость = 21,
ОтчислитьЗаНевыходСАкадема = 14, /// <summary>
/// Отчисление студента по собственному
/// </summary>
ОтчислитьПоСобственному = 22,
Перевод = 15 /// <summary>
/// Восстановление студента после отчисления по собственному
/// </summary>
Восстановить = 23
} }
} }

View File

@ -12,5 +12,9 @@
РаспределениеСтудентов = 1, РаспределениеСтудентов = 1,
ДвижениеСтудентов = 2, ДвижениеСтудентов = 2,
Перевод = 3,
Отчисление = 4
} }
} }

View File

@ -5,6 +5,8 @@
/// </summary> /// </summary>
public enum StudentState public enum StudentState
{ {
Неопределен = -1,
Учится = 0, Учится = 0,
Академ = 1, Академ = 1,
@ -13,6 +15,6 @@
Отчислен = 3, Отчислен = 3,
Неопределен = -1 Ушел = 4
} }
} }