ソースを参照

优化活动、试题、课例、试卷的统计接口代码冗余问题。添加通过醍摩豆账户和是否查询当前学期的接口。

Li 3 年 前
コミット
716edc2ccd

+ 43 - 51
TEAMModelBI/Controllers/Census/ActivitySticsController.cs

@@ -77,7 +77,7 @@ namespace TEAMModelBI.Controllers.Census
                         {
                             sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
                         }
-                        long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), "Common");
+                        long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "Common" });
 
                         tempCount.census.Add(new KeyValuePair<object, long>(type, totals));
                     }
@@ -94,7 +94,7 @@ namespace TEAMModelBI.Controllers.Census
                         sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
                     }
 
-                    long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), "Common");
+                    long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "Common" });
 
                     activityCount.Add(new KeyValuePair<string, object>(type, totals));
                 }
@@ -118,7 +118,7 @@ namespace TEAMModelBI.Controllers.Census
                 {
                     string querySql = $"SELECT Count(c.id) as totals FROM c where c.pk='{type}'  ";
                     
-                    long totals = await CommonFind.FindTotals(cosmosClient, querySql, "Common");
+                    long totals = await CommonFind.FindTotals(cosmosClient, querySql, new List<string>() { "Common" });
 
                     KeyValuePair<string, long> valuePair = new KeyValuePair<string, long>(type, totals);
                     typeCount.Add(valuePair);
@@ -140,41 +140,35 @@ namespace TEAMModelBI.Controllers.Census
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [HttpPost("get-assistactivity")]
-        public async Task<IActionResult> GetAssistSchoolActivity(JsonElement jsonElement) 
+        public async Task<IActionResult> GetAssistSchoolActivity(JsonElement jsonElement)
         {
             if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
             var cosmosClient = _azureCosmos.GetCosmosClient();
             List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
 
-            List<KeyValuePair<string, object>> typeCount = new List<KeyValuePair<string, object>>();
-            foreach (var type in types)
+            List<ActivityCount> activityCounts = new List<ActivityCount>();
+            foreach (var itemId in schoolIds)
             {
-                long acount = 0;
-                List<SchoolActivity> schoolActivities = new List<SchoolActivity>();
-                foreach (var itemId in schoolIds)
+                School school = new();
+                var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(itemId, new PartitionKey("Base"));
+                if (response.Status == 200)
                 {
-                    School school = new();
-                    var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(itemId, new PartitionKey("Base"));
-                    if (response.Status == 200)
-                    {
-                        using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                        school = json.ToObject<School>();
-                    }
-
-                    SchoolActivity schoolActivity = new SchoolActivity() { id = itemId, name = school.name != null ? school.name : itemId };
-
-                    string activitySql = $"SELECT DISTINCT c.id,c.code,c.name FROM c WHERE c.pk='{type}' AND c.school='{itemId}'";
-                    
-                    schoolActivity.total = await CommonFind.FindTotals(cosmosClient, activitySql, "Common");
+                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                    school = json.ToObject<School>();
+                }
+                ActivityCount activityCount = new ActivityCount() { id = itemId, name = school.name != null ? school.name : itemId };
+                foreach (var type in types)
+                {
+                    string activitySql = $"SELECT Count(c.id) as totals FROM c WHERE c.pk='{type}' AND c.school='{itemId}'";
+                    long totals = await CommonFind.FindTotals(cosmosClient, activitySql, new List<string>() { "Common" });
 
-                    schoolActivities.Add(schoolActivity);
+                    activityCount.census.Add(new KeyValuePair<object, long>(type, totals));
                 }
 
-                KeyValuePair<string, object> valuePair = new KeyValuePair<string, object>(type, schoolActivities);
-                typeCount.Add(valuePair);
+                activityCounts.Add(activityCount);
             }
 
-            return Ok(new { state = 200, typeCount });
+            return Ok(new { state = 200, activityCounts });
         }
 
         /// <summary>
@@ -187,54 +181,52 @@ namespace TEAMModelBI.Controllers.Census
         {
             jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
             var cosmosClient = _azureCosmos.GetCosmosClient();
-            List<KeyValuePair<string, object>> typeCount = new List<KeyValuePair<string, object>>();
 
             var (start, end) = DateTimeHeloer.GetTermStartOrEnd(DateTime.Now);
 
             if (!string.IsNullOrEmpty($"{tmdId}"))
             {
                 List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
-
-                foreach (var type in types)
+                List<ActivityCount> activityCounts = new List<ActivityCount>();
+                foreach (var schoolId in schoolIds)
                 {
-                    List<SchoolActivity> schoolActivities = new List<SchoolActivity>();
-                    foreach (var itemId in schoolIds)
+                    School school = new();
+                    var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
+                    if (response.Status == 200)
                     {
-                        School school = new();
-                        var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(itemId, new PartitionKey("Base"));
-                        if (response.Status == 200)
-                        {
-                            using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                            school = json.ToObject<School>();
-                        }
-
-                        SchoolActivity schoolActivity = new SchoolActivity() { id = itemId, name = school.name != null ? school.name : itemId };
+                        using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                        school = json.ToObject<School>();
+                    }
+                    ActivityCount activityCount = new ActivityCount() { id = schoolId, name = school.name != null ? school.name : schoolId };
 
-                        string activitySql = $"SELECT COUNT(c.id) AS totals  FROM c WHERE c.pk='{type}' AND c.school='{itemId}' and c.createTime >= {start} and c.createTime <= {end}";
+                    foreach (var type in types) 
+                    {
+                        string activitySql = $"SELECT COUNT(c.id) AS totals  FROM c WHERE c.pk='{type}' AND c.school='{school}' and c.createTime >= {start} and c.createTime <= {end}";
+                        long totals = await CommonFind.FindTotals(cosmosClient, activitySql, new List<string>() { "Common" });
 
-                        long totals = await CommonFind.FindTotals(cosmosClient, activitySql, "Common");
-                        schoolActivity.total = totals;
-                        
-                        schoolActivities.Add(schoolActivity);
+                        activityCount.census.Add(new KeyValuePair<object, long>(type, totals));
                     }
-
-                    KeyValuePair<string, object> valuePair = new KeyValuePair<string, object>(type, schoolActivities);
-                    typeCount.Add(valuePair);
+                    activityCounts.Add(activityCount);
                 }
+
+                return Ok(new { state = 200, activityCounts });
+
             }
-            else 
+            else
             {
+                List<KeyValuePair<string, object>> typeCount = new List<KeyValuePair<string, object>>();
                 foreach (var type in types)
                 {
                     string querySql = $"SELECT COUNT(c.id) AS totals FROM c where c.pk='{type}' and c.createTime >= {start} and c.createTime <= {end}";
-                    long totals = await CommonFind.FindTotals(cosmosClient, querySql, "Common");
+                    long totals = await CommonFind.FindTotals(cosmosClient, querySql, new List<string>() { "Common" });
 
                     KeyValuePair<string, object> valuePair = new KeyValuePair<string, object>(type, totals);
                     typeCount.Add(valuePair);
                 }
+
+                return Ok(new { state = 200, typeCount });
             }
 
-            return Ok(new { state = 200, typeCount });
         }
 
         public record SchoolActivity 

+ 31 - 206
TEAMModelBI/Controllers/Census/ItemSticsController.cs

@@ -11,6 +11,8 @@ using TEAMModelBI.Tool;
 using System;
 using System.Text;
 using TEAMModelOS.SDK.Models;
+using TEAMModelOS.SDK.Extension;
+using TEAMModelBI.Models;
 
 namespace TEAMModelBI.Controllers.Census
 {
@@ -39,7 +41,7 @@ namespace TEAMModelBI.Controllers.Census
         public async Task<IActionResult> GetTypeCount(JsonElement jsonElement) 
         {
             jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
-            jsonElement.TryGetProperty("term", out JsonElement term);
+            if (!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
 
             var (start, end) = DateTimeHeloer.GetTermStartOrEnd(DateTime.Now);
 
@@ -49,28 +51,16 @@ namespace TEAMModelBI.Controllers.Census
 
             if (!string.IsNullOrEmpty($"{tmdId}"))
             {
-                List<string> schoolIds = new List<string>();
-
-                string schoolSql = $"SELECT DISTINCT REPLACE(c.code,'Teacher-','') AS schoolId,c.code,c.roles,c.id,c.name From c where ARRAY_CONTAINS(c.roles,'assist',true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.id='{tmdId}'";
-
-                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: schoolSql, requestOptions: new QueryRequestOptions() { }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        schoolIds.Add(obj.GetProperty("schoolId").GetString());
-                    }
-                }
+                List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
 
                 foreach (var schoolId in schoolIds)
                 {
                     School school = new();
-                    try
-                    {
-                        school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
-                    }
-                    catch
+                    var rsponse = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
+                    if (rsponse.Status == 200) 
                     {
+                        using var json = await JsonDocument.ParseAsync(rsponse.ContentStream);
+                        school = json.ToObject<School>();
                     }
 
                     Census tempCensus = new Census() { id = schoolId, name = school.name != null ? school.name : schoolId };
@@ -84,32 +74,8 @@ namespace TEAMModelBI.Controllers.Census
                             sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
                         }
 
-                        long totals = 0;
-                        await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                        {
-                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt32() > 0)
-                            {
-                                //total += count.GetInt64();
-                                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                                {
-                                    totals += obj.GetProperty("totals").GetInt32();
-                                }
-                            }
-                        }
+                        long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
 
-                        await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{schoolId}") }))
-                        {
-                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt32() > 0)
-                            {
-                                //total += count.GetInt64();
-                                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                                {
-                                    totals += obj.GetProperty("totals").GetInt32();
-                                }
-                            }
-                        }
                         tempCensus.census.Add(new KeyValuePair<object, long>(type, totals));
                     }
                     typeCount.Add(tempCensus);
@@ -119,39 +85,15 @@ namespace TEAMModelBI.Controllers.Census
             {
                 foreach (var type in itemType)
                 {
-                    long total = 0;
                     StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals from c where c.pk='Item' and c.type='{type}'");
                     if (bool.Parse($"{term}") == true)
                     {
                         sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
                     }
 
-                    await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt32() > 0)
-                        {
-                            //total += count.GetInt64();
-                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                            {
-                                total += obj.GetProperty("totals").GetInt32();
-                            }
-                        }
-                    }
+                    long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
 
-                    await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt32() > 0)
-                        {
-                            //total += count.GetInt64();
-                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                            {
-                                total += obj.GetProperty("totals").GetInt32();
-                            }
-                        }
-                    }
-                    typeCount.Add(new KeyValuePair<string, object>(type, total));
+                    typeCount.Add(new KeyValuePair<string, object>(type, totals));
                 }
             }
             return Ok(new { state = 200, typeCount });
@@ -165,7 +107,7 @@ namespace TEAMModelBI.Controllers.Census
         public async Task<IActionResult> GetLevelCount(JsonElement jsonElement)
         {
             jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
-            jsonElement.TryGetProperty("term", out JsonElement term);
+            if(!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
             var cosmosClient = _azureCosmos.GetCosmosClient();
             var (start, end) = DateTimeHeloer.GetTermStartOrEnd(DateTime.Now);
 
@@ -174,27 +116,17 @@ namespace TEAMModelBI.Controllers.Census
             if (!string.IsNullOrEmpty($"{tmdId}"))
             {
                 List<string> schoolIds = new List<string>();
-
-                string schoolSql = $"SELECT DISTINCT REPLACE(c.code,'Teacher-','') AS schoolId,c.code,c.roles,c.id,c.name From c where ARRAY_CONTAINS(c.roles,'assist',true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.id='{tmdId}'";
-
-                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: schoolSql, requestOptions: new QueryRequestOptions() { }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        schoolIds.Add(obj.GetProperty("schoolId").GetString());
-                    }
-                }
+                schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
 
                 foreach (var schoolId in schoolIds)
                 {
                     School school = new();
-                    try
-                    {
-                        school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
-                    }
-                    catch
+
+                    var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
+                    if (response.Status == 200) 
                     {
+                        using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                        school = json.ToObject<School>();
                     }
 
                     Census tempCensus = new Census() { id = schoolId, name = school.name != null ? school.name : schoolId };
@@ -207,32 +139,8 @@ namespace TEAMModelBI.Controllers.Census
                             sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
                         }
 
-                        long totals = 0;
-                        await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                        {
-                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                            {
-                                //total += count.GetInt64();
-                                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                                {
-                                    totals += obj.GetProperty("totals").GetInt64();
-                                }
-                            }
-                        }
+                        long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
 
-                        await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                        {
-                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                            {
-                                //total += count.GetInt64();
-                                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                                {
-                                    totals += obj.GetProperty("totals").GetInt64();
-                                }
-                            }
-                        }
                         tempCensus.census.Add(new KeyValuePair<object, long>(i, totals));
                     }
                     levelCount.Add(tempCensus);
@@ -240,41 +148,15 @@ namespace TEAMModelBI.Controllers.Census
             }
             else
             {
-                //List<KeyValuePair<int, long>> leveCount = new List<KeyValuePair<int, long>>();
                 for (int i = 1; i < 6; i++)
                 {
-                    long total = 0;
                     StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals from c where c.pk='Item' and c.level={i}");
                     if (bool.Parse($"{term}") == true)
                     {
                         sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
                     }
 
-                    await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                        {
-                            //total += count.GetInt64();
-                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                            {
-                                total += obj.GetProperty("totals").GetInt64();
-                            }
-                        }
-                    }
-
-                    await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                        {
-                            //total += count.GetInt64();
-                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                            {
-                                total += obj.GetProperty("totals").GetInt64();
-                            }
-                        }
-                    }
+                    long total = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
 
                     levelCount.Add(new KeyValuePair<int, long>(i, total));
                 }
@@ -292,7 +174,7 @@ namespace TEAMModelBI.Controllers.Census
         public async Task<IActionResult> GetLayerCount(JsonElement jsonElement)
         {
             jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
-            jsonElement.TryGetProperty("term", out JsonElement term);
+            if (!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
 
             var (start, end) = DateTimeHeloer.GetTermStartOrEnd(DateTime.Now);
             var cosmosClient = _azureCosmos.GetCosmosClient();
@@ -301,63 +183,31 @@ namespace TEAMModelBI.Controllers.Census
             if (!string.IsNullOrEmpty($"{tmdId}"))
             {
                 List<string> schoolIds = new List<string>();
-                string schoolSql = $"SELECT DISTINCT REPLACE(c.code,'Teacher-','') AS schoolId,c.code,c.roles,c.id,c.name From c where ARRAY_CONTAINS(c.roles,'assist',true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.id='{tmdId}'";
-
-                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: schoolSql, requestOptions: new QueryRequestOptions() { }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        schoolIds.Add(obj.GetProperty("schoolId").GetString());
-                    }
-                }
+                schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
 
                 foreach (var schoolId in schoolIds)
                 {
                     School school = new();
-                    try
-                    {
-                        school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
-                    }
-                    catch
+                    var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
+                    if (response.Status == 200) 
                     {
+                        using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                        school = json.ToObject<School>();
                     }
+
                     Census tempCensus = new Census() { id = schoolId, name = school.name != null ? school.name : schoolId };
 
                     for (int i = 1; i <= 6; i++)
                     {
-                        long total = 0;
                         StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals from c where c.code='Item-{schoolId}' and c.field={i}");
                         if (bool.Parse($"{term}") == true)
                         {
                             sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
                         }
-                        await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                        {
-                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt64() > 0)
-                            {
-                                //total += count.GetInt64();
-                                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                                {
-                                    total += obj.GetProperty("totals").GetInt64();
-                                }
-                            }
-                        }
 
-                        await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                        {
-                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                            {
-                                //total += count.GetInt64();
-                                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                                {
-                                    total += obj.GetProperty("totals").GetInt64();
-                                }
-                            }
-                        }
-                        tempCensus.census.Add(new KeyValuePair<object, long>(i, total));
+                        long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
+
+                        tempCensus.census.Add(new KeyValuePair<object, long>(i, totals));
                     }
 
                     layerCount.Add(tempCensus);
@@ -367,38 +217,13 @@ namespace TEAMModelBI.Controllers.Census
             {
                 for (int i = 1; i <= 6; i++)
                 {
-                    long totals = 0;
                     StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals from c where c.pk='Item' and c.field={i}");
                     if (bool.Parse($"{term}") == true)
                     {
                         sqlTxt.Append($" and c.createTime >= {start} and c.createTime <= {end}");
                     }
 
-                    await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt64() > 0)
-                        {
-                            //total += count.GetInt64();
-                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                            {
-                                totals += obj.GetProperty("totals").GetInt64();
-                            }
-                        }
-                    }
-
-                    await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                        {
-                            //total += count.GetInt64();
-                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                            {
-                                totals += obj.GetProperty("totals").GetInt64();
-                            }
-                        }
-                    }
+                    long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School", "Teacher" });
 
                     layerCount.Add(new KeyValuePair<object, long>(i, totals));
                 }

+ 21 - 14
TEAMModelBI/Controllers/Census/LessonSticsController.cs

@@ -13,6 +13,8 @@ using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models;
 using TEAMModelBI.Models;
 using TEAMModelOS.SDK.Extension;
+using System.Text;
+using TEAMModelBI.Tool;
 
 namespace TEAMModelBI.Controllers.Census
 {
@@ -20,7 +22,6 @@ namespace TEAMModelBI.Controllers.Census
     [ApiController]
     public class LessonSticsController : ControllerBase
     {
-
         private readonly AzureCosmosFactory _azureCosmos;
         private readonly AzureStorageFactory _azureStorage;
         private readonly DingDing _dingDing;
@@ -43,7 +44,9 @@ namespace TEAMModelBI.Controllers.Census
         public async Task<IActionResult> GetCount(JsonElement jsonElement)
         {
             jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
+            if (!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
             var cosmosClient = _azureCosmos.GetCosmosClient();
+            var (start, end) = DateTimeHeloer.GetTermStartOrEnd(DateTime.Now);
             object totals = new object();
             if (!string.IsNullOrEmpty($"{tmdId}"))
             {
@@ -52,8 +55,7 @@ namespace TEAMModelBI.Controllers.Census
                 List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
 
                 foreach (var itemId in schoolIds)
-                {
-                    
+                {                    
                     School school = new();
                     var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(itemId, new PartitionKey("Base"));
                     if (response.Status == 200)
@@ -64,9 +66,14 @@ namespace TEAMModelBI.Controllers.Census
 
                     SchoolLen schoolLen = new SchoolLen() { id = itemId, name = school.name != null ? school.name : itemId };
 
-                    string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c WHERE c.code='LessonRecord-{itemId}'";
+                    //string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c WHERE c.code='LessonRecord-{itemId}'";
+                    StringBuilder sqlTxt = new StringBuilder($"SELECT COUNT(c.id) AS totals FROM c WHERE c.code='LessonRecord-{itemId}'");
+                    if (bool.Parse($"{term}") == true) 
+                    {
+                        sqlTxt.Append($" and c.startTime >= {start} and c.startTime <= {end}");
+                    }
 
-                    schoolLen.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, "School");
+                    schoolLen.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });
 
                     schoolLens.Add(schoolLen);
                 }
@@ -74,10 +81,13 @@ namespace TEAMModelBI.Controllers.Census
             }
             else 
             {
-                string lessonSql = $"select COUNT(c.id) AS totals  from c where c.pk='LessonRecord'";
-                long tempTotal = await CommonFind.FindTotals(cosmosClient, lessonSql, "School");
+                StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals  from c where c.pk='LessonRecord'");
+                if (bool.Parse($"{term}") == true)
+                {
+                    sqlTxt.Append($" and c.startTime >= {start} and c.startTime <= {end}");
+                }
 
-                totals = tempTotal;
+                totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });
             }
 
             return Ok(new { state = 200, totals });
@@ -94,7 +104,7 @@ namespace TEAMModelBI.Controllers.Census
             {
                 var cosmosClient = _azureCosmos.GetCosmosClient();
                 string lessonSql = $"select COUNT(c.id) AS totals from c where c.pk='LessonRecord'";
-                long total = await CommonFind.FindTotals(cosmosClient, lessonSql, "School");
+                long total = await CommonFind.FindTotals(cosmosClient, lessonSql, new List<string>() { "School" });
 
                 return Ok(new { state = 200, total });
             }
@@ -135,13 +145,12 @@ namespace TEAMModelBI.Controllers.Census
 
                     SchoolLen schoolLen = new SchoolLen() { id = itemId, name = school != null ? school.name : itemId };
                     string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c WHERE c.code='LessonRecord-{itemId}'";
-                    schoolLen.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, "School");
+                    schoolLen.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School" });
 
                     schoolLens.Add(schoolLen);
                 }
 
                 return Ok(new { state = 200, schoolLens });
-
             }
             catch (Exception ex)
             {
@@ -160,6 +169,4 @@ namespace TEAMModelBI.Controllers.Census
         }
 
     }
-}
-
-
+}

+ 51 - 194
TEAMModelBI/Controllers/Census/PaperController.cs

@@ -11,6 +11,7 @@ using TEAMModelBI.Models;
 using TEAMModelBI.Tool;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
 
 namespace TEAMModelBI.Controllers.BISchool
@@ -54,18 +55,10 @@ namespace TEAMModelBI.Controllers.BISchool
             if (!string.IsNullOrEmpty($"{tmdId}"))
             {
                 List<string> schoolIds = new List<string>();
-                List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
+                schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
 
-                string schoolSql = $"SELECT DISTINCT REPLACE(c.code,'Teacher-','') AS schoolId,c.code,c.roles,c.id,c.name From c where ARRAY_CONTAINS(c.roles,'assist',true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.id='{tmdId}'";
+                List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
 
-                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: schoolSql, requestOptions: new QueryRequestOptions() { }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        schoolIds.Add(obj.GetProperty("schoolId").GetString());
-                    }
-                }
                 if (bool.Parse($"{term}") == true)
                 {
                     sqlTxt.Append($" where c.createTime >={start} and c.createTime <={end}");
@@ -73,28 +66,17 @@ namespace TEAMModelBI.Controllers.BISchool
 
                 foreach (var schoolId in schoolIds)
                 {
-                    SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId };
                     School school = new();
-                    try
-                    {
-                        school = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
-                    }
-                    catch
+                    var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
+                    if (response.Status == 200)
                     {
+                        using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                        school = json.ToObject<School>();
                     }
-                    schoolPaper.name = school != null ? school.name : schoolId;
 
-                    await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText:sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}") }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt16() > 0)
-                        {
-                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                            {
-                                schoolPaper.total += obj.GetProperty("totals").GetInt64();
-                            }
-                        }
-                    }
+                    SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId, name = school != null ? school.name : schoolId };
+
+                    schoolPaper.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });
 
                     schoolPapers.Add(schoolPaper);
                 }
@@ -103,24 +85,13 @@ namespace TEAMModelBI.Controllers.BISchool
             }
             else
             {
-                long tempTotal = 0;
                 sqlTxt.Append(" where c.pk='Paper' ");
                 if (bool.Parse($"{term}") == true)
                 {
                     sqlTxt.Append($" and c.createTime >= {start} and c.createTime <={end}");
                 }
-                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                    {
-                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                        {
-                            tempTotal += obj.GetProperty("totals").GetInt64();
-                        }
-                    }
-                }
-                paperCount = tempTotal;
+
+                paperCount = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });
             }
 
             return Ok(new { state = 200 , paperCount });
@@ -134,23 +105,11 @@ namespace TEAMModelBI.Controllers.BISchool
         public async Task<IActionResult> GetTotal()
         {
             var cosmosClient = _azureCosmos.GetCosmosClient();
-            long total = 0;
-            //string sqlText = $"select c.id from c where c.pk='Paper'";
-            string sqlText = $"select COUNT(c.id) AS totals from c where c.pk='Paper'";
-            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlText, requestOptions: new QueryRequestOptions() { }))
-            {
-                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                {
-                    //total += count.GetInt64();
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        total += obj.GetProperty("totals").GetInt64();
-                    }
-                }
-            }
+            string sqlTxt = $"select COUNT(c.id) AS totals from c where c.pk='Paper'";
 
-            return Ok(new { state = 200, total });
+            long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "School" });       
+
+            return Ok(new { state = 200, totals });
         }
 
         /// <summary>
@@ -167,38 +126,21 @@ namespace TEAMModelBI.Controllers.BISchool
             List<string> schoolIds = new List<string>();
             List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
 
-            string schoolSql = $"SELECT DISTINCT REPLACE(c.code,'Teacher-','') AS schoolId,c.code,c.roles,c.id,c.name From c where ARRAY_CONTAINS(c.roles,'assist',true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.id='{tmdId}'";
-
-            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: schoolSql, requestOptions: new QueryRequestOptions() { }))
-            {
-                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                {
-                    schoolIds.Add(obj.GetProperty("schoolId").GetString());
-                }
-            }
+            schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
 
             foreach (var schoolId in schoolIds)
             {
-                SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId };
                 School school = new();
-                try
-                {
-                    school = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
-                }
-                catch
+                var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
+                if (response.Status == 200) 
                 {
+                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                    school = json.ToObject<School>();
                 }
-                schoolPaper.name = school != null ? school.name : schoolId;
 
-                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator($"select c.id from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}") }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                    {
-                        schoolPaper.total += count.GetInt64();
-                    }
-                }
+                SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId , name = school != null ? school.name : schoolId };
+
+                schoolPaper.totals = await CommonFind.FindTotals(cosmosClient, "select COUNT(c.id) AS totals from c", new List<string>() { "School" });
 
                 schoolPapers.Add(schoolPaper);
             }
@@ -222,31 +164,9 @@ namespace TEAMModelBI.Controllers.BISchool
                 Dictionary<string, long> schoolYears = new Dictionary<string, long>();
                 foreach (var temp in endList1)
                 {
-                    long total = 0;
                     string sqlText = $"SELECT  COUNT(c.id) AS totals FROM c WHERE c.createTime >= {temp.start} and c.createTime <= {temp.end} and c.pk='Paper'";
-                    await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlText, requestOptions: new QueryRequestOptions() { }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                        {
-                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                            {
-                                total += obj.GetProperty("totals").GetInt64();
-                            }
-                        }
-                    }
 
-                    await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: sqlText, requestOptions: new QueryRequestOptions() { }))
-                    {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                        {
-                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                            {
-                                total += obj.GetProperty("totals").GetInt64();
-                            }
-                        }
-                    }
+                    long total = await CommonFind.FindTotals(cosmosClient, sqlText, new List<string>() { "School", "Teacher" });
 
                     schoolYears.Add(temp.yearMonth, total);
                 }
@@ -256,61 +176,30 @@ namespace TEAMModelBI.Controllers.BISchool
             else
             {
                 List<string> schoolIds = new List<string>();
-                string schoolSql = $"SELECT DISTINCT REPLACE(c.code,'Teacher-','') AS schoolId,c.code,c.roles,c.id,c.name From c where ARRAY_CONTAINS(c.roles,'assist',true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.id='{tmdId}'";
-
-                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: schoolSql, requestOptions: new QueryRequestOptions() { }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        schoolIds.Add(obj.GetProperty("schoolId").GetString());
-                    }
-                }
+                schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
 
                 List<SchoolYear> schoolYears = new List<SchoolYear>();
                 foreach (var schoolId in schoolIds)
                 {
-                    SchoolYear schoolYear = new SchoolYear() { id = schoolId };
                     School school = new();
-                    try
-                    {
-                        school = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
-                    }
-                    catch
+                    var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
+                    if (response.Status == 200) 
                     {
+                        using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                        school = json.ToObject<School>();
                     }
-                    schoolYear.name = school != null ? school.name : schoolId;
+
+                    SchoolYear schoolYear = new SchoolYear() { id = schoolId, name = school != null ? school.name : schoolId };
 
                     Dictionary<string, long> yearCount = new Dictionary<string, long>();
                     foreach (var temp in endList1)
                     {                        
-                        long total = 0;
-                        string sqlText = $"SELECT  COUNT(c.id) AS totals FROM c WHERE c.createTime >= {temp.start} and c.createTime <= {temp.end} and c.pk='Paper'";
-                        await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}") }))
-                        {
-                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                            {
-                                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                                {
-                                    total += obj.GetProperty("totals").GetInt64();
-                                }
-                            }
-                        }
-
-                        await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: sqlText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}") }))
-                        {
-                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                            {
-                                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                                {
-                                    total += obj.GetProperty("totals").GetInt64();
-                                }
-                            }
-                        }
-
-                        yearCount.Add(temp.yearMonth, total);
+                        string sqlTxt = $"SELECT  COUNT(c.id) AS totals FROM c WHERE c.createTime >= {temp.start} and c.createTime <= {temp.end} and c.pk='Paper'";
+
+
+                        long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School", "Teacher" });
+
+                        yearCount.Add(temp.yearMonth, totals);
                     }
                     schoolYear.yearPaper = yearCount;
                     schoolYears.Add(schoolYear);
@@ -335,46 +224,26 @@ namespace TEAMModelBI.Controllers.BISchool
              var total = new object();
             if (!string.IsNullOrEmpty($"{tmdId}"))
             {
-                List<string> schoolIds = new List<string>();
                 List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
 
-                string schoolSql = $"SELECT DISTINCT REPLACE(c.code,'Teacher-','') AS schoolId,c.code,c.roles,c.id,c.name From c where ARRAY_CONTAINS(c.roles,'assist',true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.id='{tmdId}'";
-
-                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: schoolSql, requestOptions: new QueryRequestOptions() { }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                    {
-                        schoolIds.Add(obj.GetProperty("schoolId").GetString());
-                    }
-                }
+                List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
 
                 foreach (var schoolId in schoolIds)
                 {
-                    SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId };
                     School school = new();
-                    try
-                    {
-                        school = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
-                    }
-                    catch
-                    {
-                    }
-                    schoolPaper.name = school != null ? school.name : schoolId;
 
-                    await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator($"select count(c.id) AS totals from c where c.createTime >={start} and c.createTime <={end}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolId}") }))
+                    var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
+                    if(response.Status == 200) 
                     {
-                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                        {
-                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                            {
-                                schoolPaper.total += obj.GetProperty("totals").GetInt64();
-                            }
-                            //schoolPaper.total += count.GetInt64();
-                        }
+                        using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                        school = json.ToObject<School>();
                     }
 
+                    SchoolPaper schoolPaper = new SchoolPaper() { id = schoolId, name = school != null ? school.name : schoolId };
+
+                    string sqlTxt = $"select count(c.id) AS totals from c where c.createTime >={start} and c.createTime <={end}";
+                    schoolPaper.totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School" });
+
                     schoolPapers.Add(schoolPaper);
                 }
 
@@ -382,21 +251,9 @@ namespace TEAMModelBI.Controllers.BISchool
             }
             else
             {
-                long tempTotal = 0;
                 string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c where c.pk='Paper' and c.createTime >= {start} and c.createTime <= {end}";
-                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt64() > 0)
-                    {
-                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray()) 
-                        {
-                            //total += obj.GetProperty("totals").GetInt64();
-                            tempTotal += obj.GetProperty("totals").GetInt64();
-                        }
-                    }
-                }
-                total = tempTotal;
+
+                total = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School" });
             }
 
             return Ok(new { state = 200, total });
@@ -406,7 +263,7 @@ namespace TEAMModelBI.Controllers.BISchool
         {
             public string id { get; set; }
             public string name { get; set; }
-            public long total { get; set; }
+            public long totals { get; set; }
         }
 
         public record SchoolYear 

+ 9 - 6
TEAMModelBI/Models/CommonFind.cs

@@ -14,17 +14,20 @@ namespace TEAMModelBI.Models
         /// <param name="sqlTxt"></param>
         /// <param name="containerId"></param>
         /// <returns></returns>
-        public static async Task<long> FindTotals(CosmosClient cosmosClient, string sqlTxt, string containerId)
+        public static async Task<long> FindTotals(CosmosClient cosmosClient, string sqlTxt, List<string> containerId)
         {
             long totals = 0;
-            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", containerId).GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
+            foreach (var container in containerId)
             {
-                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt32() > 0)
+                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", container).GetItemQueryStreamIterator(queryText: sqlTxt.ToString(), requestOptions: new QueryRequestOptions() { }))
                 {
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt32() > 0)
                     {
-                        totals += obj.GetProperty("totals").GetInt64();
+                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                        {
+                            totals += obj.GetProperty("totals").GetInt64();
+                        }
                     }
                 }
             }