zhouj1203@hotmail.com пре 1 година
родитељ
комит
3c965c3b0a

+ 206 - 2
TEAMModelOS.FunctionV4/CosmosDB/TriggerArt.cs

@@ -24,6 +24,8 @@ using HTEXLib.Helpers.ShapeHelpers;
 using DocumentFormat.OpenXml.Spreadsheet;
 using NUnit.Framework;
 using Microsoft.AspNetCore.Mvc;
+using TEAMModelOS.SDK.Models.Cosmos.OpenEntity;
+using static System.Formats.Asn1.AsnWriter;
 
 namespace TEAMModelOS.FunctionV4.CosmosDB
 {
@@ -381,6 +383,12 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                         }
                                     }
                                 }
+                                //获取该艺术评测下面的活动结算结果
+                                List<ExamResult> examResults = new();
+                                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Common).GetItemQueryIterator<ExamResult>(queryText: $"select value(c) from c where c.pk = 'ExamResult' and c.examId in ({string.Join(",", results.Select(o => $"'{o}'"))})"))
+                                {
+                                    examResults.Add(item);
+                                }
                                 var sta = examClassResults.SelectMany(x => x.status).ToList();
                                 var ansCount = sta.Where(x => x == 0).ToList();
                                 var persent = ansCount.Count * 1.0 / sta.Count * 100;
@@ -402,6 +410,144 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                     subjectId = "subject_art"
                                 };
                                 //var period = scInfo.period.Where(x => x.id.Equals(art.period.id)).FirstOrDefault();
+                                List<(string ptype, string subId, List<(string name, List<string> kno)> knos)> knoledge = new();
+                                List<string> subs = new List<string> { "subject_painting", "subject_music" };
+                                foreach (var ss in subs)
+                                {
+                                    knoledge.Add(await getKnowledge(art.periodType, examResults.Where(c => c.subjectId.Equals(ss)).FirstOrDefault().paper.code, client, ss, examResults.Where(c => c.subjectId.Equals(ss)).FirstOrDefault().paper.periodId));
+                                }
+
+                                List<(string name, double score, string subject)> blockScore = new();
+                                List<(List<(string name, double score, string subject)> studentScore, string stuId)> studentScores = new();
+                                foreach (var exam in examResults)
+                                {
+                                    HashSet<string> knowledge = new HashSet<string>();
+                                    List<double> point = new List<double>();
+                                    List<List<double>> result = new List<List<double>>();
+                                    List<ClassRange> classes = new List<ClassRange>();
+                                    //求单个知识点所占分数
+                                    List<string> per = new List<string>();
+
+                                    if (exam.paper.knowledge != null && exam.paper.knowledge.Count > 0)
+                                    {
+                                        exam.paper.knowledge.ForEach(k =>
+                                        {
+                                            k.ForEach(e =>
+                                            {
+                                                knowledge.Add(e);
+                                            });
+                                        });
+                                    }
+                                    point = exam.paper.point;
+
+                                    List<string> knowledgeName = new List<string>();
+                                    foreach (string cla in knowledge)
+                                    {
+                                        knowledgeName.Add(cla);
+                                    }
+                                    for (int k = 0; k < knowledgeName.Count; k++)
+                                    {
+                                        if (null == knowledgeName[k])
+                                        {
+                                            knowledgeName.Remove(knowledgeName[k]);
+                                        }
+                                    }
+                                    List<double> Score = new List<double>();
+                                    //List<(string name, double score, string subject)> pointScore = new();                                   
+                                    foreach (string id in exam.studentIds) {
+                                        double scores = 0;
+                                        List<(string name, double score, string subject)> studentScore = new();
+                                        for (int k = 0; k < knowledgeName.Count; k++)
+                                        {
+                                            int n = 0;
+                                            exam.paper.knowledge.ForEach(kno =>
+                                            {
+                                                if (kno.Contains(knowledgeName[k]))
+                                                {
+                                                    var itemPersent = kno.Count > 0 ? 1 / Convert.ToDouble(kno.Count) : 0;
+                                                    int index = exam.studentIds.IndexOf(id);
+                                                    if (exam.studentScores[index][n] > 0)
+                                                    {
+                                                        scores += exam.studentScores[index][n] * itemPersent;
+                                                   }
+                                                }
+                                                n++;
+                                            });
+                                            studentScore.Add((knowledgeName[k], Math.Round(scores,2), exam.subjectId));                                           
+                                        }
+                                        studentScores.Add((studentScore,id));
+                                    }
+                                    for (int k = 0; k < knowledgeName.Count; k++)
+                                    {
+                                        double OnePoint = 0;
+                                        int n = 0;
+                                        exam.paper.knowledge.ForEach(kno =>
+                                        {
+                                            if (kno.Contains(knowledgeName[k]))
+                                            {
+                                                var itemPersent = kno.Count > 0 ? 1 / Convert.ToDouble(kno.Count) : 0;
+                                                OnePoint += point[n] * itemPersent;                                              
+                                            }
+                                            n++;
+                                        });
+                                        blockScore.Add((knowledgeName[k], OnePoint, exam.subjectId));
+                                        //blockScore.AddRange(pointScore);
+                                    }
+                                }
+                                var bls = blockScore.GroupBy(x => x.subject).Select(v => new
+                                {
+                                    subjectId = v.Key,
+                                    knoScore = v.ToList().GroupBy(k => k.name).Select(z => new
+                                    {
+                                        knoName = z.Key,
+                                        score = z.ToList().Sum(j => j.score)
+                                    })
+                                });
+                                var subjectKnow = knoledge.Where(c => c.ptype.Equals(art.periodType)).Select(x => new { x.subId, x.knos }).ToList();
+                                List<(string subjectId, List<(string name, double score, List<string> dim)> bks)> bs = new();
+                                foreach (var bb in subjectKnow)
+                                {
+                                    var kno1 = bls.Where(c => c.subjectId.Equals(bb.subId)).SelectMany(x => x.knoScore).ToList();
+                                    //var kno2 = dimensions.Where(c => c.subjectBind.Equals(bb.subId)).Select(x => new { x.dimension,x.blocks}).ToList();
+                                    List<(string name, double score)> blockScores = new();
+                                    foreach (var k2 in bb.knos)
+                                    {
+                                        double bsc = 0;
+                                        foreach (var k3 in kno1)
+                                        {
+                                            if (null != k2.kno && k2.kno.Contains(k3.knoName))
+                                            {
+                                                bsc += k3.score;
+                                            }
+                                        }
+                                        blockScores.Add((k2.name, bsc));
+                                    }
+                                    var blk = blockScores.Select(x => new
+                                    {
+                                        x.name,
+                                        x.score,
+                                        dimension = setting.dimensions.Where(s => s.blocks.Contains(x.name)).Select(x => x.dimension)
+                                    });
+                                    List<(string name, double score, List<string> dim)> bks = new();
+                                    foreach (var bk in blk)
+                                    {
+                                        bks.Add((bk.name, bk.score, bk.dimension.ToList()));
+                                    }
+                                    bs.Add((bb.subId, bks));
+                                }
+
+                                var blocks = bs.Select(x => new
+                                {
+                                    x.subjectId,
+                                    dim = x.bks.Select(z => new
+                                    {
+                                        z.name,
+                                        z.score,
+                                        z.dim
+                                    })
+                                });
+
+
                                 //获取学期信息
 
                                 var (currSemester, studyYear, currSemesterDate, date, nextSemester) = SchoolService.GetSemester(period, art.startTime);
@@ -454,7 +600,7 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                     }
                                     rs.totalScore = Math.Round(rs.subjectScores.Where(m => m.score >= 0).Sum(z => z.score), 2);
                                     tasks.Add(client.GetContainer(Constant.TEAMModelOS, Constant.Student).ReplaceItemAsync(rs, rs.id, new PartitionKey(rs.code)));
-                                    
+
                                     PortraitStudent student = new()
                                     {
                                         studentId = rs.studentId,
@@ -483,7 +629,14 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                             score = rs.subjectScores.Where(x => x.subjectId.Equals(sj.id)).FirstOrDefault().score,
                                             time = art.startTime,
                                             totalScore = 100,
-                                            type = sj.id
+                                            type = sj.id,
+                                            block = blocks.Where(c => c.subjectId.Equals(sj.id))?.FirstOrDefault().dim,
+                                            kno = studentScores.Where(c => c.stuId.Equals(rs.studentId)).SelectMany(c => c.studentScore).Where(
+                                                p => p.subject.Equals(sj.id)).Select(z => new { 
+                                                z.name,
+                                                z.score,
+                                                block = subjectKnow.Where(v => v.subId.Equals(sj.id)).SelectMany(k => k.knos).Where(c => null != c.kno && c.kno.Contains(z.name)).Select(x => x.name)
+                                            })
                                         };
                                         index++;
                                         semesterData.itemScore.Add(item);
@@ -525,5 +678,56 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
 
         }
 
+        private static async Task<(string key, string subId, List<(string name, List<string> kno)>)> getKnowledge(string key, string school, CosmosClient client, string subjectBid, string pId)
+        {
+            try
+            {
+                var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(school, new PartitionKey($"Base"));
+                string subjectId = string.Empty;
+                List<Knowledge> knowledges = new();
+                List<(string name, List<string> kno)> blocks = new();
+                if (response.Status == 200)
+                {
+                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                    School sc = json.ToObject<School>();
+                    var subjects = sc.period.Where(p => p.id.Equals(pId)).Select(x => x.subjects);
+                    foreach (var sj in subjects)
+                    {
+                        foreach (var s in sj)
+                        {
+                            if (!string.IsNullOrWhiteSpace(s.bindId) && s.bindId.Equals(subjectBid))
+                            {
+                                subjectId = s.id;
+                            }
+                        }
+                    }
+
+                    string code = $"Knowledge-{school}-{subjectId}";
+                    StringBuilder sql = new StringBuilder($"select value(c) from c");
+                    if (string.IsNullOrWhiteSpace(pId))
+                    {
+                        sql.Append($" where c.periodId = '{pId}'");
+                    }
+
+                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Knowledge>(queryText: sql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{code}") }))
+                    {
+                        knowledges.Add(item);
+                    }
+                }
+                foreach (var know in knowledges)
+                {
+                    foreach (var block in know.blocks)
+                    {
+                        blocks.Add((block.name, block.points));
+                    }
+                }
+                return (key, subjectBid, blocks);
+            }
+            catch (Exception e)
+            {
+                return (null, null, null);
+            }
+        }
+
     }
 }

+ 3 - 0
TEAMModelOS.SDK/Models/Cosmos/Student/OverallEducation.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
+using System.Text.Json;
 using System.Threading.Tasks;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 
@@ -157,6 +158,8 @@ namespace TEAMModelOS.SDK.Models
         /// 细项类型,用于评测(评测的科目),艺术(音乐,美术,舞蹈等)具体分类
         /// </summary>
         public string type { get; set; }
+        public dynamic block { get; set; }
+        public dynamic kno { get; set; }
     }