Exemple #1
0
        /// <summary>
        /// Чтение данных из файла и запись в БД Амур через REST сервис.
        /// </summary>
        /// <param name="filePath">Путь к файлу.</param>
        /// <param name="client">REST</param>
        /// <returns></returns>
        public static async Task <int> Import(HttpClient client, string filePath, FileType dataFileType)
        {
            // PARSE

            List <Data> datas = Parse(filePath, dataFileType);

            // GET UTC OFFSET

            SiteAttributeValue sav = await SiteAttributesAPI.GetByFilterAsync(client, new SiteAttribute
                                                                              { DateS = DateTime.Today, SiteAttributeTypeId = (int)EnumSiteAttrType.UTCOffset, SiteId = SITE_ID_BPISTAC });

            if (sav == null)
            {
                throw new Exception($"Отсутствует UTCOffset для сайта id={SITE_ID_BPISTAC}.");
            }
            int utcOffset = int.Parse(sav.Value);

            // GET Sample attributes
            Site parentSite = await SitesAPI.GetByIdAsync(client, SITE_ID_BPISTAC);

            List <Site> sampleSites = await GetSampleSites(client, parentSite, utcOffset, datas.Select(x => x.PointName).Distinct());

            List <DeviceItem> deviceItems = await GetDeviceItems(client, _deviceNames);

            List <Sample> samples = await GetSamples(client, sampleSites, datas);

            List <SampleDeviceItem> sampleDeviceItems = await GetSampleDeviceItems(client, deviceItems, samples);

            // PREPARE CATALOG BUFFER

            List <Catalog> catalogs = await CatalogsAPI.GetByFilterAsync(client, new CatalogFilter { Sites = sampleSites.Select(x => x.Id).ToList() });

            // INSERT DATA
            int itemsCount     = 0;
            int bufItemsLength = 50000;

            for (int i = 0; i < datas.Count; i++)
            {
                Data data = datas[i];

                if (_amurVars.Count != datas[i].Values.Count)
                {
                    throw new Exception("(_amurVars.Count != datas[i].Values.Count)");
                }

                // GET SAMPLE_DEVICE_ITEM

                int siteId;
                {
                    IEnumerable <Site> sites1 = sampleSites.Where(x => x.Name.ToUpper() == data.PointName.Trim().ToUpper());
                    if (sites1.Count() != 1)
                    {
                        throw new Exception("(sites.Count() != 1)");
                    }
                    siteId = sites1.ElementAt(0).Id;
                }
                int sampleId;
                {
                    IEnumerable <Sample> samples1 = samples.Where(x => x.SiteId == siteId && x.SampleNum == data.SampleNum);
                    if (samples1.Count() != 1)
                    {
                        throw new Exception("(samples1.Count() != 1)");
                    }
                    sampleId = samples1.ElementAt(0).Id;
                }

                for (int iVar = 0; iVar < _amurVars.Count;)
                {
                    // GET SAMPLE DEVICE ITEM
                    int sampleDeviceItemId;
                    {
                        IEnumerable <SampleDeviceItem> sampleDeviceItems1 = sampleDeviceItems.Where(x =>
                                                                                                    x.SampleId == sampleId &&
                                                                                                    x.DeviceItemId == deviceItems[_varXdev[iVar]].Id
                                                                                                    );
                        if (sampleDeviceItems1.Count() != 1)
                        {
                            throw new Exception("(sampleDeviceItems1.Count() != 1)");
                        }
                        sampleDeviceItemId = sampleDeviceItems1.ElementAt(0).Id;
                    }

                    // GET or CREATE CATALOGS FOR VARIABLE

                    Catalog catalog = new Catalog
                    {
                        MethodId     = (int)EnumMethod.ObservationInSitu,
                        ParentId     = null,
                        SiteId       = siteId,
                        SourceId     = SOURCE_ID_PGI,
                        VariableId   = _amurVars[iVar][0],
                        ValueTypeId  = _amurVars[iVar][1],
                        OffsetTypeId = (int)EnumOffsetType.Sample,
                        OffsetValue  = sampleDeviceItemId
                    };

                    List <Catalog> catalogs1 = catalogs.FindAll(x =>
                                                                x.MethodId == catalog.MethodId &&
                                                                !x.ParentId.HasValue &&
                                                                x.SiteId == catalog.SiteId &&
                                                                x.SourceId == catalog.SourceId &&
                                                                x.VariableId == catalog.VariableId &&
                                                                x.ValueTypeId == catalog.ValueTypeId &&
                                                                x.OffsetTypeId == catalog.OffsetTypeId &&
                                                                x.OffsetValue == catalog.OffsetValue
                                                                );

                    if (catalogs1.Count == 0)
                    {
                        catalog.Id = await CatalogsAPI.CreateAsync(client, catalog);

                        catalogs.Add(catalog);
                    }
                    else if (catalogs1.Count == 1)
                    {
                        catalog = catalogs1[0];
                    }
                    else
                    {
                        throw new Exception($"(catalogs1.Count = {catalogs1.Count })");
                    }


                    // CONVERT DATA 2 AMUR DATAVALUES
                    List <DataValue> bufDatas = new List <DataValue>(bufItemsLength);
                    for (int k = 0; k < bufItemsLength; k++)
                    {
                        if (iVar < datas[i].Values.Count)
                        {
                            bufDatas.Add(new DataValue()
                            {
                                CatalogId  = catalog.Id,
                                Date       = data.Date,
                                DateTypeId = (int)EnumDateType.LOC,
                                UTCOffset  = utcOffset,
                                Value      = data.Values[iVar],
                                FlagAQC    = (byte)EnumFlagAQC.NoAQC
                            });
                            iVar++;
                            itemsCount++;
                        }
                    }

                    // INSERT DATAVALUES BUF
                    Console.WriteLine($"Insert data buf ({bufDatas.Count} elements)...");
                    //////await DataValuesAPI.Insert(client, bufDatas);
                }
            }
            return(itemsCount);
        }
Exemple #2
0
        static int InsertData(HttpClient client, List <Data> datas)
        {
            int bufItemsLength = 1000;
            int itemsCount     = 0;

            for (int i = 0; i < datas.Count; i++)
            {
                if (datas[i].Varoff == null)
                {
                    continue;
                }

                Site site = datas[i].Site;

                // GET UTC OFFSET

                SiteAttributeValue sav = SiteAttributesAPI.GetByFilterAsync(client, new SiteAttribute
                {
                    DateS = DateTime.Today, SiteAttributeTypeId = (int)EnumSiteAttrType.UTCOffset, SiteId = site.Id
                })
                                         .Result;
                if (sav == null)
                {
                    throw new Exception($"Отсутствует UTCOffset для сайта [{site.Name}] ({site.Id}).");
                }
                int siteUTCOffset = int.Parse(sav.Value);

                // GET or CREATE CATALOG

                List <Catalog> catalogs = CatalogsAPI.GetByFilterAsync(client, new CatalogFilter
                {
                    Sites = new List <int> {
                        site.Id
                    },
                    Variables = new List <int> {
                        datas[i].Varoff.VariableId
                    }
                }).Result;
                if (catalogs.Count > 1)
                {
                    throw new Exception("(catalogs.Count > 1)");
                }

                int catalogId;
                if (catalogs.Count == 0)
                {
                    Catalog catalog = new Catalog
                    {
                        SiteId      = site.Id,
                        VariableId  = datas[i].Varoff.VariableId * (datas[i].Varoff.VariableId < 0 ? -1 : 1),
                        ValueTypeId = (int)EnumValueType.FieldObservation,
                        MethodId    = (int)EnumMethod.ObservationInSitu,
                        SourceId    = FileSite.EMERCIT_ORG_ID,

                        OffsetTypeId = datas[i].Varoff.OffsetTypeId,
                        OffsetValue  = datas[i].Varoff.OffsetValue,

                        ParentId = 0
                    };
                    catalogId = CatalogsAPI.CreateAsync(client, catalog).Result;
                }
                else
                {
                    catalogId = catalogs[0].Id;
                }

                for (int j = 0; j < datas[i].DateValues.Count;)
                {
                    // CONVERT DATA 2 AMUR DATAVALUES
                    List <DataValue> bufDatas = new List <DataValue>(bufItemsLength);
                    for (int k = 0; k < bufItemsLength; k++)
                    {
                        if (j < datas[i].DateValues.Count)
                        {
                            bufDatas.Add(new DataValue()
                            {
                                CatalogId  = catalogId,
                                Date       = datas[i].DateValues[j].Date,
                                DateTypeId = (int)EnumDateType.LOC,
                                UTCOffset  = siteUTCOffset,
                                Value      = datas[i].DateValues[j].Value,
                                FlagAQC    = (byte)EnumFlagAQC.NoAQC
                            });
                            j++;
                            itemsCount++;
                        }
                    }

                    // INSERT DATAVALUES BUF

                    Console.WriteLine($"Insert {bufDatas.Count} elements from data buf. Total inserted {itemsCount} of {datas[i].DateValues.Count}.");

                    DataValuesAPI.InsertAsync(client, bufDatas);
                }
            }

            return(itemsCount);
        }