Синхронизация студентов
This commit is contained in:
parent
5694e531b6
commit
61a84b6b68
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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.Неопределено,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -7,36 +7,84 @@
|
|||||||
{
|
{
|
||||||
Неопределено = -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
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,5 +12,9 @@
|
|||||||
РаспределениеСтудентов = 1,
|
РаспределениеСтудентов = 1,
|
||||||
|
|
||||||
ДвижениеСтудентов = 2,
|
ДвижениеСтудентов = 2,
|
||||||
|
|
||||||
|
Перевод = 3,
|
||||||
|
|
||||||
|
Отчисление = 4
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user