Просмотр исходного кода

update 。区级页面优化。

CrazyIter_Bin 3 лет назад
Родитель
Сommit
fb560f42a2

+ 101 - 14
TEAMModelOS.SDK/Models/Service/StatisticsService.cs

@@ -158,28 +158,115 @@ namespace TEAMModelOS.SDK
                 school = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
             }
         }
-        public static async Task<List<(List<TeacherTrain> trains, List<RGroupList> yxtrain)>> StatisticsArea(CoreAPIHttpService _coreAPIHttpService, AreaSetting setting, Area area, CosmosClient client, DingDing _dingDing, HashSet<string> updates)
+        //public static async Task<List<(List<TeacherTrain> trains, List<RGroupList> yxtrain)>> StatisticsArea(CoreAPIHttpService _coreAPIHttpService, AreaSetting setting, Area area, CosmosClient client, DingDing _dingDing, HashSet<string> updates)
+        //{
+        //    List<(List<TeacherTrain> trains, List<RGroupList> yxtrain)> teacherTrains = new List<(List<TeacherTrain> trains, List<RGroupList> yxtrain)>();
+        //    List<School> schools = new List<School>();
+        //    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School")
+        //    .GetItemQueryIterator<School>(queryText: $"select value(c) from c where c.areaId='{area.id}'  ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
+        //    {
+        //        schools.Add(item);
+        //    }
+        //    await foreach ((List<TeacherTrain> trains, List<RGroupList> yxtrain) tarain in GetStatisticsSchool(_coreAPIHttpService, schools, setting, area, client, _dingDing, updates))
+        //    {
+        //        teacherTrains.Add(tarain);
+        //    }
+        //    return teacherTrains;
+        //}
+        //private static async IAsyncEnumerable<(List<TeacherTrain> trains, List<RGroupList> yxtrain)> GetStatisticsSchool(CoreAPIHttpService _coreAPIHttpService,List<School> schools, AreaSetting setting, Area area, CosmosClient client, DingDing _dingDing, HashSet<string> updates)
+        //{
+        //    foreach (var school in schools)
+        //    {
+        //        yield return await StatisticsSchool(  _coreAPIHttpService,school.id, setting, area, client, _dingDing, updates);
+        //    }
+        //}
+
+        public static async Task<(List<TeacherTrain> trains, List<RGroupList> yxtrain)> StatisticsSchoolQuik(CoreAPIHttpService _coreAPIHttpService, string school, AreaSetting setting, Area area, CosmosClient client, DingDing _dingDing, HashSet<string> updates)
         {
-            List<(List<TeacherTrain> trains, List<RGroupList> yxtrain)> teacherTrains = new List<(List<TeacherTrain> trains, List<RGroupList> yxtrain)>();
-            List<School> schools = new List<School>();
-            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School")
-            .GetItemQueryIterator<School>(queryText: $"select value(c) from c where c.areaId='{area.id}'  ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
+            _coreAPIHttpService.check = false;
+
+            List<RGroupList> yxtrain = await GroupListService.GetGroupListMemberByType(_coreAPIHttpService, client, "yxtrain", new List<string> { "school" }, $"{school}", _dingDing);
+            List<TeacherTrain> trains = new List<TeacherTrain>();
+            var members = yxtrain.SelectMany(x => x.members).ToList();
+            if (members.Count <= 0)
             {
-                schools.Add(item);
+                return (trains, yxtrain);
             }
-            await foreach ((List<TeacherTrain> trains, List<RGroupList> yxtrain) tarain in GetStatisticsSchool(_coreAPIHttpService, schools, setting, area, client, _dingDing, updates))
+
+            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher")
+             .GetItemQueryIterator<TeacherTrain>(queryText: $"select value(c) from c  ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"TeacherTrain-{school}") }))
             {
-                teacherTrains.Add(tarain);
+
+                trains.Add(item);
             }
-            return teacherTrains;
-        }
-        private static async IAsyncEnumerable<(List<TeacherTrain> trains, List<RGroupList> yxtrain)> GetStatisticsSchool(CoreAPIHttpService _coreAPIHttpService,List<School> schools, AreaSetting setting, Area area, CosmosClient client, DingDing _dingDing, HashSet<string> updates)
-        {
-            foreach (var school in schools)
+            if (updates != null)
+            {
+                foreach (var up in updates)
+                {
+                    trains.ForEach(x => x.update.Add(up));
+                }
+            }
+            var update = trains.FindAll(x => x.update.Count() > 0);
+            var noupdate = trains.FindAll(x => x.update.Count() <= 0);
+
+            var unStatistics = members.Select(x => x.id).Except(trains.Select(x => x.id));
+            List<TeacherTrain> teacherTrains = new List<TeacherTrain>();
+            List<TeacherTrain> returnTrains = new List<TeacherTrain>();
+            if (update.IsNotEmpty())
             {
-                yield return await StatisticsSchool(  _coreAPIHttpService,school.id, setting, area, client, _dingDing, updates);
+                teacherTrains.AddRange(update);
             }
+            if (unStatistics != null)
+            {
+                foreach (string x in unStatistics)
+                {
+                    var member = members.Find(y => y.id.Equals(x));
+                    teacherTrains.Add(new TeacherTrain
+                    {
+                        pk = "TeacherTrain",
+                        id = x,
+                        code = $"TeacherTrain-{school}",
+                        tmdid = x,
+                        nickname = member.nickname,
+                        name = member.name,
+                        picture = member.picture,
+                        school = school,
+                        update = new HashSet<string> { TeacherAbility, TeacherClass, OfflineRecord }
+                    });
+                }
+            }
+            List<Study> studies = new List<Study>();
+            await foreach (var item in client.GetContainer("TEAMModelOS", "Common")
+               .GetItemQueryIterator<Study>(queryText: $"select value(c) from c    where c.owner<>'area'  ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Study-{school}") }))
+            {
+                studies.Add(item);
+            }
+            returnTrains = await GetStatisticsTeacher(teacherTrains, setting, area, client, studies);
+            //await foreach (var tarain in GetStatisticsTeacher(teacherTrains, setting, area, client))
+            //{
+            //    returnTrains.Add(tarain);
+            //}
+            if (noupdate.IsNotEmpty())
+            {
+                returnTrains.AddRange(noupdate);
+            }
+            //移除不在研修名单的人员
+            returnTrains.RemoveAll(x => !members.Select(y => y.id).Contains(x.id));
+            returnTrains.ForEach(x => {
+                var mbm = members.Find(y => y.id.Equals(x.id));
+                if (mbm != null)
+                {
+                    x.groupName = mbm?.groupName;
+                    x.name = !string.IsNullOrWhiteSpace(x.name) ? x.name : mbm?.name;
+                    x.nickname = mbm?.nickname;
+                    x.picture = mbm?.picture;
+
+                }
+            });
+
+            return (returnTrains, yxtrain);
         }
+
         public static async Task<(List<TeacherTrain> trains, List<RGroupList> yxtrain)> StatisticsSchool(CoreAPIHttpService _coreAPIHttpService,string school, AreaSetting setting, Area area, CosmosClient client, DingDing _dingDing, HashSet<string> updates)
         {
             _coreAPIHttpService.check = false;

+ 160 - 0
TEAMModelOS/Controllers/Normal/AbilityStatisticsController.cs

@@ -309,7 +309,167 @@ namespace TEAMModelOS.Controllers
         }
 
 
+        /// <summary>
+        /// 区级数据统计
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("statistics-area-quick")]
+        [AuthToken(Roles = "teacher,admin,area")]
+        [Authorize(Roles = "IES")]
+        public async Task<IActionResult> StatisticsAreaQuick(JsonElement request) {
+            var (userid, _, _, _) = HttpContext.GetAuthTokenInfo();
+            request.TryGetProperty("standard", out JsonElement _standard);
+            string standard = $"{_standard}";
+            if (string.IsNullOrEmpty(standard))
+            {
+                return BadRequest();
+            }
+            var client = _azureCosmos.GetCosmosClient();
+            Area area = null;
+            string sql = $"select value(c) from c where c.standard='{standard}'";
+            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<Area>(queryText: sql,
+                  requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-Area") }))
+            {
+                area = item;
+            }
+            AreaSetting setting = null;
+            if (area != null)
+            {
+                try
+                {
+                    setting = await client.GetContainer(Constant.TEAMModelOS, "Normal").ReadItemAsync<AreaSetting>(area.id, new PartitionKey("AreaSetting"));
+                }
+                catch (CosmosException)
+                {
+                    setting = null;
+                }
+            }
+            if (setting == null)
+            {
+                setting = new AreaSetting
+                {
+                    allTime = 50,
+                    classTime = 5,
+                    submitTime = 15,
+                    onlineTime = 20,
+                    offlineTime = 10,
+                    lessonMinutes = 45,
+                };
+            }
+
+            try
+            {
+                List<TeacherTrain> teacherTrains = new List<TeacherTrain>();
+                List<School> schools = new List<School>();
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: $"select value(c) from c where c.areaId='{area.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
+                {
+
+                    schools.Add(item);
+                }
+                List<Task<(List<TeacherTrain> trains, List<RGroupList> yxtrain)>> trains = new List<Task<(List<TeacherTrain> trains, List<RGroupList> yxtrain)>>();
+                int countArea = 0;
+                int appraiseArea = 0;
+                List<SchoolInfos> schoolInfos = new List<SchoolInfos>();
+                foreach (var school in schools)
+                {
 
+                    schoolInfos.Add(new SchoolInfos { schoolId = school.id, schoolName = school.name, picture = school.picture });
+                    //增加评审人员总人数,学习总人数。
+                    trains.Add(StatisticsService.StatisticsSchoolQuik(_coreAPIHttpService, school.id, setting, area, client, _dingDing, null));
+                }
+                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();
+                setting.accessConfig = null;
+                List<dynamic> dynamics = new List<dynamic>();
+                teacherTrains.ForEach(x => {
+                    x.schoolName = schools.Find(s => s.id.Equals(x.school))?.name;
+                    x.currency.videoTime = (int)x.currency.videoTime;
+                    x.currency.teacherAilities.ForEach(y => {
+                        y.videoTime = (int)y.videoTime;
+                        y.onlineTime = (int)y.onlineTime;
+                        y.debateOrther = y.debateOrther > 0 ? y.debateOrther : 0;
+                    });
+                    dynamic dynamic = new
+                    {
+                        x.schoolName,
+                        x.classTime,
+                        x.finalScore,
+                        x.name,
+                        x.offlineTime,
+                        x.onlineTime,
+                        x.school,
+                        x.id,
+                        x.totalTime,
+                        currency = new
+                        {
+                            x.currency.submitTime,
+                            x.currency.exerciseAbility,
+                            x.currency.learnAbility,
+                            x.currency.uploadDone,
+                            x.currency.uploadTotal,
+                            x.currency.videoTime,
+                            teacherAilities = x.currency.teacherAilities.Select(t => new {
+                                t.onlineTime,
+                                t.videoTime,
+                                t.no,
+                                t.name,
+                                t.dimension,
+                                t.zpscore,
+                                t.xzscore,
+                                t.hpscore
+                            }),
+                        },
+                        offlineCountNo = x.offlineRecords.Where(o => o.upload == 0).Count(),
+                        offlineCountOk = x.offlineRecords.Where(o => o.upload == 1).Count(),
+                        teacherClasseCount = x.teacherClasses.Count
+                    };
+                    dynamics.Add(dynamic);
+                });
+                return Ok(new { teacherTrains = dynamics, setting, schools = schoolInfos, totalTime, hgcount, teacherCount = countArea, appraiseCount = appraiseArea });
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},UpsertSubmitScore/UpsertSubmitScore()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
+                return BadRequest(new { ex.Message, ex.StackTrace });
+
+            }
+        }
 
         /// <summary>
         /// 区级数据统计