|
@@ -19,6 +19,8 @@ using HTEX.Test.Service;
|
|
using System.IO;
|
|
using System.IO;
|
|
using static Pipelines.Sockets.Unofficial.SocketConnection;
|
|
using static Pipelines.Sockets.Unofficial.SocketConnection;
|
|
using static HTEX.Test.Controllers.LessonRecordController;
|
|
using static HTEX.Test.Controllers.LessonRecordController;
|
|
|
|
+using System.Collections.Generic;
|
|
|
|
+using static System.Formats.Asn1.AsnWriter;
|
|
|
|
|
|
namespace HTEX.Test.Controllers
|
|
namespace HTEX.Test.Controllers
|
|
{
|
|
{
|
|
@@ -42,14 +44,16 @@ namespace HTEX.Test.Controllers
|
|
[HttpPost("process-local")]
|
|
[HttpPost("process-local")]
|
|
public async Task<IActionResult> ProcessLocal(JsonElement json)
|
|
public async Task<IActionResult> ProcessLocal(JsonElement json)
|
|
{
|
|
{
|
|
|
|
+ List<StudentLessonData> studentLessonDatas = new List<StudentLessonData>();
|
|
string? id=json.GetProperty("id").GetString();
|
|
string? id=json.GetProperty("id").GetString();
|
|
|
|
+ string path = $"C:\\Users\\CrazyIter\\Downloads\\{id}";
|
|
if (!string.IsNullOrWhiteSpace(id))
|
|
if (!string.IsNullOrWhiteSpace(id))
|
|
{
|
|
{
|
|
- string path = $"C:\\Users\\CrazyIter\\Downloads\\{id}";
|
|
|
|
|
|
+
|
|
var files = ListAllFiles(path);
|
|
var files = ListAllFiles(path);
|
|
// var sampleJson =System.IO. File.ReadAllTextAsync(path);
|
|
// var sampleJson =System.IO. File.ReadAllTextAsync(path);
|
|
LessonBase? lessonBase = null;
|
|
LessonBase? lessonBase = null;
|
|
- List<StudentLessonData> studentLessonDatas = new List<StudentLessonData>();
|
|
|
|
|
|
+ List<LocalStudent> localStudents = new List<LocalStudent>();
|
|
List<TaskData> taskDatas = new List<TaskData>();
|
|
List<TaskData> taskDatas = new List<TaskData>();
|
|
List<SmartRatingData> smartRatingDatas = new List<SmartRatingData>();
|
|
List<SmartRatingData> smartRatingDatas = new List<SmartRatingData>();
|
|
List<IRSData> irsDatas = new List<IRSData>();
|
|
List<IRSData> irsDatas = new List<IRSData>();
|
|
@@ -65,7 +69,7 @@ namespace HTEX.Test.Controllers
|
|
jsons=jsons.Replace("\"Uncall\"", "0").Replace("Uncall", "0");
|
|
jsons=jsons.Replace("\"Uncall\"", "0").Replace("Uncall", "0");
|
|
lessonBase = jsons.ToObject<LessonBase>();
|
|
lessonBase = jsons.ToObject<LessonBase>();
|
|
var data = GetBaseData( lessonBase);
|
|
var data = GetBaseData( lessonBase);
|
|
- studentLessonDatas=data.studentLessonDatas;
|
|
|
|
|
|
+ localStudents=data.studentLessonDatas;
|
|
}
|
|
}
|
|
|
|
|
|
if (item.Contains("IES\\TimeLine.json"))
|
|
if (item.Contains("IES\\TimeLine.json"))
|
|
@@ -124,17 +128,22 @@ namespace HTEX.Test.Controllers
|
|
{
|
|
{
|
|
_logger.LogError(ex, ex.Message);
|
|
_logger.LogError(ex, ex.Message);
|
|
}
|
|
}
|
|
-
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
if (lessonBase!=null && timeLineData!=null)
|
|
if (lessonBase!=null && timeLineData!=null)
|
|
{
|
|
{
|
|
- studentLessonDatas = GetIRSData(lessonBase, timeLineData, irsDatas, studentLessonDatas, examDatas);
|
|
|
|
|
|
+ studentLessonDatas = localStudents.ToJsonString().ToObject<List<StudentLessonData>>();
|
|
|
|
+ studentLessonDatas = GetIRSData(lessonBase, timeLineData, irsDatas, studentLessonDatas, examDatas, id);
|
|
studentLessonDatas = GetCoworkData(lessonBase, timeLineData, coworkDatas, studentLessonDatas);
|
|
studentLessonDatas = GetCoworkData(lessonBase, timeLineData, coworkDatas, studentLessonDatas);
|
|
studentLessonDatas = GetExamData(lessonBase, timeLineData, examDatas, studentLessonDatas);
|
|
studentLessonDatas = GetExamData(lessonBase, timeLineData, examDatas, studentLessonDatas);
|
|
- studentLessonDatas = GetSmartRatingData(lessonBase, timeLineData, smartRatingDatas, studentLessonDatas);
|
|
|
|
|
|
+ studentLessonDatas = GetSmartRatingData(lessonBase, timeLineData, smartRatingDatas, studentLessonDatas, id);
|
|
studentLessonDatas = GetTaskData(lessonBase, timeLineData, taskDatas, studentLessonDatas);
|
|
studentLessonDatas = GetTaskData(lessonBase, timeLineData, taskDatas, studentLessonDatas);
|
|
|
|
+ System.IO.File.WriteAllText(Path.Combine(path, $"{id}-stu.json"), studentLessonDatas.ToJsonString());
|
|
|
|
+ string jsons = await System.IO.File.ReadAllTextAsync("analysis.json");
|
|
|
|
+ LessonDataAnalysis lessonDataAnalysis = jsons.ToObject<LessonDataAnalysis>();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
return Ok( new { studentLessonDatas });
|
|
return Ok( new { studentLessonDatas });
|
|
}return Ok();
|
|
}return Ok();
|
|
|
|
|
|
@@ -171,14 +180,7 @@ namespace HTEX.Test.Controllers
|
|
{
|
|
{
|
|
string jsons = await System.IO.File.ReadAllTextAsync(item);
|
|
string jsons = await System.IO.File.ReadAllTextAsync(item);
|
|
TechCount count = jsons.ToObject<TechCount>();
|
|
TechCount count = jsons.ToObject<TechCount>();
|
|
- var pickupResult = count.timeCount.Where(x => x.code.Equals("PickupResult", StringComparison.OrdinalIgnoreCase));
|
|
|
|
- int pickCount = 0;
|
|
|
|
- if (pickupResult!=null && pickupResult.Count()>0)
|
|
|
|
- {
|
|
|
|
- pickCount+=pickupResult.Sum(x => (int)x.value);
|
|
|
|
- }
|
|
|
|
- count.interactNormalCount=pickCount+ count.irsCount;
|
|
|
|
-
|
|
|
|
|
|
+ count.interactNormalCount=count.irsCount;
|
|
count.lessonId=item.Replace("-count.json", "").Replace(path, "").Replace("\\", "");
|
|
count.lessonId=item.Replace("-count.json", "").Replace(path, "").Replace("\\", "");
|
|
string localjson = await System.IO.File.ReadAllTextAsync($"{path}\\{count.lessonId}-local.json");
|
|
string localjson = await System.IO.File.ReadAllTextAsync($"{path}\\{count.lessonId}-local.json");
|
|
var lessonLocal = localjson.ToObject<LessonLocal>();
|
|
var lessonLocal = localjson.ToObject<LessonLocal>();
|
|
@@ -291,15 +293,15 @@ namespace HTEX.Test.Controllers
|
|
|
|
|
|
var tcount = techCounts.Where(x => x.coworkCount > 0 || x.taskCount>0 || x.interactNormalCount>0|| x.examCount>0 || x.smartRatingCount>0);
|
|
var tcount = techCounts.Where(x => x.coworkCount > 0 || x.taskCount>0 || x.interactNormalCount>0|| x.examCount>0 || x.smartRatingCount>0);
|
|
double coworkWeight = lessonDataAnalysis.cowork.Count()*1.0/tcount.Count();
|
|
double coworkWeight = lessonDataAnalysis.cowork.Count()*1.0/tcount.Count();
|
|
- lessonDataAnalysis.coworkWeight=coworkWeight;
|
|
|
|
|
|
+ lessonDataAnalysis.coworkRate=coworkWeight;
|
|
double taskWeight = lessonDataAnalysis.task.Count()*1.0/tcount.Count();
|
|
double taskWeight = lessonDataAnalysis.task.Count()*1.0/tcount.Count();
|
|
- lessonDataAnalysis.taskWeight=taskWeight;
|
|
|
|
|
|
+ lessonDataAnalysis.taskRate=taskWeight;
|
|
double interactWeight = lessonDataAnalysis.interactNormal.Count()*1.0/tcount.Count();
|
|
double interactWeight = lessonDataAnalysis.interactNormal.Count()*1.0/tcount.Count();
|
|
- lessonDataAnalysis.interactWeight=interactWeight;
|
|
|
|
|
|
+ lessonDataAnalysis.interactRate=interactWeight;
|
|
double examWeight = lessonDataAnalysis. exam.Count()*1.0/tcount.Count();
|
|
double examWeight = lessonDataAnalysis. exam.Count()*1.0/tcount.Count();
|
|
- lessonDataAnalysis.examWeight=examWeight;
|
|
|
|
|
|
+ lessonDataAnalysis.examRate=examWeight;
|
|
double smartRatingWeight = lessonDataAnalysis. smartRating.Count()*1.0/tcount.Count();
|
|
double smartRatingWeight = lessonDataAnalysis. smartRating.Count()*1.0/tcount.Count();
|
|
- lessonDataAnalysis.smartRatingWeight=smartRatingWeight;
|
|
|
|
|
|
+ lessonDataAnalysis.smartRatingRate=smartRatingWeight;
|
|
|
|
|
|
List<KeyValuePair<double, List<int>>> clustersDataInteract = new();
|
|
List<KeyValuePair<double, List<int>>> clustersDataInteract = new();
|
|
var clusterInteract = KMeansService.KMeans(lessonDataAnalysis.interactNormal.Select(x => (int)x).OrderBy(x => x));
|
|
var clusterInteract = KMeansService.KMeans(lessonDataAnalysis.interactNormal.Select(x => (int)x).OrderBy(x => x));
|
|
@@ -325,107 +327,81 @@ namespace HTEX.Test.Controllers
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- List<LessonLocal> lessons = new List<LessonLocal>();
|
|
|
|
- var files_local = files.Where(x=>x.EndsWith("608942756458532864-local.json")).Take(100).ToList();
|
|
|
|
- foreach (var item in files_local)
|
|
|
|
|
|
+ // List<LessonLocal> lessons = new List<LessonLocal>();
|
|
|
|
+ var files_local = files.Where(x=>x.EndsWith("557838358030716928-local.json")).Take(100).ToList();
|
|
|
|
+ List<List<StudentLessonData>> studentLessons = new List<List<StudentLessonData>>();
|
|
|
|
+ foreach (var item in files)
|
|
{
|
|
{
|
|
if (item.EndsWith("local.json"))
|
|
if (item.EndsWith("local.json"))
|
|
{
|
|
{
|
|
string jsons = await System.IO.File.ReadAllTextAsync(item);
|
|
string jsons = await System.IO.File.ReadAllTextAsync(item);
|
|
LessonLocal lesson = jsons.ToObject<LessonLocal>();
|
|
LessonLocal lesson = jsons.ToObject<LessonLocal>();
|
|
- lessons.Add(lesson);
|
|
|
|
- lesson.studentLessonDatas = GetIRSData(lesson.lessonBase!, lesson.timeLineData!, lesson.irsDatas, lesson.studentLessonDatas, lesson.examDatas);
|
|
|
|
- lesson.studentLessonDatas = GetCoworkData(lesson.lessonBase!, lesson.timeLineData!, lesson.coworkDatas, lesson.studentLessonDatas);
|
|
|
|
- lesson.studentLessonDatas = GetExamData(lesson.lessonBase!, lesson.timeLineData!, lesson.examDatas, lesson.studentLessonDatas);
|
|
|
|
- lesson.studentLessonDatas = GetSmartRatingData(lesson.lessonBase!, lesson.timeLineData!, lesson.smartRatingDatas, lesson.studentLessonDatas);
|
|
|
|
- lesson.studentLessonDatas = GetTaskData(lesson.lessonBase!, lesson.timeLineData!, lesson.taskDatas, lesson.studentLessonDatas);
|
|
|
|
|
|
+ // lessons.Add(lesson);
|
|
|
|
+ List<StudentLessonData> studentLessonDatas = lesson.studentLessonDatas.ToJsonString().ToObject<List<StudentLessonData>>();
|
|
|
|
+ studentLessonDatas = GetIRSData(lesson.lessonBase!, lesson.timeLineData!, lesson.irsDatas, studentLessonDatas, lesson.examDatas, item);
|
|
|
|
+ studentLessonDatas = GetCoworkData(lesson.lessonBase!, lesson.timeLineData!, lesson.coworkDatas, studentLessonDatas);
|
|
|
|
+ studentLessonDatas = GetExamData(lesson.lessonBase!, lesson.timeLineData!, lesson.examDatas, studentLessonDatas);
|
|
|
|
+ studentLessonDatas = GetSmartRatingData(lesson.lessonBase!, lesson.timeLineData!, lesson.smartRatingDatas, studentLessonDatas, item);
|
|
|
|
+ studentLessonDatas = GetTaskData(lesson.lessonBase!, lesson.timeLineData!, lesson.taskDatas, studentLessonDatas);
|
|
var techCount = techCounts.Find(x => !string.IsNullOrWhiteSpace(x.lessonId) && !string.IsNullOrWhiteSpace(lesson?.lessonRecord?.id) && x.lessonId.Equals(lesson.lessonRecord.id));
|
|
var techCount = techCounts.Find(x => !string.IsNullOrWhiteSpace(x.lessonId) && !string.IsNullOrWhiteSpace(lesson?.lessonRecord?.id) && x.lessonId.Equals(lesson.lessonRecord.id));
|
|
- if (techCount != null)
|
|
|
|
|
|
+ int sumUpload =0;
|
|
|
|
+ int taskCount = 0;
|
|
|
|
+ int maxUpload = 0;
|
|
|
|
+ HashSet<string> pickUp=new HashSet<string>();
|
|
|
|
+ foreach (var stu in studentLessonDatas)
|
|
{
|
|
{
|
|
-
|
|
|
|
- IEnumerable<double> interact = lessonDataAnalysis.interactNormal;
|
|
|
|
- int interactCount = techCount.interactNormalCount;
|
|
|
|
- //当前课例的互动次数在互动总列表超过N%;
|
|
|
|
- //var persent = GetPersent(interact, interactCount);
|
|
|
|
- foreach (var studentLessonData in lesson.studentLessonDatas)
|
|
|
|
|
|
+ var countS = stu.taskRecord.itemRecords.Where(x => x.optCount>0);
|
|
|
|
+ if (countS.Count()>0)
|
|
{
|
|
{
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- //互动的计分相关的
|
|
|
|
- var x = 0.0;
|
|
|
|
- //互动参与度相关的
|
|
|
|
- var y = 0.0;
|
|
|
|
- //i互动计分,s个人计分
|
|
|
|
- double i = 0, s = 0;
|
|
|
|
- if (lesson?.lessonBase?.report?.clientSummaryList!=null)
|
|
|
|
- {
|
|
|
|
- var d = lesson?.lessonBase?.report?.clientSummaryList.Find(x => $"{x.seatID}".Equals(studentLessonData.seatID));
|
|
|
|
- if (d!=null)
|
|
|
|
- {
|
|
|
|
- i=d.interactScore;
|
|
|
|
- s =d.score;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- //个人计分最大值
|
|
|
|
- var q = lessonDataAnalysis.pscore.Max();
|
|
|
|
- //互动计分最大值
|
|
|
|
- var t = lessonDataAnalysis.tscore.Max();
|
|
|
|
- if (studentLessonData.interactRecord.interactRecords.Count==interactCount && interactCount>0)
|
|
|
|
- {
|
|
|
|
- //互动次数
|
|
|
|
- var n = studentLessonData.interactRecord.interactRecords.Count()*1.0;
|
|
|
|
- //聚类分数量大和数量小的类群。判断当前出题数在两个类群的最大范围内,再取其质心。
|
|
|
|
- var m = n<=lessonDataAnalysis.clustersInteract.First().Value.Max() ? lessonDataAnalysis.clustersInteract.First().Key*1.0 : lessonDataAnalysis.clustersInteract.Last().Key *1.0;
|
|
|
|
- var w = studentLessonData.interactRecord.interactRecords.Where(x => x.resultWeight>=InteractWeight.T1).Count()*1.0;
|
|
|
|
- var r = studentLessonData.interactRecord.interactRecords.Where(x => x.resultWeight>InteractWeight.T1).Count()*1.0;
|
|
|
|
- var k = studentLessonData.interactRecord.interactRecords.Where(x => x.resultWeight>=InteractWeight.T1).Sum(x=> x.itemScore*1.0);
|
|
|
|
- var e = studentLessonData.interactRecord.interactRecords.Where(x => x.resultWeight>InteractWeight.T1).Sum(x => x.itemScore*1.0);
|
|
|
|
- var j = InteractWeight.T1;
|
|
|
|
- //学习成效算法
|
|
|
|
- //x=((i/t) + ((n/m)*(w*(w/n)+(p/j)* (r/n) *r)))/n;
|
|
|
|
- x=((i/t) +(w*k)/(j*m) +(r*e)/(j*m) )/n;
|
|
|
|
-
|
|
|
|
- y=((n/m)*(w*(w/n)+ (r/n) *r))/n;
|
|
|
|
- // var rate = w*100.0/interactCount;
|
|
|
|
- // studentLessonData.interactRecord.interactScore=data;
|
|
|
|
- // studentLessonData.interactRecord.interactRate=rate;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- if (studentLessonData.interactRecord.interactRecords.Count()!=0)
|
|
|
|
- {
|
|
|
|
- Console.WriteLine($"{studentLessonData.id}{lesson?.lessonRecord?.id}的互动次数不匹配。");
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (studentLessonData.taskRecord.itemRecords.Count>0)
|
|
|
|
|
|
+ int stuUploadmax = stu.taskRecord.itemRecords.Where(x => x.optCount>0).Max(x => x.optCount);
|
|
|
|
+ if (stuUploadmax> maxUpload)
|
|
{
|
|
{
|
|
-
|
|
|
|
|
|
+ maxUpload=stuUploadmax;
|
|
}
|
|
}
|
|
- var attend = 0.0;
|
|
|
|
- if (studentLessonData.attend==1)
|
|
|
|
|
|
+ }
|
|
|
|
+ int stuUpload= stu.taskRecord.itemRecords.Where(x => x.optCount>0).Sum(x=>x.optCount);
|
|
|
|
+
|
|
|
|
+ sumUpload+=stuUpload;
|
|
|
|
+ if (stu.taskRecord.itemRecords.Count()> taskCount)
|
|
|
|
+ {
|
|
|
|
+ taskCount=stu.taskRecord.itemRecords.Count();
|
|
|
|
+ }
|
|
|
|
+ var stu_scores = stu.coworkRecord.itemRecords.Where(x => x.itemScore>0).Select(x=>x.itemScore);
|
|
|
|
+ if (stu_scores!=null && stu_scores.Count()>0)
|
|
|
|
+ {
|
|
|
|
+ lessonDataAnalysis.stuCowork.AddRange(stu_scores);
|
|
|
|
+ }
|
|
|
|
+ var grp_scores = stu.group_coworkScore.Where(x => x>0);
|
|
|
|
+ if (grp_scores!=null && grp_scores.Count()>0)
|
|
|
|
+ {
|
|
|
|
+ lessonDataAnalysis.groupCowork.AddRange(grp_scores);
|
|
|
|
+ }
|
|
|
|
+ if (stu.pickups.IsNotEmpty())
|
|
|
|
+ {
|
|
|
|
+ foreach (var pickup in stu.pickups)
|
|
{
|
|
{
|
|
- attend= 100/100;
|
|
|
|
|
|
+ pickUp.Add(pickup);
|
|
}
|
|
}
|
|
- var achieve = 190.0/(1+Math.Exp(-(s/q+x)))-95.0;
|
|
|
|
- var attitude= 200 / (1 + Math.Exp(-(s/q + y +attend))) - 100.0;
|
|
|
|
- studentLessonData.attitude=attitude;
|
|
|
|
- studentLessonData.achieve=achieve;
|
|
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
+ if (studentLessonDatas.Count>0&& taskCount>0 && maxUpload>0)
|
|
|
|
+ {
|
|
|
|
+ var avgUpload= sumUpload*1.0/(studentLessonDatas.Count *taskCount);
|
|
|
|
+ lessonDataAnalysis.upload.Add(new List<double>() { avgUpload, maxUpload });
|
|
|
|
+ }
|
|
|
|
+ if (pickUp.Count>0)
|
|
|
|
+ {
|
|
|
|
+ lessonDataAnalysis.pickup.Add(pickUp.ToList());
|
|
|
|
+ }
|
|
|
|
+ System.IO.File.WriteAllText(Path.Combine(path, $"{lesson.lessonRecord!.id}-stu.json"), studentLessonDatas.ToJsonString());
|
|
|
|
+ studentLessons.Add(studentLessonDatas);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ System.IO.File.WriteAllText(Path.Combine(path, "analysis.json"), lessonDataAnalysis.ToJsonString());
|
|
return Ok(new
|
|
return Ok(new
|
|
{
|
|
{
|
|
- lessons,
|
|
|
|
- interactNormal = lessonDataAnalysis.interactNormal.OrderByDescending(x=>x),
|
|
|
|
- cowork = lessonDataAnalysis.cowork.OrderByDescending(x => x),
|
|
|
|
- exam = lessonDataAnalysis.exam.OrderByDescending(x => x),
|
|
|
|
- smartRating = lessonDataAnalysis.smartRating.OrderByDescending(x => x),
|
|
|
|
|
|
+
|
|
|
|
+
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
@@ -433,6 +409,17 @@ namespace HTEX.Test.Controllers
|
|
[HttpPost("process-history")]
|
|
[HttpPost("process-history")]
|
|
public async Task<IActionResult> ProcessHistory(JsonElement json)
|
|
public async Task<IActionResult> ProcessHistory(JsonElement json)
|
|
{
|
|
{
|
|
|
|
+ List<string> localIds = new List<string>();
|
|
|
|
+ string path = "F:\\lesson-local";
|
|
|
|
+ var files = ListAllFiles(path);
|
|
|
|
+ foreach (var file in files)
|
|
|
|
+ {
|
|
|
|
+ if (file.EndsWith("-count.json"))
|
|
|
|
+ {
|
|
|
|
+ string lessonId = file.Replace("-count.json", "").Replace(path, "").Replace("\\", "");
|
|
|
|
+ localIds.Add(lessonId);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
//1709222400000 2024.3.1
|
|
//1709222400000 2024.3.1
|
|
var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
|
|
var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
|
|
.GetList<LessonRecord>($"SELECT value c FROM School AS c where c.startTime>1706716800000 and c.expire<=0 and c.status<>404 and c.duration>300 and c.pk='LessonRecord' and c.school<>'hbcn' and c.school<>'habook' and (c.tLevel>0 or c.pLevel>0) ", null);
|
|
.GetList<LessonRecord>($"SELECT value c FROM School AS c where c.startTime>1706716800000 and c.expire<=0 and c.status<>404 and c.duration>300 and c.pk='LessonRecord' and c.school<>'hbcn' and c.school<>'habook' and (c.tLevel>0 or c.pLevel>0) ", null);
|
|
@@ -446,8 +433,8 @@ namespace HTEX.Test.Controllers
|
|
//Console.WriteLine($"Elapsed Time: {stopwatch.ElapsedMilliseconds} ms");
|
|
//Console.WriteLine($"Elapsed Time: {stopwatch.ElapsedMilliseconds} ms");
|
|
//stopwatch.Reset();
|
|
//stopwatch.Reset();
|
|
stopwatch.Start();
|
|
stopwatch.Start();
|
|
- string path = "F:\\lesson-local";
|
|
|
|
- await foreach (var item in GetLessonLocal(result.list))
|
|
|
|
|
|
+
|
|
|
|
+ await foreach (var item in GetLessonLocal(result.list, localIds))
|
|
{
|
|
{
|
|
if (item.lessonBase!=null && item.lessonBase.student!=null)
|
|
if (item.lessonBase!=null && item.lessonBase.student!=null)
|
|
{
|
|
{
|
|
@@ -511,6 +498,7 @@ namespace HTEX.Test.Controllers
|
|
public List<KeyValuePair<double, List<double>>> clustersPscore { get; set; } = new List<KeyValuePair<double, List<double>>>();
|
|
public List<KeyValuePair<double, List<double>>> clustersPscore { get; set; } = new List<KeyValuePair<double, List<double>>>();
|
|
public List<KeyValuePair<double, List<double>>> clustersTscore { get; set; } = new List<KeyValuePair<double, List<double>>>();
|
|
public List<KeyValuePair<double, List<double>>> clustersTscore { get; set; } = new List<KeyValuePair<double, List<double>>>();
|
|
public List<KeyValuePair<double, List<double>>> clustersGscore { get; set; } = new List<KeyValuePair<double, List<double>>>();
|
|
public List<KeyValuePair<double, List<double>>> clustersGscore { get; set; } = new List<KeyValuePair<double, List<double>>>();
|
|
|
|
+
|
|
/// <summary>
|
|
/// <summary>
|
|
/// 个人计分
|
|
/// 个人计分
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -523,14 +511,31 @@ namespace HTEX.Test.Controllers
|
|
/// 互动计分
|
|
/// 互动计分
|
|
/// </summary>
|
|
/// </summary>
|
|
public IEnumerable<double> tscore { get; set; } = new List<double>();
|
|
public IEnumerable<double> tscore { get; set; } = new List<double>();
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- public double coworkWeight { get; set; }
|
|
|
|
- public double taskWeight { get; set; }
|
|
|
|
- public double interactWeight { get; set; }
|
|
|
|
- public double examWeight { get; set; }
|
|
|
|
- public double smartRatingWeight { get; set; }
|
|
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 作品上传数
|
|
|
|
+ /// </summary>
|
|
|
|
+ public List<List<double>> upload { get; set; } = new List<List<double>>();
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 学生协作成果数
|
|
|
|
+ /// </summary>
|
|
|
|
+ public List<double> stuCowork { get; set; } = new List<double>();
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 小组协作成果数
|
|
|
|
+ /// </summary>
|
|
|
|
+ public List<double> groupCowork { get; set; } = new List<double>();
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 挑人集合
|
|
|
|
+ /// </summary>
|
|
|
|
+ public List<List<string>> pickup { get; set; } = new List<List<string>>();
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 挑人集合-小组
|
|
|
|
+ /// </summary>
|
|
|
|
+ public List<List<string>> pickup_group { get; set; } = new List<List<string>>();
|
|
|
|
+ public double interactRate { get; set; }
|
|
|
|
+ public double taskRate { get; set; }
|
|
|
|
+ public double coworkRate { get; set; }
|
|
|
|
+ public double examRate { get; set; }
|
|
|
|
+ public double smartRatingRate { get; set; }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -584,10 +589,15 @@ namespace HTEX.Test.Controllers
|
|
}
|
|
}
|
|
return datas;
|
|
return datas;
|
|
}
|
|
}
|
|
- private async IAsyncEnumerable<LessonLocal> GetLessonLocal(List<LessonRecord> lessonRecords)
|
|
|
|
|
|
+ private async IAsyncEnumerable<LessonLocal> GetLessonLocal(List<LessonRecord> lessonRecords, List<string> localIds)
|
|
{
|
|
{
|
|
foreach (var lessonRecord in lessonRecords)
|
|
foreach (var lessonRecord in lessonRecords)
|
|
{
|
|
{
|
|
|
|
+
|
|
|
|
+ if (localIds.Contains(lessonRecord.id))
|
|
|
|
+ {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
LessonLocal lessonLocal = new LessonLocal { lessonRecord=lessonRecord };
|
|
LessonLocal lessonLocal = new LessonLocal { lessonRecord=lessonRecord };
|
|
if (System.IO.File.Exists($"F:\\lesson-local\\{lessonRecord.id}-local.json"))
|
|
if (System.IO.File.Exists($"F:\\lesson-local\\{lessonRecord.id}-local.json"))
|
|
{
|
|
{
|
|
@@ -683,7 +693,7 @@ namespace HTEX.Test.Controllers
|
|
//读取基础Base信息
|
|
//读取基础Base信息
|
|
//base.json
|
|
//base.json
|
|
LessonBase? lessonBase = null;
|
|
LessonBase? lessonBase = null;
|
|
- List<StudentLessonData> studentLessonDatas = new List<StudentLessonData>();
|
|
|
|
|
|
+ List<LocalStudent> studentLessonDatas = new List<LocalStudent>();
|
|
//名单出席率低于30%的 不纳入计算。,累计所有课例的科技使用次数及反馈情况,用于做科技分类比例的权重
|
|
//名单出席率低于30%的 不纳入计算。,累计所有课例的科技使用次数及反馈情况,用于做科技分类比例的权重
|
|
try
|
|
try
|
|
{
|
|
{
|
|
@@ -958,10 +968,10 @@ namespace HTEX.Test.Controllers
|
|
/// <param name="lessonRecord"></param>
|
|
/// <param name="lessonRecord"></param>
|
|
/// <param name="lessonBase"></param>
|
|
/// <param name="lessonBase"></param>
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
- private (LessonBase lessonBase, List<StudentLessonData> studentLessonDatas) GetBaseData( LessonBase lessonBase)
|
|
|
|
|
|
+ private (LessonBase lessonBase, List<LocalStudent> studentLessonDatas) GetBaseData( LessonBase lessonBase)
|
|
{
|
|
{
|
|
//处理学生定位数据
|
|
//处理学生定位数据
|
|
- List<StudentLessonData> studentLessonDatas = new List<StudentLessonData>();
|
|
|
|
|
|
+ List<LocalStudent> studentLessonDatas = new List<LocalStudent>();
|
|
int index = 0;
|
|
int index = 0;
|
|
try {
|
|
try {
|
|
if (lessonBase!=null)
|
|
if (lessonBase!=null)
|
|
@@ -974,7 +984,7 @@ namespace HTEX.Test.Controllers
|
|
{
|
|
{
|
|
attend=client.attendState;
|
|
attend=client.attendState;
|
|
}
|
|
}
|
|
- studentLessonDatas.Add(new StudentLessonData()
|
|
|
|
|
|
+ studentLessonDatas.Add(new LocalStudent()
|
|
{
|
|
{
|
|
id = x.id,
|
|
id = x.id,
|
|
index = index,
|
|
index = index,
|
|
@@ -995,7 +1005,7 @@ namespace HTEX.Test.Controllers
|
|
/// <summary>
|
|
/// <summary>
|
|
///读取互动信息
|
|
///读取互动信息
|
|
///Event 过滤类型 'PopQuesLoad', 'ReAtmpAnsStrt', 'BuzrAns','BuzrLoad'
|
|
///Event 过滤类型 'PopQuesLoad', 'ReAtmpAnsStrt', 'BuzrAns','BuzrLoad'
|
|
- /// 在IRS.json处理 'PopQuesLoad'互动问答 , 'ReAtmpAnsStrt' 二次作答 , 'BuzrAns' 抢权(新), 'BuzrLoad'抢权(旧), PickupResult 挑人算不算互动?? 读取PickupMemberId "[\r\n 35\r\n]"
|
|
|
|
|
|
+ /// 在IRS.json处理 'PopQuesLoad'互动问答 , 'ReAtmpAnsStrt' 二次作答 , 'BuzrAns' 抢权(新), 'BuzrLoad'抢权(旧)
|
|
///TimeLine.json 中找到对应类型,根据Pgid 去 IRS.json 中找到对应数据,从clientAnswers 的下标对应 base.json 中的 student 找到对应学生信息 clientAnswers.length > 1 则表示有二次作答
|
|
///TimeLine.json 中找到对应类型,根据Pgid 去 IRS.json 中找到对应数据,从clientAnswers 的下标对应 base.json 中的 student 找到对应学生信息 clientAnswers.length > 1 则表示有二次作答
|
|
///读取IRS.json
|
|
///读取IRS.json
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -1003,11 +1013,11 @@ namespace HTEX.Test.Controllers
|
|
/// <param name="lessonBase"></param>
|
|
/// <param name="lessonBase"></param>
|
|
/// <param name="irsDatas"></param>
|
|
/// <param name="irsDatas"></param>
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
- private List<StudentLessonData> GetIRSData( LessonBase lessonBase, TimeLineData timeLineData, List<IRSData> irsDatas, List<StudentLessonData> studentLessonDatas,List<ExamData> examDatas)
|
|
|
|
|
|
+ private List<StudentLessonData> GetIRSData( LessonBase lessonBase, TimeLineData timeLineData, List<IRSData> irsDatas, List<StudentLessonData> studentLessonDatas,List<ExamData> examDatas,string itemFiles)
|
|
{
|
|
{
|
|
- List<string> interactTypes = new List<string>() { "PopQuesLoad", "ReAtmpAnsStrt", "BuzrAns", "BuzrLoad", "PickupResult" };
|
|
|
|
|
|
+ List<string> interactTypes = new List<string>() { "PopQuesLoad", "ReAtmpAnsStrt", "BuzrAns", "BuzrLoad" };
|
|
//去重页面
|
|
//去重页面
|
|
- var enventsInteract = timeLineData.events.Where(x => !string.IsNullOrWhiteSpace(x.Pgid) && interactTypes.Contains(x.Event)).GroupBy(x => x.Pgid) .Select(x => new { key = x.Key, list = x.ToList() });
|
|
|
|
|
|
+ var enventsInteract = timeLineData?.events?.Where(x => !string.IsNullOrWhiteSpace(x.Pgid) && interactTypes.Contains(x.Event)).GroupBy(x => x.Pgid) .Select(x => new { key = x.Key, list = x.ToList() });
|
|
|
|
|
|
if (enventsInteract!= null && enventsInteract.Count()>0)
|
|
if (enventsInteract!= null && enventsInteract.Count()>0)
|
|
{
|
|
{
|
|
@@ -1030,20 +1040,31 @@ namespace HTEX.Test.Controllers
|
|
else
|
|
else
|
|
{
|
|
{
|
|
//处理其他,评测类型的互动,因为有可能不会记录在TimeLine.json中
|
|
//处理其他,评测类型的互动,因为有可能不会记录在TimeLine.json中
|
|
- var envents_other = timeLineData.events.Where(x=> !string.IsNullOrWhiteSpace(x.Pgid)).GroupBy(x => x.Pgid) .Select(x => new { key = x.Key, list = x.ToList() });
|
|
|
|
- if (envents_other!=null && envents_other.Count()>0)
|
|
|
|
|
|
+
|
|
|
|
+ if (timeLineData!=null)
|
|
{
|
|
{
|
|
- foreach (var item in envents_other)
|
|
|
|
|
|
+ var envents_other = timeLineData.events.Where(x => !string.IsNullOrWhiteSpace(x.Pgid)).GroupBy(x => x.Pgid).Select(x => new { key = x.Key, list = x.ToList() });
|
|
|
|
+ if (envents_other!=null && envents_other.Count()>0)
|
|
{
|
|
{
|
|
- ProcessIRSPageData(irsDatas, studentLessonDatas,examDatas, item);
|
|
|
|
|
|
+ foreach (var item in envents_other)
|
|
|
|
+ {
|
|
|
|
+ ProcessIRSPageData(irsDatas, studentLessonDatas, examDatas, item);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ foreach (var item in irsDatas.Select(x => x.pageID))
|
|
|
|
+ {
|
|
|
|
+ ProcessIRSPageData(irsDatas, studentLessonDatas, examDatas, new { key = item });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
//单独处理挑人的逻辑
|
|
//单独处理挑人的逻辑
|
|
//是否从小组里面挑人。
|
|
//是否从小组里面挑人。
|
|
//不需要去重页面,直接获取挑人大类 PickupResult
|
|
//不需要去重页面,直接获取挑人大类 PickupResult
|
|
- //小类处理:PickupRight , PickupOption , PickupNthGrp ,PickupEachGrp ,PickupDiff
|
|
|
|
- var enventsPickup = timeLineData.events.Where(x => !string.IsNullOrWhiteSpace(x.Pgid) && x.Event.Equals("PickupResult"));
|
|
|
|
|
|
+ //小类处理:PickupRight , PickupOption , PickupNthGrp ,PickupEachGrp ,PickupDiff , PickupResult 挑人算不算互动?? 读取PickupMemberId "[\r\n 35\r\n]"
|
|
|
|
+ var enventsPickup = timeLineData?.events.Where(x => !string.IsNullOrWhiteSpace(x.Pgid) && x.Event.Equals("PickupResult"));
|
|
if (enventsPickup.IsNotEmpty())
|
|
if (enventsPickup.IsNotEmpty())
|
|
{
|
|
{
|
|
foreach (var item in enventsPickup)
|
|
foreach (var item in enventsPickup)
|
|
@@ -1058,24 +1079,20 @@ namespace HTEX.Test.Controllers
|
|
foreach (var m in mbr)
|
|
foreach (var m in mbr)
|
|
{
|
|
{
|
|
studentLessonData.attend=1;
|
|
studentLessonData.attend=1;
|
|
- studentLessonData.interactRecord.interactRecords.Add(new ItemRecord()
|
|
|
|
- {
|
|
|
|
- resultWeight = InteractWeight.TT,
|
|
|
|
- resultType=InteractReultType.TT,
|
|
|
|
- itemType = string.IsNullOrWhiteSpace(item.PickupType) ? "PickupResult" : item.PickupType
|
|
|
|
- });
|
|
|
|
|
|
+ //studentLessonData.interactRecord.interactRecords.Add(new ItemRecord()
|
|
|
|
+ //{
|
|
|
|
+ // resultWeight = InteractWeight.TT,
|
|
|
|
+ // resultType=InteractReultType.TT,
|
|
|
|
+ // itemType = string.IsNullOrWhiteSpace(item.PickupType) ? "PickupResult" : item.PickupType
|
|
|
|
+ //});
|
|
|
|
+ studentLessonData.pickups.Add(string.IsNullOrWhiteSpace(item.PickupType) ? "1--PickupResult" : $"1--{item.PickupType}");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
//处理未挑中的
|
|
//处理未挑中的
|
|
if (studentLessonData.attend==1)
|
|
if (studentLessonData.attend==1)
|
|
{
|
|
{
|
|
- studentLessonData.interactRecord.interactRecords.Add(new ItemRecord()
|
|
|
|
- {
|
|
|
|
- resultWeight = InteractWeight.T1,
|
|
|
|
- resultType=InteractReultType.T1,
|
|
|
|
- itemType = string.IsNullOrWhiteSpace(item.PickupType) ? "PickupResult" : item.PickupType
|
|
|
|
- });
|
|
|
|
|
|
+ studentLessonData.pickups.Add(string.IsNullOrWhiteSpace(item.PickupType) ? "0--PickupResult" : $"0--{item.PickupType}");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1105,6 +1122,14 @@ namespace HTEX.Test.Controllers
|
|
var scoreNode = irsDataPage.question?["exercise"]?["score"];
|
|
var scoreNode = irsDataPage.question?["exercise"]?["score"];
|
|
var _type = irsDataPage.question?["exercise"]?["type"];
|
|
var _type = irsDataPage.question?["exercise"]?["type"];
|
|
var _answerType = irsDataPage.question?["exercise"]?["answerType"];//file,audio,text,image
|
|
var _answerType = irsDataPage.question?["exercise"]?["answerType"];//file,audio,text,image
|
|
|
|
+ var qitem = irsDataPage.question?["item"]?.AsArray();
|
|
|
|
+ if (qitem!=null && qitem.Count()>0)
|
|
|
|
+ {
|
|
|
|
+ for (var i = 0; i<qitem.Count(); i++)
|
|
|
|
+ {
|
|
|
|
+ qitem[i]!["question"]="";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
double questionScore = 0;
|
|
double questionScore = 0;
|
|
bool objective = false;
|
|
bool objective = false;
|
|
|
|
|
|
@@ -1712,13 +1737,32 @@ namespace HTEX.Test.Controllers
|
|
}
|
|
}
|
|
student.coworkRecord.itemRecords.Add(itemRecord);
|
|
student.coworkRecord.itemRecords.Add(itemRecord);
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ if (key.Contains("g", StringComparison.OrdinalIgnoreCase))
|
|
|
|
+ {
|
|
|
|
+ string groupId= key.Replace("g", "").Replace("G","");
|
|
|
|
+ var score = coworkData.participateLevelList[key];
|
|
|
|
+ if (score>0)
|
|
|
|
+ {
|
|
|
|
+ var groupStu= studentLessonDatas.FindAll(x =>x.attend==1 && !string.IsNullOrWhiteSpace(x.groupId) && x.groupId.Equals(groupId));
|
|
|
|
+ if (groupStu.IsNotEmpty())
|
|
|
|
+ {
|
|
|
|
+ foreach (var stu in groupStu)
|
|
|
|
+ {
|
|
|
|
+ stu.group_coworkScore.Add(score);
|
|
|
|
+ stu.coworkRecord.itemRecords[p].itemScore+=score;
|
|
|
|
+ stu.coworkRecord.itemRecords[p].resultWeight=InteractWeight.TP;
|
|
|
|
+ stu.coworkRecord.itemRecords[p].resultType=InteractReultType.TP;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- var order = studentLessonDatas.OrderByDescending(x => x.coworkRecord.itemRecords[p].itemScore);
|
|
|
|
- var maxItems = studentLessonDatas.FindAll(x => x.coworkRecord.itemRecords[p].itemScore==order.First().coworkRecord.itemRecords[p].itemScore);
|
|
|
|
- var max = studentLessonDatas.FindAll(x => x.coworkRecord.itemRecords[p].itemScore==order.First().coworkRecord.itemRecords[p].itemScore).First().coworkRecord.itemRecords[p].itemScore;
|
|
|
|
- var min = studentLessonDatas.FindAll(x => x.coworkRecord.itemRecords[p].itemScore==order.Last().coworkRecord.itemRecords[p].itemScore).First().coworkRecord.itemRecords[p].itemScore;
|
|
|
|
- var sum = studentLessonDatas.Sum(x => x.coworkRecord.itemRecords[p].itemScore);
|
|
|
|
|
|
+ }
|
|
|
|
+ var order = studentLessonDatas.Where(x=>x.attend==1).OrderByDescending(x => x.coworkRecord.itemRecords[p].itemScore);
|
|
|
|
+ var maxItems = studentLessonDatas.FindAll(x => x.attend==1&& x.coworkRecord.itemRecords[p].itemScore==order.First().coworkRecord.itemRecords[p].itemScore);
|
|
|
|
+ var max = studentLessonDatas.FindAll(x => x.attend==1&& x.coworkRecord.itemRecords[p].itemScore==order.First().coworkRecord.itemRecords[p].itemScore).First().coworkRecord.itemRecords[p].itemScore;
|
|
|
|
+ var min = studentLessonDatas.FindAll(x => x.attend==1&& x.coworkRecord.itemRecords[p].itemScore==order.Last().coworkRecord.itemRecords[p].itemScore).First().coworkRecord.itemRecords[p].itemScore;
|
|
|
|
+ var sum = studentLessonDatas.Where(x=>x.attend==1).Sum(x => x.coworkRecord.itemRecords[p].itemScore);
|
|
foreach (var student in studentLessonDatas)
|
|
foreach (var student in studentLessonDatas)
|
|
{
|
|
{
|
|
if (student.attend==1 && student.coworkRecord.itemRecords.Count>=p+1 && student.coworkRecord.itemRecords[p].itemScore>0)
|
|
if (student.attend==1 && student.coworkRecord.itemRecords.Count>=p+1 && student.coworkRecord.itemRecords[p].itemScore>0)
|
|
@@ -1762,7 +1806,7 @@ namespace HTEX.Test.Controllers
|
|
var work = taskData.clientWorks.Find(x =>$"{x.seatID}".Equals(student.seatID));
|
|
var work = taskData.clientWorks.Find(x =>$"{x.seatID}".Equals(student.seatID));
|
|
if (work!= null)
|
|
if (work!= null)
|
|
{
|
|
{
|
|
- student.taskRecord.itemRecords.Add(new ItemRecord { itemType="WrkSpaceLoad", itemScore=10, resultWeight=InteractWeight.T1, resultType=InteractReultType.T1, isGroup= work.isGroupItem });
|
|
|
|
|
|
+ student.taskRecord.itemRecords.Add(new ItemRecord { itemType="WrkSpaceLoad", itemScore=work.blobFiles.Count *10, resultWeight=InteractWeight.TT, resultType=InteractReultType.TT, isGroup= work.isGroupItem,optCount=work.blobFiles.Count });
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -1773,22 +1817,38 @@ namespace HTEX.Test.Controllers
|
|
////////
|
|
////////
|
|
///需要处理小组的情况,当前人员没有提交作品,但是有可能是小组其他人员提交了,需要判断一下。
|
|
///需要处理小组的情况,当前人员没有提交作品,但是有可能是小组其他人员提交了,需要判断一下。
|
|
///
|
|
///
|
|
- var groupIdsA = studentLessonDatas.FindAll(x => x.attend==1 && x.taskRecord.itemRecords[indexTask].isGroup==true).GroupBy(x=>x.groupId).Select(x=>x.Key);
|
|
|
|
- foreach (var groupId in groupIdsA)
|
|
|
|
|
|
+ var students = studentLessonDatas.FindAll(x => x.attend==1 && x.taskRecord.itemRecords[indexTask].isGroup==true);
|
|
|
|
+ foreach (var student in students)
|
|
{
|
|
{
|
|
- var groupStudents= studentLessonDatas.FindAll(x => x.attend==1 && !string.IsNullOrWhiteSpace(x.groupId) && x.groupId.Equals(groupId));
|
|
|
|
- foreach (var student in groupStudents)
|
|
|
|
|
|
+ var groupStudents= studentLessonDatas.FindAll(x => x.id!=student.id && x.attend==1 && !string.IsNullOrWhiteSpace(x.groupId) && x.groupId.Equals(student.groupId));
|
|
|
|
+ foreach (var groupstudent in groupStudents)
|
|
{
|
|
{
|
|
- student.taskRecord.itemRecords[indexTask].isGroup=true;
|
|
|
|
|
|
+ groupstudent.taskRecord.itemRecords[indexTask].isGroup=true;
|
|
|
|
+ groupstudent.taskRecord.itemRecords[indexTask].optCount=student.taskRecord.itemRecords[indexTask].optCount;
|
|
|
|
+ groupstudent.taskRecord.itemRecords[indexTask].itemScore=student.taskRecord.itemRecords[indexTask].itemScore;
|
|
|
|
+ groupstudent.taskRecord.itemRecords[indexTask].resultWeight=student.taskRecord.itemRecords[indexTask].resultWeight;
|
|
|
|
+ groupstudent.taskRecord.itemRecords[indexTask].resultType=student.taskRecord.itemRecords[indexTask].resultType;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- var groupIdsB = taskData.clientWorks.FindAll(x => x.seatID==0 && x.isGroupItem).Select(x => x.groupID).Distinct() ;
|
|
|
|
- foreach (var groupId in groupIdsB)
|
|
|
|
|
|
+ var groupDatas = taskData.clientWorks.FindAll(x => x.seatID==0 && x.isGroupItem);
|
|
|
|
+ foreach (var groupData in groupDatas)
|
|
{
|
|
{
|
|
- var groupStudents = studentLessonDatas.FindAll(x => x.attend==1 && !string.IsNullOrWhiteSpace(x.groupId) && x.groupId.Equals(groupId));
|
|
|
|
|
|
+ var groupStudents = studentLessonDatas.FindAll(x => x.attend==1 && !string.IsNullOrWhiteSpace(x.groupId) && x.groupId.Equals(groupData.groupID));
|
|
foreach (var student in groupStudents)
|
|
foreach (var student in groupStudents)
|
|
{
|
|
{
|
|
student.taskRecord.itemRecords[indexTask].isGroup=true;
|
|
student.taskRecord.itemRecords[indexTask].isGroup=true;
|
|
|
|
+ student.taskRecord.itemRecords[indexTask].optCount=groupData.blobFiles.Count;
|
|
|
|
+ student.taskRecord.itemRecords[indexTask].itemScore= 10* groupData.blobFiles.Count;
|
|
|
|
+ if (groupData.blobFiles.Count>0)
|
|
|
|
+ {
|
|
|
|
+ student.taskRecord.itemRecords[indexTask].resultWeight=InteractWeight.TT;
|
|
|
|
+ student.taskRecord.itemRecords[indexTask].resultType=InteractReultType.TT;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ student.taskRecord.itemRecords[indexTask].resultWeight=InteractWeight.T0;
|
|
|
|
+ student.taskRecord.itemRecords[indexTask].resultType=InteractReultType.T0;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
indexTask++;
|
|
indexTask++;
|
|
@@ -1810,7 +1870,7 @@ namespace HTEX.Test.Controllers
|
|
/// <param name="smartRatingDatas"></param>
|
|
/// <param name="smartRatingDatas"></param>
|
|
/// <param name="studentLessonDatas"></param>
|
|
/// <param name="studentLessonDatas"></param>
|
|
/// <returns></returns>
|
|
/// <returns></returns>
|
|
- private List<StudentLessonData> GetSmartRatingData( LessonBase lessonBase, TimeLineData timeLineData, List<SmartRatingData> smartRatingDatas, List<StudentLessonData> studentLessonDatas)
|
|
|
|
|
|
+ private List<StudentLessonData> GetSmartRatingData( LessonBase lessonBase, TimeLineData timeLineData, List<SmartRatingData> smartRatingDatas, List<StudentLessonData> studentLessonDatas,string itemf )
|
|
{
|
|
{
|
|
int index = 0;
|
|
int index = 0;
|
|
foreach(var smartRatingData in smartRatingDatas)
|
|
foreach(var smartRatingData in smartRatingDatas)
|
|
@@ -1824,30 +1884,41 @@ namespace HTEX.Test.Controllers
|
|
bool addData=false;
|
|
bool addData=false;
|
|
foreach (var key in keys_vote!)
|
|
foreach (var key in keys_vote!)
|
|
{
|
|
{
|
|
-
|
|
|
|
- var voteDetailResults = smartRatingData.smartRateSummary!.voteDetailResult[key];
|
|
|
|
- foreach (var student in studentLessonDatas)
|
|
|
|
- {
|
|
|
|
- if (student.attend==1)
|
|
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ //问题数据F:\lesson-local\632424798693232640-local.json pclxxx
|
|
|
|
+ if (smartRatingData.smartRateSummary!.voteDetailResult.TryGetValue(key, out var value))
|
|
{
|
|
{
|
|
- //投票是全员参与
|
|
|
|
- var datasS = voteDetailResults.FindAll(x => x.id.Equals(student.seatID));
|
|
|
|
- if (datasS.IsNotEmpty())
|
|
|
|
|
|
+ var voteDetailResults = smartRatingData.smartRateSummary!.voteDetailResult[key];
|
|
|
|
+ foreach (var student in studentLessonDatas)
|
|
{
|
|
{
|
|
- //T1,只有评论别人,没被别人评论 或者是评论了别人,但是没有被别人评论,
|
|
|
|
- student.rateingRecord.itemRecords.Add(new ItemRecord { itemType=type, resultType=InteractReultType.T1, resultWeight = InteractWeight.T1 });
|
|
|
|
- addData=true;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- { //T0 是没有评论别人,也没被别人评论,
|
|
|
|
- student.rateingRecord.itemRecords.Add(new ItemRecord { itemType=type, resultType=InteractReultType.T0, resultWeight = InteractWeight.T0 });
|
|
|
|
- addData=true;
|
|
|
|
|
|
+ if (student.attend==1)
|
|
|
|
+ {
|
|
|
|
+ //投票是全员参与
|
|
|
|
+ var datasS = voteDetailResults.FindAll(x => x.id.Equals(student.seatID));
|
|
|
|
+ if (datasS.IsNotEmpty())
|
|
|
|
+ {
|
|
|
|
+ //T1,只有评论别人,没被别人评论 或者是评论了别人,但是没有被别人评论,
|
|
|
|
+ student.rateingRecord.itemRecords.Add(new ItemRecord { itemType=type, resultType=InteractReultType.T1, resultWeight = InteractWeight.T1 });
|
|
|
|
+ addData=true;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ { //T0 是没有评论别人,也没被别人评论,
|
|
|
|
+ student.rateingRecord.itemRecords.Add(new ItemRecord { itemType=type, resultType=InteractReultType.T0, resultWeight = InteractWeight.T0 });
|
|
|
|
+ addData=true;
|
|
|
|
+ }
|
|
|
|
+ //T0 是没有评论别人,也没被别人评论,
|
|
|
|
+ //T1,只有评论别人,没被别人评论 或者是评论了别人,但是没有被别人评论,
|
|
|
|
+ //TP 有被别人评论,且评论了别人,
|
|
|
|
+ //TT是评论了别人,且被别人评论次数最高,或者分值最高。
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- //T0 是没有评论别人,也没被别人评论,
|
|
|
|
- //T1,只有评论别人,没被别人评论 或者是评论了别人,但是没有被别人评论,
|
|
|
|
- //TP 有被别人评论,且评论了别人,
|
|
|
|
- //TT是评论了别人,且被别人评论次数最高,或者分值最高。
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ } catch (Exception ex)
|
|
|
|
+ {
|
|
|
|
+ Console.WriteLine(itemf);
|
|
|
|
+ // throw new Exception($"{itemf}\n{ex.Message}\n{ex.StackTrace}");
|
|
}
|
|
}
|
|
var meteor_VoteSummary = smartRatingData.smartRateSummary!.meteor_VoteSummary[key];
|
|
var meteor_VoteSummary = smartRatingData.smartRateSummary!.meteor_VoteSummary[key];
|
|
var order = meteor_VoteSummary.OrderByDescending(x => x.result);
|
|
var order = meteor_VoteSummary.OrderByDescending(x => x.result);
|
|
@@ -1922,39 +1993,42 @@ namespace HTEX.Test.Controllers
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- var order = smartRatingData.smartRateSummary.meteor_ScoreSummary.Where(x => x.result>0).OrderByDescending(x => x.result);
|
|
|
|
- var maxItems = smartRatingData.smartRateSummary.meteor_ScoreSummary.FindAll(x => x.result==order.First().result);
|
|
|
|
- var max = smartRatingData.smartRateSummary.meteor_ScoreSummary.FindAll(x => x.result==order.First().result).First().result;
|
|
|
|
- var min = smartRatingData.smartRateSummary.meteor_ScoreSummary.FindAll(x => x.result==order.Last().result).First().result;
|
|
|
|
- var sum = smartRatingData.smartRateSummary.meteor_ScoreSummary.Sum(x => x.result);
|
|
|
|
-
|
|
|
|
- foreach (var meteor_ScoreSummary in smartRatingData.smartRateSummary.meteor_ScoreSummary)
|
|
|
|
|
|
+ var order = smartRatingData.smartRateSummary.meteor_ScoreSummary.Where(x => x.result>0||!string.IsNullOrWhiteSpace(x.comment)).OrderByDescending(x => x.result);
|
|
|
|
+ if (order.Count()>0)
|
|
{
|
|
{
|
|
- var student= studentLessonDatas.Find(x => x.seatID!.Equals(meteor_ScoreSummary.id));
|
|
|
|
- if (student!=null)
|
|
|
|
|
|
+ var maxItems = smartRatingData.smartRateSummary.meteor_ScoreSummary.FindAll(x => x.result==order.First().result);
|
|
|
|
+ var max = smartRatingData.smartRateSummary.meteor_ScoreSummary.FindAll(x => x.result==order.First().result).First().result;
|
|
|
|
+ var min = smartRatingData.smartRateSummary.meteor_ScoreSummary.FindAll(x => x.result==order.Last().result).First().result;
|
|
|
|
+ var sum = smartRatingData.smartRateSummary.meteor_ScoreSummary.Sum(x => x.result);
|
|
|
|
+
|
|
|
|
+ foreach (var meteor_ScoreSummary in smartRatingData.smartRateSummary.meteor_ScoreSummary)
|
|
{
|
|
{
|
|
- if (index<student.rateingRecord.itemRecords.Count && student.rateingRecord.itemRecords[index].itemType!.Equals(type))
|
|
|
|
|
|
+ var student = studentLessonDatas.Find(x => x.seatID!.Equals(meteor_ScoreSummary.id));
|
|
|
|
+ if (student!=null)
|
|
{
|
|
{
|
|
- if (student.rateingRecord.itemRecords[index].resultType!.Equals(InteractReultType.T0))
|
|
|
|
- {
|
|
|
|
- //T1,只有评论别人,没被别人评论 或者是评论了别人,但是没有被别人评论,
|
|
|
|
- student.rateingRecord.itemRecords[index].resultType= InteractReultType.T1;
|
|
|
|
- student.rateingRecord.itemRecords[index].resultWeight= InteractWeight.T1;
|
|
|
|
- }
|
|
|
|
- else if (student.rateingRecord.itemRecords[index].resultType!.Equals(InteractReultType.T1))
|
|
|
|
|
|
+ if (index<student.rateingRecord.itemRecords.Count && student.rateingRecord.itemRecords[index].itemType!.Equals(type))
|
|
{
|
|
{
|
|
- //TP 有被别人评论,且评论了别人,
|
|
|
|
- student.rateingRecord.itemRecords[index].resultType= InteractReultType.TP;
|
|
|
|
- var data = MinMaxNormalization(min, max, meteor_ScoreSummary.result);
|
|
|
|
- //student.rateingRecord.itemRecords[index].resultWeight= InteractWeight.TP;
|
|
|
|
- student.rateingRecord.itemRecords[index].resultWeight= InteractWeight.T1+ data * 1.0 / maxRank * (InteractWeight.TT-InteractWeight.T1);
|
|
|
|
- //被评论次数
|
|
|
|
- student.rateingRecord.itemRecords[index].itemScore=meteor_ScoreSummary.result;
|
|
|
|
- //TT是评论了别人,且被别人评论次数最高,或者分值最高。
|
|
|
|
- if (maxItems.Select(x => x.id).Contains(student.seatID))
|
|
|
|
|
|
+ if (student.rateingRecord.itemRecords[index].resultType!.Equals(InteractReultType.T0))
|
|
{
|
|
{
|
|
- student.rateingRecord.itemRecords[index].resultType= InteractReultType.TT;
|
|
|
|
- student.rateingRecord.itemRecords[index].resultWeight= InteractWeight.TT;
|
|
|
|
|
|
+ //T1,只有评论别人,没被别人评论 或者是评论了别人,但是没有被别人评论,
|
|
|
|
+ student.rateingRecord.itemRecords[index].resultType= InteractReultType.T1;
|
|
|
|
+ student.rateingRecord.itemRecords[index].resultWeight= InteractWeight.T1;
|
|
|
|
+ }
|
|
|
|
+ else if (student.rateingRecord.itemRecords[index].resultType!.Equals(InteractReultType.T1))
|
|
|
|
+ {
|
|
|
|
+ //TP 有被别人评论,且评论了别人,
|
|
|
|
+ student.rateingRecord.itemRecords[index].resultType= InteractReultType.TP;
|
|
|
|
+ var data = MinMaxNormalization(min, max, meteor_ScoreSummary.result);
|
|
|
|
+ //student.rateingRecord.itemRecords[index].resultWeight= InteractWeight.TP;
|
|
|
|
+ student.rateingRecord.itemRecords[index].resultWeight= InteractWeight.T1+ data * 1.0 / maxRank * (InteractWeight.TT-InteractWeight.T1);
|
|
|
|
+ //被评论次数
|
|
|
|
+ student.rateingRecord.itemRecords[index].itemScore=meteor_ScoreSummary.result;
|
|
|
|
+ //TT是评论了别人,且被别人评论次数最高,或者分值最高。
|
|
|
|
+ if (maxItems.Select(x => x.id).Contains(student.seatID) &&student.rateingRecord.itemRecords[index].itemScore>0)
|
|
|
|
+ {
|
|
|
|
+ student.rateingRecord.itemRecords[index].resultType= InteractReultType.TT;
|
|
|
|
+ student.rateingRecord.itemRecords[index].resultWeight= InteractWeight.TT;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -2054,7 +2128,7 @@ namespace HTEX.Test.Controllers
|
|
public LessonBase? lessonBase { get; set;}
|
|
public LessonBase? lessonBase { get; set;}
|
|
public TimeLineData? timeLineData { get; set; }
|
|
public TimeLineData? timeLineData { get; set; }
|
|
public LessonRecord? lessonRecord { get; set; }
|
|
public LessonRecord? lessonRecord { get; set; }
|
|
- public List<StudentLessonData> studentLessonDatas { get; set; } = new List<StudentLessonData>();
|
|
|
|
|
|
+ public List<LocalStudent> studentLessonDatas { get; set; } = new List<LocalStudent>();
|
|
public List<TaskData> taskDatas { get; set; } = new List<TaskData>();
|
|
public List<TaskData> taskDatas { get; set; } = new List<TaskData>();
|
|
public List<SmartRatingData> smartRatingDatas { get; set; } = new List<SmartRatingData>();
|
|
public List<SmartRatingData> smartRatingDatas { get; set; } = new List<SmartRatingData>();
|
|
public List<IRSData> irsDatas { get; set; } = new List<IRSData>();
|
|
public List<IRSData> irsDatas { get; set; } = new List<IRSData>();
|
|
@@ -2062,134 +2136,30 @@ namespace HTEX.Test.Controllers
|
|
public List<ExamData> examDatas { get; set; } = new List<ExamData>();
|
|
public List<ExamData> examDatas { get; set; } = new List<ExamData>();
|
|
public List<TimeLineEvent> sokratesDatas { get; set; } = new List<TimeLineEvent>();
|
|
public List<TimeLineEvent> sokratesDatas { get; set; } = new List<TimeLineEvent>();
|
|
}
|
|
}
|
|
-
|
|
|
|
- /// 互动参与指数(按倍数的权重设计)
|
|
|
|
- /// 无二次作答的互动,且未设置正确答案:1.未作答0
|
|
|
|
- /// 2.已作答1
|
|
|
|
- ///
|
|
|
|
- /// 无二次作答的互动,且设置了正确答案:3.未作答0
|
|
|
|
- /// 4.已作答1
|
|
|
|
- /// 5.不完全正确1.3
|
|
|
|
- /// 6.作答正确1.5
|
|
|
|
- ///
|
|
|
|
- ///
|
|
|
|
- /// 有二次作答的互动,且未设置正确答案:7.第一次未作答0,第二次未作答0=》0
|
|
|
|
- /// 8.第一次已作答1,第二次未作答0=》1
|
|
|
|
- /// 9.第一次未作答0,第二次已作答1=》1
|
|
|
|
- /// 10.第一次已作答1,第二次已作答1=》2
|
|
|
|
- ///
|
|
|
|
- /// 有二次作答的互动,且设置了正确答案:(16种可能)
|
|
|
|
- /// 11.第一次未作答0,第二次未作答0=》0
|
|
|
|
- /// 12.第一次已作答,不完全正确1.3,第二次未作答0=》1.3
|
|
|
|
- /// 13.第一次已作答,作答正确1.5,第二次未作答0=》1.5
|
|
|
|
- /// 14.第一次已作答,作答错误1,第二次未作答0=》1
|
|
|
|
- /// 15.第一次未作答0,第二次已作答,不完全正确1.3=》1.3
|
|
|
|
- /// 16.第一次未作答0,第二次已作答,作答正确1.5=》1.5
|
|
|
|
- /// 17.第一次未作答0,第二次已作答,作答错误1=》1
|
|
|
|
- /// 18.第一次已作答,作答错误1,第二次已作答,作答错误1=》2
|
|
|
|
- /// 19.第一次已作答,不完全正确1.3,第二次已作答,作答错误1=》2.3
|
|
|
|
- /// 20.第一次已作答,作答正确1.5,第二次已作答,作答错误1=》2.5
|
|
|
|
- /// 21.第一次已作答,作答错误1,第二次已作答,不完全正确1.3=》2.3
|
|
|
|
- /// 22.第一次已作答,作答错误1,第二次已作答,作答正确1.5=》2.5
|
|
|
|
- /// 23.第一次已作答,不完全正确1.3,第二次已作答,不完全正确1.3=》2.6
|
|
|
|
- /// 24.第一次已作答,不完全正确1.3,第二次已作答,作答正确1.5=》2.8
|
|
|
|
- /// 25.第一次已作答,作答正确1.5,第二次已作答,不完全正确1.3=》2.8
|
|
|
|
- /// 26.第一次已作答,作答正确1.5,第二次已作答,作答正确1.5=》3
|
|
|
|
- ///
|
|
|
|
- /// 抢权模式: 27.未参与抢权 0
|
|
|
|
- /// 28.参与抢权 1
|
|
|
|
- /// 29.抢权成功 1.5
|
|
|
|
- /// 挑人时被挑到 30.被挑到 1.5
|
|
|
|
- /// 有三次作答的互动,且设置了正确答案:(64种可能)
|
|
|
|
- /*
|
|
|
|
- 1 未作答0 未作答0 未作答0 0
|
|
|
|
- 2 未作答0 未作答0 不完全正确1.3 1.3
|
|
|
|
- 3 未作答0 未作答0 作答正确1.5 1.5
|
|
|
|
- 4 未作答0 未作答0 作答错误1 1
|
|
|
|
- 5 未作答0 不完全正确1.3 未作答0 1.3
|
|
|
|
- 6 未作答0 不完全正确1.3 不完全正确1.3 2.6
|
|
|
|
- 7 未作答0 不完全正确1.3 作答正确1.5 2.8
|
|
|
|
- 8 未作答0 不完全正确1.3 作答错误1 2.3
|
|
|
|
- 9 未作答0 作答正确1.5 未作答0 1.5
|
|
|
|
- 10 未作答0 作答正确1.5 不完全正确1.3 2.8
|
|
|
|
- 11 未作答0 作答正确1.5 作答正确1.5 3
|
|
|
|
- 12 未作答0 作答正确1.5 作答错误1 2.5
|
|
|
|
- 13 未作答0 作答错误1 未作答0 1
|
|
|
|
- 14 未作答0 作答错误1 不完全正确1.3 2.3
|
|
|
|
- 15 未作答0 作答错误1 作答正确1.5 2.5
|
|
|
|
- 16 未作答0 作答错误1 作答错误1 2
|
|
|
|
- 17 已作答错误1 未作答0 未作答0 1
|
|
|
|
- 18 已作答错误1 未作答0 不完全正确1.3 2.3
|
|
|
|
- 19 已作答错误1 未作答0 作答正确1.5 2.5
|
|
|
|
- 20 已作答错误1 未作答0 作答错误1 2
|
|
|
|
- 21 已作答错误1 不完全正确1.3 未作答0 2.3
|
|
|
|
- 22 已作答错误1 不完全正确1.3 不完全正确1.3 3.6
|
|
|
|
- 23 已作答错误1 不完全正确1.3 作答正确1.5 3.8
|
|
|
|
- 24 已作答错误1 不完全正确1.3 作答错误1 3.3
|
|
|
|
- 25 已作答错误1 作答正确1.5 未作答0 2.5
|
|
|
|
- 26 已作答错误1 作答正确1.5 不完全正确1.3 3.8
|
|
|
|
- 27 已作答错误1 作答正确1.5 作答正确1.5 4
|
|
|
|
- 28 已作答错误1 作答正确1.5 作答错误1 3.5
|
|
|
|
- 29 已作答错误1 作答错误1 未作答0 2
|
|
|
|
- 30 已作答错误1 作答错误1 不完全正确1.3 3.3
|
|
|
|
- 31 已作答错误1 作答错误1 作答正确1.5 3.5
|
|
|
|
- 32 已作答错误1 作答错误1 作答错误1 3
|
|
|
|
- 33 已作答不完全正确1.3 未作答0 未作答0 1.3
|
|
|
|
- 34 已作答不完全正确1.3 未作答0 不完全正确1.3 2.6
|
|
|
|
- 35 已作答不完全正确1.3 未作答0 作答正确1.5 2.8
|
|
|
|
- 36 已作答不完全正确1.3 未作答0 作答错误1 2.3
|
|
|
|
- 37 已作答不完全正确1.3 不完全正确1.3 未作答0 2.6
|
|
|
|
- 38 已作答不完全正确1.3 不完全正确1.3 不完全正确1.3 3.9
|
|
|
|
- 39 已作答不完全正确1.3 不完全正确1.3 作答正确1.5 4.1
|
|
|
|
- 40 已作答不完全正确1.3 不完全正确1.3 作答错误1 3.6
|
|
|
|
- 41 已作答不完全正确1.3 作答正确1.5 未作答0 2.8
|
|
|
|
- 42 已作答不完全正确1.3 作答正确1.5 不完全正确1.3 4.1
|
|
|
|
- 43 已作答不完全正确1.3 作答正确1.5 作答正确1.5 4.3
|
|
|
|
- 44 已作答不完全正确1.3 作答正确1.5 作答错误1 3.8
|
|
|
|
- 45 已作答不完全正确1.3 作答错误1 未作答0 2.3
|
|
|
|
- 46 已作答不完全正确1.3 作答错误1 不完全正确1.3 3.6
|
|
|
|
- 47 已作答不完全正确1.3 作答错误1 作答正确1.5 3.8
|
|
|
|
- 48 已作答不完全正确1.3 作答错误1 作答错误1 3.3
|
|
|
|
- 49 已作答正确1.5 未作答0 未作答0 1.5
|
|
|
|
- 50 已作答正确1.5 未作答0 不完全正确1.3 2.8
|
|
|
|
- 51 已作答正确1.5 未作答0 作答正确1.5 3
|
|
|
|
- 52 已作答正确1.5 未作答0 作答错误1 2.5
|
|
|
|
- 53 已作答正确1.5 不完全正确1.3 未作答0 2.8
|
|
|
|
- 54 已作答正确1.5 不完全正确1.3 不完全正确1.3 4.1
|
|
|
|
- 55 已作答正确1.5 不完全正确1.3 作答正确1.5 4.3
|
|
|
|
- 56 已作答正确1.5 不完全正确1.3 作答错误1 3.8
|
|
|
|
- 57 已作答正确1.5 作答正确1.5 未作答0 3
|
|
|
|
- 58 已作答正确1.5 作答正确1.5 不完全正确1.3 4.3
|
|
|
|
- 59 已作答正确1.5 作答正确1.5作答正确1.5 4.5
|
|
|
|
- 60 已作答正确1.5 作答正确1.5作答错误1 4
|
|
|
|
- 61 已作答正确1.5 作答错误1 未作答0 2.5
|
|
|
|
- 62 已作答正确1.5 作答错误1 不完全正确1.3 3.8
|
|
|
|
- 63 已作答正确1.5 作答错误1 作答正确1.54
|
|
|
|
- 64 已作答正确1.5 作答错误1 作答错误1 3.5
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- *
|
|
|
|
- /// 事件
|
|
|
|
- /// 推送相关 在Push.json处理 DifObjPush 推送给学生 差异化推送 "PushMemberId":[1,4,8,12,17,18,19,23,24,27,32,36] ,FastPgPush 同一推送
|
|
|
|
- /// 互动相关 在IRS.json处理 'PopQuesLoad'互动问答 , 'ReAtmpAnsStrt' 二次作答 , 'BuzrAns' 抢权(新), 'BuzrLoad'抢权(旧), PickupResult 挑人算不算互动?? 读取PickupMemberId "[\r\n 35\r\n]"
|
|
|
|
- /// 测验相关 在IRS.json处理 SPQStrt 测验模式
|
|
|
|
- /// 任务相关 在Task.json处理 'WrkSpaceLoad' 作品收集, 'WrkCmp' 作品贴上 是什么操作
|
|
|
|
- /// 评分相关 在SmartRating.json 处理 'SmartRating' 评分模式,分 投票Voting 和 GrandRating 星光大评分(All每人多件评分,Two随机分配互评, Self自评)
|
|
|
|
- /// 协作相关 在Cowork.json 处理 CoworkLoad 协作类型 coworkType All: '全体协作', Group: '分组协作', 其他的为 : '差异化协作',
|
|
|
|
- 问题汇总:
|
|
|
|
- TimeLine.json
|
|
|
|
- 挑人大类 Event= PickupResult 里面 分小类
|
|
|
|
- PickupType=PickupRight , PickupOption , PickupNthGrp ,PickupEachGrp ,PickupDiff 五种类型分别是什么意思,是否还有其他类型的。
|
|
|
|
- ,"PickupCount":1,"PickupOption":2 ,"PickupGroup":2 这三个字段是什么意思。
|
|
|
|
- "PickupMemberId":"[\r\n 1\r\n]" 里面是学生的座号还是数组下标。
|
|
|
|
- "Event":"PressGood","TargetClass":0,"MemberId":"[\r\n 1\r\n]","Count":1},
|
|
|
|
- 是代表什么意思。 MemberId 是座号还说下标。
|
|
|
|
- 8月27日 17:581. Task.json的 clientWorks.isGroupItem bool 类型 false代表什么意思 true代表什么意思
|
|
|
|
-2. Cowork.json 的 coworkType All: '全体协作', Group: '分组协作', : '差异化协作', 差异化协作的简码是什么?
|
|
|
|
-3. TimeLine.json 的 类型 PickupResult 挑人算不算互动?? 读取PickupMemberId "[\r\n 35\r\n]"
|
|
|
|
-4. 小组任务具体详细信息如何获取? 需要精确到 所有小组任务信息和 某一小组的参与情况 用于计算小组任务参与率
|
|
|
|
- */
|
|
|
|
|
|
+
|
|
|
|
+ public class LocalStudent
|
|
|
|
+ {
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 出席状态 1出席,6公假,5事假,4病假,2缺席,0未签到
|
|
|
|
+ /// </summary>
|
|
|
|
+ public int attend { get; set; }
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 学生的学号
|
|
|
|
+ /// </summary>
|
|
|
|
+ public string? id { get; set; }
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 学生所在下标
|
|
|
|
+ /// </summary>
|
|
|
|
+ public int index { get; set; } = -1;
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 学生座位号
|
|
|
|
+ /// </summary>
|
|
|
|
+ public string? seatID { get; set; }
|
|
|
|
+ /// <summary>
|
|
|
|
+ /// 小组编号
|
|
|
|
+ /// </summary>
|
|
|
|
+ public string? groupId { get; set; }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
}
|
|
}
|