예제 #1
0
        private void ProcessSavingLogic(CustomUnitOfWork uow)
        {
            // проверяем текущего работника
            var strWorkerId = WmsEnvironment.LocalData.GetValueFor <string>("WorkerID");

            if (string.IsNullOrEmpty(strWorkerId))
            {
                throw new LogicException("Не указан текущий работник");
            }

            // получаем рейс
            var newExtTraffics = uow.NewItems.OfType <YExternalTraffic>().ToList();

            if (newExtTraffics.Count == 0)
            {
                throw new LogicException("Ожидалось добавление нового рейса");
            }
            if (newExtTraffics.Count > 1)
            {
                throw new LogicException("Ожидалось добавление только одного нового рейса");
            }
            var newExternalTraffic = newExtTraffics[0];

            // проверяем внешние рейсы
            var newInternalTraffics = uow.NewItems.OfType <YInternalTraffic>().ToArray();

            CheckInternalTraffic(newInternalTraffics);

            // водитель, машина уже должны быть заполнены
            if (newExternalTraffic.ExternalTrafficDriver == null)
            {
                throw new LogicException("Не указан водитель");
            }
            if (newExternalTraffic.Vehicle == null)
            {
                throw new LogicException("Не указан автмобиль");
            }

            // заполняем обязательные поля рейса
            newExternalTraffic.Status =
                uow.Session.Query <YExternalTrafficStatus>().Single(i => i.StatusCode == "CAR_PLAN");
            newExternalTraffic.ExternalTrafficVerified = false;

            // регистрируем, чтобы появилась id
            uow.Session.Save(newExternalTraffic);

            // обрабатываем внутренние рейсы
            foreach (var newInternalTraffic in newInternalTraffics)
            {
                AddInternalTraffic(newExternalTraffic, newInternalTraffic, uow);
            }

            var cpvPassWorkerL1 = new YExternalTrafficCPV()
            {
                CustomParam     = uow.Session.Query <WmsCustomParam>().Single(i => i.CustomParamCode == "PassWorkerL1"),
                EXTERNALTRAFFIC = newExternalTraffic
            };

            // регистрируем, чтобы появилась id
            uow.Session.Save(cpvPassWorkerL1);

            var cpvPassWorkerWritePassL2 = new YExternalTrafficCPV()
            {
                CustomParam =
                    uow.Session.Query <WmsCustomParam>().Single(i => i.CustomParamCode == "PassWorkerAcceptEntryL2"),
                EXTERNALTRAFFIC = newExternalTraffic,
                Parent          = cpvPassWorkerL1,
                CPVValue        = strWorkerId
            };

            uow.RegisterNew(cpvPassWorkerWritePassL2);
        }
예제 #2
0
        public void CarDeparture(string passNumber, string pin)
        {
            if (string.IsNullOrEmpty(passNumber))
            {
                throw new ArgumentNullException("passNumber");
            }

            if (string.IsNullOrEmpty(passNumber))
            {
                throw new ArgumentNullException("pin");
            }

            using (var session = _sessionFactory.OpenSession())
            {
                var extTrafficList = session.Query <YExternalTraffic>()
                                     .Where(i => i.ExternalTrafficPassNumber == passNumber)
                                     .ToList();

                if (extTrafficList.Count > 1)
                {
                    throw new LogicalException(
                              $"По пропуску с номером '{passNumber}' найдено более одного рейса. Обратитесь в бюро пропусков.");
                }
                if (extTrafficList.Count == 0)
                {
                    throw new LogicalException($"Пропуск с номером '{passNumber}' не найден. Проверьте введенный номер.");
                }

                var targetTraffic = extTrafficList[0];
                if (targetTraffic.Status.StatusCode != YExternalTrafficStatuses.CAR_ARRIVED &&
                    targetTraffic.Status.StatusCode != YExternalTrafficStatuses.CAR_TRANSITTERRITORY)
                {
                    throw new LogicalException(
                              $"По пропуску с номером '{passNumber}' транспронтое средство в состоянии '{targetTraffic.Status.StatusName}'. Обратитесь в бюро пропусков");
                }

                var notCompleteInternalTraffics = targetTraffic.ExternalTraffic_YInternalTraffic_List
                                                  .Where(i => new[] { "Unloading", "Loading" }.Contains(i.PurposeVisit.PurposeVisitCode) &&
                                                         i.InternalTrafficFactDeparted == null)
                                                  .ToList();

                if (notCompleteInternalTraffics.Any())
                {
                    throw new LogicalException(
                              string.Format(
                                  "По пропуску с номером '{1}' водитель не отметился в ОДО об убытии.{0}{2}{0}Обратитесь в бюро пропусков."
                                  , Environment.NewLine, passNumber,
                                  string.Join(Environment.NewLine,
                                              notCompleteInternalTraffics.Select(
                                                  i => $"{i.Partner.PartnerName}: {i.PurposeVisit.PurposeVisitName}"))));
                }

                if (targetTraffic.ExternalTraffic_YInternalTraffic_List.Any(x => x.Partner.PartnerCode == "DTL"))
                {
                    var driver = targetTraffic.ExternalTrafficDriver;
                    //session.Get<WmsWorker>(targetTraffic.ExternalTrafficDriver.WorkerID);
                    var isShowSecurity = driver.CPV_List == null ||
                                         //worker.CPV_List.All(i => i.CustomParam.CustomParamCode != "IsDriverSecurityChecked") ||
                                         driver.CPV_List.Any(
                        i =>
                        i.CustomParam.CustomParamCode == "IsDriverSecurityChecked" &&
                        i.CPVValue == "0");
                    if (isShowSecurity)
                    {
                        throw new LogicalException("Требуется проверить водителя в службе безопасности!");
                    }
                }

                var worker = GetWorkerByPin(pin, session);
                targetTraffic.ExternalTrafficFactDeparted = DateTime.Now;
                targetTraffic.Status =
                    session.Query <YExternalTrafficStatus>().Single(i => i.StatusCode == YExternalTrafficStatuses.CAR_DEPARTED);

                // пишем CPV
                var cpvParent = session.Query <YExternalTrafficCPV>()
                                .FirstOrDefault(i => i.CustomParam.CustomParamCode.Equals("PassWorkerL1") && i.EXTERNALTRAFFIC == targetTraffic);
                if (cpvParent == null)
                {
                    cpvParent = new YExternalTrafficCPV()
                    {
                        CustomParam =
                            session.Query <WmsCustomParam>().Single(i => i.CustomParamCode.Equals("PassWorkerL1")),
                        EXTERNALTRAFFIC = targetTraffic
                    };
                    session.Save(cpvParent);
                }
                var cpvCustom = new YExternalTrafficCPV()
                {
                    CustomParam =
                        session.Query <WmsCustomParam>().Single(i => i.CustomParamCode.Equals("PassWorkerClosePass")),
                    EXTERNALTRAFFIC = targetTraffic,
                    CPVValue        = worker.WorkerID.ToString(),
                    Parent          = cpvParent
                };
                session.Save(cpvCustom);

                // обновим заявки
                var notCompletedRequests = session.Query <YPassRequest>().Where(i => i.PassNumber == passNumber).ToList();
                foreach (var item in notCompletedRequests)
                {
                    item.State = PassRequestStates.PASSREQUEST_DEPARTED;
                }

                using (var transaction = session.BeginTransaction())
                    transaction.Commit();
            }
        }