|
@@ -179,15 +179,15 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
if (!request.TryGetProperty("tmdid", out JsonElement _tmdid)) return BadRequest();
|
|
|
request.TryGetProperty("school", out JsonElement _school);
|
|
|
|
|
|
- SetLearnRecordContent(_school, _tmdid, _lessonId, _scope);
|
|
|
-
|
|
|
+ SetLearnRecordContent(_school, _tmdid, _lessonId, _scope);
|
|
|
+
|
|
|
return Ok(new { status = 200, learnRecordItems });
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
string sss = ex.Message;
|
|
|
return BadRequest();
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 設定及儲存學習紀錄
|
|
@@ -197,7 +197,7 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
/// <param name="_lessonId"></param>
|
|
|
/// <param name="_scope"></param>
|
|
|
/// <returns></returns>
|
|
|
- private async Task SetLearnRecordContent(JsonElement _school, JsonElement _tmdid, JsonElement _lessonId, JsonElement _scope)
|
|
|
+ private async Task SetLearnRecordContent(JsonElement _school, JsonElement _tmdid, JsonElement _lessonId, JsonElement _scope)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
@@ -290,7 +290,7 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
{
|
|
|
if (lessonBase.student[k].type == 2)
|
|
|
{
|
|
|
- await getSchoolCode(school, lessonId, lessonBase.student[k].id, learnRecordItem);
|
|
|
+ await getSchoolCode(school, lessonId, lessonBase.student[k].id, learnRecordItem);
|
|
|
}
|
|
|
else
|
|
|
{// 非校內帳號用直接用學號
|
|
@@ -314,6 +314,8 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
learnRecordItem.Desc = iRSItems[j].question.item[0].question;
|
|
|
}
|
|
|
learnRecordItem.Points = iRSItems[j].question.exercise.knowledges;
|
|
|
+
|
|
|
+ await setCorrectChoices(iRSItems[j], learnRecordItem);
|
|
|
learnRecordItem.ExamQuesQty = null;
|
|
|
learnRecordItem.TotalScore = null;
|
|
|
learnRecordItem.Success = null;
|
|
@@ -337,7 +339,7 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
{
|
|
|
if (lessonBase.student[k].type == 2)
|
|
|
{
|
|
|
- await getSchoolCode(school, lessonId, lessonBase.student[k].id, learnRecordItem);
|
|
|
+ await getSchoolCode(school, lessonId, lessonBase.student[k].id, learnRecordItem);
|
|
|
}
|
|
|
else
|
|
|
{// 非校內帳號用直接用學號
|
|
@@ -354,6 +356,8 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
learnRecordItem.time = dt.ToUnixTimestamp();
|
|
|
learnRecordItem.ID = timeLineEvents.events[i].Pgid;
|
|
|
learnRecordItem.Desc = "隨堂作品";
|
|
|
+ learnRecordItem.Correct = null;
|
|
|
+ learnRecordItem.Choices = null;
|
|
|
learnRecordItem.ExamQuesQty = null;
|
|
|
learnRecordItem.TotalScore = null;
|
|
|
learnRecordItem.Success = null;
|
|
@@ -363,6 +367,87 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
+ case "FastPgPush":
|
|
|
+ for (int k = 0; k < lessonBase.student.Count; k++)
|
|
|
+ {
|
|
|
+ LearnRecordItem learnRecordItem = new();
|
|
|
+ for (int m = 0; m < lessonBase.student.Count; m++)
|
|
|
+ {// 比對學生座號 取學號
|
|
|
+
|
|
|
+ if (lessonBase.student[k].type == 2)
|
|
|
+ {
|
|
|
+ await getSchoolCode(school, lessonId, lessonBase.student[k].id, learnRecordItem);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {// 非校內帳號用直接用學號
|
|
|
+ learnRecordItem.actor = lessonBase.student[k].id;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ string[] arrymd = lessonBase.summary.date.Split('.');
|
|
|
+ string[] arrhms = lessonBase.summary.startTime.Split(':');
|
|
|
+ DateTime dt = new DateTime(int.Parse(arrymd[0]), int.Parse(arrymd[1]), int.Parse(arrymd[2]), int.Parse(arrhms[0]), int.Parse(arrhms[1]), int.Parse(arrhms[2]));
|
|
|
+ dt = dt.AddSeconds(timeLineEvents.events[i].Time);
|
|
|
+ learnRecordItem.verb = "ViewPage";
|
|
|
+ learnRecordItem.time = dt.ToUnixTimestamp();
|
|
|
+ learnRecordItem.ID = timeLineEvents.events[i].Pgid;
|
|
|
+ learnRecordItem.Desc = null;
|
|
|
+ learnRecordItem.Correct = null;
|
|
|
+ learnRecordItem.Choices = null;
|
|
|
+ learnRecordItem.ExamQuesQty = null;
|
|
|
+ learnRecordItem.TotalScore = null;
|
|
|
+ learnRecordItem.Success = null;
|
|
|
+
|
|
|
+ learnRecordItems.Add(learnRecordItem);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "ActStart":
|
|
|
+ case "ActEnd":
|
|
|
+ for (int k = 0; k < lessonBase.student.Count; k++)
|
|
|
+ {
|
|
|
+ LearnRecordItem learnRecordItem = new();
|
|
|
+ for (int m = 0; m < lessonBase.student.Count; m++)
|
|
|
+ {// 比對學生座號 取學號
|
|
|
+
|
|
|
+ if (lessonBase.student[k].type == 2)
|
|
|
+ {
|
|
|
+ await getSchoolCode(school, lessonId, lessonBase.student[k].id, learnRecordItem);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {// 非校內帳號用直接用學號
|
|
|
+ learnRecordItem.actor = lessonBase.student[k].id;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ string[] arrymd = lessonBase.summary.date.Split('.');
|
|
|
+ string[] arrhms = lessonBase.summary.startTime.Split(':');
|
|
|
+ DateTime dt = new DateTime(int.Parse(arrymd[0]), int.Parse(arrymd[1]), int.Parse(arrymd[2]), int.Parse(arrhms[0]), int.Parse(arrhms[1]), int.Parse(arrhms[2]));
|
|
|
+ dt = dt.AddSeconds(timeLineEvents.events[i].Time);
|
|
|
+ if (timeLineEvents.events[i].Event == "ActStart") { learnRecordItem.verb = "StartExam"; }
|
|
|
+ if (timeLineEvents.events[i].Event == "ActEnd") { learnRecordItem.verb = "EndExam"; }
|
|
|
+ learnRecordItem.time = dt.ToUnixTimestamp();
|
|
|
+ learnRecordItem.ID = lessonId;
|
|
|
+ learnRecordItem.Desc = lessonBase.summary.activityName;
|
|
|
+ learnRecordItem.Correct = null;
|
|
|
+ learnRecordItem.Choices = null;
|
|
|
+ learnRecordItem.ExamQuesQty = 0;
|
|
|
+ foreach (var item in timeLineEvents.events)
|
|
|
+ {
|
|
|
+ if (item.Event == "PopQuesLoad" || item.Event == "QuesLoad" || item.Event == "BuzrAns")
|
|
|
+ {
|
|
|
+ learnRecordItem.ExamQuesQty = learnRecordItem.ExamQuesQty + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ learnRecordItem.TotalScore = learnRecordItem.ExamQuesQty * 10;
|
|
|
+ learnRecordItem.Success = null;
|
|
|
+
|
|
|
+ learnRecordItems.Add(learnRecordItem);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+
|
|
|
// 測驗
|
|
|
case "SPQStrt":
|
|
|
//// 開啟 .json
|
|
@@ -385,7 +470,7 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
string blobName = $"/{DateTime.Now.ToString("yyyyMMdd")}/{lessonId}.json";
|
|
|
|
|
|
// 要上传的文件内容
|
|
|
- string fileContent = learnRecordItems.ToJsonString();
|
|
|
+ string fileContent = Newtonsoft.Json.JsonConvert.SerializeObject(learnRecordItems);
|
|
|
|
|
|
// 获取容器引用
|
|
|
BlobContainerClient containerClient = _azureStorage.GetBlobContainerClient(containerName);
|
|
@@ -403,9 +488,9 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
|
|
|
}
|
|
|
}
|
|
|
- catch (Exception ex)
|
|
|
+ catch (Exception ex)
|
|
|
{
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
/// <summary>
|
|
@@ -426,7 +511,7 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
LearnRecordItem learnRecordItem = new();
|
|
|
if (lessonBase.student[k].type == 2)
|
|
|
{
|
|
|
- await getSchoolCode(school, lessonId, lessonBase.student[k].id, learnRecordItem);
|
|
|
+ await getSchoolCode(school, lessonId, lessonBase.student[k].id, learnRecordItem);
|
|
|
}
|
|
|
else
|
|
|
{// 非校內帳號用直接用學號
|
|
@@ -448,6 +533,7 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
learnRecordItem.Desc = iRSItem.question.item[0].question;
|
|
|
}
|
|
|
learnRecordItem.Points = iRSItem.question.exercise.knowledges;
|
|
|
+ await setCorrectChoices(iRSItem, learnRecordItem);
|
|
|
learnRecordItem.ExamQuesQty = null;
|
|
|
learnRecordItem.TotalScore = null;
|
|
|
iRSItem.clientAnswers.TryGetProperty("0", out JsonElement anwersArr);
|
|
@@ -463,7 +549,7 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
learnRecordItem.Success = false;
|
|
|
}
|
|
|
learnRecordItems.Add(learnRecordItem);
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 取得學校簡碼
|
|
@@ -486,6 +572,67 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
learnRecordItem.actor = $"Base-{school.Trim()},{studentId}";
|
|
|
}
|
|
|
}
|
|
|
+ /// <summary>
|
|
|
+ /// 設定CorrectChoices的邏輯
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="iRSItems"></param>
|
|
|
+ /// <param name="learnRecordItem"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private async Task setCorrectChoices(IRSItem iRSItem, LearnRecordItem learnRecordItem)
|
|
|
+ {
|
|
|
+ #region === Correct Choices ===
|
|
|
+ #region === 是非題邏輯 ===
|
|
|
+ if (iRSItem.question.exercise.type == "judge" && iRSItem.question.exercise.answer.Count > 0)
|
|
|
+ {// 如果是是非題 正確答案要用true false的方式設定
|
|
|
+ if (iRSItem.question.exercise.answer[0] == "A")
|
|
|
+ {
|
|
|
+ learnRecordItem.Correct = true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ learnRecordItem.Correct = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ learnRecordItem.Correct = iRSItem.question.exercise.answer;
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+ if (iRSItem.question.item[0].option.Count > 0)
|
|
|
+ {// 如果有選項資料 記錄起來
|
|
|
+ foreach (var option in iRSItem.question.item[0].option)
|
|
|
+ {
|
|
|
+ ChoicesItem item = new();
|
|
|
+ item.id = option.code;
|
|
|
+ if (iRSItem.question.exercise.type == "judge")
|
|
|
+ {// 如果是是非題 固定選項
|
|
|
+
|
|
|
+ if (option.code == "A")
|
|
|
+ {
|
|
|
+ item.description.zhTW = "是";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ item.description.zhTW = "否";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (string.IsNullOrWhiteSpace(option.value))
|
|
|
+ {
|
|
|
+ item.description.zhTW = $"選項{option.code}";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ item.description.zhTW = option.value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ learnRecordItem.Choices.Add(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
/// <summary>
|
|
|
/// 创建课堂开课记录(新版)
|
|
@@ -2710,36 +2857,7 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
public int memberCount { get; set; }
|
|
|
}
|
|
|
|
|
|
- #region ===學習記錄用類別===
|
|
|
- /// <summary>
|
|
|
- /// 儲存blob的格式
|
|
|
- /// </summary>
|
|
|
- private class LearnRecordItem
|
|
|
- {
|
|
|
- public LearnRecordItem()
|
|
|
- {
|
|
|
- Points = new List<string>();
|
|
|
- }
|
|
|
- // EndExam, AnsSingle, AnsMultiple, AnsBuzzin, AnsJudge, AnsComplete, AnsSubjective, SubmitTask, SubmitHomework, PostDiscussion, ReponseDisucss
|
|
|
- // 結束課堂, 單選, 複選, 搶權, 是非, 填充, 問答, 交作品, 交作業(IES5), 發起討論IES5討論區), 討論回應(IES5討論區)
|
|
|
- public string verb { get; set; }
|
|
|
- //時間戳記
|
|
|
- public long time { get; set; }
|
|
|
- // TMID直接放, 校內帳號用組合的 "Base-hbgl,473891247381"
|
|
|
- public string actor { get; set; }
|
|
|
- // 唯一碼 (考試ExamID, 題目QID, 任務PageID, 互動題PageID)
|
|
|
- public string ID { get; set; }
|
|
|
- // 文字標題或描述或題目
|
|
|
- public string Desc { get; set; }
|
|
|
- // 知識點陣列, 裡面放字串, 相當於關鍵詞
|
|
|
- public List<string> Points { get; set; }
|
|
|
- // 考試卷題數, 若無放 null
|
|
|
- public int? ExamQuesQty { get; set; }
|
|
|
- // 考試卷總分, 若無放 null
|
|
|
- public int? TotalScore { get; set; }
|
|
|
- // 單題答對與否, 若無放 null
|
|
|
- public bool? Success { get; set; }
|
|
|
- }
|
|
|
+ #region ===學習記錄用類別===
|
|
|
|
|
|
#region ===TimeLine.json===
|
|
|
private class TimeLineEvents
|
|
@@ -2788,7 +2906,17 @@ namespace TEAMModelOS.Controllers.Client
|
|
|
}
|
|
|
private class QuestionItem
|
|
|
{
|
|
|
+ public QuestionItem()
|
|
|
+ {
|
|
|
+ option = new List<OptionItem>();
|
|
|
+ }
|
|
|
public string question { get; set; }
|
|
|
+ public List<OptionItem> option { get; set; }
|
|
|
+ }
|
|
|
+ private class OptionItem
|
|
|
+ {
|
|
|
+ public string code { get; set; }
|
|
|
+ public string value { get; set; }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|