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); }
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(); } }