Parcourir la source

blob 相关调整以及代码优化

zhouj1203@hotmail.com il y a 4 ans
Parent
commit
a036ae7fdd

+ 11 - 1
TEAMModelFunction/TriggerExam.cs

@@ -423,6 +423,16 @@ namespace TEAMModelFunction
                             info.standard = Math.Round(examResults[0].studentIds.Count > 0 ? Math.Pow(powSum / examResults[0].studentIds.Count, 0.5) : 0, 2);
                             double NewsRate = allScore > 0 ? Math.Round(NewsRateScore / allScore * 100, 2) : 0;
                             info.lostStu = losStu;
+                            /*//补充历史数据的容器名称
+                            if (string.IsNullOrEmpty(info.cn)) {
+                                if (info.scope.Equals("school"))
+                                {
+                                    info.cn = info.school;
+                                }
+                                else {
+                                    info.cn = info.creatorId;
+                                }
+                            }*/
                             //判断均分是否发生变化,便于实时的更新评测基本信息
                             if (info.sRate != NewsRate || info.average != NewsRateScore)
                             {
@@ -433,7 +443,7 @@ namespace TEAMModelFunction
                         }
                         catch (Exception e)
                         {
-                            await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-评测finish状态异常{e.Message}\n{e.StackTrace}", GroupNames.成都开发測試群組);
+                            await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-{info.id}-评测finish状态异常{e.Message}\n{e.StackTrace}", GroupNames.成都开发測試群組);
                         }
                         break;
                 }

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/ItemInfo.cs

@@ -30,5 +30,7 @@ namespace TEAMModelOS.SDK.Models
         //使用次数
         public int useCount { get; set; }
         public string blob { get; set; }
+        //记录试题大小
+        public long? size { get; set; } = 0;
     }
 }

+ 1 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Survey.cs

@@ -84,6 +84,7 @@ namespace TEAMModelOS.SDK.Models
         /// TTL删除改变状态使用
         /// </summary>
         public int? status { get; set; } = 0;
+        public long? size { get; set; } = 0;
     }
 
     /// <summary>

+ 1 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Vote.cs

@@ -103,6 +103,7 @@ namespace TEAMModelOS.SDK.Models
         /// TTL删除改变状态使用
         /// </summary>
         public int? status { get; set; } = 0;
+        public long? size { get; set; } = 0;
     }
     /// <summary>
     /// 投票选项

+ 4 - 0
TEAMModelOS.SDK/Models/Cosmos/School/ExamInfo.cs

@@ -89,6 +89,10 @@ namespace TEAMModelOS.SDK.Models
         //缺考人数
         public List<string> lostStu { get; set; } = new List<string>();
         public double standard { get; set; }
+        //记录该评测内容下blob大小
+        public long? size { get; set; } = 0;
+        //容器名称 container name
+        //public string cn { get; set; }
     }
     public class Custom {
         public string id { get; set; }

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/School/Paper.cs

@@ -60,6 +60,8 @@ namespace TEAMModelOS.SDK.Models
         public double score { get; set; }
         public string scope { get; set; }
         public int multipleRule { get; set; }
+        //记录试卷大小
+        public long? size { get; set; } = 0;
         /// <summary>
         /// type:{
         ///     pointkey:[num1,num2....]

+ 189 - 9
TEAMModelOS/Controllers/Common/CommonController.cs

@@ -1,3 +1,4 @@
+using Azure.Cosmos;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
@@ -13,6 +14,7 @@ using System.Threading.Tasks;
 using TEAMModelOS.Filter;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Models;
 
 namespace TEAMModelOS.Controllers.Common
 {
@@ -21,7 +23,7 @@ namespace TEAMModelOS.Controllers.Common
     //[Authorize(Roles = "IES5")
     [Route("common")]
     [ApiController]
-    public class CommonController:ControllerBase
+    public class CommonController : ControllerBase
     {
         private readonly AzureCosmosFactory _azureCosmos;
         private readonly SnowflakeId _snowflakeId;
@@ -30,7 +32,8 @@ namespace TEAMModelOS.Controllers.Common
         private readonly Option _option;
         private readonly AzureStorageFactory _azureStorage;
         private readonly IHttpClientFactory _clientFactory;
-        public CommonController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage, IHttpClientFactory clientFactory) {
+        public CommonController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage, IHttpClientFactory clientFactory)
+        {
             _azureCosmos = azureCosmos;
             _serviceBus = serviceBus;
             _snowflakeId = snowflakeId;
@@ -52,17 +55,17 @@ namespace TEAMModelOS.Controllers.Common
                 if (!element.TryGetProperty("id", out JsonElement id)) return BadRequest();
                 if (!element.TryGetProperty("code", out JsonElement code)) return BadRequest();
                 var client = _azureCosmos.GetCosmosClient();
-                var data = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync($"{id}", new Azure.Cosmos.PartitionKey ($"{code}"));
+                var data = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync($"{id}", new Azure.Cosmos.PartitionKey($"{code}"));
                 using var json = await JsonDocument.ParseAsync(data.ContentStream);
-                long  now= DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                Dictionary<string,object> dy = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string,object>>(json.RootElement.ToString());
+                long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                Dictionary<string, object> dy = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(json.RootElement.ToString());
                 dy["endTime"] = now;
                 dy["progress"] = "finish";
-                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Dictionary<string, object>>(dy,dy["id"].ToString(),new Azure.Cosmos.PartitionKey(dy["code"].ToString()));
-                var httpClient=  _clientFactory.CreateClient();
+                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Dictionary<string, object>>(dy, dy["id"].ToString(), new Azure.Cosmos.PartitionKey(dy["code"].ToString()));
+                var httpClient = _clientFactory.CreateClient();
                 var content = new { id = $"{id}", code = $"{code}" };
-                var response= await httpClient.PostAsJsonAsync( $"{_option.HttpTrigger }refresh-stu-activity", content);
-                return Ok(    await JsonDocument.ParseAsync(await response.Content.ReadAsStreamAsync())         );
+                var response = await httpClient.PostAsJsonAsync($"{_option.HttpTrigger }refresh-stu-activity", content);
+                return Ok(await JsonDocument.ParseAsync(await response.Content.ReadAsStreamAsync()));
             }
             catch (Exception ex)
             {
@@ -70,5 +73,182 @@ namespace TEAMModelOS.Controllers.Common
                 return BadRequest();
             }
         }
+
+        //更新评测活动size
+        [ProducesDefaultResponseType]
+        //[AuthToken(Roles = "teacher,admin")]
+        [HttpPost("exam-size")]
+        public async Task<IActionResult> examSize(JsonElement element)
+        {
+            //var (id, school) = HttpContext.GetAuthTokenInfo();
+            try
+            {
+                //if (!element.TryGetProperty("id", out JsonElement id)) return BadRequest();
+                if (!element.TryGetProperty("code", out JsonElement code)) return BadRequest();
+                var client = _azureCosmos.GetCosmosClient();
+                List<ExamInfo> examInfo = new();
+                List<Task<ItemResponse<ExamInfo>>> tasks = new();
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<ExamInfo>(queryText: $"select value(c) from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Exam-{code}") }))
+                {
+                    examInfo.Add(item);
+                }
+                foreach (ExamInfo info in examInfo)
+                {
+                    if (info.size == 0)
+                    {
+                        info.size = await _azureStorage.GetBlobContainerClient(info.school).GetBlobsSize($"exam/{info.id}");
+                        tasks.Add(client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(info, info.id, new PartitionKey($"{info.code}")));
+                    }
+                }
+                await Task.WhenAll(tasks);
+                return Ok();
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},common/exam-size\n{ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest();
+            }
+        }
+        //更新投票活动size
+        [ProducesDefaultResponseType]
+        //[AuthToken(Roles = "teacher,admin")]
+        [HttpPost("vote-size")]
+        public async Task<IActionResult> voteSize(JsonElement element)
+        {
+            //var (id, school) = HttpContext.GetAuthTokenInfo();
+            try
+            {
+                //if (!element.TryGetProperty("id", out JsonElement id)) return BadRequest();
+                if (!element.TryGetProperty("code", out JsonElement code)) return BadRequest();
+                var client = _azureCosmos.GetCosmosClient();
+                List<Vote> votes = new();
+                List<Task<ItemResponse<Vote>>> tasks = new();
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<Vote>(queryText: $"select value(c) from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Vote-{code}") }))
+                {
+                    votes.Add(item);
+                }
+                foreach (Vote vote in votes)
+                {
+                    if (vote.size == 0)
+                    {
+                        vote.size = await _azureStorage.GetBlobContainerClient(vote.school).GetBlobsSize($"vote/{vote.id}");
+                        tasks.Add(client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(vote, vote.id, new PartitionKey($"{vote.code}")));
+                    }
+                }
+                await Task.WhenAll(tasks);
+                return Ok();
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},common/vote-size\n{ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest();
+            }
+        }
+
+        //更新问卷活动size
+        [ProducesDefaultResponseType]
+        //[AuthToken(Roles = "teacher,admin")]
+        [HttpPost("survey-size")]
+        public async Task<IActionResult> surveySize(JsonElement element)
+        {
+            try
+            {
+                //if (!element.TryGetProperty("id", out JsonElement id)) return BadRequest();
+                if (!element.TryGetProperty("code", out JsonElement code)) return BadRequest();
+                var client = _azureCosmos.GetCosmosClient();
+                List<Survey> surveys = new();
+                List<Task<ItemResponse<Survey>>> tasks = new();
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<Survey>(queryText: $"select value(c) from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Survey-{code}") }))
+                {
+                    surveys.Add(item);
+                }
+                foreach (Survey survey in surveys)
+                {
+                    if (survey.size == 0)
+                    {
+                        survey.size = await _azureStorage.GetBlobContainerClient(survey.school).GetBlobsSize($"vote/{survey.id}");
+                        tasks.Add(client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(survey, survey.id, new PartitionKey($"{survey.code}")));
+                    }
+                }
+                await Task.WhenAll(tasks);
+                return Ok();
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},common/survey-size\n{ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest();
+            }
+        }
+
+
+        //更新试题库size
+        [ProducesDefaultResponseType]
+        //[AuthToken(Roles = "teacher,admin")]
+        [HttpPost("item-size")]
+        public async Task<IActionResult> itemSize(JsonElement element)
+        {
+            try
+            {
+                //if (!element.TryGetProperty("id", out JsonElement id)) return BadRequest();
+                if (!element.TryGetProperty("code", out JsonElement code)) return BadRequest();
+                var client = _azureCosmos.GetCosmosClient();
+                List<ItemInfo> items = new();
+                List<Task<ItemResponse<ItemInfo>>> tasks = new();
+                await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<ItemInfo>(queryText: $"select value(c) from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{code}") }))
+                {
+                    items.Add(item);
+                }
+                foreach (ItemInfo info in items)
+                {
+                    if (info.size == 0)
+                    {
+                        info.size = await _azureStorage.GetBlobContainerClient(code.ToString()).GetBlobsSize($"item/{info.id}");
+                        tasks.Add(client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(info, info.id, new PartitionKey($"{info.code}")));
+                    }
+                }
+                await Task.WhenAll(tasks);
+                return Ok();
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},common/item-size\n{ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest();
+            }
+        }
+
+        //更新试卷库size
+        [ProducesDefaultResponseType]
+        //[AuthToken(Roles = "teacher,admin")]
+        [HttpPost("paper-size")]
+        public async Task<IActionResult> paperSize(JsonElement element)
+        {
+            try
+            {
+                //if (!element.TryGetProperty("id", out JsonElement id)) return BadRequest();
+                if (!element.TryGetProperty("code", out JsonElement code)) return BadRequest();
+                var client = _azureCosmos.GetCosmosClient();
+                List<Paper> papers = new();
+                List<Task<ItemResponse<Paper>>> tasks = new();
+                await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Paper>(queryText: $"select value(c) from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{code}") }))
+                {
+                    papers.Add(item);
+                }
+                foreach (Paper paper in papers)
+                {
+                    if (paper.size == 0)
+                    {
+                        paper.size = await _azureStorage.GetBlobContainerClient(code.ToString()).GetBlobsSize($"paper/{paper.name}");
+                        tasks.Add(client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}")));
+                    }
+                }
+                await Task.WhenAll(tasks);
+                return Ok();
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},common/paper-size\n{ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest();
+            }
+        }
     }
 }

+ 20 - 0
TEAMModelOS/Controllers/Common/ExamController.cs

@@ -98,6 +98,7 @@ namespace TEAMModelOS.Controllers
                     }
                     if (request.scope.Equals("private"))
                     {
+                        
                         //处理发布对象为自选名单(个人)
                         List<StuList> stuLists = new List<StuList>();
                         await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<StuList>(queryText: $"select value(c) from c where c.id = '{request.classes[i]}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList") }))
@@ -135,6 +136,7 @@ namespace TEAMModelOS.Controllers
                     }
                     else
                     {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.school).GetBlobsSize($"exam/{request.id}");
                         //发布对象为自选名单(校本)
                         List<StuList> stuLists = new List<StuList>();
                         await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<StuList>(queryText: $"select value(c) from c where c.id = '{request.classes[i]}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList-{request.school}") }))
@@ -177,6 +179,13 @@ namespace TEAMModelOS.Controllers
                     {
                         request.progress = "going";
                     }
+                    if (request.scope.Equals("school"))
+                    {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.school).GetBlobsSize($"exam/{request.id}");
+                    }
+                    else {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.creatorId).GetBlobsSize($"exam/{request.id}");
+                    }
                     int n = 0;
                     foreach (PaperSimple simple in request.papers)
                     {
@@ -186,6 +195,7 @@ namespace TEAMModelOS.Controllers
                     //request.papers
                     /*long SequenceNumber = await _serviceBus.GetServiceBusClient().SendLeamMessage<ExamInfo>(Constants.TopicName, request.id, request.code, request.startTime);
                     request.sequenceNumber = SequenceNumber;*/
+                    //await _azureStorage.GetBlobContainerClient("hbcn").GetBlobsCatalogSize($"exam/{request.id}");
                     exam = await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(request, new PartitionKey($"{request.code}"));
                     //await _serviceBus.GetServiceBusClient().SendLeamMessage<ExamInfo>(Constants.TopicName, request.id, request.code, request.startTime);
                     //request.sequenceNumber = SequenceNumber;
@@ -197,6 +207,14 @@ namespace TEAMModelOS.Controllers
                     {
                         return Ok(new { v = "活动正在进行中" });
                     }
+                    if (request.scope.Equals("school"))
+                    {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.school).GetBlobsSize($"exam/{request.id}");
+                    }
+                    else
+                    {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.creatorId).GetBlobsSize($"exam/{request.id}");
+                    }
                     request.progress = info.progress;
                     int n = 0;
                     foreach (PaperSimple simple in request.papers)
@@ -247,6 +265,8 @@ namespace TEAMModelOS.Controllers
                 var client = _azureCosmos.GetCosmosClient();
                 //string school_code = code.ToString().Substring(typeof(ExamClassResult).Name.Length + 1);
                 var response = await client.GetContainer("TEAMModelOS", "Common").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Exam-{code}"));
+                //删除blob 相关资料
+                await _azureStorage.GetBlobServiceClient().DelectBlobs(code.ToString(),$"exam/{id}");
                 List<ExamClassResult> examClassResults = new List<ExamClassResult>();
                 await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<ExamClassResult>(queryText: $"select c.id from c where c.examId = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ExamClassResult-{code}") }))
                 {

+ 17 - 1
TEAMModelOS/Controllers/Common/SurveyController.cs

@@ -76,7 +76,7 @@ namespace TEAMModelOS.Controllers
                 request.code = request.pk + "-" + request.code;
                 long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                 request.createTime = now;
-                request.ttl = -1;
+                request.ttl = -1;               
                 //如果设置的时间是小于当前时间则立即发布
                 if (request.startTime <= 0)
                 {
@@ -93,10 +93,26 @@ namespace TEAMModelOS.Controllers
                     {
                         request.progress = "going";
                     }
+                    if (request.scope.Equals("school"))
+                    {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.school).GetBlobsSize($"survey/{request.id}");
+                    }
+                    else
+                    {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.creatorId).GetBlobsSize($"survey/{request.id}");
+                    }
                     request = await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(request, new PartitionKey($"{request.code}"));
                 }
                 else {
                     var response = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(request.id, new PartitionKey($"{request.code}"));
+                    if (request.scope.Equals("school"))
+                    {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.school).GetBlobsSize($"survey/{request.id}");
+                    }
+                    else
+                    {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.creatorId).GetBlobsSize($"survey/{request.id}");
+                    }
                     if (response.Status == 200)
                     {
                         using var json = await JsonDocument.ParseAsync(response.ContentStream);

+ 17 - 0
TEAMModelOS/Controllers/Common/VoteController.cs

@@ -75,6 +75,7 @@ namespace TEAMModelOS.Controllers.Learn
                 request.ttl = -1;
                 long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                 request.createTime = now;
+               
                 //如果设置的时间是小于当前时间则立即发布
                 if (request.startTime <= 0) {
                     request.startTime = now;
@@ -90,11 +91,27 @@ namespace TEAMModelOS.Controllers.Learn
                     else { 
                         request.progress = "going"; 
                     }
+                    if (request.scope.Equals("school"))
+                    {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.school).GetBlobsSize($"vote/{request.id}");
+                    }
+                    else
+                    {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.creatorId).GetBlobsSize($"vote/{request.id}");
+                    }
                     request = await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(request, new PartitionKey($"{request.code}"));
                 }
                 else
                 {
                     var response = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(request.id, new PartitionKey($"{request.code}"));
+                    if (request.scope.Equals("school"))
+                    {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.school).GetBlobsSize($"vote/{request.id}");
+                    }
+                    else
+                    {
+                        request.size = await _azureStorage.GetBlobContainerClient(request.creatorId).GetBlobsSize($"vote/{request.id}");
+                    }
                     if (response.Status == 200)
                     {
                         using var json = await JsonDocument.ParseAsync(response.ContentStream);

+ 60 - 35
TEAMModelOS/Controllers/Item/ItemController.cs

@@ -32,19 +32,21 @@ namespace TEAMModelOS.Controllers
         private readonly AzureCosmosFactory _azureCosmos;
         private readonly DingDing _dingDing;
         private readonly Option _option;
-        public ItemController(AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option)
+        private readonly AzureStorageFactory _azureStorage;
+        public ItemController(AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage)
         {
             _azureCosmos = azureCosmos;
             _snowflakeId = snowflakeId;
             _dingDing = dingDing;
             _option = option?.Value;
+            _azureStorage = azureStorage;
         }
-        
+
         [ProducesDefaultResponseType]
         [HttpPost("upsert")]
         public async Task<IActionResult> Upsert(JsonElement request)
         {
-            
+
             /*            if (string.IsNullOrEmpty(request.id))
                         {
                             request.id = _snowflakeId.NextId() + "";
@@ -55,9 +57,12 @@ namespace TEAMModelOS.Controllers
             var client = _azureCosmos.GetCosmosClient();
             if (!request.TryGetProperty("itemInfo", out JsonElement item)) return BadRequest();
             if (!request.TryGetProperty("option", out JsonElement option)) return BadRequest();
-            try {
+            try
+            {
                 ItemInfo itemInfo;
-                itemInfo = item.ToObject<ItemInfo>();                
+                itemInfo = item.ToObject<ItemInfo>();
+                itemInfo.size = await _azureStorage.GetBlobContainerClient(itemInfo.code).GetBlobsSize($"item/{itemInfo.id}");
+
                 if (option.ToString().Equals("insert"))
                 {
                     itemInfo.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
@@ -110,11 +115,13 @@ namespace TEAMModelOS.Controllers
                     }
                 }
                 return Ok(new { itemInfo });
-            } catch (Exception ex) {
+            }
+            catch (Exception ex)
+            {
                 await _dingDing.SendBotMsg($"OS,{_option.Location},item/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
-            
+
         }
         /// <summary>
         //获取题目摘要信息
@@ -126,7 +133,8 @@ namespace TEAMModelOS.Controllers
         [HttpPost("find-summary")]
         public async Task<IActionResult> FindSummary(JsonElement requert)
         {
-            try {
+            try
+            {
                 var client = _azureCosmos.GetCosmosClient();
                 StringBuilder sql = new StringBuilder();
                 sql.Append("select c.id, c.question,c.useCount,c.level,c.field,c.knowledge,c.type,c.option,c.createTime from c ");
@@ -193,12 +201,14 @@ namespace TEAMModelOS.Controllers
                     }
                 }
                 return Ok(new { summary });
-            } catch (Exception ex) {
+            }
+            catch (Exception ex)
+            {
                 await _dingDing.SendBotMsg($"OS,{_option.Location},item/FindSummary()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
-            
-        }       
+
+        }
 
         /// <summary>
         /// 删除
@@ -210,7 +220,8 @@ namespace TEAMModelOS.Controllers
         [HttpPost("delete")]
         public async Task<IActionResult> Delete(JsonElement request)
         {
-            try {
+            try
+            {
                 if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
                 if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
                 if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
@@ -220,21 +231,24 @@ namespace TEAMModelOS.Controllers
                     var response = await client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"{code}"));
                     return Ok(new { code = response.Status });
                 }
-                else {
+                else
+                {
                     var response = await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"{code}"));
                     return Ok(new { code = response.Status });
                 }
 
-            } catch (Exception e) {
+            }
+            catch (Exception e)
+            {
                 await _dingDing.SendBotMsg($"OS,{_option.Location},item/FindSummary()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
 
-           /* ResponseBuilder builder = ResponseBuilder.custom();
-            IdPk idPk = await _azureCosmos.DeleteAsync<ItemInfo>( request );
-            return Ok(idPk);*/
+            /* ResponseBuilder builder = ResponseBuilder.custom();
+             IdPk idPk = await _azureCosmos.DeleteAsync<ItemInfo>( request );
+             return Ok(idPk);*/
         }
-        
+
         /// <summary>
         /// 手动挑题
         /// </summary>
@@ -245,7 +259,8 @@ namespace TEAMModelOS.Controllers
         [HttpPost("find")]
         public async Task<IActionResult> Find(JsonElement requert)
         {
-            try {
+            try
+            {
                 var client = _azureCosmos.GetCosmosClient();
                 StringBuilder sql = new StringBuilder();
                 sql.Append("select c.id,c.code,c.repairResource, c.periodId,c.question,c.useCount,c.level,c.field,c.knowledge,c.type,c.option,c.createTime,c.answer,c.explain,c.children,c.score,c.gradeIds,c.subjectId,c.blob,c.scope from c ");
@@ -293,16 +308,17 @@ namespace TEAMModelOS.Controllers
                 {
                     dict.Add("gradeIds[*]", gradeIds);
                 }
-                if (requert.TryGetProperty("pid",out JsonElement pd))
+                if (requert.TryGetProperty("pid", out JsonElement pd))
                 {
                     if (pd.ValueKind != JsonValueKind.Null)
                     {
                         dict.Add("pid", pd.ToString());
                     }
-                    else {
+                    else
+                    {
                         dict.Add("pid", null);
                     }
-                    
+
                 }
                 AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
                 List<object> items = new List<object>();
@@ -345,11 +361,12 @@ namespace TEAMModelOS.Controllers
                 return Ok(new { items });
                 //return builder.Data(items).build();
             }
-            catch (Exception e) {
+            catch (Exception e)
+            {
                 await _dingDing.SendBotMsg($"OS,{_option.Location},item/Find()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest(e.StackTrace);
             }
-            
+
         }
 
         /// <summary>
@@ -367,7 +384,8 @@ namespace TEAMModelOS.Controllers
             if (!requert.TryGetProperty("ids", out JsonElement id)) return BadRequest();
             //List<string> ids = new List<string>();
             string info = "";
-            for (int i = 0; i < id.GetArrayLength(); i++) {
+            for (int i = 0; i < id.GetArrayLength(); i++)
+            {
                 //ids.Add(id[i].ToJsonString());
                 info += id[i].ToJsonString() + ",";
             }
@@ -387,7 +405,7 @@ namespace TEAMModelOS.Controllers
             }
 
             return Ok(new { items });
-           
+
         }
 
         /// <summary>
@@ -398,7 +416,8 @@ namespace TEAMModelOS.Controllers
         [HttpPost("Automatic")]
         public async Task<IActionResult> Automatic(List<Compose> request)
         {
-            try {
+            try
+            {
                 //ResponseBuilder builder = ResponseBuilder.custom();
                 List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
                 var client = _azureCosmos.GetCosmosClient();
@@ -610,21 +629,24 @@ namespace TEAMModelOS.Controllers
                             itemInfos.Remove(itemInfo);
                         }
                     }
-                   
+
                     List<ItemInfo> restItem = new List<ItemInfo>();
                     //处理综合题问题
-                    foreach (var item in retnInfos) {
+                    foreach (var item in retnInfos)
+                    {
                         if (!string.IsNullOrWhiteSpace(item.pid))
                         {
                             if (item.scope == "school")
                             {
                                 var iteme = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<ItemInfo>(item.id, new PartitionKey(item.code));
-                                if (iteme != null) {
+                                if (iteme != null)
+                                {
                                     restItem.Add(iteme.Value);
                                 }
-                               
+
                             }
-                            else if (item.scope == "private") {
+                            else if (item.scope == "private")
+                            {
                                 var iteme = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<ItemInfo>(item.id, new PartitionKey(item.code));
                                 if (iteme != null)
                                 {
@@ -632,7 +654,8 @@ namespace TEAMModelOS.Controllers
                                 }
                             }
                         }
-                        else {
+                        else
+                        {
                             restItem.Add(item);
                         }
                     }
@@ -665,11 +688,13 @@ namespace TEAMModelOS.Controllers
 
                 //return builder.Data(list).build();
                 return Ok(list);
-            } catch (Exception e) {
+            }
+            catch (Exception e)
+            {
                 await _dingDing.SendBotMsg($"OS,{_option.Location},item/Automatic()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
-            
+
         }
     }
 

+ 5 - 2
TEAMModelOS/Controllers/Pager/PaperController.cs

@@ -27,10 +27,12 @@ namespace TEAMModelOS.Controllers
     {
         private readonly SnowflakeId _snowflakeId;
         private readonly AzureCosmosFactory _azureCosmos;
-        public PaperController(AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId)
+        private readonly AzureStorageFactory _azureStorage;
+        public PaperController(AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId,AzureStorageFactory azureStorage)
         {
             _azureCosmos = azureCosmos;
             _snowflakeId = snowflakeId;
+            _azureStorage = azureStorage;
         }
         /// <summary>
         /// 删除
@@ -197,9 +199,10 @@ namespace TEAMModelOS.Controllers
             Paper paper;
             paper = papers.ToObject<Paper>();            
             paper.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+            paper.size = await _azureStorage.GetBlobContainerClient(paper.code).GetBlobsSize($"paper/{paper.id}");
+            paper.code = "Paper-" + paper.code;
             if (option.ToString().Equals("insert"))
             {               
-                paper.code = "Paper-" + paper.code;
                 var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(paper.id, new PartitionKey($"{paper.code}"));
                 if (response.Status == 200)
                 {