Browse Source

课程计数、评测初始化调整

zhouj1203@hotmail.com 3 years ago
parent
commit
8e1489fc13

+ 32 - 41
TEAMModelFunction/LessonHttpTrigger.cs

@@ -14,6 +14,7 @@ using Azure.Cosmos;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 using System.Collections.Generic;
+using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
 
 namespace TEAMModelFunction
 {
@@ -34,63 +35,53 @@ namespace TEAMModelFunction
             log.LogInformation("C# HTTP trigger function processed a request.");
             var client = _azureCosmos.GetCosmosClient();
             string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
-            
+
             var data = System.Text.Json.JsonSerializer.Deserialize<LessonRecord>(requestBody);
             int day = DateTimeOffset.FromUnixTimeMilliseconds(data.startTime).DayOfYear;
             int year = DateTimeOffset.FromUnixTimeMilliseconds(data.startTime).Year;
-            int years = DateTimeOffset.UtcNow.DayOfYear;
-            var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(year.ToString(), new PartitionKey($"ClassCount-"+data.school));
+            int days = DateTimeHelper.getDays(year);
+            //int years = DateTimeOffset.UtcNow.DayOfYear;
+            string tbname = string.Empty;
+            string code = string.Empty;
+            if (data.scope.Equals("school"))
+            {
+                code = $"LessonCount-{data.school}";
+                tbname = "School";
+            }
+            else
+            {
+                code = $"LessonCount";
+                tbname = "Teacher";
+            }
+            var response = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemStreamAsync(data.id.ToString(), new PartitionKey(code));
             if (response.Status == 200)
             {
                 using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                ClassCount count = json.ToObject<ClassCount>();
-                int n = 0;
-                if (count.classRecord.Count > 0)
+                LessonCount count = json.ToObject<LessonCount>();
+                if (count.courseIds.Count > 0)
                 {
-                    var keys = count.classRecord;
-                    foreach (var pairs in keys)
+                    if (!count.courseIds.Contains(data.courseId))
                     {
-                        foreach (KeyValuePair<string, List<string>> keyValue in pairs)
-                        {
-                            if (data.id.Equals(keyValue.Key))
-                            {
-                                if (!keyValue.Value.Contains(data.courseId))
-                                {
-                                    keyValue.Value.Add(data.courseId);
-                                    count.beginCount[n][day] += 1;
-                                }
-                            }
-                            else {
-                                Dictionary<string, List<string>> keyValuePairs = new Dictionary<string, List<string>>
-                                {
-                                    { data.id, new List<string>() { data.courseId } }
-                                };
-                                count.classRecord.Add(keyValuePairs);
-                                count.beginCount[n][day] += 1;
-                            }
-                        }
-                        n++;
+                        count.courseIds.Add(data.courseId);
+                        count.beginCount[day] += 1;
                     }
                 }
-                await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(count, count.id, new PartitionKey($"{count.code}"));
+                await client.GetContainer("TEAMModelOS", tbname).ReplaceItemAsync(count, count.id, new PartitionKey(code));
             }
             else
             {
-                ClassCount count = new ClassCount
+                LessonCount count = new LessonCount
                 {
-                    id = year.ToString(),
-                    code = "ClassCount-" + data.school
+                    id = data.tmdid,
+                    code = "LessonCount-" + data.school,
+                    year = year
                 };
-                double[] days = new double[years];
-                List<double> list = new List<double>(days);
+                double[] da = new double[days];
+                List<double> list = new List<double>(da);
                 list[day] += 1;
-                count.beginCount.Add(list);
-                Dictionary<string, List<string>> keyValuePairs = new Dictionary<string, List<string>>
-                                {
-                                    { data.id, new List<string>() { data.courseId } }
-                                };
-                count.classRecord.Add(keyValuePairs);
-                await client.GetContainer("TEAMModelOS", "School").CreateItemAsync(count, new PartitionKey($"{count.code}"));
+                count.beginCount.AddRange(list);
+                count.courseIds.Add(data.courseId);
+                await client.GetContainer("TEAMModelOS", "tbname").CreateItemAsync(count, new PartitionKey(code));
             }
             return new OkObjectResult(data);
         }

+ 4 - 2
TEAMModelFunction/MonitorServicesBus.cs

@@ -787,6 +787,7 @@ namespace TEAMModelFunction
             if (!data.TryGetProperty("scope", out JsonElement _scope)) return ;
             if (!data.TryGetProperty("grant_types", out JsonElement _grant_types)) return ;
             data.TryGetProperty("school", out JsonElement _school);
+            var client = _azureCosmos.GetCosmosClient();
             string tbname = null;
             string code = null;
             string blobname = null;
@@ -809,7 +810,7 @@ namespace TEAMModelFunction
             List<LessonUpdate> msgs = new List<LessonUpdate>();
             try
             {
-                LessonRecord lessonRecord = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<LessonRecord>($"{_lessonId}", new PartitionKey(code));
+                LessonRecord lessonRecord = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<LessonRecord>($"{_lessonId}", new PartitionKey(code));
                 if (_grant_types.ValueKind.Equals(JsonValueKind.Array))
                 {
                     List<LessonUpdate> updates = _grant_types.ToObject<List<LessonUpdate>>();
@@ -863,7 +864,8 @@ namespace TEAMModelFunction
                                 break;
                         }
                     }
-                  await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<LessonRecord>(lessonRecord,$"{_lessonId}", new PartitionKey(code));
+                    await LessonService.FixLessonCount(client, _dingDing, lessonRecord);
+                    await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<LessonRecord>(lessonRecord,$"{_lessonId}", new PartitionKey(code));
                 }
             }
             catch (Exception ex)

+ 8 - 7
TEAMModelFunction/TriggerExam.cs

@@ -102,7 +102,7 @@ namespace TEAMModelFunction
                             try
                             {
                                 //处理活动中间件
-                                List<string> classes = await Activity(info, client, _dingDing, sub);
+                                (List<string> classes, List<RMember> members) = await Activity(info, client, _dingDing, sub);
                                 //向学生或醍摩豆账号发起通知
                                 #region
                                 //Notice notice = new Notice()
@@ -202,7 +202,7 @@ namespace TEAMModelFunction
                                                 result.info.name = classroom.name;
                                                 //result.gradeId = classroom.year.ToString();
                                                 //处理班级人数
-                                                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.classId = '{classroom.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Base-{info.school}") }))
+                                               /* await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.classId = '{classroom.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Base-{info.school}") }))
                                                 {
                                                     using var json_stu = await JsonDocument.ParseAsync(item.ContentStream);
                                                     if (json_stu.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -214,9 +214,9 @@ namespace TEAMModelFunction
                                                             ids.Add(account.GetProperty("id").GetString());
                                                         }
                                                     }
-                                                }
+                                                }*/
                                             }
-                                            if (info.scope.Equals("private", StringComparison.OrdinalIgnoreCase))
+                                            /*if (info.scope.Equals("private", StringComparison.OrdinalIgnoreCase))
                                             {
                                                 var stuResponse = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemStreamAsync(cla, new Azure.Cosmos.PartitionKey($"GroupList"));
                                                 if (stuResponse.Status == 200)
@@ -255,7 +255,8 @@ namespace TEAMModelFunction
                                                         }
                                                     }
                                                 }
-                                            }
+                                            }*/
+                                            ids = members.Select(m => m.id).ToList();
                                             foreach (string stu in ids)
                                             {
                                                 result.mark.Add(marks);
@@ -529,7 +530,7 @@ namespace TEAMModelFunction
                 await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-{info.id}-评测作答记录结算异常{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
             }
         }
-        public static async Task<List<string>> Activity(ExamInfo info, CosmosClient client, DingDing _dingDing, List<string> sub) {
+        public static async Task<(List<string> classes,List<RMember> members)> Activity(ExamInfo info, CosmosClient client, DingDing _dingDing, List<string> sub) {
             List<(string pId, List<string> gid)> ps = new List<(string pId, List<string> gid)>();
             if (info.groupLists.Count > 0)
             {
@@ -604,7 +605,7 @@ namespace TEAMModelFunction
                 });
             }
             await ActivityService.SaveStuActivity(client, _dingDing, stuActivities, tmdActivities, null);
-            return classes;
+            return (classes, tchList);
         }
 
         public static async Task knowledgeCount(ExamInfo info, ExamSubject subject, DingDing _dingDing, int no, List<ExamClassResult> classResults,

+ 38 - 0
TEAMModelOS.SDK/Helper/Common/DateTimeHelper/DateTimeHelper.cs

@@ -119,6 +119,44 @@ namespace TEAMModelOS.SDK.Helper.Common.DateTimeHelper
             DateTime easternTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, easternZone);
             return easternTime;
         }
+        public static  int getDays(int year) { 
+            int day = 0;
+            for (int i = 0;i<=12;i++) {
+                int days = 0;
+                if (i != 2)
+                {
+                    switch (i)
+                    {
+                        case 1:
+                        case 3:
+                        case 5:
+                        case 7:
+                        case 8:
+                        case 10:
+                        case 12:
+                            days = 31;
+                            break;
+                        case 4:
+                        case 6:
+                        case 9:
+                        case 11:
+                            days = 30;
+                            break;
+                    }
+                }
+                else {
+                    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
+                    {
+                        days = 29;
+                    }
+                    else { 
+                        days = 28;
+                    }
+                }
+                day += days; 
+            }
+            return day;
+        }
 
     }
 }

+ 15 - 14
TEAMModelOS.SDK/Models/Cosmos/Common/ClassCount.cs

@@ -4,21 +4,22 @@ using System.Text;
 
 namespace TEAMModelOS.SDK.Models.Cosmos.Common
 {
-    public class ClassCount : CosmosEntity
+    public class LessonCount : CosmosEntity
     {
-        public ClassCount() {
-            pk = "ClassCount";
+        public LessonCount() {
+            pk = "LessonCount";
         }
-        //开课矩阵
-        public List<List<double>> beginCount { get; set; } = new List<List<double>>();
-        //分组矩阵
-        public List<List<double>> groupCount { get; set; } = new List<List<double>>();
-        //课列类型矩阵
-        public List<List<double>> typeCount { get; set; } = new List<List<double>>();
-        //年级矩阵
-        public List<List<double>> gradeCount { get; set; } = new List<List<double>>();
-        //科目矩阵
-        public List<List<double>> subjectCount { get; set; } = new List<List<double>>();
-        public List<Dictionary<string, List<string>>> classRecord { get; set; } = new List<Dictionary<string, List<string>>>();
+        public int year { get; set; }
+        //学校编码
+/*        public string school { get; set; }
+        //区分是学校还是个人 学校school,个人private
+        public string type { get; set; }*/
+        public List<double> beginCount { get; set; } = new List<double>();
+        //P矩阵
+        public List<double> pCount { get; set; } = new List<double>();
+        //T矩阵
+        public List<double> tCount { get; set; } = new List<double>();
+        public List<double> ptCount { get; set; } = new List<double>();
+        public List<string> courseIds { get; set; } = new List<string>();
     }
 }

+ 73 - 0
TEAMModelOS.SDK/Models/Service/LessonService.cs

@@ -0,0 +1,73 @@
+using Azure.Cosmos;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.Json;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
+using TEAMModelOS.SDK.Models.Cosmos.Common;
+
+namespace TEAMModelOS.SDK.Models.Service
+{
+    public class LessonService
+    {
+        public static async Task FixLessonCount(CosmosClient client, DingDing _dingDing, LessonRecord data)
+        {
+            try
+            {
+                int day = DateTimeOffset.FromUnixTimeMilliseconds(data.startTime).DayOfYear;
+                int year = DateTimeOffset.FromUnixTimeMilliseconds(data.startTime).Year;
+                int days = DateTimeHelper.getDays(year);
+                //int years = DateTimeOffset.UtcNow.DayOfYear;
+                string tbname = string.Empty;
+                string code = string.Empty;
+                if (data.scope.Equals("school"))
+                {
+                    code = $"LessonCount-{data.school}";
+                    tbname = "School";
+                }
+                else
+                {
+                    code = $"LessonCount";
+                    tbname = "Teacher";
+                }
+                var response = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemStreamAsync(data.id.ToString(), new PartitionKey(code));
+                if (response.Status == 200)
+                {
+                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                    LessonCount count = json.ToObject<LessonCount>();
+                    if (count.courseIds.Count > 0)
+                    {
+                        if (!count.courseIds.Contains(data.courseId))
+                        {
+                            count.courseIds.Add(data.courseId);
+                            count.beginCount[day] += 1;
+                        }
+                    }
+                    await client.GetContainer("TEAMModelOS", tbname).ReplaceItemAsync(count, count.id, new PartitionKey(code));
+                }
+                else
+                {
+                    LessonCount count = new LessonCount
+                    {
+                        id = data.tmdid,
+                        code = code,
+                        year = year
+                    };
+                    double[] da = new double[days];
+                    List<double> list = new List<double>(da);
+                    list[day] += 1;
+                    count.beginCount.AddRange(list);
+                    count.courseIds.Add(data.courseId);
+                    await client.GetContainer("TEAMModelOS", "tbname").CreateItemAsync(count, new PartitionKey(code));
+                }
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-LessonCount-FixLessonCount\n{ex.Message}{ex.StackTrace}{data.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
+            }
+        }
+    }
+}

+ 263 - 15
TEAMModelOS/Controllers/Analysis/ClassAnalysisController.cs

@@ -12,6 +12,7 @@ using System.Threading.Tasks;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
 
@@ -50,8 +51,8 @@ namespace TEAMModelOS.Controllers.Analysis
             {
                 //区级Id
                 if (!requert.TryGetProperty("time", out JsonElement time)) return BadRequest();
-                if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
-                //获取当前学期所有的课程记录
+                //if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
+                /*//获取当前学期所有的课程记录
                 List<LessonRecord> records = new List<LessonRecord>();
                 var client = _azureCosmos.GetCosmosClient();
                 var queryClass = $"select value(c) from c ";
@@ -63,12 +64,13 @@ namespace TEAMModelOS.Controllers.Analysis
                 List<(string name, int count)> groups = await getGroupCount(records);
                 List<(string name, int count)> grades = await getGradeCount(records);
                 List<(string name, int count)> types = await getTypeCount(records);
-                var subs = records.GroupBy(x => x.subjectId).Select(y => new { key = y.Key, count = y.ToList().Count }).ToList();
+                var subs = records.GroupBy(x => x.subjectId).Select(y => new { key = y.Key, count = y.ToList().Count }).ToList();*/
 
 
                 // List<string> baseIds = await getId(client, id.GetString());
                 List<object> studies = new();
                 int days = DateTimeOffset.MaxValue.DayOfYear;
+                int sday = (int)DateTimeOffset.UtcNow.DayOfWeek;
                 var tts = DateTimeOffset.FromUnixTimeMilliseconds(time.GetInt64()).DayOfYear;
                 //double[,] bCount = new double[4,5];
                 List<List<double>> bc = new List<List<double>>();
@@ -82,8 +84,10 @@ namespace TEAMModelOS.Controllers.Analysis
                 List<double> list6 = new(tc2);
                 list[2] = 12;
                 list[1] = 3;
+                list[3] = 4;
                 list2[2] = 7;
                 list2[1] = 8;
+                list2[3] = 6;
                 bc.Add(list);
                 bc.Add(list2);
                 bc.Add(list3);
@@ -96,14 +100,22 @@ namespace TEAMModelOS.Controllers.Analysis
                 var cc = matrix5.ColumnSums().Sum();
                 var dd = matrix5.RowSums();
                 double[] ff = matrix5.Values;
+                var total = matrix5.Values.Sum();
+                var tday = DateTimeOffset.UtcNow.DayOfYear;
+                int ds = DateTimeHelper.getDays(2020);
+                var dds = DateTimeOffset.FromUnixTimeMilliseconds(1639990956000).DayOfYear;
+                int ssday = (int)DateTimeOffset.UtcNow.DayOfWeek;
+                var d = (int)DateTimeOffset.FromUnixTimeMilliseconds(1639990956000).DayOfWeek;
+                var asd = tday - d;
                 var kk = matrix5.ColumnAbsoluteSums();
-                var submatrix = matrix5.SubMatrix(2, matrix5.RowCount - 2, 0, matrix5.ColumnCount).ColumnSums().Sum();
+                var row = matrix5.Row(1, 2, 2);
+                var submatrix = matrix5.SubMatrix(1, 2, 0, matrix5.ColumnCount);
                 var hh = matrix5.EnumerateColumns();
                 var aa = matrix5.EnumerateRows();
-                ClassCount count = new ClassCount();
+                LessonCount count = new LessonCount();
                 count.id = Guid.NewGuid().ToString();
                 count.code = "hbcn";
-                count.beginCount = bc;
+                //count.beginCount = bc;
                 //await client.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(count, new PartitionKey($"{count.code}"));
                 //Console.WriteLine(bCount);
                 /* var query = $"select c.id,c.img,c.name,c.type,c.startTime,c.endTime,c.presenter,c.topic,c.address,c.owner,c.school from c ";
@@ -196,25 +208,261 @@ namespace TEAMModelOS.Controllers.Analysis
             }
             return tyCount;
         }
+        //课列趋势图
+        private async Task<List<(int week, List<double>)>> getTPCount(long stime, long etime, List<LessonCount> tcount, List<LessonCount> scount)
+        {
+            try
+            {
+                List<(int week, List<double>)> wks = new();
+                var syear = DateTimeOffset.FromUnixTimeMilliseconds(stime).Year;
+                var eyear = DateTimeOffset.FromUnixTimeMilliseconds(etime).Year;
+                var sday = DateTimeOffset.FromUnixTimeMilliseconds(stime).DayOfYear;
+                var eday = DateTimeOffset.FromUnixTimeMilliseconds(etime).DayOfYear;
+                //求开学年多少天
+                int tdays = DateTimeHelper.getDays(syear);
+                //如果跨年 求今年多少天
+                int pydays = DateTimeHelper.getDays(eyear);
+                List<List<double>> begin = new();
+                List<List<double>> t = new();
+                List<List<double>> p = new();
+                List<List<double>> pt = new();
+                foreach (LessonCount lesson in tcount)
+                {
+                    begin.Add(lesson.beginCount);
+                    t.Add(lesson.tCount);
+                    p.Add(lesson.pCount);
+                    pt.Add(lesson.ptCount);
+                }
+                var bmatrix = DenseMatrix.OfColumns(begin);
+                var tmatrix = DenseMatrix.OfColumns(t);
+                var pmatrix = DenseMatrix.OfColumns(p);
+                var ptmatrix = DenseMatrix.OfColumns(pt);
+
+                int startdays = tdays - sday;
+                //有几周
+                int sweeks = startdays / 7;
+                //余几天
+                int rweeks = startdays % 7;
+
+                if (sweeks > 0)
+                {
+                    for (int i = 1; i <= sweeks; i++)
+                    {
+                        sday += 7;
+                        var bsum = bmatrix.SubMatrix(sday, 7, 0, bmatrix.ColumnCount).ColumnSums().Sum();
+                        var tsum = tmatrix.SubMatrix(sday, 7, 0, tmatrix.ColumnCount).ColumnSums().Sum();
+                        var psum = pmatrix.SubMatrix(sday, 7, 0, pmatrix.ColumnCount).ColumnSums().Sum();
+                        var ptsum = ptmatrix.SubMatrix(sday, 7, 0, ptmatrix.ColumnCount).ColumnSums().Sum();
+                        wks.Add((i, new List<double>() { bsum, tsum, psum, ptsum }));
+                    }
+                }
+                if (rweeks > 0)
+                {
+                    var bsum = bmatrix.SubMatrix(tdays - rweeks, rweeks, 0, bmatrix.ColumnCount).ColumnSums().Sum();
+                    var tsum = tmatrix.SubMatrix(tdays - rweeks, rweeks, 0, tmatrix.ColumnCount).ColumnSums().Sum();
+                    var psum = pmatrix.SubMatrix(tdays - rweeks, rweeks, 0, pmatrix.ColumnCount).ColumnSums().Sum();
+                    var ptsum = ptmatrix.SubMatrix(tdays - rweeks, rweeks, 0, ptmatrix.ColumnCount).ColumnSums().Sum();
+                    if (eyear > syear)
+                    {
+                        List<List<double>> e_begin = new();
+                        List<List<double>> e_t = new();
+                        List<List<double>> e_p = new();
+                        List<List<double>> e_pt = new();
+                        foreach (LessonCount lesson in scount)
+                        {
+                            e_begin.Add(lesson.beginCount);
+                            e_t.Add(lesson.tCount);
+                            e_p.Add(lesson.pCount);
+                            e_pt.Add(lesson.ptCount);
+                        }
+                        var tbmatrix = DenseMatrix.OfColumns(e_begin);
+                        var ttmatrix = DenseMatrix.OfColumns(e_t);
+                        var tpmatrix = DenseMatrix.OfColumns(e_p);
+                        var tptmatrix = DenseMatrix.OfColumns(e_pt);
+                        int day = 7 - rweeks;
+                        int start = eday - day;
+                        int eweeks = start / 7;
+                        int erweeks = start % 7;
+                        var tbsum = tbmatrix.SubMatrix(0, day, 0, tbmatrix.ColumnCount).ColumnSums().Sum();
+                        var ttsum = ttmatrix.SubMatrix(0, day, 0, ttmatrix.ColumnCount).ColumnSums().Sum();
+                        var tpsum = tpmatrix.SubMatrix(0, day, 0, tpmatrix.ColumnCount).ColumnSums().Sum();
+                        var tptsum = tptmatrix.SubMatrix(0, day, 0, tptmatrix.ColumnCount).ColumnSums().Sum();
+                        wks.Add((sweeks + 1, new List<double>() { bsum + tbsum, tsum + ttsum, psum + tpsum, ptsum + tptsum }));
+                        if (eweeks > 0)
+                        {
+                            for (int i = 1; i <= eweeks; i++)
+                            {
+                                start += 7;
+                                var newbsum = tbmatrix.SubMatrix(start, 7, 0, tbmatrix.ColumnCount).ColumnSums().Sum();
+                                var newtsum = ttmatrix.SubMatrix(start, 7, 0, ttmatrix.ColumnCount).ColumnSums().Sum();
+                                var newpsum = tpmatrix.SubMatrix(start, 7, 0, tpmatrix.ColumnCount).ColumnSums().Sum();
+                                var newptsum = tptmatrix.SubMatrix(start, 7, 0, tptmatrix.ColumnCount).ColumnSums().Sum();
+                                wks.Add((sweeks += 1, new List<double>() { newbsum, newtsum, newpsum, newptsum }));
+                            }
 
-        private async Task<List<double>> getRecordCount(CosmosClient client, long stime,long etime,string code)
+                        }
+                        if (erweeks > 0)
+                        {
+                            var newbsum = tbmatrix.SubMatrix(eday - start, erweeks, 0, tbmatrix.ColumnCount).ColumnSums().Sum();
+                            var newtsum = tbmatrix.SubMatrix(eday - start, erweeks, 0, tbmatrix.ColumnCount).ColumnSums().Sum();
+                            var newpsum = tbmatrix.SubMatrix(eday - start, erweeks, 0, tbmatrix.ColumnCount).ColumnSums().Sum();
+                            var newptsum = tbmatrix.SubMatrix(eday - start, erweeks, 0, tbmatrix.ColumnCount).ColumnSums().Sum();
+                            wks.Add((sweeks + 1, new List<double>() { newbsum, newtsum, newpsum, newptsum }));
+                        }
+                    }
+                    else
+                    {
+                        wks.Add((sweeks + 1, new List<double>() { bsum, tsum, psum, ptsum }));
+                    }
+                }
+                return wks;
+            }
+            catch (Exception e)
+            {
+                return null;
+            }
+        }
+
+        private async Task<List<(string time, double count)>> getRecordCount(CosmosClient client, List<LessonRecord> records, long stime, long etime, string code)
         {
-            List<double> counts = new();
+            List<(string time, double count)> counts = new();
+            counts.Add(("total", records.Count()));
             var syear = DateTimeOffset.FromUnixTimeMilliseconds(stime).Year;
             var eyear = DateTimeOffset.FromUnixTimeMilliseconds(etime).Year;
-            var tyeat = DateTimeOffset.UtcNow.Year;
+            var tyear = DateTimeOffset.UtcNow.Year;
             var tday = DateTimeOffset.UtcNow.DayOfYear;
-            var sday = DateTimeOffset.UtcNow.DayOfWeek;
-            var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(syear.ToString(), new PartitionKey($"ClassCount-" + code));
-            if (response.Status == 200)
+            //求今年多少天
+            int tdays = DateTimeHelper.getDays(tyear);
+            //如果跨年 求前年多少天
+            int pydays = DateTimeHelper.getDays(syear);
+            List<LessonCount> scount = new();
+            List<LessonCount> tcount = new();
+            DenseMatrix dense = null;
+            await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<LessonCount>(
+                        queryText: $"select value(c) from c where c.year = {syear}",
+                        requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{code}") }))
             {
-                using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                ClassCount count = json.ToObject<ClassCount>();
-                var matrix = DenseMatrix.OfColumns(count.beginCount);
+                scount.Add(item);
+            }
+            //var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(syear.ToString(), new PartitionKey($"ClassCount-" + code));
+            if (tyear > syear)
+            {
+                //跨年
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<LessonCount>(
+                            queryText: $"select value(c) from c where c.year = {tyear}",
+                            requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{code}") }))
+                {
+                    tcount.Add(item);
+                }
+                if (tcount.Count > 0)
+                {
+                    List<List<double>> be = new();
+                    foreach (var item in tcount)
+                    {
+                        be.Add(item.beginCount);
+                    }
+                    dense = DenseMatrix.OfColumns(be);
+                }
+            }
+            if (scount.Count > 0)
+            {
+                List<List<double>> begin = new List<List<double>>();
+                foreach (LessonCount lesson in scount)
+                {
+                    begin.Add(lesson.beginCount);
+                }
+                var matrix = DenseMatrix.OfColumns(begin);
                 double tcounts = matrix.Row(tday).Sum();
+                counts.Add(("today", tcounts));
+                //求本周
+                int sday = (int)DateTimeOffset.UtcNow.DayOfWeek;
+                if (sday == 0)
+                {
+                    sday = 7;
+                    if (tday - sday < 0)
+                    {
+                        //var tmatrix = DenseMatrix.OfColumns(scount.beginCount);
+                        //新的一年不超过7天的值
+                        var tsum = dense.SubMatrix(tday, tday, 0, dense.ColumnCount).ColumnSums().Sum();
+                        //前一年余下的值
+                        var pysum = matrix.SubMatrix(pydays - (sday - tday), sday - tday, 0, matrix.ColumnCount).ColumnSums().Sum();
+                        counts.Add(("week", tsum + pysum));
+                    }
+
+                }
+                else
+                {
+                    var subDay = matrix.SubMatrix(tday - sday, 7, 0, matrix.ColumnCount).ColumnSums().Sum();
+                    counts.Add(("week", subDay));
+                }
+                //求本学期
+                var sdays = DateTimeOffset.FromUnixTimeMilliseconds(stime).DayOfYear;
+                var edays = DateTimeOffset.FromUnixTimeMilliseconds(etime).DayOfYear;
+                if (edays - sdays < 0)
+                {
+                    //var tmatrix = DenseMatrix.OfColumns(scount.beginCount);
+                    //跨年后开始到本学期结束
+                    var endMonth = dense.SubMatrix(0, edays, 0, dense.ColumnCount).ColumnSums().Sum();
+                    var startMonth = matrix.SubMatrix(sdays, pydays - sdays, 0, matrix.ColumnCount).ColumnSums().Sum();
+                    counts.Add(("semester", endMonth + startMonth));
+                }
+                else
+                {
+                    var allMonth = matrix.SubMatrix(sdays, edays - sdays, 0, matrix.ColumnCount).ColumnSums().Sum();
+                    counts.Add(("semester", allMonth));
+                }
+                //本月
+                var tmonth = DateTimeOffset.UtcNow.Day;
+                var subMonth = matrix.SubMatrix(tday - tmonth, tmonth, 0, matrix.ColumnCount).ColumnSums().Sum();
+                counts.Add(("month", subMonth));
+                //求今年
+                var subYear = matrix.SubMatrix(0, tdays, 0, matrix.ColumnCount).ColumnSums().Sum();
+
 
             }
+            return counts;
+        }
+        //取得该学校当前学期所有评测活动进行分类计算
+        private async Task<List<double>> getExamTypeCount(CosmosClient client, long stime, long etime, string code)
+        {
+            List<double> counts = new List<double>();
+            try
+            {
+                List<(string id, string source, string scope)> ps = new List<(string id, string source, string scope)>();
+                var queryClass = $"select c.id,c.source,c.scope from c where c.school = '{code}' and c.pk = 'Exam' and c.startTime >= {stime} and c.endTime =< {etime}";
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: queryClass))
+                {
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                    {
+                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                        while (accounts.MoveNext())
+                        {
+                            JsonElement account = accounts.Current;
+                            ps.Add((account.GetProperty("id").GetString(), account.GetProperty("source").GetString(), account.GetProperty("scope").GetString()));
+                        }
+                        break;
+                    }
+
+                }
+                var sc_online = ps.Where(x => x.source.Equals("0") && x.scope.Equals("school")).ToList().Count;
+                var p_online = ps.Where(x => x.source.Equals("0") && x.scope.Equals("private")).ToList().Count;
+                var sc_class = ps.Where(x => x.source.Equals("1") && x.scope.Equals("school")).ToList().Count;
+                var p_class = ps.Where(x => x.source.Equals("1") && x.scope.Equals("private")).ToList().Count;
+                var sc_mark = ps.Where(x => x.source.Equals("2") && x.scope.Equals("school")).ToList().Count;
+                var p_mark = ps.Where(x => x.source.Equals("2") && x.scope.Equals("private")).ToList().Count;
+                counts.Add(sc_online);
+                counts.Add(sc_class);
+                counts.Add(sc_mark);
+                counts.Add(p_online);
+                counts.Add(p_class);
+                counts.Add(p_mark);
                 return counts;
+            }
+            catch (Exception e)
+            {
+                return counts;
+            }
         }
     }
 }