Ejemplo n.º 1
0
        /// <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));
            }
        }