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