using System; using DinkToPdf.Contracts; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK; using TEAMModelOS.SDK.Extension; using TEAMModelOS.SDK.Models.Service.BI; using System.Globalization; using TEAMModelOS.SDK.Models; using HTEX.Lib.ETL.Lesson; using System.Linq; using TEAMModelOS.SDK.DI.IPIP; using static TEAMModelOS.SDK.Extension.GeoRegion; using System.Text.Json; namespace TEAMModelOS.Function { public class IESTimerTrigger { private readonly ILogger _logger; /// /// 文档。https://docs.microsoft.com/zh-cn/azure/azure-functions/functions-bindings-timer?tabs=in-process&pivots=programming-language-csharp /// Timer 在线测试 https://ncrontab.swimburger.net/ /// private readonly AzureCosmosFactory _azureCosmos; private readonly DingDing _dingDing; private readonly AzureStorageFactory _azureStorage; private readonly AzureRedisFactory _azureRedis; //private readonly IConverter _converter; private readonly SnowflakeId _snowflakeId; private readonly IHttpClientFactory _httpClient; private readonly CoreAPIHttpService _coreAPIHttpService; //private IPSearcher _ipSearcher; private readonly IConfiguration _configuration; private readonly City _city; public IESTimerTrigger(ILoggerFactory loggerFactory, IConfiguration configuration, CoreAPIHttpService coreAPIHttpService, IHttpClientFactory httpClient, SnowflakeId snowflakeId, AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, City city) { _logger = loggerFactory.CreateLogger(); _azureCosmos = azureCosmos; _dingDing = dingDing; _azureStorage = azureStorage; _azureRedis = azureRedis; // _converter = converter; _snowflakeId=snowflakeId; _httpClient = httpClient; // _ipSearcher = ipSearcher; _coreAPIHttpService = coreAPIHttpService; _configuration= configuration; _city = city; } //0 0 20 * * 0 [Function("WeeklyReport")] public async Task WeeklyReport([TimerTrigger("0 0 20 * * 0")] TimerInfo myTimer) { await TEAMModelOS.SDK.Models.Service.SystemService.LessonWeekly(_azureRedis,_azureCosmos,_coreAPIHttpService,_dingDing,_configuration); //var server = _azureRedis.GetGetServer(); //// 使用Keys方法获取所有匹配前缀的key //var pattern = "LessonWeek:*"; //var keys = server.Keys(8, pattern); //foreach (var key in keys) //{ // await _azureRedis.GetRedisClient(8).KeyDeleteAsync(key); //} } /// /// //0 1 * * * * 一天中每小时的第 1 分钟 ///0 */10 * * * * 每五分钟一次 /// /// /// [Function("DailyReport")] public async Task DailyReport([TimerTrigger("0 1 * * * *")] TimerInfo myTimer) { _logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}"); try { await _dingDing.SendBotMsg($"{_coreAPIHttpService.options.location},定时任务{DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss")}", GroupNames.成都开发測試群組); string? local = Environment.GetEnvironmentVariable("Option:Location"); // if (local.Contains("Test")||local.Contains("Dep")) { int am = 8; int pm = 20; //int am = DateTimeOffset.Now.Hour; //int pm = DateTimeOffset.Now.Hour; var url = Environment.GetEnvironmentVariable("HaBookAuth:CoreAPI"); var clientID = Environment.GetEnvironmentVariable("HaBookAuth:CoreService:clientID"); var clientSecret = Environment.GetEnvironmentVariable("HaBookAuth:CoreService:clientSecret"); string location = ""; if (local!.Contains("China")) { location = "China"; return; } else if (local.Contains("Global")) { location = "Global"; } var client = _httpClient.CreateClient(); var token = CoreTokenExtensions.CreateAccessToken(clientID, clientSecret, location).Result; if (client.DefaultRequestHeaders.Contains("Authorization")) { client.DefaultRequestHeaders.Remove("Authorization"); client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token.AccessToken}"); } else { client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token.AccessToken}"); } var data = await TEAMModelOS.SDK.Models.Service.SystemService.AccumulateDaily(_configuration, _azureRedis, _azureCosmos,_azureStorage, _coreAPIHttpService, _dingDing, client, _snowflakeId, url, am, pm); //await _dingDing.SendBotMsg($"返回数据{data.ToJsonString()}", GroupNames.成都开发測試群組); } } catch (Exception ex) { await _dingDing.SendBotMsg($"{DailyReport}\n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組); } if (myTimer.ScheduleStatus is not null) { _logger.LogInformation($"Next timer schedule at: {myTimer.ScheduleStatus.Next}"); } } /// /// 每天執行 取得IOT TeachingData 並統計昨日每校Redis資料 執行時間:每日凌晨1時1分 /// [Function("BICrtDailyAnal")] //0 1 0 * * * 一天中00的第 1 分钟 //0 1 * * * * 一天中每小时的第 1 分钟 //0 */10 * * * * 每五分钟一次 public async Task BICreatDailyAnalData([TimerTrigger("0 1 1 * * *")] TimerInfo myTimer, ILogger log) { var _azureCosmosClient = _azureCosmos.GetCosmosClient(); var _azureCosmosClientCsv2 = _azureCosmos.GetCosmosClient(name: "CoreServiceV2"); var _azureCosmosClientCsv2CnRead = _azureCosmos.GetCosmosClient(name: "CoreServiceV2CnRead"); var datetime = DateTimeOffset.UtcNow.AddHours(-12); //統計昨天的數據 var y = $"{datetime.Year}"; var m = datetime.Month >= 10 ? $"{datetime.Month}" : $"0{datetime.Month}"; var d = datetime.Day >= 10 ? $"{datetime.Day}" : $"0{datetime.Day}"; string? local = Environment.GetEnvironmentVariable("Option:Location"); List region_gl = new List(); using (StreamReader r = new StreamReader("JsonFile/Region/region_gl.json")) { string json_g = r.ReadToEnd(); region_gl = JsonSerializer.Deserialize>(json_g); } List region_cn = new List(); using (StreamReader r = new StreamReader("JsonFile/Region/region_cn.json")) { string json_c = r.ReadToEnd(); region_cn = JsonSerializer.Deserialize>(json_c); } //生成學校IOT數據 await BIProdAnalysis.BICreatDailyAnalData(_azureRedis, _azureCosmosClient, _azureCosmosClientCsv2, _azureCosmosClientCsv2CnRead, _dingDing, _city, local, y, m, d, region_gl, region_cn); //刪除三個月以前的Redis數據 [待做] } } }