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);
        }
Пример #2
0
        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;
            }
        }