Files
nashel-backend/src/Modules/Geo/Domain/Aggregates/LiveStatus.cs
2026-02-10 21:51:02 +03:00

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;
}
}