// TODO: remove RPD logs public void SaveDataAsync(IRepository sourceRepo, IEnumerable <IPsnLog> psnLogs, IEnumerable <IFaultLog> rpdLogs, Action <OnCompleteEventArgs> onComplete, Action <OnProgressChangeEventArgs> onProgressChange) { // TODO: save rpdLogs if (!IsOpened) { _uiNotifier.Notify(() => onComplete(new OnCompleteEventArgs(OnCompleteEventArgs.CompleteResult.Error, "Сперва необходимо открыть репозиторий!"))); } else { _backWorker.AddWork( () => { try { var sourceSections = new List <ISection>(); foreach (var locomotive in sourceRepo.Locomotives) { sourceSections.AddRange(locomotive.Sections); } var pLogs = psnLogs.ToList(); int totalProceedCount = 0; double perLogPercent = 0.0; double lastInLogProgress = 0.0; double lastInLogProgressRaw = 0.0; foreach (var psnLog in pLogs) { if (_psnDataInformtationStorage.PsnDataInformations.All(pdi => pdi.Id.ToString() != psnLog.Id.ToString())) { // TODO: плохо конечно, что я работаю с секциями и локомотивами репозитория-источника в фоновом потоке данного репозитория :) // TODO: работать с ними в UI и ждать результата здесь! var sourceSection = sourceSections.First(s => s.Psns.Any(pl => pl.Id.ToString() == psnLog.Id.ToString())); var sourceLocomotive = sourceRepo.Locomotives.First(l => l.Sections.Any(s => s == sourceSection)); //var devInfo = _deviceInformationStorage.DeviceInformations.First(di=>di.parentSection.DeviceInformationId); // Пока у меня нет четкого (уникального) идентификатора устройства, поэтому всё определяет название локомотива и номер секции if (!_deviceInformationStorage.DeviceInformations.Any(di => di.Name == sourceLocomotive.Name && di.Description == sourceSection.Name)) { // если нету описания устройства с такими секцией и локомотивом, то добавим: _deviceInformationStorage.Add(new IdentifierStringToLowerBased(sourceSection.DeviceInformationId.UnicString), sourceLocomotive.Name, sourceSection.Name); } // localDevInfo - необходим для правильного указания deviceInformationId у сохроняемого psnDataInformtation var localDevInfo = _deviceInformationStorage.DeviceInformations.First(di => di.Name == sourceLocomotive.Name && di.Description == sourceSection.Name); double percent1 = perLogPercent; _psnDataStorage.Add( new IdentifierStringToLowerBased(psnLog.Id.UnicString), new StreamReadableDataBasedOnObject(psnLog), progressPercentage => { // still the same thread lastInLogProgressRaw = progressPercentage; var progress = percent1 + progressPercentage / pLogs.Count; lastInLogProgress = progress; _uiNotifier.Notify(() => onProgressChange(new OnProgressChangeEventArgs((int)progress))); }); _psnDataInformtationStorage.Add( new IdentifierStringToLowerBased(psnLog.Id.UnicString), psnLog.BeginTime, psnLog.EndTime, DateTime.Now, new PsnDataFragmentTypeBuilderFromHighLevel(psnLog.LogType).Build(), psnLog.IsLastDeviceLog, localDevInfo.Id); _psnDataCustomConfigurationsStorage.Add( new IdentifierStringToLowerBased(psnLog.Id.UnicString), new IdentifierStringToLowerBased(psnLog.PsnConfiguration.Id.ToString().ToLower()), psnLog.Name); } totalProceedCount++; perLogPercent = totalProceedCount * 100.0 / pLogs.Count; double percent2 = perLogPercent; _uiNotifier.Notify(() => onProgressChange(new OnProgressChangeEventArgs((int)percent2))); } UpdateLocomotivesIfAddedUnsafe(); _uiNotifier.Notify(() => onComplete(new OnCompleteEventArgs(OnCompleteEventArgs.CompleteResult.Ok, "Данные успешно сохранены"))); } catch (Exception ex) { var message = "Ошибка сохранения данных: " + ex.Message; _uiNotifier.Notify(() => onComplete(new OnCompleteEventArgs(OnCompleteEventArgs.CompleteResult.Error, message))); } }); } }
/// <summary> /// Добавляет данные в хранилище /// </summary> /// <param name="psnDataCustomConfigurationId">Идентификатор записи данных</param> /// <param name="psnConfigruationId">Идентификатор пользовательской конфигурации ПСН</param> /// <param name="customLogName">Пользовательское название лога</param> public void Add(IIdentifier psnDataCustomConfigurationId, IIdentifier psnConfigruationId, string customLogName) { _subStorage.Add(psnDataCustomConfigurationId, psnConfigruationId, customLogName); _customConfigs.Add(new PsnDataCustomConfigurationSimple(psnDataCustomConfigurationId, psnConfigruationId, customLogName)); }