zhouj1203@hotmail.com 3 éve
szülő
commit
39c9edf19e

+ 1 - 1
TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs

@@ -144,7 +144,7 @@ namespace TEAMModelOS.FunctionV4
                                         rGroup = members.Where(m => m.id.Equals(cla)).FirstOrDefault();
                                         foreach (ExamSubject subject in info.subjects)
                                         {
-                                            string classCode = String.Empty;
+                                            string classCode = string.Empty;
                                             string cname = string.Empty;
                                             if (string.IsNullOrEmpty(info.school) || !info.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
                                             {

+ 3 - 1
TEAMModelOS.FunctionV4/CosmosDB/TriggerHomework.cs

@@ -129,6 +129,7 @@ namespace TEAMModelOS.FunctionV4
                                         owner = work.owner,
                                         createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
                                         taskStatus = -1,
+                                        mustSubmit = work.mustSubmit,
                                         classIds = classIds.ToList()
                                     });
                                 });
@@ -164,7 +165,8 @@ namespace TEAMModelOS.FunctionV4
                                         owner = work.owner,
                                         createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
                                         taskStatus = -1,
-                                        classIds = classIds.ToList()
+                                        classIds = classIds.ToList(),
+                                        mustSubmit = work.mustSubmit
                                     });
                                 });
                             }

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

@@ -71,5 +71,7 @@ namespace TEAMModelOS.SDK.Models
         public Dictionary<string, JsonElement> ext { get; set; } = new Dictionary<string, JsonElement>();
         /// 评分状态,0,未评分, 1已评分
         public int sStatus { get; set; } = 0;
+        //标记作业活动是否比交
+        public bool mustSubmit { get; set; } = false;
     }
 }

+ 117 - 103
TEAMModelOS/Controllers/Analysis/AnalysisController.cs

@@ -22,6 +22,7 @@ using TEAMModelOS.SDK.Models.Cosmos;
 using System.Text;
 using Microsoft.AspNetCore.Authorization;
 using TEAMModelOS.Filter;
+using TEAMModelOS.SDK.Models.Service;
 
 namespace TEAMModelOS.Controllers.Analysis
 {
@@ -34,11 +35,13 @@ namespace TEAMModelOS.Controllers.Analysis
         private readonly Option _option;
         private const string CacheCosmosPrefix = "Analysis:";
         private const int timeoutSeconds = 3600;
-        public AnalysisController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option)
+        private readonly CoreAPIHttpService _coreAPIHttpService;
+        public AnalysisController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option,CoreAPIHttpService coreAPIHttpService)
         {
             _azureCosmos = azureCosmos;
             _dingDing = dingDing;
             _option = option?.Value;
+            _coreAPIHttpService = coreAPIHttpService;
         }
         [ProducesDefaultResponseType]
         [HttpPost("process")]
@@ -309,18 +312,20 @@ namespace TEAMModelOS.Controllers.Analysis
                     ipoint = gradeTotal[personCount];
                 }
                 //以班级为单位(此处处理的是行政班级,教学班暂未处理)
-                foreach (string classId in info.classes)
+                List<string> clas = ExamService.getClasses(info.classes, info.stuLists);
+                (List<RMember> members, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(_coreAPIHttpService, client, _dingDing, clas, info.school, null);
+                foreach (RGroupList rGroup in classLists)
                 {
-                    Class classroom = null;
+                   /* Class classroom = null;
                     var sresponse = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(classId, new PartitionKey($"Class-{code}"));
                     if (sresponse.Status == 200)
                     {
                         using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
                         classroom = json.ToObject<Class>();
 
-                    }
+                    }*/
                     //处理班级
-                    var classRes = classReses.Where(x => x.id == classId).FirstOrDefault();
+                    var classRes = classReses.Where(x => x.id == rGroup.id).FirstOrDefault();
                     var stuCount = classRes.range[1] - classRes.range[0] + 1;
                     var classStudents = students.GetRange(classRes.range[0], classRes.range[1] - classRes.range[0] + 1);
                     List<double> stuTotals = classStudents.Select(x => x.total).ToList();
@@ -360,18 +365,18 @@ namespace TEAMModelOS.Controllers.Analysis
                         fieldClassTotal.Add(new KeyValuePair<string, List<double>>(sub, fields));
 
                     });
-                    List<Student> stus = new List<Student>();
+                    /*List<Student> stus = new List<Student>();
                     await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<Student>(queryText: $"select c.id,c.name,c.no from c where c.classId = '{classId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{code}") }))
                     {
                         stus.Add(item);
-                    }
+                    }*/
                     classStudents.ForEach(x =>
                     {
                         studentIds.Add(x.id);
-                        x.classId = classId;
-                        x.className = examClassResults.FirstOrDefault(e => e.info.id.Equals(classId)).info.name;
-                        x.gradeId = examClassResults.FirstOrDefault(e => e.info.id.Equals(classId)).gradeId;
-                        var stu = stus.Where(s => s.id == x.id).FirstOrDefault();
+                        x.classId = rGroup.id;
+                        x.className = examClassResults.FirstOrDefault(e => e.info.id.Equals(rGroup.id)).info.name;
+                        x.gradeId = examClassResults.FirstOrDefault(e => e.info.id.Equals(rGroup.id)).gradeId;
+                        var stu = members.Where(s => s.id == x.id).FirstOrDefault();
                         if (stu != null)
                         {
                             x.name = stu.name;
@@ -428,13 +433,13 @@ namespace TEAMModelOS.Controllers.Analysis
                     //var pow = Math.Pow(powSum / stuCount, 0.5);
                     ClassAys classAys = new ClassAys
                     {
-                        gradeId = examClassResults.FirstOrDefault(e => e.info.id.Equals(classId)).gradeId,
-                        year = classroom.year,
+                        gradeId = examClassResults.FirstOrDefault(e => e.info.id.Equals(rGroup.id)).gradeId ?? "",
+                        year = rGroup.year,
                         studentIds = studentIds,
                         stuCount = stuCount,
-                        classId = classId,
+                        classId = rGroup.id,
                         csRate = totalAll > 0 ? Math.Round(totalAverage / totalAll * 100, 2) : 0,
-                        className = classroom.name,
+                        className = rGroup.name,
                         totalAverage = totalAverage,
                         lineCount = lineCount,
                         standardDeviation = pow
@@ -469,15 +474,15 @@ namespace TEAMModelOS.Controllers.Analysis
                         {
                             fieldPoints.Add(stuCount > 0 ? Math.Round(s * 1.0 / stuCount, 2) : 0);
                         });
-                        double val = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == classId).standard;
-                        List<double> krate = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == classId).krate;
-                        List<int> phc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == classId).phc;
-                        List<int> plc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == classId).plc;
-                        List<int> pc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == classId).pc;
-                        List<double> frate = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == classId).frate;
-                        List<int> fphc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == classId).fphc;
-                        List<int> fplc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == classId).fplc;
-                        List<int> fpc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == classId).fpc;
+                        double val = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == rGroup.id).standard;
+                        List<double> krate = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == rGroup.id).krate;
+                        List<int> phc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == rGroup.id).phc;
+                        List<int> plc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == rGroup.id).plc;
+                        List<int> pc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == rGroup.id).pc;
+                        List<double> frate = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == rGroup.id).frate;
+                        List<int> fphc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == rGroup.id).fphc;
+                        List<int> fplc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == rGroup.id).fplc;
+                        List<int> fpc = examClassResults.FirstOrDefault(c => c.subjectId == key && c.info.id == rGroup.id).fpc;
                         classAys.subjects.Add(new AysSubject
                         {
                             point = tt,
@@ -497,77 +502,83 @@ namespace TEAMModelOS.Controllers.Analysis
                             fpc = fpc,
                             sRate = paperScore[key] > 0 ? Math.Round(average / paperScore[key] * 100, 2) : 0,
                             name = info.subjects.Where(x => x.id == key).FirstOrDefault().name,
-                            item = classSubjectPaperDatas.Where(subd => subd.Key == key).First().Value.Where(cls => cls.Key == classId).First().Value
+                            item = classSubjectPaperDatas.Where(subd => subd.Key == key).First().Value.Where(cls => cls.Key == rGroup.id).First().Value
                         });
                     }
                     classes.Add(classAys);
                 }
                 //处理年级
-                var tgrades = classes.GroupBy(x => x.year).Select(x => x.Key).OrderBy(c => c);
+                var tgrades = classes.GroupBy(x => x.year).Select(x => x.Key).OrderBy(c => c).ToList();
                 int n = 0;
-                foreach (var greade in tgrades)
+                if (tgrades.Count > 0)
                 {
-                    string gid = info.grades[n].id;
-                    var clases = classes.Where(x => x.year.Equals(greade));
-                    var classCount = clases.Count();
-                    var stu = clases.SelectMany(x => x.studentIds).ToList();
-                    var lineCount = clases.Select(x => x.lineCount).Sum();
-                    var totalAverage = clases.Select(x => x.totalAverage).Sum() * 1.0 / classCount;
-                    GradeAys gradeAys = new GradeAys
-                    {
-                        gradeId = gid,
-                        studentIds = stu,
-                        gradeName = info.grades[n].name,
-                        stuCount = stu.Count,
-                        lineCount = lineCount,
-                        totalAverage = totalAverage,
-                    };
-                    foreach (var key in paperScore.Keys)
-                    {
-                        var AysSubject = clases.SelectMany(c => c.subjects).Where(x => x.id.Equals(key)).Select(x => x).ToList();
-                        var passCount = AysSubject.Select(x => x.passCount).Sum();
-                        var average = Math.Round(AysSubject.Select(x => x.average).Sum() * 1.0 / classCount);
-                        var passPercent = stu.Count > 0 ? Math.Round(passCount * 1.0 / stu.Count, 2) : 0;
-                        //var passPercent = Math.Round(passCount * 1.0 / stu.Count,2);
-                        AysSubject subject = new AysSubject
-                        {
-                            id = key,
-                            passCount = passCount,
-                            passPercent = passPercent,
-                            average = average,
-                            name = info.subjects.Where(x => x.id == key).FirstOrDefault().name,
-                            item = gscores.Where(x => x.Key == key).FirstOrDefault().Value.Where(cls => cls.Key == gid).FirstOrDefault().Value
-                        };
-                        gradeAys.subjects.Add(subject);
-                    }
-                    grades.Add(gradeAys);
-                    //处理学生年级相关的pr值
-                    var studentAys = students.Where(x => x.gradeId.Equals(gid)).ToList();
-                    var stuGradeTotal = studentAys.Select(x => x.total).ToList();
-                    stuGradeTotal.Sort((s1, s2) => { return s2.CompareTo(s1); });
-                    var stuCount = stuGradeTotal.Count;
-                    studentAys.ForEach(x =>
-                    {
-                        //年级全科的pr
-                        int index = stuGradeTotal.IndexOf(x.total);
-                        double GPR = stuCount > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / stuCount) : 0;
-                        //double GPR = 100 - (100 * (index + 1) - 50) / stuCount;
-                        x.gpr = GPR;
-                        x.gsort = index + 1;
-                        //年级单科的pr
-                        x.subjects.ForEach(y =>
+                    if (info.grades.Count > 0) {
+                        foreach (var greade in tgrades) 
                         {
-                            var subjectT = studentAys.SelectMany(s => s.subjects).Where(sub => sub.id == y.id).Select(scr => scr.score).ToList();
-                            subjectT.Sort((s1, s2) => { return s2.CompareTo(s1); });
-                            int index = subjectT.IndexOf(y.score);
-                            double GPR = stuCount > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / stuCount) : 0;
-                            //double GPR = 100 - (100 * (index + 1) - 50) / stuCount;
-                            y.gpr = GPR;
-                            y.gsort = index + 1;
-                        });
-                    });
-                    n++;
+                            string gid = info.grades.Count > 0 ? info.grades[n].id ?? "-" : "-";
+                            var clases = classes.Where(x => x.year.Equals(greade));
+                            var classCount = clases.Count();
+                            var stu = clases.SelectMany(x => x.studentIds).ToList();
+                            var lineCount = clases.Select(x => x.lineCount).Sum();
+                            var totalAverage = clases.Select(x => x.totalAverage).Sum() * 1.0 / classCount;
+                            GradeAys gradeAys = new GradeAys
+                            {
+                                gradeId = gid,
+                                studentIds = stu,
+                                gradeName = info.grades.Count > 0 ? info.grades[n].name ?? "-" : "-",
+                                stuCount = stu.Count,
+                                lineCount = lineCount,
+                                totalAverage = totalAverage,
+                            };
+                            foreach (var key in paperScore.Keys)
+                            {
+                                var AysSubject = clases.SelectMany(c => c.subjects).Where(x => x.id.Equals(key)).Select(x => x).ToList();
+                                var passCount = AysSubject.Select(x => x.passCount).Sum();
+                                var average = Math.Round(AysSubject.Select(x => x.average).Sum() * 1.0 / classCount);
+                                var passPercent = stu.Count > 0 ? Math.Round(passCount * 1.0 / stu.Count, 2) : 0;
+                                //var passPercent = Math.Round(passCount * 1.0 / stu.Count,2);
+                                AysSubject subject = new AysSubject
+                                {
+                                    id = key,
+                                    passCount = passCount,
+                                    passPercent = passPercent,
+                                    average = average,
+                                    name = info.subjects.Where(x => x.id == key).FirstOrDefault().name,
+                                    item = gscores.Where(x => x.Key == key).FirstOrDefault().Value.Where(cls => cls.Key == gid).FirstOrDefault().Value
+                                };
+                                gradeAys.subjects.Add(subject);
+                            }
+                            grades.Add(gradeAys);
+                            //处理学生年级相关的pr值
+                            var studentAys = students.Where(x => x.gradeId.Equals(gid)).ToList();
+                            var stuGradeTotal = studentAys.Select(x => x.total).ToList();
+                            stuGradeTotal.Sort((s1, s2) => { return s2.CompareTo(s1); });
+                            var stuCount = stuGradeTotal.Count;
+                            studentAys.ForEach(x =>
+                            {
+                                //年级全科的pr
+                                int index = stuGradeTotal.IndexOf(x.total);
+                                double GPR = stuCount > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / stuCount) : 0;
+                                //double GPR = 100 - (100 * (index + 1) - 50) / stuCount;
+                                x.gpr = GPR;
+                                x.gsort = index + 1;
+                                //年级单科的pr
+                                x.subjects.ForEach(y =>
+                                {
+                                    var subjectT = studentAys.SelectMany(s => s.subjects).Where(sub => sub.id == y.id).Select(scr => scr.score).ToList();
+                                    subjectT.Sort((s1, s2) => { return s2.CompareTo(s1); });
+                                    int index = subjectT.IndexOf(y.score);
+                                    double GPR = stuCount > 0 ? Math.Floor(100 - (100 * (index + 1) - 50) * 1.0 / stuCount) : 0;
+                                    //double GPR = 100 - (100 * (index + 1) - 50) / stuCount;
+                                    y.gpr = GPR;
+                                    y.gsort = index + 1;
+                                });
+                            });
+                            n++;
+                        }
+                    }                    
                 }
+                
                 subjectScatter.ForEach(x =>
                 {
                     string subjectId = x.Key;
@@ -590,7 +601,7 @@ namespace TEAMModelOS.Controllers.Analysis
             }
             catch (Exception ex)
             {
-                BadRequest(ex.StackTrace);
+                //await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/process()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
             }
 
             var sub = examResults.Select(e => new
@@ -708,26 +719,29 @@ namespace TEAMModelOS.Controllers.Analysis
                         persent.Add(t);
                     }
                     classdatas.Add(new KeyValuePair<string, List<double>>(c.id, persent));
-                    if (gradeItemScore.ContainsKey(c.gradeId))
+                    if (!string.IsNullOrEmpty(c.gradeId))
                     {
+                        if (gradeItemScore.ContainsKey(c.gradeId))
+                        {
 
-                        var we = gradeItemScore[c.gradeId];
+                            var we = gradeItemScore[c.gradeId];
 
-                        List<int> count = we;
-                        for (int index = 0; index < count.Count; index++)
-                        {
-                            count[index] = count[index] + answerCount[index];
+                            List<int> count = we;
+                            for (int index = 0; index < count.Count; index++)
+                            {
+                                count[index] = count[index] + answerCount[index];
 
+                            }
+                            gradeItemScore[c.gradeId] = count;
+                            // gradeItemScore[c.gradeId].ForEach(x => { x = x + answerCount[index]; index += 1; });
+                            gradeItemStuCount[c.gradeId] = gradeItemStuCount[c.gradeId] + peopleCount;
                         }
-                        gradeItemScore[c.gradeId] = count;
-                        // gradeItemScore[c.gradeId].ForEach(x => { x = x + answerCount[index]; index += 1; });
-                        gradeItemStuCount[c.gradeId] = gradeItemStuCount[c.gradeId] + peopleCount;
-                    }
-                    else
-                    {
-                        gradeItemScore.Add(c.gradeId, answerCount);
-                        gradeItemStuCount.Add(c.gradeId, peopleCount);
-                    }
+                        else
+                        {
+                            gradeItemScore.Add(c.gradeId, answerCount);
+                            gradeItemStuCount.Add(c.gradeId, peopleCount);
+                        }
+                    }                                      
                 });
 
                 double[] point = StringHelper.ListTodouble(e.paper.point);
@@ -822,7 +836,7 @@ namespace TEAMModelOS.Controllers.Analysis
                         gradeBuilder.Append(key + ":" + data + ",");
                     }
                     var gstr = gradeBuilder.ToString();
-                    values[8] = gstr.Substring(0, gstr.Length - 1);
+                    values[8] = string.IsNullOrEmpty(gstr) ? "-" : gstr.Substring(0, gstr.Length - 1);
                     values[20] = quality[k].ToString();
                     values[21] = answer[k].ToString();
                     // string pointName = "";                                     

+ 1 - 1
TEAMModelOS/Controllers/Analysis/ClassAnalysisController.cs

@@ -109,7 +109,7 @@ namespace TEAMModelOS.Controllers.Analysis
                     }
                     //var gyc  =  groc.GroupBy(x => x.name).Select(y => new {name = y.Key, count = y.Sum(c => c.count) });
                     //var gs = sc.period.Where(s => s.id == pId.GetString()).Select(x => x.grades);
-                    (List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(_coreAPIHttpService, client, _dingDing, groupIds, code.GetString(), null);
+                    //(List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(_coreAPIHttpService, client, _dingDing, groupIds, code.GetString(), null);
                     var total = rc.Select(x => new { x.name, value = x.count });
                     var trend = tpc.Select(x => new { name = x.week, value = x.count });
                     var classify_group = groc.GroupBy(x => x.name).Select(y => new { name = y.Key, value = y.Sum(c => c.count) });