public void SuppData_FillSuppDataInfo(SuppData_SearchResponse SuppDataSearchResponse) { const int count = 1000; var totalCount = SuppDataSearchResponse.SuppDataAvaibilities?.Count; if (totalCount == null || totalCount == 0) { SuppDataSearchResponse.AddMessageErrorInternal("SuppDataAvaibilities null! Отелей не вернулось от поставщиков."); return; } var totalPages = totalCount / count; var SuppDataIdPages = new List <int[]>(); for (var pageCount = 0; pageCount <= totalPages; pageCount++) { var item = SuppDataSearchResponse.SuppDataAvaibilities?.Select(z => z.SuppData.Id).Skip(pageCount * count).Take(count).ToArray(); SuppDataIdPages.Add(item); } var concurrentBag = new ConcurrentBag <SuppData_ShortInfo[]>(); Parallel.ForEach(SuppDataIdPages, currentPage => { var result = _dictionarySuppData.GetSuppDatas(currentPage); if (result != null) { concurrentBag.Add(result); } }); var plainList = concurrentBag.SelectMany(s => s).ToArray(); foreach (var SuppData in SuppDataSearchResponse.SuppDataAvaibilities) { if (SuppData?.SuppData != null) { var currentId = SuppData.SuppData.Id; var currentInfo = plainList.FirstOrDefault(f => f.Id == currentId); if (currentInfo != null) { SuppData.SuppData = currentInfo; } else { _logger.Error($"Cannot get SuppDataInfo by SuppDataid {currentId}"); } //Заполним также SuppData в minPrices. Необходимо для BG-2960 foreach (var minPrice in SuppData.MinPrices) { minPrice.SuppDataId = SuppData.SuppData.Id; } } } }
/// <summary> /// Объединение результатов от нескольких поставщиков. /// </summary> /// <param name="responses">Ответы</param> /// <returns>Объединенный результат</returns> public SuppData_SearchResponse SuppData_ComposeSuppDataSearchResults(List <SuppData_SearchResponse> responses) { if (responses == null || responses.Count == 0) { return(new SuppData_SearchResponse().AddMessageErrorInternal("1|Резутатов не вернулось")); } if (responses.Count == 1) { var frsp = responses.First(); if (frsp.SuppDataAvaibilities != null && frsp.SuppDataAvaibilities.Any()) { foreach (var SuppDataAvaibility in frsp.SuppDataAvaibilities) { SuppDataAvaibility.UpdateSupplierList(); } } return(frsp); } var ret = new SuppData_SearchResponse(); #region *** Обьединение сообщений об ошибках *** var errorResponses = responses.Where(n => !string.IsNullOrEmpty(n.ErrorMessage)).ToList(); if (errorResponses.Count > 0) { foreach (var errorResponse in errorResponses) { ret.ErrorMessage = string.IsNullOrEmpty(ret.ErrorMessage) ? errorResponse.ErrorMessage : ret.ErrorMessage + "\r\n" + errorResponse.ErrorMessage; } } ret.Success = responses.Any(n => n.Success); #endregion //Пока просто объединим ответы ret.SuppDataAvaibilities = new List <SuppData_SearchAvaibility>(); foreach (SuppData_SearchResponse response in responses.Where(r => r.SuppDataAvaibilities != null)) { ret.SuppDataAvaibilities.AddRange(response.SuppDataAvaibilities.Where(n => n != null)); ret.SuppDataAvaibilities.ForEach(n => { n.SuppData.DescriptionEn = null; n.SuppData.DescriptionRu = null; }); } //группировка по гостиницам. var groups = ret.SuppDataAvaibilities.GroupBy(n => n.SuppData.Id); var lstDeleteSuppDatas = new List <SuppData_SearchAvaibility>(); foreach (var group in groups) { var hh = group.First(); hh.MinPrices = group.Where(z => z.MinPrices != null).SelectMany(z => z.MinPrices).ToList(); hh.Rooms = group.Where(z => z.Rooms != null).SelectMany(z => z.Rooms).Where(z => z != null).OrderBy(z => z.TotalPrice?.Amount ?? 0).ToList(); hh.Rooms.ForEach(r => r.Name = r.Name.StripTags()); hh.UpdateSupplierList(); //и остальные к ней. lstDeleteSuppDatas.AddRange(@group.Skip(1)); } //Удалим то что объединили. foreach (var SuppData in lstDeleteSuppDatas) { ret.SuppDataAvaibilities.Remove(SuppData); } return(ret); }