private IEnumerable <Document> LoadStockEntriesFromMIP(IEnumerable <MercuryNS.StockEntry> source)
        {
            List <Document> stockEntries = new List <Document>();

            //вынести перед циклом
            DocumentQuery query = new DocumentQuery(GetService <IMethaStorage>(), GetService <IQueryGenerator>(), GetService <ICacheManager>())
                                  .ResultField("SE", "*")
                                  .Using("StockEntry", "SE", ObjectStatus.osActive);

            foreach (IEnumerable <string> guids in source.Select(s => s.GUID).Batch(100))
            {
                stockEntries.AddRange(LocalReader.QueryDocuments(query.Where(w => w.Or(a =>
                {
                    foreach (string g in guids)
                    {
                        a.EQ("GUID", g, "SE");
                    }
                }))).Result);
            }
            return(stockEntries);
        }
        protected override bool ActionBody(BaseProcess action)
        {
            bool    isProcessed  = true;
            IAction updateAction = null;


            try
            {
                Guid enterpriseId         = GetValue <Guid>(ARG_PAGE_ENTERPRISE_ID);
                bool removeIsAbsent       = GetValue <bool>(ARG_REMOVE_IS_ABSENT);
                var  stockEntriesOutbound = GetValue <IEnumerable <Guid> >(ARG_STOCK_ENTRY_IDS);

                LocalContext.SaveLog(
                    $"{MoscowDateTimeOffset().ToString()} Начало обработки ответов от системы Меркурий.");

                // Получение последнего номера шага
                IList <MercuryQueueStepModel> responses = StepService.GetStepsByStatus(QueryId, null, 0, "0.0", null);

                IList <MercuryQueueStepModel> completed = responses.Where(r =>
                                                                          r.StatusName == MQSStatus.COMPLETE.ToString() && r.ProcessMark != Consts.PROCESSED_MARK).ToList();

                bool        anyError   = responses.Any(x => x.StatusName != MQSStatus.COMPLETE.ToString());
                List <Guid> updIds     = GetValue <List <Guid> >(ARG_UPDATED_STOCK_ENTRY_IDS);
                List <Guid> skippedIds = GetValue <List <Guid> >(ARG_SKIPEED_STOCK_ENTRY_IDS);

                // Обработка успешных ответов
                if (completed.Count > 0)
                {
                    foreach (MercuryQueueStepModel step in completed)
                    {
                        if (NeedStopSteps())
                        {
                            LocalContext.SaveLog(
                                $" Выполннение прервано (StopQueueSteps). Выполнение будет продолжено после запуска очереди.");
                            SetValue("Status", MQSStatus.STOPPED);
                            return(true);
                        }

                        MercuryNS.Body body =
                            ParseMercuryHelper.ParseBodyResponseFile(Path.Combine(MercurySettings.ResponseDirectory,
                                                                                  step.FileResponse));
                        if (body.ReceiveApplicationResultResponse != null &&
                            body.ReceiveApplicationResultResponse.Application != null)
                        {
                            MercuryNS.GetStockEntryListResponse response =
                                body.ReceiveApplicationResultResponse.Application.Result as
                                MercuryNS.GetStockEntryListResponse;
                            MercuryNS.StockEntryList stockEntriesFromMerc = response?.StockEntryList;
                            if (stockEntriesFromMerc != null && stockEntriesFromMerc.Count > 0)
                            {
                                LocalContext.SaveLog(
                                    $" Обработка файла ответа от Меркурия. Имя файла {step.FileResponse}.");

                                var queryForPullStockEntryGuids = new DocumentQuery(GetService <IMethaStorage>(), GetService <IQueryGenerator>(), GetService <ICacheManager>());
                                queryForPullStockEntryGuids
                                .ResultField("SE", "@Id")
                                .ResultField("SE", "GUID")
                                .Using("StockEntry", "SE", ObjectStatus.osActive);
                                queryForPullStockEntryGuids.Where(w => w.Or(o =>
                                {
                                    foreach (var seId in stockEntriesOutbound)
                                    {
                                        o.EQ("@Id", seId);
                                    }
                                }));

                                var seOutboundIds = LocalReader.QueryDocuments(queryForPullStockEntryGuids).Result.Select(d => d["GUID"]);

                                var stockEntriesFromMip = LoadStockEntriesFromMIP(stockEntriesFromMerc);

                                foreach (var se in stockEntriesFromMerc.Where(d => seOutboundIds.Contains(d.GUID)))
                                {
                                    var seFromMIP = stockEntriesFromMip.FirstOrDefault(d => (string)d["GUID"] == (string)se.GUID);

                                    if ((double)se.Batch.Volume < (double)seFromMIP["Volume"])
                                    {
                                        isProcessed = false;
                                        LocalContext.SaveLog(
                                            $" Выписка уже производилась");
                                    }

                                    if ((string)se.UUID != (string)seFromMIP["UUID"])
                                    {
                                        isProcessed = false;
                                        LocalContext.SaveLog(
                                            $" Выписка уже производилась");
                                    }
                                }
                            }
                            else
                            {
                                LocalContext.SaveLog(
                                    $" Файл ответа {step.FileResponse} от системы 'Меркурий' не содержит информацию о складских записях.");
                            }
                        }
                        else
                        {
                            anyError = true;
                            body.Fault.ToString();
                            // TODO сохранить ошибку в логе
                            //body.Fault
                            ResultDescription = "Система 'Меркурий' вернула исключение";
                        }
                    }
                }
                else
                {
                    isProcessed       = false;
                    ResultDescription = "Нет успешно обработанных ответов";
                    LocalContext.SaveLog(ResultDescription);
                }

                var notCompleted = responses.Where(r => r.StatusName != MQSStatus.COMPLETE.ToString());
                foreach (var nc in notCompleted)
                {
                    AppendUserErrorInfoFromXML(nc, Guid.Empty, null, null);
                }

                if (string.IsNullOrWhiteSpace(ResultDescription))
                {
                    ResultDescription = "Обработаны ответы от системы 'Меркурий'.";
                }
            }
            catch (ConcurrencyDocException except)
            {
                isProcessed = false;
                DefaultConcurrentExceptionLog(except);
            }
            catch (Exception e)
            {
                AppendUserErrorInfo(Guid.Empty, null, UserErrorConsts.ET_MIP,
                                    UserErrorConsts.StockList.RTE_PROCESS_RESPONSE, UserErrorConsts.DEFAULT_LAS_SUPPRT_ERROR);
                isProcessed = false;
                LocalContext.SaveLog(e.ToString());
                ResultDescription = "Ошибка анализа результатов";
            }

            LocalContext.SaveLog(
                $"{MoscowDateTimeOffset().ToString()} Окончание обработки ответов от системы 'Меркурий'.");
            return(isProcessed);
        }
Exemplo n.º 3
0
        protected override bool ActionBody(BaseProcess action)
        {
            bool isProcessed = true;

            try {
                messageGenerator = GetService <IMercuryMessageBodyGenerator>();

                int  pageSize     = GetValue <int>(ARG_PAGE_SIZE);
                int  pageCount    = GetValue <int>(ARG_PAGE_COUNT);
                int  pageStart    = GetValue <int>(ARG_PAGE_START);
                Guid enterpriseId = GetValue <Guid>(ARG_PAGE_ENTERPRISE_ID);
                operationName = GetValue <string>(ARG_OPERATION_NAME);
                mercuryLogin  = GetValue <string>(ARG_MERCURY_LOGIN);
                string suffix    = GetValue <string>(ARG_SUFFIX);
                int?   iteration = GetValue <int?>(ARG_ITERATION);

                DateTimeOffset?beginDate = GetValue <DateTimeOffset?>(ARG_BEGIN_DATE);
                DateTimeOffset?endDate   = GetValue <DateTimeOffset?>(ARG_END_DATE);

                LocalContext.SaveLog($"{MoscowDateTimeOffset().ToString()} Начало формирования запросов в систему Меркурий.");

                #region Проверка параметров
                if (pageCount <= 0)
                {
                    isProcessed = false;
                    LocalContext.SaveLog($" Количество страниц должно быть > 0.");
                    AppendUserErrorInfo(Guid.Empty, null, UserErrorConsts.ET_VALIDATION, UserErrorConsts.StockList.RTE_MAKE_REQUEST, "Количество страниц должно быть > 0");
                }
                if (pageSize <= 0)
                {
                    isProcessed = false;
                    LocalContext.SaveLog($" Размер страниц должно быть > 0.");
                    AppendUserErrorInfo(Guid.Empty, null, UserErrorConsts.ET_VALIDATION, UserErrorConsts.StockList.RTE_MAKE_REQUEST, "Размер страниц должно быть > 0");
                }
                if (pageStart <= 0)
                {
                    isProcessed = false;
                    LocalContext.SaveLog($" Начальная страница должна быть > 0.");
                    AppendUserErrorInfo(Guid.Empty, null, UserErrorConsts.ET_VALIDATION, UserErrorConsts.StockList.RTE_MAKE_REQUEST, "Начальная страница должна быть > 0");
                }
                Document enterpriseDoc = LocalReader.LoadDocumentByType(enterpriseId, "Enterprise");

                string enterpriseGUID = (string)enterpriseDoc["GUID"];
                string enterpriseCode = (string)enterpriseDoc["Code"];

                if (enterpriseDoc == null)
                {
                    isProcessed = false;
                    AppendUserErrorInfo(Guid.Empty, null, UserErrorConsts.ET_VALIDATION, UserErrorConsts.StockList.VALID_NO_ENTERPRISE, $"Не найдена площадка с ИД {enterpriseId.ToString()}/{enterpriseId.ToStringNumber()}");
                    LocalContext.SaveLog($" Не найдена площадка с ИД {enterpriseId.ToString()}/{enterpriseId.ToStringNumber()}.");
                }
                #endregion

                if (isProcessed)
                {
                    List <StepContext> steps = new List <StepContext>();
                    LocalContext.SaveLog($" Площадка для формирования запросов {enterpriseCode}.");
                    LocalContext.SaveLog($" Стартовая страница {pageStart}, количество страниц для получения {pageCount}, размер страницы {pageSize}.");
                    for (int i = 0; i < pageCount; i++)
                    {
                        LocalContext.SaveLog($" Формирование страницы {(i + pageStart - 1) * pageSize} - {(i + pageStart) * pageSize}.");

                        StepContext requestContext = CreateStep(QueryId, MQSOperationType.COMMUNICATE);
                        requestContext.MercuryQueueStep.Status = MQSStatus.NEW;
                        if (iteration.HasValue)
                        {
                            requestContext.MercuryQueueStep.StepId = "0.0_" + iteration.Value.ToString("D3");
                        }
                        else
                        {
                            requestContext.MercuryQueueStep.StepId = "0.0";
                        }
                        requestContext.MercuryQueueStep.StepNo         = LocalContext.MercuryQueueStep.StepNo + 1;
                        requestContext.MercuryQueueStep.StepName       = Consts.STEP_NAME_MERCURY_COMMUNICATE;
                        requestContext.MercuryQueueStep.Description    = "Сформирован запрос";
                        requestContext.MercuryQueueStep.OperationGroup = Consts.OP_GROUP_CHECK_FOR_COMPLETED_OUTBOUND + suffix;
                        requestContext.GenerateFileNames(operationName);
                        var req = GenerateRequest(i + pageStart, pageSize, LocalContext.MercurySettings, mercuryLogin,
                                                  enterpriseGUID, enterpriseCode, beginDate, endDate);
                        requestContext.SaveRequest(req);
                        var args = new Dictionary <string, ActionArgument>();
                        args.Add("PageNo", new ActionArgument(typeof(int), "PageNo", i));
                        requestContext.MercuryQueueStep.Parameters = ArgumentSerializer.SerializeArguments(args);
                        steps.Add(requestContext);
                        LocalContext.SaveLog($" Страница {i + pageStart - 1} сформирована.");
                    }

                    // Сохранение информации о сгенерированных запросах
                    using (IDatabaseConnector connector = GetService <IDatabaseConnector>()) {
                        IMercuryQueueStepService transactionPersist = this.GetService <IMercuryQueueStepService>(connector);
                        transactionPersist.RegisterSteps(steps);
                        transactionPersist.SaveFinish(LocalContext.MercuryQueueStep.Id, MQSStatus.COMPLETE, "Выполнено формирование запросов.", DateTimeOffset.UtcNow);
                        connector.Commit();
                        breakAutosave = true;
                        SetValue("Status", MQSStatus.COMPLETE);
                    }
                }
                else
                {
                    LocalContext.SaveLog($" Заданы не все параметры для формирования запроса(-ов).");
                    LocalContext.SaveLog($" Операция отменена.");
                    ResultDescription = "Ошибка. Не верные параметры.";
                }
            } catch (Exception e) {
                isProcessed = false;
                AppendUserErrorInfo(Guid.Empty, null, UserErrorConsts.ET_MIP, UserErrorConsts.StockList.RTE_MAKE_REQUEST, UserErrorConsts.DEFAULT_LAS_SUPPRT_ERROR);
                ResultDescription = "Ошибка процесса формирования запросов в систему 'Меркурий'.";
                LocalContext.SaveLog(e.ToString());
            }
            LocalContext.SaveLog($"{MoscowDateTimeOffset().ToString()} Окончание формирования запросов в систему 'Меркурий'.");
            return(isProcessed);
        }