Browse Source

Merge branch 'develop5.0' of http://106.12.23.251:10080/TEAMMODEL/TEAMModelOS into develop5.0

jeff 4 năm trước cách đây
mục cha
commit
322a69ded1

+ 186 - 72
TEAMModelOS/Controllers/Analysis/AchievementController.cs

@@ -3610,7 +3610,7 @@ namespace TEAMModelOS.Controllers.Analysis
                 info.school = code.GetString();
                 info.type = examDtos.type;
                 info.scope = "school";
-                info.examType = examDtos.examType;                
+                info.examType = examDtos.examType;
                 await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(info, new PartitionKey($"Exam-{code}"));
                 return Ok(new { info });
             }
@@ -3640,7 +3640,8 @@ namespace TEAMModelOS.Controllers.Analysis
                 return BadRequest(new Dictionary<string, object> { { "msg", "type is not docx!" }, { "code", ResponseCode.FAILED } });
             }
 
-            try {
+            try
+            {
                 var client = _azureCosmos.GetCosmosClient();
                 var response = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(fileDto.examId, new PartitionKey($"Exam-{fileDto.code}"));
                 ExamInfo examInfo;
@@ -3795,11 +3796,13 @@ namespace TEAMModelOS.Controllers.Analysis
                 await Task.WhenAll(tasks);
 
                 return Ok(new { code = 200 });
-            } catch (Exception e) {
+            }
+            catch (Exception e)
+            {
                 await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/word()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
-            
+
         }
         [HttpPost("importResult")]
         [RequestSizeLimit(100_000_000)]//最大允许100M
@@ -3827,7 +3830,8 @@ namespace TEAMModelOS.Controllers.Analysis
                 {
                     return Ok(new { code = 404, msg = "请先录入评测数据" });
                 }
-                else {
+                else
+                {
                     foreach (ExamClassResultDto e in examClassResultDto)
                     {
                         int no = 0;
@@ -3845,7 +3849,7 @@ namespace TEAMModelOS.Controllers.Analysis
                         foreach (ExamClassResult ex in examClassResults)
                         {
                             if (e.subject.Equals(ex.subjectId))
-                            {                               
+                            {
                                 foreach (ClassResults examClass in e.examClassResult)
                                 {
                                     if (examClass.classInfo.id.Equals(ex.info.id))
@@ -3881,84 +3885,48 @@ namespace TEAMModelOS.Controllers.Analysis
                                             //存放客观题答案
                                             List<List<string>> objective = new List<List<string>>();
                                             int index_item = 0;
-                                                an.ForEach(aa =>
+                                            an.ForEach(aa =>
+                                            {
+                                                List<string> ans = new List<string>();
+                                                List<string> oans = new List<string>();
+                                                //判断此题是否为主观题作答
+                                                if (standard[index_item].Count == 0)
                                                 {
-                                                    List<string> ans = new List<string>();
-                                                    List<string> oans = new List<string>();
-                                                    //判断此题是否为主观题作答
-                                                    if (standard[index_item].Count == 0)
+                                                    ans.Add(aa);
+                                                    oans.Add("");
+                                                    answers.Add(ans);
+                                                    objective.Add(oans);
+                                                }
+                                                else
+                                                {
+                                                    if (aa.Length > 1)
                                                     {
-                                                        ans.Add(aa);
-                                                        oans.Add("");
-                                                        answers.Add(ans);
-                                                        objective.Add(oans);
-                                                    }
-                                                    else {
-                                                        if (aa.Length > 1)
-                                                        {
-                                                            char[] str = aa.ToCharArray();
-                                                            foreach (char a in aa)
-                                                            {
-                                                                switch (a)
-                                                                {
-                                                                    case '1':
-                                                                        ans.Add("A");
-                                                                        oans.Add("A");
-                                                                        break;
-                                                                    case '2':
-                                                                        ans.Add("B");
-                                                                        oans.Add("B");
-                                                                        break;
-                                                                    case '3':
-                                                                        ans.Add("C");
-                                                                        oans.Add("C");
-                                                                        break;
-                                                                    case '4':
-                                                                        ans.Add("D");
-                                                                        oans.Add("D");
-                                                                        break;
-                                                                    case '5':
-                                                                        ans.Add("E");
-                                                                        oans.Add("E");
-                                                                        break;
-                                                                    case '6':
-                                                                        ans.Add("F");
-                                                                        oans.Add("F");
-                                                                        break;
-                                                                    default:
-                                                                        ans.Add("");
-                                                                        oans.Add("");
-                                                                        break;
-                                                                }
-                                                            }
-                                                            objective.Add(oans);
-                                                            answers.Add(ans);
-                                                        }
-                                                        else
+                                                        char[] str = aa.ToCharArray();
+                                                        foreach (char a in aa)
                                                         {
-                                                            switch (aa)
+                                                            switch (a)
                                                             {
-                                                                case "1":
+                                                                case '1':
                                                                     ans.Add("A");
                                                                     oans.Add("A");
                                                                     break;
-                                                                case "2":
+                                                                case '2':
                                                                     ans.Add("B");
                                                                     oans.Add("B");
                                                                     break;
-                                                                case "3":
+                                                                case '3':
                                                                     ans.Add("C");
                                                                     oans.Add("C");
                                                                     break;
-                                                                case "4":
+                                                                case '4':
                                                                     ans.Add("D");
                                                                     oans.Add("D");
                                                                     break;
-                                                                case "5":
+                                                                case '5':
                                                                     ans.Add("E");
                                                                     oans.Add("E");
                                                                     break;
-                                                                case "6":
+                                                                case '6':
                                                                     ans.Add("F");
                                                                     oans.Add("F");
                                                                     break;
@@ -3967,13 +3935,50 @@ namespace TEAMModelOS.Controllers.Analysis
                                                                     oans.Add("");
                                                                     break;
                                                             }
-                                                            objective.Add(oans);
-                                                            answers.Add(ans);
                                                         }
-                                                    }                                                                                                        
-                                                    index_item++;
-                                                    //answers.Add(stuAns);                                          
-                                                });                                           
+                                                        objective.Add(oans);
+                                                        answers.Add(ans);
+                                                    }
+                                                    else
+                                                    {
+                                                        switch (aa)
+                                                        {
+                                                            case "1":
+                                                                ans.Add("A");
+                                                                oans.Add("A");
+                                                                break;
+                                                            case "2":
+                                                                ans.Add("B");
+                                                                oans.Add("B");
+                                                                break;
+                                                            case "3":
+                                                                ans.Add("C");
+                                                                oans.Add("C");
+                                                                break;
+                                                            case "4":
+                                                                ans.Add("D");
+                                                                oans.Add("D");
+                                                                break;
+                                                            case "5":
+                                                                ans.Add("E");
+                                                                oans.Add("E");
+                                                                break;
+                                                            case "6":
+                                                                ans.Add("F");
+                                                                oans.Add("F");
+                                                                break;
+                                                            default:
+                                                                ans.Add("");
+                                                                oans.Add("");
+                                                                break;
+                                                        }
+                                                        objective.Add(oans);
+                                                        answers.Add(ans);
+                                                    }
+                                                }
+                                                index_item++;
+                                                //answers.Add(stuAns);                                          
+                                            });
                                             ex.ans[index] = objective;
                                             string FileName = ex.examId + "/" + ex.subjectId + "/" + examClass.studentIds[index];
                                             string blob = FileName + "/" + "ans.json";
@@ -3988,7 +3993,7 @@ namespace TEAMModelOS.Controllers.Analysis
                             }
                         }
                     }
-                }                
+                }
                 foreach (ExamClassResult result in examClassResults)
                 {
                     result.progress = true;
@@ -4063,6 +4068,115 @@ namespace TEAMModelOS.Controllers.Analysis
                 return BadRequest();
             }
         }
+
+        //获取学校某学段班级信息
+        [HttpPost("getClass")]
+        public async Task<IActionResult> getClass(JsonElement request)
+        {
+            if (!request.TryGetProperty("periodId", out JsonElement periodId)) return BadRequest();
+            if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
+            try
+            {
+                var client = _azureCosmos.GetCosmosClient();
+                List<Class> classInfo = new List<Class>();
+                School school = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(code.ToString(), new PartitionKey("Base"));
+                var query = $"select value(c) from c where c.periodId = '{periodId}'";
+                await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Class>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{code}") }))
+                {
+                    classInfo.Add(item);
+                }
+                foreach (Class @class in classInfo)
+                {
+                    foreach (Period period in school.period)
+                    {
+                        if (period.id.Equals(@class.periodId))
+                        {
+                            switch (period.name)
+                            {
+                                case "小学":
+                                    foreach (Grade grade in period.grades)
+                                    {
+                                        if (@class.gradeId.Equals(grade.id))
+                                        {
+                                            switch (grade.name)
+                                            {
+                                                case "一年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 1;
+                                                    break;
+                                                case "二年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 2;
+                                                    break;
+                                                case "三年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 3;
+                                                    break;
+                                                case "四年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 4;
+                                                    break;
+                                                case "五年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 5;
+                                                    break;
+                                                case "六年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 6;
+                                                    break;
+                                            }
+                                        }
+                                    }
+                                    break;
+                                case "初中":
+                                    foreach (Grade grade in period.grades)
+                                    {
+                                        if (@class.gradeId.Equals(grade.id))
+                                        {
+                                            switch (grade.name)
+                                            {
+                                                case "七年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 1;
+                                                    break;
+                                                case "八年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 2;
+                                                    break;
+                                                case "九年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 3;
+                                                    break;
+                                            }
+                                        }
+                                    }
+                                    break;
+                                case "高中":
+                                    foreach (Grade grade in period.grades)
+                                    {
+                                        if (@class.gradeId.Equals(grade.id))
+                                        {
+                                            switch (grade.name)
+                                            {
+                                                case "十年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 1;
+                                                    break;
+                                                case "十一年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 2;
+                                                    break;
+                                                case "十二年级":
+                                                    @class.year = DateTimeOffset.UtcNow.Year - 3;
+                                                    break;
+                                                default:
+                                                    @class.year = DateTimeOffset.UtcNow.Year;
+                                                    break;
+                                            }
+                                        }
+                                    }
+                                    break;
+                            }
+                        }
+                    }
+                }
+                return Ok(new { classInfo });
+            }
+            catch (Exception e)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/getClassInfo()\n{e.Message}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest();
+            }
+        }
     }
 }
 //private List<Dictionary<string, dynamic>> getKnowledgePoint(List<ExamResult> examResults, ExamInfo info)

+ 91 - 13
TEAMModelOS/Controllers/Common/ExamController.cs

@@ -39,7 +39,7 @@ namespace TEAMModelOS.Controllers
         private readonly AzureStorageFactory _azureStorage;
         private readonly AzureRedisFactory _azureRedis;
 
-        public ExamController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId, DingDing dingDing, 
+        public ExamController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId, DingDing dingDing,
             IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis)
         {
             _azureCosmos = azureCosmos;
@@ -794,7 +794,8 @@ namespace TEAMModelOS.Controllers
                         examClassResults.Add(item);
                     }
                 }
-                else {
+                else
+                {
                     await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<ExamClassResult>(
                            queryText: $"select value(c) from c where c.examId = '{id}' and c.subjectId = '{subjectId}' and array_contains(c.studentIds,'{studentId}')",
                            requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ExamClassResult-{school}") }))
@@ -802,7 +803,7 @@ namespace TEAMModelOS.Controllers
                         examClassResults.Add(item);
                     }
                 }
-               
+
                 ExamClassResult classResult = new ExamClassResult();
                 //ExamInfo classResult = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"{code}"));
                 //ExamClassResult classResult = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamClassResult>(id.ToString(), new PartitionKey($"{code}"));
@@ -1422,17 +1423,29 @@ namespace TEAMModelOS.Controllers
                 if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
                 if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
                 if (!requert.TryGetProperty("subjectId", out JsonElement subjectId)) return BadRequest();
+                if (!requert.TryGetProperty("tmdId", out JsonElement tId)) return BadRequest();
                 var client = _azureCosmos.GetCosmosClient();
                 var redisClient = _azureRedis.GetRedisClient(8);
                 ExamInfo info = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"Exam-{code}"));
                 List<ExamClassResult> classResults = new();
-				List<dynamic> recs = new List<dynamic>();
-				var record = await redisClient.HashGetAllAsync($"Exam:Scoring:{id}-{subjectId}");
-				foreach (var rcd in record)
-				{
-					var value = JsonDocument.Parse(rcd.Value.ToString());
-					recs.Add(new { stuId = rcd.Name.ToString(), ans = value });
-				}
+                List<dynamic> recs = new List<dynamic>();
+                List<dynamic> all = new List<dynamic>();
+                var record = await redisClient.HashGetAllAsync($"Exam:Scoring:{id}-{subjectId}");
+                foreach (var rcd in record)
+                {
+                    var value = JsonDocument.Parse(rcd.Value.ToString());
+                    value.RootElement.TryGetProperty("tmdId", out JsonElement tmdId);
+                    if (tId.ToString().Equals(tmdId.ToString()))
+                    {
+                        recs.Add(new { stuId = rcd.Name.ToString(), ans = value });
+                    }
+                    else
+                    {
+                        all.Add(new { stuId = rcd.Name.ToString(), ans = value });
+                    }
+
+
+                }
                 int index = 0;
                 foreach (ExamSubject subject in info.subjects)
                 {
@@ -1445,6 +1458,72 @@ namespace TEAMModelOS.Controllers
                         break;
                     }
                 }
+                return Ok(new { recs, all, paper = info.papers[index].blob });
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},exam/scoring\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
+                return BadRequest();
+            }
+
+        }
+
+        //批阅,给老师随机分配阅卷数据,以及查询改老师已有的阅卷数据
+        [ProducesDefaultResponseType]
+        //[AuthToken(Roles = "Student")]
+        [HttpPost("review")]
+        public async Task<IActionResult> Review(JsonElement requert)
+        {
+            //ResponseBuilder builder = ResponseBuilder.custom();
+            //var (id, school) = HttpContext.GetAuthTokenInfo();
+            try
+            {
+                if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
+                if (!requert.TryGetProperty("subjectId", out JsonElement subjectId)) return BadRequest();
+                if (!requert.TryGetProperty("tmdId", out JsonElement tId)) return BadRequest();
+                var client = _azureCosmos.GetCosmosClient();
+                var redisClient = _azureRedis.GetRedisClient(8);
+                List<ExamClassResult> classResults = new();
+                List<dynamic> recs = new List<dynamic>();
+                List<dynamic> all = new List<dynamic>();
+                var record = await redisClient.HashGetAllAsync($"Exam:Scoring:{id}-{subjectId}");
+                foreach (var rcd in record)
+                {
+                    var value = JsonDocument.Parse(rcd.Value.ToString());
+                    value.RootElement.TryGetProperty("tmdId", out JsonElement tmdId);
+                    if (tId.ToString().Equals(tmdId.ToString()))
+                    {
+                        recs.Add(new { stuId = rcd.Name.ToString(), ans = value });
+                    }
+                    else
+                    {
+                        all.Add(new { stuId = rcd.Name.ToString(), ans = value });
+                    }
+                }
+                if (requert.TryGetProperty("stuId", out JsonElement stuId))
+                {
+                    var stuAns = await redisClient.HashGetAsync($"Exam:Scoring:{id}-{subjectId}", stuId.ToString());
+                    var value = JsonDocument.Parse(stuAns.ToString());
+                    return Ok(value);
+                }
+                else
+                {
+                    //随机选取一名学生打分
+                    Random random = new Random();
+                    int n = random.Next(all.Count);
+                    dynamic item = all[n];
+                    //序列化单个学生作答记录、得分情况、批注情况
+                    var cs = JsonSerializer.Serialize(item);
+                    var json = JsonDocument.Parse(cs);
+                    json.RootElement.TryGetProperty("stuId", out JsonElement sId);
+                    json.RootElement.TryGetProperty("ans", out JsonElement ans);
+                    ans.TryGetProperty("score", out JsonElement sc);
+                    ans.TryGetProperty("ans", out JsonElement blob);
+                    //选取后,缓存池相应的减少,以便于分配给其他的老师
+                    await redisClient.HashSetAsync($"Exam:Scoring:{id}-{subjectId}", sId.ToString(), new { ans = blob, score = sc, tmdId = tId }.ToJsonString());
+                    return Ok(item);
+                }
+
                 //var json = JsonDocument.Parse(record);
                 /*if (info.scope.Equals("school"))
 				{
@@ -1476,12 +1555,11 @@ namespace TEAMModelOS.Controllers
 
 				}
 				await Task.WhenAll(tasks);*/
-                //info = await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(info, info.id, new PartitionKey($"Exam-{code}"));
-                return Ok(new { recs,paper = info.papers[index].blob});
+                //info = await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(info, info.id, new PartitionKey($"Exam-{code}"));                
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},exam/scoring\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"OS,{_option.Location},exam/review\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
 

+ 13 - 17
TEAMModelOS/Controllers/Core/OpenApiController.cs

@@ -48,42 +48,38 @@ namespace TEAMModelOS.Controllers.Core
             return Ok(new { apis });
         }
         /// <summary>
-        /// {"code":"hbcn学校编码"} 
+        /// {"id":"uuid","code":"hbcn学校编码"} 
         /// </summary>
         /// <param name="requert"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [AuthToken(Roles = "admin")]
         [HttpPost("create-token")]
-        public async Task<IActionResult> CreateToken(OpenApp request) {
+        public async Task<IActionResult> CreateToken(JsonElement request) {
             try
             {
                 var client = _azureCosmos.GetCosmosClient();
-                request.pk = "OpenApp";
-                request.code = request.pk + "-" + request.code;
-                request.ttl = -1;
-                if (string.IsNullOrEmpty(request.id))
-                {
-                    return BadRequest();
-                }
-                else
-                {
-                    var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(request.id, new PartitionKey($"{request.code}"));
+                //id
+                if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
+                //
+                if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
+                
+                    var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(id.GetString(), new PartitionKey($"OpenApp-{code}")) ;
                     if (response.Status == 200)
                     {
-                        //创建Token
-                        var auth_token = JwtAuthExtension.CreateAppToken(_option.HostName, request.id,  _option.JwtSecretKey, request.school);
+                        
                         using var json = await JsonDocument.ParseAsync(response.ContentStream);
                         var info = json.ToObject<OpenApp>();
+                        //创建Token
+                        var auth_token = JwtAuthExtension.CreateAppToken(_option.HostName, info.id, _option.JwtSecretKey, info.school);
                         info.token = auth_token;
-                        request = await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(info, info.id, new PartitionKey($"{info.code}"));
+                        info = await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(info, info.id, new PartitionKey($"{info.code}"));
+                        return Ok(auth_token);
                     }
                     else
                     {
                         return BadRequest();
                     }
-                }
-                return Ok(new { app = request });
             }
             catch (Exception e)
             {