浏览代码

调整TimerTrigger时间策略:0 */10 15-23 * * *

CrazyIter_Bin 2 年之前
父节点
当前提交
98d6e77fbf

+ 56 - 25
TEAMModelOS.FunctionV4/TimeTrigger/IESTimerTrigger.cs

@@ -30,18 +30,24 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
 {
 {
     public class IESTimerTrigger
     public class IESTimerTrigger
     {
     {
+        /// <summary>
+        /// 文档。https://docs.microsoft.com/zh-cn/azure/azure-functions/functions-bindings-timer?tabs=in-process&pivots=programming-language-csharp
+        /// Timer 在线测试  https://ncrontab.swimburger.net/
+        /// </summary>
         private readonly AzureCosmosFactory _azureCosmos;
         private readonly AzureCosmosFactory _azureCosmos;
         private readonly DingDing _dingDing;
         private readonly DingDing _dingDing;
         private readonly AzureStorageFactory _azureStorage;
         private readonly AzureStorageFactory _azureStorage;
         private readonly AzureRedisFactory _azureRedis;
         private readonly AzureRedisFactory _azureRedis;
         private readonly IConverter _converter;
         private readonly IConverter _converter;
-        public IESTimerTrigger(IConverter converter, AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis)
+        private readonly SnowflakeId _snowflakeId;
+        public IESTimerTrigger(SnowflakeId snowflakeId,IConverter converter, AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis)
         {
         {
             _azureCosmos = azureCosmos;
             _azureCosmos = azureCosmos;
             _dingDing = dingDing;
             _dingDing = dingDing;
             _azureStorage = azureStorage;
             _azureStorage = azureStorage;
             _azureRedis = azureRedis;
             _azureRedis = azureRedis;
             _converter = converter;
             _converter = converter;
+            _snowflakeId=snowflakeId;
         }
         }
         /// <summary>
         /// <summary>
         /// 防火墙日志记录文件
         /// 防火墙日志记录文件
@@ -87,10 +93,10 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
                // await _dingDing.SendBotMsg($"FireWallFileLog 防火墙日志记录: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}\n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
                // await _dingDing.SendBotMsg($"FireWallFileLog 防火墙日志记录: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}\n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
             }
             }
         }
         }
-        
-        
+
+
         /// <summary>
         /// <summary>
-        /// 清理HiTeach教研类型的课例文件上传在Blob空间的文件。
+        /// 清理HiTeach教研类型的课例文件上传在Blob空间的文件。 0  */10  22-23 * * *
         /// 该代码执行之后 需要删除或者取消Timer任务。
         /// 该代码执行之后 需要删除或者取消Timer任务。
         /// </summary>
         /// </summary>
         /// <param name="myTimer"></param>
         /// <param name="myTimer"></param>
@@ -98,16 +104,16 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
         /// <returns></returns>
         /// <returns></returns>
         [Function("CleanUnusedLessonRecord")]
         [Function("CleanUnusedLessonRecord")]
         //5分钟一次
         //5分钟一次
-        public async Task CleanUnusedLessonRecord([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log) {
+        public async Task CleanUnusedLessonRecord([TimerTrigger("0 */10 15-23 * * *")] TimerInfo myTimer, ILogger log) {
             string location = Environment.GetEnvironmentVariable("Option:Location");
             string location = Environment.GetEnvironmentVariable("Option:Location");
             try {
             try {
                 if (location.Equals("China") || location.Equals("Global"))
                 if (location.Equals("China") || location.Equals("Global"))
                 {
                 {
                     bool lockKey = await _azureRedis.GetRedisClient(8).KeyExistsAsync($"LessonRecord:Unused:Lock:{location}");
                     bool lockKey = await _azureRedis.GetRedisClient(8).KeyExistsAsync($"LessonRecord:Unused:Lock:{location}");
-                    bool keyLock = await _azureRedis.GetRedisClient(8).KeyExistsAsync($"LessonRecord:Unused:Lock:Lock");
-                    if (keyLock) { 
-                        return; 
-                    }
+                    //bool keyLock = await _azureRedis.GetRedisClient(8).KeyExistsAsync($"LessonRecord:Unused:Lock:Lock");
+                    //if (keyLock) { 
+                    //    return; 
+                    //}
                     //key不存在的时候 。
                     //key不存在的时候 。
                     if (!lockKey)
                     if (!lockKey)
                     {
                     {
@@ -154,11 +160,11 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
                         var count501_ = schoolKeys.Where(x => x.count >= 501); //至少500条
                         var count501_ = schoolKeys.Where(x => x.count >= 501); //至少500条
                         counts.AddRange(count501_.Page(1));//1个学校或个人
                         counts.AddRange(count501_.Page(1));//1个学校或个人
                                                            //201-500
                                                            //201-500
-                        var count201_500 = schoolKeys.Where(x => x.count >= 201 && x.count <= 500); //至少402条-1000条
-                        counts.AddRange(count201_500.Page(2));//2个学校或个人
+                        var count201_500 = schoolKeys.Where(x => x.count >= 201 && x.count <= 500); //至少603条-1500条
+                        counts.AddRange(count201_500.Page(3));//2个学校或个人
                                                               //100-200
                                                               //100-200
                         var count100_200 = schoolKeys.Where(x => x.count >= 100 && x.count <= 200);//至少500条-1000条
                         var count100_200 = schoolKeys.Where(x => x.count >= 100 && x.count <= 200);//至少500条-1000条
-                        counts.AddRange(count100_200.Page(5));//5个学校或个人
+                        counts.AddRange(count100_200.Page(10));//5个学校或个人
                                                               //51-99
                                                               //51-99
                         var count51_99 = schoolKeys.Where(x => x.count >= 51 && x.count <= 99);//至少500条-990条
                         var count51_99 = schoolKeys.Where(x => x.count >= 51 && x.count <= 99);//至少500条-990条
                         counts.AddRange(count51_99.Page(10));//10个学校或个人
                         counts.AddRange(count51_99.Page(10));//10个学校或个人
@@ -172,11 +178,11 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
                         var count0_9 = schoolKeys.Where(x => x.count >= 5 && x.count <= 9);//至少500条-900条
                         var count0_9 = schoolKeys.Where(x => x.count >= 5 && x.count <= 9);//至少500条-900条
                         counts.AddRange(count0_9.Page(100));//100个学校或个人
                         counts.AddRange(count0_9.Page(100));//100个学校或个人
                                                             //2-4
                                                             //2-4
-                        var count2_4 = schoolKeys.Where(x => x.count >= 2 && x.count <= 4);//至少500条-1000条
-                        counts.AddRange(count2_4.Page(250));
-                        //0-1
-                        var count0_1 = schoolKeys.Where(x => x.count >= 0 && x.count <= 1);//至少500,就算没有课例也算一次。
-                        counts.AddRange(count0_1.Page(500));
+                        var count2_4 = schoolKeys.Where(x => x.count >= 2 && x.count <= 4);//至少600条-1200条
+                        counts.AddRange(count2_4.Page(300));
+                        //0-1,已经处理过一次,不用再处理
+                        var count0_1 = schoolKeys.Where(x => x.count ==1);//至少500,就算没有课例也算一次。
+                        counts.AddRange(count0_1.Page(1000));
                         int field = 1;
                         int field = 1;
                         foreach (var item in counts)
                         foreach (var item in counts)
                         {
                         {
@@ -249,13 +255,33 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
                                             foreach (var not in notin)
                                             foreach (var not in notin)
                                             {
                                             {
                                                 string url = $"records/{not}";
                                                 string url = $"records/{not}";
-                                                urls.Add(url);
-                                                await _azureStorage.GetBlobServiceClient().DeleteBlobs(_dingDing,idCode.id,new List<string>{ url });
+                                                long id = -1;
+                                                long.TryParse(not,out id);
+                                                if (id > -1) {
+                                                   id = _snowflakeId.ParseIdToTimeStamp(id);
+                                                }
+                                                if (id > -1)
+                                                {
+                                                    //72小时之外的数据。需要被删除 72 * 60 * 60 *1000= 259200000
+                                                    //当前时间-课例产生的时间戳
+                                                    if (s - id> 259200000) {
+                                                        urls.Add(url);
+                                                        await _azureStorage.GetBlobServiceClient().DeleteBlobs(_dingDing, idCode.id, new List<string> { url });
+                                                    }
+                                                }
+                                                else
+                                                {
+                                                    urls.Add(url);
+                                                    await _azureStorage.GetBlobServiceClient().DeleteBlobs(_dingDing, idCode.id, new List<string> { url });
+                                                }
+                                               
                                             }
                                             }
                                         }
                                         }
                                     }
                                     }
                                 }
                                 }
-                                deleteUrls.Add(new KeyValuePair<string, List<string>>($"{idCode.name}-{idCode.id}", urls));
+                                if (urls.IsNotEmpty()) {
+                                    deleteUrls.Add(new KeyValuePair<string, List<string>>($"{idCode.name}-{idCode.id}", urls));
+                                }
                             }
                             }
                             catch (Exception ex)
                             catch (Exception ex)
                             {
                             {
@@ -276,13 +302,18 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
                         List<string> content = new List<string>();
                         List<string> content = new List<string>();
                         foreach (var url in deleteUrls)
                         foreach (var url in deleteUrls)
                         {
                         {
-                            content.Add($"{url.Key}\n   {string.Join("  \t\n", url.Value)}");
+                            if (url.Value.IsNotEmpty()) {
+                                content.Add($"{url.Key}\n   {string.Join("  \t\n", url.Value)}");
+                            }
+                        }
+                        if (content.IsNotEmpty())
+                        {
+                            string str = string.Join("\n", content);
+                            await _dingDing.SendBotMsg($"{location}-结束第{unusedLock.field}轮清理冗余的课例记录文件...\n结束时间:{edata}\n耗时:{timeStr}\n清理内容:\n{str}", GroupNames.醍摩豆服務運維群組);
                         }
                         }
-                        string str = string.Join("\n", content);
-                        if (max == unusedLock.field) {
-                            await _azureRedis.GetRedisClient(8).StringSetAsync($"LessonRecord:Unused:Lock:Lock", "用于在清理完所有Blob容器后,锁定不再进行多次清理。");
+                        else {
+                            await _dingDing.SendBotMsg($"{location}-结束第{unusedLock.field}轮清理冗余的课例记录文件...\n结束时间:{edata}\n耗时:{timeStr}\n清理内容:暂无", GroupNames.醍摩豆服務運維群組);
                         }
                         }
-                        await _dingDing.SendBotMsg($"{location}-结束第{unusedLock.field}轮清理冗余的课例记录文件...\n结束时间:{edata}\n耗时:{timeStr}\n清理内容:\n{str}", GroupNames.醍摩豆服務運維群組);
                     }
                     }
                 }
                 }
             } catch (Exception ex) {
             } catch (Exception ex) {

+ 22 - 0
TEAMModelOS.SDK/DI/SnowflakeID/SnowflakeID.cs

@@ -125,6 +125,28 @@ namespace TEAMModelOS.SDK.DI
             return sb.ToString();
             return sb.ToString();
         }
         }
 
 
+        /// <summary>
+        /// 解析分散式ID,并转换为时间字符串。
+        /// </summary>
+        /// <returns></returns>
+        public string ParseIdToTimeString(long Id, string format = "yyyy-MM-dd HH:mm:ss")
+        {
+            
+            var timestamp = (Id >> timestampLeftShift);
+            var time = Jan1st1970.AddMilliseconds(timestamp + twepoch);
+            string timeString= time.ToLocalTime().ToString(format);
+            return timeString;
+        }
+        /// <summary>
+        /// 解析分散式ID,并转换为时间戳。
+        /// </summary>
+        /// <returns></returns>
+        public long ParseIdToTimeStamp(long Id)
+        {
+            var timestamp = (Id >> timestampLeftShift);
+            long stime = timestamp + twepoch;
+            return stime;
+        }
         /// <summary>
         /// <summary>
         /// 阻塞到下一個毫秒,直到獲得新的時間戳
         /// 阻塞到下一個毫秒,直到獲得新的時間戳
         /// </summary>
         /// </summary>

+ 11 - 2
TEAMModelOS/Controllers/System/CoreController.cs

@@ -42,7 +42,8 @@ namespace TEAMModelOS.Controllers
         private readonly IPSearcher _searcher;
         private readonly IPSearcher _searcher;
         private readonly CoreAPIHttpService _coreAPIHttpService;
         private readonly CoreAPIHttpService _coreAPIHttpService;
         private readonly IConfiguration _configuration;
         private readonly IConfiguration _configuration;
-        public CoreController(CoreAPIHttpService coreAPIHttpService,IConfiguration configuration,IPSearcher searcher, AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option, HttpClient httpClient)
+        private readonly SnowflakeId _snowflakeId;
+        public CoreController(SnowflakeId snowflakeId,CoreAPIHttpService coreAPIHttpService,IConfiguration configuration,IPSearcher searcher, AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option, HttpClient httpClient)
         {
         {
             _searcher = searcher;
             _searcher = searcher;
             _azureStorage = azureStorage;
             _azureStorage = azureStorage;
@@ -52,6 +53,7 @@ namespace TEAMModelOS.Controllers
             _azureRedis = azureRedis;
             _azureRedis = azureRedis;
             _configuration = configuration;
             _configuration = configuration;
             _coreAPIHttpService = coreAPIHttpService;
             _coreAPIHttpService = coreAPIHttpService;
+            _snowflakeId = snowflakeId;
         }
         }
         [HttpPost("sendsms/pin")]
         [HttpPost("sendsms/pin")]
         public async Task<IActionResult> SendSmsPinCode(JsonElement request)
         public async Task<IActionResult> SendSmsPinCode(JsonElement request)
@@ -310,13 +312,20 @@ namespace TEAMModelOS.Controllers
         {
         {
 
 
             if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();//学校编码 或者醍摩豆id
             if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();//学校编码 或者醍摩豆id
+            request.TryGetProperty("snowflakeId", out JsonElement snowflakeId);
             string _num09 = "123456789";
             string _num09 = "123456789";
             string no = $"{Utils.CreatSaltString(6, _num09)}";
             string no = $"{Utils.CreatSaltString(6, _num09)}";
             var Expire = DateTime.UtcNow.AddHours(1);
             var Expire = DateTime.UtcNow.AddHours(1);
             string key = $"Random:Code:{no}-{code}";
             string key = $"Random:Code:{no}-{code}";
             await _azureRedis.GetRedisClient(8).StringSetAsync(key, new { code = code, no = no, Expire = Expire.Ticks }.ToJsonString());
             await _azureRedis.GetRedisClient(8).StringSetAsync(key, new { code = code, no = no, Expire = Expire.Ticks }.ToJsonString());
             _azureRedis.GetRedisClient(8).KeyExpire(key, Expire);
             _azureRedis.GetRedisClient(8).KeyExpire(key, Expire);
-            return Ok(new { random = no });
+            long time=0;
+            if (JsonValueKind.Number.Equals(snowflakeId.ValueKind) && !string.IsNullOrWhiteSpace($"{snowflakeId}"))
+            {
+                long id = long.Parse($"{snowflakeId}");
+                time = _snowflakeId.ParseIdToTimeStamp(id);
+            }
+            return Ok(new { random = no , time });
         }
         }
 
 
         [HttpPost("system-info")]
         [HttpPost("system-info")]