using System; using System.Collections.Generic; using System.Dynamic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; using Azure.Cosmos; using Azure.Storage.Blobs; using DocumentFormat.OpenXml.Bibliography; using MathNet.Numerics.LinearAlgebra.Double; using Microsoft.AspNetCore.Http; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Configuration; using NUnit.Framework.Constraints; using StackExchange.Redis; using TEAMModelOS.SDK.Context.Constant; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK.Extension; using TEAMModelOS.SDK.Models; using TEAMModelOS.SDK.Models.Cosmos.BI; using TEAMModelOS.SDK.Models.Cosmos.BI.BISchool; using TEAMModelOS.SDK.Models.Service.BI; using TEAMModelOS.SDK.Models.Service.BIStatsWay; namespace TEAMModelOS.FunctionV4 { public class BIHttpTrigger { private readonly AzureCosmosFactory _azureCosmos; private readonly DingDing _dingDing; private readonly AzureStorageFactory _azureStorage; private readonly AzureRedisFactory _azureRedis; private readonly IConfiguration _configuration; private readonly IHttpClientFactory _httpClient; public BIHttpTrigger(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, IConfiguration configuration, IHttpClientFactory httpClient) { _azureCosmos = azureCosmos; _dingDing = dingDing; _azureStorage = azureStorage; _azureRedis = azureRedis; _configuration = configuration; _httpClient = httpClient; } /// /// 学校信息BI中间件更新 /// /// /// //[Function("set-sc-birelation")] public async Task upSchoolBIRelation([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req) { var response = req.CreateResponse(HttpStatusCode.OK); dynamic jsondata = new ExpandoObject(); try { var cosmosClient = _azureCosmos.GetCosmosClient(); var tableClient = _azureStorage.GetCloudTableClient(); var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public"); string data = await new StreamReader(req.Body).ReadToEndAsync(); var json = JsonDocument.Parse(data).RootElement; School school = new(); jsondata = json; if (json.TryGetProperty("school", out JsonElement _school)) { school = _school.ToObject(); } 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(); } 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.id, new PartitionKey("BIRel")); type = "update"; } else { await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync(bIRelation, new PartitionKey("BIRel")); type = "add"; } //保存操作记录 await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, $"birelation-{type}", $"触发更新学校信息表中间件", _dingDing); } catch (Exception ex) { await _dingDing.SendBotMsg($"BIFunction, {Environment.GetEnvironmentVariable("Option:Location")}, upSchoolBIRelation(),{ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}", GroupNames.成都开发測試群組); } return response; } /// /// 统计学校的信息 /// /// /// //[Function("stats-sc-info")] public async Task StatsSchoolInfo([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req) { var response = req.CreateResponse(HttpStatusCode.OK); dynamic jsondata = new ExpandoObject(); try { string scId = null; var cosmosClient = _azureCosmos.GetCosmosClient(); var redisClinet = _azureRedis.GetRedisClient(8); var tableClient = _azureStorage.GetCloudTableClient(); var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public"); string data = await new StreamReader(req.Body).ReadToEndAsync(); var json = JsonDocument.Parse(data).RootElement; jsondata = json; if (json.TryGetProperty("schoolId", out JsonElement _schoolId)) { scId = $"{_schoolId}"; } if (string.IsNullOrEmpty(scId)) { return response; } bool locKey = await _azureRedis.GetRedisClient(8).KeyExistsAsync($"Train:Statistics:Lock:{scId}"); if (!locKey) { await _azureRedis.GetRedisClient(8).SetAddAsync($"Train:Statistics:Lock:{scId}", new RedisValue(scId)); DateTime minutes = DateTime.UtcNow.AddMinutes(15); //15分钟 await _azureRedis.GetRedisClient(8).KeyExpireAsync($"Train:Statistics:Lock:{scId}", minutes); bool isExist = true; StatsInfo statsInfo = new(); var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{scId}", new PartitionKey("Stats")); if (scDataStats.Status == 200) { using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream); statsInfo = fileJson.ToObject(); } else isExist = false; statsInfo = await SchoolStatsWay.GetSingleSc(cosmosClient,redisClinet, scId); statsInfo.witRoom = ((int)await SchoolStatsWay.GetShoolWisdomRoomCount(_azureCosmos, _azureRedis, _configuration, _httpClient,_dingDing, scId)); //智慧教师 statsInfo.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); if (isExist) statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(statsInfo, statsInfo.id, new PartitionKey("Stats")); else statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync(statsInfo, new PartitionKey("Stats")); } //保存操作记录 await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, "trigger-schoolStats", $"触发更新统计数据库", _dingDing); } catch (Exception ex) { await _dingDing.SendBotMsg($"BIFunction,{Environment.GetEnvironmentVariable("Option:Location")}, StatsSchoolInfo() \n {ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}", GroupNames.成都开发測試群組); } return response; } public async Task SetSchoolStatsInfo([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req) { var response = req.CreateResponse(HttpStatusCode.OK); dynamic jsondata = new ExpandoObject(); string data = await new StreamReader(req.Body).ReadToEndAsync(); var json = JsonDocument.Parse(data).RootElement; jsondata = json; try { School school = null; if (json.TryGetProperty("school", out JsonElement _school)) school = _school.ToObject(); DateTimeOffset dateOff = DateTimeOffset.UtcNow; var cosmosClient = _azureCosmos.GetCosmosClient(); if (school != null) { StatsInfo statsInfo = new(); 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); statsInfo = fileJson.ToObject(); } else { double[] tchYear = new double[366]; tchYear[0] = 1; statsInfo.id = $"{dateOff.Year}-{school.id}"; statsInfo.year = dateOff.Year; statsInfo.stuYear = new double[366].ToList(); statsInfo.tchYear = tchYear.ToList(); statsInfo.tch = 1; statsInfo.weekTch = 1; statsInfo.monthTch = 1; statsInfo.tchUpTime = dateOff.ToUnixTimeMilliseconds(); statsInfo.lesson.year = new double[366].ToList(); statsInfo.lesson.yearInters = new double[366].ToList(); statsInfo.activity.year = new double[366].ToList(); } statsInfo.schoolId = school.id; statsInfo.name = school.name; statsInfo.picture = school.picture; statsInfo.size = school.size; statsInfo.scCreateTime = school.createTime; statsInfo.areaId = school.areaId; statsInfo.upTime = dateOff.ToUnixTimeMilliseconds(); if (resStats.Status == 200) await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(statsInfo, statsInfo.id, new PartitionKey("Statistics")); else await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(statsInfo, new PartitionKey("Statistics")); } } catch (Exception ex) { await _dingDing.SendBotMsg($"BIFunction,{Environment.GetEnvironmentVariable("Option:Location")}, SetSchoolStatsInfo() \n{ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}", GroupNames.成都开发測試群組); } return response; } /// /// 处理传过来的信息加入到统计信息中 /// /// /// //[Function("set-scstats-type")] public async Task SetSchoolStatsType([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestData req) { var response = req.CreateResponse(HttpStatusCode.OK); dynamic jsondata = new ExpandoObject(); try { string data = await new StreamReader(req.Body).ReadToEndAsync(); var json = JsonDocument.Parse(data).RootElement; jsondata = json; var cosmosClient = _azureCosmos.GetCosmosClient(); string scId = null, type = null; long careDate = 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}"; if (json.TryGetProperty("type", out JsonElement _type)) type = $"{_type}"; if (string.IsNullOrEmpty($"{_schoolId}") && string.IsNullOrEmpty($"{_type}")) { await _dingDing.SendBotMsg($"set-scstats-type, {json}", GroupNames.成都开发測試群組); return response; } if (json.TryGetProperty("cnt", out JsonElement _cnt)) count = _cnt.GetInt32(); if (json.TryGetProperty("interaction", out JsonElement _interaction)) interaction = _interaction.GetInt32(); if (json.TryGetProperty("lessType", out JsonElement _lessType)) lessType = _lessType.GetInt32(); if (json.TryGetProperty("date", out JsonElement _date)) careDate = _date.GetInt64(); else careDate = dateOff.ToUnixTimeMilliseconds(); 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 (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); 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); StatsInfo statsInfo = new(); 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); statsInfo = fileJson.ToObject(); } else { 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); statsInfo = fileJson.ToObject(); statsInfo.id = $"{dateOff.Year}-{scId}"; statsInfo.year = dateOff.Year; statsInfo.stuYear = new double[366].ToList(); statsInfo.tchYear = new double[366].ToList(); statsInfo.lesson.year = new double[366].ToList(); statsInfo.lesson.yearInters = new double[366].ToList(); statsInfo.activity.year = new double[366].ToList(); } else { ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "Common").ReadItemAsync(scId, new PartitionKey("Base")); statsInfo.id = $"{dateOff.Year}-{scBase.id}"; statsInfo.schoolId = scBase.id; statsInfo.name = scBase.name; statsInfo.picture = scBase.picture; statsInfo.size = scBase.size; statsInfo.scCreateTime = scBase.createTime; statsInfo.areaId = scBase.areaId; statsInfo.upTime = careDate; } } switch ($"{type}") { case "Exam": statsInfo.activity.exam += count; break; case "Survey": statsInfo.activity.survey += count; break; case "Vote": statsInfo.activity.vote += count; break; case "Homework": statsInfo.activity.homework += count; break; case "Less": //课例 statsInfo.lesson.year[dateOff.DayOfYear] += count; statsInfo.lesson.all += count; if (lessType == 0) statsInfo.lesson.open += count; else statsInfo.lesson.less += count; statsInfo.lesson.lastDay = ((int)statsInfo.lesson.year[lastDay.DayOfYear]); statsInfo.lesson.day = ((int)statsInfo.lesson.year[dateOff.DayOfYear]); var lessList = DenseMatrix.OfColumns(new List>() { statsInfo.lesson.year }); statsInfo.lesson.lastWeek = ((int)lessList.SubMatrix(lWeekDayS.DayOfYear, 7, 0, lessList.ColumnCount).ColumnSums().Sum()); statsInfo.lesson.week = ((int)lessList.SubMatrix(weekDayS.DayOfYear, (dateOff.DayOfYear - weekDayS.DayOfYear), 0, lessList.ColumnCount).ColumnSums().Sum()); if (lastTermS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= lastTermE) { if (lTermDayS.Year < dateOff.Year) { 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); var tempSts = fileJson.ToObject(); var actYer = DenseMatrix.OfColumns(new List>() { tempSts.lesson.year, statsInfo.lesson.year }); statsInfo.lesson.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum()); } } } if (termS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= termE) { 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(); var actYer = DenseMatrix.OfColumns(new List>() { tempSts.lesson.year, statsInfo.lesson.year }); statsInfo.lesson.term = ((int)actYer.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear, 0, 1).ColumnSums().Sum()); } else statsInfo.lesson.term += count; } } statsInfo.lesson.lastMonth = ((int)lessList.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, lessList.ColumnCount).ColumnSums().Sum()); statsInfo.lesson.month += ((int)lessList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, lessList.ColumnCount).ColumnSums().Sum()); //课例互动 statsInfo.lesson.yearInters[dateOff.DayOfYear] += interaction; statsInfo.lesson.allInter += interaction; statsInfo.lesson.lastDayInter = ((int)statsInfo.lesson.yearInters[lastDay.DayOfYear]); statsInfo.lesson.dayInter = ((int)statsInfo.lesson.yearInters[dateOff.DayOfYear]); var interList = DenseMatrix.OfColumns(new List>() { statsInfo.lesson.yearInters }); statsInfo.lesson.lastMonthInter = ((int)interList.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, interList.ColumnCount).ColumnSums().Sum()); statsInfo.lesson.monthInter += ((int)interList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, interList.ColumnCount).ColumnSums().Sum()); if (lastTermS <= statsInfo.lesson.upTime && statsInfo.lesson.upTime <= lastTermE) { 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.lesson.lastYearInter = ((int)tempSts.lesson.yearInters.Sum()); } else statsInfo.lesson.lastYearInter = 0; } } statsInfo.lesson.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); break; case "Student": statsInfo.stuYear[dateOff.DayOfYear] += count; statsInfo.stu += count; statsInfo.dayStu = ((int)statsInfo.stuYear[dateOff.DayOfYear]); var stuList = DenseMatrix.OfColumns(new List>() { statsInfo.stuYear }); statsInfo.weekStu = ((int)stuList.SubMatrix(weekDayS.DayOfYear, (dateOff.DayOfYear - weekDayS.DayOfYear), 0, stuList.ColumnCount).ColumnSums().Sum()); statsInfo.monthStu = ((int)stuList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, stuList.ColumnCount).ColumnSums().Sum()); statsInfo.stuUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); break; case "Teacher": statsInfo.tchYear[dateOff.DayOfYear] += count; statsInfo.tch += count; statsInfo.dayTch = ((int)statsInfo.tchYear[dateOff.DayOfYear]); var tchList = DenseMatrix.OfColumns(new List>() { statsInfo.tchYear }); statsInfo.weekTch = ((int)tchList.SubMatrix(weekDayS.DayOfYear, (dateOff.DayOfYear - weekDayS.DayOfYear), 0, tchList.ColumnCount).ColumnSums().Sum()); statsInfo.monthTch = ((int)tchList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, tchList.ColumnCount).ColumnSums().Sum()); statsInfo.tchUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); break; } if ($"{type}".Equals("Exam") || $"{type}".Equals("Survey") || $"{type}".Equals("Vote") || $"{type}".Equals("Homework")) { statsInfo.activity.all += count; if (careDate >= yearS && careDate <= yearE) { if (count > 0) { statsInfo.activity.year[dateOff.DayOfYear] += count; DenseMatrix matris = DenseMatrix.OfColumns(new List>() { 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 (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(); var actYer = DenseMatrix.OfColumns(new List>() { tempSts.activity.year, statsInfo.activity.year }); statsInfo.activity.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear, 0, 1).ColumnSums().Sum()); } else statsInfo.activity.lastTerm = 0; } } if (termS <= statsInfo.activity.upTime && statsInfo.activity.upTime <= termE) { if (termDayS.Year < dateOff.Year) { var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{termDayS.Year}-{scId}", new PartitionKey("Statistics")); if (lastSts.Status == 200) { using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream); var tempSts = fileJson.ToObject(); var actYer = DenseMatrix.OfColumns(new List>() { 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>() { 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(); } } } if (resStsInfo.Status == 200) statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(statsInfo, scId, new PartitionKey("Statistics")); else statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(statsInfo, new PartitionKey("Statistics")); } catch (Exception ex) { await _dingDing.SendBotMsg($"BIFunction,{Environment.GetEnvironmentVariable("Option:Location")}, SetSchoolStatsType() \n{ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}", GroupNames.成都开发測試群組); } return response; } } }