Przeglądaj źródła

提前结算得分率缺考人数

zhouj1203@hotmail.com 4 lat temu
rodzic
commit
0de42c44d4

+ 57 - 0
TEAMModelFunction/TriggerExam.cs

@@ -3,6 +3,7 @@ using Azure.Messaging.ServiceBus;
 using Microsoft.Azure.Documents;
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Text;
 using System.Text.Json;
 using System.Threading.Tasks;
@@ -282,6 +283,43 @@ namespace TEAMModelFunction
                         await createClassResultAsync(info, examClassResults, subject, fno, _azureCosmos);
                         fno++;
                     }
+                    //计算单次考试简易统计信息
+                    List<ExamResult> examResults = new List<ExamResult>();
+                    await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<ExamResult>(
+                                       queryText: $"select value(c) from c where c.examId  = '{info.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamResult-{info.id}") }))
+                    {
+                        examResults.Add(item);
+                    }
+                    //记录某次考试所有学生得分总分
+                    double score = 0;
+                    double allScore = 0;
+                    int stuCount = 0;
+                    List<string> losStu = new List<string>();
+                    //先与第一个值取并集
+                    if (examResults.Count >0 ) {
+                        losStu.Union(examResults[0].lostStus);
+                        foreach (ExamResult examResult in examResults)
+                        {
+                            if (info.id == examResult.examId)
+                            {
+                                foreach (List<double> sc in examResult.studentScores)
+                                {
+                                    score += sc.Sum();
+                                }
+                                stuCount = examResult.studentIds.Count;
+                            }
+                            //取交集
+                            losStu = losStu.Intersect(examResult.lostStus).ToList();
+                        }
+                    }                                      
+                    double ascore = stuCount > 0 ? Math.Round(score * 0.1 / stuCount, 2) : 0;
+                    foreach (PaperSimple simple in info.papers)
+                    {
+                        allScore += simple.point.Sum();
+                    }
+                    info.sRate = allScore > 0 ? ascore / allScore * 100 : 0;
+                    info.lostStu = losStu;
+                    await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<ExamInfo>(info, info.id, new Azure.Cosmos.PartitionKey(info.code));
                     //ActivityData data;
                     if (info.scope == "school")
                     {
@@ -331,19 +369,35 @@ namespace TEAMModelFunction
             //人数总和
             int Count = 0;
             int m = 0;
+            double score = 0;
+            double allScore = info.papers[no].point.Sum();
             List<ClassRange> classRanges = new List<ClassRange>();
+            List<string> lostStu = new List<string>();
             foreach (ExamClassResult classResult in examClassResults)
             {
                 if (classResult.subjectId.Equals(subject.id))
                 {
+                    //记录缺考学生索引位置
+                    int index = 0;
                     foreach (List<double> scores in classResult.studentScores)
                     {
                         List<double> newScores = new List<double>();
+                        int count = 0;
                         foreach (double sc in scores) {
                             newScores.Add(sc > -1 ? sc : 0);
+                            if(sc == -1) {
+                                count++;
+                            }
                         }
+                        if (count == scores.Count) {
+                            lostStu.Add(classResult.studentIds[index]);
+                            //mcount++;
+                        }
+                        score += newScores.Sum();
                         result.studentScores.Add(newScores);
+                        index++;
                     }
+
                     //处理班级信息
                     ClassRange range = new ClassRange();
                     range.id = classResult.info.id;
@@ -372,6 +426,8 @@ namespace TEAMModelFunction
                     }
                 }
             }
+            result.lostStus = lostStu;
+            result.sRate =result.studentIds.Count> 0 ? Math.Round(score *1.0 / result.studentIds.Count ,2 ): 0 / allScore;
             result.classes = classRanges;
             result.code = "ExamResult-" + info.id;
             result.school = info.school;
@@ -384,6 +440,7 @@ namespace TEAMModelFunction
             result.scope = info.scope;
             result.name = info.name;
             result.time = info.startTime;
+
             await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Common").UpsertItemAsync(result, new Azure.Cosmos.PartitionKey($"ExamResult-{info.id}"));
 
         }

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

@@ -83,6 +83,10 @@ namespace TEAMModelOS.SDK.Models
         /// TTL删除改变状态使用
         /// </summary>
         public int? status { get; set; } = 0;
+        //得分率
+        public double sRate { get; set; }
+        //缺考人数
+        public List<string> lostStu { get; set; } = new List<string>();
     }
     public class Custom {
         public string id { get; set; }

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

@@ -36,6 +36,8 @@ namespace TEAMModelOS.SDK.Models
         public string examId { get; set; }
         public string school { get; set; }
         public int year { get; set; }
+        public double sRate { get; set; }
+        public List<string> lostStus { get; set; } = new List<string>();
     }
     public class ClassRange {