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(); }
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(); }
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); }
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 } } }); }
public virtual void RecalculatePlanedDistance(RouteGeometryCalculator distanceCalculator) { if (WayBillDocumentItems.Count == 0) { PlanedDistance = 0; } else { PlanedDistance = distanceCalculator.GetRouteDistance(HashPointsOfRoute.ToArray()) / 1000m; } }
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(); }
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); }