turns-00042.parquet:39789
ef862c417954cf3ed7505bd0
turn 3/3gpt-4o-2024-08-06EnglishRussia334 words
degenerate_repetitionAbsentFinal dense release
USER
мне бы по structId как то сравнивать и в тексте ошибки его упоминать
public class OfferStruct : BaseVersionedEntity<int>, ISynchronizable
{
private Offer _offer;
private int? _offer_Id;
private int? _productConfigurationEntityId;
private int? _structId;ASSISTANT
Понятно. Если вы хотите сравнивать офферы по `structId`, вам нужно экстрагировать `structId` из `OfferStruct` внутри каждого `Offer`. Затем можно сравнить множества `structId` между исходными и отфильтрованными офферами.
Допустим, что `Offer` содержит список `OfferStruct` в поле `_offerStructs`. Вы можете использовать это поле, чтобы извлечь `structId` и затем сравнить их. Если найдены расхождения, можете добавить их в текст ошибки.
Пример кода с учётом изменений:
```csharp
private void CheckAvailabilityByRules(Basket basket, IServiceProvider serviceProvider)
{
var aggregator = serviceProvider.GetRequiredService<IValidationResultsAggregator>();
var queryRule = serviceProvider.GetRequiredService<IQueryRule>();
var queryOffer = serviceProvider.GetRequiredService<IQueryOffer>();
var queryProductConfiguration = serviceProvider.GetRequiredService<IQueryProductConfiguration>();
var intermediarySumManager = serviceProvider.GetRequiredService<IIntermediarySumManager>();
var sumManager = new SumManager(intermediarySumManager);
var deal = basket.GetKaskoDeal();
var useDrafts = basket.ExternalTagList?.UseDrafts;
var basketActualDate = basket?.DateActual ?? DT.Now;
var currentActualDate = deal.DateActual ?? basketActualDate;
var offers = queryOffer.GetOffers(GetDistictDealOfferIds(deal), basketActualDate, useDrafts);
var productConfigurations = queryProductConfiguration.GetProductConfigurationForOffers(offers, currentActualDate, useDrafts);
var rules = queryRule.GetRulesForProduct(x =>
x.Product_Id == deal.Product_Id
&& x.InitializationType == RuleInitializationType.FirstInitialization.ToString());
var productRuleManager = ActivatorUtilities.CreateInstance<ProductRuleManager>(serviceProvider, rules, deal);
var filteredOffersProductConfigs = productRuleManager.ApplyProductRulesToProductConfigurations(
sumManager,
productConfigurations,
out var deletedItems,
out _);
var filteredOffers = productRuleManager.ApplyProductRulesToOffers(
offers,
deletedItems,
filteredOffersProductConfigs);
// Экстракция и сравнение structId из OfferStruct
var originalStructIds = offers.SelectMany(o => o.OfferStructs.Select(s => s.StructId))
.Where(id => id.HasValue)
.Select(id => id.Value)
.Distinct()
.OrderBy(id => id);
var filteredStructIds = filteredOffers.SelectMany(o => o.OfferStructs.Select(s => s.StructId))
.Where(id => id.HasValue)
.Select(id => id.Value)
.Distinct()
.OrderBy(id => id);
if (!filteredStructIds.SequenceEqual(originalStructIds))
{
var difference = originalStructIds.Except(filteredStructIds).Union(filteredStructIds.Except(originalStructIds));
string errorDetails = string.Join(", ", difference);
aggregator.AppendValidationErrors(new ValidationError
{
ModelType = Framework.Entity.Metadata.EntityType.ViewModel,
CriticalLevel = Framework.Entity.Metadata.ValidationCriticalLevel.CantContProc,
ErrorMessage = $"Отфильтрованные офферы не совпадают с исходными по structId: {errorDetails}."
});
}
deal.Proposals = deal.Proposals
.Where(p => p.Offer_Id.HasValue && filteredOffers.Select(x => x.Id).Contains(p.Offer_Id.Value))
.ToList();
}
```
### Объяснение:
1. **Извлечение `structId`:** Используется `SelectMany` чтобы получить коллекцию всех `structId` из `OfferStruct` для каждого `Offer`.
2. **Фильтрация и Сравнение:** Извлекаются `structId`, затем они сравниваются на совпадение.
3. **Разница в `structId`:** Полученная разница в `structId` добавляется в текст ошибки, чтобы её можно было отобразить при возникновении ошибки.