using Azure; using Azure.Cosmos; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.Json; using System.Threading.Tasks; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK.Extension; using TEAMModelOS.SDK; namespace TEAMModelOS.SDK.Models.Service { public static class FixDataService { /// /// 修复学生数据 /// /// /// /// /// /// public static async Task> FixStudentInfo(CosmosClient client, DingDing _dingDing, AzureStorageFactory _azureStorage, JsonElement data) { var code = data.GetProperty("code").GetString(); var ids = data.GetProperty("ids").ToObject>(); var dict = data.GetProperty("dict").ToObject>(); string queryText = $"SELECT VALUE c FROM c WHERE c.id IN ({string.Join(",", ids.Select(o => $"'{o}'"))})"; List students = new List(); await foreach (var item in client.GetContainer("TEAMModelOS", "Student") .GetItemQueryIterator( queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{code}") })) { foreach (var key in dict.Keys) { switch (key) { case "classId": item.classId =$"{ dict[key]}"; break; case "periodId": item.periodId = $"{ dict[key]}"; break; case "schoolId": item.schoolId = $"{ dict[key]}"; break; case "year": int year = DateTime.Now.Year; int.TryParse($"dict[key]", out year); item.year = year; break; default: break; } await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync(item, item.id, new PartitionKey(item.code)); students.Add(item); } } return students; } /// /// 修复内容模块数据 /// /// /// /// /// /// public static async Task FixBlobContent(CosmosClient client, DingDing _dingDing, AzureStorageFactory _azureStorage, JsonElement data) { if (data.TryGetProperty("name", out JsonElement _name)) { List names = _name.ToObject>(); foreach (string name in names) { List prefixs = new List() { "audio", "doc", "image", "other", "res", "video", "thum" }; var ContainerClient = _azureStorage.GetBlobContainerClient($"{name}"); string scope = "private"; if (data.TryGetProperty("scope", out JsonElement _scope)) { scope = $"{_scope}"; } var tb = "Teacher"; if (scope != "private") { tb = "School"; } List ids = new List(); await foreach (var item in client.GetContainer("TEAMModelOS", tb).GetItemQueryIterator(queryDefinition: new QueryDefinition("select c.id from c "), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Bloblog-{name}") })) { ids.Add(item.id); } await client.GetContainer("TEAMModelOS", tb).DeleteItemsStreamAsync(ids, $"Bloblog-{name}"); long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); foreach (var prefix in prefixs) { if (prefix.Equals("res")) { List itemres = await ContainerClient.List(prefix); if (itemres.IsNotEmpty()) { HashSet set = new HashSet(); itemres.ForEach(x => { var uri = x.Split("/"); set.Add($"res/{uri[1]}"); }); foreach (var item in set) { var urlsSize = await ContainerClient.GetBlobsSize(item); var url = item; if (!item.EndsWith(".hte", StringComparison.OrdinalIgnoreCase) && !item.EndsWith(".HTEX", StringComparison.OrdinalIgnoreCase)) { url += ".HTEX"; } Bloblog bloblog = new Bloblog { id = Guid.NewGuid().ToString(), code = $"Bloblog-{name}", pk = "Bloblog", time = now, url = url, size = urlsSize != null && urlsSize.HasValue ? urlsSize.Value : 0, type = prefix }; await client.GetContainer("TEAMModelOS", tb).UpsertItemAsync(bloblog, new Azure.Cosmos.PartitionKey(bloblog.code)); } } } else { List items = await ContainerClient.List(prefix); if (items.IsNotEmpty()) { foreach (var item in items) { var urlsSize = await ContainerClient.GetBlobsSize(item); Bloblog bloblog = new Bloblog { id = Guid.NewGuid().ToString(), code = $"Bloblog-{name}", pk = "Bloblog", time = now, url = item, size = urlsSize != null && urlsSize.HasValue ? urlsSize.Value : 0, type = prefix }; await client.GetContainer("TEAMModelOS", tb).UpsertItemAsync(bloblog, new Azure.Cosmos.PartitionKey(bloblog.code)); } } } } } } } } }