Browse Source

优化课程汇总。

Li 2 years ago
parent
commit
0604453eda

+ 40 - 2
TEAMModelBI/Controllers/BICommon/StatsNoticeController.cs

@@ -10,6 +10,13 @@ using Microsoft.Extensions.Options;
 using System.Text.Json;
 using System.Threading.Tasks;
 using TEAMModelOS.SDK.Context.Constant;
+using System;
+using Azure.Cosmos;
+using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.SDK.Models.Cosmos.BI.BICommon;
+using System.Collections.Generic;
+using System.Text;
+using DocumentFormat.OpenXml.Office2010.Excel;
 
 namespace TEAMModelBI.Controllers.BICommon
 {
@@ -49,12 +56,43 @@ namespace TEAMModelBI.Controllers.BICommon
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [HttpPost("get-infos")]
-        public async Task<IActionResult> GetInfos(JsonElement jsonElement) 
+        public async Task<IActionResult> GetInfos(JsonElement jsonElement)
         {
+            try
+            {
+                jsonElement.TryGetProperty("dateTime", out JsonElement dateTime);
+                jsonElement.TryGetProperty("id", out JsonElement id);
+                var cosmosClient = _azureCosmos.GetCosmosClient();
 
+                string dt = "";
+                if (string.IsNullOrEmpty($"{dateTime}"))
+                {
+                    dt = DateTimeOffset.UtcNow.ToString("yyyyMMdd");
+                }
+                else
+                {
+                    dt = $"{dateTime}";
+                }
 
+                StringBuilder sqlTxt = new($"select value(c) from c where c.day='{dt}'");
+                if (!string.IsNullOrEmpty($"{id}"))
+                {
+                    sqlTxt.Append($" and c.rangeId = '{id}'");
+                }
+                List<StatsNotice> statsNotices = new();
 
-            return Ok(new { state = RespondCode.Ok });
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<StatsNotice>(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("StatsNotice") }))
+                {
+                    statsNotices.Add(item);
+                }
+
+                return Ok(new { state = RespondCode.Ok, statsNotices });
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"BI,{_option.Location},/statsnotice/get-infos  \n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+                return BadRequest();
+            }
         }
 
 

+ 21 - 2
TEAMModelBI/Controllers/BITest/TestController.cs

@@ -61,6 +61,7 @@ using TEAMModelOS.SDK.Models.Cosmos.BI.BISchool;
 using DocumentFormat.OpenXml.Drawing;
 using Microsoft.OData.Edm;
 using TEAMModelOS.SDK.Models.Cosmos.OpenEntity;
+using TEAMModelOS.SDK.Models.Cosmos.BI.BICommon;
 
 namespace TEAMModelBI.Controllers.BITest
 {
@@ -1639,6 +1640,7 @@ namespace TEAMModelBI.Controllers.BITest
         public async Task<IActionResult> SetMatrix(JsonElement jsonElement)
         {
             DateTimeOffset dateOff = DateTimeOffset.UtcNow;
+            string df = dateOff.ToString("yyyyMMdd");
             var (weekS, weekE) = TimeHelper.GetStartOrEnd(dateOff, "week");             //计算本周开始/结束时间
             DateTimeOffset dateOff1 = DateTimeOffset.Parse("2023-1-1 01:20:50");
             DateTimeOffset dateOff2 = DateTimeOffset.Parse("2023-1-1 00:20:50");
@@ -1678,7 +1680,6 @@ namespace TEAMModelBI.Controllers.BITest
             //return Ok(new { state = 200, ld= artStats.LastYear.Count, d = artStats.year.Count, artStats }); 
             //示例矩阵
 
-
             DateTimeOffset dt = DateTimeOffset.UtcNow;
 
             int dayCnt = dt.DayOfYear;
@@ -1752,7 +1753,7 @@ namespace TEAMModelBI.Controllers.BITest
             if (!jsonElement.TryGetProperty("scId", out JsonElement scId)) return BadRequest();
 
             List<string> server = new() { "YMPCVCIM" };
-            _ = BISchoolService.UpSchoolEdition(cosmosClient, _dingDing, server, "habook");
+            ////_ = BISchoolService.UpSchoolEdition(cosmosClient, _dingDing, server, "habook");
 
             return Ok(new { state = 200 });
         }
@@ -1769,6 +1770,24 @@ namespace TEAMModelBI.Controllers.BITest
             return Ok(new { });
         }
 
+        /// <summary>
+        /// 测试汇总
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("set-apiorfun")]
+        public async Task<IActionResult> SetApiOrFun(JsonElement jsonElement)
+        {
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+
+            StatsNotice statsNotice = new() { id = "20230131-1636016499", type = "private", day= "20230131", rangeId = "1636016499", createTime = 1675133709000, sendTime = 1675180799000, stuDayCnt = 1, classroomDayCnt = 2, weighDayCnt = 3, homeworkDayCnt = 4 };
+
+            await BIStatsNotice.SetStatsNotice(cosmosClient, _dingDing, "Student", "School", "1636016499", 2);
+            //await BIStatsNotice.MonitorStatsNotice(_coreAPIHttpService, cosmosClient, _dingDing, _configuration, jsonElement);
+
+            //statsNotice = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync<StatsNotice>(statsNotice, new PartitionKey("StatsNotice"));
+            return Ok(new { state = 200, statsNotice });
+        }
+
         /// <summary>
         /// 测试依据类型增/减量统计方法
         /// </summary>

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

@@ -496,8 +496,9 @@ namespace TEAMModelBI.Controllers.RepairApi
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [HttpPost("set-allscstats")]
-        public async Task<IActionResult> SetAllScStats(JsonElement jsonElement) 
+        public async Task<IActionResult> SetAllScStats(JsonElement jsonElement)
         {
+            string id = "";
             try
             {
                 jsonElement.TryGetProperty("scId", out JsonElement scId);
@@ -523,6 +524,7 @@ namespace TEAMModelBI.Controllers.RepairApi
                 List<Task<ItemResponse<StatsInfo>>> taskStss = new();
                 foreach (var sc in scIds)
                 {
+                    id = sc;
                     StatsInfo statsInfo = new();
                     var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{year}-{sc}", new PartitionKey("Statistics"));
                     if (scDataStats.Status == 200)
@@ -560,14 +562,12 @@ namespace TEAMModelBI.Controllers.RepairApi
                 }
 
                 return Ok(new { state = RespondCode.Ok, statsInfos });
-
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"BI,{_option.Location},/sccholrep/set-allscstats \n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+                await _dingDing.SendBotMsg($"BI,{_option.Location},/sccholrep/set-allscstats  学校id:{id} \n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
                 return BadRequest();
             }
         }
-
     }
-}
+}

+ 82 - 2
TEAMModelOS.SDK/DI/CoreAPI/CoreAPIHttpService.cs

@@ -385,8 +385,12 @@ namespace TEAMModelOS.SDK
                     sendSite = "China";
                     urlAction = "https://test.teammodel.cn/core/process-notify";
                 }
+                if (!string.IsNullOrEmpty($"{bINotice.jumpUrl}")) 
+                {
+                    urlAction = bINotice.jumpUrl;
+                }
 
-                if (bINotice.callbackName != null && bINotice.refuseName != null)
+                if (!string.IsNullOrEmpty($"{bINotice.callbackName}")&& !string.IsNullOrEmpty($"{bINotice.refuseName}"))
                 {
                     string urlA = $"{urlAction}&notifyEvent=1&ticket=";
                     string urlB = $"{urlAction}&notifyEvent=2&ticket=";
@@ -394,7 +398,7 @@ namespace TEAMModelOS.SDK
                     actions.Add(new { type = "click", label = bINotice.refuseName, url = urlB, tokenbindtype = 1 });
 
                 }
-                else if (bINotice.callbackName != null && bINotice.refuseName == null)
+                else if (!string.IsNullOrEmpty($"{bINotice.callbackName}") && string.IsNullOrEmpty($"{ bINotice.refuseName}"))
                 {
                     string urlA = $"{urlAction}&notifyEvent=1&ticket=";
                     actions.Add(new { type = "click", label = bINotice.callbackName, url = urlA, tokenbindtype = 1 });
@@ -444,6 +448,82 @@ namespace TEAMModelOS.SDK
                 _ = _dingDing.SendBotMsg($"{location},BI通知V2发送异常\n{ex.Message}\n{ex.StackTrace}\n{replaceData.ToJsonString()}\n{bINotice.ToJsonString()}", GroupNames.成都开发測試群組);
             }
         }
+
+        /// <summary>
+        /// 每日课程消息发送
+        /// </summary>
+        /// <param name="notifyData"></param>
+        /// <param name="replaceData"></param>
+        /// <param name="location"></param>
+        /// <param name="_configuration"></param>
+        /// <param name="_dingDing"></param>
+        public void CoursePushNotify(NotifyData notifyData, Dictionary<string, object> replaceData, string location, IConfiguration _configuration, DingDing _dingDing)
+        {
+
+            try
+            {
+                var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
+                var clientSecret = _configuration.GetValue<string>("HaBookAuth:CoreService:clientSecret");
+                var url = _configuration.GetValue<string>("HaBookAuth:CoreAPI");
+                string site = location;
+                string sendSite = "";
+                //处理action
+                string urlAction = "";
+                List<dynamic> actions = new List<dynamic>();
+                if (site.Equals("Global"))
+                {
+                    sendSite = "Global";
+                    urlAction = "https://www.teammodel.net/core/process-notify";
+                }
+                if (site.Equals("Global-Test") || site.Equals("Global-Dep"))
+                {
+                    sendSite = "Global";
+                    urlAction = "https://test.teammodel.net/core/process-notify";
+                }
+                if (site.Equals("China"))
+                {
+                    sendSite = "China";
+                    urlAction = "https://www.teammodel.cn/core/process-notify";
+                }
+                if (site.Equals("China-Test") || site.Equals("China-Dep"))
+                {
+                    sendSite = "China";
+                    urlAction = "https://test.teammodel.cn/core/process-notify";
+                }
+
+                var client = _httpClient;
+                var token = CoreTokenExtensions.CreateAccessToken(clientID, clientSecret, sendSite).Result;
+                if (client.DefaultRequestHeaders.Contains("Authorization"))
+                {
+                    client.DefaultRequestHeaders.Remove("Authorization");
+                    client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token.AccessToken}");
+                }
+                else
+                {
+                    client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token.AccessToken}");
+                }
+
+                string data = new { value = replaceData }.ToJsonString();
+                if (actions.Any())
+                {
+                    data = new { value = replaceData, action = actions }.ToJsonString();
+                }
+                string result = "";
+                HttpResponseMessage responseMessage = _httpClient.PostAsJsonAsync($"{url}/service/PushNotify", notifyData).Result;
+                if (responseMessage.StatusCode == HttpStatusCode.OK)
+                {
+                    string content = responseMessage.Content.ReadAsStringAsync().Result;
+                    result = content;
+                }
+                else
+                    result = $"{responseMessage.StatusCode},推送返回的状态码。";
+            }
+            catch (Exception ex)
+            {
+                _ = _dingDing.SendBotMsg($"{location},BI通知V2发送异常\n{ex.Message}\n{ex.StackTrace}\n{replaceData.ToJsonString()}\n{notifyData.ToJsonString()}", GroupNames.成都开发測試群組);
+            }
+        }
+
         public class NotifyData { 
             public string hubName { get; set; }
             public string sender { get; set; }

+ 6 - 1
TEAMModelOS.SDK/Models/Cosmos/BI/BICommon/StatsNotice.cs

@@ -9,7 +9,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI.BICommon
     public class StatsNotice : CosmosEntity
     {
         /// <summary>
-        /// id   2022-tmdid   2022-学校id
+        /// id   20230108-tmdid   20230108-学校id
         /// </summary>
         public StatsNotice()
         {
@@ -22,6 +22,11 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI.BICommon
         /// </summary>
         public string type { get; set; }
 
+        /// <summary>
+        /// 时间天
+        /// </summary>
+        public string day { get; set; }
+
         /// <summary>
         /// 学校/个人id
         /// </summary>

+ 221 - 215
TEAMModelOS.SDK/Models/Service/BI/BIStats.cs

@@ -211,7 +211,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                         }
                         else
                         {
-                            if (termDayS.Year <  dateOff.Year) 
+                            if (termDayS.Year < dateOff.Year)
                             {
                                 if (lastLesson != null)
                                 {
@@ -327,7 +327,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                             {
                                 using var fileJson = await JsonDocument.ParseAsync(resLastStats.ContentStream);
                                 lastStats = fileJson.ToObject<StatsInfo>();
-                                lastAct  = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.activity.year });
+                                lastAct = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.activity.year });
                             }
 
                             int lastDayCnt = 0;
@@ -404,16 +404,16 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                             }
                             statsInfo.activity.term = term;
                             int lastMonth = 0;
-                            if (lMonthS.Year < dateOff.Year) 
+                            if (lMonthS.Year < dateOff.Year)
                             {
-                                if (lastAct != null) 
+                                if (lastAct != null)
                                 {
-                                    lastMonth = ((int)lastAct.SubMatrix(lMonthS.DayOfYear-1, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
+                                    lastMonth = ((int)lastAct.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
                                 }
                             }
                             else
                             {
-                                lastMonth = ((int)matris.SubMatrix(lMonthS.DayOfYear-1, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
+                                lastMonth = ((int)matris.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
                             }
                             statsInfo.activity.lastMonth = lastMonth;
                             statsInfo.activity.month += ((int)matris.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, matris.ColumnCount).ColumnSums().Sum());
@@ -442,7 +442,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         /// <param name="cosmosClient"></param>
         /// <param name="school"></param>
         /// <returns></returns>
-        public static async Task SetScStatsInfo(CosmosClient cosmosClient, DingDing _dingDing,School school)
+        public static async Task SetScStatsInfo(CosmosClient cosmosClient, DingDing _dingDing, School school)
         {
             try
             {
@@ -567,7 +567,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         /// <returns></returns>
         public static async Task SetStatsZeroPoint(AzureCosmosFactory _azureCosmos, DingDing _dingDing)
         {
-            string scId = null;
+            List<string> scId = new();
             try
             {
                 var cosmosClient = _azureCosmos.GetCosmosClient();
@@ -614,266 +614,270 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                 {
                     foreach (var item in tempStatsInfos)
                     {
-                        scId = item.schoolId;
-                        StatsInfo lastStatsInfo = null; 
-                        DenseMatrix lastTch = null;
-                        DenseMatrix lastStu = null;
-                        DenseMatrix lastLesson = null;
-                        DenseMatrix lastInter = null;
-                        DenseMatrix lastAct = null;
-                        var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year - 1}-{item.schoolId}", new PartitionKey("Statistics"));
-                        if (lastSts.Status == 200)
+                        try
                         {
-                            using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
-                            lastStatsInfo = fileJson.ToObject<StatsInfo>();
-                            item.schoolId = lastStatsInfo.schoolId;
-                            item.year = dateOff.Year;
-                            item.picture = lastStatsInfo.picture;
-                            item.name = lastStatsInfo.name;
-                            item.areaId = lastStatsInfo.areaId;
-                            item.size = lastStatsInfo.size;
-                            item.useSize = lastStatsInfo.useSize;
-                            item.tch = lastStatsInfo.tch;
-                            lastTch = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.tchYear });
-                            lastStu = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.stuYear});
-                            lastLesson = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.lesson.year });
-                            lastInter = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.lesson.yearInters });
-                            lastAct = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.activity.year });
-                        }
-
-                        var tchList = DenseMatrix.OfColumns(new List<List<double>>() { item.tchYear });
-                        var stuList = DenseMatrix.OfColumns(new List<List<double>>() { item.stuYear });
-                        int dayTch = 0;
-                        int dayStu = 0;
-                        int lastDayLesson = 0;
-                        int lastDayAct = 0;
-                        if (lastDay.Year < dateOff.Year) 
-                        {
-                            if (lastStatsInfo != null) 
+                            StatsInfo lastStatsInfo = null;
+                            DenseMatrix lastTch = null;
+                            DenseMatrix lastStu = null;
+                            DenseMatrix lastLesson = null;
+                            DenseMatrix lastInter = null;
+                            DenseMatrix lastAct = null;
+                            var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year - 1}-{item.schoolId}", new PartitionKey("Statistics"));
+                            if (lastSts.Status == 200)
+                            {
+                                using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
+                                lastStatsInfo = fileJson.ToObject<StatsInfo>();
+                                item.schoolId = lastStatsInfo.schoolId;
+                                item.year = dateOff.Year;
+                                item.picture = lastStatsInfo.picture;
+                                item.name = lastStatsInfo.name;
+                                item.areaId = lastStatsInfo.areaId;
+                                item.size = lastStatsInfo.size;
+                                item.useSize = lastStatsInfo.useSize;
+                                item.tch = lastStatsInfo.tch;
+                                lastTch = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.tchYear });
+                                lastStu = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.stuYear });
+                                lastLesson = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.lesson.year });
+                                lastInter = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.lesson.yearInters });
+                                lastAct = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.activity.year });
+                            }
+
+                            var tchList = DenseMatrix.OfColumns(new List<List<double>>() { item.tchYear });
+                            var stuList = DenseMatrix.OfColumns(new List<List<double>>() { item.stuYear });
+                            int dayTch = 0;
+                            int dayStu = 0;
+                            int lastDayLesson = 0;
+                            int lastDayAct = 0;
+                            if (lastDay.Year < dateOff.Year)
                             {
-                                dayTch =((int)lastStatsInfo.tchYear[lastDay.DayOfYear - 1]);
-                                dayStu = ((int)lastStatsInfo.stuYear[lastDay.DayOfYear - 1]);
-                                lastDayLesson = ((int)lastStatsInfo.lesson.year[lastDay.DayOfYear - 1]);
-                                lastDayAct = ((int)lastStatsInfo.activity.year[lastDay.DayOfYear - 1]);
+                                if (lastStatsInfo != null)
+                                {
+                                    dayTch = ((int)lastStatsInfo.tchYear[lastDay.DayOfYear - 1]);
+                                    dayStu = ((int)lastStatsInfo.stuYear[lastDay.DayOfYear - 1]);
+                                    lastDayLesson = ((int)lastStatsInfo.lesson.year[lastDay.DayOfYear - 1]);
+                                    lastDayAct = ((int)lastStatsInfo.activity.year[lastDay.DayOfYear - 1]);
+                                }
                             }
-                        }
-                        else
-                        {
-                            dayTch = ((int)item.tchYear[dateOff.DayOfYear - 1]);
-                            dayStu = ((int)item.stuYear[dateOff.DayOfYear - 1]);
-                            lastDayLesson = ((int)item.lesson.year[lastDay.DayOfYear - 1]);
-                            lastDayAct =((int)item.activity.year[lastDay.DayOfYear - 1]);
-                        }
-                        item.dayTch = dayTch;
-                        int weekTch = 0;
-                        int weekStu = 0;
-                        if (weekDayS.Year < dateOff.Year) 
-                        {
-                            if (lastTch != null)
+                            else
                             {
-                                weekTch += ((int)lastTch.SubMatrix(weekDayS.DayOfYear - 1, lastTch.RowCount - weekDayS.DayOfYear + 1, 0, lastTch.ColumnCount).ColumnSums().Sum());
+                                dayTch = ((int)item.tchYear[dateOff.DayOfYear - 1]);
+                                dayStu = ((int)item.stuYear[dateOff.DayOfYear - 1]);
+                                lastDayLesson = ((int)item.lesson.year[lastDay.DayOfYear - 1]);
+                                lastDayAct = ((int)item.activity.year[lastDay.DayOfYear - 1]);
                             }
-                            weekTch += ((int)tchList.SubMatrix(0, weekDayE.DayOfYear + 1, 0, tchList.ColumnCount).ColumnSums().Sum());
-
-                            if (lastStu != null)
+                            item.dayTch = dayTch;
+                            int weekTch = 0;
+                            int weekStu = 0;
+                            if (weekDayS.Year < dateOff.Year)
                             {
-                                weekStu += ((int)lastStu.SubMatrix(weekDayS.DayOfYear - 1, lastStu.RowCount - weekDayS.DayOfYear + 1, 0, lastStu.ColumnCount).ColumnSums().Sum());
+                                if (lastTch != null)
+                                {
+                                    weekTch += ((int)lastTch.SubMatrix(weekDayS.DayOfYear - 1, lastTch.RowCount - weekDayS.DayOfYear + 1, 0, lastTch.ColumnCount).ColumnSums().Sum());
+                                }
+                                weekTch += ((int)tchList.SubMatrix(0, weekDayE.DayOfYear + 1, 0, tchList.ColumnCount).ColumnSums().Sum());
+
+                                if (lastStu != null)
+                                {
+                                    weekStu += ((int)lastStu.SubMatrix(weekDayS.DayOfYear - 1, lastStu.RowCount - weekDayS.DayOfYear + 1, 0, lastStu.ColumnCount).ColumnSums().Sum());
+                                }
+                                weekStu += ((int)lastStu.SubMatrix(0, weekDayE.DayOfYear + 1, 0, lastStu.ColumnCount).ColumnSums().Sum());
                             }
-                            weekStu += ((int)lastStu.SubMatrix(0, weekDayE.DayOfYear + 1, 0, lastStu.ColumnCount).ColumnSums().Sum());
-                        }
-                        else
-                        {
-                            weekTch = ((int)tchList.SubMatrix(weekDayS.DayOfYear - 1, 7, 0, tchList.ColumnCount).ColumnSums().Sum());
-                            weekStu = ((int)stuList.SubMatrix(weekDayS.DayOfYear - 1, 7, 0, stuList.ColumnCount).ColumnSums().Sum());
-                        }
-                        item.weekTch = weekTch;
-                        item.monthTch = ((int)tchList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, tchList.ColumnCount).ColumnSums().Sum());
-                        item.tchUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-
-                        item.dayStu = dayStu;
-                        item.weekStu = weekStu;
-                        item.monthStu = ((int)stuList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, stuList.ColumnCount).ColumnSums().Sum());
-                        item.stuUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-
-                        var lessList = DenseMatrix.OfColumns(new List<List<double>>() { item.lesson.year });
-                        var interList = DenseMatrix.OfColumns(new List<List<double>>() { item.lesson.yearInters });
-                        var actList = DenseMatrix.OfColumns(new List<List<double>>() { item.activity.year });
-                        item.lesson.lastDay = lastDayLesson;
-
-                        int lastWeekLesson = 0;
-                        int lastWeekAct = 0;
-                        if (lWeekDayS.Year != dateOff.Year)
-                        {
-                            if (lastLesson != null)
+                            else
                             {
-                                lastWeekLesson += ((int)lastLesson.SubMatrix(lWeekDayS.DayOfYear - 1, lastLesson.RowCount - lWeekDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                                weekTch = ((int)tchList.SubMatrix(weekDayS.DayOfYear - 1, 7, 0, tchList.ColumnCount).ColumnSums().Sum());
+                                weekStu = ((int)stuList.SubMatrix(weekDayS.DayOfYear - 1, 7, 0, stuList.ColumnCount).ColumnSums().Sum());
                             }
-                            lastWeekLesson += ((int)lessList.SubMatrix(0, lWeekDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
+                            item.weekTch = weekTch;
+                            item.monthTch = ((int)tchList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, tchList.ColumnCount).ColumnSums().Sum());
+                            item.tchUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
 
-                            if (lastAct !=null)
-                            {
-                                lastWeekAct += ((int)lastAct.SubMatrix(lWeekDayS.DayOfYear - 1, lastAct.RowCount - lWeekDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
-                            }
-                            lastWeekAct += ((int)lastAct.SubMatrix(0, lWeekDayE.DayOfYear, 0, lastAct.ColumnCount).ColumnSums().Sum());
-                        }
-                        else
-                        {
-                            lastWeekLesson = ((int)lessList.SubMatrix(lWeekDayS.DayOfYear - 1, lWeekDayE.DayOfYear - lWeekDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
-                            lastWeekAct = ((int)actList.SubMatrix(lWeekDayS.DayOfYear - 1, 7, 0, actList.ColumnCount).ColumnSums().Sum());
-                        }
-                        item.lesson.lastWeek = lastWeekLesson;
-                        item.lesson.week = ((int)lessList.SubMatrix(weekDayS.DayOfYear - 1, (dateOff.DayOfYear - weekDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
+                            item.dayStu = dayStu;
+                            item.weekStu = weekStu;
+                            item.monthStu = ((int)stuList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, stuList.ColumnCount).ColumnSums().Sum());
+                            item.stuUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
 
-                        int lastTerm = 0;
-                        if (lTermDayS.Year < dateOff.Year)
-                        {
-                            if (lastLesson != null)
+                            var lessList = DenseMatrix.OfColumns(new List<List<double>>() { item.lesson.year });
+                            var interList = DenseMatrix.OfColumns(new List<List<double>>() { item.lesson.yearInters });
+                            var actList = DenseMatrix.OfColumns(new List<List<double>>() { item.activity.year });
+                            item.lesson.lastDay = lastDayLesson;
+
+                            int lastWeekLesson = 0;
+                            int lastWeekAct = 0;
+                            if (lWeekDayS.Year != dateOff.Year)
                             {
-                                lastTerm += ((int)lastLesson.SubMatrix(lTermDayS.DayOfYear - 1, lastStatsInfo.lesson.year.Count - lTermDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
-                            }
-                            lastTerm += ((int)lessList.SubMatrix(0, lTermDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
-                        }
-                        else
-                        {
-                            lastTerm += ((int)lessList.SubMatrix(lTermDayS.DayOfYear - 1, lTermDayE.DayOfYear - lTermDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
-                        }
-                        item.lesson.lastTerm = lastTerm;
+                                if (lastLesson != null)
+                                {
+                                    lastWeekLesson += ((int)lastLesson.SubMatrix(lWeekDayS.DayOfYear - 1, lastLesson.RowCount - lWeekDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                                }
+                                lastWeekLesson += ((int)lessList.SubMatrix(0, lWeekDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
 
-                        int term = 0;
-                        if (termDayE.Year > dateOff.Year)
-                        {
-                            if (lessList != null)
+                                if (lastAct != null)
+                                {
+                                    lastWeekAct += ((int)lastAct.SubMatrix(lWeekDayS.DayOfYear - 1, lastAct.RowCount - lWeekDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                                }
+                                lastWeekAct += ((int)lastAct.SubMatrix(0, lWeekDayE.DayOfYear, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                            }
+                            else
                             {
-                                term = ((int)lessList.SubMatrix(termDayS.DayOfYear - 1, (lessList.RowCount - termDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
+                                lastWeekLesson = ((int)lessList.SubMatrix(lWeekDayS.DayOfYear - 1, lWeekDayE.DayOfYear - lWeekDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                                lastWeekAct = ((int)actList.SubMatrix(lWeekDayS.DayOfYear - 1, 7, 0, actList.ColumnCount).ColumnSums().Sum());
                             }
-                        }
-                        else
-                        {
-                            if (termDayS.Year < dateOff.Year)
+                            item.lesson.lastWeek = lastWeekLesson;
+                            item.lesson.week = ((int)lessList.SubMatrix(weekDayS.DayOfYear - 1, (dateOff.DayOfYear - weekDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
+
+                            int lastTerm = 0;
+                            if (lTermDayS.Year < dateOff.Year)
                             {
                                 if (lastLesson != null)
                                 {
-                                    term += ((int)lastLesson.SubMatrix(termDayS.DayOfYear - 1, lastLesson.RowCount - termDayS.DayOfYear + 1, 0, lastLesson.ColumnCount).ColumnSums().Sum());
+                                    lastTerm += ((int)lastLesson.SubMatrix(lTermDayS.DayOfYear - 1, lastStatsInfo.lesson.year.Count - lTermDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
                                 }
-                                term += ((int)lessList.SubMatrix(0, termDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
+                                lastTerm += ((int)lessList.SubMatrix(0, lTermDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
                             }
                             else
                             {
-                                term = ((int)lessList.SubMatrix(termDayS.DayOfYear - 1, termDayE.DayOfYear - termDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                                lastTerm += ((int)lessList.SubMatrix(lTermDayS.DayOfYear - 1, lTermDayE.DayOfYear - lTermDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
                             }
-                        }
-                        item.lesson.term = term;
-                        item.lesson.day = 0;
+                            item.lesson.lastTerm = lastTerm;
 
-                        int lastMonth = 0;
-                        int lastMonthInter = 0;
-                        int lastMonthAct = 0;
-                        if (lMonthS.Year < dateOff.Year)
-                        {
-                            if (lastLesson != null)
+                            int term = 0;
+                            if (termDayE.Year > dateOff.Year)
                             {
-                                lastMonth = ((int)lastLesson.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lastLesson.ColumnCount).ColumnSums().Sum());
+                                if (lessList != null)
+                                {
+                                    term = ((int)lessList.SubMatrix(termDayS.DayOfYear - 1, (lessList.RowCount - termDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
+                                }
                             }
-
-                            if (lastInter != null)
+                            else
                             {
-                                lastMonthInter = ((int)lastInter.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lastInter.ColumnCount).ColumnSums().Sum());
+                                if (termDayS.Year < dateOff.Year)
+                                {
+                                    if (lastLesson != null)
+                                    {
+                                        term += ((int)lastLesson.SubMatrix(termDayS.DayOfYear - 1, lastLesson.RowCount - termDayS.DayOfYear + 1, 0, lastLesson.ColumnCount).ColumnSums().Sum());
+                                    }
+                                    term += ((int)lessList.SubMatrix(0, termDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
+                                }
+                                else
+                                {
+                                    term = ((int)lessList.SubMatrix(termDayS.DayOfYear - 1, termDayE.DayOfYear - termDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                                }
                             }
+                            item.lesson.term = term;
+                            item.lesson.day = 0;
+
+                            int lastMonth = 0;
+                            int lastMonthInter = 0;
+                            int lastMonthAct = 0;
+                            if (lMonthS.Year < dateOff.Year)
+                            {
+                                if (lastLesson != null)
+                                {
+                                    lastMonth = ((int)lastLesson.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lastLesson.ColumnCount).ColumnSums().Sum());
+                                }
 
-                            if (lastAct != null)
+                                if (lastInter != null)
+                                {
+                                    lastMonthInter = ((int)lastInter.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lastInter.ColumnCount).ColumnSums().Sum());
+                                }
+
+                                if (lastAct != null)
+                                {
+                                    lastMonthAct = ((int)lastAct.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                                }
+                            }
+                            else
                             {
-                                lastMonthAct = ((int)lastAct.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                                lastMonth = ((int)lessList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lessList.ColumnCount).ColumnSums().Sum());
+                                lastMonthInter = ((int)interList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, interList.ColumnCount).ColumnSums().Sum());
+                                lastMonthAct = ((int)actList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, actList.ColumnCount).ColumnSums().Sum());
                             }
-                        }
-                        else
-                        {
-                            lastMonth = ((int)lessList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lessList.ColumnCount).ColumnSums().Sum());
-                            lastMonthInter = ((int)interList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, interList.ColumnCount).ColumnSums().Sum());
-                            lastMonthAct = ((int)actList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, actList.ColumnCount).ColumnSums().Sum());
-                        }
-                        item.lesson.lastMonth = lastMonth;
-                        item.lesson.month += ((int)lessList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
-                        item.lesson.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                            item.lesson.lastMonth = lastMonth;
+                            item.lesson.month += ((int)lessList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
+                            item.lesson.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
 
-                        int lastDayInter = 0;
-                        if (lastDay.Year < dateOff.Year) 
-                        {
-                            if (lastStatsInfo.lesson.yearInters.Count > 0) 
+                            int lastDayInter = 0;
+                            if (lastDay.Year < dateOff.Year)
                             {
-                                lastDayInter = ((int)lastStatsInfo.lesson.yearInters[lastDay.DayOfYear - 1]);
+                                if (lastStatsInfo.lesson.yearInters.Count > 0)
+                                {
+                                    lastDayInter = ((int)lastStatsInfo.lesson.yearInters[lastDay.DayOfYear - 1]);
+                                }
                             }
-                        }
-                        else
-                        {
-                            lastDayInter = ((int)item.lesson.yearInters[lastDay.DayOfYear - 1]);
-                        }
-                        item.lesson.lastDayInter = lastDayInter;
-                        item.lesson.dayInter = 0;
-                        
-                        item.lesson.lastMonthInter = lastMonthInter;
-                        item.lesson.monthInter = ((int)interList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, interList.ColumnCount).ColumnSums().Sum());
+                            else
+                            {
+                                lastDayInter = ((int)item.lesson.yearInters[lastDay.DayOfYear - 1]);
+                            }
+                            item.lesson.lastDayInter = lastDayInter;
+                            item.lesson.dayInter = 0;
 
-                        if (lastStatsInfo != null)
-                        {
-                            if (lastInter != null)
+                            item.lesson.lastMonthInter = lastMonthInter;
+                            item.lesson.monthInter = ((int)interList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, interList.ColumnCount).ColumnSums().Sum());
+
+                            if (lastStatsInfo != null)
                             {
-                                item.lesson.lastYearInter = ((int)lastInter.SubMatrix(0, lastInter.RowCount, 0, lastInter.ColumnCount).ColumnSums().Sum());
+                                if (lastInter != null)
+                                {
+                                    item.lesson.lastYearInter = ((int)lastInter.SubMatrix(0, lastInter.RowCount, 0, lastInter.ColumnCount).ColumnSums().Sum());
+                                }
                             }
-                        }
 
-                        item.lesson.yearInter = ((int)item.lesson.yearInters.Sum());
+                            item.lesson.yearInter = ((int)item.lesson.yearInters.Sum());
 
-                        item.activity.dayCnt = ((int)item.activity.year[dateOff.DayOfYear - 1]);
-                        item.activity.lastDay = lastDayAct;
-                        item.activity.lastWeek = lastWeekAct;
-                        item.activity.week = ((int)actList.SubMatrix(weekDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, actList.ColumnCount).ColumnSums().Sum());
+                            item.activity.dayCnt = ((int)item.activity.year[dateOff.DayOfYear - 1]);
+                            item.activity.lastDay = lastDayAct;
+                            item.activity.lastWeek = lastWeekAct;
+                            item.activity.week = ((int)actList.SubMatrix(weekDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, actList.ColumnCount).ColumnSums().Sum());
 
-                        item.activity.lastMonth = lastMonthAct;
+                            item.activity.lastMonth = lastMonthAct;
 
-                        int lastTermAct = 0;
-                        if (lTermDayS.Year < dateOff.Year)
-                        {
-                            if (lastAct != null)
+                            int lastTermAct = 0;
+                            if (lTermDayS.Year < dateOff.Year)
                             {
-                                lastTermAct += ((int)lastAct.SubMatrix(lTermDayS.DayOfYear - 1, lastStatsInfo.activity.year.Count - lTermDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                                if (lastAct != null)
+                                {
+                                    lastTermAct += ((int)lastAct.SubMatrix(lTermDayS.DayOfYear - 1, lastStatsInfo.activity.year.Count - lTermDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                                }
+                                lastTermAct += ((int)actList.SubMatrix(0, lTermDayE.DayOfYear, 0, actList.ColumnCount).ColumnSums().Sum());
                             }
-                            lastTermAct += ((int)actList.SubMatrix(0, lTermDayE.DayOfYear, 0, actList.ColumnCount).ColumnSums().Sum());
-                        }
-                        else
-                        {
-                            lastTermAct += ((int)actList.SubMatrix(lTermDayS.DayOfYear - 1, lTermDayE.DayOfYear - lTermDayS.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
-                        }
-                        item.activity.lastTerm = lastTerm;
-
-                        int termAct = 0;
-                        if (termDayS.Year > dateOff.Year)
-                        {
-                            if (lastAct != null)
+                            else
                             {
-                                termAct += ((int)lastAct.SubMatrix(termDayS.DayOfYear - 1, lastStatsInfo.activity.year.Count - termDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                                lastTermAct += ((int)actList.SubMatrix(lTermDayS.DayOfYear - 1, lTermDayE.DayOfYear - lTermDayS.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
                             }
-                            termAct += ((int)actList.SubMatrix(0, termDayE.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
-                        }
-                        else
-                        {
-                            if (lTermDayS.Year < dateOff.Year)
+                            item.activity.lastTerm = lastTerm;
+
+                            int termAct = 0;
+                            if (termDayS.Year > dateOff.Year)
                             {
                                 if (lastAct != null)
                                 {
-                                    termAct += ((int)lastAct.SubMatrix(termDayS.DayOfYear - 1, lastStatsInfo.lesson.year.Count - termDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
+                                    termAct += ((int)lastAct.SubMatrix(termDayS.DayOfYear - 1, lastStatsInfo.activity.year.Count - termDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
                                 }
-                                termAct += ((int)actList.SubMatrix(0, termDayE.DayOfYear, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                                termAct += ((int)actList.SubMatrix(0, termDayE.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
                             }
                             else
                             {
-                                termAct += ((int)actList.SubMatrix(termDayS.DayOfYear - 1, termDayE.DayOfYear - termDayS.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
+                                if (lTermDayS.Year < dateOff.Year)
+                                {
+                                    if (lastAct != null)
+                                    {
+                                        termAct += ((int)lastAct.SubMatrix(termDayS.DayOfYear - 1, lastStatsInfo.lesson.year.Count - termDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
+                                    }
+                                    termAct += ((int)actList.SubMatrix(0, termDayE.DayOfYear, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                                }
+                                else
+                                {
+                                    termAct += ((int)actList.SubMatrix(termDayS.DayOfYear - 1, termDayE.DayOfYear - termDayS.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
+                                }
                             }
+                            item.activity.term = term;
+                            item.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                            statsInfos.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<StatsInfo>(item, item.id, new PartitionKey("Statistics")));
+                        }
+                        catch
+                        {
+                            scId.Add(item.schoolId);
                         }
-                        item.activity.term = term;
-
-                        item.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-
-                        statsInfos.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<StatsInfo>(item, item.id, new PartitionKey("Statistics")));
                     }
 
                     if (statsInfos.Count < 256)
@@ -890,10 +894,12 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                         }
                     }
                 }
+
+                await _dingDing.SendBotMsg($"BI,{Environment.GetEnvironmentVariable("Option:Location")},SetStatsZeroPoint() \n定时未清理学校id:{scId.ToJsonString()}", GroupNames.成都开发測試群組);
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"BI,{Environment.GetEnvironmentVariable("Option:Location")},SetStatsZeroPoint() \n{scId} \n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+                await _dingDing.SendBotMsg($"BI,{Environment.GetEnvironmentVariable("Option:Location")},SetStatsZeroPoint() \n{scId.ToJsonString()} \n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
             }
         }
     }

+ 68 - 13
TEAMModelOS.SDK/Models/Service/BI/BIStatsNotice.cs

@@ -1,6 +1,9 @@
 using Azure.Cosmos;
 using DocumentFormat.OpenXml.Bibliography;
+using DocumentFormat.OpenXml.Drawing;
+using DocumentFormat.OpenXml.Office2010.Excel;
 using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Logging;
 using Microsoft.VisualBasic;
 using System;
 using System.Collections.Generic;
@@ -12,13 +15,14 @@ using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
 using TEAMModelOS.SDK.Models.Cosmos.BI.BICommon;
+using static TEAMModelOS.SDK.CoreAPIHttpService;
 
 namespace TEAMModelOS.SDK.Models.Service.BI
 {
     public static class BIStatsNotice
     {
         /// <summary>
-        /// 统计通知
+        /// 汇总统计通知
         /// </summary>
         /// <param name="cosmosClient">连接</param>
         /// <param name="_dingDing">错误消息发送</param>
@@ -33,13 +37,17 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             try
             {
                 DateTimeOffset dateOff = DateTimeOffset.UtcNow;
-                if (careDate > 1000000000000)
-                    dateOff = DateTimeOffset.FromUnixTimeMilliseconds(careDate);
-                else
-                    dateOff = DateTimeOffset.FromUnixTimeSeconds(careDate);
+                if (careDate != 0)
+                {
+                    if (careDate > 1000000000000)
+                        dateOff = DateTimeOffset.FromUnixTimeMilliseconds(careDate);
+                    else
+                        dateOff = DateTimeOffset.FromUnixTimeSeconds(careDate);
+                }
 
+                string dt = dateOff.ToString("yyyyMMdd");
                 StatsNotice statsNotice = new();
-                var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year}-{id}", new PartitionKey("StatsNotice"));
+                var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dt}-{id}", new PartitionKey("StatsNotice"));
                 if (resStsInfo.Status == 200)
                 {
                     using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
@@ -47,7 +55,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                 }
                 else
                 {
-                    statsNotice.id = $"{dateOff.Year}-{id}";
+                    statsNotice.id = $"{dt}-{id}";
                     statsNotice.type = idType;
                     statsNotice.rangeId = id;
                 }
@@ -67,6 +75,10 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                         statsNotice.homeworkDayCnt = count;
                         break;
                 }
+                statsNotice.day = dt;
+                statsNotice.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                
+                statsNotice.ttl = 86400;
                 if (resStsInfo.Status == 200)
                 {
                     statsNotice = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<StatsNotice>(statsNotice, statsNotice.id, new PartitionKey("StatsNotice"));
@@ -83,25 +95,68 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         }
 
         /// <summary>
-        /// 发送消息
+        /// 发送每日课程信息通知
         /// </summary>
+        /// <param name="_coreAPIHttpService"></param>
+        /// <param name="cosmosClient"></param>
+        /// <param name="_dingDing"></param>
+        /// <param name="_configuration"></param>
+        /// <param name="jsonElement"></param>
         /// <returns></returns>
-        public static async Task MonitorStatsNotice(CosmosClient client, DingDing _dingDing, IConfiguration _configuration,JsonElement jsonElement) 
+        public static async Task MonitorStatsNotice(CoreAPIHttpService _coreAPIHttpService, CosmosClient cosmosClient, DingDing _dingDing, IConfiguration _configuration,JsonElement jsonElement) 
         {
             try
             {
                 StatsNotice statsNotice = jsonElement.ToObject<StatsNotice>();
                 DateTimeOffset dateOffset = DateTimeOffset.UtcNow;
+                jsonElement.TryGetProperty("dateTime", out JsonElement dateTime);
+                jsonElement.TryGetProperty("id", out JsonElement id);
+                string dt = "";
+                if (string.IsNullOrEmpty($"{dateTime}"))
+                {
+                    dt = DateTimeOffset.UtcNow.ToString("yyyyMMdd");
+                }
+                else
+                {
+                    dt = $"{dateTime}";
+                }
+
+                StringBuilder sqlTxt = new($"select value(c) from c where c.day='{dt}'");
+                if (!string.IsNullOrEmpty($"{id}"))
+                {
+                    sqlTxt.Append($" and c.rangeId = '{id}'");
+                }
+                List<StatsNotice> statsNotices = new();
+
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<StatsNotice>(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("StatsNotice") }))
+                {
+                    statsNotices.Add(item);
+                }
+
+                foreach (var item in statsNotices)
+                {
+                    List<string> tacherIds = new();
+                    if (item.type == "school")
+                    {
+                        await foreach (var tchId in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<string>(queryText: "SELECT c.id FROM c WHERE ARRAY_CONTAINS(c.roles, 'admin', true) AND c.pk = 'Teacher' AND c.status = 'join'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{item.rangeId}") }))
+                        {
+                            tacherIds.Add(tchId);
+                        }
+                    }
+                    else if (item.type == "private") 
+                    {
+                        tacherIds.Add(item.rangeId);
+                    }
+                    NotifyData notifyData = new() { hubName = "hita", sender = "IES", tags = tacherIds.Select(s => $"{s}-hata").ToList(), title = "每日课程信息", body = $"每日课程信息如下:\n\r学生名单数:{item.stuDayCnt} \n\r 课堂记录数:{item.classroomDayCnt} \n\r 评量活动数:{item.weighDayCnt} \n\r 作业活动数:{item.homeworkDayCnt}", eventId = $"IES_send", data = item.ToJsonString() };
 
+                    _coreAPIHttpService.CoursePushNotify(notifyData, new Dictionary<string, object>(), $"{Environment.GetEnvironmentVariable("Option:Location")}", _configuration, _dingDing);
+                }
             }
             catch (Exception ex)
             {
-
-                throw;
+                await _dingDing.SendBotMsg($"BI,{Environment.GetEnvironmentVariable("Option:Location")},MonitorStatsNotice(),参数:{jsonElement}\n {ex.StackTrace}", GroupNames.成都开发測試群組);
             }
 
-
-
         }
 
     }