|
@@ -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) {
|