示例#1
0
        public async Task <JsonResult> Add([FromBody] Stantion input)
        {
            await CheckPermission();

            if (string.IsNullOrEmpty(input.Description) || string.IsNullOrEmpty(input.Name) || string.IsNullOrEmpty(input.StantionType.ToString()))
            {
                throw new Exception("Some input parameters NULL");
            }
            var sqlr = new StantionsRepository(_logger);

            try
            {
                if (input.Id != 0)
                {
                    await sqlr.Update(input);
                }
                else
                {
                    await sqlr.Add(input);
                }
                return(Json(new { message = "addOrUpdate OK" }));
            }
            catch (Exception e)
            {
                throw new Exception($"Can't add or update {this.GetType().ToString()} ex = {e}");
            }
        }
        /// <summary>
        /// Справочник станций
        /// </summary>
        private static async Task <ReportResponse> GetStationsTable(ReportRequest input, ILogger logger)
        {
            var sqlR   = new StantionsRepository(logger);
            var result = new ReportResponse {
                Rows = new List <Row>()
            };

            var data = await sqlR.GetAll();

            result.Columns = new List <Column>
            {
                new Column("col0", "Название", "string", disableEdit: false),
                new Column("col1", "Тип", "string", disableEdit: false)
            };

            foreach (var item in data)
            {
                var row = new Row
                {
                    Id       = new RowId(item.Id, 1),
                    HasItems = false.ToString(),
                    ParentId = null,
                    //Состав
                    Col0 = item.Name,
                    //Тип
                    Col1 = GetStringStationType(item.StantionType)
                };

                result.Rows.Add(row);
            }

            return(result);
        }
        public async Task <TripOnRouteWithStationsDto> TripWithStationsByRouteIdAndTripId(int routeId, int tripId)
        {
            var sqlRTripsOnRoute  = new TripsOnRouteRepository(_logger);
            var sqlRTrips         = new TripsRepository(_logger);
            var sqlRStationOnTrip = new StantionOnTripsRepository(_logger);
            var sqlRStation       = new StantionsRepository(_logger);
            var result            = new TripOnRouteWithStationsDto();

            var tripOnRoute = await sqlRTripsOnRoute.ByRouteIdAndTripId(routeId, tripId);

            if (tripOnRoute == null)
            {
                throw new ValidationException("Элемент не найден");
            }
            result.Id      = tripOnRoute.Id;
            result.RouteId = tripOnRoute.Id;
            result.TripId  = tripId;

            //result.TripWithDateTimeStations = new TripWithDateTimeStations();
            result.TripWithDateTimeStations = _mapper.Map <Trip, TripWithDateTimeStations>(await sqlRTrips.ById(tripId));
            var stations = await sqlRStationOnTrip.ByTripId(tripId);

            result.TripWithDateTimeStations.StantionOnTripsWithStringTime = new List <StationOnTripWithStringDateTime>();
            foreach (var stantion in stations)
            {
                var toAdd = _mapper.Map <StantionOnTrip, StationOnTripWithStringDateTime>(stantion);
                toAdd.InTimeString  = stantion.InTime.ToString("yyyy-MM-ddTHH:mm:ssZ");
                toAdd.OutTimeString = stantion.OutTime.ToString("yyyy-MM-ddTHH:mm:ssZ");
                toAdd.Stantion      = await sqlRStation.ById(toAdd.StantionId);

                result.TripWithDateTimeStations.StantionOnTripsWithStringTime.Add(toAdd);
            }

            return(result);
        }
示例#4
0
        public async Task <JsonResult> Delete([FromBody] Stantion stantion)
        {
            await CheckPermission();

            var cer = new StantionsRepository(_logger);
            await cer.Delete(stantion.Id);

            return(Json(new { message = "Delete OK" }));
        }
示例#5
0
        public async Task <JsonResult> GetDepot(int skip, int limit)
        {
            await CheckPermission();

            var sr     = new StantionsRepository(_logger);
            var result = await sr.GetDepot();


            return(Json(result));
        }
        private async Task <List <TimeLine> > TimelineFromTrips(List <TripWithTripOnRouteId> trips)
        {
            var sqlRStations = new StantionsRepository(_logger);
            var result       = new List <TimeLine>();

            if (trips.Count == 0)
            {
                return(result);
            }
            foreach (var trip in trips)
            {
                var toAdd = new TimeLine();
                if (trip.TripOnRouteId != 0)
                {
                    toAdd.TripOnRouteId = trip.TripOnRouteId;
                }
                var stationsOnTrips = trip.StantionOnTrips.ToList();
                stationsOnTrips = stationsOnTrips.OrderBy(e => e.UpdateDate).ToList();
                if (stationsOnTrips.Count > 1)
                {
                    var startStationOnTrip = stationsOnTrips.First();
                    var endStationOnTrip   = stationsOnTrips.Last();
                    var startStation       = await sqlRStations.ById(startStationOnTrip.StantionId);

                    var endStation = await sqlRStations.ById(endStationOnTrip.StantionId);

                    toAdd.AdditionalTimeLineData = new AdditionalTimeLineData
                    {
                        TripStartStationName      = startStation.Name,
                        TripStartStationShortName = startStation.ShortName,
                        TripEndStationName        = endStation.Name,
                        TripEndStationShortName   = startStation.ShortName
                    };
                    toAdd.StarTime = startStationOnTrip.OutTime; //.ToString("yyyy-MM-ddTHH:mm:ssZ");
                    toAdd.EndTime  = endStationOnTrip.InTime;    //.ToString("yyyy-MM-ddTHH:mm:ssZ");
                }
                else
                {
                    continue;
                }

                toAdd.Color = trip.TripType == TripType.Transfer
                                  ? ScheduleColors.ColorTransfer
                                  : ScheduleColors.ColorTrip;
                toAdd.EnumType = trip.TripType == TripType.Transfer
                                     ? TimelineTypeEnum.TimeRangeTripTransfer
                                     : TimelineTypeEnum.TimeRangeTrip;
                toAdd.Id          = trip.Id;
                toAdd.Description = trip.Name;
                result.Add(toAdd);
            }

            return(result);
        }
        /// <summary>
        /// Справочник Парковок
        /// </summary>
        private static async Task <ReportResponse> GetParkingsTable(ReportRequest input, ILogger logger)
        {
            var sqlR        = new ParkingRepository(logger);
            var sqlRStation = new StantionsRepository(logger);
            var result      = new ReportResponse {
                Rows = new List <Row>()
            };

            var data = await sqlR.GetAll();

            result.Columns = new List <Column>
            {
                new Column("col0", "Название", "string", disableEdit: false),
                new Column("col1", "Описание", "string", disableEdit: false),
                new Column("col2", "Станция", "string", disableEdit: false),
            };

            foreach (var item in data)
            {
                var station = await sqlRStation.ById(item.StantionId);

                var stations = await sqlRStation.GetAll();

                stations = stations.Where(x => x.Id != item.StantionId).ToList();
                var avaibleStations = new List <StantionSimple>();
                foreach (var x in stations)
                {
                    avaibleStations.Add(new StantionSimple {
                        StantionName = x.Name, StantionId = x.Id
                    });
                }

                var row = new Row
                {
                    Id       = new RowId(item.Id, 1),
                    HasItems = false.ToString(),
                    ParentId = null,
                    //Имя
                    Col0 = item.Name,
                    //Описание
                    Col1 = item.Description,
                    //Станция
                    Col2 = station.Name,
                    AdditionalProperty = new AdditionalProperty {
                        AvaibleStations = avaibleStations, StationId = item.StantionId
                    }
                };

                result.Rows.Add(row);
            }

            return(result);
        }
示例#8
0
        /// <summary>
        /// Данные по станкам
        /// </summary>
        private static async Task GetPlaneStationsData(RouteData result, List <PlaneStantionOnTrip> planeStations,
                                                       int tripId, ILogger logger)
        {
            var sqlRStations          = new StantionsRepository(logger);
            var sqlRTrips             = new TripsRepository(logger);
            var sqlRTrains            = new TrainRepository(logger);
            var sqlRChangedStantion   = new ChangePlaneStantionOnTripsRepository(logger);
            var sqlRPlanedRouteTrains = new PlanedRouteTrainsRepository(logger);

            var planedTripWithStation = new PlanedTripWithStations
            {
                TripName      = (await sqlRTrips.ById(tripId)).Name,
                PlaneStations = new List <PlanedStation>()
            };

            var currentTripPlaneStations = planeStations.Where(x => x.TripId == tripId);

            foreach (var currentTripPlaneStation in currentTripPlaneStations)
            {
                var changedStationData = await sqlRChangedStantion.ByPlaneStantionOnTripId(currentTripPlaneStation.Id);

                var toAdd = new PlanedStation
                {
                    PlanedStationId  = currentTripPlaneStation.Id,
                    StationName      = (await sqlRStations.ById(currentTripPlaneStation.StantionId)).Name,
                    InTime           = currentTripPlaneStation.InTime,
                    OutTime          = currentTripPlaneStation.OutTime,
                    ChangeStationsId = changedStationData?.Id,
                    ChangedInTime    = changedStationData?.InTime,
                    ChangedOutTime   = changedStationData?.OutTime,
                    ChangeDroped     = changedStationData?.Droped,
                    ChangeTrainId    = changedStationData?.TrainId
                };

                //TODO надо уточнить стоит ли так делать. Возвращать нулл если поезд нихуя непоменялся
                var planedRouteTrain = await sqlRPlanedRouteTrains.ById(currentTripPlaneStation.PlanedRouteTrainId);

                if (planedRouteTrain.TrainId == toAdd.ChangeTrainId)
                {
                    toAdd.ChangeTrainId = null;
                }

                if (toAdd.ChangeTrainId != null)
                {
                    toAdd.ChangeTranName = (await sqlRTrains.ById(toAdd.ChangeTrainId)).Name;
                }

                planedTripWithStation.PlaneStations.Add(toAdd);
            }

            result.PlaneRoute.TripsWithStations.Add(planedTripWithStation);
        }
示例#9
0
        public async Task <JsonResult> GetAll(int skip, int limit, string filter)
        {
            await CheckPermission();

            var sr     = new StantionsRepository(_logger);
            var result = new StantionsRepository.StantionPaging();

            if (filter != null)
            {
                result = await sr.GetAll(skip, limit, filter);
            }
            else
            {
                result = await sr.GetAll(skip, limit);
            }

            return(Json(result));
        }
        public async Task <DictionaryCrudResponse> StantionCrud(DictionaryCrudRequest input)
        {
            var data = input.Stantion;

            if (data == null && input.IdToDelete == null)
            {
                throw new ValidationException("Не распарсилось");
            }

            var sqlR = new StantionsRepository(_logger);

            if (input?.IdToDelete != null)
            {
                await sqlR.Delete((int)input.IdToDelete);

                return(new DictionaryCrudResponse {
                    IsDeleted = true, Stantion = data
                });
            }

            var all = await sqlR.GetAll();

            if (all.Any(x => x.Name.Equals(input.Stantion.Name)))
            {
                throw new ValidationException(Error.AlreadyAddWithThisName);
            }

            if (data?.Id == 0)
            {
                var item = await sqlR.Add(data);

                return(new DictionaryCrudResponse {
                    IsAdd = true, Stantion = item
                });
            }
            else
            {
                var item = await sqlR.Update(data);

                return(new DictionaryCrudResponse {
                    IsUpdated = true, Stantion = item
                });
            }
        }
示例#11
0
        /// <summary>
        /// Данные по ебучим юзерам меж станками
        /// </summary>
        private static async Task GetPlanedBrigadesData(int planedRouteTrainId, RouteData result, ILogger logger)
        {
            var sqlRPlanedStations       = new PlanedStationOnTripsRepository(logger);
            var sqlRUsers                = new UserRepository(logger);
            var sqlRStations             = new StantionsRepository(logger);
            var sqlRPlaneBrigadeTrains   = new PlaneBrigadeTrainsRepository(logger);
            var sqlRChangedBrigadeTrains = new ChangePlaneBrigadeTrainsRepository(logger);

            result.PlaneRoute.UserOnStations = new List <PlanedUserOnStations>();
            var planeBrigades = await sqlRPlaneBrigadeTrains.ByPlanedRouteTrainId(planedRouteTrainId);

            foreach (var planeBrigade in planeBrigades)
            {
                var stationStartId = (await sqlRPlanedStations.ById(planeBrigade.StantionStartId)).StantionId;
                var stationEndId   = (await sqlRPlanedStations.ById(planeBrigade.StantionEndId)).StantionId;

                var changedBrigadeData = await sqlRChangedBrigadeTrains.ByPlaneBrigadeTrainId(planeBrigade.Id);

                var toAdd =
                    new PlanedUserOnStations
                {
                    PlaneBrigadeTrainId  = planeBrigade.Id,
                    UserName             = (await sqlRUsers.ById(planeBrigade.UserId)).Name,
                    StationStartName     = (await sqlRStations.ById(stationStartId)).Name,
                    StationEndName       = (await sqlRStations.ById(stationEndId)).Name,
                    ChangeBrigadeTrainId = changedBrigadeData?.Id
                };

                if (changedBrigadeData != null)
                {
                    toAdd.ChangedUserName         = (await sqlRUsers.ById(planeBrigade.UserId)).Name;
                    toAdd.ChangedStationStartName = (await sqlRStations.ById(changedBrigadeData.StantionEndId)).Name;
                    toAdd.ChangedStationEndName   = (await sqlRStations.ById(changedBrigadeData.StantionStartId)).Name;
                }


                result.PlaneRoute.UserOnStations.Add(toAdd);
            }
        }
示例#12
0
        /// <summary>
        /// Бригады таблица
        /// </summary>
        private static async Task <ChangeTimeRangeBrigadeDto> GetBrigadeData(GetRouteInformationTableRequest input, ILogger logger)
        {
            var sqlRPlanedRouteTrains    = new PlanedRouteTrainsRepository(logger);
            var sqlRTrips                = new TripsRepository(logger);
            var sqlRPlanedStations       = new PlanedStationOnTripsRepository(logger);
            var sqlRUsers                = new UserRepository(logger);
            var sqlRStations             = new StantionsRepository(logger);
            var sqlRPlaneBrigadeTrains   = new PlaneBrigadeTrainsRepository(logger);
            var sqlRChangedBrigadeTrains = new ChangePlaneBrigadeTrainsRepository(logger);

            //var result = new ReportResponse { Rows = new List<Row>() };
            var stationsSimple = new List <StantionSimple>();

            //Берем всех юзерков
            var users = await sqlRUsers.GetAll();


            //Получим все станки с маршрута
            var planeStations = await sqlRPlanedStations.ByPlannedRouteTrainId(input.PlanedRouteTrainId);

            planeStations.OrderBy(x => x.InTime);

            var currentTripId = 0;

            for (var index = 0; index < planeStations.Count; index++)
            {
                var planeStation = planeStations[index];
                var trip         = await sqlRTrips.ById(planeStation.TripId);

                var station = await sqlRStations.ById(planeStation.StantionId);

                var qqStart = planeStation.InTime.ToStringTimeOnly();
                var qqEnd   = planeStation.OutTime.ToStringTimeOnly();

                if (currentTripId == 0 || planeStation.TripId != currentTripId)
                {
                    qqStart = "н/д";
                }
                if (index != planeStations.Count - 1)
                {
                    if (planeStations[index + 1].TripId != planeStation.TripId && currentTripId != 0)
                    {
                        qqEnd = "н/д";
                    }
                }
                else
                {
                    qqEnd = "н/д";
                }
                var qq1 = $"{station.Name} {qqStart}-{qqEnd} ({trip.Name})";
                stationsSimple.Add(new StantionSimple
                {
                    StantionId = planeStation.Id, StantionName = qq1, TripName = trip.Name, InTime = planeStation.InTime
                });
                currentTripId = planeStation.TripId;
            }

            var planeBrigades = await sqlRPlaneBrigadeTrains.ByPlanedRouteTrainId(input.PlanedRouteTrainId);

            planeBrigades = planeBrigades.Where(x => x.StantionStartId == input.EntityId).ToList();


            var result = new ChangeTimeRangeBrigadeDto
            {
                Users      = new List <ChangeTimeRangeUserDto>(),
                DataSource = new DataSource
                {
                    Stantions = stationsSimple
                                .OrderBy(x => x.TripName).ThenBy(y => y.InTime)
                                .Select(x => new DataSourceDto {
                        Value = x.StantionId, Text = x.StantionName
                    })
                                .ToList(),

                    Users = users
                            .OrderBy(x => x.Name)
                            .Select(x => new DataSourceDto {
                        Value = x.Id, Text = x.Name
                    })
                            .ToList()
                }
            };

            foreach (var planeBrigade in planeBrigades)
            {
                var changeBrigade = await sqlRChangedBrigadeTrains.ByPlaneBrigadeTrainId(planeBrigade.Id) ?? new ChangePlaneBrigadeTrain
                {
                    StantionEndId = 0, StantionStartId = 0, Droped = false, UserId = 0
                };

                var planeStartStation = await sqlRPlanedStations.ById(planeBrigade.StantionStartId);

                var planeEndStation = await sqlRPlanedStations.ById(planeBrigade.StantionEndId);

                var realStartStation = await sqlRStations.ById(planeStartStation.StantionId);

                var realEndStation = await sqlRStations.ById(planeEndStation.StantionId);

                var planedUser = await sqlRUsers.ById(planeBrigade.UserId);

                var toAdd = new ChangeTimeRangeUserDto
                {
                    StartId             = planeStartStation.Id,
                    EndId               = planeEndStation.Id,
                    UserId              = planedUser.Id,
                    User                = planedUser.Name,
                    Start               = realStartStation.Name,
                    End                 = realEndStation.Name,
                    PlaneBrigadeTrainId = planeBrigade.Id,
                    Canseled            = changeBrigade.Droped
                };

                if (changeBrigade.UserId != 0)
                {
                    toAdd.UserId = changeBrigade.UserId;
                }
                if (changeBrigade.StantionEndId != 0)
                {
                    toAdd.EndId = changeBrigade.StantionEndId;
                }
                if (changeBrigade.StantionStartId != 0)
                {
                    toAdd.StartId = changeBrigade.StantionStartId;
                }


                result.Users.Add(toAdd);
            }
            return(result);
        }
示例#13
0
        /// <summary>
        ///  Рейсы со станками таблица
        /// </summary>
        private static async Task <RouteInformationTableTrip> GetTripData(GetRouteInformationTableRequest input, ILogger logger)
        {
            var sqlRStations           = new StantionsRepository(logger);
            var sqlRTrips              = new TripsRepository(logger);
            var sqlRTrains             = new TrainRepository(logger);
            var sqlRChangedStation     = new ChangePlaneStantionOnTripsRepository(logger);
            var sqlRPlannedRouteTrains = new PlanedRouteTrainsRepository(logger);
            var sqlRPlannedStations    = new PlanedStationOnTripsRepository(logger);

            var result = new RouteInformationTableTrip
            {
                Stantions  = new List <RouteInformationTableStantion>(),
                DataSource = new DataSource()
            };

            var plannedRouteTrain = await sqlRPlannedRouteTrains.ById(input.PlanedRouteTrainId);

            var plannedStations = await sqlRPlannedStations.ByPlannedRouteTrainId(input.PlanedRouteTrainId);

            var tripId = plannedStations.Where(x => x.TripId == input.EntityId).Select(x => x.TripId).ToList();

            if (!tripId.Any())
            {
                return(result);
            }

            var trip = await sqlRTrips.ById(tripId.First());

            result.Trip = trip.Name;
            var currentTripPlaneStations = plannedStations.Where(x => x.TripId == trip.Id);

            foreach (var currentTripPlaneStation in currentTripPlaneStations)
            {
                var planTrain = await sqlRTrains.ById(plannedRouteTrain.TrainId);

                var changedStationData =
                    await sqlRChangedStation.ByPlaneStantionOnTripId(currentTripPlaneStation.Id);

                //String changedTrainName;
                //if (changedStationData?.TrainId != null)
                //    changedTrainName = (await sqlRTrains.ById(changedStationData.TrainId)).Name;

                var toAdd = new RouteInformationTableStantion
                {
                    Id                   = currentTripPlaneStation.Id,
                    Name                 = (await sqlRStations.ById(currentTripPlaneStation.StantionId)).Name,
                    Train                = planTrain.Name,
                    StartPlan            = currentTripPlaneStation.InTime.ToStringTimeOnly(),
                    EndPlan              = currentTripPlaneStation.OutTime.ToStringTimeOnly(),
                    TrainId              = planTrain.Id,
                    StartFact            = currentTripPlaneStation.InTime.ToFuckingGenaFormat(plannedRouteTrain.Date.Date),
                    EndFact              = currentTripPlaneStation.OutTime.ToFuckingGenaFormat(plannedRouteTrain.Date.Date),
                    Canceled             = false,
                    PlaneStationOnTripId = currentTripPlaneStation.Id
                };

                if (changedStationData != null)
                {
                    toAdd.StartFact = changedStationData.InTime.ToFuckingGenaFormat(plannedRouteTrain.Date.Date);
                    toAdd.EndFact   = changedStationData.OutTime.ToFuckingGenaFormat(plannedRouteTrain.Date.Date);
                    toAdd.Canceled  = changedStationData.Droped;
                    if (changedStationData.TrainId != null)
                    {
                        toAdd.TrainId = (int)changedStationData.TrainId;
                    }
                }
                result.Stantions.Add(toAdd);
            }

            var availableTrains = await GetAvaibleTrains(plannedRouteTrain.TrainId, logger);

            result.DataSource.Trains =
                availableTrains.Select(x => new DataSourceDto {
                Value = x.TrainId, Text = x.TrainName
            }).ToList();

            return(result);
        }
        private async Task <List <StantionQq> > GetStationsFromPlanedRouteByIdAndDay(int planedRouteTrainId, DateTime day,
                                                                                     int userId, int?inputStationId = 0)
        {
            var result              = new List <Stantion>();
            var sqlRStations        = new StantionsRepository(_logger);
            var sqlRPlanedStOnTrips = new PlanedStationOnTripsRepository(_logger);
            var sqlRTrip            = new TripsRepository(_logger);

            if (userId == 0)
            {
                throw new ValidationException(Error.NotFilledOptionalField);
            }

            PlaneStantionOnTrip inputSt = null;

            if (inputStationId != 0)
            {
                inputSt = await sqlRPlanedStOnTrips.ById(inputStationId.Value);
            }

            var currentDayPlaneBrigadeTrain = await sqlRPlanedStOnTrips.ByUserIdAndTimeRange(userId,
                                                                                             day.Date.AddHours(3), day.Date.AddDays(1).AddMilliseconds(-1));

            //busyPlanedSt = busyPlanedSt.Where(x => x.PlanedRouteTrainId != planedRouteTrainId).ToList();
            //var curPlanedRoute = await sqlPlanedBr.ByPlannedRouteTrainId(planedRouteTrainId);
            var currentPlanedRSt = await sqlRPlanedStOnTrips.ByPlannedRouteTrainId(planedRouteTrainId);

            currentPlanedRSt = currentPlanedRSt.OrderBy(x => x.OutTime).ToList();

            //var curPlanedRouteBr = await sqlPlanedBr.ByPlannedRouteTrainId(planedRouteTrainId);
            var usedPlaneSt = new List <PlaneStantionOnTrip>();

            if (currentPlanedRSt.Any())
            {
                foreach (var item in currentDayPlaneBrigadeTrain)
                {
                    //все станки маршрута, на который назначена данная запись
                    var planSts = (await sqlRPlanedStOnTrips.ByPlannedRouteTrainId(item.PlanedRouteTrainId))
                                  .OrderBy(x => x.OutTime).ToList();
                    var start = planSts.IndexOf(planSts.First(x => x.Id == item.StantionStartId)) + 1;
                    var end   = planSts.IndexOf(planSts.First(x => x.Id == item.StantionEndId)) + 1;
                    usedPlaneSt.AddRange(planSts.GetRange(start, end - start));
                }
            }

            usedPlaneSt = usedPlaneSt.DistinctBy(x => x.Id).ToList();
            DateTime?minUsedTime = null;
            DateTime?maxUsedTime = null;

            if (usedPlaneSt.Count > 1)
            {
                minUsedTime = usedPlaneSt.First().OutTime;
                maxUsedTime = usedPlaneSt.Last().InTime;
            }
            if (usedPlaneSt.Count == 1)
            {
                minUsedTime = usedPlaneSt.First().OutTime;
                maxUsedTime = usedPlaneSt.First().InTime;
            }

            if (minUsedTime != null && maxUsedTime != null)
            {
                if (inputSt != null)
                {
                    if (inputSt.OutTime <= minUsedTime)
                    {
                        maxUsedTime = ((DateTime)maxUsedTime).AddDays(1);
                    }
                    if (inputSt.OutTime >= maxUsedTime)
                    {
                        minUsedTime = ((DateTime)minUsedTime).AddDays(-1);
                    }
                }
            }

            var res1 = new List <StantionQq>();

            var currentTripId = 0;

            for (var index = 0; index < currentPlanedRSt.Count; index++)
            {
                var item = currentPlanedRSt[index];
                var trip = await sqlRTrip.ById(item.TripId);


                if (minUsedTime != null && maxUsedTime != null)
                {
                    if (item.InTime >= minUsedTime && item.InTime <= maxUsedTime)
                    {
                        continue;
                    }
                    if (item.OutTime >= minUsedTime && item.OutTime <= maxUsedTime)
                    {
                        continue;
                    }
                }

                //foreach (var x in usedPlaneSt)
                //{
                //    if (item.InTime >= x.InTime && item.InTime <= x.OutTime)
                //        isUsed = true;
                //    if (item.OutTime >= x.InTime && item.OutTime <= x.OutTime)
                //        isUsed = true;
                //}
                //if (isUsed)
                //    continue;
                var station = await sqlRStations.ById(item.StantionId);

                station.Id = item.Id;
                //station.Name += $" ({item.InTime.ToStringTimeOnly()})";
                var sqq = _mapper.Map <Stantion, StantionQq>(station);
                sqq.InTime   = item.InTime;
                sqq.TripName = trip.Name;

                var qqStart = item.InTime.ToStringTimeOnly();
                var qqEnd   = item.OutTime.ToStringTimeOnly();
                if (currentTripId == 0 || item.TripId != currentTripId)
                {
                    qqStart = "н/д";
                }
                if (index != currentPlanedRSt.Count - 1)
                {
                    if (currentPlanedRSt[index + 1].TripId != item.TripId && currentTripId != 0)
                    {
                        qqEnd = "н/д";
                    }
                }
                else
                {
                    qqEnd = "н/д";
                }

                var qq1 = $"{station.Name} {qqStart}-{qqEnd} ({trip.Name})";
                sqq.Name += $" ({qq1})";
                res1.Add(sqq);
                currentTripId = item.TripId;
                //result.Add(station);
            }

            return(res1);
        }
        public async Task <List <PlanedRouteTrainDto> > PlanedRouteTrainsTable(DateTime startTime, DateTime EndTime)
        {
            var sqlRPlanedRouteTrains    = new PlanedRouteTrainsRepository(_logger);
            var sqlRRoutes               = new RoutesRepository(_logger);
            var sqlRTrains               = new TrainRepository(_logger);
            var sqlRUsers                = new UserRepository(_logger);
            var sqlRDayOfROutes          = new DayOfRoutesRepoisitory(_logger);
            var sqlRStations             = new StantionsRepository(_logger);
            var sqlRPlaneStationsOnTrips = new PlanedStationOnTripsRepository(_logger);
            var sqlRPlaneBrigadeTrains   = new PlaneBrigadeTrainsRepository(_logger);
            var planedRouteTrains        = await sqlRPlanedRouteTrains.GetAll();

            planedRouteTrains = planedRouteTrains.Where(x => x.Date >= startTime && x.Date < EndTime).ToList();
            //var result = new List<PlanedRouteTrainDto>();

            var dictionary = new Dictionary <int, PlanedRouteTrainDto>();
            //var routeDictionary = planedRouteTrains.ToDictionary(e => e.RouteId);

            //Собственно надо набить словарик доступными роутами
            var routes = await sqlRRoutes.GetAll(0, Int32.MaxValue, null);

            routes.Data = routes.Data.Where(x => x.TurnoverId != null).ToList();

            foreach (var route in routes.Data)
            {
                var planedRouteTrainDto = new PlanedRouteTrainDto
                {
                    Route     = route,
                    RouteDays = new List <DayOfWeek>(),
                    DaysData  = new List <DayData>()
                };


                if (route.TurnoverId != null)
                {
                    var daysOfRoutes = await sqlRDayOfROutes.DaysByTurnoverId((int)route.TurnoverId);

                    var days = daysOfRoutes.Select(x => x.Day);
                    planedRouteTrainDto.RouteDays.AddRange(days);
                    var proccesDate = startTime;

                    while (proccesDate <= EndTime)
                    {
                        var currentDay = proccesDate.DayOfWeek;
                        if (days.Contains(currentDay))
                        {
                            planedRouteTrainDto.DaysData.Add(new DayData
                            {
                                Date = proccesDate.Date, DateString = proccesDate.Date.ToString()
                            });
                        }
                        proccesDate = proccesDate.AddDays(1);
                    }
                }

                if (dictionary.ContainsKey(route.Id))
                {
                    dictionary[route.Id].DaysData.AddRange(planedRouteTrainDto.DaysData);
                }
                else
                {
                    dictionary.Add(route.Id, planedRouteTrainDto);
                }
            }

            foreach (var planedRouteTrain in planedRouteTrains)
            {
                //достаем роут
                var route = await sqlRRoutes.ById(planedRouteTrain.RouteId);

                //var currentRouteItems = planedRouteTrains.Where(e => e.RouteId == route.Id);
                var planedRouteTrainDto = new PlanedRouteTrainDto
                {
                    Route    = route,
                    DaysData = new List <DayData>()
                };

                var toAdd = new DayData
                {
                    Train = await sqlRTrains.ById(planedRouteTrain.TrainId),
                    PlanedRouteTrainId = planedRouteTrain.Id,
                    Date = planedRouteTrain.Date
                };
                toAdd.DateString = toAdd.Date.ToString("yyyy-MM-ddTHH:mm:ssZ");
                var planeBrigadeTrains = await sqlRPlaneBrigadeTrains.ByPlanedRouteTrainId(planedRouteTrain.Id);

                toAdd.Users = new List <DaysUser>();
                foreach (var planeBrigadeTrain in planeBrigadeTrains)
                {
                    var user = await sqlRUsers.ById(planeBrigadeTrain.UserId);

                    var userToAdd = new DaysUser
                    {
                        UserId = user.Id, Name = user.Name, PlaneBrigadeTrainsId = planeBrigadeTrain.Id
                    };
                    userToAdd.UserStations = new UserStations();
                    var planedStationInput = await sqlRPlaneStationsOnTrips.ById(planeBrigadeTrain.StantionStartId);

                    userToAdd.UserStations.InputTime = planedStationInput.OutTime;
                    userToAdd.UserStations.InputName = (await sqlRStations.ById(planedStationInput.StantionId)).Name;

                    var planedStationOutput = await sqlRPlaneStationsOnTrips.ById(planeBrigadeTrain.StantionEndId);

                    userToAdd.UserStations.OutputTime = planedStationOutput.InTime;
                    userToAdd.UserStations.OutputName = (await sqlRStations.ById(planedStationOutput.StantionId)).Name;
                    //userToAdd.UserStations.InputName = (await sqlRStations.ById(planeBrigadeTrain.StantionStartId)).Name;
                    //userToAdd.UserStations.OutputName = (await sqlRStations.ById(planeBrigadeTrain.StantionEndId)).Name;
                    toAdd.Users.Add(userToAdd);
                }

                planedRouteTrainDto.DaysData.Add(toAdd);


                if (dictionary.ContainsKey(route.Id))
                {
                    //надо взять текущие деньки роута и проверить что такого еще нет. кстати если его нет надо нахуй послать, а если есть заменить.
                    var currentDays = dictionary[route.Id].DaysData;
                    var day         = currentDays.FirstOrDefault(x =>
                                                                 x.Date.Date.Equals(planedRouteTrainDto.DaysData.First().Date.Date));
                    if (day == null)
                    {
                        dictionary[route.Id].DaysData.AddRange(planedRouteTrainDto.DaysData);
                        continue;
                    }

                    //throw new ValidationException("На этот день нельзя добавить поезд");
                    var index = dictionary[route.Id].DaysData.IndexOf(day);
                    dictionary[route.Id].DaysData[index] = planedRouteTrainDto.DaysData.First();
                    //dictionary[route.Id].DaysData.AddRange(planedRouteTrainDto.DaysData);
                }
                else
                {
                    dictionary.Add(route.Id, planedRouteTrainDto);
                }
            }


            //var train = await sqlRTrains.ByIdWithStations(planedRouteTrain.TrainId);

            var result = new List <PlanedRouteTrainDto>();

            result.AddRange(dictionary.Values);

            return(result);
        }
        /*public async Task<DictionaryCrudResponse> ParkingCrud(DictionaryCrudRequest input)
         * {
         *  var data = input.Parking;
         *  if (data == null && input.IdToDelete == null)
         *      throw new ValidationException("Не распарсилось");
         *
         *  var sqlR = new ParkingRepository(_logger);
         *  if (input?.IdToDelete != null)
         *  {
         *      await sqlR.Delete((int)input.IdToDelete);
         *      return new DictionaryCrudResponse { IsDeleted = true, Parking = data };
         *  }
         *
         *  var all = await sqlR.GetAll();
         *  if (data?.Id == 0 &&
         *      all.Any(x => x.Name.Equals(input.Parking.Name)))
         *      throw new ValidationException(Error.AlreadyAddWithThisName);
         *
         *  if (data?.Id == 0)
         *  {
         *      var item = await sqlR.Add(data);
         *      return new DictionaryCrudResponse { IsAdd = true, Parking = item };
         *  }
         *  else
         *  {
         *      var item = await sqlR.Update(data);
         *      return new DictionaryCrudResponse { IsUpdated = true, Parking = item };
         *  }
         * }*/

        /// <summary>
        /// Справочник рейсов с днями
        /// </summary>
        private static async Task <ReportResponse> GetTripsWithDaysTable(ReportRequest input, ILogger logger)
        {
            var sqlR               = new TripsRepository(logger);
            var sqlRTripDays       = new DayOfTripsRepoisitory(logger);
            var sqlRStationOnTrips = new StantionOnTripsRepository(logger);
            var sqlRStations       = new StantionsRepository(logger);
            var result             = new ReportResponse {
                Rows = new List <Row>()
            };

            var data = await sqlR.GetAll();

            result.Columns = new List <Column>
            {
                new Column("col0", "Имя", "string", disableEdit: false),
                new Column("col1", "Дни", "string"),
                new Column("col2", "Время отправления", "string"),
                new Column("col3", "Время прибытия", "string")
            };

            foreach (var item in data)
            {
                var stantionOnTrips = await sqlRStationOnTrips.ByTripId(item.Id);

                DateTime?startTime  = null;
                DateTime?endTime    = null;
                var      days       = (await sqlRTripDays.DaysByTripId(item.Id)).Select(x => x.Day).ToList();
                string   stringDays = null;
                if (days.Any())
                {
                    foreach (var day in days)
                    {
                        if (stringDays == null)
                        {
                            stringDays = GetStringDayOfWeekShort(day);
                        }
                        else
                        {
                            stringDays = stringDays + ", " + GetStringDayOfWeekShort(day);
                        }
                    }
                }

                if (stantionOnTrips.Count >= 2)
                {
                    stantionOnTrips = stantionOnTrips.OrderBy(x => x.OutTime).ToList();
                    startTime       = stantionOnTrips.First().OutTime;
                    endTime         = stantionOnTrips.Last().InTime;
                }

                var row = new Row
                {
                    Id       = new RowId(item.Id, 1),
                    HasItems = false.ToString(),
                    ParentId = null,
                    //Имя
                    Col0 = item.Name,
                    //Дни
                    Col1 = stringDays,
                    //"Время отправления
                    Col2 = startTime?.ToStringTimeOnly(),
                    //Время прибытия
                    Col3 = endTime?.ToStringTimeOnly(),
                    AdditionalProperty = new AdditionalProperty {
                        StantionsWithTime = new List <StantionWithTimeSimple>()
                    }
                };
                foreach (var stantionOnTrip in stantionOnTrips)
                {
                    var stationName = (await sqlRStations.ById(stantionOnTrip.StantionId))?.Name;
                    row.AdditionalProperty.StantionsWithTime.Add(
                        new StantionWithTimeSimple
                    {
                        StantionId   = stantionOnTrip.StantionId,
                        StantionName = stationName,
                        InTime       = stantionOnTrip.InTime,
                        OutTime      = stantionOnTrip.OutTime
                    });
                }

                result.Rows.Add(row);
            }

            return(result);
        }
        public async Task <List <TripWithStartEndTimeAndDays> > GetTripsByTurnoverIdAndDays(int turnoverId, int routeId)
        {
            var sqlRTripOnRoute    = new TripsOnRouteRepository(_logger);
            var sqlRRoute          = new RoutesRepository(_logger);
            var sqlRDaysOfRoutes   = new DayOfRoutesRepoisitory(_logger);
            var sqlRTrips          = new TripsRepository(_logger);
            var sqlRStationOnTrips = new StantionOnTripsRepository(_logger);
            var sqlRStation        = new StantionsRepository(_logger);
            var sqlRDayOfTrips     = new DayOfTripsRepoisitory(_logger);
            //Получаем дни циклового графика
            var daysTurnoverObj = await sqlRDaysOfRoutes.DaysByTurnoverId(turnoverId);

            var daysTurnover = daysTurnoverObj.Select(x => x.Day).ToList();

            daysTurnover.Sort();
            //Надо найти трипсы с аналогичными днями.
            var trips = await sqlRTrips.GetAll();

            var result = new List <TripWithStartEndTimeAndDays>();


            var route = await sqlRRoute.ById(routeId);

            foreach (var trip in trips)
            {
                if (await sqlRTripOnRoute.ByRouteIdAndTripId(route.Id, trip.Id) != null)
                {
                    continue;
                }

                var currentTripDaysObj = await sqlRDayOfTrips.DaysByTripId(trip.Id);

                var currentTripDays = currentTripDaysObj.Select(x => x.Day).ToList();
                currentTripDays.Sort();

                var isGoodTrip = true;
                foreach (var d in daysTurnover)
                {
                    if (!currentTripDays.Any(x => x.Equals(d)))
                    {
                        isGoodTrip = false;
                    }
                }
                if (!isGoodTrip)
                {
                    continue;
                }
                {
                    string days = null;
                    foreach (var day in currentTripDays)
                    {
                        if (days == null)
                        {
                            days = GetStringDayOfWeekShort(day);
                        }
                        else
                        {
                            days = days + ", " + GetStringDayOfWeekShort(day);
                        }
                    }
                    var tripStations = await sqlRStationOnTrips.ByTripId(trip.Id);

                    tripStations = tripStations.OrderBy(x => x.OutTime).ToList();
                    var startStation = tripStations.First();
                    var endStation   = tripStations.Last();

                    var tripExtended = _mapper.Map <Trip, TripWithStartEndTimeAndDays>(trip);
                    tripExtended.Days             = currentTripDays;
                    tripExtended.StartTime        = startStation.OutTime.ToStringTimeOnly();
                    tripExtended.EndTime          = endStation.InTime.ToStringTimeOnly();
                    tripExtended.StartStationName = (await sqlRStation.ById(startStation.StantionId)).Name;
                    tripExtended.EndStationName   = (await sqlRStation.ById(endStation.StantionId)).Name;
                    result.Add(tripExtended);
                }
            }

            return(result);
        }