Browse Source

新数据区级统计接口和相关辅助方法

Li 2 năm trước cách đây
mục cha
commit
d6c1cc5ebd

+ 6 - 6
TEAMModelBI/Controllers/BIHome/HomeStatisController.cs

@@ -116,7 +116,7 @@ namespace TEAMModelBI.Controllers.BIHome
                     var tempCode = provinceStics.Find(x => x.provCode == itemStandard.provCode);
                     if (tempCode != null)
                     {
-                        string sqlSc = $"select c.id from c where c.standard='{itemStandard.standard}'";
+                        string sqlSc = $"select value(c.id) from c where c.standard='{itemStandard.standard}'";
                         List<string> schoolIds = await CommonFind.FindScIds(cosmosClient, sqlSc, "Base");
                         tempCode.schoolCount += schoolIds.Count;
 
@@ -149,7 +149,7 @@ namespace TEAMModelBI.Controllers.BIHome
                         tempProvinceStics.provName = itemStandard.provName;
                         tempProvinceStics.standardCount += 1;
 
-                        string sqlSc = $"select c.id from c where c.standard='{itemStandard.standard}'";
+                        string sqlSc = $"select value(c.id) from c where c.standard='{itemStandard.standard}'";
                         List<string> schoolIds = await CommonFind.FindScIds(cosmosClient, sqlSc, "Base");
                         tempProvinceStics.schoolCount += schoolIds.Count;
                         
@@ -292,7 +292,7 @@ namespace TEAMModelBI.Controllers.BIHome
                     };
 
                     //string sqlTxt = $"select c.id from c where c.standard='{itemStandrd.standard}'";
-                    string sqlTxt = $"select c.id from c where c.areaId='{itemStandrd.id}' and c.standard='{itemStandrd.standard}'";
+                    string sqlTxt = $"select value(c.id) from c where c.areaId='{itemStandrd.id}' and c.standard='{itemStandrd.standard}'";
                     List<string> schoolIds = await CommonFind.FindScIds(cosmosClient,sqlTxt, "Base");
                     districtStics.schoolCount += schoolIds.Count;
 
@@ -361,7 +361,7 @@ namespace TEAMModelBI.Controllers.BIHome
                     if (tempCode != null)
                     {
                         //List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"select c.id from c where c.standard='{itemStandrd.standard}'", "Base");
-                        List<string> schoolIds = await CommonFind.FindScIds(cosmosClient, $"select c.id from c where c.areaId='{itemStandrd.id}' and c.standard='{itemStandrd.standard}'", "Base");
+                        List<string> schoolIds = await CommonFind.FindScIds(cosmosClient, $"select value(c.id) from c where c.areaId='{itemStandrd.id}' and c.standard='{itemStandrd.standard}'", "Base");
                         tempCode.schoolCount += schoolIds.Count;
 
                         var tempModel = sticsCitys.Where(x => x.cityCode == tempCode.cityCode).FirstOrDefault();
@@ -400,7 +400,7 @@ namespace TEAMModelBI.Controllers.BIHome
                         citySchool.cityCode = itemStandrd.cityCode;
                         citySchool.cityName = itemStandrd.cityName;
 
-                        List<string> schoolIds = await CommonFind.FindScIds(cosmosClient, $"select c.id from c where c.standard='{itemStandrd.standard}'","Base");
+                        List<string> schoolIds = await CommonFind.FindScIds(cosmosClient, $"select value(c.id) from c where c.standard='{itemStandrd.standard}'","Base");
                         citySchool.schoolCount += schoolIds.Count;
 
                         List<DistrictStics> tempDistrictStics = new();
@@ -468,7 +468,7 @@ namespace TEAMModelBI.Controllers.BIHome
 
                 //查询学校空间和学校Id
                 totalSize = await CommonFind.GetSqlValueCount(cosmosClient, "School", "select value(sum(c.size)) from c", "Base");
-                schoolId = await CommonFind.FindScIds(cosmosClient, "select c.id,c.size from c", "Base");
+                schoolId = await CommonFind.FindScIds(cosmosClient, "select value(c.id) from c", "Base");
 
                 //查询学校已使用空间大小
                 foreach (var itemId in schoolId)

+ 1 - 1
TEAMModelBI/Controllers/BINormal/BatchAreaController.cs

@@ -956,7 +956,7 @@ namespace TEAMModelBI.Controllers.BINormal
                         await cosmosClient.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Teacher>(item, item.id, new PartitionKey("Base"));
                     }
 
-                    List<string> scIds = await CommonFind.FindScIds(cosmosClient, $"select c.id from c where c.areaId='{area.id}' and c.standard ='{area.standard}'", "Base");
+                    List<string> scIds = await CommonFind.FindScIds(cosmosClient, $"select value(c.id) from c where c.areaId='{area.id}' and c.standard ='{area.standard}'", "Base");
 
                     foreach (var item in scIds)
                     {

+ 22 - 3
TEAMModelBI/Controllers/BISchool/SchoolController.cs

@@ -1622,12 +1622,12 @@ namespace TEAMModelBI.Controllers.BISchool
 
             //if ((string.IsNullOrEmpty($"{tmdId}") && string.IsNullOrEmpty($"{schooId}")) || (!string.IsNullOrEmpty($"{tmdId}") && !string.IsNullOrEmpty($"{schooId}")))
                 
-            List<MonthStartEnd> mthStartEnds = await TimeHelper.GetYearSataMthCtMth(DateTimeOffset.UtcNow);
+            List<StartEndTime> mthStartEnds = await TimeHelper.GetYearSataMthCtMth(DateTimeOffset.UtcNow);
             if (mthStartEnds.Count > 0)
             {
                 foreach (var item in mthStartEnds)
                 {
-                    YearCnt yearCnt = new() { name = item.yearMonth };
+                    YearCnt yearCnt = new() { name = item.date };
                     string selessSql = $"{strSql} and {scSql.ToString()} and c.startTime >= {item.start} and c.startTime <= {item.end}";
                     yearCnt.lessCnt = await CommonFind.GetSqlValueCount(cosmosClient, "School", selessSql);
 
@@ -1818,6 +1818,25 @@ namespace TEAMModelBI.Controllers.BISchool
             return Ok(new { state = RespondCode.Ok, school, gradeCnt, subCnt });
         }
 
+        /// <summary>
+        /// 学校简要信息
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("get-schools")]
+        public async Task<IActionResult> GetSchools (JsonElement jsonElement)
+        {
+            List<ScBriefInfo> scBriefs = new();
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS,"School").GetItemQueryIterator<ScBriefInfo>(queryText:"select value(c) from c" ,requestOptions:new QueryRequestOptions() { PartitionKey = new PartitionKey("Base")}))
+            {
+                scBriefs.Add(item);
+            }
+
+            return Ok(new { state = RespondCode.Ok, scBriefs });
+        }
+
         /// <summary>
         /// 通过tmdID 账户查询学校专业和模组   //已对接
         /// </summary>
@@ -1991,7 +2010,7 @@ namespace TEAMModelBI.Controllers.BISchool
             if (!string.IsNullOrEmpty($"{areaId}"))
             {
                 List<string> schools = new();
-                schools = await CommonFind.FindScIds(cosmosClient, $"select c.id from c where c.areaId='{areaId}'", "Base");
+                schools = await CommonFind.FindScIds(cosmosClient, $"select value(c.id) from c where c.areaId='{areaId}'", "Base");
 
                 allSize = await CommonFind.GetSqlValueCount(cosmosClient, "School", $"select value(sum(c.size)) from c where c.areaId='{areaId}'", "Base"); //区域所有学校空间
 

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

@@ -680,6 +680,10 @@ namespace TEAMModelBI.Controllers.BITest
         [HttpPost("get-date")]
         public async Task<IActionResult> GetDate()
         {
+            ////计算一年每天的开始/结束时间
+            //List<StartEndTime> everyDay = TimeHelper.GetYearEveryDay(DateTimeOffset.UtcNow, isCurrDay: true);
+            //return Ok(new { state = RespondCode.Ok, dayCnt = everyDay.Count, everyDay });
+
             List<string> day7 = TimeHelper.GetNearDay(DateTimeOffset.UtcNow, 7);
             List<string> day30 = TimeHelper.GetNearDay(DateTimeOffset.UtcNow, 30);
 
@@ -714,7 +718,7 @@ namespace TEAMModelBI.Controllers.BITest
             var start = GetMonthStart(ere);
             var end = GetMonthEnd(ere);
 
-            List<MonthStartEnd> endList1 = TimeHelper.GetYearMonthlyStartEnd(DateTimeOffset.UtcNow.Year);
+            List<StartEndTime> endList1 = TimeHelper.GetYearMonthlyStartEnd(DateTimeOffset.UtcNow.Year);
             //return Ok(new { strList, dateTime, year, start, end, endList, endList1, endList2 });
 
 
@@ -1346,7 +1350,6 @@ namespace TEAMModelBI.Controllers.BITest
             //        }
             //    }
             //}
-
             var (an, saveUrl) = await BILogAnalyseService.GetPathAnalyse(_azureStorage, _ipSearcher, _dingDing, $"{path}", BIConst.LogChina, timeType: $"{jTimeType}");
 
             return Ok(new { state = RespondCode.Ok, cnt = filename.Count, filename, an, saveUrl });

+ 4 - 2
TEAMModelBI/Controllers/Census/ActivitySticsController.cs

@@ -239,7 +239,7 @@ namespace TEAMModelBI.Controllers.Census
                 monthLess = await CommonFind.GetSqlValueCount(cosmosClient, "School", $"{oftenSql} where c.pk='LessonRecord' and {comSql} and c.startTime >= {monthS} and c.startTime <= {monthE}");
 
                 //学时
-                totalTime = await CommonFind.GetSqlValueCount(cosmosClient, "Teacher", $"select value(sum(c.totalTime)) from c where c.pk='TeacherTrain' and {comSql}");
+                //totalTime = await CommonFind.GetSqlValueCount(cosmosClient, "Teacher", $"select value(sum(c.totalTime)) from c where c.pk='TeacherTrain' and {comSql}");
 
                 //活动
                 string actSpl = BICommonWay.ManyScSql(" and c.school", scIds);
@@ -260,7 +260,7 @@ namespace TEAMModelBI.Controllers.Census
                 //string stSql = $"{oftenSql} join s in c.currency where c.TeacherTrain and {comSql} and s.submitTime = 0 or s.submitTime >= {setting.submitTime}";
                 //submitCount = await CommonFind.GetSqlValueCount(cosmosClient, "Teacher", ctSql);
 
-                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id,c.code,c.onlineTime,c.offlineTime,c.classTime,c.currency from c where c.pk='TeacherTrain' and {comSql}", requestOptions: new QueryRequestOptions() { })) 
+                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id,c.code,c.totalTime,c.onlineTime,c.offlineTime,c.classTime,c.currency from c where c.pk='TeacherTrain' and {comSql}", requestOptions: new QueryRequestOptions() { })) 
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -272,6 +272,8 @@ namespace TEAMModelBI.Controllers.Census
                     }
                 }
 
+                //学时
+                totalTime = trains.Select(s => s.totalTime).Sum();
                 trains.ForEach(x =>
                 {
                     //线上研修

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

@@ -62,7 +62,7 @@ namespace TEAMModelBI.Controllers.Census
             List<string> schoolIds = new();
             if (!string.IsNullOrEmpty($"{areaId}"))
             {
-                string sqlTxt = $"select c.id from c where c.areaId='{areaId}'";
+                string sqlTxt = $"select value(c.id) from c where c.areaId='{areaId}'";
                 sqlSize.Append($" where c.areaId = '{areaId}'");
                 schoolIds = await CommonFind.FindScIds(cosmosClient, sqlTxt.ToString(), "Base");
                 foreach (var item in StaticValue.fileType)

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

@@ -558,7 +558,7 @@ namespace TEAMModelBI.Controllers.Census
             //if ($"{site}".Equals(BIConst.Global))
             //    cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
 
-            StringBuilder scSqlTxt = new("select c.id from c");
+            StringBuilder scSqlTxt = new("select value(c.id) from c");
             if (!string.IsNullOrEmpty($"{areaId}"))
             {
                 scSqlTxt.Append($" where c.areaId='{areaId}'");

+ 3 - 3
TEAMModelBI/Controllers/Census/PaperController.cs

@@ -362,7 +362,7 @@ namespace TEAMModelBI.Controllers.Census
             ////分开部署,就不需要,一站多用时,取消注释
             //if ($"{site}".Equals(BIConst.Global))
             //    cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
-            List<MonthStartEnd> endList1 = TimeHelper.GetYearMonthlyStartEnd(DateTimeOffset.UtcNow.Year);
+            List<StartEndTime> endList1 = TimeHelper.GetYearMonthlyStartEnd(DateTimeOffset.UtcNow.Year);
             if (string.IsNullOrEmpty($"{tmdId}"))
             {
                 Dictionary<string, long> schoolYears = new Dictionary<string, long>();
@@ -371,7 +371,7 @@ namespace TEAMModelBI.Controllers.Census
                     string sqlText = $"SELECT value(COUNT(c.id)) FROM c WHERE c.createTime >= {temp.start} and c.createTime <= {temp.end} and c.pk='Paper'";
 
                     long total = await CommonFind.GetSqlValueCount(cosmosClient, new List<string>() { "School", "Teacher" }, sqlText);
-                    schoolYears.Add(temp.yearMonth, total);
+                    schoolYears.Add(temp.date, total);
                 }
 
                 return Ok(new { state = 200, schoolYears });
@@ -399,7 +399,7 @@ namespace TEAMModelBI.Controllers.Census
                     {                        
                         string sqlTxt = $"SELECT value(COUNT(c.id)) FROM c WHERE c.code='Paper-{schoolId}' and c.createTime >= {temp.start} and c.createTime <= {temp.end} and c.pk='Paper'";
                         long totals = await CommonFind.GetSqlValueCount(cosmosClient, new List<string>() { "School", "Teacher" }, sqlTxt);
-                        yearCount.Add(temp.yearMonth, totals);
+                        yearCount.Add(temp.date, totals);
                     }
                     schoolYear.yearPaper = yearCount;
                     schoolYears.Add(schoolYear);

+ 97 - 0
TEAMModelBI/Controllers/RepairApi/NormalController.cs

@@ -0,0 +1,97 @@
+using Azure.Cosmos;
+using DinkToPdf;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Options;
+using System.Net.Http;
+using System.Text.Json;
+using System.Threading.Tasks;
+using TEAMModelOS.Models;
+using TEAMModelOS.SDK;
+using TEAMModelOS.SDK.Context.Constant;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.DI.CoreAPI;
+using TEAMModelOS.SDK.Models;
+
+namespace TEAMModelBI.Controllers.RepairApi
+{
+    [Route("normal")]
+    [ApiController]
+    public class NormalController : ControllerBase
+    {
+
+        private readonly AzureCosmosFactory _azureCosmos;
+        private readonly DingDing _dingDing;
+        private readonly Option _option;
+        private readonly AzureStorageFactory _azureStorage;
+        private readonly IConfiguration _configuration;
+        private readonly NotificationService _notificationService;
+        private readonly AzureServiceBusFactory _serviceBus;
+        private readonly IHttpClientFactory _http;
+        private readonly CoreAPIHttpService _coreAPIHttpService;
+        private readonly IWebHostEnvironment _environment; //读取文件
+
+        public NormalController(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, IOptionsSnapshot<Option> option, IConfiguration configuration, NotificationService notificationService, AzureServiceBusFactory serviceBus, IHttpClientFactory http, CoreAPIHttpService coreAPIHttpService, IWebHostEnvironment hostingEnvironment)
+        {
+            _azureCosmos = azureCosmos;
+            _dingDing = dingDing;
+            _azureStorage = azureStorage;
+            _option = option?.Value;
+            _configuration = configuration;
+            _notificationService = notificationService;
+            _serviceBus = serviceBus;
+            _http = http;
+            _coreAPIHttpService = coreAPIHttpService;
+            _environment = hostingEnvironment;
+        }
+
+        /// <summary>
+        /// 修改学区名称、标准名称、单位
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("set-areabase")]
+        public async Task<IActionResult> SetAreaBase(JsonElement jsonElement) 
+        {
+            if (!jsonElement.TryGetProperty("oldName", out JsonElement oldName)) return BadRequest();
+            if (!jsonElement.TryGetProperty("name", out JsonElement name)) return BadRequest();
+            if(!jsonElement.TryGetProperty("type", out JsonElement type)) return BadRequest();
+
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+            string sql = $"select value(c) from c where c.name = '{oldName}'";
+
+            Area area = new();
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<Area>(queryText: sql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base-Area") }))
+            {
+                area = item;
+            };
+
+            if (!string.IsNullOrEmpty(area.id)) 
+            {
+                area.name = $"{name}";
+                switch ($"{type}")
+                {
+                    case "all":
+                        area.institution = $"{name}";
+                        area.standardName = $"{name}";
+                        break;
+                    case "unit":
+                        area.institution = $"{name}";
+                        break;
+                    case "standard":
+                        area.standardName = $"{name}";
+                        break;
+                }
+
+                area = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").ReplaceItemAsync<Area>(area, area.id, new PartitionKey("Base-Area"));
+            }
+            return Ok(new { state = RespondCode.Ok, area });
+        }
+
+
+
+    }
+}

+ 12 - 1
TEAMModelBI/Models/ForeEndModel.cs

@@ -1,4 +1,7 @@
-namespace TEAMModelBI.Models
+using System.Collections.Generic;
+using TEAMModelOS.SDK.Models;
+
+namespace TEAMModelBI.Models
 {
     public class ForeEndModel
     {
@@ -19,4 +22,12 @@
         public string schoolIds { get; set; }
     }
 
+    public record ScBriefInfo
+    {
+        public string id { get; set; }
+        public string name { get; set; }
+        public string picture { get; set; }
+        public int size { get; set; }
+        public List<Period> period { get; set; }
+    }
 }

+ 11 - 7
TEAMModelBI/Tool/CommonFind.cs

@@ -134,16 +134,20 @@ namespace TEAMModelBI.Tool
         public static async Task<List<string>> FindScIds(CosmosClient cosmosClient, string sqlTxt, string code)
         {
             List<string> schoolIds = new();
-
-            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(code) }))
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<string>(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(code) }))
             {
-                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                {
-                    schoolIds.Add(obj.GetProperty("id").GetString());
-                }
+                schoolIds.Add(item);
             }
 
+            //await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(code) }))
+            //{
+            //    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+            //    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+            //    {
+            //        schoolIds.Add(obj.GetProperty("id").GetString());
+            //    }
+            //}
+
             return schoolIds;
         }
 

+ 10 - 10
TEAMModelBI/Tool/TimeHelper1.cs

@@ -90,16 +90,16 @@ namespace TEAMModelBI.Tool
         /// <param name="date"></param>
         /// <param name="dateLenth"></param>
         /// <returns></returns>
-        public static async Task<List<MonthStartEnd>> GetYearSataMthCtMth(DateTimeOffset date,bool dateLenth = true) 
+        public static async Task<List<StartEndTime>> GetYearSataMthCtMth(DateTimeOffset date,bool dateLenth = true) 
         {
             int year = date.Year;
             int mth = date.Month;
             int day = date.Day;
 
-            List<MonthStartEnd> monthStartEnds = new();
+            List<StartEndTime> monthStartEnds = new();
             for (int i = 1; i <= mth; i++)
             {
-                MonthStartEnd monthStartEnd = new() { yearMonth = $"{year}-{i}" };
+                StartEndTime monthStartEnd = new() { date = $"{year}-{i}" };
                 //DateTime dt = DateTime.Parse($"{year}-{i}");
                 DateTimeOffset dtNew = new(year, i, 1, 0, 0, 0, TimeSpan.Zero);
                 long start = dtNew.ToUnixTimeMilliseconds();
@@ -133,12 +133,12 @@ namespace TEAMModelBI.Tool
         /// <param name="year">年份</param>
         /// <param name="dateLenth">true :13位时间戳  false:10位时间戳</param>
         /// <returns></returns>
-        public static List<MonthStartEnd> GetYearMonthlyStartEnd(int year, bool dateLenth = true)
+        public static List<StartEndTime> GetYearMonthlyStartEnd(int year, bool dateLenth = true)
         {
-            List<MonthStartEnd> monthStartEnds = new();
+            List<StartEndTime> monthStartEnds = new();
             for (int i = 1; i <= 12; i++)
             {
-                MonthStartEnd monthStartEnd = new MonthStartEnd() { yearMonth = $"{year}-{i}" };
+                StartEndTime monthStartEnd = new StartEndTime() { date = $"{year}-{i}" };
                 //DateTime dt = DateTime.Parse($"{year}-{i}");
                 DateTimeOffset dtNew = new(year, i, 1, 0, 0, 0, TimeSpan.Zero);
                 long start = dtNew.ToUnixTimeMilliseconds();
@@ -162,17 +162,17 @@ namespace TEAMModelBI.Tool
         /// <param name="yearMonth">日期</param>
         /// <param name="dateLenth">true :13位时间戳  false:10位时间戳</param>
         /// <returns></returns>
-        public static List<MonthStartEnd> monthsOfYear(string yearMonth, bool dateLenth = true)
+        public static List<StartEndTime> monthsOfYear(string yearMonth, bool dateLenth = true)
         {
-            List<MonthStartEnd> monthStartEnds = new();
+            List<StartEndTime> monthStartEnds = new();
             DateTime dateTime = DateTime.Parse(yearMonth);
 
             int year = dateTime.Year;
             int month = dateTime.Month;
-            List<string> months = new List<string>();
+            List<string> months = new();
             while (year > dateTime.Year - 1 || month > dateTime.Month)
             {
-                MonthStartEnd monthStartEnd = new MonthStartEnd() { yearMonth = $"{year}-{month}" };
+                StartEndTime monthStartEnd = new() { date = $"{year}-{month}" };
 
                 DateTimeOffset dtNew = new(year, month, 1, 0, 0, 0, TimeSpan.Zero);
                 long start = dateLenth ? dtNew.ToUnixTimeMilliseconds() : dtNew.ToUnixTimeSeconds();

+ 15 - 5
TEAMModelOS.FunctionV4/HttpTrigger/BIHttpTrigger.cs

@@ -1,11 +1,14 @@
 using System;
 using System.Collections.Generic;
+using System.Dynamic;
 using System.IO;
 using System.Net;
 using System.Net.Http;
 using System.Text.Json;
 using System.Threading.Tasks;
 using Azure.Cosmos;
+using Azure.Storage.Blobs;
+using Microsoft.AspNetCore.Http;
 using Microsoft.Azure.Functions.Worker;
 using Microsoft.Azure.Functions.Worker.Http;
 using StackExchange.Redis;
@@ -43,12 +46,16 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
         {
             var response = req.CreateResponse(HttpStatusCode.OK);
 
+            dynamic jsondata = new ExpandoObject();
             try
             {
                 string scId = null;
                 var cosmosClient = _azureCosmos.GetCosmosClient();
+                var tableClient = _azureStorage.GetCloudTableClient();
+                var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public");
                 string data = await new StreamReader(req.Body).ReadToEndAsync();
                 var json = JsonDocument.Parse(data).RootElement;
+                jsondata = json;
                 if (json.TryGetProperty("schoolId", out JsonElement _schoolId))
                 {
                     scId = $"{_schoolId}";
@@ -76,21 +83,24 @@ namespace TEAMModelOS.FunctionV4.HttpTrigger
                     else                    
                         isExist = false;
 
-                    statsInfo = await SchoolStatsWay.upSingleSc(cosmosClient, scId);
+                    statsInfo = await SchoolStatsWay.GetSingleSc(cosmosClient, scId);
                     statsInfo.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+
                     if (isExist)
                         statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, statsInfo.id, new PartitionKey("Stats"));
                     else
                         statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Stats"));
                 }
 
-                return response;
+                //保存操作记录
+                await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, "trigger-schoolStats", $"触发更新统计数据库", _dingDing);
             }
-            catch (Exception)
+            catch (Exception ex)
             {
-
-                throw;
+                await _dingDing.SendBotMsg($"stats-sc-info,{ex.Message}\n{ex.StackTrace}\n{jsondata.ToJsonString()}", GroupNames.成都开发測試群組);
             }
+
+            return response;
         }
     }
 }

+ 2 - 2
TEAMModelOS.SDK/Models/Cosmos/BI/BICommon/MonthStartEnd.cs

@@ -6,9 +6,9 @@ using System.Threading.Tasks;
 
 namespace TEAMModelOS.SDK.Models
 {
-    public class MonthStartEnd
+    public class StartEndTime
     {
-        public string yearMonth { get; set; }
+        public string date { get; set; }
 
         public long start { get; set; }
 

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/BI/CurrencyModel.cs

@@ -42,6 +42,8 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
 
         public string code { get; set; }
 
+        public int totalTime { get; set; }
+
         /// <summary>
         /// 线上观看视频的学时
         /// </summary>

+ 12 - 12
TEAMModelOS.SDK/Models/Cosmos/BI/StatsInfo.cs

@@ -28,6 +28,11 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// </summary>
         public string name { get; set; }
 
+        /// <summary>
+        /// 空间
+        /// </summary>
+        public int size { get; set; }
+
         /// <summary>
         /// 教师总数
         /// </summary>
@@ -78,11 +83,6 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// </summary>
         public int witRoom { get; set; }
 
-        /// <summary>
-        /// 空间
-        /// </summary>
-        public int size { get; set; }
-
         /// <summary>
         /// 学校创建时间
         /// </summary>
@@ -96,17 +96,17 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// <summary>
         /// 课例活动
         /// </summary>
-        public LessonStats lesson { get; set; }
+        public LessonStats lesson { get; set; } = new LessonStats();
 
         /// <summary>
         /// 活动
         /// </summary>
-        public ActivityStats activity { get; set; }
+        public ActivityStats activity { get; set; } = new ActivityStats();
 
         /// <summary>
         /// 研修统计
         /// </summary>
-        public StudyStats study { get; set; }
+        public StudyStats study { get; set; } = new StudyStats();
     }
 
     /// <summary>
@@ -268,19 +268,19 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// <summary>
         /// 线上研修人数
         /// </summary>
-        public int onlineTime { get; set; }
+        public int online { get; set; }
         /// <summary>
         /// 线下研修人数
         /// </summary>
-        public int offlineTime { get; set; }
+        public int offline { get; set; }
         /// <summary>
         /// 课堂实录人数
         /// </summary>
-        public int classTime { get; set; }
+        public int classRoom { get; set; }
         /// <summary>
         /// 认证材料人数
         /// </summary>
-        public int currency { get; set; }
+        public int submit { get; set; }
         /// <summary>
         /// 未开始的研修人数
         /// </summary>

+ 79 - 31
TEAMModelOS.SDK/Models/Service/BI/TimeHelper.cs

@@ -1,4 +1,6 @@
-using System;
+using DocumentFormat.OpenXml.Bibliography;
+using Microsoft.Azure.Amqp.Framing;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -88,16 +90,16 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         /// <param name="date"></param>
         /// <param name="dateLenth"></param>
         /// <returns></returns>
-        public static async Task<List<MonthStartEnd>> GetYearSataMthCtMth(DateTimeOffset date, bool dateLenth = true)
+        public static async Task<List<StartEndTime>> GetYearSataMthCtMth(DateTimeOffset date, bool dateLenth = true)
         {
             int year = date.Year;
             int mth = date.Month;
             int day = date.Day;
 
-            List<MonthStartEnd> monthStartEnds = new();
+            List<StartEndTime> monthStartEnds = new();
             for (int i = 1; i <= mth; i++)
             {
-                MonthStartEnd monthStartEnd = new() { yearMonth = $"{year}-{i}" };
+                StartEndTime monthStartEnd = new() { date = $"{year}-{i}" };
                 //DateTime dt = DateTime.Parse($"{year}-{i}");
                 DateTimeOffset dtNew = new(year, i, 1, 0, 0, 0, TimeSpan.Zero);
                 long start = dtNew.ToUnixTimeMilliseconds();
@@ -131,12 +133,12 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         /// <param name="year">年份</param>
         /// <param name="dateLenth">true :13位时间戳  false:10位时间戳</param>
         /// <returns></returns>
-        public static List<MonthStartEnd> GetYearMonthlyStartEnd(int year, bool dateLenth = true)
+        public static List<StartEndTime> GetYearMonthlyStartEnd(int year, bool dateLenth = true)
         {
-            List<MonthStartEnd> monthStartEnds = new();
+            List<StartEndTime> monthStartEnds = new();
             for (int i = 1; i <= 12; i++)
             {
-                MonthStartEnd monthStartEnd = new() { yearMonth = $"{year}-{i}" };
+                StartEndTime monthStartEnd = new() { date = $"{year}-{i}" };
                 //DateTime dt = DateTime.Parse($"{year}-{i}");
                 DateTimeOffset dtNew = new(year, i, 1, 0, 0, 0, TimeSpan.Zero);
                 long start = dtNew.ToUnixTimeMilliseconds();
@@ -160,9 +162,9 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         /// <param name="yearMonth">日期</param>
         /// <param name="dateLenth">true :13位时间戳  false:10位时间戳</param>
         /// <returns></returns>
-        public static List<MonthStartEnd> monthsOfYear(string yearMonth, bool dateLenth = true)
+        public static List<StartEndTime> monthsOfYear(string yearMonth, bool dateLenth = true)
         {
-            List<MonthStartEnd> monthStartEnds = new();
+            List<StartEndTime> monthStartEnds = new();
             DateTime dateTime = DateTime.Parse(yearMonth);
 
             int year = dateTime.Year;
@@ -170,7 +172,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             List<string> months = new();
             while (year > dateTime.Year - 1 || month > dateTime.Month)
             {
-                MonthStartEnd monthStartEnd = new() { yearMonth = $"{year}-{month}" };
+                StartEndTime monthStartEnd = new() { date = $"{year}-{month}" };
 
                 DateTimeOffset dtNew = new(year, month, 1, 0, 0, 0, TimeSpan.Zero);
                 long start = dateLenth ? dtNew.ToUnixTimeMilliseconds() : dtNew.ToUnixTimeSeconds();
@@ -387,6 +389,44 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             }
         }
 
+        /// <summary>
+        /// 计算每年获取开始时间
+        /// </summary>
+        /// <param name="dateTime"></param>
+        /// <param name="dateLenth"></param>
+        /// <returns></returns>
+        public static List<StartEndTime> GetYearEveryDay(DateTimeOffset dateTime, bool dateLenth = true,bool isCurrDay = false) 
+        {
+            List<StartEndTime> dayStartEen = new();
+            int year = dateTime.Year;
+            int curry = dateTime.DayOfYear;
+            List<int> isLeapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? isLeapYear = leapY : isLeapYear = flatY;
+            for (int m = 1; m <= 12; m++)
+            {
+                for (int d = 1; d <= isLeapYear[m - 1]; d++)
+                {
+                    if (isCurrDay == true && (curry <= dayStartEen.Count))
+                        break;
+                    DateTimeOffset tempStrart = new(year, m, d, 0, 0, 0, TimeSpan.Zero);
+                    DateTimeOffset tempEnd = new(year, m, d, 23, 59, 59, TimeSpan.Zero);
+
+                    long longStart = dateLenth ? tempStrart.ToUnixTimeMilliseconds() : tempStrart.ToUnixTimeSeconds();
+                    long longEnd = dateLenth ? tempEnd.ToUnixTimeMilliseconds() : tempEnd.ToUnixTimeSeconds();
+
+                    dayStartEen.Add(new StartEndTime() { date = $"{year}-{m}-{d}", start = longStart, end = longEnd });
+                }
+
+                ////DateTime 有方法
+                //DateTime monthStart = new DateTime(year, i, 01);
+                //DateTime monthEnd = dateTime.AddMonths(1);
+
+                //DateTimeOffset tempStrart = new DateTimeOffset(year, i, days, 0, 0, 0, TimeSpan.Zero);
+                //DateTimeOffset tempEnd = new DateTimeOffset(year, i, days, 23, 59, 59, TimeSpan.Zero);
+            }
+
+            return dayStartEen;
+        }
+
         /// <summary>
         /// 将时间戳格式 转换成string类型
         /// 例:yyyyMMdd,等string类型
@@ -422,32 +462,40 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             return days;
         }
 
-
+        /// <summary>
+        /// 12个月
+        /// </summary>
+        /// <param name="doubles"></param>
+        /// <param name="year"></param>
+        /// <param name="month"></param>
+        /// <returns></returns>
         public static List<YearMonth> GetYearMonth(List<double> doubles, int year = 0, int month = 0)
         {
             List<YearMonth> months = new();
-            DateTimeOffset dateTime = DateTimeOffset.Now;
-            if (year == 0)
-                year = dateTime.Year;
-            if (month == 0)
-                month = dateTime.Month;
-
-            List<int> isLeapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? isLeapYear = leapY : isLeapYear = flatY;
-            double[] array = doubles.ToArray();
-            double ser = doubles.Sum();
-            int moth = 1;
-            int primaryD = 0;
-            for (int i = 0; i < isLeapYear.Count; i++)
+            if (doubles.Count > 0)
             {
-                if (month < moth)
-                    break;
-                double[] temp = new double[isLeapYear[i]];
-                Array.ConstrainedCopy(array, primaryD, temp, 0, isLeapYear[i]);
-                months.Add(new YearMonth() { id = $"{year}-{moth}", cnt = temp.Sum() });
-                moth += 1;
-                primaryD += isLeapYear[i];
+                DateTimeOffset dateTime = DateTimeOffset.Now;
+                if (year == 0)
+                    year = dateTime.Year;
+                if (month == 0)
+                    month = dateTime.Month;
+
+                List<int> isLeapYear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? isLeapYear = leapY : isLeapYear = flatY;
+                double[] array = doubles.ToArray();
+                double ser = doubles.Sum();
+                int moth = 1;
+                int primaryD = 0;
+                for (int i = 0; i < isLeapYear.Count; i++)
+                {
+                    if (month < moth)
+                        break;
+                    double[] temp = new double[isLeapYear[i]];
+                    Array.ConstrainedCopy(array, primaryD, temp, 0, isLeapYear[i]);
+                    months.Add(new YearMonth() { id = $"{year}-{moth}", cnt = temp.Sum() });
+                    moth += 1;
+                    primaryD += isLeapYear[i];
+                }
             }
-
             return months;
         }
 

+ 1 - 1
TEAMModelOS.SDK/Models/Service/BIStatsWay/ActivityStatsWay.cs

@@ -17,7 +17,7 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
         /// <param name="cosmosClient"></param>
         /// <param name="scId"></param>
         /// <returns></returns>
-        public static async Task<ActivityStats> GetActStats(CosmosClient cosmosClient, string scId)
+        public static async Task<ActivityStats> GetSchoolAll(CosmosClient cosmosClient, string scId)
         {
             ActivityStats actStats = new();
 

+ 1 - 1
TEAMModelOS.SDK/Models/Service/BIStatsWay/LessonRecordStatsWay.cs

@@ -18,7 +18,7 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
         /// <param name="cosmosClient"></param>
         /// <param name="id"></param>
         /// <returns></returns>
-        public static async Task<LessonStats> GetLessStats(CosmosClient cosmosClient, string id)
+        public static async Task<LessonStats> GetSchoolAll(CosmosClient cosmosClient, string id)
         {
             LessonStats lessStats = new();
 

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

@@ -1,10 +1,16 @@
 using Azure.Cosmos;
+using DocumentFormat.OpenXml.Bibliography;
 using DocumentFormat.OpenXml.Math;
+using Microsoft.AspNetCore.Mvc;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
+using System.Text.Json;
 using System.Threading.Tasks;
+using TEAMModelOS.Models;
+using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
 using TEAMModelOS.SDK.Models.Service.BI;
 
@@ -19,9 +25,8 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
         /// <param name="cosmosClient"></param>
         /// <param name="scId"></param>
         /// <returns></returns>
-        public static async Task<StatsInfo> upSingleSc(CosmosClient cosmosClient, string scId)
+        public static async Task<StatsInfo> GetSingleSc(CosmosClient cosmosClient, string scId)
         {
-
             StatsInfo statsInfo = new() { id = $"{scId}" };
 
             DateTimeOffset dateTime = DateTimeOffset.UtcNow;
@@ -63,10 +68,132 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
             statsInfo.room = await JointlySingleQuery.GetValueInt(cosmosClient, "School", currSql, code: $"Room-{scBase.id}");
             statsInfo.witRoom = await JointlySingleQuery.GetValueInt(cosmosClient, "School", $"{currSql} where (c.serial != null or c.serial != '' or IS_DEFINED(c.serial) = true)", code: $"Room-{scBase.id}");
 
-            statsInfo.lesson = await LessonRecordStatsWay.GetLessStats(cosmosClient, statsInfo.id);
-            statsInfo.activity = await ActivityStatsWay.GetActStats(cosmosClient, statsInfo.id);
+            statsInfo.lesson = await LessonRecordStatsWay.GetSchoolAll(cosmosClient, statsInfo.id);
+            statsInfo.activity = await ActivityStatsWay.GetSchoolAll(cosmosClient, statsInfo.id);
+            statsInfo.study = await StudyStatsWay.GetSchoolAll(cosmosClient, statsInfo.id);
 
             return statsInfo;
         }
+
+
+        /// <summary>
+        /// 多个学校统计
+        /// </summary>
+        /// <param name="cosmosClient"></param>
+        /// <param name="statsInfos"></param>
+        /// <param name="_httpTrigger"></param>
+        /// <param name="_option"></param>
+        /// <param name="area"></param>
+        /// <returns></returns>
+        public static async Task<StatsInfo> GetAreaStats(CosmosClient cosmosClient, HttpTrigger _httpTrigger, Option _option, List<StatsInfo> statsInfos, List<string> scIds = null, Area area = null) 
+        {
+            StatsInfo areaInfo = new()
+            {
+                id = area == null ? "" : area.id,
+                pk = "Stats",
+                code = "Stats",
+                name = area == null ? "" : area.name,
+                picture = "",
+                tch = statsInfos.Select(s => s.tch).Sum(),
+                dayTch = statsInfos.Select(s => s.dayTch).Sum(),
+                weekTch = statsInfos.Select(s => s.weekTch).Sum(),
+                monthTch = statsInfos.Select(s => s.monthTch).Sum(),
+                stu = statsInfos.Select(s => s.stu).Sum(),
+                dayStu = statsInfos.Select(s => s.dayStu).Sum(),
+                weekStu = statsInfos.Select(s => s.weekStu).Sum(),
+                monthStu = statsInfos.Select(s => s.monthStu).Sum(),
+                room = statsInfos.Select(s => s.room).Sum(),
+                witRoom = statsInfos.Select(s => s.witRoom).Sum(),
+                size = statsInfos.Select(s => s.size).Sum()
+            };
+            areaInfo.lesson.open = statsInfos.Select(s => s.lesson.open).Sum();
+            areaInfo.lesson.less = statsInfos.Select(s => s.lesson.less).Sum();
+            areaInfo.lesson.lastDay = statsInfos.Select(s => s.lesson.lastDay).Sum();
+            areaInfo.lesson.day = statsInfos.Select(s => s.lesson.day).Sum();
+            areaInfo.lesson.lastWeek = statsInfos.Select(s => s.lesson.lastWeek).Sum();
+            areaInfo.lesson.week = statsInfos.Select(s => s.lesson.week).Sum();
+            areaInfo.lesson.lastTerm = statsInfos.Select(s => s.lesson.lastTerm).Sum();
+            areaInfo.lesson.term = statsInfos.Select(s => s.lesson.term).Sum();
+            areaInfo.lesson.lastDayInter = statsInfos.Select(s => s.lesson.lastDayInter).Sum();
+            areaInfo.lesson.dayInter = statsInfos.Select(s => s.lesson.dayInter).Sum();
+            areaInfo.lesson.lastMonthInter = statsInfos.Select(s => s.lesson.lastMonthInter).Sum();
+            areaInfo.lesson.monthInter = statsInfos.Select(s => s.lesson.monthInter).Sum();
+            areaInfo.lesson.lastYearInter = statsInfos.Select(s => s.lesson.lastYearInter).Sum();
+            areaInfo.lesson.yearInter = statsInfos.Select(s => s.lesson.yearInter).Sum();
+
+            areaInfo.activity.cnt = statsInfos.Select(s => s.activity.cnt).Sum();
+            areaInfo.activity.exam = statsInfos.Select(s => s.activity.exam).Sum();
+            areaInfo.activity.survey = statsInfos.Select(s => s.activity.survey).Sum();
+            areaInfo.activity.vote = statsInfos.Select(s => s.activity.vote).Sum();
+            areaInfo.activity.homework = statsInfos.Select(s => s.activity.homework).Sum();
+            areaInfo.activity.lastDay = statsInfos.Select(s => s.activity.lastDay).Sum();
+            areaInfo.activity.dayCnt = statsInfos.Select(s => s.activity.dayCnt).Sum();
+            areaInfo.activity.lastWeek = statsInfos.Select(s => s.activity.lastWeek).Sum();
+            areaInfo.activity.week = statsInfos.Select(s => s.activity.week).Sum();
+            areaInfo.activity.lastTerm = statsInfos.Select(s => s.activity.lastTerm).Sum();
+            areaInfo.activity.term = statsInfos.Select(s => s.activity.term).Sum();
+
+            List<Task<ItemResponse<StatsInfo>>> taskStatsInfos = new();
+
+            foreach (var itemId in scIds)
+            {
+                bool isExist = true;
+                StatsInfo statsInfo = new();
+                var scDataStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{itemId}", new PartitionKey("Stats"));
+                if (scDataStats.Status == 200)
+                {
+                    using var fileJson = await JsonDocument.ParseAsync(scDataStats.ContentStream);
+                    statsInfo = fileJson.ToObject<StatsInfo>();
+                }
+                else
+                {
+                    statsInfo.id = itemId;
+                    isExist = false;
+                }
+
+                bool isnew = false;
+                DateTimeOffset dateTime = DateTimeOffset.UtcNow;
+                long now = dateTime.ToUnixTimeMilliseconds();
+
+                if (statsInfo.upTime > 0 && !isnew)
+                {
+                    long timedis = 20 * 60 * 1000;//20分钟
+                    if (now - statsInfo.upTime < timedis)
+                        isnew = true;
+                }
+                if (statsInfo.upTime == 0 && isnew)
+                    statsInfo.upTime = now;
+                if (statsInfo.upTime == 0 && isnew)
+                    statsInfo.upTime = DateTimeOffset.UtcNow.Add(new TimeSpan(-1, 0, 0, 0)).ToUnixTimeMilliseconds();
+                if (!isnew)
+                {
+                    ////Function 处理Function 更新或者新增
+                    //_ = _httpTrigger.RequestHttpTrigger(new { schoolId = $"{itemId}"}, _option.Location, "stats-sc-info");
+
+                    //异步方法处理 同步更新
+                    statsInfo = await SchoolStatsWay.GetSingleSc(cosmosClient, itemId);
+
+                    statsInfo.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                    if (isExist)
+                        taskStatsInfos.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StatsInfo>(statsInfo, statsInfo.id, new PartitionKey("Stats")));
+                    else
+                        taskStatsInfos.Add(cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Stats")));
+                }
+            }
+
+            if (taskStatsInfos.Count < 256)
+                await Task.WhenAll(taskStatsInfos);
+            else 
+            {
+                int pages = (taskStatsInfos.Count + 256) / 256;
+                for (int i = 0; i < pages; i++)
+                {
+                    List<Task<ItemResponse<StatsInfo>>> tempStatsInfos = taskStatsInfos.Skip((i) * 256).Take(256).ToList();
+                    await Task.WhenAll(tempStatsInfos);
+                }
+            }
+
+            return areaInfo;
+        }
     }
 }

+ 24 - 20
TEAMModelOS.SDK/Models/Service/BIStatsWay/StudyStatsWay.cs

@@ -3,7 +3,9 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
+using System.Text.Json;
 using System.Threading.Tasks;
+using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
 
 namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
@@ -17,17 +19,20 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
         /// <param name="cosmosClient"></param>
         /// <param name="scId"></param>
         /// <returns></returns>
-        public static async Task<StudyStats> GetStudyStats(CosmosClient cosmosClient, string scId)
+        public static async Task<StudyStats> GetSchoolAll(CosmosClient cosmosClient, string scId)
         {
             StudyStats studyStats = new();
             List<AreaStudy> trains = new();
 
-            School rschool = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>($"{scId}", new PartitionKey("AreaSetting"));
+            School school = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>($"{scId}", new PartitionKey("Base"));
+            //cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<string>(queryText:$"select value(c.areaId) from c where c.id='{scId}'", requestOptions:new QueryRequestOptions() { PartitionKey = new PartitionKey("Base")});
 
             AreaSetting setting = null;
-            var responSett = await cosmosClient.GetContainer("TEAMModelOS", "Normal").ReadItemStreamAsync($"{rschool.areaId}", new PartitionKey("AreaSetting"));
+            var responSett = await cosmosClient.GetContainer("TEAMModelOS", "Normal").ReadItemStreamAsync($"{school.areaId}", new PartitionKey("AreaSetting"));
             if (responSett.Status == 200)
             {
+                using var fileJson = await JsonDocument.ParseAsync(responSett.ContentStream);
+                setting = fileJson.ToObject<AreaSetting>();
 
             }
             if (setting == null)
@@ -43,31 +48,30 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
                 };
             }
 
-            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<AreaStudy>(queryText: $"select c.id,c.code,c.onlineTime,c.offlineTime,c.classTime,c.currency from c where c.pk='TeacherTrain' and c.school='{scId}'", requestOptions: new QueryRequestOptions() { }))
+            await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<AreaStudy>(queryText: $"select c.id,c.code,c.totalTime,c.onlineTime,c.offlineTime,c.classTime,c.currency from c where c.pk='TeacherTrain' and c.school='{scId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"TeacherTrain-{scId}") }))
             {
                 trains.Add(item);
             }
 
+            studyStats.learnTime = trains.Select(s=>s.totalTime).Sum();
+            trains.ForEach(x =>
+            {
+                //线上研修
+                if (x.onlineTime == 0) studyStats.online++; else if (x.onlineTime >= setting.onlineTime) studyStats.online++; else studyStats.online++;
 
+                //线下研修
+                if (x.offlineTime == 0) studyStats.offline++; else if (x.onlineTime >= setting.offlineTime) studyStats.offline++; else studyStats.offline++;
 
-            //trains.ForEach(x =>
-            //{
-            //    //线上研修
-            //    if (x.onlineTime == 0) studyStats++; else if (x.onlineTime >= setting.onlineTime) onLineCount++; else onLineCount++;
-
-            //    //线下研修
-            //    if (x.offlineTime == 0) offlineCount++; else if (x.onlineTime >= setting.offlineTime) offlineCount++; else offlineCount++;
-
-            //    //课堂实录
-            //    if (x.classTime == 0) classRoomCount++; else if (x.classTime >= setting.classTime) classRoomCount++; else classRoomCount++;
+                //课堂实录
+                if (x.classTime == 0) studyStats.classRoom++; else if (x.classTime >= setting.classTime) studyStats.classRoom++; else studyStats.classRoom++;
 
-            //    //认证材料
-            //    if (x.currency.submitTime == 0) submitCount++; else if (x.currency.submitTime >= setting.submitTime) submitCount++; else submitCount++;
+                //认证材料
+                if (x.currency.submitTime == 0) studyStats.submit++; else if (x.currency.submitTime >= setting.submitTime) studyStats.submit++; else studyStats.submit++;
 
-            //    if (x.currency.submitTime == 0 && x.classTime == 0 && x.offlineTime == 0 && x.onlineTime == 0) noCount++;
-            //    else if (x.currency.submitTime >= setting.submitTime && x.classTime >= setting.classTime && x.onlineTime >= setting.offlineTime && x.onlineTime >= setting.onlineTime) fulfilCount++;
-            //    else carryOnCount++;
-            //});
+                if (x.currency.submitTime == 0 && x.classTime == 0 && x.offlineTime == 0 && x.onlineTime == 0) studyStats.notStarted++;
+                else if (x.currency.submitTime >= setting.submitTime && x.classTime >= setting.classTime && x.onlineTime >= setting.offlineTime && x.onlineTime >= setting.onlineTime) studyStats.finish++;
+                else studyStats.ongoing++;
+            });