Browse Source

1、把优化学校统计从School容器移植到common容器中
2、BI修改学校时未触发Funtion 的情况,并改为静态方法。

Li 2 years ago
parent
commit
a1fb2cd4b4

+ 4 - 1
TEAMModelBI/Controllers/BINormal/AreaRelevantController.cs

@@ -21,6 +21,7 @@ using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
+using TEAMModelOS.SDK.Models.Service.BI;
 
 namespace TEAMModelBI.Controllers.BINormal
 {
@@ -208,7 +209,9 @@ namespace TEAMModelBI.Controllers.BINormal
                 School school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(tempSchool, tempSchool.id, new PartitionKey("Base"));
 
                 //创建/修改学校信息中间件
-                _ = _httpTrigger.RequestHttpTrigger(new { school = $"{school}" }, _option.Location, "set-sc-birelation");
+                //_ = _httpTrigger.RequestHttpTrigger(new { school = $"{school}" }, _option.Location, "set-sc-birelation");
+                await BIStats.SetSchoolBIRelation(cosmosClient, blobClient, tableClient, _dingDing, school);
+
                 //保存操作记录
                 await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, "school-update", $"{_tmdName}【{_tmdId}】已操作学校(ID:{schoolId})移除已区域(ID:{areaId})", _dingDing, httpContext: HttpContext);
                 return Ok(new { state = 200, school });

+ 5 - 2
TEAMModelBI/Controllers/BISchool/BatchSchoolController.cs

@@ -226,7 +226,9 @@ namespace TEAMModelBI.Controllers.BISchool
                             //创建学校
                             await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<School>(upSchool, new PartitionKey(upSchool.code));
                             //创建学校信息中间件
-                            _ = _httpTrigger.RequestHttpTrigger(new { school = $"{upSchool}" }, _option.Location, "set-sc-birelation");
+                            //_ = _httpTrigger.RequestHttpTrigger(new { school = $"{upSchool}" }, _option.Location, "set-sc-birelation");
+                            await BIStats.SetSchoolBIRelation(cosmosClient, blobClient, tableClient, _dingDing, upSchool);
+
                             //创建BI和统计信息
                             await BIStats.SetScStatsInfo(cosmosClient, upSchool);
 
@@ -1083,7 +1085,8 @@ namespace TEAMModelBI.Controllers.BISchool
                     await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(tempShool, tempShool.id, new PartitionKey("Base"));
 
                     //创建学校信息中间件
-                    _ = _httpTrigger.RequestHttpTrigger(new { school = $"{tempShool}" }, _option.Location, "set-sc-birelation");
+                    //_ = _httpTrigger.RequestHttpTrigger(new { school = $"{tempShool}" }, _option.Location, "set-sc-birelation");
+                    await BIStats.SetSchoolBIRelation(cosmosClient, blobClient, tableClient, _dingDing, tempShool);
 
                     //修改学校教师关联的信息
                     string sql = $"SELECT distinct value(c) FROM c join A1 in c.schools where A1.schoolId='{tempShool.id}'";

+ 10 - 10
TEAMModelBI/Controllers/BITest/TestController.cs

@@ -1805,7 +1805,7 @@ namespace TEAMModelBI.Controllers.BITest
             int lmthDay = TimeHelper.GetDateDay(lMonthE);
             StatsInfo statsInfo = new();
 
-            var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year}-{scId}", new PartitionKey("Statistics"));
+            var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year}-{scId}", new PartitionKey("Statistics"));
             if (resStsInfo.Status == 200)
             {
                 using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
@@ -1813,7 +1813,7 @@ namespace TEAMModelBI.Controllers.BITest
             }
             else
             {
-                var resLastStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
+                var resLastStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
                 if (resLastStsInfo.Status == 200)
                 {
                     using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
@@ -1828,7 +1828,7 @@ namespace TEAMModelBI.Controllers.BITest
                 }
                 else
                 {
-                    ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<ScBase>(scId, new PartitionKey("Base"));
+                    ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ScBase>(scId, new PartitionKey("Base"));
                     statsInfo.id = $"{dateOff.Year}-{scBase.id}";
                     statsInfo.schoolId = scBase.id;
                     statsInfo.name = scBase.name;
@@ -1875,7 +1875,7 @@ namespace TEAMModelBI.Controllers.BITest
                     {
                         if (lTermDayS.Year < dateOff.Year)
                         {
-                            var lastLessSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            var lastLessSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
                             if (lastLessSts.Status == 200)
                             {
                                 using var fileJson = await JsonDocument.ParseAsync(lastLessSts.ContentStream);
@@ -1890,7 +1890,7 @@ namespace TEAMModelBI.Controllers.BITest
                     {
                         if (termDayS.Year < dateOff.Year)
                         {
-                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
                             if (lastSts.Status == 200)
                             {
                                 using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
@@ -1920,7 +1920,7 @@ namespace TEAMModelBI.Controllers.BITest
                     {
                         if (lTermDayS.Year < dateOff.Year)
                         {
-                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
                             if (lastSts.Status == 200)
                             {
                                 using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
@@ -1972,7 +1972,7 @@ namespace TEAMModelBI.Controllers.BITest
                 {
                     if (lTermDayS.Year < dateOff.Year)
                     {
-                        var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                        var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
                         if (lastSts.Status == 200)
                         {
                             using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
@@ -1989,7 +1989,7 @@ namespace TEAMModelBI.Controllers.BITest
                 {
                     if (termDayS.Year < dateOff.Year)
                     {
-                        var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                        var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
                         if (lastSts.Status == 200)
                         {
                             using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
@@ -2013,9 +2013,9 @@ namespace TEAMModelBI.Controllers.BITest
             }
 
             if (resStsInfo.Status == 200)
-                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, scId, new PartitionKey("Statistics"));
+                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<StatsInfo>(statsInfo, scId, new PartitionKey("Statistics"));
             else
-                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics"));
+                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics"));
 
             return Ok(new { state = 200, statsInfo });
         }

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

@@ -526,7 +526,7 @@ namespace TEAMModelBI.Controllers.Census
             {
                 bool isExist = true;
                 StatsInfo statsInfo = new();
-                var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{DateTimeOffset.UtcNow.Year}-{scId}", new PartitionKey("Statistics"));
+                var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{DateTimeOffset.UtcNow.Year}-{scId}", new PartitionKey("Statistics"));
                 if (scDataStats.Status == 200)
                 {
                     using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream);
@@ -539,7 +539,7 @@ namespace TEAMModelBI.Controllers.Census
                 }
 
                 List<LastYearLessAndAct> lastYear = new();
-                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LastYearLessAndAct>(queryText: $"select c.lesson,c.activity from c where c.id='{DateTimeOffset.UtcNow.Year - 1}-{scId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<LastYearLessAndAct>(queryText: $"select c.lesson,c.activity from c where c.id='{DateTimeOffset.UtcNow.Year - 1}-{scId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
                 {
                     lastYear.Add(item);
                 }
@@ -727,7 +727,7 @@ namespace TEAMModelBI.Controllers.Census
                 statsSql.Append($"  and {BICommonWay.ManyScSql("c.id", scIds, $"{dateTime.Year}-")}");
             }
 
-            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<StatsInfo>(queryText: statsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<StatsInfo>(queryText: statsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
             {
                 statsInfos.Add(item);
             }
@@ -739,7 +739,7 @@ namespace TEAMModelBI.Controllers.Census
             }
             List<LastYearLessAndAct> lastYear = new();
 
-            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LastYearLessAndAct>(queryText: lastStsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<LastYearLessAndAct>(queryText: lastStsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
             {
                 lastYear.Add(item);
             }
@@ -854,7 +854,7 @@ namespace TEAMModelBI.Controllers.Census
             if (scIds.Count > 0)
                 statsSql.Append($" and {BICommonWay.ManyScSql("c.id", scIds, $"{dateTime.Year}-")}");
 
-            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<StatsInfo>(queryText: statsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<StatsInfo>(queryText: statsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
             {
                 statsInfos.Add(item);
             }
@@ -867,7 +867,7 @@ namespace TEAMModelBI.Controllers.Census
 
             List<LastYearLessAndAct> lastYear = new();
 
-            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LastYearLessAndAct>(queryText: lastStsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<LastYearLessAndAct>(queryText: lastStsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
             {
                 lastYear.Add(item);
             }
@@ -1098,7 +1098,7 @@ namespace TEAMModelBI.Controllers.Census
             int scWeekCnt = await JointlySingleQuery.GetValueInt(cosmosClient, "Normal", "Base", $"{sql} where c.createTime >= {weekS} and c.createTime <= {weekE}");
             int scMonthCnt = await JointlySingleQuery.GetValueInt(cosmosClient, "Normal", "Base", $"{sql} where c.createTime >= {mthS} and c.createTime <= {mthE}");
 
-            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<StatsInfo>(queryText: $"select value(c) from c where c.year={dateTime.Year}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<StatsInfo>(queryText: $"select value(c) from c where c.year={dateTime.Year}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
             {
                 statsInfos.Add(item);
             }

+ 3 - 3
TEAMModelBI/Controllers/RepairApi/SchoolRepController.cs

@@ -522,7 +522,7 @@ namespace TEAMModelBI.Controllers.RepairApi
             foreach (var sc in scIds) 
             {
                 StatsInfo statsInfo = new();
-                var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{year}-{sc}", new PartitionKey("Statistics"));
+                var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{year}-{sc}", new PartitionKey("Statistics"));
                 if (scDataStats.Status == 200)
                 {
                     using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream);
@@ -536,9 +536,9 @@ namespace TEAMModelBI.Controllers.RepairApi
                 statsInfo = await SchoolStatsWay.GetSingleSc(cosmosClient, redisClinet, sc, year);
 
                 if (scDataStats.Status == 200)
-                    taskStss.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, $"{year}-{sc}", new PartitionKey("Statistics")));
+                    taskStss.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<StatsInfo>(statsInfo, $"{year}-{sc}", new PartitionKey("Statistics")));
                 else
-                    taskStss.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics")));
+                    taskStss.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics")));
 
                 //statsInfo = await StatsWay.upSingleSc(cosmosClient, sc);
                 statsInfos.Add(statsInfo);

+ 79 - 69
TEAMModelOS.FunctionV4/HttpTrigger/BIHttpTrigger.cs

@@ -47,7 +47,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
         /// </summary>
         /// <param name="req"></param>
         /// <returns></returns>
-        [Function("set-sc-birelation")]
+        //[Function("set-sc-birelation")]
         public async Task<HttpResponseData> upSchoolBIRelation([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req)
         {
             var response = req.CreateResponse(HttpStatusCode.OK);
@@ -203,7 +203,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                 if (school != null)
                 {
                     StatsInfo statsInfo = new();
-                    var resStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year}-{school.id}", new PartitionKey("Statistics"));
+                    var resStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year}-{school.id}", new PartitionKey("Statistics"));
                     if (resStats.Status == 200)
                     {
                         using var fileJson = await JsonDocument.ParseAsync(resStats.ContentStream);
@@ -235,9 +235,9 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                     statsInfo.upTime = dateOff.ToUnixTimeMilliseconds();
 
                     if (resStats.Status == 200)
-                        await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, statsInfo.id, new PartitionKey("Statistics"));
+                        await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<StatsInfo>(statsInfo, statsInfo.id, new PartitionKey("Statistics"));
                     else
-                        await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics"));
+                        await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics"));
                 }
 
             }
@@ -254,7 +254,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
         /// </summary>
         /// <param name="req"></param>
         /// <returns></returns>
-        [Function("set-scstats-type")]
+        //[Function("set-scstats-type")]
         public async Task<HttpResponseData> SetSchoolStatsType([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req) 
         {
             var response = req.CreateResponse(HttpStatusCode.OK);
@@ -268,10 +268,11 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                 var cosmosClient = _azureCosmos.GetCosmosClient();
                 string scId = null, type = null;
                 long careDate = 0;
-                int all = 0;
+                int count = 0;
                 int interaction = 0;
                 int lessType = 0;
 
+                DateTimeOffset cuurDateOff = DateTimeOffset.UtcNow;
                 DateTimeOffset dateOff = DateTimeOffset.UtcNow;
                 if (json.TryGetProperty("scId", out JsonElement _schoolId))
                     scId = $"{_schoolId}";
@@ -283,7 +284,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                     return response;
                 }
                 if (json.TryGetProperty("cnt", out JsonElement _cnt))
-                    all = _cnt.GetInt32();
+                    count = _cnt.GetInt32();
 
                 if (json.TryGetProperty("interaction", out JsonElement _interaction))
                     interaction = _interaction.GetInt32();
@@ -301,6 +302,8 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                 var (lastTermS, lastTermE) = TimeHelper.GetStartOrEnd(dateOff, "lastterm");   //计算上学期开始/结束时间
                 var (termS, termE) = TimeHelper.GetStartOrEnd(dateOff, "term");   //计算本学期开始/结束时间
 
+                var (yearS, yearE) = TimeHelper.GetStartOrEnd(cuurDateOff, "year");   //计算本学期开始/结束时间
+
                 var (weekDayS, weekDayE) = TimeHelper.GetLongToTime(weekS, weekE);
                 var (lWeekDayS, lWeekDayE) = TimeHelper.GetLongToTime(lastWeekS, lastWeekE);
                 var (lTermDayS, lTermDayE) = TimeHelper.GetLongToTime(lastTermS, lastTermE);
@@ -311,7 +314,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                 int lmthDay = TimeHelper.GetDateDay(lMonthE);
                 StatsInfo statsInfo = new();
 
-                var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year}-{scId}", new PartitionKey("Statistics"));
+                var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year}-{scId}", new PartitionKey("Statistics"));
                 if (resStsInfo.Status == 200)
                 {
                     using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
@@ -319,7 +322,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                 }
                 else
                 {
-                    var resLastStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
+                    var resLastStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
                     if (resLastStsInfo.Status == 200)
                     {
                         using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
@@ -334,7 +337,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                     }
                     else
                     {
-                        ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<ScBase>(scId, new PartitionKey("Base"));
+                        ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ScBase>(scId, new PartitionKey("Base"));
                         statsInfo.id = $"{dateOff.Year}-{scBase.id}";
                         statsInfo.schoolId = scBase.id;
                         statsInfo.name = scBase.name;
@@ -349,26 +352,26 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                 switch ($"{type}")
                 {
                     case "Exam":
-                        statsInfo.activity.exam += all;
+                        statsInfo.activity.exam += count;
                         break;
                     case "Survey":
-                        statsInfo.activity.survey += all;
+                        statsInfo.activity.survey += count;
                         break;
                     case "Vote":
-                        statsInfo.activity.vote += all;
+                        statsInfo.activity.vote += count;
                         break;
                     case "Homework":
-                        statsInfo.activity.homework += all;
+                        statsInfo.activity.homework += count;
                         break;
                     case "Less":
                         //课例
-                        statsInfo.lesson.year[dateOff.DayOfYear] += all;
-                        statsInfo.lesson.all += all;
+                        statsInfo.lesson.year[dateOff.DayOfYear] += count;
+                        statsInfo.lesson.all += count;
 
                         if (lessType == 0)
-                            statsInfo.lesson.open += all;
+                            statsInfo.lesson.open += count;
                         else
-                            statsInfo.lesson.less += all;
+                            statsInfo.lesson.less += count;
 
                         statsInfo.lesson.lastDay = ((int)statsInfo.lesson.year[lastDay.DayOfYear]);
                         statsInfo.lesson.day = ((int)statsInfo.lesson.year[dateOff.DayOfYear]);
@@ -381,7 +384,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                         {
                             if (lTermDayS.Year < dateOff.Year)
                             {
-                                var lastLessSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                var lastLessSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
                                 if (lastLessSts.Status == 200)
                                 {
                                     using var fileJson = await JsonDocument.ParseAsync(lastLessSts.ContentStream);
@@ -396,7 +399,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                         {
                             if (termDayS.Year < dateOff.Year)
                             {
-                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
                                 if (lastSts.Status == 200)
                                 {
                                     using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
@@ -405,7 +408,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                                     statsInfo.lesson.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
                                 }
                                 else
-                                    statsInfo.lesson.term += all;
+                                    statsInfo.lesson.term += count;
                             }
                         }
 
@@ -426,7 +429,7 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                         {
                             if (lTermDayS.Year < dateOff.Year)
                             {
-                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
                                 if (lastSts.Status == 200)
                                 {
                                     using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
@@ -440,9 +443,9 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
 
                         statsInfo.lesson.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                         break;
-                    case "stu":
-                        statsInfo.stuYear[dateOff.DayOfYear] += all;
-                        statsInfo.stu += all;
+                    case "Student":
+                        statsInfo.stuYear[dateOff.DayOfYear] += count;
+                        statsInfo.stu += count;
 
                         statsInfo.dayStu = ((int)statsInfo.stuYear[dateOff.DayOfYear]);
                         var stuList = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.stuYear });
@@ -451,10 +454,10 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
 
                         statsInfo.stuUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                         break;
-                    case "tch":
+                    case "Teacher":
 
-                        statsInfo.tchYear[dateOff.DayOfYear] += all;
-                        statsInfo.tch += all;
+                        statsInfo.tchYear[dateOff.DayOfYear] += count;
+                        statsInfo.tch += count;
 
                         statsInfo.dayTch = ((int)statsInfo.tchYear[dateOff.DayOfYear]);
                         var tchList = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.tchYear });
@@ -467,61 +470,68 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
 
                 if ($"{type}".Equals("Exam") || $"{type}".Equals("Survey") || $"{type}".Equals("Vote") || $"{type}".Equals("Homework"))
                 {
-                    statsInfo.activity.all += all;
-                    statsInfo.activity.year[dateOff.DayOfYear] += all;
-                    DenseMatrix matris = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
-                    statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
-                    statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
-                    statsInfo.activity.lastWeek = ((int)matris.SubMatrix(lWeekDayS.DayOfYear, 7, 0, matris.ColumnCount).ColumnSums().Sum());
-                    statsInfo.activity.week = ((int)matris.SubMatrix(weekDayS.DayOfYear, weekDayE.DayOfYear - weekDayS.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
-                    if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
+                    statsInfo.activity.all += count;
+                    if (careDate >= yearS && careDate <= yearE)
                     {
-                        if (lTermDayS.Year < dateOff.Year)
+                        if (count > 0)
                         {
-                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
-                            if (lastSts.Status == 200)
+                            statsInfo.activity.year[dateOff.DayOfYear] += count;
+                            DenseMatrix matris = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                            statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
+                            statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
+                            statsInfo.activity.lastWeek = ((int)matris.SubMatrix(lWeekDayS.DayOfYear, 7, 0, matris.ColumnCount).ColumnSums().Sum());
+                            statsInfo.activity.week = ((int)matris.SubMatrix(weekDayS.DayOfYear, weekDayE.DayOfYear - weekDayS.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
+                            if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
                             {
-                                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());
+                                if (lTermDayS.Year < dateOff.Year)
+                                {
+                                    var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").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;
+                                }
                             }
-                            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)
+                            if (termS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= termE)
                             {
-                                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());
+                                if (termDayS.Year < dateOff.Year)
+                                {
+                                    var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").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;
+                                }
+                                else
+                                {
+                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                                    statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                                }
                             }
-                            else
-                                statsInfo.activity.term += all;
-                        }
-                        else
-                        {
-                            var actYer = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
-                            statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+
+                            statsInfo.activity.lastMonth = ((int)matris.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
+                            statsInfo.activity.month += ((int)matris.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, matris.ColumnCount).ColumnSums().Sum());
+                            statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                         }
                     }
 
-                    statsInfo.activity.lastMonth = ((int)matris.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
-                    statsInfo.activity.month += ((int)matris.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, matris.ColumnCount).ColumnSums().Sum());
-                    statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                 }
 
                 if (resStsInfo.Status == 200)
-                    statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, scId, new PartitionKey("Statistics"));
+                    statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<StatsInfo>(statsInfo, scId, new PartitionKey("Statistics"));
                 else
-                    statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics"));
+                    statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics"));
             }
             catch (Exception ex)
             {

+ 117 - 49
TEAMModelOS.SDK/Models/Service/BI/BIStats.cs

@@ -1,6 +1,8 @@
 using Azure.Cosmos;
+using Azure.Storage.Blobs;
 using DocumentFormat.OpenXml.Math;
 using MathNet.Numerics.LinearAlgebra.Double;
+using Microsoft.Azure.Cosmos.Table;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -11,6 +13,7 @@ using TEAMModelOS.SDK.Context.Constant;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
+using TEAMModelOS.SDK.Models.Cosmos.BI.BISchool;
 
 namespace TEAMModelOS.SDK.Models.Service.BI
 {
@@ -28,6 +31,8 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         /// <returns></returns>
         public static async Task SetTypeAddStats(CosmosClient cosmosClient, string scId, string type, int count, int lessType = 0, int interaction = 0, long careDate = 0)
         {
+            DateTimeOffset cuurDateOff = DateTimeOffset.UtcNow;
+
             DateTimeOffset dateOff = DateTimeOffset.UtcNow;
             if (careDate > 1000000000000)
                 dateOff = DateTimeOffset.FromUnixTimeMilliseconds(careDate);
@@ -46,6 +51,8 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             var (lastTermS, lastTermE) = TimeHelper.GetStartOrEnd(dateOff, "lastterm");   //计算上学期开始/结束时间
             var (termS, termE) = TimeHelper.GetStartOrEnd(dateOff, "term");   //计算本学期开始/结束时间
 
+            var (yearS, yearE) = TimeHelper.GetStartOrEnd(cuurDateOff, "year");   //计算本学期开始/结束时间
+
             var (weekDayS, weekDayE) = TimeHelper.GetLongToTime(weekS, weekE);
             var (lWeekDayS, lWeekDayE) = TimeHelper.GetLongToTime(lastWeekS, lastWeekE);
             var (lTermDayS, lTermDayE) = TimeHelper.GetLongToTime(lastTermS, lastTermE);
@@ -56,7 +63,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             int lmthDay = TimeHelper.GetDateDay(lMonthE);
             StatsInfo statsInfo = new();
 
-            var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year}-{scId}", new PartitionKey("Statistics"));
+            var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year}-{scId}", new PartitionKey("Statistics"));
             if (resStsInfo.Status == 200)
             {
                 using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
@@ -64,7 +71,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             }
             else
             {
-                var resLastStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
+                var resLastStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
                 if (resLastStsInfo.Status == 200)
                 {
                     using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
@@ -79,7 +86,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                 }
                 else
                 {
-                    ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<ScBase>(scId, new PartitionKey("Base"));
+                    ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ScBase>(scId, new PartitionKey("Base"));
                     statsInfo.id = $"{dateOff.Year}-{scBase.id}";
                     statsInfo.schoolId = scBase.id;
                     statsInfo.name = scBase.name;
@@ -126,7 +133,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                     {
                         if (lTermDayS.Year < dateOff.Year)
                         {
-                            var lastLessSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            var lastLessSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
                             if (lastLessSts.Status == 200)
                             {
                                 using var fileJson = await JsonDocument.ParseAsync(lastLessSts.ContentStream);
@@ -141,7 +148,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                     {
                         if (termDayS.Year < dateOff.Year)
                         {
-                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics"));
                             if (lastSts.Status == 200)
                             {
                                 using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
@@ -171,7 +178,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                     {
                         if (lTermDayS.Year < dateOff.Year)
                         {
-                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
                             if (lastSts.Status == 200)
                             {
                                 using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
@@ -213,60 +220,67 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             if ($"{type}".Equals("Exam") || $"{type}".Equals("Survey") || $"{type}".Equals("Vote") || $"{type}".Equals("Homework"))
             {
                 statsInfo.activity.all += count;
-                statsInfo.activity.year[dateOff.DayOfYear] += count;
-                DenseMatrix matris = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
-                statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
-                statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
-                statsInfo.activity.lastWeek = ((int)matris.SubMatrix(lWeekDayS.DayOfYear, 7, 0, matris.ColumnCount).ColumnSums().Sum());
-                statsInfo.activity.week = ((int)matris.SubMatrix(weekDayS.DayOfYear, weekDayE.DayOfYear - weekDayS.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
-                if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
+                if (careDate >= yearS && careDate <= yearE)
                 {
-                    if (lTermDayS.Year < dateOff.Year)
+                    if (count > 0) 
                     {
-                        var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
-                        if (lastSts.Status == 200)
+                        statsInfo.activity.year[dateOff.DayOfYear] += count;
+                        DenseMatrix matris = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                        statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
+                        statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
+                        statsInfo.activity.lastWeek = ((int)matris.SubMatrix(lWeekDayS.DayOfYear, 7, 0, matris.ColumnCount).ColumnSums().Sum());
+                        statsInfo.activity.week = ((int)matris.SubMatrix(weekDayS.DayOfYear, weekDayE.DayOfYear - weekDayS.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
+                        if (lastTermS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= lastTermE)
                         {
-                            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());
+                            if (lTermDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").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;
+                            }
                         }
-                        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)
+                        if (termS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= termE)
                         {
-                            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());
+                            if (termDayS.Year < dateOff.Year)
+                            {
+                                var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").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;
+                            }
+                            else
+                            {
+                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
+                                statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
                         }
-                        else
-                            statsInfo.activity.term += count;
-                    }
-                    else
-                    {
-                        var actYer = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
-                        statsInfo.activity.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+
+                        statsInfo.activity.lastMonth = ((int)matris.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
+                        statsInfo.activity.month += ((int)matris.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, matris.ColumnCount).ColumnSums().Sum());
+                        statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                     }
                 }
 
-                statsInfo.activity.lastMonth = ((int)matris.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
-                statsInfo.activity.month += ((int)matris.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, matris.ColumnCount).ColumnSums().Sum());
-                statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
             }
 
             if (resStsInfo.Status == 200)
-                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, scId, new PartitionKey("Statistics"));
+                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<StatsInfo>(statsInfo, scId, new PartitionKey("Statistics"));
             else
-                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics"));
+                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics"));
 
         }
 
@@ -280,7 +294,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         {
             DateTimeOffset dateOff = DateTimeOffset.UtcNow;
             StatsInfo statsInfo = new();
-            var resStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateOff.Year}-{school.id}", new PartitionKey("Statistics"));
+            var resStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year}-{school.id}", new PartitionKey("Statistics"));
             if (resStats.Status == 200)
             {
                 using var fileJson = await JsonDocument.ParseAsync(resStats.ContentStream);
@@ -312,9 +326,63 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             statsInfo.upTime = dateOff.ToUnixTimeMilliseconds();
 
             if (resStats.Status == 200)
-                await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, statsInfo.id, new PartitionKey("Statistics"));
+                await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<StatsInfo>(statsInfo, statsInfo.id, new PartitionKey("Statistics"));
             else
-                await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics"));
+                await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics"));
+        }
+
+        /// <summary>
+        /// 新增/修改学校列表中间件
+        /// </summary>
+        /// <param name="cosmosClient"></param>
+        /// <param name="tableClient"></param>
+        /// <param name="blobClient"></param>
+        /// <param name="_dingDing"></param>
+        /// <param name="school"></param>
+        /// <returns></returns>
+        public static async Task SetSchoolBIRelation(CosmosClient cosmosClient,  BlobContainerClient blobClient, CloudTableClient tableClient, DingDing _dingDing, School school) 
+        {
+            string type = "";
+            BIRelation bIRelation = new();
+            var resBiRel = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(school.id, new PartitionKey("BIRel"));
+            if (resBiRel.Status == 200)
+            {
+                using var fileJson = await JsonDocument.ParseAsync(resBiRel.ContentStream);
+                bIRelation = fileJson.ToObject<BIRelation>();
+
+            }
+            else
+                bIRelation.id = school.id;
+
+            string aName = null;
+            if (!string.IsNullOrEmpty($"{school.areaId}"))
+                aName = await CosmosQueryHelper.GetStr(cosmosClient, "Normal", $"select value(c.name) from c where c.id='{school.areaId}'", "Base-Area");
+            bIRelation.name = school.name;
+            bIRelation.picture = school.picture;
+            bIRelation.region = school.region;
+            bIRelation.province = school.province;
+            bIRelation.city = school.city;
+            bIRelation.dist = school.dist;
+            bIRelation.address = school.address;
+            bIRelation.areaId = school.areaId;
+            bIRelation.size = school.size;
+            bIRelation.scale = school.scale;
+            bIRelation.upDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+            bIRelation.areaName = aName;
+
+            if (resBiRel.Status == 200)
+            {
+                await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<BIRelation>(bIRelation, bIRelation.id, new PartitionKey("BIRel"));
+                type = "update";
+            }
+            else
+            {
+                await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<BIRelation>(bIRelation, new PartitionKey("BIRel"));
+                type = "add";
+            }
+
+            //保存操作记录
+            await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, $"birelation-{type}", $"触发更新学校信息表中间件", _dingDing);
         }
     }
 }

+ 1 - 1
TEAMModelOS.SDK/Models/Service/BIStatsWay/SchoolStatsWay.cs

@@ -258,7 +258,7 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             }
 
 
-            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<T>(queryText: statsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<T>(queryText: statsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
             {
                 list.Add(item);
 

+ 5 - 1
TEAMModelOS/Controllers/School/SchoolController.cs

@@ -26,6 +26,7 @@ using TEAMModelOS.SDK;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
+using TEAMModelOS.SDK.Models.Service.BI;
 
 namespace TEAMModelOS.Controllers
 {
@@ -189,7 +190,10 @@ namespace TEAMModelOS.Controllers
                 }
 
                 //创建/修改学校信息中间件
-                _ = _httpTrigger.RequestHttpTrigger(new { school = $"{school}" }, _option.Location, "set-sc-birelation");
+                //_ = _httpTrigger.RequestHttpTrigger(new { school = $"{school}" }, _option.Location, "set-sc-birelation");
+                var tableClient = _azureStorage.GetCloudTableClient();
+                var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public");
+                await BIStats.SetSchoolBIRelation(client, blobClient, tableClient, _dingDing, schoolInfo);
 
                 return Ok(new { schoolInfo });
             }