Переглянути джерело

统计当前学期的活动

Li 3 роки тому
батько
коміт
45b90ed646

+ 90 - 0
TEAMModelBI/Controllers/Census/ActivitySticsController.cs

@@ -10,6 +10,7 @@ using TEAMModelOS.Models;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Models;
 using System.Text.Json;
+using TEAMModelBI.Tool;
 
 namespace TEAMModelBI.Controllers.Census
 {
@@ -229,6 +230,95 @@ namespace TEAMModelBI.Controllers.Census
             return Ok(new { state = 200, typeCount });
         }
 
+        /// <summary>
+        /// 统计当前学期的活动,
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [HttpPost("get-termactivity")]
+        public async Task<IActionResult> GetTermActivity(JsonElement jsonElement) 
+        {
+            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 = 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());
+                    }
+                }
+                foreach (var type in types)
+                {
+                    List<SchoolActivity> schoolActivities = new List<SchoolActivity>();
+                    foreach (var itemId in schoolIds)
+                    {
+                        School school = new();
+                        try
+                        {
+                            school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(itemId, new PartitionKey("Base"));
+                        }
+                        catch
+                        {
+                        }
+
+                        SchoolActivity schoolActivity = new SchoolActivity() { id = itemId, name = school.name != null ? school.name : itemId };
+
+                        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}";
+                        await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: activitySql, requestOptions: new QueryRequestOptions() { }))
+                        {
+                            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())
+                                {
+                                    schoolActivity.total += obj.GetProperty("totals").GetInt64();
+                                }
+                            }
+                        }
+                        schoolActivities.Add(schoolActivity);
+                    }
+
+                    KeyValuePair<string, object> valuePair = new KeyValuePair<string, object>(type, schoolActivities);
+                    typeCount.Add(valuePair);
+                }
+            }
+            else 
+            {
+                foreach (var type in types)
+                {
+                    long acount = 0;
+                    string querySql = $"SELECT COUNT(c.id) AS totals FROM c where c.pk='{type}' and c.createTime >= {start} and c.createTime <= {end}";
+                    await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: querySql, requestOptions: new QueryRequestOptions() { }))
+                    {
+                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetInt32() > 0)
+                        {
+                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                            {
+                                acount += obj.GetProperty("totals").GetInt64();
+                            }
+                        }
+                    }
+
+                    KeyValuePair<string, object> valuePair = new KeyValuePair<string, object>(type, acount);
+                    typeCount.Add(valuePair);
+                }
+            }
+
+            return Ok(new { state = 200, typeCount });
+        }
+
         public record SchoolActivity 
         {
             public string id { get; set; }