Bläddra i källkod

Merge branch 'PL/develop-BI' into develop

Li 2 år sedan
förälder
incheckning
d68970beda

+ 77 - 18
TEAMModelBI/Controllers/Census/SchoolController.cs

@@ -26,6 +26,7 @@ using TEAMModelOS.SDK.Models.Cosmos.BI.BISchool;
 using TEAMModelOS.SDK.Models.Service.BI;
 using TEAMModelOS.SDK.Models.Service.BIStatsWay;
 using static TEAMModelBI.Controllers.Census.SchoolController;
+using LessonStats = TEAMModelOS.SDK.Models.Cosmos.BI.LessonStats;
 
 namespace TEAMModelBI.Controllers.Census
 {
@@ -538,6 +539,7 @@ namespace TEAMModelBI.Controllers.Census
                 if (!string.IsNullOrEmpty(statsInfo.id))
                 {
                     scStats.id = statsInfo.id;
+                    scStats.schoolId = statsInfo.schoolId;
                     scStats.name = statsInfo.name;
                     scStats.picture = statsInfo.picture;
                     scStats.areaId = statsInfo.areaId;
@@ -569,7 +571,7 @@ namespace TEAMModelBI.Controllers.Census
                     scStats.lessStats.monthInter = statsInfo.lesson.monthInter;
                     scStats.lessStats.lastYearInter = statsInfo.lesson.lastYearInter;
                     scStats.lessStats.yearInter = statsInfo.lesson.yearInter;
-                    //scStats.lessStats.LastYear = TimeHelper.GetYearMonth(statsInfo.lesson.LastYear, dateTime.Year, dateTime.Month);
+                    scStats.lessStats.yearInters = TimeHelper.GetYearMonth(statsInfo.lesson.yearInters, dateTime.Year, dateTime.Month);
                     scStats.lessStats.year = TimeHelper.GetYearMonth(statsInfo.lesson.year, dateTime.Year, dateTime.Month);
                     scStats.actStats.all = statsInfo.activity.all;
                     scStats.actStats.exam = statsInfo.activity.exam;
@@ -640,25 +642,52 @@ namespace TEAMModelBI.Controllers.Census
         [HttpPost("get-areastats")]
         public async Task<IActionResult> GetAreaStats(JsonElement jsonElement)
         {
-            if (!jsonElement.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
+            jsonElement.TryGetProperty("areaId", out JsonElement areaId);
+            jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
+            jsonElement.TryGetProperty("role", out JsonElement role);
 
-            var cosmosClient = _azureCosmos.GetCosmosClient();
+            if (string.IsNullOrEmpty($"{areaId}") && string.IsNullOrEmpty($"{tmdId}"))
+                return Ok(new { stats = RespondCode.ParamsError, msg = "areaId/tmdId两者参数不能都为空!" });
 
-            Area area = new();
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+            Area area = null;
             ScStats areaScStats = new();
+            List<string> scIds = new();
 
-            var respSc = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").ReadItemStreamAsync($"{areaId}", new PartitionKey($"Base-Area"));
-            if (respSc.Status == 200)
+            StringBuilder scSql = new("select value(c.id) from c");
+            StringBuilder lastScSql = new("select value(c.id) from c");
+            if (!string.IsNullOrEmpty($"{areaId}"))
             {
-                using var fileJson = await JsonDocument.ParseAsync(respSc.ContentStream);
-                area = fileJson.ToObject<Area>();
+                scSql.Append($" where c.areaId='{areaId}'");
+                lastScSql.Append($" where c.areaId='{areaId}'");
+                var respSc = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").ReadItemStreamAsync($"{areaId}", new PartitionKey($"Base-Area"));
+                if (respSc.Status == 200)
+                {
+                    using var fileJson = await JsonDocument.ParseAsync(respSc.ContentStream);
+                    area = fileJson.ToObject<Area>();
+                }
+                else
+                    return Ok(new { state = RespondCode.NotFound, msg = $"未找到id:{areaId};相关的学区,请检查!" });
             }
-            else
-                return Ok(new { state = RespondCode.NotFound, msg = $"未找到id:{areaId};相关的学区,请检查!" });
 
-            List<string> scIds = new();
-            string scSql = $"select value(c.id) from c where c.areaId='{areaId}'";
-            scIds = await CommonFind.FindScIds(cosmosClient, scSql, "Base");
+            if (!string.IsNullOrEmpty($"{tmdId}")) 
+            {
+                switch ($"{role}")
+                {
+                    case "assists":
+                        scSql.Append($" join a in c.assists where a.id='{tmdId}'");
+                        lastScSql.Append($" join a in c.assists where a.id='{tmdId}'");
+                        break;
+                    case "sales":
+                        scSql.Append($" join a in c.sales where a.id='{tmdId}'");
+                        lastScSql.Append($" join a in c.sales where a.id='{tmdId}'");
+                        break;
+                    default:
+                        return Ok(new { state = RespondCode.ParamsError, msg = "role参数错误" });
+                }
+            }
+
+            scIds = await CommonFind.FindScIds(cosmosClient, scSql.ToString(), "BIRel");
             StringBuilder statsSql = new("select value(c) from c");
             if (scIds.Count > 0)
             {
@@ -673,11 +702,24 @@ namespace TEAMModelBI.Controllers.Census
                 statsInfos.Add(item);
             }
 
-            StatsInfo statsInfo = new();
+            StringBuilder lastStsSql = new("select c.lesson,c.activity from c");
+            if (scIds.Count > 0)
+            {
+                lastStsSql.Append($" where {BICommonWay.ManyScSql("c.id", scIds, $"{DateTimeOffset.UtcNow.Year - 1}-")}");
+            }
+            List<LastYearLessAndAct> lastYear = new();
+
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LastYearLessAndAct>(queryText: lastStsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
+            {
+                lastYear.Add(item);
+            }
+
+            StatsInfo statsInfo = null;
             statsInfo = SchoolStatsWay.GetAreaStats(cosmosClient, _httpTrigger, _option, statsInfos, scIds, area);
-            if (!string.IsNullOrEmpty(statsInfo.id))
+            if (statsInfo != null)
             {
                 areaScStats.id = statsInfo.id;
+                areaScStats.schoolId = statsInfo.schoolId;
                 areaScStats.name = statsInfo.name;
                 areaScStats.picture = statsInfo.picture;
                 areaScStats.areaId = statsInfo.areaId;
@@ -709,7 +751,8 @@ namespace TEAMModelBI.Controllers.Census
                 areaScStats.lessStats.monthInter = statsInfo.lesson.monthInter;
                 areaScStats.lessStats.lastYearInter = statsInfo.lesson.lastYearInter;
                 areaScStats.lessStats.yearInter = statsInfo.lesson.yearInter;
-                //areaScStats.lessStats.LastYear = TimeHelper.GetYearMonth(statsInfo.lesson.LastYear, dateTime.Year, dateTime.Month);
+                areaScStats.lessStats.yearInters = TimeHelper.GetYearMonth(statsInfo.lesson.yearInters, dateTime.Year, dateTime.Month);
+                areaScStats.lessStats.LastYear = TimeHelper.GetYearMonth(BICommonWay.ManyDoubleMerge(lastYear.Select(s => s.lesson.year).Where(w => w.Count > 0).ToList()), dateTime.Year, dateTime.Month);
                 areaScStats.lessStats.year = TimeHelper.GetYearMonth(statsInfo.lesson.year, dateTime.Year, dateTime.Month);
                 areaScStats.actStats.all = statsInfo.activity.all;
                 areaScStats.actStats.exam = statsInfo.activity.exam;
@@ -722,7 +765,7 @@ namespace TEAMModelBI.Controllers.Census
                 areaScStats.actStats.week = statsInfo.activity.week;
                 areaScStats.actStats.lastTerm = statsInfo.activity.lastTerm;
                 areaScStats.actStats.term = statsInfo.activity.term;
-                //areaScStats.actStats.LastYear = TimeHelper.GetYearMonth(statsInfo.activity.LastYear, dateTime.Year, dateTime.Month);
+                areaScStats.actStats.LastYear = TimeHelper.GetYearMonth(BICommonWay.ManyDoubleMerge(lastYear.Select(s => s.lesson.year).Where(w => w.Count > 0).ToList()), dateTime.Year, dateTime.Month);
                 areaScStats.actStats.year = TimeHelper.GetYearMonth(statsInfo.activity.year, dateTime.Year, dateTime.Month);
                 if (statsInfo.study != null)
                 {
@@ -828,6 +871,7 @@ namespace TEAMModelBI.Controllers.Census
         public record ScStats
         {
             public string id { get; set; }
+            public string schoolId { get; set; }
             public string name { get; set; }
             public string picture { get; set; }
             public string areaId { get; set; }
@@ -871,7 +915,7 @@ namespace TEAMModelBI.Controllers.Census
             public int monthInter { get; set; }
             public int lastYearInter { get; set; }
             public int yearInter { get; set; }
-            //public List<YearMonth> yearInter { get; set; } = new List<YearMonth>();//12个月
+            public List<YearMonth> yearInters { get; set; } = new List<YearMonth>();//12个月
             public List<YearMonth> LastYear { get; set; } = new List<YearMonth>();//12个月
             public List<YearMonth> year { get; set; } = new List<YearMonth>();    //12个月
         }
@@ -911,5 +955,20 @@ namespace TEAMModelBI.Controllers.Census
             public int finish { get; set; }
         }
 
+        /// <summary>
+        /// 查询去年的统计
+        /// </summary>
+        public record LastYearLessAndAct
+        {
+            /// <summary>
+            /// 课例活动
+            /// </summary>
+            public LessonStats lesson { get; set; } = new LessonStats();
+
+            /// <summary>
+            /// 活动
+            /// </summary>
+            public ActivityStats activity { get; set; } = new ActivityStats();
+        }
     }
 }

+ 8 - 4
TEAMModelBI/Controllers/RepairApi/SchoolRepController.cs

@@ -500,6 +500,7 @@ namespace TEAMModelBI.Controllers.RepairApi
         public async Task<IActionResult> SetAllScStats(JsonElement jsonElement) 
         {
             jsonElement.TryGetProperty("scId", out JsonElement scId);
+            jsonElement.TryGetProperty("year", out JsonElement _year);
             var cosmosClient = _azureCosmos.GetCosmosClient();
             
             List<string> scIds = new();
@@ -509,13 +510,16 @@ namespace TEAMModelBI.Controllers.RepairApi
                 scIds = await CommonFind.FindScIds(cosmosClient, "select value(c.id) from c ", "Base");
 
             DateTimeOffset dateTime = DateTimeOffset.UtcNow;
+            int year = dateTime.Year;
+            if (!string.IsNullOrEmpty($"{_year}"))
+                year = _year.GetInt32();
 
             List<StatsInfo> statsInfos = new();
             List<Task<ItemResponse<StatsInfo>>> taskStss = new();
             foreach (var sc in scIds) 
             {
                 StatsInfo statsInfo = new();
-                var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{dateTime.Year}-{sc}", new PartitionKey("Statistics"));
+                var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{year}-{sc}", new PartitionKey("Statistics"));
                 if (scDataStats.Status == 200)
                 {
                     using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream);
@@ -523,13 +527,13 @@ namespace TEAMModelBI.Controllers.RepairApi
                 }
                 else
                 {
-                    statsInfo.id = $"{dateTime.Year}-{sc}";
+                    statsInfo.id = $"{year}-{sc}";
                 }
 
-                statsInfo = await SchoolStatsWay.GetSingleSc(cosmosClient, sc);
+                statsInfo = await SchoolStatsWay.GetSingleSc(cosmosClient, sc, year);
 
                 if (scDataStats.Status == 200)
-                    taskStss.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, $"{dateTime.Year}-{sc}", new PartitionKey("Statistics")));
+                    taskStss.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, $"{year}-{sc}", new PartitionKey("Statistics")));
                 else
                     taskStss.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics")));
 

+ 4 - 1
TEAMModelOS.SDK/Models/Cosmos/BI/StatsInfo.cs

@@ -201,7 +201,10 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// 今年互动
         /// </summary>
         public int yearInter { get; set; }
-        //public List<double> yearInter { get; set; } = new List<double>();
+        /// <summary>
+        /// 今年互动
+        /// </summary>
+        public List<double> yearInters { get; set; } = new List<double>();
 
         /// <summary>
         /// 去年每天的数据  366天

+ 18 - 12
TEAMModelOS.SDK/Models/Service/BIStatsWay/LessonRecordStatsWay.cs

@@ -46,7 +46,7 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             lessStats.less = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{currSql} and c.upload = 1", $"LessonRecord-{id}");
 
             List<LessRelStats> lessRelStats = new();
-            string sql = $"select c.id,c.code,c.startTime,c.clientInteractionCount from c where c.pk='LessonRecord' and c.startTime >= {lastYearS} and c.startTime <= {yearE}";
+            string sql = $"select c.id,c.code,c.startTime,c.clientInteractionCount from c where c.pk='LessonRecord' and c.startTime >= {yearS} and c.startTime <= {yearE}";
             await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<LessRelStats>(queryText: sql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord-{id}") }))
             {
                 lessRelStats.Add(item);
@@ -61,22 +61,28 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
 
             lessStats.lastDayInter = lessRelStats.FindAll(f => f.startTime >= lastDayS && f.startTime <= lastdayE).ToList().Select(s => s.clientInteractionCount).Sum();
             lessStats.dayInter = lessRelStats.FindAll(f => f.startTime >= dayS && f.startTime <= dayS).ToList().Select(s => s.clientInteractionCount).Sum();
-            lessStats.lastMonthInter = lessRelStats.FindAll(f => f.startTime >= lastWeekS && f.startTime <= lastWeekE).ToList().Select(s => s.clientInteractionCount).Sum();
-            lessStats.monthInter = lessRelStats.FindAll(f => f.startTime >= weekS && f.startTime <= weekS).ToList().Select(s => s.clientInteractionCount).Sum();
-            lessStats.lastYearInter = lessRelStats.FindAll(f => f.startTime >= lastTermS && f.startTime <= lastTermE).ToList().Select(s => s.clientInteractionCount).Sum();
-            lessStats.yearInter = lessRelStats.FindAll(f => f.startTime >= termS && f.startTime <= termE).ToList().Select(s => s.clientInteractionCount).Sum();
+            lessStats.lastMonthInter = lessRelStats.FindAll(f => f.startTime >= lastMthS && f.startTime <= LastmthE).ToList().Select(s => s.clientInteractionCount).Sum();
+            lessStats.monthInter = lessRelStats.FindAll(f => f.startTime >= mthS && f.startTime <= mthE).ToList().Select(s => s.clientInteractionCount).Sum();
+            //lessStats.lastYearInter = lessRelStats.FindAll(f => f.startTime >= lastYearS && f.startTime <= lastYearE).ToList().Select(s => s.clientInteractionCount).Sum();
+            lessStats.lastYearInter = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"select value(sum(c.clientInteractionCount)) from c where c.startTime >= {lastYearS} and c.startTime <= {lastYearE}", $"LessonRecord-{id}");
+            lessStats.yearInter = lessRelStats.FindAll(f => f.startTime >= yearS && f.startTime <= yearE).ToList().Select(s => s.clientInteractionCount).Sum();
 
             DateTimeOffset lyearDay = new(DateTimeOffset.UtcNow.Year - 1, DateTimeOffset.UtcNow.Month, DateTimeOffset.UtcNow.Day, DateTimeOffset.UtcNow.Hour, DateTimeOffset.UtcNow.Minute, DateTimeOffset.UtcNow.Second, TimeSpan.Zero);
             List<StartEndTime> leveryDay = TimeHelper.GetYearEveryDay(lyearDay);
             List<StartEndTime> everyDay = TimeHelper.GetYearEveryDay(DateTimeOffset.UtcNow);
 
-            //for (int i = 0; i < leveryDay.Count; i++)
-            //{
-            //    if (lessStats.LastYear.Count == 366)
-            //        lessStats.LastYear[i] = (double)lessRelStats.FindAll(f => (f.startTime >= leveryDay[i].start && f.startTime <= leveryDay[i].end)).Count;
-            //    else
-            //        lessStats.LastYear.Add((double)lessRelStats.FindAll(f => (f.startTime >= leveryDay[i].start && f.startTime <= leveryDay[i].end)).Count);
-            //}
+            List<double> doubles = new();
+            List<object> list = new();
+            List<object> list1 = new();
+
+            for (int i = 0; i < everyDay.Count; i++)
+            {
+                if (lessStats.yearInters.Count == 366)
+                    lessStats.yearInters[i] = (double)lessRelStats.FindAll(f => (f.startTime >= everyDay[i].start && f.startTime <= everyDay[i].end)).Select(s => s.clientInteractionCount).Sum();
+                else
+                    lessStats.yearInters.Add((double)lessRelStats.FindAll(f => (f.startTime >= everyDay[i].start && f.startTime <= everyDay[i].end)).Select(s => s.clientInteractionCount).Sum());
+                
+            }
 
             for (int i = 0; i < everyDay.Count; i++)
             {

+ 28 - 4
TEAMModelOS.SDK/Models/Service/BIStatsWay/SchoolStatsWay.cs

@@ -26,10 +26,12 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
         /// <param name="cosmosClient"></param>
         /// <param name="scId"></param>
         /// <returns></returns>
-        public static async Task<StatsInfo> GetSingleSc(CosmosClient cosmosClient, string scId)
+        public static async Task<StatsInfo> GetSingleSc(CosmosClient cosmosClient, string scId, int year = 0)
         {
             DateTimeOffset dateTime = DateTimeOffset.UtcNow;
-            StatsInfo statsInfo = new() { id = $"{dateTime.Year}-{scId}" };
+            if (year == 0)
+                year = dateTime.Year;
+            StatsInfo statsInfo = new() { id = $"{year}-{scId}" };
             var (dayS, dayE) = TimeHelper.GetStartOrEnd(dateTime);  //今天开始时间    13位
             var (lastWeekS, lastWeekE) = TimeHelper.GetStartOrEnd(dateTime, "lastweek");   //计算上周开始/结束时间
             var (weekS, weekE) = TimeHelper.GetStartOrEnd(dateTime, "week");             //计算本周开始/结束时间
@@ -55,6 +57,7 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             statsInfo.size = scBase.size;
             statsInfo.scCreateTime = scBase.createTime;
             statsInfo.areaId = scBase.areaId;
+            statsInfo.year = year;
 
             string tchSql = $"{currSql} where ARRAY_CONTAINS(c.roles, 'teacher', true) AND c.status = 'join'";
             statsInfo.tch = await JointlySingleQuery.GetValueInt(cosmosClient, "School", tchSql, code: $"Teacher-{scBase.id}");
@@ -92,7 +95,7 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
         /// <param name="_option"></param>
         /// <param name="area"></param>
         /// <returns></returns>
-        public static StatsInfo GetAreaStats(CosmosClient cosmosClient, HttpTrigger _httpTrigger, Option _option, List<StatsInfo> statsInfos, List<string> scIds = null, Area area = null) 
+        public static StatsInfo GetAreaStats(CosmosClient cosmosClient, HttpTrigger _httpTrigger, Option _option, List<StatsInfo> statsInfos, List<string> scIds = null, Area area = null)
         {
             StatsInfo areaInfo = new()
             {
@@ -129,7 +132,7 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             areaInfo.lesson.monthInter = statsInfos.Select(s => s.lesson.monthInter).Sum();
             areaInfo.lesson.lastYearInter = statsInfos.Select(s => s.lesson.lastYearInter).Sum();
             areaInfo.lesson.yearInter = statsInfos.Select(s => s.lesson.yearInter).Sum();
-            //areaInfo.lesson.LastYear = BICommonWay.ManyDoubleMerge(statsInfos.Select(s => s.lesson.LastYear).ToList());
+            areaInfo.lesson.yearInters = BICommonWay.ManyDoubleMerge(statsInfos.Select(s => s.lesson.yearInters).ToList());
             areaInfo.lesson.year = BICommonWay.ManyDoubleMerge(statsInfos.Select(s => s.lesson.year).Where(w => w.Count > 0).ToList());
 
 
@@ -210,5 +213,26 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             return areaInfo;
         }
 
+        public static async Task<List<T>> GetLastYearType<T>(CosmosClient cosmosClient, List<string> scIds)
+        {
+            List<T> list = new();
+            StringBuilder statsSql = new("select value(c) from c");
+            if (scIds.Count > 0)
+            {
+                statsSql.Append($" where {BICommonWay.ManyScSql("c.id", scIds, $"{DateTimeOffset.UtcNow.Year - 1}-")}");
+            }
+
+
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<T>(queryText: statsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
+            {
+                list.Add(item);
+
+            }
+
+            return list;
+        }
+
+
+       
     }
 }