瀏覽代碼

調整寫入檔案內容 1. 加新的verb [ ViewPage ] / 2. 加兩個欄位 [ Correct ] [ Choices ] / 3. 互動加上兩個verb [ StartExam ] [ EndExam ]
將共用模組放到SDK裡

upon 1 年之前
父節點
當前提交
023c7522f6
共有 2 個文件被更改,包括 229 次插入41 次删除
  1. 60 0
      TEAMModelOS.SDK/Models/Cosmos/Common/LearnRecord.cs
  2. 169 41
      TEAMModelOS/Controllers/Client/HiTeachController.cs

+ 60 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/LearnRecord.cs

@@ -0,0 +1,60 @@
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.Json;
+using System.Threading.Tasks;
+
+namespace TEAMModelOS.SDK.Models.Cosmos.Common
+{
+    /// <summary>
+    /// 儲存學習記錄blob的格式
+    /// </summary>
+    public class LearnRecordItem
+    {
+        public LearnRecordItem()
+        {
+            Points = new List<string>();
+            Choices = new List<ChoicesItem>();
+        }
+        // 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; }
+        // 知識點陣列, 裡面放字串, 相當於關鍵詞
+        public object Correct { get; set; }
+        // 知識點陣列, 裡面放字串, 相當於關鍵詞
+        public List<ChoicesItem> Choices { get; set; }
+        // 考試卷題數, 若無放 null
+        public int? ExamQuesQty { get; set; }
+        // 考試卷總分, 若無放 null
+        public double? TotalScore { get; set; }
+        // 單題答對與否, 若無放 null
+        public bool? Success { get; set; }
+    }
+    public class ChoicesItem
+    {
+        public ChoicesItem()
+        {
+            description = new ItemDesc();
+        }
+        public string id { get; set; }
+        public ItemDesc description { get; set; }
+    }
+    public class ItemDesc
+    {
+        [JsonProperty("zh-TW")]
+        public string? zhTW { get; set; }        
+    }
+
+}

+ 169 - 41
TEAMModelOS/Controllers/Client/HiTeachController.cs

@@ -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>