using System.Text.Json.Serialization; namespace Service; /// /// 节假日服务接口 /// public interface IHolidayService { /// /// 从API获取并缓存节假日数据 /// Task FetchAndCacheHolidaysAsync(int year); /// /// 获取指定年份的节假日数据 /// Task> GetHolidaysByYearAsync(int year); /// /// 获取指定日期范围的节假日数据 /// Task> GetHolidaysByDateRangeAsync(string startDate, string endDate); } /// /// 节假日服务实现 /// public class HolidayService( IHolidayRepository holidayRepository, IHttpClientFactory httpClientFactory, ILogger logger) : IHolidayService { private const string HolidayApiUrl = "https://publicapi.xiaoai.me/holiday/year"; public async Task FetchAndCacheHolidaysAsync(int year) { try { logger.LogInformation("开始获取 {Year} 年节假日数据", year); // 调用API获取数据 var httpClient = httpClientFactory.CreateClient(); var response = await httpClient.GetStringAsync($"{HolidayApiUrl}?date={year}"); // 解析JSON var apiResponse = JsonSerializer.Deserialize(response); if (apiResponse?.Code != 0 || apiResponse.Data == null) { logger.LogError("获取节假日数据失败: {Message}", apiResponse?.Msg); return false; } // 删除旧数据 await holidayRepository.DeleteByYearAsync(year); // 转换并保存新数据 var holidays = apiResponse.Data.Select(item => new Holiday { Year = year, DayType = item.DayType, HolidayName = item.Holiday, Rest = item.Rest, Date = item.Date, Week = item.Week, WeekDescCn = item.WeekDescCn }).ToList(); await holidayRepository.AddRangeAsync(holidays); logger.LogInformation("成功缓存 {Count} 条节假日数据", holidays.Count); return true; } catch (Exception ex) { // 静默失败,仅记录日志 logger.LogError(ex, "获取并缓存节假日数据失败"); return false; } } public async Task> GetHolidaysByYearAsync(int year) { return await holidayRepository.GetByYearAsync(year); } public async Task> GetHolidaysByDateRangeAsync(string startDate, string endDate) { return await holidayRepository.GetByDateRangeAsync(startDate, endDate); } } /// /// 节假日API响应模型 /// public class HolidayApiResponse { [JsonPropertyName("code")] public int Code { get; set; } [JsonPropertyName("msg")] public string Msg { get; set; } = string.Empty; [JsonPropertyName("data")] public List? Data { get; set; } } /// /// 节假日API数据模型 /// public class HolidayApiData { [JsonPropertyName("daytype")] public int DayType { get; set; } [JsonPropertyName("holiday")] public string Holiday { get; set; } = string.Empty; [JsonPropertyName("rest")] public int Rest { get; set; } [JsonPropertyName("date")] public string Date { get; set; } = string.Empty; [JsonPropertyName("week")] public int Week { get; set; } [JsonPropertyName("week_desc_cn")] public string WeekDescCn { get; set; } = string.Empty; }