Jelajahi Sumber

批量提交和提交作业埋点。

CrazyIter_Bin 3 tahun lalu
induk
melakukan
8cbeedcc69

+ 30 - 3
TEAMModelOS.SDK/Models/Service/StatisticsService.cs

@@ -141,7 +141,21 @@ namespace TEAMModelOS.SDK
             {
                 teachers.Add(StatisticsTeacher(train, setting, area, client,studies));  //yield return await  StatisticsTeacher(  train,   setting,   area,   client);
             }
-            await Task.WhenAll(teachers);
+            int pagesize = 50;
+            if (teachers.Count <= pagesize)
+            {
+                await Task.WhenAll(teachers);
+            }
+            else
+            {
+                int pages = (teachers.Count + pagesize) / pagesize; //256是批量操作最大值,pages = (total + max -1) / max;
+                for (int i = 0; i < pages; i++)
+                {
+                    var lists = teachers.Skip((i) * pagesize).Take(pagesize).ToList();
+                    await Task.WhenAll(lists);
+                }
+            }
+           
             return trains;
         }
         public static async Task<TeacherTrain> StatisticsTeacher(TeacherTrain train,  AreaSetting setting, Area area, CosmosClient client,List<Study> studies) {
@@ -153,7 +167,20 @@ namespace TEAMModelOS.SDK
                 foreach (string property in train.updateProperty) {
                     teachers.Add(DoProperty(train.updateProperty, property, setting, area, client, train,studies));
                 }
-                await   Task.WhenAll(teachers);
+                int pagesize = 50;
+                if (teachers.Count <= pagesize)
+                {
+                    await Task.WhenAll(teachers);
+                }
+                else
+                {
+                    int pages = (teachers.Count + pagesize) / pagesize; //256是批量操作最大值,pages = (total + max -1) / max;
+                    for (int i = 0; i < pages; i++)
+                    {
+                        var lists = teachers.Skip((i) * pagesize).Take(pagesize).ToList();
+                        await Task.WhenAll(lists);
+                    }
+                }
             }
             //每次都统计活动相关的数据。
             train= await DoActivity(train, setting, area, client, _school, _tmdid);
@@ -488,7 +515,7 @@ namespace TEAMModelOS.SDK
            
             }
             await foreach (var item in client.GetContainer("TEAMModelOS", "Normal")
-                .GetItemQueryIterator<Ability>(queryText: $"select value(c) from c {insql} ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Ability-{area.standard}") }))
+                .GetItemQueryIterator<Ability>(queryText: $"select c.id,c.name,c.currency,c.no,c.dimension,c.hour,c.stds from c {insql} ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Ability-{area.standard}") }))
             {
                 abilities.Add(item);
 

+ 5 - 0
TEAMModelOS/Controllers/Common/HomeworkController.cs

@@ -432,6 +432,7 @@ namespace TEAMModelOS.Controllers.Learn
         [AuthToken(Roles = "teacher,student,admin")]
         public async Task<IActionResult> Interact(JsonElement request)
         {
+            if (!HttpContext.Items.TryGetValue("Standard", out object standard)) return BadRequest();
             if (!HttpContext.Items.TryGetValue("Scope", out object _scope)) return BadRequest();
             var client = _azureCosmos.GetCosmosClient();
             var (userid, name, _, school) = HttpContext.GetAuthTokenInfo();
@@ -642,6 +643,10 @@ namespace TEAMModelOS.Controllers.Learn
                                     taskStatus = 1;
                                     msgid = 1;
                                 }
+                                if (content.Exists(x => x.prime == true)) {
+                                    await StatisticsService.SendServiceBus($"{standard}", $"{userid}", $"{school}", StatisticsService.TeacherClass, 1, _configuration, _serviceBus);
+                                }
+                                    
                             }
                             //TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO 写入方便教师查看的作答记录
                             try

+ 51 - 14
TEAMModelOS/Controllers/Research/AbilityStatisticsController.cs

@@ -67,8 +67,21 @@ namespace TEAMModelOS.Controllers
                 trains.ForEach(x => {
                     x.finalScore = finalScore;
                     teacherTrains.Add(client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(x, x.id, new PartitionKey(x.code)));
-                });
-                await  Task.WhenAll(teacherTrains);
+                }); 
+                int pagesize = 50;
+                if (teacherTrains.Count <= pagesize)
+                {
+                    await Task.WhenAll(teacherTrains);
+                }
+                else
+                {
+                    int pages = (teacherTrains.Count + pagesize) / pagesize; //256是批量操作最大值,pages = (total + max -1) / max;
+                    for (int i = 0; i < pages; i++)
+                    {
+                        var listssb = teacherTrains.Skip((i) * pagesize).Take(pagesize).ToList();
+                        await Task.WhenAll(listssb);
+                    }
+                }
                 return Ok(new { status=200});
             }
             else {
@@ -187,24 +200,48 @@ namespace TEAMModelOS.Controllers
                     //增加评审人员总人数,学习总人数。
                     trains.Add(StatisticsService.StatisticsSchool(school.id, setting, area, client, _dingDing, null));
                 }
-                (List<TeacherTrain> trains, List<RGroupList> yxtrain)[] tasks = await Task.WhenAll(trains);
-                tasks.ToList().ForEach(x => {
-                    teacherTrains.AddRange(x.trains);
-                    schoolInfos.ForEach(y => {
-                        var list = x.yxtrain.Find(z => z.school.Equals(y.schoolId));
-                        if (list != null) {
-                            y.trainCount = list.members.Count;
-                        }
+                int pagesize = 100;
+                if (trains.Count <= pagesize)
+                {
+                    (List<TeacherTrain> trains, List<RGroupList> yxtrain)[] tasks  =  await Task.WhenAll(trains);
+                    tasks.ToList().ForEach(x => {
+                        teacherTrains.AddRange(x.trains);
+                        schoolInfos.ForEach(y => {
+                            var list = x.yxtrain.Find(z => z.school.Equals(y.schoolId));
+                            if (list != null)
+                            {
+                                y.trainCount = list.members.Count;
+                            }
+                        });
                     });
-                });
+                }
+                else
+                {
+                    int pages = (trains.Count + pagesize) / pagesize; //256是批量操作最大值,pages = (total + max -1) / max;
+                    for (int i = 0; i < pages; i++)
+                    {
+                        var listssb = trains.Skip((i) * pagesize).Take(pagesize).ToList();
+                        (List<TeacherTrain> trains, List<RGroupList> yxtrain)[] tasks =  await Task.WhenAll(listssb);
+                        tasks.ToList().ForEach(x => {
+                            teacherTrains.AddRange(x.trains);
+                            schoolInfos.ForEach(y => {
+                                var list = x.yxtrain.Find(z => z.school.Equals(y.schoolId));
+                                if (list != null)
+                                {
+                                    y.trainCount = list.members.Count;
+                                }
+                            });
+                        });
+                    }
+                }
                 long   totalTime=teacherTrains.Select(x => x.totalTime).Sum();
                 int  hgcount  = teacherTrains.Where(x => x.finalScore==1||x.finalScore==2).Count();
                 var  teacherAilities = teacherTrains.SelectMany(x => x.currency.teacherAilities);
-
                 return Ok(new { teacherTrains, setting, schools= schoolInfos , totalTime, hgcount, teacherAilities, teacherCount = countArea, appraiseCount = appraiseArea });
             }
             catch (Exception ex)
             {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},UpsertSubmitScore/UpsertSubmitScore()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest(new { ex.Message, ex.StackTrace });
 
             }
@@ -506,7 +543,7 @@ namespace TEAMModelOS.Controllers
             int voteAreaDoneCount = 0;
             int examAreaDoneCount = 0;
             int videoTime = 0;
-            List<string> abilityIds = new List<string>();
+            HashSet<string> abilityIds = new HashSet<string>();
             await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher")
                .GetItemQueryIterator<AbilitySub>(queryText: $"select value(c) from c  ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"AbilitySub-{_school}-{_tmdid}") }))
             {
@@ -535,7 +572,7 @@ namespace TEAMModelOS.Controllers
                 }
                 abilityIds.Add(item.id);
             }
-            if (abilityIds.IsNotEmpty())
+            if (abilityIds.Count>0)
             {
                 string queryText = $"SELECT c.stds FROM c WHERE c.id IN ({string.Join(",", abilityIds.Select(o => $"'{o}'"))})";
                 await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal")

+ 154 - 0
TEAMModelOS/Controllers/Research/AbilitySubController.cs

@@ -272,6 +272,160 @@ namespace TEAMModelOS.Controllers
                 return Ok(new { error = 400 });
             }
         }
+        private async IAsyncEnumerable<List<AbilitySub>> GetSubsAsyn(List<string> tmdids, string _school, HashSet<string> ids)
+        {
+
+            foreach (var tmdid in tmdids)
+            {
+                List<AbilitySub> abilitySubs = new List<AbilitySub>();
+                await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher")
+                         .GetItemQueryIterator<AbilitySub>(queryText: $"select value(c) from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"AbilitySub-{_school}-{tmdid}") }))
+                {
+                    ids.Add(item.id);
+                    abilitySubs.Add(item);
+                }
+                yield return abilitySubs;
+            }
+        }
+        /// <summary>
+        /// 批量更新认证材料分数。
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("score-teacher-submit")]
+        [AuthToken(Roles = "admin,teacher", Permissions = "train-appraise")]
+        public async Task<IActionResult> UpsertSubmitScore(JsonElement request)
+        {
+            try
+            {
+                if (!HttpContext.Items.TryGetValue("Standard", out object standard)) return BadRequest();
+                if (!request.TryGetProperty("score", out JsonElement _score)) return BadRequest();
+                if (!request.TryGetProperty("tmdids", out JsonElement _tmdids)) return BadRequest();
+                if (!request.TryGetProperty("roleType", out JsonElement _roleType)) return BadRequest();
+                var (userid, name, picture, school) = HttpContext.GetAuthTokenInfo();
+                int score = -999;
+                var client = _azureCosmos.GetCosmosClient();
+                int.TryParse($"{_score}", out score);
+                List<string> tmdids = _tmdids.ToObject<List<string>>();
+                List<AbilitySub> abilitySubs = new List<AbilitySub>();
+                HashSet<AbilitySub> subs = new HashSet<AbilitySub>();
+                HashSet<string> ids = new HashSet<string>();
+                // List<string> abilities = new List<string>();
+                await foreach (var item in GetSubsAsyn(tmdids, school, ids))
+                {
+
+                    abilitySubs.AddRange(item);
+                }
+                var su = abilitySubs.FindAll(x => x.from == 1);
+                if (su.IsNotEmpty())
+                {
+                    subs = new HashSet<AbilitySub>(su);
+                }
+                if (ids.Count > 0)
+                {
+                    string queryText = $"SELECT  value(c.id) FROM c WHERE c.currency=1 and  c.id IN ({string.Join(",", ids.Select(o => $"'{o}'"))})";
+                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal")
+                    .GetItemQueryIterator<string>(queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Ability-{standard}") }))
+                    {
+                        var sb = abilitySubs.Find(x => x.id.Equals(item));
+                        if (sb != null)
+                        {
+                            subs.Add(sb);
+                        }
+                        //abilities.Add(item);
+                    }
+                }
+                if (subs.Count > 0 && score >= -1 && score <= 1)
+                {
+                    long nowTime = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+                    List<Task<ItemResponse<AbilitySub>>> abilitySubTasks = new List<Task<ItemResponse<AbilitySub>>>();
+                    subs.ToList().ForEach(sub => {
+                        OtherScore otherScore = null;
+                        if ($"{_roleType}".Equals("school") || $"{_roleType}".Equals("school") || $"{_roleType}".Equals("school"))
+                        {
+                            otherScore = sub.otherScore.Find(x => x.roleType.Equals($"{_roleType}"));
+                        }
+                        else
+                        {
+                            otherScore = sub.otherScore.Find(x => x.roleType.Equals($"{_roleType}") && x.tmdid.Equals(userid));
+                        }
+                        if (otherScore != null)
+                        {
+                            otherScore.score = score;
+                            otherScore.scoreUploads.ForEach(x => {
+                                x.score = score;
+                            });
+                        }
+                        else
+                        {
+                            if (sub.uploads != null)
+                            {
+                                List<ScoreUpload> scoreUploads = new List<ScoreUpload>();
+                                sub.uploads.ForEach(x => {
+                                    scoreUploads.Add(new ScoreUpload
+                                    {
+                                        score = score,
+                                        stdid = x.stdid,
+                                        taskid = x.taskid,
+                                        titleIds = x.titleIds,
+                                    });
+                                });
+                                otherScore = new OtherScore
+                                {
+                                    roleType = $"{_roleType}",
+                                    tmdid = userid,
+                                    tmdname = name,
+                                    score = score,
+                                    time = nowTime,
+                                    scoreUploads = scoreUploads
+                                };
+                            }
+
+                        }
+
+                        abilitySubTasks.Add(client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(sub, sub.id, new PartitionKey(sub.code)));
+                    });
+                    List<Task> tasks = new List<Task>();
+                    tmdids.ForEach(x => {
+                        tasks.Add(StatisticsService.SendServiceBus($"{standard}", $"{x}", $"{school}", StatisticsService.TeacherAility, 1, _configuration, _serviceBus));
+                    });
+                    int pagesize = 50;
+                    if (abilitySubTasks.Count <= pagesize)
+                    {
+                        await Task.WhenAll(abilitySubTasks);
+                    }
+                    else
+                    {
+                        int pages = (abilitySubTasks.Count + pagesize) / pagesize; //256是批量操作最大值,pages = (total + max -1) / max;
+                        for (int i = 0; i < pages; i++)
+                        {
+                            var lists = abilitySubTasks.Skip((i) * pagesize).Take(pagesize).ToList();
+                            await Task.WhenAll(lists);
+                        }
+                    }
+                    if (tasks.Count <= pagesize)
+                    {
+                        await Task.WhenAll(tasks);
+                    }
+                    else
+                    {
+                        int pages = (tasks.Count + pagesize) / pagesize; //256是批量操作最大值,pages = (total + max -1) / max;
+                        for (int i = 0; i < pages; i++)
+                        {
+                            var listssb = tasks.Skip((i) * pagesize).Take(pagesize).ToList();
+                            await Task.WhenAll(listssb);
+                        }
+                    }
+                    return Ok(new { status = 200 });
+                }
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},UpsertSubmitScore/UpsertSubmitScore()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
+            }
+            return Ok(new { error = 0, msg = "参数异常" });
+        }
         /// <summary>
         /// 对某个订阅的能力点进行操作
         /// </summary>

+ 21 - 4
TEAMModelOS/Controllers/Research/ClassVideoController.cs

@@ -190,15 +190,17 @@ namespace TEAMModelOS.Controllers.Research
             return Ok();
         }
 
+       
+       
         /// <summary>
-        /// 更新教师最终学习分数。
+        /// 批量更新课堂实录分数。
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [HttpPost("score-teacher-classvideo")]
         [AuthToken(Roles = "admin,teacher", Permissions = "train-appraise")]
-        public async Task<IActionResult> UpsertFinalScore(JsonElement request)
+        public async Task<IActionResult> UpsertClassvideo(JsonElement request)
         {
             if (!HttpContext.Items.TryGetValue("Standard", out object standard)) return BadRequest();
             var (userid, name, picture, school) = HttpContext.GetAuthTokenInfo();
@@ -224,8 +226,23 @@ namespace TEAMModelOS.Controllers.Research
                     teacherTrains.Add(client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(x, x.id, new PartitionKey(x.code)));
                     tasks.Add(StatisticsService.SendServiceBus($"{standard}", $"{x.id}", $"{school}", StatisticsService.TeacherClass, 1, _configuration, _serviceBus));
                 });
-                await Task.WhenAll(teacherTrains);
-                await Task.WhenAll(tasks);
+                int pagesize = 50;
+                if (teacherTrains.Count <= pagesize)
+                {
+                    await Task.WhenAll(tasks);
+                    await Task.WhenAll(teacherTrains);
+                }
+                else
+                {
+                    int pages = (teacherTrains.Count + pagesize) / pagesize; //256是批量操作最大值,pages = (total + max -1) / max;
+                    for (int i = 0; i < pages; i++)
+                    {
+                        var lists = teacherTrains.Skip((i) * pagesize).Take(pagesize).ToList();
+                        var listssb = tasks.Skip((i) * pagesize).Take(pagesize).ToList();
+                        await Task.WhenAll(lists);
+                        await Task.WhenAll(listssb);
+                    }
+                }
                 return Ok(new { status = 200 });
             }
             else