using langguanApi.Extensions.AutoDI; using Newtonsoft.Json; using NPOI.SS.Formula.Functions; using System.Reflection; namespace langguanApi.Service { [ServiceInjection(InjectionType.Transient)] public class WeatherService { private IHttpClientFactory _httpClientFactory; private IConfiguration _configuration; private ILogger _logger; public WeatherService(IHttpClientFactory httpClientFactory, IConfiguration configuration, ILogger logger) { _httpClientFactory = httpClientFactory; _configuration = configuration; _logger = logger; } /// /// 爬气象局的天气数据% /// /// public async Task GetWeather() { try { var client = _httpClientFactory.CreateClient(); var resp = await client.GetAsync(_configuration.GetSection("Weather").Value); if (resp.IsSuccessStatusCode) { var data = await resp.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject(data); return new { location = result?.data.location.name, result?.data.now.precipitation, result?.data.now.temperature, result?.data.now.pressure, result?.data.now.humidity, result?.data.now.windDirection, result?.data.now.windDirectionDegree, result?.data.now.windSpeed, result?.data.now.windScale, }; } } catch (Exception ex) { _logger.LogError(ex.Message); } return null; } /// /// 爬空气质量数据 /// /// public async Task GetAirQuality() { var client = _httpClientFactory.CreateClient(); var resp = await client.GetAsync(_configuration.GetSection("AirQuality").Value); if (resp.IsSuccessStatusCode) { var data = await resp.Content.ReadAsStringAsync(); var air = JsonConvert.DeserializeObject(data); return Convert2QualityList(air); } return null; } private List Convert2QualityList(AirQuality airQuality) { Type modelType = typeof(AirQuality); List qualityList = new List(); PropertyInfo[] PropertyList = modelType.GetProperties(); foreach (PropertyInfo item in PropertyList) { Quality quality = new Quality(); object value = item.GetValue(airQuality, null); if (value != null) { var tuple = GetStandard(item.Name, value.ToString()); quality.key = tuple.Item1; quality.val = value.ToString(); quality.standard = tuple.Item2; quality.level = tuple.Item3; qualityList.Add(quality); } } return qualityList; } private Tuple GetStandard(string key, string value) { string standard = ""; string keyword = ""; string level = ""; switch (key) { case "CO": keyword = "一氧化碳"; standard = "0.5μg/m3"; if (double.Parse(value) >= 0.5) { level = "优"; } else if (double.Parse(value) >= 0.3) { level = "持平"; } else { level = "差"; } break; case "NO2": keyword = "二氧化氮"; standard = "50μg/m3"; if (double.Parse(value) >= 50) { level = "优"; } else if (double.Parse(value) >= 150) { level = "轻度污染"; } else { level = "中度污染"; } break; case "O3": keyword = "臭氧"; standard = "100μg/m3"; if (double.Parse(value) >= 100) { level = "优"; } else if (double.Parse(value) >= 50) { level = "持平"; } else { level = "差"; } break; case "PM10": keyword = "PM10"; standard = "50ug/m3"; if (double.Parse(value) >= 50) { level = "优"; } else if (double.Parse(value) >= 150) { level = "中"; } else { level = "差"; } break; case "PM2_5": keyword = "PM2.5"; standard = "25ug/m3"; if (double.Parse(value) >= 25) { level = "优"; } else if (double.Parse(value) >= 100) { level = "中"; } else { level = "差"; } break; case "SO2": keyword = "二氧化硫"; standard = "15μg/m3"; if (double.Parse(value) >= 15) { level = "优"; } else if (double.Parse(value) >= 35) { level = "中"; } else { level = "差"; } break; } return new Tuple(keyword, standard, level); } public class Quality { /// /// 空气质量key /// public string key { get; set; } /// /// 空气质量指数数值 /// public string val { get; set; } /// /// 空气质量指数级别 /// public string level { get; set; } /// /// 空气质量指数标准 /// public string standard { get; set; } } /// /// 空气质量数据 /// public class AirQuality { // public string Area { get; set; } // public int CityCode { get; set; } /// /// 一氧化碳 /// public string CO { get; set; } /// /// 二氧化氮 /// public string NO2 { get; set; } /// /// 臭氧 /// public string O3 { get; set; } /// /// PM10 /// public string PM10 { get; set; } /// /// PM25 /// public string PM2_5 { get; set; } /// /// 二氧化硫 /// public string SO2 { get; set; } } public class Location { /// /// 54511 /// public string id { get; set; } /// /// 北京 /// public string name { get; set; } /// /// 中国, 北京, 北京 /// public string path { get; set; } } public class Now { /// /// Precipitation /// public double precipitation { get; set; } /// /// Temperature /// public double temperature { get; set; } /// /// Pressure /// public double pressure { get; set; } /// /// Humidity /// public double humidity { get; set; } /// /// 东北风 /// public string windDirection { get; set; } /// /// WindDirectionDegree /// public double windDirectionDegree { get; set; } /// /// WindSpeed /// public double windSpeed { get; set; } /// /// 微风 /// public string windScale { get; set; } } /// /// /// public class Data { /// /// Location /// public Location location { get; set; } /// /// Now /// public Now now { get; set; } /// /// Alarm /// public List alarm { get; set; } /// /// 2024/01/15 10:05 /// public DateTime lastUpdate { get; set; } } public class Root { /// /// success /// public string msg { get; set; } /// /// Code /// public int code { get; set; } /// /// Data /// public Data data { get; set; } } } }