浏览代码

更新学校统计接口以及相关辅助方法

Li 2 年之前
父节点
当前提交
3c84dd38ef

文件差异内容过多而无法显示
+ 307 - 64
TEAMModelBI/Controllers/BITest/TestController.cs


+ 12 - 12
TEAMModelBI/Controllers/Census/SchoolController.cs

@@ -520,7 +520,7 @@ namespace TEAMModelBI.Controllers.Census
             {
             {
                 bool isExist = true;
                 bool isExist = true;
                 StatsInfo statsInfo = new();
                 StatsInfo statsInfo = new();
-                var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{scId}", new PartitionKey("Stats"));
+                var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{DateTimeOffset.UtcNow.Year}-{scId}", new PartitionKey("Statistics"));
                 if (scDataStats.Status == 200)
                 if (scDataStats.Status == 200)
                 {
                 {
                     using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream);
                     using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream);
@@ -569,9 +569,9 @@ namespace TEAMModelBI.Controllers.Census
                     scStats.lessStats.monthInter = statsInfo.lesson.monthInter;
                     scStats.lessStats.monthInter = statsInfo.lesson.monthInter;
                     scStats.lessStats.lastYearInter = statsInfo.lesson.lastYearInter;
                     scStats.lessStats.lastYearInter = statsInfo.lesson.lastYearInter;
                     scStats.lessStats.yearInter = statsInfo.lesson.yearInter;
                     scStats.lessStats.yearInter = statsInfo.lesson.yearInter;
-                    scStats.lessStats.LastYear = TimeHelper.GetYearMonth(statsInfo.lesson.LastYear, dateTime.Year, dateTime.Month);
+                    //scStats.lessStats.LastYear = TimeHelper.GetYearMonth(statsInfo.lesson.LastYear, dateTime.Year, dateTime.Month);
                     scStats.lessStats.year = TimeHelper.GetYearMonth(statsInfo.lesson.year, dateTime.Year, dateTime.Month);
                     scStats.lessStats.year = TimeHelper.GetYearMonth(statsInfo.lesson.year, dateTime.Year, dateTime.Month);
-                    scStats.actStats.cnt = statsInfo.activity.cnt;
+                    scStats.actStats.all = statsInfo.activity.all;
                     scStats.actStats.exam = statsInfo.activity.exam;
                     scStats.actStats.exam = statsInfo.activity.exam;
                     scStats.actStats.survey = statsInfo.activity.survey;
                     scStats.actStats.survey = statsInfo.activity.survey;
                     scStats.actStats.vote = statsInfo.activity.vote;
                     scStats.actStats.vote = statsInfo.activity.vote;
@@ -582,7 +582,7 @@ namespace TEAMModelBI.Controllers.Census
                     scStats.actStats.week = statsInfo.activity.week;
                     scStats.actStats.week = statsInfo.activity.week;
                     scStats.actStats.lastTerm = statsInfo.activity.lastTerm;
                     scStats.actStats.lastTerm = statsInfo.activity.lastTerm;
                     scStats.actStats.term = statsInfo.activity.term;
                     scStats.actStats.term = statsInfo.activity.term;
-                    scStats.actStats.LastYear = TimeHelper.GetYearMonth(statsInfo.activity.LastYear, dateTime.Year, dateTime.Month);
+                    //scStats.actStats.LastYear = TimeHelper.GetYearMonth(statsInfo.activity.LastYear, dateTime.Year, dateTime.Month);
                     scStats.actStats.year = TimeHelper.GetYearMonth(statsInfo.activity.year, dateTime.Year, dateTime.Month);
                     scStats.actStats.year = TimeHelper.GetYearMonth(statsInfo.activity.year, dateTime.Year, dateTime.Month);
                     if (statsInfo.study != null)
                     if (statsInfo.study != null)
                     {
                     {
@@ -662,13 +662,13 @@ namespace TEAMModelBI.Controllers.Census
             StringBuilder statsSql = new("select value(c) from c");
             StringBuilder statsSql = new("select value(c) from c");
             if (scIds.Count > 0)
             if (scIds.Count > 0)
             {
             {
-                statsSql.Append($" where {BICommonWay.ManyScSql("c.id", scIds)}");
+                statsSql.Append($" where {BICommonWay.ManyScSql("c.id", scIds, $"{DateTimeOffset.UtcNow.Year}-")}");
             }
             }
 
 
             DateTimeOffset dateTime = DateTimeOffset.UtcNow;
             DateTimeOffset dateTime = DateTimeOffset.UtcNow;
             List<ScStats> scStatss = new();
             List<ScStats> scStatss = new();
             List<StatsInfo> statsInfos = new();
             List<StatsInfo> statsInfos = new();
-            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<StatsInfo>(queryText: statsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Stats") }))
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<StatsInfo>(queryText: statsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
             {
             {
                 statsInfos.Add(item);
                 statsInfos.Add(item);
             }
             }
@@ -709,9 +709,9 @@ namespace TEAMModelBI.Controllers.Census
                 areaScStats.lessStats.monthInter = statsInfo.lesson.monthInter;
                 areaScStats.lessStats.monthInter = statsInfo.lesson.monthInter;
                 areaScStats.lessStats.lastYearInter = statsInfo.lesson.lastYearInter;
                 areaScStats.lessStats.lastYearInter = statsInfo.lesson.lastYearInter;
                 areaScStats.lessStats.yearInter = statsInfo.lesson.yearInter;
                 areaScStats.lessStats.yearInter = statsInfo.lesson.yearInter;
-                areaScStats.lessStats.LastYear = TimeHelper.GetYearMonth(statsInfo.lesson.LastYear, dateTime.Year, dateTime.Month);
+                //areaScStats.lessStats.LastYear = TimeHelper.GetYearMonth(statsInfo.lesson.LastYear, dateTime.Year, dateTime.Month);
                 areaScStats.lessStats.year = TimeHelper.GetYearMonth(statsInfo.lesson.year, dateTime.Year, dateTime.Month);
                 areaScStats.lessStats.year = TimeHelper.GetYearMonth(statsInfo.lesson.year, dateTime.Year, dateTime.Month);
-                areaScStats.actStats.cnt = statsInfo.activity.cnt;
+                areaScStats.actStats.all = statsInfo.activity.all;
                 areaScStats.actStats.exam = statsInfo.activity.exam;
                 areaScStats.actStats.exam = statsInfo.activity.exam;
                 areaScStats.actStats.survey = statsInfo.activity.survey;
                 areaScStats.actStats.survey = statsInfo.activity.survey;
                 areaScStats.actStats.vote = statsInfo.activity.vote;
                 areaScStats.actStats.vote = statsInfo.activity.vote;
@@ -722,7 +722,7 @@ namespace TEAMModelBI.Controllers.Census
                 areaScStats.actStats.week = statsInfo.activity.week;
                 areaScStats.actStats.week = statsInfo.activity.week;
                 areaScStats.actStats.lastTerm = statsInfo.activity.lastTerm;
                 areaScStats.actStats.lastTerm = statsInfo.activity.lastTerm;
                 areaScStats.actStats.term = statsInfo.activity.term;
                 areaScStats.actStats.term = statsInfo.activity.term;
-                areaScStats.actStats.LastYear = TimeHelper.GetYearMonth(statsInfo.activity.LastYear, dateTime.Year, dateTime.Month);
+                //areaScStats.actStats.LastYear = TimeHelper.GetYearMonth(statsInfo.activity.LastYear, dateTime.Year, dateTime.Month);
                 areaScStats.actStats.year = TimeHelper.GetYearMonth(statsInfo.activity.year, dateTime.Year, dateTime.Month);
                 areaScStats.actStats.year = TimeHelper.GetYearMonth(statsInfo.activity.year, dateTime.Year, dateTime.Month);
                 if (statsInfo.study != null)
                 if (statsInfo.study != null)
                 {
                 {
@@ -736,9 +736,9 @@ namespace TEAMModelBI.Controllers.Census
                     areaScStats.srStats.finish = statsInfo.study.finish;
                     areaScStats.srStats.finish = statsInfo.study.finish;
                 }
                 }
             }
             }
-            var scInfos = statsInfos.Select(s => new { s.id, s.name, s.picture, actLess = (s.lesson.all + s.activity.cnt), actCnt = s.activity.cnt, lessCnt = s.lesson.all, lessOpen = s.lesson.open, lessUp = s.lesson.less }).ToList();
+            var scInfos = statsInfos.Select(s => new { s.id, s.schoolId, s.name, s.picture, actLess = (s.lesson.all + s.activity.all), actCnt = s.activity.all, lessCnt = s.lesson.all, lessOpen = s.lesson.open, lessUp = s.lesson.less }).ToList();
 
 
-            return Ok(new { state = RespondCode.Ok, areaScStats,  });
+            return Ok(new { state = RespondCode.Ok, areaScStats, scInfos });
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -881,7 +881,7 @@ namespace TEAMModelBI.Controllers.Census
         /// </summary>
         /// </summary>
         public record ScActStats
         public record ScActStats
         {
         {
-            public int cnt { get; set; }
+            public int all { get; set; }
             public int exam { get; set; }
             public int exam { get; set; }
             public int survey { get; set; }
             public int survey { get; set; }
             public int vote { get; set; }
             public int vote { get; set; }

+ 6 - 4
TEAMModelBI/Controllers/RepairApi/SchoolRepController.cs

@@ -508,12 +508,14 @@ namespace TEAMModelBI.Controllers.RepairApi
             else
             else
                 scIds = await CommonFind.FindScIds(cosmosClient, "select value(c.id) from c ", "Base");
                 scIds = await CommonFind.FindScIds(cosmosClient, "select value(c.id) from c ", "Base");
 
 
+            DateTimeOffset dateTime = DateTimeOffset.UtcNow;
+
             List<StatsInfo> statsInfos = new();
             List<StatsInfo> statsInfos = new();
             List<Task<ItemResponse<StatsInfo>>> taskStss = new();
             List<Task<ItemResponse<StatsInfo>>> taskStss = new();
             foreach (var sc in scIds) 
             foreach (var sc in scIds) 
             {
             {
                 StatsInfo statsInfo = new();
                 StatsInfo statsInfo = new();
-                var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{sc}", new PartitionKey("Stats"));
+                var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateTime.Year}-{sc}", new PartitionKey("Statistics"));
                 if (scDataStats.Status == 200)
                 if (scDataStats.Status == 200)
                 {
                 {
                     using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream);
                     using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream);
@@ -521,15 +523,15 @@ namespace TEAMModelBI.Controllers.RepairApi
                 }
                 }
                 else
                 else
                 {
                 {
-                    statsInfo.id = sc;
+                    statsInfo.id = $"{dateTime.Year}-{sc}";
                 }
                 }
 
 
                 statsInfo = await SchoolStatsWay.GetSingleSc(cosmosClient, sc);
                 statsInfo = await SchoolStatsWay.GetSingleSc(cosmosClient, sc);
 
 
                 if (scDataStats.Status == 200)
                 if (scDataStats.Status == 200)
-                    taskStss.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, sc, new PartitionKey("Stats")));
+                    taskStss.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, $"{dateTime.Year}-{sc}", new PartitionKey("Statistics")));
                 else
                 else
-                    taskStss.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Stats")));
+                    taskStss.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics")));
 
 
                 //statsInfo = await StatsWay.upSingleSc(cosmosClient, sc);
                 //statsInfo = await StatsWay.upSingleSc(cosmosClient, sc);
                 statsInfos.Add(statsInfo);
                 statsInfos.Add(statsInfo);

+ 15 - 16
TEAMModelBI/Tool/CosmosBank/StatsWay.cs

@@ -140,13 +140,13 @@ namespace TEAMModelBI.Tool.CosmosBank
             List<StartEndTime> leveryDay = TimeHelper.GetYearEveryDay(lyearDay);
             List<StartEndTime> leveryDay = TimeHelper.GetYearEveryDay(lyearDay);
             List<StartEndTime> everyDay = TimeHelper.GetYearEveryDay(DateTimeOffset.UtcNow);
             List<StartEndTime> everyDay = TimeHelper.GetYearEveryDay(DateTimeOffset.UtcNow);
 
 
-            for (int i = 0; i < leveryDay.Count; i++)
-            {
-                if (lessStats.LastYear.Count == 366)
-                    lessStats.LastYear[i] = (double)lessRelStats.FindAll(f => (f.startTime >= leveryDay[i].start && f.startTime <= leveryDay[i].end)).Count;
-                else
-                    lessStats.LastYear.Add((double)lessRelStats.FindAll(f => (f.startTime >= leveryDay[i].start && f.startTime <= leveryDay[i].end)).Count);
-            }
+            //for (int i = 0; i < leveryDay.Count; i++)
+            //{
+            //    if (lessStats.LastYear.Count == 366)
+            //        lessStats.LastYear[i] = (double)lessRelStats.FindAll(f => (f.startTime >= leveryDay[i].start && f.startTime <= leveryDay[i].end)).Count;
+            //    else
+            //        lessStats.LastYear.Add((double)lessRelStats.FindAll(f => (f.startTime >= leveryDay[i].start && f.startTime <= leveryDay[i].end)).Count);
+            //}
 
 
             for (int i = 0; i < everyDay.Count; i++)
             for (int i = 0; i < everyDay.Count; i++)
             {
             {
@@ -329,14 +329,13 @@ namespace TEAMModelBI.Tool.CosmosBank
 
 
             if (tempAll.Count > 0) 
             if (tempAll.Count > 0) 
             {
             {
-
-                for (int i = 0; i < leveryDay.Count; i++)
-                {
-                    if (actStats.LastYear.Count == 366)
-                        actStats.LastYear[i] = (double)tempAll.FindAll(f => (f.createTime >= leveryDay[i].start && f.createTime <= leveryDay[i].end)).Count;
-                    else
-                        actStats.LastYear.Add((double)tempAll.FindAll(f => (f.createTime >= leveryDay[i].start && f.createTime <= leveryDay[i].end)).Count);
-                }
+                //for (int i = 0; i < leveryDay.Count; i++)
+                //{
+                //    if (actStats.LastYear.Count == 366)
+                //        actStats.LastYear[i] = (double)tempAll.FindAll(f => (f.createTime >= leveryDay[i].start && f.createTime <= leveryDay[i].end)).Count;
+                //    else
+                //        actStats.LastYear.Add((double)tempAll.FindAll(f => (f.createTime >= leveryDay[i].start && f.createTime <= leveryDay[i].end)).Count);
+                //}
 
 
                 for (int i = 0; i < everyDay.Count; i++)
                 for (int i = 0; i < everyDay.Count; i++)
                 {
                 {
@@ -396,7 +395,7 @@ namespace TEAMModelBI.Tool.CosmosBank
             //            break;
             //            break;
             //    }
             //    }
             //}
             //}
-            actStats.cnt = (exam + survey + vote + homework);
+            actStats.all = (exam + survey + vote + homework);
             actStats.exam = exam;
             actStats.exam = exam;
             actStats.survey = survey;
             actStats.survey = survey;
             actStats.vote = vote;
             actStats.vote = vote;

+ 338 - 39
TEAMModelOS.FunctionV4/HttpTrigger/BIHttpTrigger.cs

@@ -9,11 +9,13 @@ using System.Threading.Tasks;
 using Azure.Cosmos;
 using Azure.Cosmos;
 using Azure.Storage.Blobs;
 using Azure.Storage.Blobs;
 using DocumentFormat.OpenXml.Bibliography;
 using DocumentFormat.OpenXml.Bibliography;
+using MathNet.Numerics.LinearAlgebra.Double;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http;
 using Microsoft.Azure.Functions.Worker;
 using Microsoft.Azure.Functions.Worker;
 using Microsoft.Azure.Functions.Worker.Http;
 using Microsoft.Azure.Functions.Worker.Http;
 using NUnit.Framework.Constraints;
 using NUnit.Framework.Constraints;
 using StackExchange.Redis;
 using StackExchange.Redis;
+using TEAMModelOS.SDK.Context.Constant;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models;
@@ -193,56 +195,54 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
             dynamic jsondata = new ExpandoObject();
             dynamic jsondata = new ExpandoObject();
             try
             try
             {
             {
-                string scId = null,type = null;
-                var cosmosClient = _azureCosmos.GetCosmosClient();
-                var tableClient = _azureStorage.GetCloudTableClient();
-                var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public");
                 string data = await new StreamReader(req.Body).ReadToEndAsync();
                 string data = await new StreamReader(req.Body).ReadToEndAsync();
                 var json = JsonDocument.Parse(data).RootElement;
                 var json = JsonDocument.Parse(data).RootElement;
                 jsondata = json;
                 jsondata = json;
+
+                string scId = null, type = null;
+                var cosmosClient = _azureCosmos.GetCosmosClient();
+                var tableClient = _azureStorage.GetCloudTableClient();
+                var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public");
                 long careDate = 0;
                 long careDate = 0;
-                int cnt = 0;
-                                
+                int all = 0;
+
                 DateTimeOffset dateOff = DateTimeOffset.UtcNow;
                 DateTimeOffset dateOff = DateTimeOffset.UtcNow;
-                if (!json.TryGetProperty("scId", out JsonElement _schoolId))
-                {
+                if (json.TryGetProperty("scId", out JsonElement _schoolId))
                     scId = $"{_schoolId}";
                     scId = $"{_schoolId}";
-                }
-                if (!json.TryGetProperty("type", out JsonElement _type))
-                {
+                if (json.TryGetProperty("type", out JsonElement _type))
                     type = $"{_type}";
                     type = $"{_type}";
-                }
-                if (string.IsNullOrEmpty(scId) && string.IsNullOrEmpty(type))
+                if (string.IsNullOrEmpty($"{_schoolId}") && string.IsNullOrEmpty($"{_type}"))
                 {
                 {
-                    await _dingDing.SendBotMsg($"set-scstats-type, {req.Body};转换后:{json}", GroupNames.成都开发測試群組);
+                    await _dingDing.SendBotMsg($"set-scstats-type, {json}", GroupNames.成都开发測試群組);
                     return response;
                     return response;
                 }
                 }
-                if (!json.TryGetProperty("cnt", out JsonElement _cnt)) 
-                {
-                    cnt = int.Parse($"{_cnt}");
-                }
+                if (json.TryGetProperty("cnt", out JsonElement _cnt))
+                    all = _cnt.GetInt32();
 
 
-                if (!json.TryGetProperty("date", out JsonElement _date)) 
-                {
-                    careDate = long.Parse($"{_date}");
-                }
+                json.TryGetProperty("interaction", out JsonElement interaction);
+
+                if (json.TryGetProperty("date", out JsonElement _date))
+                    careDate = _date.GetInt64();
                 else
                 else
-                {
                     careDate = dateOff.ToUnixTimeMilliseconds();
                     careDate = dateOff.ToUnixTimeMilliseconds();
-                }
-
-                long currDay = dateOff.ToUnixTimeMilliseconds();
-                var (lastDays, lastDaye) = TimeHelper.GetStartOrEnd(dateOff.AddDays(-1));//昨天开始/结束时间
+                var (lastDayS, lastDayE) = TimeHelper.GetStartOrEnd(dateOff.AddDays(-1));//昨天开始/结束时间
                 var (DayS, DayE) = TimeHelper.GetStartOrEnd(dateOff);      //今天开始时间结束时间
                 var (DayS, DayE) = TimeHelper.GetStartOrEnd(dateOff);      //今天开始时间结束时间
                 var (lastWeekS, lastWeekE) = TimeHelper.GetStartOrEnd(dateOff, "lastweek");   //计算上周开始/结束时间
                 var (lastWeekS, lastWeekE) = TimeHelper.GetStartOrEnd(dateOff, "lastweek");   //计算上周开始/结束时间
                 var (weekS, weekE) = TimeHelper.GetStartOrEnd(dateOff, "week");             //计算本周开始/结束时间
                 var (weekS, weekE) = TimeHelper.GetStartOrEnd(dateOff, "week");             //计算本周开始/结束时间
+                var (lastMonthS, lastMonthE) = TimeHelper.GetStartOrEnd(dateOff, "lastMonth");   //计算上月开始/结束时间
+                var (monthS, monthE) = TimeHelper.GetStartOrEnd(dateOff, "month");             //计算本月开始/结束时间
                 var (lastTermS, lastTermE) = TimeHelper.GetStartOrEnd(dateOff, "lastterm");   //计算上学期开始/结束时间
                 var (lastTermS, lastTermE) = TimeHelper.GetStartOrEnd(dateOff, "lastterm");   //计算上学期开始/结束时间
                 var (termS, termE) = TimeHelper.GetStartOrEnd(dateOff, "term");   //计算本学期开始/结束时间
                 var (termS, termE) = TimeHelper.GetStartOrEnd(dateOff, "term");   //计算本学期开始/结束时间
                 var (lastYearS, lastYearE) = TimeHelper.GetStartOrEnd(dateOff, "lastYear"); //计算去年开始/结束时间
                 var (lastYearS, lastYearE) = TimeHelper.GetStartOrEnd(dateOff, "lastYear"); //计算去年开始/结束时间
                 var (yearS, yearE) = TimeHelper.GetStartOrEnd(dateOff, "year");         //计算今年开始/结束时间
                 var (yearS, yearE) = TimeHelper.GetStartOrEnd(dateOff, "year");         //计算今年开始/结束时间
-                StatsInfo statsInfo  = new();
 
 
-                var resStsInfo  = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(scId, new PartitionKey("BIRel"));
+                var (weekDayS, weekDayE) = TimeHelper.GetLongToTime(lastWeekS, lastWeekE);
+                var (lTermDayS, lTermDayE) = TimeHelper.GetLongToTime(lastTermS, lastTermE);
+                var (termDayS, termDayE) = TimeHelper.GetLongToTime(lastTermS, lastTermE);
+                var lastDay = dateOff.AddDays(-1);
+
+                StatsInfo statsInfo = new();
+                var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year}-{scId}", new PartitionKey("Statistics"));
                 if (resStsInfo.Status == 200)
                 if (resStsInfo.Status == 200)
                 {
                 {
                     using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
                     using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
@@ -251,52 +251,351 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                 else
                 else
                 {
                 {
                     ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<ScBase>(scId, new PartitionKey("Base"));
                     ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<ScBase>(scId, new PartitionKey("Base"));
-                    statsInfo.id = scBase.id;
+
+                    //var resLastStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
+                    //if (resLastStsInfo.Status == 200)
+                    //{
+                    //    using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
+                    //    statsInfo = fileJson.ToObject<StatsInfo>();
+                    //    statsInfo.id = $"{dateOff.Year}-{scBase.id}";
+                    //}
+                    //else 
+                    //{
+                    statsInfo.id = $"{dateOff.Year}-{scBase.id}";
                     statsInfo.name = scBase.name;
                     statsInfo.name = scBase.name;
                     statsInfo.picture = scBase.picture;
                     statsInfo.picture = scBase.picture;
                     statsInfo.size = scBase.size;
                     statsInfo.size = scBase.size;
                     statsInfo.scCreateTime = scBase.createTime;
                     statsInfo.scCreateTime = scBase.createTime;
                     statsInfo.areaId = scBase.areaId;
                     statsInfo.areaId = scBase.areaId;
-                    statsInfo.upTime = currDay;
+                    statsInfo.upTime = careDate;
+                    //}
                 }
                 }
 
 
                 switch ($"{type}")
                 switch ($"{type}")
                 {
                 {
                     case "Exam":
                     case "Exam":
-                        if (statsInfo.upTime < DayS && statsInfo.upTime >= lastDays) 
+                        statsInfo.activity.year[dateOff.DayOfYear] += all;
+                        statsInfo.activity.exam += all;
+                        statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
+                        statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
+
+                        if (lastWeekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastWeekE)
                         {
                         {
-                            statsInfo.activity.lastDay = statsInfo.activity.dayCnt;
-                            statsInfo.activity.year[dateOff.DayOfYear-1] += statsInfo.activity.dayCnt;
+                            var artWeek = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                            statsInfo.activity.lastWeek = ((int)artWeek.SubMatrix(weekDayS.DayOfYear, 7, 0, artWeek.ColumnCount).ColumnSums().Sum());
+                            //statsInfo.activity.lastWeek = ((int)statsInfo.activity.year.GetRange(weekDayS.DayOfYear, 7).Sum());
                         }
                         }
-                        if (DayS <= statsInfo.upTime && statsInfo.upTime <= DayE)
+
+                        if (weekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= weekE)
+                            statsInfo.activity.week += all;
+
+                        if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
                         {
                         {
-                            statsInfo.activity.dayCnt += cnt;
-                            statsInfo.activity.exam += cnt;
-                            statsInfo.activity.year[dateOff.DayOfYear] += cnt;
+                            if (lTermDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                if (lastSts.Status == 200)
+                                {
+                                    using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                    var tempSts = fileJson.ToObject<StatsInfo>();
+                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                    statsInfo.activity.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                                }
+                                else
+                                    statsInfo.activity.lastTerm = 0;
+                            }
                         }
                         }
 
 
+                        if (termS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= termE)
+                        {
+                            if (termDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                if (lastSts.Status == 200)
+                                {
+                                    using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                    var tempSts = fileJson.ToObject<StatsInfo>();
+                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                    statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                                }
+                                else
+                                    statsInfo.activity.term += all;
+                            }
+                        }
 
 
-                        statsInfo.activity.cnt += cnt;
+                        statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                        statsInfo.activity.all += all;
                         break;
                         break;
                     case "Survey":
                     case "Survey":
+                        statsInfo.activity.year[dateOff.DayOfYear] += all;
+                        statsInfo.activity.survey += all;
+                        statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
+                        statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
+
+                        if (lastWeekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastWeekE)
+                        {
+                            var artWeek = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                            statsInfo.activity.lastWeek = ((int)artWeek.SubMatrix(weekDayS.DayOfYear, 7, 0, artWeek.ColumnCount).ColumnSums().Sum());
+                            //statsInfo.activity.lastWeek = ((int)statsInfo.activity.year.GetRange(weekDayS.DayOfYear, 7).Sum());
+                        }
 
 
+                        if (weekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= weekE)
+                            statsInfo.activity.week += all;
+
+                        if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
+                        {
+                            if (lTermDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                if (lastSts.Status == 200)
+                                {
+                                    using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                    var tempSts = fileJson.ToObject<StatsInfo>();
+                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                    statsInfo.activity.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                                }
+                                else
+                                    statsInfo.activity.lastTerm = 0;
+                            }
+                        }
+
+                        if (termS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= termE)
+                        {
+                            if (termDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                if (lastSts.Status == 200)
+                                {
+                                    using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                    var tempSts = fileJson.ToObject<StatsInfo>();
+                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                    statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                                }
+                                else
+                                    statsInfo.activity.term += all;
+                            }
+                        }
+
+                        statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                        statsInfo.activity.all += all;
                         break;
                         break;
                     case "Vote":
                     case "Vote":
+                        statsInfo.activity.year[dateOff.DayOfYear] += all;
+                        statsInfo.activity.vote += all;
+                        statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
+                        statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
+
+                        if (lastWeekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastWeekE)
+                        {
+                            var artWeek = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                            statsInfo.activity.lastWeek = ((int)artWeek.SubMatrix(weekDayS.DayOfYear, 7, 0, artWeek.ColumnCount).ColumnSums().Sum());
+                            //statsInfo.activity.lastWeek = ((int)statsInfo.activity.year.GetRange(weekDayS.DayOfYear, 7).Sum());
+                        }
 
 
+                        if (weekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= weekE)
+                            statsInfo.activity.week += all;
+
+                        if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
+                        {
+                            if (lTermDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                if (lastSts.Status == 200)
+                                {
+                                    using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                    var tempSts = fileJson.ToObject<StatsInfo>();
+                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                    statsInfo.activity.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                                }
+                                else
+                                    statsInfo.activity.lastTerm = 0;
+                            }
+                        }
+
+                        if (termS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= termE)
+                        {
+                            if (termDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                if (lastSts.Status == 200)
+                                {
+                                    using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                    var tempSts = fileJson.ToObject<StatsInfo>();
+                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                    statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                                }
+                                else
+                                    statsInfo.activity.term += all;
+                            }
+                        }
+
+                        statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                        statsInfo.activity.all += all;
                         break;
                         break;
                     case "Homework":
                     case "Homework":
+                        statsInfo.activity.year[dateOff.DayOfYear] += all;
+                        statsInfo.activity.homework += all;
+                        statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
+                        statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
+
+                        if (lastWeekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastWeekE)
+                        {
+                            var artWeek = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                            statsInfo.activity.lastWeek = ((int)artWeek.SubMatrix(weekDayS.DayOfYear, 7, 0, artWeek.ColumnCount).ColumnSums().Sum());
+                            //statsInfo.activity.lastWeek = ((int)statsInfo.activity.year.GetRange(weekDayS.DayOfYear, 7).Sum());
+                        }
 
 
+                        if (weekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= weekE)
+                            statsInfo.activity.week += all;
+
+                        if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
+                        {
+                            if (lTermDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                if (lastSts.Status == 200)
+                                {
+                                    using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                    var tempSts = fileJson.ToObject<StatsInfo>();
+                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                    statsInfo.activity.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                                }
+                                else
+                                    statsInfo.activity.lastTerm = 0;
+                            }
+                        }
+
+                        if (termS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= termE)
+                        {
+                            if (termDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                if (lastSts.Status == 200)
+                                {
+                                    using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                    var tempSts = fileJson.ToObject<StatsInfo>();
+                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                    statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                                }
+                                else
+                                    statsInfo.activity.term += all;
+                            }
+                        }
+
+                        statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                        statsInfo.activity.all += all;
                         break;
                         break;
                     case "Less":
                     case "Less":
 
 
+                        statsInfo.lesson.year[dateOff.DayOfYear] += all;
+                        statsInfo.lesson.lastDay = ((int)statsInfo.lesson.year[lastDay.DayOfYear]);
+                        statsInfo.lesson.day = ((int)statsInfo.lesson.year[dateOff.DayOfYear]);
+
+                        if (DayS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= DayE)
+                            statsInfo.lesson.dayInter += interaction.GetInt32();
+                        else
+                            statsInfo.lesson.dayInter = 0;
+
+                        if (monthS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= monthE)
+                            statsInfo.lesson.monthInter += interaction.GetInt32();
+                        else
+                            statsInfo.lesson.monthInter = 0;
+
+                        if (lastWeekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastWeekE)
+                        {
+                            var artWeek = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.lesson.year });
+                            statsInfo.lesson.lastWeek = ((int)artWeek.SubMatrix(weekDayS.DayOfYear, 7, 0, artWeek.ColumnCount).ColumnSums().Sum());
+                            //statsInfo.activity.lastWeek = ((int)statsInfo.activity.year.GetRange(weekDayS.DayOfYear, 7).Sum());
+                        }
+
+                        if (weekS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= weekE)
+                            statsInfo.activity.week += all;
+
+                        if (lastTermS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= lastTermE)
+                        {
+                            if (lTermDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                if (lastSts.Status == 200)
+                                {
+                                    using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                    var tempSts = fileJson.ToObject<StatsInfo>();
+                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.lesson.year, statsInfo.lesson.year });
+                                    statsInfo.lesson.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                                }
+                                else
+                                    statsInfo.lesson.lastTerm = 0;
+                            }
+                        }
+
+                        if (termS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= termE)
+                        {
+                            if (termDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                if (lastSts.Status == 200)
+                                {
+                                    using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                    var tempSts = fileJson.ToObject<StatsInfo>();
+                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.lesson.year, statsInfo.lesson.year });
+                                    statsInfo.lesson.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                                }
+                                else
+                                    statsInfo.lesson.term += all;
+                            }
+                        }
+
+                        statsInfo.lesson.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                        statsInfo.lesson.all += all;
                         break;
                         break;
                     case "stu":
                     case "stu":
+                        if (DayS <= statsInfo.stuUpTime && statsInfo.stuUpTime < DayE)
+                            statsInfo.dayStu += 1;
+                        else
+                            statsInfo.dayStu = 0;
 
 
+
+                        if (weekS <= statsInfo.stuUpTime && statsInfo.stuUpTime < weekE)
+                            statsInfo.weekStu += 1;
+                        else
+                            statsInfo.weekStu = 0;
+
+                        if (monthS <= statsInfo.stuUpTime && statsInfo.stuUpTime < monthE)
+                            statsInfo.monthStu += 1;
+                        else
+                            statsInfo.monthStu = 0;
+
+                        statsInfo.stuUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                        statsInfo.stu += all;
                         break;
                         break;
                     case "tch":
                     case "tch":
+                        if (DayS <= statsInfo.tchUpTime && statsInfo.tchUpTime < DayE)
+                            statsInfo.dayTch += 1;
+                        else
+                            statsInfo.dayTch = 0;
+
+                        if (weekS <= statsInfo.tchUpTime && statsInfo.tchUpTime < weekE)
+                            statsInfo.weekTch += 1;
+                        else
+                            statsInfo.weekTch = 0;
+
+                        if (monthS <= statsInfo.tchUpTime && statsInfo.tchUpTime < monthE)
+                            statsInfo.monthTch += 1;
+                        else
+                            statsInfo.monthTch = 0;
 
 
+                        statsInfo.tchUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                        statsInfo.stu += all;
+
+                        statsInfo.tch += all;
                         break;
                         break;
                 }
                 }
+
+                if (resStsInfo.Status == 200)
+                    statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, scId, new PartitionKey("Stats"));
+                else
+                    statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Stats"));
+
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {

+ 1 - 1
TEAMModelOS.SDK/Models/Cosmos/BI/BISchool/BIRelation.cs

@@ -17,7 +17,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI.BISchool
         public BIRelation()
         public BIRelation()
         {
         {
             code = "BIRel";
             code = "BIRel";
-            pk = "Stats";
+            pk = "Statistics";
         }
         }
         /// <summary>
         /// <summary>
         /// 学校名称
         /// 学校名称

+ 34 - 9
TEAMModelOS.SDK/Models/Cosmos/BI/StatsInfo.cs

@@ -8,16 +8,18 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
 {
 {
     public class StatsInfo : CosmosEntity
     public class StatsInfo : CosmosEntity
     {
     {
-        //id  学校id
-        //pk   Stats
-        //code Stats
+        //id   2022-hbcn  年份-学校id
+        //pk   Statistics
+        //code Statistics
         ///code   Stats-hbcn  Stats-学校id   Stats-学区id    暂未启用
         ///code   Stats-hbcn  Stats-学校id   Stats-学区id    暂未启用
         public StatsInfo()
         public StatsInfo()
         {
         {
-            pk = "Stats";
-            code = "Stats";
+            pk = "Statistics";
+            code = "Statistics";
         }
         }
 
 
+        public string schoolId { get; set; }
+        public int year { get; set; }
         /// <summary>
         /// <summary>
         /// 学校头像
         /// 学校头像
         /// </summary>
         /// </summary>
@@ -57,7 +59,10 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// 本月新增教师
         /// 本月新增教师
         /// </summary>
         /// </summary>
         public int monthTch { get; set; }
         public int monthTch { get; set; }
-
+        /// <summary>
+        /// 教师更新时间
+        /// </summary>
+        public long tchUpTime { get; set; }
         /// <summary>
         /// <summary>
         /// 学生总数
         /// 学生总数
         /// </summary>
         /// </summary>
@@ -78,6 +83,10 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// </summary>
         /// </summary>
         public int monthStu { get; set; }
         public int monthStu { get; set; }
 
 
+        /// <summary>
+        /// 学生信息更新时间
+        /// </summary>
+        public long stuUpTime { get; set; }
         /// <summary>
         /// <summary>
         /// 教室数
         /// 教室数
         /// </summary>
         /// </summary>
@@ -197,13 +206,18 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// <summary>
         /// <summary>
         /// 去年每天的数据  366天
         /// 去年每天的数据  366天
         /// </summary>
         /// </summary>
-        public List<double> LastYear { get; set; } = new List<double>();
+        //public List<double> LastYear { get; set; } = new List<double>();
 
 
         /// <summary>
         /// <summary>
         /// 今年每天的数据 366天
         /// 今年每天的数据 366天
         /// </summary>
         /// </summary>
         public List<double> year { get; set; } = new List<double>();
         public List<double> year { get; set; } = new List<double>();
 
 
+        /// <summary>
+        /// 更新数据时间
+        /// </summary>
+        public long upTime { get; set; }
+
     }
     }
 
 
     /// <summary>
     /// <summary>
@@ -214,7 +228,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// <summary>
         /// <summary>
         /// 所有活动总数
         /// 所有活动总数
         /// </summary>
         /// </summary>
-        public int cnt { get; set; }
+        public int all { get; set; }
         /// <summary>
         /// <summary>
         /// 评测活动总数
         /// 评测活动总数
         /// </summary>
         /// </summary>
@@ -258,11 +272,17 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// <summary>
         /// <summary>
         /// 去年活动 366个天
         /// 去年活动 366个天
         /// </summary>
         /// </summary>
-        public List<double> LastYear { get; set; } = new List<double>();
+        //public List<double> LastYear { get; set; } = new List<double>();
+
         /// <summary>
         /// <summary>
         /// 今年活动 366个天
         /// 今年活动 366个天
         /// </summary>
         /// </summary>
         public List<double> year { get; set; } = new List<double>();
         public List<double> year { get; set; } = new List<double>();
+
+        /// <summary>
+        /// 活动更新数据时间
+        /// </summary>
+        public long upTime { get; set; }
     }
     }
 
 
     /// <summary>
     /// <summary>
@@ -302,6 +322,11 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// 完成的研修人数
         /// 完成的研修人数
         /// </summary>
         /// </summary>
         public int finish { get; set; }
         public int finish { get; set; }
+
+        /// <summary>
+        /// 研修更新数据时间
+        /// </summary>
+        public long upTime { get; set; }
     }
     }
 
 
 
 

+ 22 - 9
TEAMModelOS.SDK/Models/Service/BI/BICommonWay.cs

@@ -40,7 +40,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         /// <param name="condName"></param>
         /// <param name="condName"></param>
         /// <param name="scIds"></param>
         /// <param name="scIds"></param>
         /// <returns></returns>
         /// <returns></returns>
-        public static string ManyScSql(string condName, List<string> scIds) 
+        public static string ManyScSql(string condName, List<string> scIds, string addStr = null)
         {
         {
             StringBuilder scSql = new();
             StringBuilder scSql = new();
             if (scIds.Count > 0)
             if (scIds.Count > 0)
@@ -49,9 +49,20 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                 for (int i = 0; i < scIds.Count; i++)
                 for (int i = 0; i < scIds.Count; i++)
                 {
                 {
                     if (i == scIds.Count - 1)
                     if (i == scIds.Count - 1)
-                        scSql.Append($"'{scIds[i]}'");
+                    {
+                        if (string.IsNullOrEmpty(addStr))
+                            scSql.Append($"'{scIds[i]}'");
+                        else
+                            scSql.Append($"'{addStr}{scIds[i]}'");
+                    }
                     else
                     else
-                        scSql.Append($"'{scIds[i]}',");
+                    {
+                        if (string.IsNullOrEmpty(addStr))
+                            scSql.Append($"'{scIds[i]}',");
+                        else
+                            scSql.Append($"'{addStr}{scIds[i]}',");
+                    }
+
                 }
                 }
                 scSql.Append($" )");
                 scSql.Append($" )");
             }
             }
@@ -67,14 +78,16 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         public static List<double> ManyDoubleMerge(List<List<double>> doubles)
         public static List<double> ManyDoubleMerge(List<List<double>> doubles)
         {
         {
             List<double> retDou = new();
             List<double> retDou = new();
-            var artYear = DenseMatrix.OfColumns(doubles);
-            //var rc = artYear.RowCount;
-            var cc = artYear.ColumnCount;
-            for (int i = 0; i < artYear.RowCount; i++)
+            if (doubles.Count > 0) 
             {
             {
-                retDou.Add(artYear.SubMatrix(i, 1, 0, cc).ColumnSums().Sum());
+                var artYear = DenseMatrix.OfColumns(doubles);
+                //var rc = artYear.RowCount;
+                var cc = artYear.ColumnCount;
+                for (int i = 0; i < artYear.RowCount; i++)
+                {
+                    retDou.Add(artYear.SubMatrix(i, 1, 0, cc).ColumnSums().Sum());
+                }
             }
             }
-
             return retDou;
             return retDou;
         }
         }
 
 

+ 404 - 0
TEAMModelOS.SDK/Models/Service/BI/BIStats.cs

@@ -0,0 +1,404 @@
+using Azure.Cosmos;
+using MathNet.Numerics.LinearAlgebra.Double;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.Json;
+using System.Threading.Tasks;
+using TEAMModelOS.SDK.Context.Constant;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.SDK.Models.Cosmos.BI;
+
+namespace TEAMModelOS.SDK.Models.Service.BI
+{
+    public static class BIStats
+    {
+        /// <summary>
+        /// 依据类型增/减量统计方法
+        /// </summary>
+        /// <param name="cosmosClient">连接字符</param>
+        /// <param name="scId">学校id</param>
+        /// <param name="type">类型:Exam(测验) Survey(问卷调查) Vote(投票) Homework(作业)  Less(课例) Student(学生)  Tchaer(教师) </param>
+        /// <param name="count">增减数量 </param>
+        /// <param name="careDate">时间</param>
+        /// <param name="interaction">互动</param>
+        /// <returns></returns>
+        public static async Task SetTypeAddStats(CosmosClient cosmosClient,string scId,string type,int count,long careDate = 0,int interaction=0)
+        {
+            DateTimeOffset dateOff = DateTimeOffset.UtcNow;
+            if (careDate == 0)
+                careDate = dateOff.ToUnixTimeMilliseconds();
+
+            var (lastDayS, lastDayE) = TimeHelper.GetStartOrEnd(dateOff.AddDays(-1));//昨天开始/结束时间
+            var (DayS, DayE) = TimeHelper.GetStartOrEnd(dateOff);      //今天开始时间结束时间
+            var (lastWeekS, lastWeekE) = TimeHelper.GetStartOrEnd(dateOff, "lastweek");   //计算上周开始/结束时间
+            var (weekS, weekE) = TimeHelper.GetStartOrEnd(dateOff, "week");             //计算本周开始/结束时间
+            var (lastMonthS, lastMonthE) = TimeHelper.GetStartOrEnd(dateOff, "lastMonth");   //计算上月开始/结束时间
+            var (monthS, monthE) = TimeHelper.GetStartOrEnd(dateOff, "month");             //计算本月开始/结束时间
+            var (lastTermS, lastTermE) = TimeHelper.GetStartOrEnd(dateOff, "lastterm");   //计算上学期开始/结束时间
+            var (termS, termE) = TimeHelper.GetStartOrEnd(dateOff, "term");   //计算本学期开始/结束时间
+            var (lastYearS, lastYearE) = TimeHelper.GetStartOrEnd(dateOff, "lastYear"); //计算去年开始/结束时间
+            var (yearS, yearE) = TimeHelper.GetStartOrEnd(dateOff, "year");         //计算今年开始/结束时间
+
+            var (weekDayS, weekDayE) = TimeHelper.GetLongToTime(lastWeekS, lastWeekE);
+            var (lTermDayS, lTermDayE) = TimeHelper.GetLongToTime(lastTermS, lastTermE);
+            var (termDayS, termDayE) = TimeHelper.GetLongToTime(lastTermS, lastTermE);
+            var lastDay = dateOff.AddDays(-1);
+
+            StatsInfo statsInfo = new();
+            var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year}-{scId}", new PartitionKey("Statistics"));
+            if (resStsInfo.Status == 200)
+            {
+                using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
+                statsInfo = fileJson.ToObject<StatsInfo>();
+            }
+            else
+            {
+                ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<ScBase>(scId, new PartitionKey("Base"));
+
+                //var resLastStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
+                //if (resLastStsInfo.Status == 200)
+                //{
+                //    using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
+                //    statsInfo = fileJson.ToObject<StatsInfo>();
+                //    statsInfo.id = $"{dateOff.Year}-{scBase.id}";
+                //}
+                //else 
+                //{
+                statsInfo.id = $"{dateOff.Year}-{scBase.id}";
+                statsInfo.name = scBase.name;
+                statsInfo.picture = scBase.picture;
+                statsInfo.size = scBase.size;
+                statsInfo.scCreateTime = scBase.createTime;
+                statsInfo.areaId = scBase.areaId;
+                statsInfo.upTime = careDate;
+                //}
+            }
+
+            switch ($"{type}")
+            {
+                case "Exam":
+                    statsInfo.activity.year[dateOff.DayOfYear] += count;
+                    statsInfo.activity.exam += count;
+                    statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
+                    statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
+
+                    if (lastWeekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastWeekE)
+                    {
+                        var artWeek = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                        statsInfo.activity.lastWeek = ((int)artWeek.SubMatrix(weekDayS.DayOfYear, 7, 0, artWeek.ColumnCount).ColumnSums().Sum());
+                        //statsInfo.activity.lastWeek = ((int)statsInfo.activity.year.GetRange(weekDayS.DayOfYear, 7).Sum());
+                    }
+
+                    if (weekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= weekE)
+                        statsInfo.activity.week += count;
+
+                    if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
+                    {
+                        if (lTermDayS.Year < dateOff.Year)
+                        {
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            if (lastSts.Status == 200)
+                            {
+                                using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                var tempSts = fileJson.ToObject<StatsInfo>();
+                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                statsInfo.activity.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
+                            else
+                                statsInfo.activity.lastTerm = 0;
+                        }
+                    }
+
+                    if (termS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= termE)
+                    {
+                        if (termDayS.Year < dateOff.Year)
+                        {
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            if (lastSts.Status == 200)
+                            {
+                                using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                var tempSts = fileJson.ToObject<StatsInfo>();
+                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
+                            else
+                                statsInfo.activity.term += count;
+                        }
+                    }
+
+                    statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                    statsInfo.activity.all += count;
+                    break;
+                case "Survey":
+                    statsInfo.activity.year[dateOff.DayOfYear] += count;
+                    statsInfo.activity.survey += count;
+                    statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
+                    statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
+
+                    if (lastWeekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastWeekE)
+                    {
+                        var artWeek = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                        statsInfo.activity.lastWeek = ((int)artWeek.SubMatrix(weekDayS.DayOfYear, 7, 0, artWeek.ColumnCount).ColumnSums().Sum());
+                        //statsInfo.activity.lastWeek = ((int)statsInfo.activity.year.GetRange(weekDayS.DayOfYear, 7).Sum());
+                    }
+
+                    if (weekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= weekE)
+                        statsInfo.activity.week += count;
+
+                    if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
+                    {
+                        if (lTermDayS.Year < dateOff.Year)
+                        {
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            if (lastSts.Status == 200)
+                            {
+                                using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                var tempSts = fileJson.ToObject<StatsInfo>();
+                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                statsInfo.activity.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
+                            else
+                                statsInfo.activity.lastTerm = 0;
+                        }
+                    }
+
+                    if (termS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= termE)
+                    {
+                        if (termDayS.Year < dateOff.Year)
+                        {
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            if (lastSts.Status == 200)
+                            {
+                                using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                var tempSts = fileJson.ToObject<StatsInfo>();
+                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
+                            else
+                                statsInfo.activity.term += count;
+                        }
+                    }
+
+                    statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                    statsInfo.activity.all += count;
+                    break;
+                case "Vote":
+                    statsInfo.activity.year[dateOff.DayOfYear] += count;
+                    statsInfo.activity.vote += count;
+                    statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
+                    statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
+
+                    if (lastWeekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastWeekE)
+                    {
+                        var artWeek = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                        statsInfo.activity.lastWeek = ((int)artWeek.SubMatrix(weekDayS.DayOfYear, 7, 0, artWeek.ColumnCount).ColumnSums().Sum());
+                        //statsInfo.activity.lastWeek = ((int)statsInfo.activity.year.GetRange(weekDayS.DayOfYear, 7).Sum());
+                    }
+
+                    if (weekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= weekE)
+                        statsInfo.activity.week += count;
+
+                    if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
+                    {
+                        if (lTermDayS.Year < dateOff.Year)
+                        {
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            if (lastSts.Status == 200)
+                            {
+                                using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                var tempSts = fileJson.ToObject<StatsInfo>();
+                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                statsInfo.activity.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
+                            else
+                                statsInfo.activity.lastTerm = 0;
+                        }
+                    }
+
+                    if (termS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= termE)
+                    {
+                        if (termDayS.Year < dateOff.Year)
+                        {
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            if (lastSts.Status == 200)
+                            {
+                                using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                var tempSts = fileJson.ToObject<StatsInfo>();
+                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
+                            else
+                                statsInfo.activity.term += count;
+                        }
+                    }
+
+                    statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                    statsInfo.activity.all += count;
+                    break;
+                case "Homework":
+                    statsInfo.activity.year[dateOff.DayOfYear] += count;
+                    statsInfo.activity.homework += count;
+                    statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
+                    statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
+
+                    if (lastWeekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastWeekE)
+                    {
+                        var artWeek = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                        statsInfo.activity.lastWeek = ((int)artWeek.SubMatrix(weekDayS.DayOfYear, 7, 0, artWeek.ColumnCount).ColumnSums().Sum());
+                        //statsInfo.activity.lastWeek = ((int)statsInfo.activity.year.GetRange(weekDayS.DayOfYear, 7).Sum());
+                    }
+
+                    if (weekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= weekE)
+                        statsInfo.activity.week += count;
+
+                    if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
+                    {
+                        if (lTermDayS.Year < dateOff.Year)
+                        {
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            if (lastSts.Status == 200)
+                            {
+                                using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                var tempSts = fileJson.ToObject<StatsInfo>();
+                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                statsInfo.activity.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
+                            else
+                                statsInfo.activity.lastTerm = 0;
+                        }
+                    }
+
+                    if (termS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= termE)
+                    {
+                        if (termDayS.Year < dateOff.Year)
+                        {
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            if (lastSts.Status == 200)
+                            {
+                                using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                var tempSts = fileJson.ToObject<StatsInfo>();
+                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.activity.year, statsInfo.activity.year });
+                                statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
+                            else
+                                statsInfo.activity.term += count;
+                        }
+                    }
+
+                    statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                    statsInfo.activity.all += count;
+                    break;
+                case "Less":
+
+                    statsInfo.lesson.year[dateOff.DayOfYear] += count;
+                    statsInfo.lesson.lastDay = ((int)statsInfo.lesson.year[lastDay.DayOfYear]);
+                    statsInfo.lesson.day = ((int)statsInfo.lesson.year[dateOff.DayOfYear]);
+
+                    if (DayS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= DayE)
+                        statsInfo.lesson.dayInter += interaction;
+                    else
+                        statsInfo.lesson.dayInter = 0;
+
+                    if (monthS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= monthE)
+                        statsInfo.lesson.monthInter += interaction;
+                    else
+                        statsInfo.lesson.monthInter = 0;
+
+                    if (lastWeekS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastWeekE)
+                    {
+                        var artWeek = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.lesson.year });
+                        statsInfo.lesson.lastWeek = ((int)artWeek.SubMatrix(weekDayS.DayOfYear, 7, 0, artWeek.ColumnCount).ColumnSums().Sum());
+                        //statsInfo.activity.lastWeek = ((int)statsInfo.activity.year.GetRange(weekDayS.DayOfYear, 7).Sum());
+                    }
+
+                    if (weekS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= weekE)
+                        statsInfo.activity.week += count;
+
+                    if (lastTermS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= lastTermE)
+                    {
+                        if (lTermDayS.Year < dateOff.Year)
+                        {
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            if (lastSts.Status == 200)
+                            {
+                                using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                var tempSts = fileJson.ToObject<StatsInfo>();
+                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.lesson.year, statsInfo.lesson.year });
+                                statsInfo.lesson.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
+                            else
+                                statsInfo.lesson.lastTerm = 0;
+                        }
+                    }
+
+                    if (termS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= termE)
+                    {
+                        if (termDayS.Year < dateOff.Year)
+                        {
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            if (lastSts.Status == 200)
+                            {
+                                using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                var tempSts = fileJson.ToObject<StatsInfo>();
+                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { tempSts.lesson.year, statsInfo.lesson.year });
+                                statsInfo.lesson.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
+                            else
+                                statsInfo.lesson.term += count;
+                        }
+                    }
+
+                    statsInfo.lesson.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                    statsInfo.lesson.all += count;
+                    break;
+                case "Student":
+                    if (DayS <= statsInfo.stuUpTime && statsInfo.stuUpTime < DayE)
+                        statsInfo.dayStu += count;
+                    else
+                        statsInfo.dayStu = 0;
+
+
+                    if (weekS <= statsInfo.stuUpTime && statsInfo.stuUpTime < weekE)
+                        statsInfo.weekStu += count;
+                    else
+                        statsInfo.weekStu = 0;
+
+                    if (monthS <= statsInfo.stuUpTime && statsInfo.stuUpTime < monthE)
+                        statsInfo.monthStu += count;
+                    else
+                        statsInfo.monthStu = 0;
+
+                    statsInfo.stuUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                    statsInfo.stu += count;
+                    break;
+                case "Teacher":
+                    if (DayS <= statsInfo.tchUpTime && statsInfo.tchUpTime < DayE)
+                        statsInfo.dayTch += count;
+                    else
+                        statsInfo.dayTch = 0;
+
+                    if (weekS <= statsInfo.tchUpTime && statsInfo.tchUpTime < weekE)
+                        statsInfo.weekTch += count;
+                    else
+                        statsInfo.weekTch = 0;
+
+                    if (monthS <= statsInfo.tchUpTime && statsInfo.tchUpTime < monthE)
+                        statsInfo.monthTch += count;
+                    else
+                        statsInfo.monthTch = 0;
+
+                    statsInfo.tchUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                    statsInfo.tch += count;
+                    break;
+            }
+
+            if (resStsInfo.Status == 200)
+                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, scId, new PartitionKey("Stats"));
+            else
+                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Stats"));            
+        }
+    }
+}

+ 23 - 0
TEAMModelOS.SDK/Models/Service/BI/TimeHelper.cs

@@ -21,6 +21,29 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         /// </summary>
         /// </summary>
         public static List<int> leapY = new() { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
         public static List<int> leapY = new() { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 
 
+
+        /// <summary>
+        /// 将时间戳转换成时间
+        /// </summary>
+        /// <param name="dateS"></param>
+        /// <param name="dateE"></param>
+        /// <returns></returns>
+        public static (DateTimeOffset timeS, DateTimeOffset timeE) GetLongToTime(long dateS,long dateE)
+        {
+            DateTimeOffset timeS = new(), timeE = new();
+            if (dateS > 1000000000000)
+                timeS = DateTimeOffset.FromUnixTimeMilliseconds(dateS);
+            else
+                timeS = DateTimeOffset.FromUnixTimeSeconds(dateS);
+
+            if (dateE > 1000000000000)
+                timeE = DateTimeOffset.FromUnixTimeMilliseconds(dateE);
+            else
+                timeE = DateTimeOffset.FromUnixTimeSeconds(dateE);
+
+            return (timeS, timeE);
+        }
+
         /// <summary>
         /// <summary>
         /// 通过时间戳转换为时间
         /// 通过时间戳转换为时间
         /// </summary>
         /// </summary>

+ 9 - 9
TEAMModelOS.SDK/Models/Service/BIStatsWay/ActivityStatsWay.cs

@@ -140,14 +140,13 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
 
 
             if (tempAll.Count > 0)
             if (tempAll.Count > 0)
             {
             {
-
-                for (int i = 0; i < leveryDay.Count; i++)
-                {
-                    if (actStats.LastYear.Count == 366)
-                        actStats.LastYear[i] = (double)tempAll.FindAll(f => (f.createTime >= leveryDay[i].start && f.createTime <= leveryDay[i].end)).Count;
-                    else
-                        actStats.LastYear.Add((double)tempAll.FindAll(f => (f.createTime >= leveryDay[i].start && f.createTime <= leveryDay[i].end)).Count);
-                }
+                //for (int i = 0; i < leveryDay.Count; i++)
+                //{
+                //    if (actStats.LastYear.Count == 366)
+                //        actStats.LastYear[i] = (double)tempAll.FindAll(f => (f.createTime >= leveryDay[i].start && f.createTime <= leveryDay[i].end)).Count;
+                //    else
+                //        actStats.LastYear.Add((double)tempAll.FindAll(f => (f.createTime >= leveryDay[i].start && f.createTime <= leveryDay[i].end)).Count);
+                //}
 
 
                 for (int i = 0; i < everyDay.Count; i++)
                 for (int i = 0; i < everyDay.Count; i++)
                 {
                 {
@@ -207,7 +206,7 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             //            break;
             //            break;
             //    }
             //    }
             //}
             //}
-            actStats.cnt = (exam + survey + vote + homework);
+            actStats.all = (exam + survey + vote + homework);
             actStats.exam = exam;
             actStats.exam = exam;
             actStats.survey = survey;
             actStats.survey = survey;
             actStats.vote = vote;
             actStats.vote = vote;
@@ -218,6 +217,7 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             actStats.week = week;
             actStats.week = week;
             actStats.lastTerm = lastTerm;
             actStats.lastTerm = lastTerm;
             actStats.term = term;
             actStats.term = term;
+            actStats.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
 
 
             return actStats;
             return actStats;
         }
         }

+ 8 - 8
TEAMModelOS.SDK/Models/Service/BIStatsWay/LessonRecordStatsWay.cs

@@ -70,13 +70,13 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             List<StartEndTime> leveryDay = TimeHelper.GetYearEveryDay(lyearDay);
             List<StartEndTime> leveryDay = TimeHelper.GetYearEveryDay(lyearDay);
             List<StartEndTime> everyDay = TimeHelper.GetYearEveryDay(DateTimeOffset.UtcNow);
             List<StartEndTime> everyDay = TimeHelper.GetYearEveryDay(DateTimeOffset.UtcNow);
 
 
-            for (int i = 0; i < leveryDay.Count; i++)
-            {
-                if (lessStats.LastYear.Count == 366)
-                    lessStats.LastYear[i] = (double)lessRelStats.FindAll(f => (f.startTime >= leveryDay[i].start && f.startTime <= leveryDay[i].end)).Count;
-                else
-                    lessStats.LastYear.Add((double)lessRelStats.FindAll(f => (f.startTime >= leveryDay[i].start && f.startTime <= leveryDay[i].end)).Count);
-            }
+            //for (int i = 0; i < leveryDay.Count; i++)
+            //{
+            //    if (lessStats.LastYear.Count == 366)
+            //        lessStats.LastYear[i] = (double)lessRelStats.FindAll(f => (f.startTime >= leveryDay[i].start && f.startTime <= leveryDay[i].end)).Count;
+            //    else
+            //        lessStats.LastYear.Add((double)lessRelStats.FindAll(f => (f.startTime >= leveryDay[i].start && f.startTime <= leveryDay[i].end)).Count);
+            //}
 
 
             for (int i = 0; i < everyDay.Count; i++)
             for (int i = 0; i < everyDay.Count; i++)
             {
             {
@@ -124,7 +124,7 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
 
 
             //string yearInterSql = $"{InterSql} and c.startTime >= {yearS} and c.startTime <= {yearE}";
             //string yearInterSql = $"{InterSql} and c.startTime >= {yearS} and c.startTime <= {yearE}";
             //lessStats.yearInter = await JointlySingleQuery.GetValueInt(cosmosClient, "School", yearInterSql, code: $"LessonRecord-{id}");
             //lessStats.yearInter = await JointlySingleQuery.GetValueInt(cosmosClient, "School", yearInterSql, code: $"LessonRecord-{id}");
-
+            lessStats.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); 
 
 
             return lessStats;
             return lessStats;
         }
         }

+ 17 - 14
TEAMModelOS.SDK/Models/Service/BIStatsWay/SchoolStatsWay.cs

@@ -28,9 +28,8 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
         /// <returns></returns>
         /// <returns></returns>
         public static async Task<StatsInfo> GetSingleSc(CosmosClient cosmosClient, string scId)
         public static async Task<StatsInfo> GetSingleSc(CosmosClient cosmosClient, string scId)
         {
         {
-            StatsInfo statsInfo = new() { id = $"{scId}" };
-
             DateTimeOffset dateTime = DateTimeOffset.UtcNow;
             DateTimeOffset dateTime = DateTimeOffset.UtcNow;
+            StatsInfo statsInfo = new() { id = $"{dateTime.Year}-{scId}" };
             var (dayS, dayE) = TimeHelper.GetStartOrEnd(dateTime);  //今天开始时间    13位
             var (dayS, dayE) = TimeHelper.GetStartOrEnd(dateTime);  //今天开始时间    13位
             var (lastWeekS, lastWeekE) = TimeHelper.GetStartOrEnd(dateTime, "lastweek");   //计算上周开始/结束时间
             var (lastWeekS, lastWeekE) = TimeHelper.GetStartOrEnd(dateTime, "lastweek");   //计算上周开始/结束时间
             var (weekS, weekE) = TimeHelper.GetStartOrEnd(dateTime, "week");             //计算本周开始/结束时间
             var (weekS, weekE) = TimeHelper.GetStartOrEnd(dateTime, "week");             //计算本周开始/结束时间
@@ -49,7 +48,8 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             string weekWhereSql = $"c.createTime >= {weekS} and c.createTime <= {weekE}";
             string weekWhereSql = $"c.createTime >= {weekS} and c.createTime <= {weekE}";
             string monthWhereSql = $"c.createTime >= {mthS} and c.createTime <= {mthE}";
             string monthWhereSql = $"c.createTime >= {mthS} and c.createTime <= {mthE}";
 
 
-            ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<ScBase>(statsInfo.id, new PartitionKey("Base"));
+            ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<ScBase>(scId, new PartitionKey("Base"));
+            statsInfo.schoolId = scBase.id;
             statsInfo.name = scBase.name;
             statsInfo.name = scBase.name;
             statsInfo.picture = scBase.picture;
             statsInfo.picture = scBase.picture;
             statsInfo.size = scBase.size;
             statsInfo.size = scBase.size;
@@ -61,11 +61,13 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             statsInfo.dayTch = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{tchSql} and {dayWhereSql} ", code: $"Teacher-{scBase.id}");
             statsInfo.dayTch = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{tchSql} and {dayWhereSql} ", code: $"Teacher-{scBase.id}");
             statsInfo.weekTch = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{tchSql} and  {weekWhereSql}", code: $"Teacher-{scBase.id}");
             statsInfo.weekTch = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{tchSql} and  {weekWhereSql}", code: $"Teacher-{scBase.id}");
             statsInfo.monthTch = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{tchSql} and  {monthWhereSql}", code: $"Teacher-{scBase.id}");
             statsInfo.monthTch = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{tchSql} and  {monthWhereSql}", code: $"Teacher-{scBase.id}");
+            statsInfo.tchUpTime = dateTime.ToUnixTimeMilliseconds();
 
 
             statsInfo.stu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", currSql, code: $"Base-{scBase.id}");
             statsInfo.stu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", currSql, code: $"Base-{scBase.id}");
             statsInfo.dayStu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", $"{currSql} where {dayWhereSql}", code: $"Base-{scBase.id}");
             statsInfo.dayStu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", $"{currSql} where {dayWhereSql}", code: $"Base-{scBase.id}");
             statsInfo.weekStu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", $"{currSql} where {weekWhereSql}", code: $"Base-{scBase.id}");
             statsInfo.weekStu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", $"{currSql} where {weekWhereSql}", code: $"Base-{scBase.id}");
             statsInfo.monthStu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", $"{currSql} where {monthWhereSql}", code: $"Base-{scBase.id}");
             statsInfo.monthStu = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", $"{currSql} where {monthWhereSql}", code: $"Base-{scBase.id}");
+            statsInfo.stuUpTime = dateTime.ToUnixTimeMilliseconds();
 
 
             statsInfo.room = await JointlySingleQuery.GetValueInt(cosmosClient, "School", currSql, code: $"Room-{scBase.id}");
             statsInfo.room = await JointlySingleQuery.GetValueInt(cosmosClient, "School", currSql, code: $"Room-{scBase.id}");
             statsInfo.witRoom = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{currSql} where (c.serial != null or c.serial != '' or IS_DEFINED(c.serial) = true)", code: $"Room-{scBase.id}");
             statsInfo.witRoom = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{currSql} where (c.serial != null or c.serial != '' or IS_DEFINED(c.serial) = true)", code: $"Room-{scBase.id}");
@@ -73,9 +75,9 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             //statsInfo.lesson = 
             //statsInfo.lesson = 
 
 
             statsInfo.upTime = dateTime.ToUnixTimeMilliseconds();
             statsInfo.upTime = dateTime.ToUnixTimeMilliseconds();
-            statsInfo.lesson = await LessonRecordStatsWay.GetSchoolAll(cosmosClient, statsInfo.id);
-            statsInfo.activity = await ActivityStatsWay.GetSchoolAll(cosmosClient, statsInfo.id);
-            statsInfo.study = await StudyStatsWay.GetSchoolAll(cosmosClient, statsInfo.id);
+            statsInfo.lesson = await LessonRecordStatsWay.GetSchoolAll(cosmosClient, statsInfo.schoolId);
+            statsInfo.activity = await ActivityStatsWay.GetSchoolAll(cosmosClient, statsInfo.schoolId);
+            statsInfo.study = await StudyStatsWay.GetSchoolAll(cosmosClient, statsInfo.schoolId);
 
 
             return statsInfo;
             return statsInfo;
         }
         }
@@ -94,10 +96,11 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
         {
         {
             StatsInfo areaInfo = new()
             StatsInfo areaInfo = new()
             {
             {
-                id = area == null ? "" : area.id,
-                pk = "Stats",
-                code = "Stats",
+                id = area == null ? "" : $"{DateTimeOffset.UtcNow.Year}-{area.id}",
+                pk = "Statistics",
+                code = "Statistics",
                 name = area == null ? "" : area.name,
                 name = area == null ? "" : area.name,
+                areaId = area == null ? "" :area.id,
                 picture = "",
                 picture = "",
                 tch = statsInfos.Select(s => s.tch).Sum(),
                 tch = statsInfos.Select(s => s.tch).Sum(),
                 dayTch = statsInfos.Select(s => s.dayTch).Sum(),
                 dayTch = statsInfos.Select(s => s.dayTch).Sum(),
@@ -126,11 +129,11 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             areaInfo.lesson.monthInter = statsInfos.Select(s => s.lesson.monthInter).Sum();
             areaInfo.lesson.monthInter = statsInfos.Select(s => s.lesson.monthInter).Sum();
             areaInfo.lesson.lastYearInter = statsInfos.Select(s => s.lesson.lastYearInter).Sum();
             areaInfo.lesson.lastYearInter = statsInfos.Select(s => s.lesson.lastYearInter).Sum();
             areaInfo.lesson.yearInter = statsInfos.Select(s => s.lesson.yearInter).Sum();
             areaInfo.lesson.yearInter = statsInfos.Select(s => s.lesson.yearInter).Sum();
-            areaInfo.lesson.LastYear = BICommonWay.ManyDoubleMerge(statsInfos.Select(s => s.lesson.LastYear).ToList());
-            areaInfo.lesson.year = BICommonWay.ManyDoubleMerge(statsInfos.Select(s => s.lesson.year).ToList());
+            //areaInfo.lesson.LastYear = BICommonWay.ManyDoubleMerge(statsInfos.Select(s => s.lesson.LastYear).ToList());
+            areaInfo.lesson.year = BICommonWay.ManyDoubleMerge(statsInfos.Select(s => s.lesson.year).Where(w => w.Count > 0).ToList());
 
 
 
 
-            areaInfo.activity.cnt = statsInfos.Select(s => s.activity.cnt).Sum();
+            areaInfo.activity.all = statsInfos.Select(s => s.activity.all).Sum();
             areaInfo.activity.exam = statsInfos.Select(s => s.activity.exam).Sum();
             areaInfo.activity.exam = statsInfos.Select(s => s.activity.exam).Sum();
             areaInfo.activity.survey = statsInfos.Select(s => s.activity.survey).Sum();
             areaInfo.activity.survey = statsInfos.Select(s => s.activity.survey).Sum();
             areaInfo.activity.vote = statsInfos.Select(s => s.activity.vote).Sum();
             areaInfo.activity.vote = statsInfos.Select(s => s.activity.vote).Sum();
@@ -141,8 +144,8 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             areaInfo.activity.week = statsInfos.Select(s => s.activity.week).Sum();
             areaInfo.activity.week = statsInfos.Select(s => s.activity.week).Sum();
             areaInfo.activity.lastTerm = statsInfos.Select(s => s.activity.lastTerm).Sum();
             areaInfo.activity.lastTerm = statsInfos.Select(s => s.activity.lastTerm).Sum();
             areaInfo.activity.term = statsInfos.Select(s => s.activity.term).Sum();
             areaInfo.activity.term = statsInfos.Select(s => s.activity.term).Sum();
-            areaInfo.activity.LastYear = BICommonWay.ManyDoubleMerge(statsInfos.Select(s => s.activity.LastYear).ToList());
-            areaInfo.activity.year = BICommonWay.ManyDoubleMerge(statsInfos.Select(s => s.activity.year).ToList());
+            //areaInfo.activity.LastYear = BICommonWay.ManyDoubleMerge(statsInfos.Select(s => s.activity.LastYear).ToList());
+            areaInfo.activity.year = BICommonWay.ManyDoubleMerge(statsInfos.Select(s => s.activity.year).Where(w => w.Count > 0).ToList());
 
 
             //List<Task<ItemResponse<StatsInfo>>> taskStatsInfos = new();
             //List<Task<ItemResponse<StatsInfo>>> taskStatsInfos = new();
 
 

+ 2 - 0
TEAMModelOS.SDK/Models/Service/BIStatsWay/StudyStatsWay.cs

@@ -73,6 +73,8 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
                 else studyStats.ongoing++;
                 else studyStats.ongoing++;
             });
             });
 
 
+            studyStats.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+
             return studyStats;
             return studyStats;
         }
         }
     }
     }