/// <summary> /// чтение оплат за электроэнергию /// </summary> /// <returns></returns> private async Task <IList <RawPaymentData> > GetPaymentDatasAsync() { int totalRecords = 0, processedRecords = 0; WorkTask workTask = new("чтение таблиц с данными по оплате") { Status = "подготовка ...", }; this.workTasksProgressViewModel.WorkTasks.Add(workTask); void _(string msg) { workTask.UpdateUI(++processedRecords, totalRecords, message: "таблица " + msg + $"\nзапись {processedRecords:N0} из {totalRecords:N0}", stepNameString: "обработка файла"); } System.Collections.Concurrent.ConcurrentBag <RawPaymentData> list = new(); try { // KARTKVGD - годовая база // KARTKVMN - месячная база string tableFileName = Path.Combine(this.pathDBF, "KARTKVGD.DBF"); void toParse(DbfRecord record) { if (record != null) { list.Add(this.ParsePaymentRecord(record)); _(System.IO.Path.GetFileName(tableFileName)); } } IList <RawPaymentData> result = await this.CheckAndLoadFromCacheAsync <RawPaymentData>(tableFileName, workTask); if (result != null) { workTask.IsIndeterminate = false; workTask.ChildProgress = 0; int total = result.Count; for (int i = 0; i < total; i++) { workTask.ChildProgress = 100d * i / total; list.Add(result[i]); } } else { _(System.IO.Path.GetFileName(tableFileName)); using DBF.DbfReader dbfReader = new DbfReader(tableFileName, System.Text.Encoding.GetEncoding(866), true); { processedRecords = 0; totalRecords = dbfReader.DbfTable.Header.NumberOfRecords; _(System.IO.Path.GetFileName(tableFileName)); dbfReader.ParseRecords(toParse); this.StoreHashAndSaveData(dbfReader.DataBaseFileInfo, workTask, list.ToArray()); } } } catch (IOException ioex) { logger?.Error(ioex, TMPApp.GetExceptionDetails(ioex)); return(null); } catch (Exception ex) { logger?.Error($">>> read PaymentData\n>>>: {TMPApp.GetExceptionDetails(ex)}"); return(null); } return(this.SortData(list, workTask)); }
/// <summary> /// получение замен счётчиков /// </summary> /// <returns></returns> private IList <ChangeOfMeter> GetChangesOfMeters() { string taskName = "таблица замен счётчиков"; Model.WorkTask workTask = new(taskName); this.workTasksProgressViewModel.WorkTasks.Add(workTask); workTask.StartProcessing(); string fileName = Path.Combine(this.dataFilesPath, "ChangesOfMeters" + DATA_FILE_EXTENSION); workTask.UpdateStatus($"загрузка данных из кэша ..."); workTask.IsIndeterminate = true; ChangeOfMeter[] result; result = this.DeserializeDataAsync <ChangeOfMeter>(fileName).Result; if (result != null) { List <ChangeOfMeter> data = new(result); return(this.SortData(data, workTask)); } else { int processedRows = 0; int totalRows = 0; this.dictionaryAssmena = new(); System.Collections.Concurrent.ConcurrentBag <Assmena> tableAssmena = new System.Collections.Concurrent.ConcurrentBag <Assmena>(); Assmena[] assmenas = null; using DBF.DbfReader dbfReader = new DbfReader(Path.Combine(this.pathDBF, "Assmena.DBF"), System.Text.Encoding.GetEncoding(866), skipDeletedRecords: true); { processedRows = 0; totalRows = dbfReader.DbfTable.Header.NumberOfRecords; int currYear = DateTime.Now.Year; workTask.UpdateStatus($"количество строк в таблице: {totalRows:N0}"); tableAssmena = new System.Collections.Concurrent.ConcurrentBag <Assmena>(); void toParse(DbfRecord record) { if (record != null) { tableAssmena.Add(this.ParseAssmenaRecord(record)); workTask.UpdateUI(++processedRows, totalRows, stepNameString: "строка"); workTask.SetProgress(totalRows, processedRows); } } dbfReader.ParseRecords(toParse); workTask.UpdateUI(totalRows, totalRows, stepNameString: "строка"); } assmenas = tableAssmena.ToArray(); workTask.UpdateStatus("анализ полученных данных..."); for (int index = 0; index < assmenas.Length; index++) { if (this.dictionaryAssmena.ContainsKey(assmenas[index].ЛИЦ_СЧЕТ)) { this.dictionaryAssmena[assmenas[index].ЛИЦ_СЧЕТ].Add(assmenas[index]); } else { this.dictionaryAssmena.Add(assmenas[index].ЛИЦ_СЧЕТ, new List <Assmena>(new[] { assmenas[index] })); } } processedRows = 0; totalRows = this.dictionaryAssmena.Count; workTask.UpdateStatus($"количество замен: {totalRows:N0}"); System.Collections.Concurrent.BlockingCollection <ChangeOfMeter> changes = new(); Parallel.ForEach(this.dictionaryAssmena.Values, changeOfMeterRow => { ChangeOfMeter changesOfMeters; if (changeOfMeterRow.Count == 1) { changesOfMeters = this.ParseChangesOfMetersRecord(changeOfMeterRow.First()); changes.Add(changesOfMeters); } else { foreach (Assmena assmena in changeOfMeterRow) { changesOfMeters = this.ParseChangesOfMetersRecord(assmena); if (changesOfMeters != null) { changes.Add(changesOfMeters); } } } workTask.UpdateUI(++processedRows, totalRows); }); changes.CompleteAdding(); workTask.UpdateStatus($"сохранение в кэш..."); workTask.IsIndeterminate = true; _ = this.SerializeDataAsync <ChangeOfMeter>(changes.ToArray(), fileName); // fix workTask.UpdateUI(totalRows, totalRows); return(this.SortData(changes, workTask)); } }