89 lines
2.6 KiB
C#
89 lines
2.6 KiB
C#
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;
|
|
}
|
|
}
|