Sfoglia il codice sorgente

优化开放平台应用接口,区级统计接口,优化公共方法

Li 3 anni fa
parent
commit
21b51fe3a8

+ 9 - 2
TEAMModelBI/Controllers/BINormal/AppCompanyController.cs

@@ -10,6 +10,7 @@ using System.Text;
 using System.Text.Json;
 using System.Threading.Tasks;
 using TEAMModelBI.Filter;
+using TEAMModelBI.Models.Extension;
 using TEAMModelBI.Tool.Extension;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.DI;
@@ -237,16 +238,18 @@ namespace TEAMModelBI.Controllers.BINormal
                         if (bool.Parse($"{isAudit}") == true)
                         {
                             appCompany.audit = 1;
+                            appCompany.jwtKey = JwtAuth.CreateApplyJwtKeyBI(_option.HostName, _option.JwtSecretKey, appCompany);
                             strMsg.Append("通过。");
                         }
                         else
                         {
                             appCompany.audit = 0;
                             appCompany.refuseDesc = $"{refuseDesc}";
-                            strMsg.Append("失败。");
+                            strMsg.Append("拒绝通过。");
                         }
                         try
                         {
+                            
                             await cosmosClient.GetContainer("TEAMModelOS", "Normal").ReplaceItemAsync<AppCompany>(appCompany, appCompany.id, new PartitionKey(idCode.code));
                         }
                         catch
@@ -342,6 +345,7 @@ namespace TEAMModelBI.Controllers.BINormal
                                         {
                                             appApiState.status = 1;
                                             appApiState.refuseDesc = null;
+                                            appCompany.jwtKey = JwtAuth.CreateApplyJwtKeyBI(_option.HostName, _option.JwtSecretKey, appCompany);
                                             strMsg.Append($"{appApiState.no}通过,");
                                         }
                                         else
@@ -468,6 +472,7 @@ namespace TEAMModelBI.Controllers.BINormal
                                 {
                                     applySchool.status = 1;
                                     applySchool.refuseDesc = null;
+                                    appCompany.jwtKey = JwtAuth.CreateApplyJwtKeyBI(_option.HostName, _option.JwtSecretKey, appCompany);
                                     strMsg.Append($"审核成功。");
                                 }
                                 else
@@ -523,7 +528,6 @@ namespace TEAMModelBI.Controllers.BINormal
             }
         }
 
-
         /// <summary>
         /// 应用申请和审核api信息
         /// </summary>
@@ -543,6 +547,9 @@ namespace TEAMModelBI.Controllers.BINormal
             public string code { get; set; }
         }
 
+        /// <summary>
+        /// 未审核应用
+        /// </summary>
         public record NoAudit 
         { 
             public string id { get; set; }

+ 182 - 47
TEAMModelBI/Controllers/BISchool/SchoolController.cs

@@ -34,7 +34,7 @@ namespace TEAMModelBI.Controllers.BISchool
         private readonly IConfiguration _configuration;
         private readonly NotificationService _notificationService;
 
-        public SchoolController(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, IOptionsSnapshot<Option> option, AzureRedisFactory azureRedis, IConfiguration configuration, NotificationService notificationService) 
+        public SchoolController(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, IOptionsSnapshot<Option> option, AzureRedisFactory azureRedis, IConfiguration configuration, NotificationService notificationService)
         {
             _azureCosmos = azureCosmos;
             _dingDing = dingDing;
@@ -51,14 +51,14 @@ namespace TEAMModelBI.Controllers.BISchool
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [HttpPost("get-notarea")]
-        public async Task<IActionResult> GetNotAreaSchool() 
+        public async Task<IActionResult> GetNotAreaSchool()
         {
             try
             {
                 var cosmosClient = _azureCosmos.GetCosmosClient();
                 string sqltxt = $"SELECT c.id,c.name,c.schoolCode,c.province,c.city,c.dist,c.picture,c.period FROM c WHERE c.standard=null";
                 List<NotAreaSchool> notAreaSchools = new List<NotAreaSchool>();
-                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: sqltxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") })) 
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: sqltxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -99,7 +99,7 @@ namespace TEAMModelBI.Controllers.BISchool
         [ProducesDefaultResponseType]
         [AuthToken(Roles = "assist")]
         [HttpPost("set-schooljoinarea")]
-        public async Task<IActionResult> SetSchoolJoinArea(JsonElement jsonElement) 
+        public async Task<IActionResult> SetSchoolJoinArea(JsonElement jsonElement)
         {
             try
             {
@@ -112,13 +112,13 @@ namespace TEAMModelBI.Controllers.BISchool
                 List<string> schoolCodes = _schoolCode.ToObject<List<string>>();
 
                 var cosmosCliet = _azureCosmos.GetCosmosClient();
-                
-                if (schoolCodes.Count > 0) 
+
+                if (schoolCodes.Count > 0)
                 {
-                    foreach (var tempCode in schoolCodes) 
+                    foreach (var tempCode in schoolCodes)
                     {
-                        School school = await cosmosCliet.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(tempCode,new PartitionKey("Base"));
-                        if (school != null) 
+                        School school = await cosmosCliet.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(tempCode, new PartitionKey("Base"));
+                        if (school != null)
                         {
                             school.standard = $"{standard}";
                             school.areaId = $"{_areaId}";
@@ -144,13 +144,13 @@ namespace TEAMModelBI.Controllers.BISchool
         /// </summary>
         /// <param name="jsonElement"></param>
         /// <returns></returns>
-        [HttpPost("get-assustschool")]
+        [HttpPost("get-assistschool")]
         public async Task<IActionResult> GetAssistSchool(JsonElement jsonElement)
         {
             try
             {
                 if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
-              
+
                 List<object> schools = new List<object>();
                 var cosmosClient = _azureCosmos.GetCosmosClient();
                 //List<string> schoolIds = new List<string>();
@@ -182,7 +182,7 @@ namespace TEAMModelBI.Controllers.BISchool
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"BI,{_option.Location}   /schoolcheck/get-assustschool   {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
+                await _dingDing.SendBotMsg($"BI,{_option.Location}   /schoolcheck/get-assustschool  \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
                 return BadRequest();
             }
         }
@@ -205,7 +205,7 @@ namespace TEAMModelBI.Controllers.BISchool
                 if (rsponse.Status == 200)
                 {
                     using var json = await JsonDocument.ParseAsync(rsponse.ContentStream);
-                    School school  = json.ToObject<School>();
+                    School school = json.ToObject<School>();
 
                     return Ok(new { state = 200, school });
                 }
@@ -215,7 +215,7 @@ namespace TEAMModelBI.Controllers.BISchool
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"BI,{_option.Location}   /schoolcheck/get-schoolid   {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
+                await _dingDing.SendBotMsg($"BI,{_option.Location}   /schoolcheck/get-schoolid  \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
                 return BadRequest();
             }
         }
@@ -257,8 +257,8 @@ namespace TEAMModelBI.Controllers.BISchool
                         }
                         await cosmosClient.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(item, item.id, new PartitionKey($"Base"));
                     }
-                    schoolInfo = await cosmosClient.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<School>(school,school.id, new PartitionKey($"Base"));
-                    
+                    schoolInfo = await cosmosClient.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey($"Base"));
+
                     //保存操作记录
                     await _azureStorage.SaveBILog("school-update", $"{tmdName}【{tmdId}】修改学校信息,学校和ID:{school.name}【{school.id}】", _dingDing, httpContext: HttpContext);
                 }
@@ -309,18 +309,19 @@ namespace TEAMModelBI.Controllers.BISchool
         /// </summary>
         /// <param name="jsonElement"></param>
         /// <returns></returns>
-        [HttpPost("get-space")]
-        public async Task<IActionResult> GetAssistSchoolSpace(JsonElement jsonElement) 
+        [HttpPost("get-assistspace")]
+        public async Task<IActionResult> GetAssistSchoolSpace(JsonElement jsonElement)
         {
             if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
             var cosmosClient = _azureCosmos.GetCosmosClient();
+
             List<string> schools = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
-            List<SchoolSpace> schoolSpaces = new List<SchoolSpace>();
+            List<SchoolSpace> schoolSpaces = new();
             foreach (var sid in schools)
             {
                 School school = new();
                 var response = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(sid, new PartitionKey("Base"));
-                if (response.Status == 200) 
+                if (response.Status == 200)
                 {
                     using var json = await JsonDocument.ParseAsync(response.ContentStream);
                     school = json.ToObject<School>();
@@ -340,7 +341,7 @@ namespace TEAMModelBI.Controllers.BISchool
                     }
                 }
 
-                SchoolSpace schoolSpace = new SchoolSpace() { id = sid, name = school != null ? school.name : sid };
+                SchoolSpace schoolSpace = new() { id = sid, name = school != null ? school.name : sid };
 
                 Space space = new Space();
                 long blobsize = 0; //使用大小                
@@ -354,7 +355,7 @@ namespace TEAMModelBI.Controllers.BISchool
                     {
                     }
                 }
-                else 
+                else
                 {
                     var client = _azureStorage.GetBlobContainerClient(sid);
                     var size = await client.GetBlobsCatalogSize();
@@ -398,8 +399,8 @@ namespace TEAMModelBI.Controllers.BISchool
                         await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Blob:Catalog:{sid}", key, size.Item2[key].HasValue ? size.Item2[key].Value : 0);
                     }
 
-                    space.useSize = (long)size.Item1; 
-                    space.tSize = teach; 
+                    space.useSize = (long)size.Item1;
+                    space.tSize = teach;
                     space.catalogSize = size.Item2;
                     schoolSpace.space = space;
                     schoolSpaces.Add(schoolSpace);
@@ -429,7 +430,7 @@ namespace TEAMModelBI.Controllers.BISchool
             {
                 schoolTeacher.roles.Remove("assist");
                 SchoolTeacher newSchoolTeacher = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<SchoolTeacher>($"{_shiftTeacher}", new PartitionKey($"Teacher-{_school}"));
-                if (!newSchoolTeacher.roles.Contains("assist")) 
+                if (!newSchoolTeacher.roles.Contains("assist"))
                 {
                     newSchoolTeacher.roles.Add("assist");
                     newSchoolTeacher = await cosmosClient.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<SchoolTeacher>(newSchoolTeacher, $"{_shiftTeacher}", new PartitionKey($"Teacher-{_school}"));
@@ -452,7 +453,7 @@ namespace TEAMModelBI.Controllers.BISchool
                     expires = DateTimeOffset.UtcNow.AddDays(7).ToUnixTimeSeconds()
                 };
 
-                if (notification != null) 
+                if (notification != null)
                 {
                     var url = _configuration.GetValue<string>("HaBookAuth:CoreService:sendnotification");
                     var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
@@ -474,7 +475,7 @@ namespace TEAMModelBI.Controllers.BISchool
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [HttpPost("get-schoolmanage")]
-        public async Task<IActionResult> GetSchoolManage(JsonElement jsonElement) 
+        public async Task<IActionResult> GetSchoolManage(JsonElement jsonElement)
         {
             if (!jsonElement.TryGetProperty("schoolCode", out JsonElement schoolCode)) return BadRequest();
             if (!jsonElement.TryGetProperty("isAdmin", out JsonElement isAdmin)) return BadRequest();
@@ -512,7 +513,6 @@ namespace TEAMModelBI.Controllers.BISchool
             return Ok(new { state = 200, schoolTeachers });
         }
 
-
         /// <summary>
         /// 设置学校管理员
         /// </summary>
@@ -575,7 +575,7 @@ namespace TEAMModelBI.Controllers.BISchool
                 await _dingDing.SendBotMsg($"BI,{_option.Location}  /batchschool/set-schoolme \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
                 return BadRequest();
             }
-            
+
         }
 
         /// <summary>
@@ -610,32 +610,167 @@ namespace TEAMModelBI.Controllers.BISchool
             return Ok(new { state = 200, schools });
         }
 
-
         /// <summary>
-        /// 修改学校的结构
+        /// 依据区域Id查询区域空间统计
         /// </summary>
-        public record ReplaceSchool()
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("get-spance")]
+        public async Task<IActionResult> GetAreaSpace(JsonElement jsonElement)
         {
-            /// <summary>
-            /// 醍摩豆账户ID
-            /// </summary>
-            public string tmdId { get; set; }
+            jsonElement.TryGetProperty("areaId", out JsonElement areaId);
+            jsonElement.TryGetProperty("schoolId", out JsonElement schoolId);
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+            long allSize = 0;    //全部大小
+            int teacherSpace = 0;  //学校分配给教师的空间
+            long useSize = 0;   //已使用大小 
+            Dictionary<string, double?> useSpaceInfo = new();  //学校使用详情
 
-            /// <summary>
-            /// 醍摩豆账户名称
-            /// </summary>
-            public string tmdName { get; set; }
+            //查询区域所有学校
+            if (!string.IsNullOrEmpty($"{areaId}"))
+            {
+                List<string> schools = new();
+                schools = await CommonFind.FindSchoolIds(cosmosClient, $"select c.id from c where c.areaId='{areaId}'", "Base");
 
-            /// <summary>
-            /// 学校
-            /// </summary>
-            public School school { get; set; }
+                allSize = await CommonFind.FindTotals(cosmosClient, $"select sum(c.size) as totals from c where c.areaId='{areaId}'", new List<string> { "School" }); //区域所有学校空间
+
+                foreach (var school in schools)
+                {
+                    await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"SELECT sum(c.size) as size FROM c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{school}") }))
+                    {
+                        var json = await JsonDocument.ParseAsync(item.ContentStream);
+                        foreach (var elmt in json.RootElement.GetProperty("Documents").EnumerateArray())
+                        {
+                            if (elmt.TryGetProperty("size", out JsonElement _size) && _size.ValueKind.Equals(JsonValueKind.Number))
+                            {
+                                teacherSpace += _size.GetInt32();
+                                break;
+                            }
+                        }
+                    }
+
+                    long blobsize = 0;
+                    RedisValue value = _azureRedis.GetRedisClient(8).HashGet($"Blob:Record", $"{school}");
+                    if (!value.IsNullOrEmpty)
+                    {
+                        JsonElement record = value.ToString().ToObject<JsonElement>();
+                        if (record.TryGetInt64(out blobsize))
+                        {
+                        }
+                    }
+                    else
+                    {
+                        var storageClient = _azureStorage.GetBlobContainerClient("school");
+                        var size = await storageClient.GetBlobsCatalogSize();
+                        await _azureRedis.GetRedisClient(8).HashSetAsync($"Blob:Record", $"{school}", size.Item1);
+                        foreach (var key in size.Item2.Keys)
+                        {
+                            await _azureRedis.GetRedisClient(8).SortedSetRemoveAsync($"Bolb:Catalog:{school}", key);
+                            await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Bolb:Catalog:school", key, size.Item2[key].HasValue ? size.Item2[key].Value : 0);
+                        }
+
+                        useSize += size.Item1.Value;
+                        useSpaceInfo = useSpaceInfo.Concat(size.Item2).GroupBy(g => g.Key).ToDictionary(k => k.Key, k => k.Sum(kvp => kvp.Value));   //lamebda表达式
+                        //useSpaceInfo = (from e in useSpaceInfo.Concat(size.Item2) group e by e.Key into g select new { Name = g.Key, value = g.Sum(kvp => kvp.Value) }).ToDictionary(item => item.Name, item => item.value);  //linq 方式合并
+                    }
+
+                    SortedSetEntry[] Scores = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Blob:Catalog:{school}");
+                    if (Scores != null)
+                    {
+                        Dictionary<string, double?> catalog = new();
+                        foreach (var score in Scores)
+                        {
+                            double val = score.Score;
+                            string key = score.Element.ToString();
+                            catalog.Add(key, val);
+                        }
+                        useSpaceInfo = useSpaceInfo.Concat(catalog).GroupBy(g => g.Key).ToDictionary(k => k.Key, k => k.Sum(kvp => kvp.Value));  //lamebda表达式
+                        //useSpaceInfo = (from e in useSpaceInfo.Concat(catalog) group e by e.Key into g select new { Name = g.Key, value = g.Sum(kvp => kvp.Value) }).ToDictionary(item => item.Name, item => item.value);  //linq 方式合并
+                    }
+                    else
+                    {
+                        var client = _azureStorage.GetBlobContainerClient("school");
+                        var size = await client.GetBlobsCatalogSize();
+                        await _azureRedis.GetRedisClient(8).HashSetAsync($"Blob:Record", $"{school}", size.Item1);
+                        foreach (var key in size.Item2.Keys)
+                        {
+                            await _azureRedis.GetRedisClient(8).SortedSetRemoveAsync($"Blob:Catalog:{school}", key);
+                            await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Blob:Catalog:{school}", key, size.Item2[key].HasValue ? size.Item2[key].Value : 0);
+                        }
+                        useSize += size.Item1.Value;
+                        useSpaceInfo = useSpaceInfo.Concat(size.Item2).GroupBy(g => g.Key).ToDictionary(k => k.Key, k => k.Sum(kvp => kvp.Value));   //lamebda表达式
+                        //useSpaceInfo = (from e in useSpaceInfo.Concat(size.Item2) group e by e.Key into g select new { Name = g.Key, value = g.Sum(kvp => kvp.Value) }).ToDictionary(item => item.Name, item => item.value);   //linq 方式合并
+                    }
+                }
+            }
+
+            //查询学校
+            if (!string.IsNullOrEmpty($"{schoolId}"))
+            {
+                allSize = await CommonFind.FindTotals(cosmosClient, $"SELECT c.size as totals FROM c where c.id='{schoolId}'", "School", "Base");
+
+                teacherSpace = await CommonFind.FindTotals(cosmosClient, $"SELECT sum(c.size) as totals FROM c", "School", $"Teacher-{schoolId}");
+
+                long blobsize = 0;
+                RedisValue value = _azureRedis.GetRedisClient(8).HashGet($"Blob:Record", $"{schoolId}");
+                if (!value.IsNullOrEmpty)
+                {
+                    JsonElement record = value.ToString().ToObject<JsonElement>();
+                    if (record.TryGetInt64(out blobsize))
+                    {
+                        useSize = blobsize;
+                    }
+                }
+                else
+                {
+                    var storageClient = _azureStorage.GetBlobContainerClient("school");
+                    var size = await storageClient.GetBlobsCatalogSize();
+                    await _azureRedis.GetRedisClient(8).HashSetAsync($"Blob:Record", $"{schoolId}", size.Item1);
+                    foreach (var key in size.Item2.Keys)
+                    {
+                        await _azureRedis.GetRedisClient(8).SortedSetRemoveAsync($"Bolb:Catalog:{schoolId}", key);
+                        await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Bolb:Catalog:school", key, size.Item2[key].HasValue ? size.Item2[key].Value : 0);
+                    }
+                    useSpaceInfo = size.Item2;
+                }
+
+                Dictionary<string, double?> catalog = new();
+                SortedSetEntry[] Scores = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Blob:Catalog:{schoolId}");
+                if (Scores != null)
+                {
+                    foreach (var score in Scores)
+                    {
+                        double val = score.Score;
+                        string key = score.Element.ToString();
+                        catalog.Add(key, val);
+                    }
+
+                    useSpaceInfo = catalog;
+                }
+                else
+                {
+                    var client = _azureStorage.GetBlobContainerClient("school");
+                    var size = await client.GetBlobsCatalogSize();
+                    await _azureRedis.GetRedisClient(8).HashSetAsync($"Blob:Record", $"{schoolId}", size.Item1);
+                    foreach (var key in size.Item2.Keys)
+                    {
+                        await _azureRedis.GetRedisClient(8).SortedSetRemoveAsync($"Blob:Catalog:{schoolId}", key);
+                        await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Blob:Catalog:{schoolId}", key, size.Item2[key].HasValue ? size.Item2[key].Value : 0);
+                    }
+
+                    useSize = size.Item1.Value;
+                    useSpaceInfo = size.Item2;
+                }
+            }
+
+            return Ok(new { state = 200, allSize, useSize, teacherSpace, useSpaceInfo });
         }
 
         /// <summary>
         /// 未加入区域的学校
         /// </summary>
-        public record NotAreaSchool 
+        public record NotAreaSchool
         {
             public string id { get; set; }
 
@@ -657,7 +792,7 @@ namespace TEAMModelBI.Controllers.BISchool
         /// <summary>
         /// 学校空间使用情况
         /// </summary>
-        public record SchoolSpace 
+        public record SchoolSpace
         {
             public string id { get; set; }
 
@@ -669,7 +804,7 @@ namespace TEAMModelBI.Controllers.BISchool
         /// <summary>
         /// 空间
         /// </summary>
-        public record Space 
+        public record Space
         {
             /// <summary>
             /// 已使用空间

+ 7 - 2
TEAMModelBI/Controllers/BITest/TestController.cs

@@ -632,9 +632,14 @@ namespace TEAMModelBI.Controllers.BITest
 
             List<MonthStartEnd> endList = TimeHelper.GetYearMonthlyStartEnd10(DateTimeOffset.UtcNow.Year);
             List<MonthStartEnd> endList1 = TimeHelper.GetYearMonthlyStartEnd13(DateTimeOffset.UtcNow.Year);
-            List<MonthStartEnd> endList2 = TimeHelper.monthsOfYear(DateTimeOffset.UtcNow.ToString());
+            //return Ok(new { strList, dateTime, year, start, end, endList, endList1, endList2 });
 
-            return Ok(new { strList, dateTime, year, start, end, endList, endList1 , endList2 });
+            var (start1, end1) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow);
+            var (start2, end2) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow,"week");
+            var (start3, end3) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow,"month");
+            var (start4, end4) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "year");
+
+            return Ok(new { start1, end1, start2, end2, start3, end3, start4, end4 });
         }
 
         public static List<string> monthsOfYear(string yearMonth)

+ 159 - 7
TEAMModelBI/Controllers/Census/ActivitySticsController.cs

@@ -14,6 +14,7 @@ using TEAMModelBI.Tool;
 using System.Text;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelBI.Models;
+using TEAMModelOS.SDK;
 
 namespace TEAMModelBI.Controllers.Census
 {
@@ -25,14 +26,16 @@ namespace TEAMModelBI.Controllers.Census
         private readonly AzureStorageFactory _azureStorage;
         private readonly DingDing _dingDing;
         private readonly Option _option;
+        private readonly CoreAPIHttpService _coreAPIHttpService;
         public readonly List<string> types = new List<string> { "Exam", "Survey", "Vote", "Homework" };
 
-        public ActivitySticsController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option)
+        public ActivitySticsController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option, CoreAPIHttpService coreAPIHttpService)
         {
             _azureCosmos = azureCosmos;
             _dingDing = dingDing;
             _azureStorage = azureStorage;
             _option = option?.Value;
+            _coreAPIHttpService = coreAPIHttpService;
         }
 
         /// <summary>
@@ -210,7 +213,6 @@ namespace TEAMModelBI.Controllers.Census
                 }
 
                 return Ok(new { state = 200, activityCounts });
-
             }
             else
             {
@@ -226,7 +228,143 @@ namespace TEAMModelBI.Controllers.Census
 
                 return Ok(new { state = 200, typeCount });
             }
+        }
+
+        /// <summary>
+        /// 统计区域的活动
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [HttpPost("get-area")]
+        public async Task<IActionResult> GetAreaActovoty(JsonElement jsonElement) 
+        {
+            if (!jsonElement.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+            List<RecSchool> schools = new();
+
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<RecSchool>(queryText: $"select c.id,c.name,c.picture,c.scale from c where c.areaId='{areaId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
+            {
+                schools.Add(item);
+            }
+
+            long exemAreaCount = 0;
+            long surveyAreaCount = 0;
+            long voteAreaCount = 0;
+            long homeworkAreaCount = 0;
+
+            List<ActivityCount> activityCount = new();
+            foreach (var school in schools)
+            {
+                ActivityCount tempCount = new ActivityCount() { id = school.id, name = school.name != null ? school.name : school.id };
+                foreach (var type in types)
+                {
+                    StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals from c where c.pk='{type}' and c.school='{school.id}' ");                
+                    long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "Common" });
+
+                    switch (type)
+                    {
+                        case "Exam":
+                            exemAreaCount += totals;
+                            break;
+                        case "Survey":
+                             surveyAreaCount += totals;
+                            break;
+                        case "Vote":
+                             voteAreaCount += totals;
+                            break;
+                        case "Homework":
+                             homeworkAreaCount += totals;
+                            break;
+                    }
+
+                    tempCount.census.Add(new KeyValuePair<object, long>(type, totals));
+                }
+                activityCount.Add(tempCount);
+            }
+
+            return Ok(new { state = 200, exemAreaCount, surveyAreaCount, voteAreaCount, homeworkAreaCount, activityCount });
+        }
+
+        /// <summary>
+        /// 依据区统计区级相关信息包括活动统计
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [HttpPost("get-areastics")]
+        public async Task<IActionResult> GetAreaStics(JsonElement jsonElement) 
+        {
+            if (!jsonElement.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
+
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+            List<RecSchool> schools = new();
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<RecSchool>(queryText: $"select c.id,c.name,c.picture,c.scale from c where c.areaId='{areaId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
+            {
+                schools.Add(item);
+            }
+            //区级人员
+            int countArea = 0;
+            //区级评审人员
+            int appraiseArea = 0;
+            long examAreaCount = 0;   //试卷活动
+            long surveyAreaCount = 0;  //问卷活动
+            long voteAreaCount = 0;   //投票活动
+            long homeworkAreaCount = 0;  //作业活动
+            List<SchoolInfos> schoolInfos = new();
+            List<ActivityCount> activityCount = new();
+
+            int totalTime = 0;
+            foreach (var school in schools)
+            {
+                int count = 0;
+                int appraise = 0;
+                await foreach (var info in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<bool>(queryText: $"select value(array_contains(c.permissions,'train-appraise')) from c", requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Teacher-{school.id}") }))
+                {
+                    if (info)
+                    {
+                        appraise += 1;
+                        appraiseArea += 1;
+                    }
+                    countArea += 1;
+                    count += 1;
+                }
 
+                //查询学校的总学时
+                totalTime += await CommonFind.FindTotals(cosmosClient, "SELECT sum(c.totalTime) as totals FROM c", "Teacher", $"TeacherTrain-{school.id}");
+                //查询学校参训人数
+                int tempCount = await CommonFind.FindTotals(cosmosClient, $"select array_length(c.members) as totals from c where c.type='yxtrain'", "School", $"GroupList-{school.id}");
+                //学校学生人数
+                long stuCount = await CommonFind.FindTotals(cosmosClient, $"select count(c.id) as totals from c", "Student", $"Base-{school.id}");
+
+                schoolInfos.Add(new SchoolInfos { schoolId = school.id, schoolName = school.name, picture = school.picture, scale = school.scale, teacherCount = count, studentCount = stuCount, appraiseCount = appraise, trainCount = tempCount });
+
+                ActivityCount tempActivity = new ActivityCount() { id = school.id, name = school.name != null ? school.name : school.id };
+                foreach (var type in types)
+                {
+                    StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals from c where c.pk='{type}' and c.school='{school.id}' ");
+                    long totals = await CommonFind.FindTotals(cosmosClient, sqlTxt.ToString(), new List<string>() { "Common" });
+
+                    switch (type)
+                    {
+                        case "Exam":
+                            examAreaCount += totals;
+                            break;
+                        case "Survey":
+                            surveyAreaCount += totals;
+                            break;
+                        case "Vote":
+                            voteAreaCount += totals;
+                            break;
+                        case "Homework":
+                            homeworkAreaCount += totals;
+                            break;
+                    }
+
+                    tempActivity.census.Add(new KeyValuePair<object, long>(type, totals));
+                }
+                activityCount.Add(tempActivity);
+            }
+
+            return Ok(new { state = 200, schoolCount = schools.Count, countArea, totalTime, appraiseArea, examAreaCount, surveyAreaCount, voteAreaCount, homeworkAreaCount, schools = schoolInfos, schoolActivity = activityCount });
         }
 
         /// <summary>
@@ -275,22 +413,36 @@ namespace TEAMModelBI.Controllers.Census
         }
 
 
-
-        public record SchoolActivity 
+        public record RecSchool
         {
             public string id { get; set; }
             public string name { get; set; }
+            public string picture { get; set; }
+            public int scale { get; set; }
+        }
 
-            public long total { get; set; }
+        private class SchoolInfos
+        {
+            public string schoolId { get; set; }
+            public string schoolName { get; set; }
+            public string picture { get; set; }
+            //规模
+            public int scale { get; set; }
+            //教师人数
+            public int teacherCount { get; set; }
+            //学生人数
+            public long studentCount { get; set; }
+            //评审人数
+            public int appraiseCount { get; set; }
+            //参训人数
+            public int trainCount { get; set; }
         }
 
         public record ActivityCount 
         {
             public string id { get; set; }
             public string name { get; set; }
-
             public List<KeyValuePair<object, long>> census { get; set; } = new List<KeyValuePair<object, long>>();
-
         }
     }
 }

+ 193 - 28
TEAMModelBI/Controllers/Census/LessonSticsController.cs

@@ -28,12 +28,12 @@ namespace TEAMModelBI.Controllers.Census
         private readonly DingDing _dingDing;
         private readonly Option _option;
 
-        public LessonSticsController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureFactory, DingDing dingDing, IOptionsSnapshot<Option> option) 
+        public LessonSticsController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureFactory, DingDing dingDing, IOptionsSnapshot<Option> option)
         {
             _azureCosmos = azureCosmos;
             _azureStorage = azureFactory;
             _dingDing = dingDing;
-            _option = option?.Value;        
+            _option = option?.Value;
         }
 
         /// <summary>
@@ -48,15 +48,16 @@ namespace TEAMModelBI.Controllers.Census
             if (!jsonElement.TryGetProperty("term", out JsonElement term)) return BadRequest();
             var cosmosClient = _azureCosmos.GetCosmosClient();
             var (start, end) = TimeHelper.GetTermStartOrEnd(DateTime.Now);
-            object totals = new object();
+            object totals = new();
+            StringBuilder sqlTxt = new($"select COUNT(c.id) AS totals  from c where c.pk='LessonRecord'");
             if (!string.IsNullOrEmpty($"{tmdId}"))
             {
-                List<SchoolLen> schoolLens = new List<SchoolLen>();
+                List<SchoolLen> schoolLens = new();
 
                 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)
@@ -65,11 +66,11 @@ namespace TEAMModelBI.Controllers.Census
                         school = json.ToObject<School>();
                     }
 
-                    SchoolLen schoolLen = new SchoolLen() { id = itemId, name = school.name != null ? school.name : itemId };
+                    SchoolLen schoolLen = new() { id = itemId, name = school.name != null ? school.name : 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($" WHERE c.code='LessonRecord-{itemId}'");
+                    if (bool.Parse($"{term}") == true)
                     {
                         sqlTxt.Append($" and c.startTime >= {start} and c.startTime <= {end}");
                     }
@@ -80,9 +81,9 @@ namespace TEAMModelBI.Controllers.Census
                 }
                 totals = schoolLens;
             }
-            else 
+            else
             {
-                StringBuilder sqlTxt = new StringBuilder($"select COUNT(c.id) AS totals  from c where c.pk='LessonRecord'");
+                sqlTxt.Append($" where c.pk='LessonRecord'");
                 if (bool.Parse($"{term}") == true)
                 {
                     sqlTxt.Append($" and c.startTime >= {start} and c.startTime <= {end}");
@@ -111,7 +112,7 @@ namespace TEAMModelBI.Controllers.Census
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"BI,{_option.Location}  /lesson/get-total  {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
+                await _dingDing.SendBotMsg($"BI,{_option.Location}  /lesson/get-total \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
                 return BadRequest();
             }
         }
@@ -123,16 +124,16 @@ namespace TEAMModelBI.Controllers.Census
         /// <returns></returns>
         [ProducesDefaultResponseType]
         [HttpPost("get-assiist")]
-        public async Task<IActionResult> GetAssiist(JsonElement jsonElement) 
+        public async Task<IActionResult> GetAssiist(JsonElement jsonElement)
         {
             try
             {
                 if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
                 var cosmosClient = _azureCosmos.GetCosmosClient();
-                List<SchoolLen> schoolLens = new List<SchoolLen>();
+                List<SchoolLen> schoolLens = new();
 
                 List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
-                
+
                 foreach (var itemId in schoolIds)
                 {
                     School school = new();
@@ -143,7 +144,7 @@ namespace TEAMModelBI.Controllers.Census
                         school = json.ToObject<School>();
                     }
 
-                    SchoolLen schoolLen = new SchoolLen() { id = itemId, name = school != null ? school.name : itemId };
+                    SchoolLen schoolLen = new() { 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, new List<string>() { "School" });
 
@@ -173,12 +174,12 @@ namespace TEAMModelBI.Controllers.Census
             {
                 jsonElement.TryGetProperty("years", out JsonElement _years);
                 int years = DateTime.UtcNow.Year;
-                if (!string.IsNullOrEmpty($"{_years}")) 
+                if (!string.IsNullOrEmpty($"{_years}"))
                 {
                     years = _years.GetInt32();
                 }
 
-                List<SchoolLen> schoolLens = new List<SchoolLen>();
+                List<SchoolLen> schoolLens = new();
                 List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
                 foreach (string schoolId in schoolIds)
                 {
@@ -190,7 +191,7 @@ namespace TEAMModelBI.Controllers.Census
                         school = json.ToObject<School>();
                     }
 
-                    SchoolLen schoolLen = new SchoolLen() { id = schoolId, name = school != null ? school.name : schoolId };
+                    SchoolLen schoolLen = new() { id = schoolId, name = school != null ? school.name : schoolId };
 
                     List<List<double>> begin = new();
                     await foreach (var lcount in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<LessonCount>(queryText: "select value(c) from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{schoolId}-{years}") }))
@@ -225,9 +226,9 @@ namespace TEAMModelBI.Controllers.Census
         [HttpPost("get-termcount")]
         public async Task<IActionResult> GetTermCount(JsonElement jsonElement) 
         {
-            if(jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) BadRequest();
+            if (jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) BadRequest();
             var cosmosClient = _azureCosmos.GetCosmosClient();
-            List<SchoolLen> schoolLens = new List<SchoolLen>();
+            List<SchoolLen> schoolLens = new();
             List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
             foreach (var scid in schoolIds)
             {
@@ -239,7 +240,7 @@ namespace TEAMModelBI.Controllers.Census
                     school = json.ToObject<School>();
                 }
 
-                SchoolLen schoolLen = new SchoolLen() { id = scid, name = !string.IsNullOrEmpty(school.name) ? school.name : scid };
+                SchoolLen schoolLen = new() { id = scid, name = !string.IsNullOrEmpty(school.name) ? school.name : scid };
 
                 DateTimeOffset dateTime = DateTimeOffset.UtcNow;
                 int year = (dateTime.Month <= 8 && dateTime.Month >= 3) ? dateTime.Year : dateTime.Year - 1;
@@ -259,15 +260,13 @@ namespace TEAMModelBI.Controllers.Census
                 List<LessonCount> tcount = new();
                 DenseMatrix dense = null;
                 var queryClass = $"select value(c) from c ";
-                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonCount>(
-                            queryText: queryClass,
-                            requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{scid}-{syear}") }))
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonCount>(queryText: queryClass, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{scid}-{syear}") }))
                 {
                     scount.Add(item);
                 }
                 if (tyear > syear)
                 {
-                    await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonCount>(queryText: queryClass,  requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{scid}-{tyear}") }))
+                    await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonCount>(queryText: queryClass, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{scid}-{tyear}") }))
                     {
                         tcount.Add(item);
                     }
@@ -283,7 +282,7 @@ namespace TEAMModelBI.Controllers.Census
                 }
                 if (scount.Count > 0)
                 {
-                    List<List<double>> begin = new List<List<double>>();
+                    List<List<double>> begin = new();
                     foreach (LessonCount lesson in scount)
                     {
                         begin.Add(lesson.beginCount);
@@ -317,6 +316,168 @@ namespace TEAMModelBI.Controllers.Census
             return Ok(new { state = 200, schoolLens });
         }
 
+        /// <summary>
+        /// 统计区级课例
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("get-areacount")]
+        public async Task<IActionResult> GetAreaCount(JsonElement jsonElement) 
+        {
+            if (!jsonElement.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
+            List<string> schools = new();
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+
+            schools = await CommonFind.FindSchoolIds(cosmosClient, $"select c.id from c where c.areaId='{areaId}'", "Base");
+
+            //所有的课程记录
+            List<LessonRecord> records = new();
+            List<string> tecIds = new();
+
+            foreach (var school in schools)
+            {
+                string sqlTxt = $"select value(c) from c where c.code='LessonRecord-{school}'";
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonRecord>(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord-{school}") }))
+                {
+                    records.Add(item);
+                }
+            }
+
+            tecIds = await CommonFind.FindRolesId(cosmosClient, schools);
+            foreach (var tecId in tecIds)
+            {
+                string sqlTxt = $"select value(c) from c";
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<LessonRecord>(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord-{tecId}") }))
+                {
+                    records.Add(item);
+                }
+            }
+
+            int dayCount = 0;
+            var (dayStart, dayEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow);
+            records.ForEach(x => { if (x.startTime >= dayStart && x.startTime <= dayEnd) dayCount += 1; });
+
+            int weekCount = 0;
+            var (weekStart, weekEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "week");
+            records.ForEach(x => { if (x.startTime >= weekStart && x.startTime <= weekEnd) weekCount += 1; });
+
+            int monthCount = 0;
+            var (monthStart, monthEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "month");
+            records.ForEach(x => { if (x.startTime >= monthStart && x.startTime <= monthEnd) monthCount += 1; });
+
+            int termCount = 0;
+            var (termStart, termEnd) = TimeHelper.GetStartOrEnd(DateTimeOffset.UtcNow, "term");
+            records.ForEach(x => { if (x.startTime >= termStart && x.startTime <= termEnd) termCount += 1; });
+
+
+            double teachCount = records.Where(r => r.tmdid != null).Where((x, i) => records.FindIndex(z => z.tmdid == x.tmdid) == i).ToList().Count;
+
+            return Ok(new { state = 200, lessonCount = records.Count, teachCount, dayCount, weekCount, monthCount, termCount });
+        }
+
+        /// <summary>
+        /// 统计区级一年每周的课例数据趋势
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("get-weekcount")]
+        public async Task<IActionResult> GetWeekCount(JsonElement jsonElement) 
+        {
+            if (!jsonElement.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
+
+            Dictionary<int, double> weeks = new();
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+
+            int year = DateTimeOffset.UtcNow.Year;
+            int dayOfweek = (int)DateTimeOffset.Parse($"{year}-1-1").DayOfWeek;
+            var sqlTxts = "select value(c) from c";
+            List<LessonCount> scount = new();
+            List<LessonCount> tcount = new();
+
+            List<string> schools = await CommonFind.FindSchoolIds(cosmosClient, $"select c.id from c where c.areaId='{areaId}'", "Base");
+            foreach (var sId in schools)
+            {
+                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<LessonCount>(queryText:sqlTxts,requestOptions:new QueryRequestOptions() { PartitionKey =new PartitionKey($"LessonCount-{sId}-{year}")}))
+                {
+                    scount.Add(item);
+                }
+            }
+
+            List<string> teacIds = await CommonFind.FindRolesId(cosmosClient, schools);            
+            foreach (var tId in teacIds)
+            {
+                var sqlTxtt = $"select value(c) from c where c.id='{tId}'";
+                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<LessonCount>(queryText: sqlTxtt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{year}") }))
+                {
+                    tcount.Add(item);
+                }
+            }
+
+            int days = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 366 : days = 365;
+
+            List<List<double>> lessons = new();
+            if (scount.Count > 0)
+            {
+                foreach (LessonCount item in scount)
+                {
+                    lessons.Add(item.beginCount);
+                }
+            }
+            if (tcount.Count > 0)
+            {
+                foreach (LessonCount item in tcount)
+                {
+                    lessons.Add(item.beginCount);
+                }
+            }
+
+            if (lessons.Count > 0) 
+            { 
+                var bmatrix = DenseMatrix.OfColumns(lessons);
+
+                //开学第一周周内开课                   
+                if (dayOfweek == 0)
+                {
+                    dayOfweek = 7;
+                }
+                //第一周多少天
+                var dd = 7 - dayOfweek + 1;
+                //一年有几周
+                int sweeks = days / 7;
+                //查询天数
+                int dayYear = 0;
+                if (sweeks > 0)
+                {
+                    for (int i = 1; i <= sweeks; i++)
+                    {
+                        if (i == 1)
+                        {
+                            var bsum = bmatrix.SubMatrix(dayYear, dd, 0, bmatrix.ColumnCount).ColumnSums().Sum();
+                            dayYear += dd;
+                            weeks.Add(i, bsum);
+                        }
+                        else
+                        {
+                            var bsum = bmatrix.SubMatrix(dayYear, 7, 0, bmatrix.ColumnCount).ColumnSums().Sum();
+                            dayYear += 7;
+                            weeks.Add(i, bsum);
+                        }
+                    }
+                }
+                //最后一周是否有余
+                int stary = days - dayYear;
+                if (stary > 0 && stary < 7)
+                {
+                    var bsum = bmatrix.SubMatrix(dayYear, stary - 1, 0, bmatrix.ColumnCount).ColumnSums().Sum();
+                    weeks.Add((sweeks + 1), bsum);
+                }
+            }
+
+            return Ok(new { state = 200, weeks });
+        }
+
         /// <summary>
         /// 依据课例Id获取课例详情   数据管理工具——查询工具
         /// </summary>
@@ -327,7 +488,7 @@ namespace TEAMModelBI.Controllers.Census
         {
             if (!jsonElement.TryGetProperty("lessonId", out JsonElement lessonId)) return BadRequest();
             var cosmosClient = _azureCosmos.GetCosmosClient();
-            List<object> lessons = new List<object>();
+            List<object> lessons = new();
             string sqlTxt = $"select * from c where c.id='{lessonId}'";
             await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { })) 
             {
@@ -341,6 +502,11 @@ namespace TEAMModelBI.Controllers.Census
             return Ok(new { state = 200, lessons });
         }
 
+
+
+
+
+
         public record SchoolLen 
         {
             public string id { get; set; }
@@ -349,6 +515,5 @@ namespace TEAMModelBI.Controllers.Census
 
             public long totals { get; set; }
         }
-
     }
 }

+ 1 - 1
TEAMModelBI/Controllers/Census/SchoolController.cs

@@ -42,7 +42,7 @@ namespace TEAMModelBI.Controllers.Census
             var cosmosClient = _azureCosmos.GetCosmosClient();
             List<object> infos = new List<object>();
 
-            string sqlTxt = $"";
+            string sqlTxt = $"select value(c) from c where c.id='{id}'";
             await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);

+ 49 - 11
TEAMModelBI/Tool/CommonFind.cs

@@ -75,23 +75,30 @@ namespace TEAMModelBI.Tool
         public static async Task<List<SchoolTeacherRoles>> FindSchoolRoles(CosmosClient cosmosClient,string schoolId,string roles)
         {
             List<SchoolTeacherRoles> strs = new();
-            string managerSql = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId, c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, '{roles}', true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.code = 'Teacher-{schoolId}'";
-            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
+            try
             {
-                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                string managerSql = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId, c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, '{roles}', true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.code = 'Teacher-{schoolId}'";
+                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
                 {
-                    SchoolTeacherRoles str = new SchoolTeacherRoles
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
                     {
-                        tmdId = obj.GetProperty("id").GetString(),
-                        tmdName = obj.GetProperty("name").GetString()
-                    };
+                        SchoolTeacherRoles str = new()
+                        {
+                            tmdId = obj.GetProperty("id").GetString(),
+                            tmdName = obj.GetProperty("name").GetString()
+                        };
 
-                    strs.Add(str);
+                        strs.Add(str);
+                    }
                 }
+                return strs;
+            }
+            catch
+            {
+                return strs;
             }
 
-            return strs;
         }
 
         /// <summary>
@@ -169,11 +176,42 @@ namespace TEAMModelBI.Tool
                     school.hard = json.RootElement.GetProperty("hard").GetArrayLength();
                 }
 
-                school.assists = await CommonFind.FindSchoolRoles(cosmosClient, school.id, "assist");
+                school.assists = await FindSchoolRoles(cosmosClient, school.id, "assist");
             }
             
             return assistSchools;
         }
 
+
+        /// <summary>
+        /// 依据学校查询教师列表
+        /// </summary>
+        /// <param name="cosmosClient"></param>
+        /// <param name="schools"></param>
+        /// <returns></returns>
+        public static async Task<List<string>> FindRolesId(CosmosClient cosmosClient, List<string> schools, string roles = null)
+        {
+            string rolesName = "teacher";
+            if (roles != null) 
+            {
+                rolesName = roles;
+            }
+
+            List<string> teachers = new();
+            foreach (var school in schools) 
+            {
+                string sqlTxt = $"select c.id from c where ARRAY_CONTAINS(c.roles,'{rolesName}',true) and c.status = 'join'";
+                await foreach (var itemTeac in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() {PartitionKey =new PartitionKey($"Teacher-{school}") }))
+                {
+                    using var json = await JsonDocument.ParseAsync(itemTeac.ContentStream);
+                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                    {
+                        teachers.Add(obj.GetProperty("id").GetString());
+                    }
+                }
+            }
+            return teachers;
+        }
+
     }
 }

+ 72 - 0
TEAMModelBI/Tool/TimeHelper.cs

@@ -173,5 +173,77 @@ namespace TEAMModelBI.Tool
         }
 
 
+        /// <summary>
+        /// 开始时间和结束时间戳
+        /// </summary>
+        /// <param name="dateTime"></param>
+        /// <param name="type"></param>
+        /// <param name="dateLenth"></param>
+        /// <returns></returns>
+        public static (long start, long end) GetStartOrEnd(DateTimeOffset dateTime, string type = "", bool dateLenth = true)
+        {
+            long start = 0;
+            long end = 0;
+            DateTimeOffset tempStrart = new();
+            DateTimeOffset tempEnt = new();
+            switch (type) 
+            {
+                case "year":
+                    tempStrart = new DateTime(dateTime.Year,1, 1);
+                    tempEnt = new DateTime(dateTime.Year, 12, DateTime.DaysInMonth(dateTime.Year, 12), 23, 59, 59);
+                    break;
+
+                case "term":
+                    int year = dateTime.Year;
+                    int month = dateTime.Month;
+                    if (month <= 8 && month >= 3)
+                    {
+                        tempStrart = new DateTime(year, 3, 1);
+                        tempEnt = new DateTime(year, 8, 31, 23, 59, 59);
+                    }
+                    else
+                    {
+                        //计算当前月份
+                        int days = 0;
+                        if (month >= 9)
+                        {
+                            tempStrart = new DateTime(dateTime.Year, 9, 1);
+                            tempEnt = new DateTime(dateTime.Year + 1, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59);                        }
+                        else
+                        {
+                            tempStrart = new DateTime(dateTime.Year - 1, 9, 1);
+                            tempEnt = new DateTime(dateTime.Year, 2, (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 29 : days = 28, 23, 59, 59);
+                        }
+                    }
+
+                    break;
+                case "month":
+                    tempStrart = new DateTime(dateTime.Year, dateTime.Month, 1);
+                    tempEnt = new DateTime(dateTime.Year, dateTime.Month, DateTime.DaysInMonth(dateTime.Year, dateTime.Month), 23, 59, 59);
+                    break;
+                case "week":
+                    DateTimeOffset weekStrart = dateTime.AddDays(-(int)(dateTime.DayOfWeek) + 1);
+                    DateTimeOffset weekEnd  = dateTime.AddDays(7-(int)(dateTime.DayOfWeek));
+                    tempStrart = new DateTime(weekStrart.Year, weekStrart.Month, weekStrart.Day);
+                    tempEnt = new DateTime(weekEnd.Year, weekEnd.Month, weekEnd.Day, 23, 59, 59); 
+
+
+                    break;
+                default:
+                    tempStrart = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day);
+                    tempEnt = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59);
+                    //start = dateLenth ? DateTimeOffset.Parse($"{dayStart}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{dayStart}").ToUnixTimeSeconds();
+                    //end = dateLenth ? DateTimeOffset.Parse($"{dayEnd}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{dayEnd}").ToUnixTimeSeconds();
+                    break;            
+            }
+
+            start = dateLenth ? DateTimeOffset.Parse($"{tempStrart}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{tempStrart}").ToUnixTimeSeconds();
+            end = dateLenth ? DateTimeOffset.Parse($"{tempEnt}").ToUnixTimeMilliseconds() : DateTimeOffset.Parse($"{tempEnt}").ToUnixTimeSeconds();
+
+            return (start, end);
+
+        }
+
+
     }
 }