Li há 3 anos atrás
pai
commit
2e734dac81

+ 85 - 84
TEAMModelBI/Controllers/BISchool/BatchSchoolController.cs

@@ -305,106 +305,98 @@ namespace TEAMModelBI.Controllers.BISchool
         {
             try
             {
-                jsonElement.TryGetProperty("tmdId", out JsonElement assistId);
+                jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
                 jsonElement.TryGetProperty("schoolCode", out JsonElement _schoolCode);
-                var cosmosClient = _azureCosmos.GetCosmosClient();
-                List<AssistSchool> schoolAssists = new();
-                //StringBuilder stringBuilder = new StringBuilder("select value(c) from c");
+                var cosmosClient = _azureCosmos.GetCosmosClient();                
+                int? pageSize = null;      //默认不指定返回大小        
+                string continuationToken = string.Empty;     //返给前端分页token           
+                string pageToken = default;//接受前端的分页Tolen
+                bool iscontinuation = false;//是否需要进行分页查询,默认不分页
+                List<AssistSchool> schoolAssists = new(); //返回学校列表集合
+                List<string> schoolIds = new();
                 StringBuilder stringBuilder = new("select c.id,c.code,c.schoolCode,c.name,c.region,c.province,c.city,c.dist,c.size,c.address,c.picture,c.type,c.scale,c.areaId,c.standard from c");
 
-                if (!string.IsNullOrEmpty($"{_schoolCode}"))
+                if (jsonElement.TryGetProperty("pageSize", out JsonElement jsonPageSize))
+                {
+                    if (!jsonPageSize.ValueKind.Equals(JsonValueKind.Undefined) && !jsonPageSize.ValueKind.Equals(JsonValueKind.Null) && jsonPageSize.TryGetInt32(out int tempPageSize))
+                    {
+                        pageSize = tempPageSize;
+                    }
+                }
+                if (pageSize != null && pageSize.Value > 0)
+                {
+                    iscontinuation = true;
+                }
+                if (jsonElement.TryGetProperty("contToken", out JsonElement ContToken))
+                {
+                    pageToken = ContToken.GetString();
+                }
+
+                if (!string.IsNullOrEmpty($"{tmdId}")) 
                 {
-                    stringBuilder.Append($" where c.id='{_schoolCode}'");
+                    schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
                 }
 
-                List<string> schools = new();
-                if (!string.IsNullOrEmpty($"{assistId}"))
-                    schools = await CommonFind.FindSchoolIds(cosmosClient, $"{assistId}");
-                if (schools.Count > 0)
+                if (schoolIds.Count > 0)
                 {
-                    schoolAssists = await CommonFind.FindAssistSchools(cosmosClient, schools);
+                    foreach (var id in schoolIds)
+                    {
+                        string sqlTxt = $"select c.id,c.code,c.schoolCode,c.name,c.region,c.province,c.city,c.dist,c.size,c.address,c.picture,c.type,c.scale,c.areaId,c.standard from c where c.id='{id}'";
+                        await foreach (var itemSchool in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<AssistSchool>(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
+                        {
+                            schoolAssists.Add(itemSchool);
+                        }
+                    }
                 }
                 else
                 {
-                    await foreach (var itemSchool in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<AssistSchool>(queryText: stringBuilder.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
+                    if (!string.IsNullOrEmpty($"{_schoolCode}"))
                     {
-                        schoolAssists.Add(itemSchool);
+                        stringBuilder.Append($" where c.id='{_schoolCode}'");
                     }
 
-                    schoolAssists.ForEach(async school =>
+                    await foreach (var itemSchool in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: stringBuilder.ToString(), continuationToken: pageToken, requestOptions: new QueryRequestOptions() { MaxItemCount = pageSize, PartitionKey = new PartitionKey("Base") }))
                     {
-                        var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(school.id, new PartitionKey("ProductSum"));
-                        if (response.Status == 200)
+                        using var json = await JsonDocument.ParseAsync(itemSchool.ContentStream);
+                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt16() > 0)
                         {
-                            using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                            school.serial = json.RootElement.GetProperty("serial").GetArrayLength();
-                            school.service = json.RootElement.GetProperty("service").GetArrayLength();
-                            school.hard = json.RootElement.GetProperty("hard").GetArrayLength();
+                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                            {
+                                schoolAssists.Add(obj.ToObject<AssistSchool>());
+                            }
+                            if (iscontinuation)
+                            {
+                                continuationToken = itemSchool.GetContinuationToken();
+                                break;
+                            }
                         }
-
-                        school.assists = await CommonFind.FindSchoolRoles(cosmosClient, school.id, "assist");
-                        school.lessonCount = await CommonFind.FindTotals(cosmosClient, $"select count(c.id) as totals from c ", "School", $"LessonRecord-{school.id}");
-                    });
+                    }
                 }
+                schoolAssists.ForEach(async school =>
+                {
+                    var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(school.id, new PartitionKey("ProductSum"));
+                    if (response.Status == 200)
+                    {
+                        using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                        if (json.RootElement.TryGetProperty("serial", out JsonElement serial) && !serial.ValueKind.Equals(JsonValueKind.Null))
+                        {
+                            school.serial = serial.ToObject<List<SchoolProductSumData>>().Select(x => x.prodCode).ToList();
+                        }
+                        if (json.RootElement.TryGetProperty("service", out JsonElement service) && !service.ValueKind.Equals(JsonValueKind.Null))
+                        {
+                            school.service = service.ToObject<List<SchoolProductSumData>>().Select(x => x.prodCode).ToList();
+                        }
+                        if (json.RootElement.TryGetProperty("hard", out JsonElement hard) && !hard.ValueKind.Equals(JsonValueKind.Null))
+                        {
+                            school.hard = hard.ToObject<List<SchoolProductSumDataHard>>().Select(x => x.prodCode).ToList();
+                        }
+                    }
 
-                return Ok(new { state = 200, schoolAssists });
-
-                //if (schools.Count > 0)
-                //{
-                //    schoolAssists = await CommonFind.FindAssistSchools(cosmosClient, schools);
-                //}
-                //else
-                //{
-                //    await foreach (var itemSchool in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: stringBuilder.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
-                //    {
-                //        using var jsonSchool = await JsonDocument.ParseAsync(itemSchool.ContentStream);
-                //        foreach (var objSchool in jsonSchool.RootElement.GetProperty("Documents").EnumerateArray())
-                //        {
-                //            var schoolId = objSchool.GetProperty("id").GetString();
-                //            AssistSchool schoolAssist = new()
-                //            {
-                //                id = schoolId,
-                //                code = objSchool.GetProperty("code").GetString(),
-                //                schoolCode = objSchool.GetProperty("schoolCode").GetString(),
-                //                name = objSchool.GetProperty("name").GetString(),
-                //                region = objSchool.GetProperty("region").GetString(),
-                //                province = objSchool.GetProperty("province").GetString(),
-                //                city = objSchool.GetProperty("city").GetString(),
-                //                dist = objSchool.GetProperty("dist").GetString(),
-                //                size = objSchool.GetProperty("size").GetInt32(),
-                //                address = objSchool.GetProperty("address").GetString(),
-                //                picture = objSchool.GetProperty("picture").GetString(),
-                //                type = objSchool.GetProperty("type").GetInt32(),
-                //                //scale = objSchool.GetProperty("scale").GetInt32(),
-                //                areaId = objSchool.GetProperty("areaId").GetString(),
-                //                standard = objSchool.GetProperty("standard").GetString(),
-                //            };
-
-                //            try { schoolAssist.scale = objSchool.GetProperty("scale").GetInt32(); }
-                //            catch { schoolAssist.scale = 0; }
-
-                //            //var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("ProductSum"));
-                //            //if (response.Status == 200)
-                //            //{
-                //            //    using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                //            //    schoolAssist.serial = json.RootElement.GetProperty("serial").GetArrayLength();
-                //            //    schoolAssist.service = json.RootElement.GetProperty("service").GetArrayLength();
-                //            //    schoolAssist.hard = json.RootElement.GetProperty("hard").GetArrayLength();
-                //            //}
-
-                //            //schoolAssist.assists = await CommonFind.FindSchoolRoles(cosmosClient, schoolId, "assist");
-                //            schoolAssists.Add(schoolAssist);
-                //        }
-                //    }
-                //}
-                //List<AssistSchool> tempSchoolAssists = new();
-                //await foreach (var temp in GetSchools(cosmosClient, schoolAssists))
-                //{
-                //    tempSchoolAssists.AddRange(temp);
-                //}
-
-                //return Ok(new { state = 200, schoolAssists = tempSchoolAssists });
+                    school.assists = await CommonFind.FindSchoolRoles(cosmosClient, school.id, "assist");
+                    school.lessonCount = await CommonFind.FindTotals(cosmosClient, $"select count(c.id) as totals from c ", "School", $"LessonRecord-{school.id}");
+                });
 
+                return Ok(new { state = 200, continuationToken, schoolAssists, });
             }
             catch (Exception ex)
             {
@@ -428,9 +420,18 @@ namespace TEAMModelBI.Controllers.BISchool
                 if (response.Status == 200)
                 {
                     using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                    temp.serial = json.RootElement.GetProperty("serial").GetArrayLength();
-                    temp.service = json.RootElement.GetProperty("service").GetArrayLength();
-                    temp.hard = json.RootElement.GetProperty("hard").GetArrayLength();
+                    if (json.RootElement.TryGetProperty("serial", out JsonElement serial) && !serial.ValueKind.Equals(JsonValueKind.Null))
+                    {
+                        temp.serial = serial.ToObject<List<SchoolProductSumData>>().Select(x => x.prodCode).ToList();
+                    }
+                    if (json.RootElement.TryGetProperty("service", out JsonElement service) && !service.ValueKind.Equals(JsonValueKind.Null))
+                    {
+                        temp.service = service.ToObject<List<SchoolProductSumData>>().Select(x => x.prodCode).ToList();
+                    }
+                    if (json.RootElement.TryGetProperty("hard", out JsonElement hard) && !hard.ValueKind.Equals(JsonValueKind.Null))
+                    {
+                        temp.hard = hard.ToObject<List<SchoolProductSumDataHard>>().Select(x => x.prodCode).ToList();
+                    }
                 }
 
                 temp.assists = await CommonFind.FindSchoolRoles(cosmosClient, temp.id, "assist");

+ 148 - 18
TEAMModelBI/Controllers/BITest/TestController.cs

@@ -43,6 +43,8 @@ using System.IO;
 using System.Net.Http;
 using System.Net.Http.Json;
 using System.Net;
+using TEAMModelBI.Tool.CosmosBank;
+using System.Diagnostics;
 
 namespace TEAMModelBI.Controllers.BITest
 {
@@ -428,9 +430,19 @@ namespace TEAMModelBI.Controllers.BITest
                 //    if (response.Status == 200)
                 //    {
                 //        using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                //        schoolAssist.serial = json.RootElement.GetProperty("serial").GetArrayLength();
-                //        schoolAssist.service = json.RootElement.GetProperty("service").GetArrayLength();
-                //        schoolAssist.hard = json.RootElement.GetProperty("hard").GetArrayLength();
+
+                //        if (json.RootElement.TryGetProperty("serial", out JsonElement serial) && !serial.ValueKind.Equals(JsonValueKind.Null))
+                //        {
+                //            schoolAssist.serial = serial.ToObject<List<SchoolProductSumData>>().Select(x => x.prodCode).ToList();
+                //        }
+                //        if (json.RootElement.TryGetProperty("service", out JsonElement service) && !service.ValueKind.Equals(JsonValueKind.Null))
+                //        {
+                //            schoolAssist.service = service.ToObject<List<SchoolProductSumData>>().Select(x => x.prodCode).ToList();
+                //        }
+                //        if (json.RootElement.TryGetProperty("hard", out JsonElement hard) && !hard.ValueKind.Equals(JsonValueKind.Null))
+                //        {
+                //            schoolAssist.hard = hard.ToObject<List<SchoolProductSumDataHard>>().Select(x => x.prodCode).ToList();
+                //        }
                 //    }
 
                 //    schoolAssist.assists = await CommonFind.FindSchoolRoles(cosmosClient, itemSchool.id, "assist");
@@ -467,14 +479,23 @@ namespace TEAMModelBI.Controllers.BITest
                         try { schoolAssist.scale = objSchool.GetProperty("scale").GetInt32(); }
                         catch { schoolAssist.scale = 0; }
 
-                        //var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("ProductSum"));
-                        //if (response.Status == 200)
-                        //{
-                        //    using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                        //    schoolAssist.serial = json.RootElement.GetProperty("serial").GetArrayLength();
-                        //    schoolAssist.service = json.RootElement.GetProperty("service").GetArrayLength();
-                        //    schoolAssist.hard = json.RootElement.GetProperty("hard").GetArrayLength();
-                        //}
+                        var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("ProductSum"));
+                        if (response.Status == 200)
+                        {
+                            using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                            if (json.RootElement.TryGetProperty("serial", out JsonElement serial) && !serial.ValueKind.Equals(JsonValueKind.Null))
+                            {
+                                schoolAssist.serial = serial.ToObject<List<SchoolProductSumData>>().Select(x => x.prodCode).ToList();
+                            }
+                            if (json.RootElement.TryGetProperty("service", out JsonElement service) && !service.ValueKind.Equals(JsonValueKind.Null))
+                            {
+                                schoolAssist.service = service.ToObject<List<SchoolProductSumData>>().Select(x => x.prodCode).ToList();
+                            }
+                            if (json.RootElement.TryGetProperty("hard", out JsonElement hard) && !hard.ValueKind.Equals(JsonValueKind.Null))
+                            {
+                                schoolAssist.hard = hard.ToObject<List<SchoolProductSumDataHard>>().Select(x => x.prodCode).ToList();
+                            }
+                        }
 
                         //schoolAssist.assists = await CommonFind.FindSchoolRoles(cosmosClient, schoolId, "assist");
                         schoolAssists.Add(schoolAssist);
@@ -512,9 +533,18 @@ namespace TEAMModelBI.Controllers.BITest
                 if (response.Status == 200)
                 {
                     using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                    temp.serial = json.RootElement.GetProperty("serial").GetArrayLength();
-                    temp.service = json.RootElement.GetProperty("service").GetArrayLength();
-                    temp.hard = json.RootElement.GetProperty("hard").GetArrayLength();
+                    if (json.RootElement.TryGetProperty("serial", out JsonElement serial) && !serial.ValueKind.Equals(JsonValueKind.Null))
+                    {
+                        temp.serial = serial.ToObject<List<SchoolProductSumData>>().Select(x => x.prodCode).ToList();
+                    }
+                    if (json.RootElement.TryGetProperty("service", out JsonElement service) && !service.ValueKind.Equals(JsonValueKind.Null))
+                    {
+                        temp.service = service.ToObject<List<SchoolProductSumData>>().Select(x => x.prodCode).ToList();
+                    }
+                    if (json.RootElement.TryGetProperty("hard", out JsonElement hard) && !hard.ValueKind.Equals(JsonValueKind.Null))
+                    {
+                        temp.hard = hard.ToObject<List<SchoolProductSumDataHard>>().Select(x => x.prodCode).ToList();
+                    }
                 }
 
                 temp.assists = await CommonFind.FindSchoolRoles(cosmosClient, temp.id, "assist");
@@ -927,7 +957,7 @@ namespace TEAMModelBI.Controllers.BITest
         }
         
         /// <summary>
-        /// 测试CosmosDB分页查询
+        /// 测试CosmosDB分页查询  SQL语句分页
         /// </summary>
         /// <param name="jsonElement"></param>
         /// <returns></returns>
@@ -956,6 +986,61 @@ namespace TEAMModelBI.Controllers.BITest
             return Ok(new { state = 200, schools });
         }
 
+        /// <summary>
+        /// 分页案例
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [HttpPost("get-cosmodbtokenpage")]
+        public async Task<IActionResult> GetCancellationTokenPage(JsonElement jsonElement)
+        {
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+
+            //默认不指定返回大小
+            int? pageSize = null;
+            string continuationToken = string.Empty;
+            string pageToken = default;
+            if (jsonElement.TryGetProperty("pageSize", out JsonElement jsonPageSize)) 
+            {
+                if (!jsonPageSize.ValueKind.Equals(JsonValueKind.Undefined) && !jsonPageSize.ValueKind.Equals(JsonValueKind.Null) && jsonPageSize.TryGetInt32(out int tempPageSize)) 
+                {
+                    pageSize = tempPageSize;
+                }
+            }
+            //是否需要进行分页查询,默认不分页
+            bool iscontinuation = false;
+            if (pageSize != null && pageSize.Value > 0)
+            {
+                iscontinuation = true;
+            }
+            if (jsonElement.TryGetProperty("contToken", out JsonElement ContToken))
+            {
+                pageToken = ContToken.GetString();
+            }
+
+            List<School> schools = new();
+
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: "select value(c) from c", continuationToken: pageToken, requestOptions: new QueryRequestOptions() { MaxItemCount = pageSize, PartitionKey = new PartitionKey("Base") }))
+            {
+                using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0) 
+                {
+                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                    {
+                        schools.Add(obj.ToObject<School>());
+                    }
+
+                    if (iscontinuation) 
+                    {
+                        continuationToken = item.GetContinuationToken();
+                        break;
+                    }
+                }
+            }
+
+            return Ok(new { state = 200, continuationToken, count = schools.Count, schools });
+        }
+
         /// <summary>
         /// 测试隐式登录
         /// </summary>
@@ -1070,9 +1155,8 @@ namespace TEAMModelBI.Controllers.BITest
             return Ok(new { state = 200, Mon,Sun, ss, sss, ssss, sssss, lastWeekStart, lastWeekEnd, have, en2, bingji, cha, jiaoji, chaji, list3, list4, temp, list1 });
         }
 
-
         /// <summary>
-        ///  异步并行
+        ///  token 分页
         /// </summary>
         /// <returns></returns>
         [HttpPost("get-parallelforeach")]
@@ -1125,8 +1209,54 @@ namespace TEAMModelBI.Controllers.BITest
             return Ok(new { state = 200, allcount = operateLogs.Count, bIOptLogs });
         }
 
+        /// <summary>
+        /// 流式传输响应
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("get-stream")]
+        public async Task<IActionResult> GetStream()
+        {
+            var sw = Stopwatch.StartNew();
+            //while (true)
+            //{
+            //    var q = new Queue<int>();
+
+            //    for (int i = 0; i < 100_000_000; i++)
+            //    {
+            //        q.Enqueue(i);
+            //        q.Dequeue();
+            //    }
+            //    Console.WriteLine(sw.Elapsed);
+            //}
+            var ss = new SortedSet<int>(Enumerable.Repeat(42, 400_000));
+            Console.WriteLine(sw.Elapsed);
+
+            HttpContext.Response.ContentType = "text/plain";
+            
+            StreamWriter writer;
+            //using (writer = new StreamWriter(HttpContext.Response.Body))
+            //    for (int i = 0; i < 100; i++)
+            //    {
+            //        await writer.WriteAsync($"S-{i} \n");                   
+            //    }
+            //    //await writer.FlushAsync("Hello World");
+
+            return Ok(new { state = 200});
+        }
+
+        [HttpPost("get-vlaue")]
+        public async Task<IActionResult> GetValueCount() 
+        {
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+            int counts = 0;
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<int>(queryText: "select value(count(c.id)) from c", requestOptions:new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
+            {
+                counts += item;
+            }
+
+            return Ok(new { state = 200, counts }); 
+        }
 
-        
         public class Test
         {
             public int age { get; set; }

+ 113 - 0
TEAMModelBI/Controllers/Census/SchoolController.cs

@@ -10,6 +10,7 @@ using System.Text.Json;
 using System.Threading.Tasks;
 using TEAMModelBI.Models;
 using TEAMModelBI.Tool;
+using TEAMModelBI.Tool.CosmosBank;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
@@ -223,6 +224,118 @@ namespace TEAMModelBI.Controllers.Census
             return Ok(new { state = 200, schoolCount = schoolIds.Count, tecCount, stuCount, classCount, roomCount, allLessonCount, lastWeekLessCount, weekLessCount, lastTermLessCount, termLessCount, lastYearLessCount, yearLessCount,allBloblog , lastYearBloblog, yearBloblog , allActivity , lastYearActivity ,yearActivity , lastWeekActivity, weekActivity, recSchoolDates });
         }
 
+        /// <summary>
+        /// 依据学校Id统计学校分析
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [HttpPost("get-idstatis")]
+        public async Task<IActionResult> GetIdStatis(JsonElement jsonElement) 
+        {
+            if (!jsonElement.TryGetProperty("schoolId", out JsonElement schoolId)) return BadRequest();        
+
+            int tecCount = 0;  //学校教师数量
+            int stuCount = 0;  //学校学生数量
+            int classCount = 0; //班级数量
+            int roomCount = 0;  //教室教师数量
+
+            long allLessCount = 0;  //课例总数
+            int lastWeekLess = 0;  //上周的总数
+            int weekLess = 0;    //本周的总数
+            int lastTermLess = 0;   //上学期的总数
+            int termLess = 0;      //本学期的总数
+            int lessYearLess = 0;    //去年的总数
+            int yearLess = 0;    //去年的总数
+
+            int allActivity = 0;  //学校所有活动
+            int lastYearActivity = 0;  //去年学校所有活动
+            int yearActivity = 0;  //今年学校所有活动
+            int lastWeekActivity = 0;  //上周学校所有活动
+            int weekActivity = 0;  //本周学校所有活动
+
+            int allBlob = 0;  //所有资源
+            int lastYearBlob = 0;  //去年的资源
+            int yearBlob = 0;  //去年的资源
+
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+            var (lastWeekStart, lastWeekEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "lastweek");   //计算上周开始/结束时间
+            var (weekStart, weekEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "week");             //计算本周开始/结束时间
+            var (lastTermStart, lastTermEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "lastterm");   //计算上学期开始/结束时间
+            var (termStart, termEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "term");   //计算本学期开始/结束时间
+            var (lastYearStart, lastYearEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.Parse($"{DateTimeOffset.UtcNow.Year - 1}-1-1"), "year"); //计算去年开始/结束时间
+            var (yearStart, yearEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "year");         //计算今年开始/结束时间
+
+            tecCount = await JointlySingleQuery.GetValueInt(cosmosClient, "School", "SELECT value(count(c.id)) FROM c WHERE ARRAY_CONTAINS(c.roles, 'teacher', true) AND c.status = 'join'", code:$"Teacher-{schoolId}");
+            stuCount = await JointlySingleQuery.GetValueInt(cosmosClient, "Student", code: $"Base-{schoolId}");
+            classCount = await JointlySingleQuery.GetValueInt(cosmosClient, "School", code: $"Class-{schoolId}");
+            roomCount = await JointlySingleQuery.GetValueInt(cosmosClient, "School", code: $"Room-{schoolId}");
+
+            string unifyTimeSql = "select value(count(c.id)) from c where c.startTime>={0} and c.startTime<={1}";
+            allLessCount = await LessonStatisWay.GetSchoolIdLessonCount(cosmosClient, $"{schoolId}");
+            lastWeekLess = await JointlySingleQuery.GetValueInt(cosmosClient, "School", string.Format(unifyTimeSql, lastWeekStart, lastWeekEnd), $"LessonRecord-{schoolId}");
+            weekLess = await JointlySingleQuery.GetValueInt(cosmosClient, "School", string.Format(unifyTimeSql, weekStart, lastWeekEnd), $"LessonRecord-{schoolId}");
+            lastTermLess = await JointlySingleQuery.GetValueInt(cosmosClient, "School", string.Format(unifyTimeSql, lastTermStart, lastTermEnd), $"LessonRecord-{schoolId}") ;
+            termLess = await JointlySingleQuery.GetValueInt(cosmosClient, "School", string.Format(unifyTimeSql, termStart, termEnd), $"LessonRecord-{schoolId}");
+            lessYearLess = await JointlySingleQuery.GetValueInt(cosmosClient, "School", string.Format(unifyTimeSql, lastYearStart, lastYearEnd), $"LessonRecord-{schoolId}");
+            yearLess = await JointlySingleQuery.GetValueInt(cosmosClient, "School", string.Format(unifyTimeSql, yearStart, yearEnd), $"LessonRecord-{schoolId}");
+
+            //统计活动
+            foreach (var type in StaticValue.activityTypes)
+            {
+                string sqlTime = "select value(count(c.id)) from c where c.pk = '{0}' and c.school = '{1}' and c.createTime>={2} and c.createTime<={3}";
+                allActivity += await JointlySingleQuery.GetValueInt(cosmosClient,"Common", $"select value(count(c.id)) from c where c.pk = '{type}' and c.school = '{schoolId}'");
+                lastYearActivity += await JointlySingleQuery.GetValueInt(cosmosClient, "Common", string.Format(sqlTime, type, schoolId, lastYearStart, lastYearEnd));
+                yearActivity += await JointlySingleQuery.GetValueInt(cosmosClient, "Common", string.Format(sqlTime, type, schoolId, yearStart, yearEnd));
+                lastWeekActivity += await JointlySingleQuery.GetValueInt(cosmosClient, "Common", string.Format(sqlTime, type, schoolId, lastWeekStart, lastWeekEnd));
+                weekActivity += await JointlySingleQuery.GetValueInt(cosmosClient, "Common", string.Format(sqlTime, type, schoolId, weekStart, weekEnd));
+            }
+
+            //学校资源
+            string blobTimeSql = "select value(count(c.id)) from c where c.time>={0} and c.time<={1}";
+            allBlob = await JointlySingleQuery.GetValueInt(cosmosClient, "School", code: $"Bloblog-{schoolId}");
+            lastYearBlob = await JointlySingleQuery.GetValueInt(cosmosClient, "School", string.Format(blobTimeSql, lastYearStart, lastYearEnd), $"Bloblog-{schoolId}");
+            yearBlob = await JointlySingleQuery.GetValueInt(cosmosClient, "School", string.Format(blobTimeSql, yearStart, yearEnd), $"Bloblog-{schoolId}");
+
+            //获取所有的课程记录
+            List<LessonRecord> records = new();
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonRecord>(queryText: "select value(c) from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord-{schoolId}") }))
+            {
+                records.Add(item);
+            }
+
+            List<(string name, int count)> gradeCount = new();
+            if (records.Count > 0)
+            {
+                var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{schoolId}", new PartitionKey($"Base"));
+                School sc = new();
+                if (response.Status == 200)
+                {
+                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                    sc = json.ToObject<School>();
+                }
+
+                List<string> grades = new();
+
+                foreach (var item in records) 
+                {
+                    foreach (string gId in item.grade)
+                    {
+                        if (!grades.Contains(gId))
+                        {
+                            grades.Add(gId);
+                        }
+                    }
+                }
+                foreach (var gId in grades)
+                {
+                    var c = records.Where(r => r.grade.Contains(gId)).Count();
+                    gradeCount.Add((gId, c));
+                }
+            }
+
+            return Ok(new { state = 200, tecCount, stuCount, classCount, roomCount, allLessCount, lastWeekLess, weekLess, lastTermLess, termLess, lessYearLess, yearLess, allActivity, lastYearActivity, yearActivity, lastWeekActivity, weekActivity, allBlob, lastYearBlob, yearBlob });
+        }
+
         /// <summary>
         /// 依据Id查询School容器  数据管理工具——查询工具
         /// </summary>

+ 7 - 6
TEAMModelBI/Models/AssistSchool.cs

@@ -1,4 +1,5 @@
 using System.Collections.Generic;
+using TEAMModelOS.SDK.Models;
 
 namespace TEAMModelBI.Models
 {
@@ -20,12 +21,12 @@ namespace TEAMModelBI.Models
         public string standard { get; set; }
         public string areaId { get; set; }
         public List<SchoolTeacherRoles> assists { get; set; } = new List<SchoolTeacherRoles>();
-        public int serial { get; set; } //软体
-        public int service { get; set; } //服务
-        public int hard { get; set; } //硬体
+        //public int serial { get; set; } //软体
+        //public int service { get; set; } //服务
+        //public int hard { get; set; } //硬体
         public long lessonCount { get; set; } = 0; //学校课例数量
-        //public List<SchoolProductSumData> serial { get; set; } //软体
-        //public List<SchoolProductSumData> service { get; set; } //服务
-        //public List<SchoolProductSumDataHard> hard { get; set; } //硬体
+        public List<string> serial { get; set; } = new List<string>(); //软体
+        public List<string> service { get; set; } = new List<string>(); //服务
+        public List<string> hard { get; set; } = new List<string>(); //硬体
     }
 }

+ 0 - 35
TEAMModelBI/Tool/CommonFind.cs

@@ -148,41 +148,6 @@ namespace TEAMModelBI.Tool
             return schoolIds;
         }
 
-        /// <summary>
-        /// 依据学校编号查询学校信息和学校相关的信息
-        /// </summary>
-        /// <param name="cosmosClient"></param>
-        /// <param name="schoos"></param>
-        /// <returns></returns>
-        public static async Task<List<AssistSchool>> FindAssistSchools(CosmosClient cosmosClient, List<string> schoos)
-        {
-            List<AssistSchool> assistSchools = new();
-            foreach (var id in schoos)
-            {
-                string sqlTxt = $"select c.id,c.code,c.schoolCode,c.name,c.region,c.province,c.city,c.dist,c.size,c.address,c.picture,c.type,c.scale,c.areaId,c.standard from c where c.id='{id}'";
-                await foreach (var itemSchool in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<AssistSchool>(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
-                {
-                    assistSchools.Add(itemSchool);
-                }
-            }
-
-            foreach (var school in assistSchools)
-            {
-                var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(school.id, new PartitionKey("ProductSum"));
-                if (response.Status == 200)
-                {
-                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                    school.serial = json.RootElement.GetProperty("serial").GetArrayLength();
-                    school.service = json.RootElement.GetProperty("service").GetArrayLength();
-                    school.hard = json.RootElement.GetProperty("hard").GetArrayLength();
-                }
-
-                school.assists = await FindSchoolRoles(cosmosClient, school.id, "assist");
-            }
-            
-            return assistSchools;
-        }
-
         /// <summary>
         /// 依据学校查询教师列表
         /// </summary>

+ 82 - 0
TEAMModelBI/Tool/CosmosBank/JointlySingleQuery.cs

@@ -0,0 +1,82 @@
+using Azure.Cosmos;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace TEAMModelBI.Tool.CosmosBank
+{
+    public class JointlySingleQuery
+    {
+        /// <summary>
+        /// 多个容器返回整数 使用
+        /// </summary>
+        /// <param name="cosmosClient"></param>
+        /// <param name="containerId"></param>
+        /// <param name="sqlTxt"></param>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        public static async Task<int> GetValueInt(CosmosClient cosmosClient, List<string> containerId, string sqlTxt = null, string code = null) 
+        {
+            int totals = 0;
+            string sql = $"select value(count(c.id)) from c";
+            if (!string.IsNullOrEmpty(sqlTxt)) 
+            {
+                sql = sqlTxt;
+            }
+
+            foreach (string conId in containerId) 
+            {
+                await foreach (var itemInt in cosmosClient.GetContainer("TEAMModelOS", conId).GetItemQueryIterator<int>(queryText: sql, requestOptions: string.IsNullOrEmpty($"{code}") ? new QueryRequestOptions() { } : new QueryRequestOptions() { PartitionKey = new PartitionKey($"{code}") }))
+                {
+                    totals += itemInt;
+                }
+            }
+
+            return totals;            
+        }
+
+        /// <summary>
+        /// 单个容器返回整数 统计使用
+        /// </summary>
+        /// <param name="cosmosClient"></param>
+        /// <param name="container"></param>
+        /// <param name="sqlTxt"></param>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        public static async Task<int> GetValueInt(CosmosClient cosmosClient, string container, string sqlTxt = null, string code = null)
+        {
+            int totals = 0;
+            string sql = $"select value(count(c.id)) from c";
+            if (!string.IsNullOrEmpty(sqlTxt))
+            {
+                sql = sqlTxt;
+            }
+
+            await foreach (var itemInt in cosmosClient.GetContainer("TEAMModelOS", container).GetItemQueryIterator<int>(queryText: sql, requestOptions: string.IsNullOrEmpty($"{code}") ? new QueryRequestOptions() { } : new QueryRequestOptions() { PartitionKey = new PartitionKey($"{code}") }))
+            {
+                totals += itemInt;
+            }
+
+            return totals;
+        }
+
+        /// <summary>   
+        /// 返回字符集合
+        /// </summary>
+        /// <param name="cosmosClient"></param>
+        /// <param name="containerId"></param>
+        /// <param name="sqlTxt"></param>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        public static async Task<List<string>> GetListString(CosmosClient cosmosClient, string containerId, string sqlTxt, string code = null) 
+        {
+            List<string> strList = new();
+
+            await foreach (var itemInt in cosmosClient.GetContainer("TEAMModelOS", containerId).GetItemQueryIterator<string>(queryText: sqlTxt, requestOptions: string.IsNullOrEmpty($"{code}") ? new QueryRequestOptions() { } : new QueryRequestOptions() { PartitionKey = new PartitionKey($"{code}") }))
+            {
+                strList.Add(itemInt);
+            }
+
+            return strList;
+        }
+    }
+}

+ 35 - 0
TEAMModelBI/Tool/CosmosBank/LessonStatisWay.cs

@@ -58,5 +58,40 @@ namespace TEAMModelBI.Tool.CosmosBank
         }
 
 
+        /// <summary>
+        /// 依据学校Id查询学校和学校里面教师的课例统计
+        /// </summary>
+        /// <param name="cosmosClient"></param>
+        /// <param name="schoolId"></param>
+        /// <returns></returns>
+        public async static Task<int> GetSchoolIdLessonCount(CosmosClient cosmosClient ,string schoolId) 
+        {
+            int totals = 0;
+            string LessonSqlTxt = "select value(count(c.id)) from c";
+
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<int>(queryText: LessonSqlTxt, requestOptions: new QueryRequestOptions() {PartitionKey = new PartitionKey($"LessonRecord-{schoolId}") }))
+            {
+                totals += item;
+            }
+
+            List<string> tecIdS = new();
+            string managerSql = $"SELECT value(c.id) FROM c WHERE ARRAY_CONTAINS(c.roles, 'teacher', true) AND  c.pk = 'Teacher' AND c.status = 'join'";
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<string>(queryText: managerSql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{schoolId}") }))
+            {
+                tecIdS.Add(item);
+            }
+
+            foreach (var itemId in tecIdS)
+            {
+                string tecLessSQL = $"select value(count(c.id)) from c where c.tmdid='{itemId}'";
+                await foreach (var itemCount in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<int>(queryText: tecLessSQL, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("LessonRecord") }))
+                {
+                    totals += itemCount;
+                }
+            }
+
+            return totals;
+        }
+
     }
 }