Browse Source

Merge branch 'PL/develop-BI' into develop

Li 2 years ago
parent
commit
03e2cf38c0

+ 11 - 0
TEAMModelBI/Controllers/BITest/TestController.cs

@@ -1757,6 +1757,17 @@ namespace TEAMModelBI.Controllers.BITest
         }
 
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public async Task<IActionResult> SetStatsZero() 
+        {
+            await BIStats.SetStatsZeroPoint(_azureCosmos, _dingDing);
+            return Ok(new { });
+        }
+
+
         /// <summary>
         /// 测试依据类型增/减量统计方法
         /// </summary>

+ 10 - 10
TEAMModelOS.SDK/Context/Attributes/Filter/ApiTokenAttribute.cs

@@ -142,8 +142,8 @@ namespace TEAMModelOS.Filter
                         string iss = jwt.Payload.Iss; //iss 检查jwt是否是测试站,正式站的授权key 
                         string tokenScope = jwt.Claims.FirstOrDefault(claim => claim.Type.Equals("scope"))?.Value;
                         //访问的jwt的tokenScope 是否与访问的接口一致。
-                        //if (tokenScope.Equals(scope))
-                        //{
+                        if (tokenScope.Equals(scope))
+                        {
 
                             var keys = OpenApiJtwIssuer.OpenApiJtw签发者.GetDescriptionText().Split(',');
                             string issuer = "";
@@ -175,8 +175,8 @@ namespace TEAMModelOS.Filter
                             {
                                 issuer = keys[3];
                             }
-                            //if (iss.Equals(issuer))
-                            //{
+                            if (iss.Equals(issuer))
+                            {
                                 //aud  受众
                                 id = jwt.Payload.Sub;//主题,又是应用APP,或者企业id 
                                 jti = jwt.Payload.Jti;//jwt唯一标识
@@ -303,12 +303,12 @@ namespace TEAMModelOS.Filter
                                     {
                                     }
                                 }
-                        //    }
-                        //}
-                        //else
-                        //{
-                        //    msg = "token的scope与接口的业务类型不匹配!"; code = 401008;
-                        //}
+                            }
+                        }
+                        else
+                        {
+                            msg = "token的scope与接口的业务类型不匹配!"; code = 401008;
+                        }
                     }
                     else
                     {

+ 4 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/GroupList.cs

@@ -210,6 +210,10 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         public string groupName { get; set; }
         public string nickname { get; set; }
+        /// <summary>
+        /// 性别 M( male,男) F (female 女)  N(secret 保密) 
+        /// </summary>
+        public string gender { get; set; }
         //补充毕业
         //0在校,1毕业 
         public int graduate { get; set; } = 0;

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

@@ -399,5 +399,154 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             //保存操作记录
             await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, $"birelation-{type}", $"触发更新学校信息表中间件", _dingDing);
         }
+
+        /// <summary>
+        /// 每天00:00执行统计清零方法;zore时间
+        /// </summary>
+        /// <param name="_azureCosmos"></param>
+        /// <param name="_dingDing"></param>
+        /// <returns></returns>
+        public static async Task SetStatsZeroPoint(AzureCosmosFactory _azureCosmos, DingDing _dingDing)
+        {
+            try
+            {
+                var cosmosClient = _azureCosmos.GetCosmosClient();
+                DateTimeOffset dateOff = DateTimeOffset.UtcNow;
+                long upTime = dateOff.ToUnixTimeMilliseconds();
+                var (DayS, DayE) = TimeHelper.GetStartOrEnd(dateOff);      //今天开始时间结束时间
+                var (lastWeekS, lastWeekE) = TimeHelper.GetStartOrEnd(dateOff, "lastweek");   //计算上周开始/结束时间
+                var (weekS, weekE) = TimeHelper.GetStartOrEnd(dateOff, "week");             //计算本周开始/结束时间
+                var (lastMonthS, lastMonthE) = TimeHelper.GetStartOrEnd(dateOff, "lastMonth");   //上月开始/结束时间
+                var (monthS, monthE) = TimeHelper.GetStartOrEnd(dateOff, "month");             //本月开始/结束时间
+                var (lastTermS, lastTermE) = TimeHelper.GetStartOrEnd(dateOff, "lastterm");   //计算上学期开始/结束时间
+                var (termS, termE) = TimeHelper.GetStartOrEnd(dateOff, "term");   //计算本学期开始/结束时间
+
+                var (weekDayS, weekDayE) = TimeHelper.GetLongToTime(weekS, weekE);
+                var (lWeekDayS, lWeekDayE) = TimeHelper.GetLongToTime(lastWeekS, lastWeekE);
+                var (lTermDayS, lTermDayE) = TimeHelper.GetLongToTime(lastTermS, lastTermE);
+                var (termDayS, termDayE) = TimeHelper.GetLongToTime(lastTermS, lastTermE);
+                var (lMonthS, lMonthE) = TimeHelper.GetLongToTime(lastMonthS, lastMonthE);
+                var (monthDayS, monthDayE) = TimeHelper.GetLongToTime(monthS, monthE);
+                var lastDay = dateOff.AddDays(-1);
+                int lmthDay = TimeHelper.GetDateDay(lMonthE);
+
+                int termDay = 0;
+
+                List<Task<ItemResponse<StatsInfo>>> statsInfos = new();
+                List<StatsInfo> tempStatsInfos = new();
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<StatsInfo>(queryText: "select value(c) from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
+                {
+                    tempStatsInfos.Add(item);
+                }
+
+                if (tempStatsInfos.Count > 0)
+                {
+                    foreach (var item in tempStatsInfos)
+                    {
+                        if (termDayE.Year == dateOff.Year)
+                            termDay = dateOff.DayOfYear;
+                        else
+                            termDay = item.activity.year.Count;
+                        StatsInfo lastStatsInfo = 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>();
+                        }
+
+                        var tchList = DenseMatrix.OfColumns(new List<List<double>>() { item.tchYear });
+                        item.dayTch = ((int)item.tchYear[lastDay.DayOfYear]);
+                        item.weekTch = ((int)tchList.SubMatrix(weekDayS.DayOfYear, 7, 0, tchList.ColumnCount).ColumnSums().Sum());
+                        item.monthTch = ((int)tchList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, tchList.ColumnCount).ColumnSums().Sum());
+                        item.tchUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+
+                        var stuList = DenseMatrix.OfColumns(new List<List<double>>() { item.stuYear });
+                        item.dayStu = ((int)item.stuYear[lastDay.DayOfYear]);
+                        item.weekStu = ((int)stuList.SubMatrix(weekDayS.DayOfYear, 7, 0, stuList.ColumnCount).ColumnSums().Sum());
+                        item.monthStu = ((int)stuList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, stuList.ColumnCount).ColumnSums().Sum());
+                        item.stuUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+
+                        var lessList = DenseMatrix.OfColumns(new List<List<double>>() { item.lesson.year });
+                        item.lesson.lastDay = item.lesson.day;
+                        item.lesson.lastWeek = ((int)lessList.SubMatrix(lWeekDayS.DayOfYear, 7, 0, lessList.ColumnCount).ColumnSums().Sum());
+                        item.lesson.week = ((int)lessList.SubMatrix(weekDayS.DayOfYear, 7, 0, lessList.ColumnCount).ColumnSums().Sum());
+
+                        if (lTermDayS.Year < dateOff.Year)
+                        {
+                            if (lastStatsInfo != null)
+                            {
+                                var lessYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.lesson.year, item.lesson.year });
+                                item.lesson.lastTerm = ((int)lessYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                            }
+                        }
+                        item.lesson.term = ((int)lessList.SubMatrix(termDayS.DayOfYear, termDay, 0, 1).ColumnSums().Sum());
+
+                        item.lesson.day = 0;
+                        item.lesson.lastMonth = ((int)lessList.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, lessList.ColumnCount).ColumnSums().Sum());
+                        item.lesson.month += ((int)lessList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, lessList.ColumnCount).ColumnSums().Sum());
+                        item.lesson.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+
+                        var interList = DenseMatrix.OfColumns(new List<List<double>>() { item.lesson.yearInters });
+                        item.lesson.lastDayInter = ((int)item.lesson.yearInters[lastDay.DayOfYear]);
+                        item.lesson.dayInter = 0;
+                        item.lesson.lastMonthInter = ((int)interList.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, interList.ColumnCount).ColumnSums().Sum());
+                        item.lesson.monthInter = ((int)interList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, interList.ColumnCount).ColumnSums().Sum());
+
+                        if (lastStatsInfo != null)
+                        {
+                            var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.lesson.yearInters });
+                            item.lesson.lastYearInter = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, 366, 0, 1).ColumnSums().Sum());
+                        }
+
+                        item.lesson.yearInter = ((int)item.lesson.yearInters.Sum());
+
+                        item.activity.dayCnt = ((int)item.activity.year[dateOff.DayOfYear]);
+                        item.activity.lastDay = ((int)item.activity.year[lastDay.DayOfYear]);
+                        var actList = DenseMatrix.OfColumns(new List<List<double>>() { item.activity.year });
+                        item.activity.lastWeek = ((int)actList.SubMatrix(lWeekDayS.DayOfYear, 7, 0, actList.ColumnCount).ColumnSums().Sum());
+                        item.activity.week = ((int)actList.SubMatrix(weekDayS.DayOfYear, 7, 0, actList.ColumnCount).ColumnSums().Sum());
+
+                        if (lMonthS.Year == dateOff.Year)
+                            item.activity.lastMonth = ((int)actList.SubMatrix(lMonthS.DayOfYear, lMonthE.DayOfYear, 0, actList.ColumnCount).ColumnSums().Sum());
+                        else
+                        {
+                            var lastMthYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.activity.year });
+                            item.activity.lastMonth = ((int)lastMthYer.SubMatrix(lMonthS.DayOfYear, lMonthE.DayOfYear, 0, actList.ColumnCount).ColumnSums().Sum());
+                        }
+
+                        item.activity.month = ((int)actList.SubMatrix(monthDayS.DayOfYear, monthDayE.DayOfYear, 0, actList.ColumnCount).ColumnSums().Sum());
+
+                        if (lastStatsInfo != null)
+                        {
+                            var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.activity.year });
+                            item.activity.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum());
+                        }
+
+                        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)
+                        await Task.WhenAll(statsInfos);
+                    else
+                    {
+                        int pages = (statsInfos.Count + 255) / 256;
+                        for (int i = 0; i < pages; i++)
+                        {
+                            List<Task<ItemResponse<StatsInfo>>> itemResponses = statsInfos.Skip((i) * 256).Take(256).ToList();
+                            await Task.WhenAll(itemResponses);
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"BI, SetStatsZeroPoint() \n  {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+            }
+        }
     }
 }

+ 1 - 0
TEAMModelOS.SDK/Models/Service/GroupListService.cs

@@ -1282,6 +1282,7 @@ namespace TEAMModelOS.SDK
                                 y.picture = student?.picture;
                                 y.classId = student?.classId;
                                 y.graduate = student.graduate;
+                                y.gender = student.gender;
                                 y.year = student.year;
                                 y.gender = student.gender;
                                 x.grades.Add(student.year);

+ 1 - 0
TEAMModelOS.SDK/Models/Service/StatisticsService.cs

@@ -238,6 +238,7 @@ namespace TEAMModelOS.SDK
                         code = $"TeacherTrain-{school}",
                         tmdid = x,
                         nickname = member.nickname,
+                        
                         name = member.name,
                         picture = member.picture,
                         school = school,

+ 3 - 4
TEAMModelOS/Controllers/OpenApi/OpenApiService.cs

@@ -1839,9 +1839,6 @@ namespace TEAMModelOS.Controllers
                 await _dingDing.SendBotMsg($"OpenApi,{Environment.GetEnvironmentVariable("Option:Location")} OpenApiService/GetLoginStuInfo()   参数:stu:{stuId},school:{school},json:{json.ToJsonString()} \n  {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
                 return new ResponseData<dynamic>() { code = RespondCode.Error, msg = "服务器错误" };
             }
-
-
-
         }
 
         /// <summary>
@@ -1863,7 +1860,9 @@ namespace TEAMModelOS.Controllers
                 List<OStudent> student = new();
                 //List<OStudent> tmdId = new();
 
-                string sqlStu = $"select value(c) from c where c.id in ({string.Join(",", ids.Select(s => $"'{s}'"))})";
+                string sqlStu = $"select value(c) from c ";
+                if (ids.Count > 0)
+                    sqlStu = $"select value(c) from c  where c.id in ({string.Join(",", ids.Select(s => $"'{s}'"))})";
                 await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<OStudent>(queryText: sqlStu, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{school}") }))
                 {
                     student.Add(item);