lg_backend/langguanApi/Service/WeatherService.cs

342 lines
11 KiB
C#
Raw Normal View History

2024-05-20 15:10:31 +00:00
using langguanApi.Extensions.AutoDI;
using Newtonsoft.Json;
2024-06-12 16:47:19 +00:00
using NPOI.SS.Formula.Functions;
using System.Reflection;
2024-05-20 14:56:49 +00:00
namespace langguanApi.Service
{
2024-05-20 15:10:31 +00:00
[ServiceInjection(InjectionType.Transient)]
2024-05-20 14:56:49 +00:00
public class WeatherService
{
private IHttpClientFactory _httpClientFactory;
private IConfiguration _configuration;
private ILogger<WeatherService> _logger;
public WeatherService(IHttpClientFactory httpClientFactory,
IConfiguration configuration, ILogger<WeatherService> logger)
{
_httpClientFactory = httpClientFactory;
_configuration = configuration;
2024-06-12 16:47:19 +00:00
_logger = logger;
2024-05-20 14:56:49 +00:00
}
/// <summary>
/// 爬气象局的天气数据%
/// </summary>
/// <returns></returns>
public async Task<object> 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<Root>(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;
}
2024-06-12 16:47:19 +00:00
/// <summary>
/// 爬空气质量数据
/// </summary>
/// <returns></returns>
public async Task<object> 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<AirQuality>(data);
return Convert2QualityList(air);
}
return null;
}
private List<Quality> Convert2QualityList(AirQuality airQuality)
{
Type modelType = typeof(AirQuality);
List<Quality> qualityList = new List<Quality>();
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<string, string, string> 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<string, string, string>(keyword, standard, level);
}
public class Quality
{
/// <summary>
/// 空气质量key
/// </summary>
public string key { get; set; }
/// <summary>
/// 空气质量指数数值
/// </summary>
public string val { get; set; }
/// <summary>
/// 空气质量指数级别
/// </summary>
public string level { get; set; }
/// <summary>
/// 空气质量指数标准
/// </summary>
public string standard { get; set; }
}
/// <summary>
/// 空气质量数据
/// </summary>
public class AirQuality
{
// public string Area { get; set; }
// public int CityCode { get; set; }
/// <summary>
/// 一氧化碳
/// </summary>
public string CO { get; set; }
/// <summary>
/// 二氧化氮
/// </summary>
public string NO2 { get; set; }
/// <summary>
/// 臭氧
/// </summary>
public string O3 { get; set; }
/// <summary>
/// PM10
/// </summary>
public string PM10 { get; set; }
/// <summary>
/// PM25
/// </summary>
public string PM2_5 { get; set; }
/// <summary>
/// 二氧化硫
/// </summary>
public string SO2 { get; set; }
}
2024-05-20 14:56:49 +00:00
public class Location
{
/// <summary>
/// 54511
/// </summary>
public string id { get; set; }
/// <summary>
/// 北京
/// </summary>
public string name { get; set; }
/// <summary>
/// 中国, 北京, 北京
/// </summary>
public string path { get; set; }
}
public class Now
{
/// <summary>
/// Precipitation
/// </summary>
public double precipitation { get; set; }
/// <summary>
/// Temperature
/// </summary>
public double temperature { get; set; }
/// <summary>
/// Pressure
/// </summary>
public double pressure { get; set; }
/// <summary>
/// Humidity
/// </summary>
public double humidity { get; set; }
/// <summary>
/// 东北风
/// </summary>
public string windDirection { get; set; }
/// <summary>
/// WindDirectionDegree
/// </summary>
public double windDirectionDegree { get; set; }
/// <summary>
/// WindSpeed
/// </summary>
public double windSpeed { get; set; }
/// <summary>
/// 微风
/// </summary>
public string windScale { get; set; }
}
/// <summary>
///
/// </summary>
public class Data
{
/// <summary>
/// Location
/// </summary>
public Location location { get; set; }
/// <summary>
/// Now
/// </summary>
public Now now { get; set; }
/// <summary>
/// Alarm
/// </summary>
public List<object> alarm { get; set; }
/// <summary>
/// 2024/01/15 10:05
/// </summary>
public DateTime lastUpdate { get; set; }
}
public class Root
{
/// <summary>
/// success
/// </summary>
public string msg { get; set; }
/// <summary>
/// Code
/// </summary>
public int code { get; set; }
/// <summary>
/// Data
/// </summary>
public Data data { get; set; }
}
}
}