EnergyDayAnalysisService.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. using Microsoft.Extensions.Logging;
  2. using FMSAdmin.Data;
  3. using System.Linq;
  4. using FMSAdmin.Helpers;
  5. using FMSAdmin.Entities;
  6. using Microsoft.EntityFrameworkCore;
  7. using System;
  8. using System.Collections.Generic;
  9. using FMSAdmin.Models.Formula;
  10. using FMSAdmin.Helpers.Formula;
  11. using System.Collections;
  12. using System.Text.RegularExpressions;
  13. using FMSAdmin.Models;
  14. namespace FMSAdmin.Services {
  15. public class EnergyDayAnalysisService {
  16. private readonly ILogger<EnergyDayAnalysisService> _logger;
  17. private readonly FMSContext _context;
  18. private readonly EnergyUsageService _serviceUsage;
  19. public EnergyDayAnalysisService(
  20. ILogger<EnergyDayAnalysisService> logger,
  21. FMSContext context,
  22. EnergyUsageService serviceUsage
  23. ) {
  24. _logger = logger;
  25. _context = context;
  26. _serviceUsage = serviceUsage;
  27. }
  28. public IList<CalculationResult> GetEnergyDailyList(int siteId, EnergyInterval interval, EnergyType type, DateTime startDate, DateTime endDate) {
  29. var dic = _serviceUsage.GetEnergyDailyDic(siteId, interval, type, startDate, endDate);
  30. return dic.Values.ToList();
  31. }
  32. public CalculationValue[] GetMonitoringPointHistoryDaily(int siteId, int facilityCode, int propertyId, DateTime startDate, DateTime endDate) {
  33. var query = _context.BemsMonitoringPointHistoryDaily.Where(x =>
  34. x.SiteId == siteId &&
  35. x.FacilityCode == facilityCode &&
  36. x.PropertyId == propertyId &&
  37. startDate <= x.CreatedDateTime && x.CreatedDateTime <= endDate);
  38. if (query.Any() == false) {
  39. return null;
  40. }
  41. return query.Select(x => new CalculationValue {
  42. DateTime = x.CreatedDateTime,
  43. Value = x.DailyValue
  44. }).ToArray();
  45. }
  46. public CalculationValue[] GetMonitoringPointHistoryMonthly(int siteId, int facilityCode, int propertyId, DateTime startDate, DateTime endDate) {
  47. var groupQuery = from data in _context.BemsMonitoringPointHistoryDaily
  48. where data.SiteId == siteId &&
  49. data.FacilityCode == facilityCode &&
  50. data.PropertyId == propertyId &&
  51. startDate <= data.CreatedDateTime && data.CreatedDateTime <= endDate
  52. group data by new { Year = data.CreatedDateTime.Year, Month = data.CreatedDateTime.Month } into g
  53. // select g;
  54. select new {
  55. Year = g.Key.Year,
  56. Month = g.Key.Month,
  57. SumDailyValue = g.Sum(x => x.DailyValue),
  58. AverageDailyValue = g.Average(x => x.DailyValue)
  59. };
  60. if (groupQuery == null || groupQuery.Any() == false) {
  61. return null;
  62. }
  63. //CalculationValue[] values = { };// = new CalculationValue[groupQuery.ToList().Count()];
  64. CalculationValue[] values = new CalculationValue[groupQuery.ToList().Count()];
  65. var i = 0;
  66. foreach (var g in groupQuery.ToList()) {
  67. double dValue = 0;
  68. if (_CheckPointValueType(siteId, facilityCode, propertyId) == 0) dValue = g.SumDailyValue;
  69. else if (_CheckPointValueType(siteId, facilityCode, propertyId) == 1) dValue = g.AverageDailyValue;
  70. else if (_CheckPointValueType(siteId, facilityCode, propertyId) == 2) {
  71. dValue = g.SumDailyValue;
  72. dValue = (dValue > 0) ? 1 : 0;
  73. }
  74. values[i] = new CalculationValue {
  75. DateTime = new DateTime(g.Year, g.Month, 1),
  76. //Value = g.Sum(x => x.CurrentValue)
  77. Value = dValue
  78. };
  79. i++;
  80. }
  81. return values;
  82. }
  83. private int _CheckPointValueType(int siteId, int facilityCode, int propertyId) {
  84. // return 0 -> 누적, 1 -> 평균, 2 -> On,Off
  85. var Query = from data in _context.BemsMonitoringPoint
  86. where data.SiteId == siteId &&
  87. data.FacilityCode == facilityCode &&
  88. data.PropertyId == propertyId
  89. select data;
  90. if (Query.FirstOrDefault().ValueType == 2) return 2;
  91. if (Query.FirstOrDefault().ValueType == 0 && Query.FirstOrDefault().FuelTypeId > 0) return 0;
  92. if (Query.FirstOrDefault().ValueType == 0 && Query.FirstOrDefault().FuelTypeId == 0) return 1;
  93. return 0;
  94. }
  95. private CalculationValue[] _CreateCalculationValues(DateTime startDate, DateTime endDate, TimeInterval timeIntervalType) {
  96. DateTime datetime = startDate;
  97. int count = _GetCountInTimeRange(startDate, endDate, timeIntervalType);
  98. CalculationValue[] values = new CalculationValue[count];
  99. for (var i = 0; i < values.Length; i++) {
  100. values[i] = new CalculationValue {
  101. DateTime = datetime,
  102. Value = 0
  103. };
  104. _NextTimeFromTimeInterval(ref datetime, timeIntervalType);
  105. }
  106. return values;
  107. }
  108. private int _GetCountInTimeRange(DateTime startDate, DateTime endDate, TimeInterval timeIntervalType) {
  109. TimeSpan ts = endDate - startDate;
  110. switch (timeIntervalType) {
  111. case TimeInterval.QuarterMin:
  112. return (int)ts.TotalMinutes / 15 + 1;
  113. case TimeInterval.Hour:
  114. return (int)ts.TotalHours + 1;
  115. case TimeInterval.Day:
  116. return (int)ts.TotalDays + 1;
  117. case TimeInterval.Month: {
  118. int count = 0;
  119. DateTime date = startDate;
  120. //while (date.Year <= endDate.Year && date.Month <= endDate.Month)
  121. while (date <= endDate) {
  122. count++;
  123. date = date.AddMonths(1);
  124. }
  125. return count;
  126. }
  127. default: // TimeInterval.Year:
  128. {
  129. int count = 0;
  130. DateTime date = startDate;
  131. while (date.Year <= endDate.Year) {
  132. count++;
  133. date = date.AddYears(1);
  134. }
  135. return count;
  136. }
  137. }
  138. }
  139. private void _NextTimeFromTimeInterval(ref DateTime datetime, TimeInterval timeIntervalType) {
  140. switch (timeIntervalType) {
  141. case TimeInterval.QuarterMin:
  142. datetime = datetime.AddMinutes(15);
  143. break;
  144. case TimeInterval.Hour:
  145. datetime = datetime.AddHours(1);
  146. break;
  147. case TimeInterval.Day:
  148. datetime = datetime.AddDays(1);
  149. break;
  150. case TimeInterval.Month:
  151. datetime = datetime.AddMonths(1);
  152. break;
  153. default: // TimeInterval.Year:
  154. datetime = datetime.AddYears(1);
  155. break;
  156. }
  157. }
  158. public void Save(int siteId, int fuelTypeId, int fuelPriceId, int year, int month, int priceTypeId, FmsEnergyAnalysis data) {
  159. var persist = _context.FmsEnergyAnalysis
  160. .Where(x => x.SiteId == siteId && x.FuelTypeId == fuelTypeId && x.FuelPriceId == fuelPriceId && x.Year == year && x.Month == month && x.PriceTypeId == priceTypeId).FirstOrDefault();
  161. if (persist == null) {
  162. data.PriceTypeId = priceTypeId;
  163. data.Year = year;
  164. data.Month = month;
  165. _context.FmsEnergyAnalysis.Add(data);
  166. _context.SaveChanges();
  167. } else {
  168. persist.PriceTypeId = priceTypeId;
  169. persist.Year = year;
  170. persist.Month = month;
  171. persist.Content = data.Content;
  172. _context.FmsEnergyAnalysis.Update(persist);
  173. _context.SaveChanges();
  174. }
  175. }
  176. public IQueryable<FmsEnergyAnalysis> GetAnalysis(int siteId, int fuelTypeId, int fuelPriceId, string year, string month, int priceTypeId) {
  177. var data = _context.FmsEnergyAnalysis.Where(x => x.SiteId == siteId && x.FuelTypeId == fuelTypeId && x.FuelPriceId == fuelPriceId && x.Year == Convert.ToInt32(year) && x.Month == Convert.ToInt32(month) && x.PriceTypeId == priceTypeId);
  178. return data;
  179. }
  180. public IQueryable<FmsEnergyAnalysis> GetAllAnalysis(int siteId, int fuelTypeId, int year, int month) {
  181. var data = _context.FmsEnergyAnalysis.Where(x => x.SiteId == siteId && x.FuelTypeId == fuelTypeId && x.Year == year && x.Month == month);
  182. return data;
  183. }
  184. }
  185. }