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