|
@@ -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 = "";
|