MonthlyReportDataController.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. using System;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using FMSAdmin.Data;
  5. using FMSAdmin.Models;
  6. using FMSAdmin.Entities;
  7. using FMSApp.Services;
  8. using Microsoft.AspNetCore.Mvc;
  9. using Microsoft.Extensions.Logging;
  10. using Microsoft.AspNetCore.Authorization;
  11. using FMSAdmin.Helpers;
  12. using System.Data;
  13. using System.IO;
  14. using OfficeOpenXml;
  15. using System.Text;
  16. using System.Collections.Generic;
  17. using System.Collections;
  18. namespace FMSAdmin.Controllers {
  19. [ApiController]
  20. [ApiVersion("1")]
  21. [Route("api/[controller]")]
  22. public class MonthlyReportDataController : Controller {
  23. private readonly ILogger<MonthlyReportDataController> _logger;
  24. private readonly MonthlyReportService _service;
  25. private readonly FMSContext _context;
  26. private readonly StorageHelper _storage;
  27. public MonthlyReportDataController(
  28. ILogger<MonthlyReportDataController> logger,
  29. MonthlyReportService service,
  30. FMSContext context,
  31. StorageHelper storage
  32. ) {
  33. _logger = logger;
  34. _service = service;
  35. _context = context;
  36. _storage = storage;
  37. }
  38. /// <summary>
  39. // 법정검사
  40. /// </summary>
  41. [HttpGet("[action]")]
  42. public IActionResult LegalExamination(int siteId, int year, int month) {
  43. var site = _context.CmSite.Where(x => x.SiteId == siteId).FirstOrDefault();
  44. if (site == null) {
  45. return BadRequest("사이트가 없습니다.");
  46. }
  47. DataTable legalExamination = _service.GetLegalExamination(siteId, new DateTime(year, month, 1));
  48. return Ok(new {
  49. Site = new {
  50. site.SiteId,
  51. site.Name,
  52. },
  53. LegalExamination = legalExamination,
  54. });
  55. }
  56. /// <summary>
  57. /// 기온변동현황
  58. /// </summary>
  59. [HttpGet("[action]")]
  60. public IActionResult CurrentTempHumidity(int siteId, int year, int month) {
  61. var site = _context.CmSite.Where(x => x.SiteId == siteId).FirstOrDefault();
  62. if (site == null) {
  63. return BadRequest("사이트가 없습니다.");
  64. }
  65. Func<int, int, (Hashtable, IQueryable<dynamic>)> maxTemp = (int y, int m) => {
  66. Hashtable table = new Hashtable();
  67. table["Year"] = y;
  68. var query = from x in _context.SiteWeatherInfo
  69. where x.CurrentTemp != null
  70. && x.Sido == site.ApiSido && x.Sigun == site.ApiSigun
  71. && x.BaseTime.Hour >= 9 && x.BaseTime.Hour <= 18
  72. && x.BaseTime.Month == m && x.BaseTime.Year == y
  73. group x by x.BaseTime.Date into g
  74. select new {
  75. Day = g.Key.Day,
  76. Year = g.Key.Year,
  77. Temp = g.Max(x => x.CurrentTemp),
  78. };
  79. foreach (var item in query) {
  80. table["Day" + item.Day] = item.Temp;
  81. }
  82. table["Avg"] = Math.Round(query.Average(x => x.Temp) ?? 0, 2);
  83. var lastday = DateTime.DaysInMonth(y, m);
  84. for (var i = 0; i < lastday; i++) {
  85. if (table["Day" + (i + 1)] == null) {
  86. table["Day" + (i + 1)] = "-";
  87. }
  88. }
  89. if (lastday < 31) {
  90. for (var i = 0; i < 31 - lastday; i++) {
  91. table["Day" + (lastday + i + 1)] = "";
  92. }
  93. }
  94. return (table, query);
  95. };
  96. Func<int, int, (Hashtable, IQueryable<dynamic>)> minTemp = (int y, int m) => {
  97. Hashtable table = new Hashtable();
  98. table["Year"] = y;
  99. var query = from x in _context.SiteWeatherInfo
  100. where x.CurrentTemp != null
  101. && x.Sido == site.ApiSido && x.Sigun == site.ApiSigun
  102. && x.BaseTime.Hour >= 9 && x.BaseTime.Hour <= 18
  103. && x.BaseTime.Month == m && x.BaseTime.Year == y
  104. group x by x.BaseTime.Date into g
  105. select new {
  106. Day = g.Key.Day,
  107. Year = g.Key.Year,
  108. Temp = g.Min(x => x.CurrentTemp),
  109. };
  110. foreach (var item in query) {
  111. table["Day" + item.Day] = item.Temp;
  112. }
  113. table["Avg"] = Math.Round(query.Average(x => x.Temp) ?? 0, 2);
  114. var lastday = DateTime.DaysInMonth(y, m);
  115. for (var i = 0; i < lastday; i++) {
  116. if (table["Day" + (i + 1)] == null) {
  117. table["Day" + (i + 1)] = "-";
  118. }
  119. }
  120. if (lastday < 31) {
  121. for (var i = 0; i < 31 - lastday; i++) {
  122. table["Day" + (lastday + i + 1)] = "";
  123. }
  124. }
  125. return (table, query);
  126. };
  127. Func<int, int, (Hashtable, IQueryable<dynamic>)> avgHumi = (int y, int m) => {
  128. Hashtable table = new Hashtable();
  129. table["Year"] = y;
  130. var query = from x in _context.SiteWeatherInfo
  131. where x.Humidity != null
  132. && x.Sido == site.ApiSido && x.Sigun == site.ApiSigun
  133. && x.BaseTime.Hour >= 9 && x.BaseTime.Hour <= 18
  134. && x.BaseTime.Month == m && x.BaseTime.Year == y
  135. group x by x.BaseTime.Date into g
  136. select new {
  137. Day = g.Key.Day,
  138. Year = g.Key.Year,
  139. Humidity = g.Average(x => x.Humidity),
  140. };
  141. foreach (var item in query) {
  142. table["Day" + item.Day] = Math.Round(item.Humidity ?? 0, 2);
  143. }
  144. table["Avg"] = Math.Round(query.Average(x => x.Humidity) ?? 0, 2);
  145. var lastday = DateTime.DaysInMonth(y, m);
  146. for (var i = 0; i < lastday; i++) {
  147. if (table["Day" + (i + 1)] == null) {
  148. table["Day" + (i + 1)] = "-";
  149. }
  150. }
  151. if (lastday < 31) {
  152. for (var i = 0; i < 31 - lastday; i++) {
  153. table["Day" + (lastday + i + 1)] = "";
  154. }
  155. }
  156. return (table, query);
  157. };
  158. var (maxTempMap1, maxTempRaw1) = maxTemp(year - 1, month);
  159. var (maxTempMap2, maxTempRaw2) = maxTemp(year, month);
  160. var (minTempMap1, minTempRaw1) = minTemp(year - 1, month);
  161. var (minTempMap2, minTempRaw2) = minTemp(year, month);
  162. var (avgHumiMap1, avgHumiRaw1) = avgHumi(year - 1, month);
  163. var (avgHumiMap2, avgHumiRaw2) = avgHumi(year, month);
  164. IList<dynamic> maxTempChart = new List<dynamic>();
  165. for (var day = 1; day <= 31; day++) {
  166. string val1 = maxTempMap1["Day" + day] as string;
  167. string val2 = maxTempMap2["Day" + day] as string;
  168. maxTempChart.Add(new {
  169. Day = day,
  170. Val1 = val1 == "-" || val1 == "" ? null : maxTempMap1["Day" + day],
  171. Val2 = val2 == "-" || val2 == "" ? null : maxTempMap2["Day" + day],
  172. });
  173. }
  174. IList<dynamic> minTempChart = new List<dynamic>();
  175. for (var day = 1; day <= 31; day++) {
  176. string val1 = minTempMap1["Day" + day] as string;
  177. string val2 = minTempMap2["Day" + day] as string;
  178. minTempChart.Add(new {
  179. Day = day,
  180. Val1 = val1 == "-" || val1 == "" ? null : minTempMap1["Day" + day],
  181. Val2 = val2 == "-" || val2 == "" ? null : minTempMap2["Day" + day],
  182. });
  183. }
  184. IList<dynamic> avgHumiChart = new List<dynamic>();
  185. for (var day = 1; day <= 31; day++) {
  186. string val1 = avgHumiMap1["Day" + day] as string;
  187. string val2 = avgHumiMap2["Day" + day] as string;
  188. avgHumiChart.Add(new {
  189. Day = day,
  190. Val1 = val1 == "-" || val1 == "" ? null : avgHumiMap1["Day" + day],
  191. Val2 = val2 == "-" || val2 == "" ? null : avgHumiMap2["Day" + day],
  192. });
  193. }
  194. return Ok(new {
  195. Site = new {
  196. site.SiteId,
  197. site.Name,
  198. },
  199. MaxTemp1 = maxTempMap1,
  200. MaxTemp2 = maxTempMap2,
  201. MinTemp1 = minTempMap1,
  202. MinTemp2 = minTempMap2,
  203. AvgHumi1 = avgHumiMap1,
  204. AvgHumi2 = avgHumiMap2,
  205. MaxTempChart = maxTempChart,
  206. MinTempChart = minTempChart,
  207. AvgHumiChart = avgHumiChart,
  208. });
  209. }
  210. }
  211. }