public async Task <Consumption> GetAddressConsumptionAsync(int addressKey, int counterTypeKey, int unitKey, DateTime startDate, DateTime endDate) { // default input startdate is first day of month and enddate is last day of month Consumption consumption = new Consumption(); // Get all addressconsumptionRow without the distributionconsumption IQueryable <Consumption> consumptionList = db.Consumption.Where(w => w.iAddressKey == addressKey && !w.bExcludeForReport); // Get only periodconsumption consumptionList = consumptionList.Where(w => w.dtStartDateTime <endDate && w.dtEndDateTime> startDate); // Get only consumption from counterType consumptionList = consumptionList.Where(w => w.Counter.iCounterTypeKey == counterTypeKey); // Get only consumption with the same unit consumptionList = consumptionList.Where(w => w.Counter.iUnitKey == unitKey); // Get only consumption for visible meters consumptionList = consumptionList.Where(w => w.Counter.ConsumptionMeter.bVisibleForCustomers); var list = consumptionList.ToList(); // Get number of days in the input timespan int daysInPeriod = (endDate - startDate).Days + 1; foreach (Consumption item in list) { item.dtEndDateTime = item.dtEndDateTime.Date; item.dtStartDateTime = item.dtStartDateTime.Date; int itemDays = (item.dtEndDateTime - item.dtStartDateTime).Days; // Voer berekening uit als de verbruiksregel over meer dan 1 dag gaat, anders moet het hele verbruik meegenomen worcden. if (itemDays > 0) { if (item.dtStartDateTime <= startDate && item.dtEndDateTime >= endDate) { item.dConsumption = item.dConsumption / itemDays * daysInPeriod; } else if (item.dtStartDateTime <= startDate) { //TimeSpan activeTimeSpan = item.dtEndDateTime.AddDays(1) - PeriodStartDate.Value; TimeSpan activeTimeSpan = item.dtEndDateTime.AddDays(1) - startDate; item.dConsumption = item.dConsumption / itemDays * activeTimeSpan.Days; } else if (item.dtEndDateTime >= endDate) { //TimeSpan activeTimeSpan = PeriodEndDate.Value.AddDays(1) - item.dtStartDateTime; TimeSpan activeTimeSpan = endDate.AddDays(1) - item.dtStartDateTime; item.dConsumption = item.dConsumption / itemDays * activeTimeSpan.Days; } } } consumption.dtStartDateTime = startDate; consumption.dtEndDateTime = endDate; consumption.dConsumption = consumptionList.Count() == 0 ? 0 : list.Sum(sm => sm.dConsumption); consumption.dEndPosition = consumptionList.Count() == 0 ? 0 : list.Max(m => m.dEndPosition); return(await Task.FromResult(consumption)); }
public Task AddConsumption(DateTime dateTime, Counter counter, decimal position) { ServiceRun serviceRun = new ServiceRun { iServiceKey = 3, dtServiceRunStartDate = DateTime.Now }; // Get all Consumption Consumption lastConsumption = db.Consumption.Where(w => w.iCounterKey == counter.iCounterKey).OrderByDescending(o => o.dtEndDateTime).FirstOrDefault(); // Check of datetime is higher than last consumption bool isHigherDateTime = dateTime > lastConsumption.dtEndDateTime; if (isHigherDateTime) { if (position >= lastConsumption.dEndPosition) { var newConsumption = new Consumption { Counter = counter, dtStartDateTime = lastConsumption.dtEndDateTime, dtEndDateTime = dateTime, dEndPosition = position, dConsumption = position - lastConsumption.dEndPosition, iAddressKey = lastConsumption.iAddressKey, bExcludeForReport = counter.ConsumptionMeter.MeterType.sPurchaseOrSale.Contains("Distribution"), bValidated = true, ServiceRun = serviceRun }; db.Consumption.Add(newConsumption); serviceRun.dtServiceRunEndDate = DateTime.Now; serviceRun.iServiceRunStatus = 200; serviceRun.iServiceRunRowsUpdated = 1; serviceRun.sServiceRunMessage = "1 row added."; db.SaveChanges(); return(Task.FromResult(1)); } } return(Task.FromResult(0)); }
public async Task <ServiceRun> UpdateSDSConsuptionMeter(ConsumptionMeter consumptionMeter, ServiceRun serviceRun) { DateTime today = DateTime.Today; // Check if consumptionMeter exists in api if (await smartDataSolution.ConsumptionMeterExists(consumptionMeter.sEANCode)) { if (consumptionMeter.Counters.Count > 0) { // Get first day from api where data is stored DateTime firstDayInApi = smartDataSolution.ConsumptionMeterAvailableFrom(consumptionMeter.sEANCode); if (firstDayInApi != new DateTime()) { foreach (Counter counter in consumptionMeter.Counters) { counter.Consumption = new List <Consumption>(); // Get lastConsumptionRow from database by this Counter Consumption lastConsumption = db.Consumption.Where(w => w.iCounterKey == counter.iCounterKey).OrderByDescending(o => o.dEndPosition).ThenByDescending(t => t.dtEndDateTime).FirstOrDefault(); if (lastConsumption != null) { // SET the first day for getting consumption DateTime firstPickUpDateTime = lastConsumption.dtEndDateTime; if (firstPickUpDateTime >= firstDayInApi) { // Get last date from api where consumption is stored DateTime lastDayInApi = smartDataSolution.LastAvailableDateTime(consumptionMeter.sEANCode); if ((new int[] { 1, 3, 4 }.Contains(counter.iCounterTypeKey) && smartDataSolution.AssetType == "P4Electricity") || (counter.iCounterTypeKey == 2 && smartDataSolution.AssetType == "P4Gas")) { DateTime lastPickUpDateTime = lastDayInApi < today ? lastDayInApi : today; string webResult = smartDataSolution.GetConsumption(consumptionMeter.sEANCode, firstPickUpDateTime, lastPickUpDateTime); if (!string.IsNullOrEmpty(webResult)) { try { JObject resultObject = JObject.Parse(webResult); JArray resultArray = JArray.Parse(resultObject["Payload"].ToString()); foreach (JToken resultToken in resultArray) { Consumption previousConsumption = counter.Consumption.Count > 0 ? counter.Consumption.OrderByDescending(o => o.dEndPosition).ThenByDescending(o => o.dtEndDateTime).FirstOrDefault() : lastConsumption; decimal endPosition = 0; switch (counter.iCounterTypeKey) { case 2: decimal.TryParse(resultToken["R180"].ToString(), out endPosition); break; case 3: decimal.TryParse(resultToken["R181"].ToString(), out endPosition); break; case 4: decimal.TryParse(resultToken["R182"].ToString(), out endPosition); break; } DateTime endPositionDateTime = DateTime.Parse(resultToken["DateTime"].ToString()); // Deal with correctionFactor if (resultToken == resultArray.First) { counter.dCorrectionMutation = counter.dCorrectionMutation != 0 ? counter.dCorrectionMutation : previousConsumption.dEndPosition - endPosition; } else if (endPositionDateTime > previousConsumption.dtEndDateTime) { counter.Consumption.Add(new Consumption { iAddressKey = counter.ConsumptionMeter.iAddressKey.Value, Counter = counter, ServiceRun = serviceRun, dtStartDateTime = previousConsumption.dtEndDateTime, dtEndDateTime = endPositionDateTime, dConsumption = endPosition - previousConsumption.dEndPosition, dEndPosition = endPosition, bExcludeForReport = counter.ConsumptionMeter.MeterType.sPurchaseOrSale.Contains("Distribution"), bValidated = true }); serviceRun.iServiceRunRowsUpdated++; db.Entry(counter).State = EntityState.Modified; } } } catch (Exception e) { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.InternalServerError, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = e.Message, ServiceRun = serviceRun, sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); serviceRun.iServiceRunStatus = 500; } } else { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = string.Format("De API heeft een foutmelding gegeven met startdatum {0} en einddatum {1}", firstPickUpDateTime, lastPickUpDateTime), ServiceRun = serviceRun, sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); serviceRun.iServiceRunStatus = 500; } } else { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = string.Format("Telwerk {0} is geregistreerd met type {1}, maar vanuit de API telt dit telwerk {2}", counter.sCounterCode, counter.CounterType.sCounterTypeDescription, smartDataSolution.AssetType), ServiceRun = serviceRun, sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); serviceRun.iServiceRunStatus = 500; } } else { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = string.Format("Bij telwerk {0} met type {1} kan geen data opgehaald worden voor {2}. Geprobeerd wordt om verbruik op te halen vanaf {3}.", counter.sCounterCode, counter.CounterType.sCounterTypeDescription, firstDayInApi, firstPickUpDateTime), ServiceRun = serviceRun, sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); serviceRun.iServiceRunStatus = 500; } } else { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = string.Format("Bij telwerk {0} met type {1} kan geen laatste verbruiksregel opgehaald worden.", counter.sCounterCode, counter.CounterType.sCounterTypeDescription), ServiceRun = serviceRun, sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); serviceRun.iServiceRunStatus = 500; } } } else { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = "Van deze meter kan geen data opgehaald worden uit de API", ServiceRun = serviceRun, sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); serviceRun.iServiceRunStatus = 500; } } else { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.BadRequest, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = "Bij deze meter zijn op dit moment geen telwerken gevonden", ServiceRun = serviceRun, sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); serviceRun.iServiceRunStatus = 500; } } else { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = "Meter is niet gevonden in de API", ServiceRun = serviceRun, sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); serviceRun.iServiceRunStatus = 500; } return(await Task.FromResult(serviceRun)); }
//public List<MaximumPower> MaximumPowers { get; set; } #endregion #region Methods public async Task <ServiceRun> GetMeterConsumption(int consumptionMeterKey, ServiceRun serviceRun) { ConsumptionMeter consumptionMeter = await db.ConsumptionMeters.Include(i => i.Counters).FirstOrDefaultAsync(f => f.iConsumptionMeterKey == consumptionMeterKey); if (consumptionMeter.Counters.Count == 0) { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = string.Format("Er zijn nog geen telwerken gevonden voor de meter met EANCode {0}", consumptionMeter.sEANCode), sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); return(serviceRun); } DateTime today = DateTime.Today; DateTime authorizedFromDate = _fuduraService.GetAuthorizedDateFrom(consumptionMeter.sEANCode); List <Consumption> consumptionList = new List <Consumption>(); try { foreach (Counter counter in consumptionMeter.Counters.Where(w => !new[] { 11, 14, 15 }.Contains(w.iCounterTypeKey))) { Consumption lastConsumption = db.Consumption.Where(w => w.iCounterKey == counter.iCounterKey).OrderByDescending(o => o.dtEndDateTime).ThenByDescending(t => t.dEndPosition).FirstOrDefault(); if (lastConsumption == null) { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = string.Format("Voor telwerk {0} is geen verbruiksregel geregistreerd.", counter.sCounterCode), sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); return(serviceRun); } // Wat is de laatste datum in db van het verbruik DateTime firstPickUpDay = lastConsumption.dtEndDateTime; if (firstPickUpDay < authorizedFromDate) { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = string.Format("Meter {0} is geauthorizeerd vanaf {1} en er wordt geprobeerd data op te halen vanaf {2}.", consumptionMeter.sEANCode, authorizedFromDate.Date, firstPickUpDay.Date), sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); return(serviceRun); } // Haal de laatste beschikbare datum op uit de webservice DateTime lastAvailableData = _fuduraService.GetLastAvailableData(consumptionMeter.sEANCode); // Check of onze db meter hetzelfde meet als de meter uit de api switch (counter.iCounterTypeKey) { case 1: // Check of ws ook Elektra meet if (_fuduraService.ProductType != "E") { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = string.Format("Vanuit Database verwachten we bij teller {1} voor elektra en we krijgen nu een meter die {0} meet.", _fuduraService.ProductType, counter.iCounterKey), sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); return(serviceRun); } break; case 2: // Check of ws ook Gas meet if (_fuduraService.ProductType != "G") { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = string.Format("Vanuit Database verwachten we bij teller {1} voor gas en we krijgen nu een meter die {0} meet.", _fuduraService.ProductType, counter.iCounterKey), sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); return(serviceRun); } break; case 3: // Check of ws ook Elektra meet if (_fuduraService.ProductType != "E") { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = string.Format("Vanuit Database verwachten we bij teller {1} voor elektra en we krijgen nu een meter die {0} meet.", _fuduraService.ProductType, counter.iCounterKey), sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); return(serviceRun); } break; case 4: // Check of ws ook Elektra meet if (_fuduraService.ProductType != "E") { serviceRun.ServiceRunErrors.Add(new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = (int)HttpStatusCode.NotFound, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = string.Format("Vanuit Database verwachten we bij teller {1} voor elektra en we krijgen nu een meter die {0} meet.", _fuduraService.ProductType, counter.iCounterKey), sProjectNumber = consumptionMeter.Address.Project.ProjectBase.sProjectCode }); return(serviceRun); } break; } // Check tot welke datum opgehaald moet worden (vandaag of laatste registratiedatum) DateTime lastPickUpDateTime = lastAvailableData < today ? lastAvailableData : today.Date; TimeSpan timeSpan = lastPickUpDateTime - firstPickUpDay; DateTime consumptionStart = firstPickUpDay; for (int i = 0; i <= timeSpan.Days; i++) { //DateTime pickUpDay = firstPickUpDay.AddDays(i); DateTime pickUpDay = consumptionStart; decimal usage = 0; DateTime consumptionDateTime = pickUpDay.Date; string resultString = _fuduraService.GetTimeSeries(consumptionMeter.sEANCode, consumptionDateTime); if (!string.IsNullOrEmpty(resultString)) { JArray jsonArray = JArray.Parse(resultString); bool saveConsumption = false; foreach (JToken consumption in jsonArray) { //Voeg pas verbruik toe als de datum hoger is dan laatste datum in db if (consumptionDateTime >= pickUpDay) { saveConsumption = true; switch (counter.iCounterTypeKey) { case 3: usage = usage + decimal.Parse(consumption["ReadingL"].ToString()); break; default: usage = usage + decimal.Parse(consumption["ReadingN"].ToString()); break; } } consumptionDateTime = DateTime.Parse(consumption["Timestamp"].ToString()); } Consumption previousConsumption = consumptionList.Where(w => w.Counter == counter).OrderByDescending(o => o.dtEndDateTime).FirstOrDefault() != null?consumptionList.Where(w => w.Counter == counter).OrderByDescending(o => o.dtEndDateTime).FirstOrDefault() : lastConsumption; Consumption newConsumption = new Consumption { iAddressKey = counter.ConsumptionMeter.iAddressKey.Value, Counter = counter, ServiceRun = serviceRun, dtStartDateTime = consumptionStart, dtEndDateTime = consumptionDateTime, dConsumption = usage, dEndPosition = previousConsumption.dEndPosition + usage, bExcludeForReport = counter.ConsumptionMeter.MeterType.sPurchaseOrSale.Contains("Distribution"), bValidated = true }; if (saveConsumption) { consumptionList.Add(newConsumption); } consumptionStart = consumptionDateTime; } consumptionStart = consumptionStart.AddDays(1).Date; } // End of for all days } // End of foreach counter serviceRun.iServiceRunRowsUpdated += consumptionList.Count; db.Consumption.AddRange(consumptionList); await db.SaveChangesAsync(); return(await Task.FromResult(serviceRun)); } catch (Exception e) { ServiceRunError error = new ServiceRunError { dtEffectiveDateTime = DateTime.UtcNow, iStatusCode = 500, sConsumptionMeterNumber = consumptionMeter.sConsumptionMeterNumber, sErrorMessage = e.Message, ServiceRun = serviceRun }; serviceRun.ServiceRunErrors.Add(error); serviceRun.iServiceRunStatus = 500; return(await Task.FromResult(serviceRun)); } // Loop elk telwerk af }
// Get all Consumption From SDS Api en save it in the database public async Task GetSDSConsumption() { while (true) { Service service = db.Services.Find(1); // Maak een nieuwe serviceRun aan ServiceRun serviceRun = new ServiceRun { iServiceKey = service.iServiceKey, dtServiceRunStartDate = DateTime.UtcNow, ServiceRunErrors = new List <ServiceRunError>() }; // Maak een lege lijst aan waarin vervolgens het verbruik in gestopt kan worden List <Consumption> consumptionList = new List <Consumption>(); // Deze Hashset lijst wordt gebruikt om het al aanwezige verbruik toe te voege HashSet <Consumption> existedConsumptionList = new HashSet <Consumption>(); try { // Pak de huidige datum DateTime today = DateTime.Now; // Haal alle meters en telwerken op van de meters van SDS die aan een adres gekoppeld zijn. var currentConsumptionMeters = db.ConsumptionMeters .Include(i => i.Counters) .Where(w => w.iConsumptionMeterSupplierKey == 1 && w.iAddressKey != null).ToList(); //Draai een loop af voor elke meter foreach (ConsumptionMeter meter in currentConsumptionMeters) //foreach (ConsumptionMeter meter in currentConsumptionMeters) { // Check of consumptionMeter exist in API SmartDataSolution _sds = new SmartDataSolution(); if (await _sds.ConsumptionMeterExists(meter.sEANCode)) { // Check of de meter ook telwerken heeft if (meter.Counters.Count == 0) { throw new Exception(string.Format("Er zijn nog geen telwerken gevonden voor de meter met EANCode {0}", meter.sEANCode)); } // Haal de eerste beschikbare datum op van de meter DateTime dataAvailableFromDate = GetSDSConsumptionMeterAvailableFrom(meter.sEANCode); if (dataAvailableFromDate != new DateTime()) { // Loop elk telwerk af foreach (Counter counter in meter.Counters.Where(w => new int[] { 2, 3, 4 }.Contains(w.iCounterTypeKey))) { Consumption lastConsumption = db.Consumption.Where(w => w.iCounterKey == counter.iCounterKey).OrderByDescending(o => o.dtEndDateTime).ThenByDescending(t => t.dEndPosition).FirstOrDefault(); if (lastConsumption == null) { throw new Exception(string.Format("Voor telwerk {0} is geen verbruiksregel geregistreerd.", string.Join(", ", counter.sCounterCode))); } // Voeg de regel toe aan de HashSet existedConsumptionList.Add(lastConsumption); // Wat is de laatste datum van het verbruik DateTime firstPickUpDay = lastConsumption.dtEndDateTime; if (firstPickUpDay < dataAvailableFromDate) { throw new Exception(string.Format("Meter {0} is geauthorizeerd vanaf {1} en er wordt geprobeerd data op te halen vanaf {2}.", meter.sEANCode, dataAvailableFromDate.Date, firstPickUpDay.Date)); } // Haal laatst beschikbare datum op uit de webservice DateTime lastAvailableData = GetSDSLastAvailableData(meter.sEANCode); switch (counter.iCounterTypeKey) { case 1: //Check of ws ook elektra meet if (AssetType != "P4Electricity") { throw new Exception(string.Format("Vanuit Database verwachten we bij teller {1} voor elektra en we krijgen nu een meter die {0} meet.", AssetType, counter.iCounterKey)); } break; case 2: //Check of ws ook gas meet if (AssetType != "P4Gas") { throw new Exception(string.Format("Vanuit Database verwachten we bij teller {1} voor elektra en we krijgen nu een meter die {0} meet.", AssetType, counter.iCounterKey)); } break; case 3: //Check of ws ook elektra meet if (AssetType != "P4Electricity") { throw new Exception(string.Format("Vanuit Database verwachten we bij teller {1} voor elektra en we krijgen nu een meter die {0} meet.", AssetType, counter.iCounterKey)); } break; case 4: //Check of ws ook elektra meet if (AssetType != "P4Electricity") { throw new Exception(string.Format("Vanuit Database verwachten we bij teller {1} voor elektra en we krijgen nu een meter die {0} meet.", AssetType, counter.iCounterKey)); } break; } // Check tot welke datum opgehaald moet worden (vandaag of laatste registratiedatum) DateTime lastPickUpDateTime = lastAvailableData < today ? lastAvailableData : today.Date; TimeSpan timeSpan = lastPickUpDateTime - firstPickUpDay; string urlConsumption = string.Format("{0}readings/Identifier/{1}/Day/{2}?apikey={3}&dateto={4}&datetimeformat=nl&format=json&source=day", apiSDSEndPoint, meter.sEANCode, firstPickUpDay.ToString("yyyy-MM-dd"), SDSApiKey, lastPickUpDateTime.ToString("yyyy-MM-dd")); try { WebClient client = new WebClient { Encoding = Encoding.UTF8 }; string resultString = client.DownloadString(urlConsumption); JObject resultObject = JObject.Parse(resultString); JArray jsonArray = JArray.Parse(resultObject["Payload"].ToString()); foreach (JToken consumption in jsonArray) { Consumption previousConsumption = consumptionList.Where(w => w.Counter == counter).OrderByDescending(o => o.dtEndDateTime).FirstOrDefault() != null?consumptionList.Where(w => w.Counter == counter).OrderByDescending(o => o.dtEndDateTime).FirstOrDefault() : existedConsumptionList.Where(w => w.Counter == counter).OrderByDescending(o => o.dtEndDateTime).FirstOrDefault(); decimal ApiEndPosition = 0; switch (counter.iCounterTypeKey) { case 2: ApiEndPosition = decimal.Parse(consumption["R180"].ToString()); break; case 3: ApiEndPosition = decimal.Parse(consumption["R181"].ToString()); break; case 4: ApiEndPosition = decimal.Parse(consumption["R182"].ToString()); break; default: break; } DateTime consumptionDateTime = DateTime.Parse(consumption["DateTime"].ToString()); // Set the correctionfactor if (consumption == jsonArray.First) { counter.dCorrectionMutation = counter.dCorrectionMutation != 0 ? counter.dCorrectionMutation : previousConsumption.dEndPosition - ApiEndPosition; } else if (consumptionDateTime > previousConsumption.dtEndDateTime) { // Set correctionEndPosition ApiEndPosition = ApiEndPosition + counter.dCorrectionMutation; Consumption newConsumption = new Consumption { iAddressKey = counter.ConsumptionMeter.iAddressKey.Value, Counter = counter, ServiceRun = serviceRun, dtStartDateTime = previousConsumption.dtEndDateTime, dtEndDateTime = consumptionDateTime, dConsumption = ApiEndPosition - previousConsumption.dEndPosition, dEndPosition = ApiEndPosition, bExcludeForReport = counter.ConsumptionMeter.MeterType.sPurchaseOrSale.Contains("Distribution"), bValidated = true }; consumptionList.Add(newConsumption); } } } catch (Exception e) { ServiceRunError error = new ServiceRunError { dtEffectiveDateTime = DateTime.Now, iStatusCode = 500, sConsumptionMeterNumber = counter.ConsumptionMeter.sConsumptionMeterNumber, sErrorMessage = e.Message, ServiceRun = serviceRun }; serviceRun.ServiceRunErrors.Add(error); serviceRun.iServiceRunStatus = 500; } } // End of foreach counter } else { ServiceRunError error = new ServiceRunError { ServiceRun = serviceRun, dtEffectiveDateTime = DateTime.Now, iStatusCode = 500, sConsumptionMeterNumber = meter.sConsumptionMeterNumber, sErrorMessage = "Er kan geen data uit de API gelezen worden voor de meter" }; serviceRun.ServiceRunErrors.Add(error); serviceRun.iServiceRunStatus = 500; } } else { ServiceRunError serviceRunError = new ServiceRunError { iStatusCode = 500, sErrorMessage = string.Format("Meter met EAN-Code {0} kan niet gevonden worden in de API", meter.sEANCode), sConsumptionMeterNumber = meter.sConsumptionMeterNumber, ServiceRun = serviceRun, }; serviceRun.ServiceRunErrors.Add(serviceRunError); serviceRun.iServiceRunStatus = 500; } } // End of foreach meter //Voeg de hele lijst toe aan de database db.Consumption.AddRange(consumptionList); int rowsAdded = db.ChangeTracker.Entries().Count(c => c.State == EntityState.Added); serviceRun.dtServiceRunEndDate = DateTime.UtcNow; serviceRun.sServiceRunMessage = rowsAdded + " row(s) updated."; serviceRun.iServiceRunRowsUpdated = rowsAdded; serviceRun.iServiceRunStatus = serviceRun.iServiceRunStatus == 500 ? 500 : 200; if (rowsAdded > 0) { db.ServiceRuns.Add(serviceRun); } db.SaveChanges(); currentConsumptionMeters.Clear(); //Check invoeren over saldo van afgelopen dag/maand zelfde als ws if (today.Day == 1) { //Checks invoeren } DateTime now = DateTime.Now; DateTime startDate = now.AddDays(1).Date.AddHours(5); service.dtNextServiceRun = TimeZoneInfo.ConvertTimeToUtc(startDate, TimeZoneInfo.Local); db.Entry(service).State = EntityState.Modified; db.SaveChanges(); TimeSpan interval = startDate - now; await Task.Delay(interval); } catch (Exception e) { serviceRun.dtServiceRunEndDate = DateTime.UtcNow; serviceRun.sServiceRunMessage = e.Message; serviceRun.iServiceRunStatus = 500; serviceRun.iServiceRunRowsUpdated = 0; // Verwijder de lijst als aanpassingen hebben plaatsgevonden if (db.ChangeTracker.HasChanges()) { db.Consumption.RemoveRange(consumptionList); } db.ServiceRuns.Add(serviceRun); db.SaveChanges(); DateTime now = DateTime.Now; DateTime startDate = now.AddDays(1).Date.AddHours(5); service.dtNextServiceRun = TimeZoneInfo.ConvertTimeToUtc(startDate, TimeZoneInfo.Local); db.Entry(service).State = EntityState.Modified; db.SaveChanges(); TimeSpan interval = startDate - now; await Task.Delay(interval); } } }