Przeglądaj źródła

錯題庫每日學生錯題數記入Redis

jeff 2 lat temu
rodzic
commit
491db3ef33

+ 18 - 1
TEAMModelOS.FunctionV4/TimeTrigger/IESTimerTrigger.cs

@@ -24,6 +24,7 @@ using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.Teacher;
+using TEAMModelOS.SDK.Models.Service;
 using TEAMModelOS.SDK.Models.Service.BI;
 using TEAMModelOS.SDK.Models.Table;
 using static TEAMModelOS.SDK.Models.Teacher;
@@ -416,7 +417,7 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
         }
 
         /// <summary>
-        /// 每天執行 取得IOT TeachingData 並統計每日每校Redis資料
+        /// 每天執行 取得IOT TeachingData 並統計昨日每校Redis資料 執行時間:每日凌晨1時1分
         /// </summary>
         [Function("BICrtDailyAnal")]
         //0 1 0 * * * 一天中00的第 1 分钟
@@ -430,9 +431,25 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
             var y = $"{datetime.Year}";
             var m = datetime.Month >= 10 ? $"{datetime.Month}" : $"0{datetime.Month}";
             var d = datetime.Day >= 10 ? $"{datetime.Day}" : $"0{datetime.Day}";
+            //生成數據
             await BIProdAnalysis.BICreatDailyAnalData(_azureRedis, _azureCosmosClient, _azureCosmosClientCsv1, _dingDing, y, m, d);
+            //刪除三個月以前的Redis數據 [待做]
         }
 
+        /// <summary>
+        /// 每天執行 計算各學生各科錯題庫的數量,記入Redis 執行時間:每日2時1分
+        /// </summary>
+        [Function("CntStuErrorItems")]
+        //public async Task CntStuErrorItems([TimerTrigger("0 1 2 * * *")] TimerInfo myTimer, ILogger log)
+        public async Task CntStuErrorItems([TimerTrigger("0 6 16 * * *")] TimerInfo myTimer, ILogger log)
+        {
+            var _azureCosmosClient = _azureCosmos.GetCosmosClient();
+            var datetime = DateTimeOffset.UtcNow;
+            await ErrorItemsService.cntStuErrorItemsAsync(_azureRedis, _azureCosmosClient);
+        }
+
+
+
         public class UnusedLock { 
             public int field { get; set; }
             /// <summary>

+ 86 - 0
TEAMModelOS.SDK/Models/Service/ErrorItemsService.cs

@@ -0,0 +1,86 @@
+using Azure.Cosmos;
+using StackExchange.Redis;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.Json;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.DI;
+
+namespace TEAMModelOS.SDK.Models.Service
+{
+    public static class ErrorItemsService
+    {
+        public static async Task cntStuErrorItemsAsync(AzureRedisFactory _azureRedis, CosmosClient _azureCosmosClient)
+        {
+            var redisClinet8 = _azureRedis.GetRedisClient(8);
+            //取得ErrorItems錯題
+            Dictionary<string, Dictionary<string, List<ErrorItemsStuRow>>> ErrorItemsDic = new Dictionary<string, Dictionary<string, List<ErrorItemsStuRow>>>();
+            string qry = "SELECT SUM(ARRAY_LENGTH(c.its)) AS number, c.stuId, c.school, c.subjectId FROM c WHERE CONTAINS(c.code, 'ErrorItems') GROUP BY c.stuId, c.school, c.subjectId";
+            await foreach (var item in _azureCosmosClient.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: qry, requestOptions: null))
+            {
+                using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                {
+                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                    {
+                        //{"number":2,"stuId":"202101001","school":"hbcn","subjectId":"8b94c6b6-2572-41e5-89b9-a82fcf13891e"}
+                        string stuId = Convert.ToString(obj.GetProperty("stuId"));
+                        string schoolId = Convert.ToString(obj.GetProperty("school"));
+                        schoolId = (!string.IsNullOrWhiteSpace(schoolId)) ? schoolId : "noschoolid";
+                        string subjectId = Convert.ToString(obj.GetProperty("subjectId"));
+                        int number = obj.GetProperty("number").GetInt32();
+                        if(ErrorItemsDic.ContainsKey(schoolId))
+                        {
+                            if (ErrorItemsDic[schoolId].ContainsKey(stuId))
+                            {
+                                List<ErrorItemsStuRow> ErrorItemsStuRowList = ErrorItemsDic[schoolId][stuId];
+                                ErrorItemsStuRow ErrorItemsStuRow = ErrorItemsStuRowList.Where(s => s.subjectId.Equals(subjectId)).FirstOrDefault();
+                                if (ErrorItemsStuRow == null)
+                                {
+                                    ErrorItemsDic[schoolId][stuId].Add(new ErrorItemsStuRow() { subjectId = subjectId, number = number });
+                                }
+                            }
+                            else
+                            {
+                                List<ErrorItemsStuRow> ErrorItemsStuRowList = new List<ErrorItemsStuRow>();
+                                ErrorItemsStuRow ErrorItemsStuRow = new ErrorItemsStuRow() { subjectId = subjectId, number = number };
+                                ErrorItemsStuRowList.Add(ErrorItemsStuRow);
+                                ErrorItemsDic[schoolId].Add(stuId, ErrorItemsStuRowList);
+                            }
+                        }
+                        else
+                        {
+                            List<ErrorItemsStuRow> ErrorItemsStuRowList = new List<ErrorItemsStuRow>();
+                            ErrorItemsStuRow ErrorItemsStuRow = new ErrorItemsStuRow() { subjectId = subjectId, number = number };
+                            ErrorItemsStuRowList.Add(ErrorItemsStuRow);
+                            Dictionary<string, List<ErrorItemsStuRow>> ErrorItemsSchRow = new Dictionary<string, List<ErrorItemsStuRow>>{{ stuId, ErrorItemsStuRowList }};
+                            ErrorItemsDic.Add(schoolId, ErrorItemsSchRow);
+                        }
+                    }
+                }
+            }
+            //寫入Redis
+            foreach(var SchKey in ErrorItemsDic)
+            {
+                string schoolId = SchKey.ToString();
+                string hkey = $"ErrorItems:{schoolId}";
+                List<HashEntry> hvalList = new List<HashEntry>();
+                Dictionary<string, List<ErrorItemsStuRow>> itemSch = SchKey.Value;
+                foreach(var itemStu in itemSch)
+                {
+                    string stuId = itemStu.Key;
+                    string stuVal = JsonSerializer.Serialize(SchKey.Value);
+                    hvalList.Add(new HashEntry($"{stuId}", stuVal));
+                }
+                await redisClinet8.HashSetAsync(hkey, hvalList.ToArray());
+            }
+        }
+    }
+    public class ErrorItemsStuRow
+    {
+        public string subjectId { get; set; }
+        public int number { get; set; }
+    }
+}

+ 1 - 1
TEAMModelOS/Controllers/Client/HiTeachController.cs

@@ -705,7 +705,7 @@ namespace TEAMModelOS.Controllers.Client
                 (List<Class> school_classes, _) = await SchoolService.DoGraduateClasses(_httpTrigger, _azureCosmos, null, school_base, _option, _dingDing);
 
                 //取得學校安排老師課程
-                var query = $"SELECT DISTINCT c.id, c.name, c.scope, c.subject, c.period.id AS periodId, schedule.classId AS scheduleClassId, schedule.teacher AS scheduleTeacher, schedule.stulist AS scheduleStulist, schedule.notice AS scheduleNotice FROM c JOIN schedule IN c.schedule WHERE schedule.teacherId = '{id}'";
+                var query = $"SELECT DISTINCT c.id, c.name, c.scope, c.subject, c.period.id AS periodId, schedule.classId AS scheduleClassId, schedule.stulist AS scheduleStulist, schedule.notice AS scheduleNotice FROM c JOIN schedule IN c.schedule WHERE schedule.teacherId = '{id}'";
                 //var query = $"SELECT c.id, c.name, c.teacher, cc.course, c.scope FROM c JOIN cc IN c.courses JOIN cct IN cc.teachers WHERE cct.id = '{id}'";
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code}") }))
                 {

+ 13 - 0
TEAMModelOS/Controllers/XTest/FixDataController.cs

@@ -3505,6 +3505,19 @@ namespace TEAMModelOS.Controllers
             return Ok(new { state = 200, noFail });
         }
 
+        /// <summary>
+        /// 根據錯題庫(ErrorItems)生成各學校學生各科錯題數後記入Redis
+        /// </summary>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("set-erroritems-count")]
+        public async Task<IActionResult> SetErrorItemsCount(JsonElement json)
+        {
+            var azureCosmosClient = _azureCosmos.GetCosmosClient();
+            string schoolCode = (!json.TryGetProperty("school_code", out JsonElement school_code)) ? school_code.GetString() : string.Empty;
+            await ErrorItemsService.cntStuErrorItemsAsync(_azureRedis, azureCosmosClient);
+        }
+
         public record TrainingId 
         {
             public string oldId { get; set; }