protected void OnBtnSendEnRouteClicked(object sender, EventArgs e) { #region костыль //FIXME пока не можем найти причину бага с несменой статуса на в пути при полной отгрузке, позволяем логистам отправлять МЛ в путь из этого диалога bool fullyLoaded = false; if (Entity.ShipIfCan(UoW, CallTaskWorker, out _)) { fullyLoaded = true; MessageDialogHelper.RunInfoDialog("Маршрутный лист отгружен полностью."); } #endregion if ( !fullyLoaded && ServicesConfig.CommonServices.CurrentPermissionService.ValidatePresetPermission("can_send_not_loaded_route_lists_en_route") && MessageDialogHelper.RunQuestionWithTitleDialog( "Оптправить в путь?", string.Format( "{0} погружен <span foreground=\"Red\">НЕ ПОЛНОСТЬЮ</span> и будет переведён в статус \"{1}\". После сохранения изменений откат этого действия будет невозможен.\nВы уверены что хотите отправить МЛ в путь?", Entity.Title, RouteListStatus.EnRoute.GetEnumTitle() ) ) ) { Entity.ChangeStatusAndCreateTask(RouteListStatus.EnRoute, CallTaskWorker); Entity.NotFullyLoaded = true; } else if (!fullyLoaded && !ServicesConfig.CommonServices.CurrentPermissionService.ValidatePresetPermission("can_send_not_loaded_route_lists_en_route")) { MessageDialogHelper.RunWarningDialog( "Недостаточно прав", string.Format("У вас нет прав для перевода не полностью погруженных МЛ в статус \"{0}\"", RouteListStatus.EnRoute.GetEnumTitle()), Gtk.ButtonsType.Ok ); } }
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); }
protected void OnButtonAcceptClicked(object sender, EventArgs e) { if (buttonAccept.Label == "Подтвердить" && Entity.HasOverweight()) { if (QSMain.User.Permissions["can_confirm_routelist_with_overweight"]) { if ( !MessageDialogHelper.RunQuestionDialog( String.Format( "Вы перегрузили '{0}' на {1} кг.\nВы уверены что хотите подтвердить маршрутный лист?", Entity.Car.Title, Entity.Overweight() ) ) ) { return; } } else { MessageDialogHelper.RunWarningDialog( String.Format( "Вы перегрузили '{0}' на {1} кг.\nПодтвердить маршрутный лист нельзя.", Entity.Car.Title, Entity.Overweight() ) ); return; } } if (UoWGeneric.Root.Status == RouteListStatus.New) { var valid = new QSValidator <RouteList>(UoWGeneric.Root, new Dictionary <object, object> { { "NewStatus", RouteListStatus.InLoading } }); if (valid.RunDlgIfNotValid((Window)this.Toplevel)) { return; } UoWGeneric.Root.ChangeStatus(RouteListStatus.InLoading); foreach (var address in UoWGeneric.Root.Addresses) { if (address.Order.OrderStatus < Domain.Orders.OrderStatus.OnLoading) { address.Order.ChangeStatus(Domain.Orders.OrderStatus.OnLoading); } } //Строим маршрут для МЛ. if (!Entity.Printed || MessageDialogHelper.RunQuestionWithTitleDialog("Перестроить маршрут?", "Этот маршрутный лист уже был когда-то напечатан. При новом построении маршрута порядок адресов может быть другой. При продолжении обязательно перепечатайте этот МЛ.\nПерестроить маршрут?")) { RouteOptimizer optimizer = new RouteOptimizer(); var newRoute = optimizer.RebuidOneRoute(Entity); if (newRoute != null) { createroutelistitemsview1.DisableColumnsUpdate = true; newRoute.UpdateAddressOrderInRealRoute(Entity); //Рассчитываем расстояние Entity.RecalculatePlanedDistance(new Tools.Logistic.RouteGeometryCalculator(Tools.Logistic.DistanceProvider.Osrm)); createroutelistitemsview1.DisableColumnsUpdate = false; var noPlan = Entity.Addresses.Count(x => !x.PlanTimeStart.HasValue); if (noPlan > 0) { MessageDialogHelper.RunWarningDialog($"Для маршрута незапланировано {noPlan} адресов."); } } else { MessageDialogHelper.RunWarningDialog($"Маршрут не был перестроен."); } } Save(); if (UoWGeneric.Root.Car.TypeOfUse == CarTypeOfUse.Truck) { if (MessageDialogHelper.RunQuestionDialog("Маршрутный лист для транспортировки на склад, перевести машрутный лист сразу в статус '{0}'?", RouteListStatus.OnClosing.GetEnumTitle())) { Entity.ChangeStatus(RouteListStatus.OnClosing); foreach (var item in UoWGeneric.Root.Addresses) { item.Order.OrderStatus = Domain.Orders.OrderStatus.OnTheWay; } Entity.CompleteRoute(); } } else { //Проверяем нужно ли маршрутный лист грузить на складе, если нет переводим в статус в пути. var forShipment = Repository.Store.WarehouseRepository.WarehouseForShipment(UoW, Entity.Id); if (forShipment.Count == 0) { if (MessageDialogHelper.RunQuestionDialog("Для маршрутного листа, нет необходимости грузится на складе. Перевести машрутный лист сразу в статус '{0}'?", RouteListStatus.EnRoute.GetEnumTitle())) { valid = new QSValidator <RouteList>( UoWGeneric.Root, new Dictionary <object, object> { { "NewStatus", RouteListStatus.EnRoute } } ); Entity.ChangeStatus(valid.RunDlgIfNotValid((Window)this.Toplevel) ? RouteListStatus.New : RouteListStatus.EnRoute); } else { Entity.ChangeStatus(RouteListStatus.New); } } } Save(); UpdateButtonStatus(); return; } if (UoWGeneric.Root.Status == RouteListStatus.InLoading) { if (RouteListRepository.GetCarLoadDocuments(UoW, Entity.Id).Any()) { MessageDialogHelper.RunErrorDialog("Для маршрутного листа были созданы документы погрузки. Сначала необходимо удалить их."); } else { UoWGeneric.Root.ChangeStatus(RouteListStatus.New); } UpdateButtonStatus(); return; } }