protected override bool ActionBody(BaseProcess action) { bool isProcessed = true; SetValue(ARG_PAGE_COUNT, 0); try { LocalContext.SaveLog($"{MoscowDateTimeOffset().ToString()} Начало обработки ответов от системы 'Меркурий'."); IList <MercuryQueueStepModel> responses = StepService.GetStepsByStatus(QueryId, null, 0, "0.0_001", Consts.OP_GROUP_CHECK_FOR_COMPLETED_OUTBOUND); MercuryQueueStepModel completed = responses.Where(r => r.StatusName == MQSStatus.COMPLETE.ToString()).FirstOrDefault(); IList <Guid> updIds = new List <Guid>(); // Обработка успешных ответов if (completed != null) { MercuryNS.Body body = ParseMercuryHelper.ParseBodyResponseFile(Path.Combine(MercurySettings.ResponseDirectory, completed.FileResponse)); if (body.ReceiveApplicationResultResponse != null && body.ReceiveApplicationResultResponse.Application != null) { MercuryNS.GetStockEntryListResponse response = body.ReceiveApplicationResultResponse.Application.Result as MercuryNS.GetStockEntryListResponse; MercuryNS.StockEntryList list = response?.StockEntryList; if (list != null) { int totalItems = list.Total; if (totalItems > 0) { ISystemSettingManager systemSettings = GetService <ISystemSettingManager>(); int maxPageCount = systemSettings.GetByPrefix <int>("MIP_OP_GET_STOCK_ENTRY_LIST_PAGE_COUNT", 10); if (maxPageCount < 1) { maxPageCount = 1; LocalContext.SaveLog($"Минимальное количество запрашиваемых страниц: 1."); } int pageSize = systemSettings.GetByPrefix <int>("MIP_OP_GET_STOCK_ENTRY_LIST_PAGE_SIZE", 250); if (pageSize < 1) // проверка отрицательного значения и = 0 { pageSize = 1; LocalContext.SaveLog($"Минимальное количество элементов при зпросе 1."); } int currentPageCount = totalItems / pageSize + ((totalItems % pageSize) > 0 ? 1 : 0); if (currentPageCount > maxPageCount) { LocalContext.SaveLog($"Количество страниц первышает максимально возможное в запросе. Расчитанне количество страниц: {currentPageCount}"); currentPageCount = maxPageCount; } LocalContext.SaveLog($"Будет запрошено {currentPageCount} страниц с количеством элементов на страницу {pageSize}"); SetValue(ARG_PAGE_SIZE, pageSize); SetValue(ARG_PAGE_COUNT, currentPageCount); SetValue(ARG_PAGE_START, 1); ResultDescription = "Количество страниц расчитанно."; } else { LocalContext.SaveLog("Площадка не содержит складских записей."); ResultDescription = "Площадка не содержит складских записей."; } } } else { isProcessed = false; AppendUserErrorInfoFromXML(completed, Guid.Empty, null, null); LocalContext.SaveLog("Ошибка при ответе системы 'Меркурий'. Смотри файл ответа от системы 'Меркурий'."); ResultDescription = "Система 'Меркурий' вернула исключение"; } } else { MercuryQueueStepModel notcompleted = responses.Where(r => r.StatusName != MQSStatus.COMPLETE.ToString()).FirstOrDefault(); if (notcompleted != null) { AppendUserErrorInfoFromXML(notcompleted, Guid.Empty, null, null); } isProcessed = false; ResultDescription = "Ошибка анализа числа страниц."; LocalContext.SaveLog("Ошибка автоматического вычисления количества страниц для запроса."); } } catch (Exception e) { AppendUserErrorInfo(Guid.Empty, null, UserErrorConsts.ET_MIP, UserErrorConsts.StockList.RTE_CALC_PAGES, UserErrorConsts.DEFAULT_LAS_SUPPRT_ERROR); isProcessed = false; LocalContext.SaveLog(e.ToString()); ResultDescription = "Ошибка анализа числа страниц."; } LocalContext.SaveLog($"{MoscowDateTimeOffset().ToString()} Окончание обработки ответов от системы 'Меркурий'."); return(isProcessed); }
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); }