Exemplo n.º 1
0
        public WayBillGeneratorViewModel(
            IUnitOfWorkFactory unitOfWorkFactory,
            IInteractiveService interactiveService,
            INavigationManager navigation,
            IWayBillDocumentRepository wayBillDocumentRepository,
            RouteGeometryCalculator calculator,
            EntityAutocompleteSelectorFactory <EmployeesJournalViewModel> entityAutocompleteSelectorFactory
            )
            : base(unitOfWorkFactory, interactiveService, navigation)
        {
            this.entityAutocompleteSelectorFactory = entityAutocompleteSelectorFactory ?? throw new ArgumentNullException(nameof(entityAutocompleteSelectorFactory));

            if (wayBillDocumentRepository == null)
            {
                throw new ArgumentNullException(nameof(wayBillDocumentRepository));
            }

            if (calculator == null)
            {
                throw new ArgumentNullException(nameof(calculator));
            }

            this.Entity = new WayBillDocumentGenerator(UnitOfWorkFactory.CreateWithoutRoot(), wayBillDocumentRepository, calculator);
            TabName     = "Путевые листы для ФО";
            CreateCommands();
        }
Exemplo n.º 2
0
        public static GMapRoute DrawRoute(GMapOverlay overlay, RouteList routeList, RouteGeometryCalculator geometryCalc = null)
        {
            List <PointLatLng> points;
            var baseLat = (double)routeList.GeographicGroups.FirstOrDefault().BaseLatitude.Value;
            var baseLon = (double)routeList.GeographicGroups.FirstOrDefault().BaseLongitude.Value;

            if (geometryCalc != null)
            {
                var address = routeList.GenerateHashPointsOfRoute();
                StartProgress(address.Length);
                points = geometryCalc.GetGeometryOfRoute(address, UpdateProgress);
                CloseProgress();
            }
            else
            {
                points = new List <PointLatLng>();
                points.Add(new PointLatLng(baseLat, baseLon));
                points.AddRange(routeList.Addresses.Select(x => x.Order.DeliveryPoint.GmapPoint));
                points.Add(new PointLatLng(baseLat, baseLon));
            }

            var route = new GMapRoute(points, routeList.Id.ToString())
            {
                Stroke = new System.Drawing.Pen(System.Drawing.Color.Blue)
                {
                    Width     = 2,
                    DashStyle = System.Drawing.Drawing2D.DashStyle.Solid
                }
            };

            overlay.Routes.Add(route);
            return(route);
        }
 public WayBillDocumentGenerator(IUnitOfWork unitOfWork, IWayBillDocumentRepository repository, RouteGeometryCalculator calculator)
 {
     this.uow                = unitOfWork ?? throw new ArgumentNullException(nameof(unitOfWork));
     this.repository         = repository ?? throw new ArgumentNullException(nameof(repository));
     this.DistanceCalculator = calculator ?? throw new ArgumentNullException(nameof(calculator));
     DocPrinterInit();
 }
        public WayBillGeneratorViewModel(
            IUnitOfWorkFactory unitOfWorkFactory,
            IInteractiveService interactiveService,
            INavigationManager navigation,
            IWayBillDocumentRepository wayBillDocumentRepository,
            RouteGeometryCalculator calculator,
            IEmployeeJournalFactory employeeJournalFactory,
            IDocTemplateRepository docTemplateRepository,
            IFileChooserProvider fileChooserProvider) : base(unitOfWorkFactory, interactiveService, navigation)
        {
            EntityAutocompleteSelectorFactory = employeeJournalFactory?.CreateEmployeeAutocompleteSelectorFactory()
                                                ?? throw new ArgumentNullException(nameof(employeeJournalFactory));
            _fileChooser = fileChooserProvider ?? throw new ArgumentNullException(nameof(fileChooserProvider));

            if (wayBillDocumentRepository == null)
            {
                throw new ArgumentNullException(nameof(wayBillDocumentRepository));
            }

            if (calculator == null)
            {
                throw new ArgumentNullException(nameof(calculator));
            }

            Entity = new WayBillDocumentGenerator(
                UnitOfWorkFactory.CreateWithoutRoot(), wayBillDocumentRepository, calculator, docTemplateRepository);

            TabName = "Путевые листы для ФО";
            CreateCommands();
        }
Exemplo n.º 5
0
        public static GMapRoute DrawRoute(GMapOverlay overlay, RouteList routeList, RouteGeometryCalculator geometryCalc = null)
        {
            List <PointLatLng> points;

            if (geometryCalc != null)
            {
                var address = routeList.GenerateHashPiontsOfRoute();
                MainClass.progressBarWin.ProgressStart(address.Length);
                points = geometryCalc.GetGeometryOfRoute(address, (val, max) => MainClass.progressBarWin.ProgressUpdate(val));
                MainClass.progressBarWin.ProgressClose();
            }
            else
            {
                points = new List <PointLatLng>();
                points.Add(DistanceCalculator.BasePoint);
                points.AddRange(routeList.Addresses.Select(x => x.Order.DeliveryPoint.GmapPoint));
                points.Add(DistanceCalculator.BasePoint);
            }

            var route = new GMapRoute(points, routeList.Id.ToString());

            route.Stroke           = new System.Drawing.Pen(System.Drawing.Color.Blue);
            route.Stroke.Width     = 2;
            route.Stroke.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;

            overlay.Routes.Add(route);
            return(route);
        }
Exemplo n.º 6
0
        public static ReportInfo GetRDLRouteMap(IUnitOfWork uow, RouteList routeList, bool batchPrint)
        {
            string documentName = "RouteMap";

            XmlDocument         rdlText    = new XmlDocument();
            XmlNamespaceManager namespaces = new XmlNamespaceManager(rdlText.NameTable);

            namespaces.AddNamespace("r", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");
            rdlText.Load(Path.Combine(Environment.CurrentDirectory, "Reports/Logistic/" + documentName + ".rdl"));
            var imageData = rdlText.DocumentElement.SelectSingleNode("/r:Report/r:EmbeddedImages/r:EmbeddedImage[@Name=\"map\"]/r:ImageData", namespaces);

            var map = new GMapControl
            {
                MapProvider    = GMapProviders.OpenCycleMap,
                MaxZoom        = 18,
                RoutesEnabled  = true,
                MarkersEnabled = true
            };

            GMapOverlay routeOverlay = new GMapOverlay("route");

            using (var calc = new RouteGeometryCalculator(DistanceProvider.Osrm))
            {
                MapDrawingHelper.DrawRoute(routeOverlay, routeList, calc);
            }

            GMapOverlay addressesOverlay = new GMapOverlay("addresses");

            MapDrawingHelper.DrawAddressesOfRoute(addressesOverlay, routeList);
            map.Overlays.Add(routeOverlay);
            map.Overlays.Add(addressesOverlay);
            map.SetFakeAllocationSize(new Gdk.Rectangle(0, 0, 900, 900));
            map.ZoomAndCenterRoutes("route");
            byte[] img;
            using (var bitmap = map.ToBitmap((int count) => _logger.Info("Загружаем плитки карты(осталось {0})...", count), !batchPrint))
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                    img = stream.ToArray();
                }
            }

            string base64image = Convert.ToBase64String(img);

            imageData.InnerText = base64image;

            return(new ReportInfo
            {
                Title = $"Карта маршрута № { routeList.Id }",
                Source = rdlText.InnerXml,
                Parameters = new Dictionary <string, object>
                {
                    { "route_id", routeList.Id }
                }
            });
        }
Exemplo n.º 7
0
 public virtual void RecalculatePlanedDistance(RouteGeometryCalculator distanceCalculator)
 {
     if (WayBillDocumentItems.Count == 0)
     {
         PlanedDistance = 0;
     }
     else
     {
         PlanedDistance = distanceCalculator.GetRouteDistance(HashPointsOfRoute.ToArray()) / 1000m;
     }
 }
Exemplo n.º 8
0
 public WayBillDocumentGenerator(
     IUnitOfWork unitOfWork,
     IWayBillDocumentRepository repository,
     RouteGeometryCalculator calculator,
     IDocTemplateRepository docTemplateRepository)
 {
     _uow = unitOfWork ?? throw new ArgumentNullException(nameof(unitOfWork));
     _wayBillDocumentRepository = repository ?? throw new ArgumentNullException(nameof(repository));
     _distanceCalculator        = calculator ?? throw new ArgumentNullException(nameof(calculator));
     _docTemplateRepository     = docTemplateRepository ?? throw new ArgumentNullException(nameof(docTemplateRepository));
     DocPrinterInit();
 }
Exemplo n.º 9
0
        protected void OnButtonRecalculateMileageClicked(object sender, EventArgs e)
        {
            logger.Info("Рассчет длинны маршрута...");
            RouteGeometryCalculator routeCalculator = new RouteGeometryCalculator(DistanceProvider.Osrm);

            var points = new List <long> {
                CachedDistance.BaseHash
            };

            #region если нет координат хотя бы у одной точки доставки
            bool   hasError = false;
            string ErMsg    = "Пересчёт километража невозможен, т.к. не найдены координаты для следующих точек доставки:\n";
            foreach (RouteListItem address in Entity.Addresses.Where(p => p.Order.DeliveryPoint.Latitude == null ||
                                                                     p.Order.DeliveryPoint.Longitude == null))
            {
                hasError = true;
                ErMsg   += String.Format("\tЗаказ №{0} - {1}\n", address.Order.Id, address.Order.DeliveryPoint.ShortAddress);
            }
            ErMsg += "Перейдите в указанные точки доставки и добавьте (проверьте) их координаты.";
            if (hasError)
            {
                MessageDialogHelper.RunWarningDialog(ErMsg);
                return;
            }
            #endregion
            foreach (RouteListItem address in Entity.Addresses.OrderBy(x => x.StatusLastUpdate))
            {
                if (address.Status == RouteListItemStatus.Completed)
                {
                    points.Add(address.Order.DeliveryPoint.СoordinatesHash);
                }
            }
            points.Add(CachedDistance.BaseHash);

            var distance = (decimal)routeCalculator.GetRouteDistance(points.ToArray());
            Entity.RecalculatedDistance = distance / 1000;
            logger.Info("Ок.");
        }
        protected void OnButtonAcceptClicked(object sender, EventArgs e)
        {
            try
            {
                SetSensetivity(false);
                var callTaskWorker = new CallTaskWorker(
                    CallTaskSingletonFactory.GetInstance(),
                    new CallTaskRepository(),
                    new OrderRepository(),
                    _employeeRepository,
                    _baseParametersProvider,
                    ServicesConfig.CommonServices.UserService,
                    ErrorReporter.Instance);

                if (Entity.Car == null)
                {
                    MessageDialogHelper.RunWarningDialog("Не заполнен автомобиль");
                    return;
                }
                StringBuilder warningMsg = new StringBuilder($"Автомобиль '{ Entity.Car.Title }':");
                if (Entity.HasOverweight())
                {
                    warningMsg.Append($"\n\t- перегружен на { Entity.Overweight() } кг");
                }

                if (Entity.HasVolumeExecess())
                {
                    warningMsg.Append($"\n\t- объём груза превышен на { Entity.VolumeExecess() } м<sup>3</sup>");
                }

                if (buttonAccept.Label == "Подтвердить" && (Entity.HasOverweight() || Entity.HasVolumeExecess()))
                {
                    if (ServicesConfig.CommonServices.CurrentPermissionService.ValidatePresetPermission("can_confirm_routelist_with_overweight"))
                    {
                        warningMsg.AppendLine("\nВы уверены что хотите подтвердить маршрутный лист?");
                        if (!MessageDialogHelper.RunQuestionDialog(warningMsg.ToString()))
                        {
                            return;
                        }
                    }
                    else
                    {
                        warningMsg.AppendLine("\nПодтвердить маршрутный лист нельзя.");
                        MessageDialogHelper.RunWarningDialog(warningMsg.ToString());
                        return;
                    }
                }

                if (Entity.Status == RouteListStatus.New)
                {
                    var valid = new QSValidator <RouteList>(Entity,
                                                            new Dictionary <object, object> {
                        { "NewStatus", RouteListStatus.Confirmed },
                        { nameof(IRouteListItemRepository), new RouteListItemRepository() }
                    });
                    if (valid.RunDlgIfNotValid((Window)this.Toplevel))
                    {
                        return;
                    }

                    Entity.ChangeStatusAndCreateTask(RouteListStatus.Confirmed, callTaskWorker);
                    //Строим маршрут для МЛ.
                    if ((!Entity.PrintsHistory?.Any() ?? true) || MessageDialogHelper.RunQuestionWithTitleDialog("Перестроить маршрут?", "Этот маршрутный лист уже был когда-то напечатан. При новом построении маршрута порядок адресов может быть другой. При продолжении обязательно перепечатайте этот МЛ.\nПерестроить маршрут?"))
                    {
                        RouteOptimizer optimizer = new RouteOptimizer(ServicesConfig.InteractiveService);
                        var            newRoute  = optimizer.RebuidOneRoute(Entity);
                        if (newRoute != null)
                        {
                            createroutelistitemsview1.DisableColumnsUpdate = true;
                            newRoute.UpdateAddressOrderInRealRoute(Entity);
                            //Рассчитываем расстояние
                            using (var calc = new RouteGeometryCalculator())
                            {
                                Entity.RecalculatePlanedDistance(calc);
                            }
                            createroutelistitemsview1.DisableColumnsUpdate = false;
                            var noPlan = Entity.Addresses.Count(x => !x.PlanTimeStart.HasValue);
                            if (noPlan > 0)
                            {
                                MessageDialogHelper.RunWarningDialog($"Для маршрута незапланировано { noPlan } адресов.");
                            }
                        }
                        else
                        {
                            MessageDialogHelper.RunWarningDialog($"Маршрут не был перестроен.");
                        }
                    }

                    Save();

                    if (Entity.GetCarVersion.IsCompanyCar && Entity.Car.CarModel.CarTypeOfUse == CarTypeOfUse.Truck && !Entity.NeedToLoad)
                    {
                        if (MessageDialogHelper.RunQuestionDialog(
                                "Маршрутный лист для транспортировки на склад, перевести машрутный лист сразу в статус '{0}'?",
                                RouteListStatus.OnClosing.GetEnumTitle()))
                        {
                            Entity.CompleteRouteAndCreateTask(_wageParameterService, callTaskWorker, _trackRepository);
                        }
                    }
                    else
                    {
                        //Проверяем нужно ли маршрутный лист грузить на складе, если нет переводим в статус в пути.
                        var needTerminal = Entity.Addresses.Any(x => x.Order.PaymentType == PaymentType.Terminal);

                        if (!Entity.NeedToLoad && !needTerminal)
                        {
                            if (MessageDialogHelper.RunQuestionDialog("Для маршрутного листа, нет необходимости грузится на складе. Перевести маршрутный лист сразу в статус '{0}'?", RouteListStatus.EnRoute.GetEnumTitle()))
                            {
                                valid = new QSValidator <RouteList>(
                                    Entity,
                                    new Dictionary <object, object>
                                {
                                    { "NewStatus", RouteListStatus.EnRoute },
                                    { nameof(IRouteListItemRepository), new RouteListItemRepository() }
                                });
                                if (!valid.IsValid)
                                {
                                    return;
                                }

                                Entity.ChangeStatusAndCreateTask(valid.RunDlgIfNotValid((Window)this.Toplevel) ? RouteListStatus.New : RouteListStatus.EnRoute, callTaskWorker);
                            }
                            else
                            {
                                Entity.ChangeStatusAndCreateTask(RouteListStatus.New, callTaskWorker);
                            }
                        }
                    }
                    Save();
                    UpdateButtonStatus();
                    createroutelistitemsview1.SubscribeOnChanges();
                    UpdateAdditionalLoadingWidgets();

                    return;
                }
                if (Entity.Status == RouteListStatus.InLoading || Entity.Status == RouteListStatus.Confirmed)
                {
                    if (_routeListRepository.GetCarLoadDocuments(UoW, Entity.Id).Any())
                    {
                        MessageDialogHelper.RunErrorDialog("Для маршрутного листа были созданы документы погрузки. Сначала необходимо удалить их.");
                    }
                    else
                    {
                        Entity.ChangeStatusAndCreateTask(RouteListStatus.New, callTaskWorker);
                    }
                    UpdateButtonStatus();
                    return;
                }
            }
            finally
            {
                SetSensetivity(true);
            }
            UpdateDlg(_isLogistican);
        }