Реализация и тесты Geo модуля
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
using Nashel.BuildingBlocks.Domain;
|
||||
using Nashel.Modules.Geo.Domain.Enums;
|
||||
using NetTopologySuite.Geometries;
|
||||
|
||||
namespace Nashel.Modules.Geo.Domain.Aggregates;
|
||||
|
||||
/// <summary>
|
||||
/// Агрегат, хранящий текущее статус и локацию исполнителя.
|
||||
/// </summary>
|
||||
public class LiveStatus : AggregateRoot<Guid>
|
||||
{
|
||||
private LiveStatus() { } // EF Core
|
||||
|
||||
/// <summary>
|
||||
/// Создает новый статус.
|
||||
/// </summary>
|
||||
/// <param name="performerId">ID исполнителя.</param>
|
||||
/// <param name="latitude">Широта (Lat).</param>
|
||||
/// <param name="longitude">Долгота (Lon).</param>
|
||||
public LiveStatus(Guid performerId, double latitude, double longitude)
|
||||
{
|
||||
Id = performerId;
|
||||
Location = new Point(longitude, latitude) { SRID = 4326 };
|
||||
Status = PerformerStatus.Available;
|
||||
LastUpdated = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Геопозиция исполнителя. SRID 4326 (WGS 84).
|
||||
/// </summary>
|
||||
public Point Location { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Статус доступности.
|
||||
/// </summary>
|
||||
public PerformerStatus Status { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Время, до которого исполнитель занят (UTC).
|
||||
/// </summary>
|
||||
public DateTime? BusyUntil { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Время последнего обновления (UTC).
|
||||
/// </summary>
|
||||
public DateTime LastUpdated { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Обновляет координаты.
|
||||
/// </summary>
|
||||
/// <param name="lat">Широта.</param>
|
||||
/// <param name="lon">Долгота.</param>
|
||||
public void UpdateLocation(double lat, double lon)
|
||||
{
|
||||
Location = new Point(lon, lat) { SRID = 4326 };
|
||||
LastUpdated = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Устанавливает статус "Занят" до указанного времени.
|
||||
/// </summary>
|
||||
public void SetBusy(DateTime until)
|
||||
{
|
||||
Status = PerformerStatus.Busy;
|
||||
BusyUntil = until;
|
||||
LastUpdated = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Переводит в статус "Доступен".
|
||||
/// </summary>
|
||||
public void GoOnline()
|
||||
{
|
||||
Status = PerformerStatus.Available;
|
||||
BusyUntil = null;
|
||||
LastUpdated = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Переводит в статус "Выходной" (офлайн).
|
||||
/// </summary>
|
||||
public void GoOffline()
|
||||
{
|
||||
Status = PerformerStatus.DayOff;
|
||||
BusyUntil = null;
|
||||
LastUpdated = DateTime.UtcNow;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user