Exemplo n.º 1
0
        public void RegisterForRouteList(int routeListId, IEnumerable <TrackCoordinateDto> trackList, int driverId)
        {
            var track = _trackRepository.GetTrackByRouteListId(_unitOfWork, routeListId);

            var routeList = _routeListRepository.GetRouteListById(_unitOfWork, routeListId)
                            ?? throw new DataNotFoundException(nameof(routeListId), $"Маршрутный лист {routeListId} не найден");

            if (routeList.Status != RouteListStatus.EnRoute &&
                routeList.Status != RouteListStatus.Delivered)
            {
                _logger.LogWarning($"Попытка записать трек для МЛ {routeListId}, МЛ в статусе '{routeList.Status}'");
                throw new InvalidOperationException($"Нельзя записать трек для МЛ {routeListId}, МЛ в статусе недоступном для записи трека");
            }

            if (!_routeListModel.IsRouteListBelongToDriver(routeListId, driverId))
            {
                _logger.LogWarning($"Водитель ({driverId})" +
                                   $" попытался зарегистрировать трек для МЛ {routeListId}");
                throw new InvalidOperationException("Нельзя регистрировать координаты трека к чужому МЛ");
            }

            if (track == null)
            {
                track = new Track()
                {
                    RouteList = routeList,
                    Driver    = routeList.Driver
                };
            }

            var receivedPoints = new Dictionary <DateTime, TrackPoint>();

            foreach (var trackCoordinate in trackList)
            {
                if (track.TrackPoints.Any(t => t.TimeStamp == trackCoordinate.ActionTime))
                {
                    _logger.LogInformation($"Уже зарегистрирована точка для времени {trackCoordinate.ActionTime}");
                    continue;
                }

                var trackPoint = new TrackPoint()
                {
                    Track     = track,
                    Latitude  = decimal.ToDouble(trackCoordinate.Latitude),
                    Longitude = decimal.ToDouble(trackCoordinate.Longitude),
                    TimeStamp = trackCoordinate.ActionTime
                };

                track.TrackPoints.Add(trackPoint);
            }

            _unitOfWork.Save(track);
            _unitOfWork.Commit();
        }
Exemplo n.º 2
0
        public void RegisterForRouteList(int routeListId, IList <TrackCoordinateDto> trackList, int driverId)
        {
            var track = _trackRepository.GetTrackByRouteListId(_unitOfWork, routeListId);

            var routeList = _routeListRepository.GetRouteListById(_unitOfWork, routeListId)
                            ?? throw new DataNotFoundException(nameof(routeListId), $"Маршрутный лист {routeListId} не найден");

            if (routeList.Status != RouteListStatus.EnRoute &&
                routeList.Status != RouteListStatus.Delivered)
            {
                _logger.LogWarning($"Попытка записать трек для МЛ {routeListId}, МЛ в статусе '{routeList.Status}'");
                throw new InvalidOperationException($"Нельзя записать трек для МЛ {routeListId}, МЛ в статусе недоступном для записи трека");
            }

            if (!_routeListModel.IsRouteListBelongToDriver(routeListId, driverId))
            {
                _logger.LogWarning($"Водитель ({driverId})" +
                                   $" попытался зарегистрировать трек для МЛ {routeListId}");
                throw new InvalidOperationException("Нельзя регистрировать координаты трека к чужому МЛ");
            }

            if (track == null)
            {
                track = new Track
                {
                    RouteList = routeList,
                    Driver    = routeList.Driver
                };
            }

            foreach (var trackPoint in trackList)
            {
                trackPoint.Latitude   = Math.Round(trackPoint.Latitude, 8);
                trackPoint.Longitude  = Math.Round(trackPoint.Longitude, 8);
                trackPoint.ActionTime = new DateTime(
                    trackPoint.ActionTime.Year,
                    trackPoint.ActionTime.Month,
                    trackPoint.ActionTime.Day,
                    trackPoint.ActionTime.Hour,
                    trackPoint.ActionTime.Minute,
                    trackPoint.ActionTime.Second,
                    trackPoint.ActionTime.Kind
                    );
            }

            var trackPoints = trackList
                              .GroupBy(x =>
                                       new
            {
                x.ActionTime,
                x.Latitude,
                x.Longitude
            })
                              .Select(group =>
                                      new TrackPoint
            {
                Track     = track,
                Latitude  = decimal.ToDouble(group.Key.Latitude),
                Longitude = decimal.ToDouble(group.Key.Longitude),
                TimeStamp = group.Key.ActionTime
            });

            foreach (var trackPoint in trackPoints)
            {
                if (track.TrackPoints.Any(t => t.TimeStamp == trackPoint.TimeStamp))
                {
                    _logger.LogInformation($"Уже зарегистрирована точка для времени {trackPoint.TimeStamp}");
                    continue;
                }

                track.TrackPoints.Add(trackPoint);
            }

            _unitOfWork.Save(track);
            _unitOfWork.Commit();
        }