public void Reload() { var unitOfWork = _container.Resolve <IModelsStore>().UnitOfWork; Blocks = unitOfWork.Repository <ProductBlock>().GetAll(); SalesUnitsCalculationsDictionary.Clear(); //завершенные расчеты ПЗ, упорядоченные по дате завершения var priceCalculationsFinished = unitOfWork.Repository <PriceCalculation>() .Find(priceCalculation => priceCalculation.TaskCloseMoment.HasValue) .OrderBy(priceCalculation => priceCalculation.TaskCloseMoment) .ToList(); //завершенные айтемы расчетов ПЗ var priceCalculationItemsFinished = priceCalculationsFinished .SelectMany(priceCalculation => priceCalculation.PriceCalculationItems) .Distinct() .ToList(); //формирование словарей прайсов по калькуляции var salesUnits = priceCalculationsFinished .SelectMany(priceCalculation => priceCalculation.PriceCalculationItems) .SelectMany(priceCalculationItem => priceCalculationItem.SalesUnits) .Distinct(); foreach (var salesUnit in salesUnits) { var priceItems = priceCalculationItemsFinished .Where(calculationItem => calculationItem.SalesUnits.ContainsById(salesUnit)) .Select(item => new PriceItem(priceCalculationsFinished.Single(calculation => calculation.PriceCalculationItems.Contains(item)), item)); SalesUnitsCalculationsDictionary.Add(salesUnit.Id, new PriceItems(priceItems)); } LaborHoursList = unitOfWork.Repository <LaborHours>().GetAll(); LaborHourCosts = unitOfWork.Repository <LaborHourCost>().GetAll(); }
public PriceService(IUnityContainer container) { _container = container; //синхронизация завершения расчетов container.Resolve <IEventAggregator>().GetEvent <AfterFinishPriceCalculationEvent>().Subscribe( calculation => { //добавляем только данные из завершенных расчетов if (!calculation.TaskCloseMoment.HasValue) { return; } foreach (var priceCalculationItem in calculation.PriceCalculationItems) { foreach (var salesUnit in priceCalculationItem.SalesUnits) { var priceItem = new PriceItem(calculation, priceCalculationItem); if (SalesUnitsCalculationsDictionary.ContainsKey(salesUnit.Id)) { SalesUnitsCalculationsDictionary[salesUnit.Id].Add(priceItem); } else { SalesUnitsCalculationsDictionary.Add(salesUnit.Id, new PriceItems(new[] { priceItem })); } } } }); //синхронизация остановки расчетов container.Resolve <IEventAggregator>().GetEvent <AfterStopPriceCalculationEvent>().Subscribe( calculation => { if (calculation.TaskCloseMoment.HasValue) { return; } foreach (var priceCalculationItem in calculation.PriceCalculationItems) { foreach (var salesUnit in priceCalculationItem.SalesUnits) { if (SalesUnitsCalculationsDictionary.ContainsKey(salesUnit.Id)) { var priceItems = SalesUnitsCalculationsDictionary[salesUnit.Id]; if (priceItems.Remove(priceCalculationItem) && priceItems.IsEmpty) { SalesUnitsCalculationsDictionary.Remove(salesUnit.Id); } } } } }); _container.Resolve <IModelsStore>().IsRefreshed += Reload; Reload(); }
public double?GetPriceByCalculations(IUnit unit) { return(SalesUnitsCalculationsDictionary.ContainsKey(unit.Id) ? SalesUnitsCalculationsDictionary[unit.Id].Price : null); }