Browse Source

优化结算过程

zhouj1203@hotmail.com 4 years ago
parent
commit
34f321743a
2 changed files with 228 additions and 215 deletions
  1. 78 75
      TEAMModelFunction/MonitorCosmosDB.cs
  2. 150 140
      TEAMModelOS/Controllers/Common/ExamController.cs

+ 78 - 75
TEAMModelFunction/MonitorCosmosDB.cs

@@ -62,6 +62,7 @@ namespace TEAMModelFunction
                             case "Exam":
                                 ExamInfo info = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(input.Id, new Azure.Cosmos.PartitionKey($"{code}"));
                                 List<ExamClassResult> examClassResults = new List<ExamClassResult>();
+                                List<ExamSubject> examSubjects = new List<ExamSubject>();
                                 await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.examId = '{info.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{school}") }))
                                 {
                                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
@@ -106,22 +107,20 @@ namespace TEAMModelFunction
                                     case "going":
                                         if (examClassResults.Count == 0)
                                         {
-                                            // 初始化ExamClassResult
-                                            for (int j = 0; j < info.subjects.Count; j++)
-                                            {
-                                                for (int k = 0; k < info.targetClassIds.Count; k++)
-                                                {
+                                            foreach (string cla in info.targetClassIds) {
+                                                int m = 0;
+                                                foreach (ExamSubject subject in info.subjects) {
                                                     ExamClassResult result = new ExamClassResult
                                                     {
                                                         code = "ExamClassResult-" + info.school,
                                                         examId = info.id,
                                                         id = Guid.NewGuid().ToString(),
-                                                        subjectId = info.subjects[j].id,
+                                                        subjectId = subject.id,
                                                         year = info.year,
                                                         scope = info.scope
                                                     };
-                                                    result.info.id = info.targetClassIds[k];
-                                                    var sresponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(info.targetClassIds[k], new Azure.Cosmos.PartitionKey($"Class-{info.school}"));
+                                                    result.info.id = cla;
+                                                    var sresponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(cla, new Azure.Cosmos.PartitionKey($"Class-{info.school}"));
                                                     if (sresponse.Status == 200)
                                                     {
                                                         using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
@@ -129,7 +128,7 @@ namespace TEAMModelFunction
                                                         result.info.name = classroom.name;
                                                         List<List<string>> ans = new List<List<string>>();
                                                         List<double> ansPoint = new List<double>();
-                                                        foreach (double p in info.papers[j].point)
+                                                        foreach (double p in info.papers[m].point)
                                                         {
                                                             ans.Add(new List<string>());
                                                             ansPoint.Add(-1);
@@ -144,8 +143,8 @@ namespace TEAMModelFunction
                                                     }
                                                     //result.progress = info.progress;
                                                     result.school = info.school;
+                                                    m++;
                                                     await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(result, new Azure.Cosmos.PartitionKey($"{result.code}"));
-
                                                 }
                                             }
                                             // 发送信息通知
@@ -175,76 +174,23 @@ namespace TEAMModelFunction
                                         }
                                         else
                                         {
-                                            for (int j = 0; j < info.subjects.Count; j++)
-                                            {
-                                                if (info.subjects[j].classCount == info.targetClassIds.Count)
-                                                {
-                                                    info.progress = "finish";
-                                                    await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(info, info.id, new Azure.Cosmos.PartitionKey($"{code}"));
+                                            //处理单科结算时科目与试卷信息匹配的问题
+                                            int gno = 0;
+                                            foreach (ExamSubject subject in info.subjects) {
+                                                if (subject.classCount == info.targetClassIds.Count) {
+                                                    await createClassResultAsync(info, examClassResults, subject, gno);
                                                 }
-                                            }
+                                                gno++;
+                                            }                                           
                                         }
                                         break;
                                     case "finish":
-                                        for (int j = 0; j < info.subjects.Count; j++)
-                                        {
-                                            ExamResult result = new ExamResult();
-                                            //人数总和
-                                            int Count = 0;
-                                            int m = 0;
-                                            List<ClassRange> classRanges = new List<ClassRange>();
-                                            foreach (ExamClassResult classResult in examClassResults)
-                                            {
-                                                if (classResult.subjectId.Equals(info.subjects[j].id))
-                                                {
-                                                    foreach (List<double> scores in classResult.studentScores)
-                                                    {
-                                                        result.studentScores.Add(scores);
-                                                    }
-                                                    //处理班级信息
-                                                    ClassRange range = new ClassRange();
-                                                    range.id = classResult.info.id;
-                                                    range.name = classResult.info.name;
-                                                    List<int> ran = new List<int>();
-                                                    int stuCount = classResult.studentIds.Count;
-                                                    Count += stuCount;
-                                                    if (m == 0)
-                                                    {
-                                                        ran.Add(0);
-                                                        ran.Add(stuCount - 1);
-                                                    }
-                                                    else
-                                                    {
-                                                        ran.Add(Count - stuCount);
-                                                        ran.Add(Count - 1);
-                                                    }
-                                                    m++;
-                                                    range.range = ran;
-                                                    classRanges.Add(range);
-                                                    //处理学生ID
-                                                    foreach (string id in classResult.studentIds)
-                                                    {
-                                                        result.studentIds.Add(id);
-                                                    }
-                                                }
-                                            }
-                                            result.classes = classRanges;
-                                            result.pk = typeof(ExamResult).Name;
-                                            result.code = "ExamResult-" + info.id;
-                                            result.school = info.school;
-                                            result.id = info.subjects[j].id;
-                                            result.examId = info.id;
-                                            result.subjectId = info.subjects[j].id;
-                                            result.year = info.year;
-                                            result.paper = info.papers[j];
-                                            //result.point = info.papers[j].point;
-                                            result.scope = info.scope;
-                                            result.name = info.name;
-                                            result.time = info.startTime;
-                                            result.ttl = -1;
-                                            await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Common").UpsertItemAsync(result, new Azure.Cosmos.PartitionKey($"ExamResult-{info.id}"));
-
+                                        int fno = 0;
+                                        foreach (ExamSubject subject in info.subjects) {
+                                            await createClassResultAsync(info, examClassResults, subject, fno);
+                                            fno++;
                                         }
+                                       
                                         break;
                                 }
                                 break;
@@ -371,5 +317,62 @@ namespace TEAMModelFunction
                 }
             }
         }
+        public async Task createClassResultAsync(ExamInfo info,List<ExamClassResult> examClassResults,ExamSubject subject,int no) {
+            //保证试卷信息与科目信息同步
+                ExamResult result = new ExamResult();
+                //人数总和
+                int Count = 0;
+                int m = 0;
+                List<ClassRange> classRanges = new List<ClassRange>();
+                foreach (ExamClassResult classResult in examClassResults)
+                {
+                    if (classResult.subjectId.Equals(subject.id))
+                    {
+                        foreach (List<double> scores in classResult.studentScores)
+                        {
+                            result.studentScores.Add(scores);
+                        }
+                        //处理班级信息
+                        ClassRange range = new ClassRange();
+                        range.id = classResult.info.id;
+                        range.name = classResult.info.name;
+                        List<int> ran = new List<int>();
+                        int stuCount = classResult.studentIds.Count;
+                        Count += stuCount;
+                        if (m == 0)
+                        {
+                            ran.Add(0);
+                            ran.Add(stuCount - 1);
+                        }
+                        else
+                        {
+                            ran.Add(Count - stuCount);
+                            ran.Add(Count - 1);
+                        }
+                        m++;
+                        range.range = ran;
+                        classRanges.Add(range);
+                        //处理学生ID 
+                        foreach (string id in classResult.studentIds)
+                        {
+                            result.studentIds.Add(id);
+                        }
+                    }
+                }
+                result.classes = classRanges;
+                result.code = "ExamResult-" + info.id;
+                result.school = info.school;
+                result.id = subject.id;
+                result.examId = info.id;
+                result.subjectId = subject.id;
+                result.year = info.year;
+                result.paper = info.papers[no];
+                //result.point = info.papers[j].point;
+                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}"));
+            
+        }
     }
 }

+ 150 - 140
TEAMModelOS/Controllers/Common/ExamController.cs

@@ -306,7 +306,7 @@ namespace TEAMModelOS.Controllers
                         }
                     }
                 }
-                ExamClassResult classResult;
+                ExamClassResult classResult = new ExamClassResult() ;
                 List<PaperSimple> standerAnswers = new List<PaperSimple>();
                 await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(
                     queryText: $"select A0.point,A0.answers from c join A0 in c.papers where c.id = '{id}'and A0.id = '{paperId}'",
@@ -322,158 +322,165 @@ namespace TEAMModelOS.Controllers
                     }
                 }
                 List<List<string>> ans = answer.ToObject<List<List<string>>>();
-                List<List<string>> standard = standerAnswers[0].answers;
-                List<double> points = standerAnswers[0].point;
-                int index = examClassResults[0].studentIds.IndexOf(studentId.ToString());
+                List<List<string>> standard = new List<List<string>>();
+                List<double> points = new List<double>();
                 int rule = int.Parse(multipleRule.ToString());
-                //classResult.studentAnswers[index] = ans;
-                if (index == -1)
-                {
-                    examClassResults[0].studentIds.Add(studentId.ToString());
-                    examClassResults[0].studentScores.Add(new List<double>());
-                    examClassResults[0].studentAnswers.Add(new List<List<string>>());
+                foreach (PaperSimple simple in standerAnswers) {
+                    standard = simple.answers;
+                    points = simple.point;
                 }
-                for (int i = 0; i < ans.Count; i++)
-                {
-                    examClassResults[0].studentAnswers[index][i] = ans[i];
-                    //算分处理
-                    if (standard[i].Count > 0)
+                foreach (ExamClassResult result in examClassResults) {
+                    int index = result.studentIds.IndexOf(studentId.ToString());
+                    //classResult.studentAnswers[index] = ans;
+                    if (index == -1)
+                    {
+                        result.studentIds.Add(studentId.ToString());
+                        result.studentScores.Add(new List<double>());
+                        result.studentAnswers.Add(new List<List<string>>());
+                    }
+                    for (int i = 0; i < ans.Count; i++)
                     {
-                        if (ans[i].Count == standard[i].Count && standard[i].Count == 1)
+                        result.studentAnswers[index][i] = ans[i];
+                        //算分处理
+                        if (standard[i].Count > 0)
                         {
-                            foreach (string right in ans[i])
+                            if (ans[i].Count == standard[i].Count && standard[i].Count == 1)
                             {
-                                if (standard[i].Contains(right))
+                                foreach (string right in ans[i])
                                 {
-                                    examClassResults[0].studentScores[index][i] = points[i];
-                                }
-                                else
-                                {
-                                    examClassResults[0].studentScores[index][i] = 0;
+                                    if (standard[i].Contains(right))
+                                    {
+                                        result.studentScores[index][i] = points[i];
+                                    }
+                                    else
+                                    {
+                                        result.studentScores[index][i] = 0;
+                                    }
                                 }
-                            }
 
-                        }
-                        else
-                        {
-                            if (rule > 0)
+                            }
+                            else
                             {
-                                int falseCount = 0;
-                                foreach (string obj in ans[i])
+                                if (rule > 0)
                                 {
-                                    if (!standard[i].Contains(obj))
+                                    int falseCount = 0;
+                                    foreach (string obj in ans[i])
                                     {
-                                        falseCount++;
-                                    }
-                                }
-                                switch (rule)
-                                {
-                                    case 1:
-                                        if (ans[i].Count == standard[i].Count)
+                                        if (!standard[i].Contains(obj))
                                         {
-                                            if (falseCount == 0)
+                                            falseCount++;
+                                        }
+                                    }
+                                    switch (rule)
+                                    {
+                                        case 1:
+                                            if (ans[i].Count == standard[i].Count)
                                             {
-                                                examClassResults[0].studentScores[index][i] = points[i];
+                                                if (falseCount == 0)
+                                                {
+                                                    result.studentScores[index][i] = points[i];
+                                                }
+                                                else
+                                                {
+                                                    result.studentScores[index][i] = 0;
+                                                }
                                             }
                                             else
                                             {
-                                                examClassResults[0].studentScores[index][i] = 0;
+                                                result.studentScores[index][i] = 0;
                                             }
-                                        }
-                                        else
-                                        {
-                                            examClassResults[0].studentScores[index][i] = 0;
-                                        }
-                                        break;
-                                    case 2:
-                                        if (falseCount > 0)
-                                        {
-                                            examClassResults[0].studentScores[index][i] = 0;
-                                        }
-                                        else
-                                        {
-                                            if (ans[i].Count == standard[i].Count)
+                                            break;
+                                        case 2:
+                                            if (falseCount > 0)
                                             {
-                                                examClassResults[0].studentScores[index][i] = points[i];
+                                                result.studentScores[index][i] = 0;
                                             }
                                             else
                                             {
-                                                examClassResults[0].studentScores[index][i] = points[i] / 2;
-                                            }
+                                                if (ans[i].Count == standard[i].Count)
+                                                {
+                                                    result.studentScores[index][i] = points[i];
+                                                }
+                                                else
+                                                {
+                                                    result.studentScores[index][i] = points[i] / 2;
+                                                }
 
-                                        }
-                                        break;
-                                    case 3:
-                                        if (falseCount > 0)
-                                        {
-                                            examClassResults[0].studentScores[index][i] = 0;
-                                        }
-                                        else
-                                        {
-                                            if (ans[i].Count == standard[i].Count)
+                                            }
+                                            break;
+                                        case 3:
+                                            if (falseCount > 0)
                                             {
-                                                examClassResults[0].studentScores[index][i] = points[i];
+                                                result.studentScores[index][i] = 0;
                                             }
                                             else
                                             {
-                                                examClassResults[0].studentScores[index][i] = System.Math.Round((double)ans[i].Count / standard[i].Count * points[i], 1);
-                                            }
+                                                if (ans[i].Count == standard[i].Count)
+                                                {
+                                                    result.studentScores[index][i] = points[i];
+                                                }
+                                                else
+                                                {
+                                                    result.studentScores[index][i] = System.Math.Round((double)ans[i].Count / standard[i].Count * points[i], 1);
+                                                }
 
-                                        }
-                                        break;
-                                    case 4:
-                                        if (ans[i].Count == standard[i].Count)
-                                        {
-                                            examClassResults[0].studentScores[index][i] = points[i];
-                                        }
-                                        else
-                                        {
-                                            double persent = (double)(standard[i].Count - 2 * falseCount) / standard[i].Count;
-                                            if (persent <= 0)
+                                            }
+                                            break;
+                                        case 4:
+                                            if (ans[i].Count == standard[i].Count)
                                             {
-                                                examClassResults[0].studentScores[index][i] = 0;
+                                                result.studentScores[index][i] = points[i];
                                             }
                                             else
                                             {
-                                                examClassResults[0].studentScores[index][i] = System.Math.Round(persent * points[i], 1);
+                                                double persent = (double)(standard[i].Count - 2 * falseCount) / standard[i].Count;
+                                                if (persent <= 0)
+                                                {
+                                                    result.studentScores[index][i] = 0;
+                                                }
+                                                else
+                                                {
+                                                    result.studentScores[index][i] = System.Math.Round(persent * points[i], 1);
+                                                }
                                             }
-                                        }
-                                        break;
+                                            break;
+                                    }
                                 }
                             }
                         }
                     }
-                }
-                /*if (examClassResults[0].studentScores.Contains(-1)) { 
+                    /*if (result.studentScores.Contains(-1)) { 
 
-                }*/
-                bool flag = true;
-                foreach (List<double> scores in examClassResults[0].studentScores)
-                {
-                    foreach (double score in scores)
+                    }*/
+                    bool flag = true;
+                    foreach (List<double> scores in result.studentScores)
                     {
-                        if (score == -1)
+                        foreach (double score in scores)
                         {
-                            flag = false;
-                            break;
+                            if (score == -1)
+                            {
+                                flag = false;
+                                break;
+                            }
                         }
                     }
-                }
-                if (flag)
-                {
-                    ExamInfo exam = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"Exam-{school}"));
-                    examClassResults[0].progress = true;
-                    exam.subjects.ForEach(s =>
+                    if (flag)
                     {
-                        if (s.id.Equals(subjectId.ToString()))
+                        ExamInfo exam = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"Exam-{school}"));
+                        result.progress = true;
+                        exam.subjects.ForEach(s =>
                         {
-                            s.classCount += 1;
-                        }
-                    });
-                    await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(exam, id.ToString(), new PartitionKey($"Exam-{school}"));
+                            if (s.id.Equals(subjectId.ToString()))
+                            {
+                                s.classCount += 1;
+                            }
+                        });
+                        await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(exam, id.ToString(), new PartitionKey($"Exam-{school}"));
+                    }
+                    result.sum[index] = result.studentScores[index].Sum();
+                    classResult = await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(result, result.id, new PartitionKey($"{result.code}"));
                 }
-                examClassResults[0].sum[index] = examClassResults[0].studentScores[index].Sum();
-                classResult = await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(examClassResults[0], examClassResults[0].id, new PartitionKey($"{examClassResults[0].code}"));
+                
                 return Ok(new { classResult });
             }
             catch (Exception e)
@@ -517,53 +524,56 @@ namespace TEAMModelOS.Controllers
                         }
                     }
                 }
-                ExamClassResult classResult;
+                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}"));
                 /*foreach (double index in ans) {
                     classResult.studentScores.in
                 }*/
-                int index = examClassResults[0].studentIds.IndexOf(studentId.ToString());
-                for (int i = 0; i < ans.Count; i++)
-                {
-                    examClassResults[0].studentScores[index][i] = ans[i];
-                }
-                if (!examClassResults[0].progress)
-                {
-                    bool flag = true;
-                    foreach (List<double> scores in examClassResults[0].studentScores)
+                foreach (ExamClassResult result in examClassResults) {
+                    int index = result.studentIds.IndexOf(studentId.ToString());
+                    for (int i = 0; i < ans.Count; i++)
                     {
-                        foreach (double score in scores)
+                        result.studentScores[index][i] = ans[i];
+                    }
+                    if (!result.progress)
+                    {
+                        bool flag = true;
+                        foreach (List<double> scores in result.studentScores)
                         {
-                            if (score == -1)
+                            foreach (double score in scores)
                             {
-                                flag = false;
-                                break;
+                                if (score == -1)
+                                {
+                                    flag = false;
+                                    break;
+                                }
                             }
                         }
+                        if (flag)
+                        {
+                            ExamInfo exam = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"Exam-{school}"));
+                            result.progress = true;
+                            exam.subjects.ForEach(s =>
+                            {
+                                if (s.id.Equals(subjectId.ToString()))
+                                {
+                                    s.classCount += 1;
+                                }
+                            });
+                            await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(exam, id.ToString(), new PartitionKey($"Exam-{school}"));
+                        }
                     }
-                    if (flag)
+                    else
                     {
                         ExamInfo exam = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"Exam-{school}"));
-                        examClassResults[0].progress = true;
-                        exam.subjects.ForEach(s =>
-                        {
-                            if (s.id.Equals(subjectId.ToString()))
-                            {
-                                s.classCount += 1;
-                            }
-                        });
+                        exam.updateTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                         await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(exam, id.ToString(), new PartitionKey($"Exam-{school}"));
                     }
+                    result.sum[index] = result.studentScores[index].Sum();
+                    classResult = await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(result, result.id, new PartitionKey($"{result.code}"));
                 }
-                else
-                {
-                    ExamInfo exam = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"Exam-{school}"));
-                    exam.updateTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                    await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(exam, id.ToString(), new PartitionKey($"Exam-{school}"));
-                }
-                examClassResults[0].sum[index] = examClassResults[0].studentScores[index].Sum();
-                classResult = await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync(examClassResults[0], examClassResults[0].id, new PartitionKey($"{examClassResults[0].code}"));
+                
                 return Ok(new { classResult });
             }
             catch (Exception ex)