|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
}
|