Преглед на файлове

优化课例、试卷、模组统计接口,以及添加新的接口

Li преди 3 години
родител
ревизия
0faf46aea1

+ 163 - 0
TEAMModelBI/Controllers/Census/LessonSticsController.cs

@@ -15,6 +15,7 @@ using TEAMModelBI.Models;
 using TEAMModelOS.SDK.Extension;
 using System.Text;
 using TEAMModelBI.Tool;
+using MathNet.Numerics.LinearAlgebra.Double;
 
 namespace TEAMModelBI.Controllers.Census
 {
@@ -159,6 +160,168 @@ namespace TEAMModelBI.Controllers.Census
             }
         }
 
+        /// <summary>
+        /// 统计所有的课例数据
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("get-diccount")]
+        public async Task<IActionResult> GetDicCount(JsonElement jsonElement)
+        {
+            jsonElement.TryGetProperty("tmdId", out JsonElement tmdId);
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+
+            if (!string.IsNullOrEmpty($"{tmdId}"))
+            {
+                jsonElement.TryGetProperty("years", out JsonElement _years);
+                int years = DateTime.UtcNow.Year;
+                if (!string.IsNullOrEmpty($"{_years}")) 
+                {
+                    years = _years.GetInt32();
+                }
+
+                List<SchoolLen> schoolLens = new List<SchoolLen>();
+                List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
+                foreach (string schoolId in schoolIds)
+                {
+                    School school = new();
+
+                    var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(schoolId, new PartitionKey("Base"));
+                    if (response.Status == 200)
+                    {
+                        using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                        school = json.ToObject<School>();
+                    }
+
+                    SchoolLen schoolLen = new SchoolLen() { 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}") }))
+                    {
+                        begin.Add(lcount.beginCount);
+                    }
+                    schoolLen.totals = (long)DenseMatrix.OfColumns(begin).ColumnSums().Sum();
+                    schoolLens.Add(schoolLen);
+                }
+
+                return Ok(new { state = 200, schoolLens });
+            }
+            else
+            {
+                List<List<double>> begin = new();
+
+                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<LessonCount>(queryText: "select value(c) from c where c.pk='LessonCount'", requestOptions: new QueryRequestOptions() { }))
+                {
+                    begin.Add(item.beginCount);
+                }
+
+                var count = DenseMatrix.OfColumns(begin).ColumnSums().Sum();
+
+                return Ok(new { state = 200, count });
+            }
+        }
+
+        /// <summary>
+        /// 顾问关联的学校统计本学期的课例
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [HttpPost("get-termcount")]
+        public async Task<IActionResult> GetTermCount(JsonElement jsonElement) 
+        {
+            if(jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) BadRequest();
+            var cosmosClient = _azureCosmos.GetCosmosClient();
+            List<SchoolLen> schoolLens = new List<SchoolLen>();
+            List<string> schoolIds = await CommonFind.FindSchoolIds(cosmosClient, $"{tmdId}");
+            foreach (var scid in schoolIds)
+            {
+                School school = new();
+                var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(scid, new PartitionKey("Base"));
+                if (response.Status == 200)
+                {
+                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                    school = json.ToObject<School>();
+                }
+
+                SchoolLen schoolLen = new SchoolLen() { 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;
+
+                long stime = DateTimeOffset.Parse($"{year}-9-1").ToUnixTimeMilliseconds();
+                //long etime = DateTimeOffset.Parse($"{year}-2-{((year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? 29 : 28)}").ToUnixTimeMilliseconds();
+
+                double totals = 0;
+                var syear = DateTimeOffset.FromUnixTimeMilliseconds(stime).Year;
+                var tyear = DateTimeOffset.UtcNow.Year;
+                var tday = DateTimeOffset.UtcNow.DayOfYear;
+                //今年多少天
+                int tdays = (tyear % 4 == 0 && tyear % 100 != 0 || tyear % 400 == 0) ? 366 : 365;
+                //去年多少天
+                int pydays = (syear % 4 == 0 && syear % 100 != 0 || syear % 400 == 0) ? 366 : 365;
+                List<LessonCount> scount = new();
+                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}") }))
+                {
+                    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}") }))
+                    {
+                        tcount.Add(item);
+                    }
+                    if (tcount.Count > 0)
+                    {
+                        List<List<double>> be = new();
+                        foreach (var item in tcount)
+                        {
+                            be.Add(item.beginCount);
+                        }
+                        dense = DenseMatrix.OfColumns(be);
+                    }
+                }
+                if (scount.Count > 0)
+                {
+                    List<List<double>> begin = new List<List<double>>();
+                    foreach (LessonCount lesson in scount)
+                    {
+                        begin.Add(lesson.beginCount);
+                    }
+                    var matrix = DenseMatrix.OfColumns(begin);
+
+                    //求本学期
+                    var sdays = DateTimeOffset.FromUnixTimeMilliseconds(stime).DayOfYear;
+                    if (tday - sdays < 0)
+                    {
+                        //var tmatrix = DenseMatrix.OfColumns(scount.beginCount);
+                        //跨年后开始到本学期结束
+                        double endMonth = 0;
+                        if (null != dense)
+                        {
+                            endMonth = dense.SubMatrix(0, tday, 0, dense.ColumnCount).ColumnSums().Sum();
+                        }
+                        var startMonth = matrix.SubMatrix(sdays - 1, pydays - sdays, 0, matrix.ColumnCount).ColumnSums().Sum();
+                        totals = (endMonth + startMonth);
+                    }
+                    else
+                    {
+                        var allMonth = matrix.SubMatrix(sdays - 1, tday - sdays + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
+                        totals = allMonth;
+                    }
+                }
+                schoolLen.totals = (long)totals;
+                schoolLens.Add(schoolLen);
+            }
+
+            return Ok(new { state = 200, schoolLens });
+        }
+
+
         public record SchoolLen 
         {
             public string id { get; set; }

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

@@ -221,7 +221,7 @@ namespace TEAMModelBI.Controllers.BISchool
             var cosmosClient = _azureCosmos.GetCosmosClient();
             var (start, end) = DateTimeHeloer.GetTermStartOrEnd(DateTime.Now);
 
-             var total = new object();
+             var totals = new object();
             if (!string.IsNullOrEmpty($"{tmdId}"))
             {
                 List<SchoolPaper> schoolPapers = new List<SchoolPaper>();
@@ -260,16 +260,16 @@ namespace TEAMModelBI.Controllers.BISchool
                     schoolPapers.Add(schoolPaper);
                 }
 
-                total = schoolPapers;
+                totals = schoolPapers;
             }
             else
             {
                 string sqlTxt = $"SELECT COUNT(c.id) AS totals FROM c where c.pk='Paper' and c.createTime >= {start} and c.createTime <= {end}";
 
-                total = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School" });
+                totals = await CommonFind.FindTotals(cosmosClient, sqlTxt, new List<string>() { "School" });
             }
 
-            return Ok(new { state = 200, total });
+            return Ok(new { state = 200, totals });
         }
 
         public record SchoolPaper 

+ 55 - 7
TEAMModelBI/Controllers/Census/ProductStatisController.cs

@@ -24,6 +24,9 @@ namespace TEAMModelBI.Controllers.Census
         private readonly DingDing _dingDing;
         private readonly Option _option;
 
+        //服务产品
+        private readonly Dictionary<string, string> prodict = new Dictionary<string, string>() { { "YMPCVCIM", "学情分析模组" }, { "IPDYZYLC", "智慧学校管理服务" }, { "3CLYJ6NP", "AClass ONE智慧学伴" }, { "IPALJ6NY", "数据储存服务空间" }, { "VABAJ6NV", "卷卡合一阅卷系统" } };
+
         public ProductStatisController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option) 
         {
             _azureCosmos = azureCosmos;
@@ -41,17 +44,18 @@ namespace TEAMModelBI.Controllers.Census
         {
             var cosmosClient = _azureCosmos.GetCosmosClient();
             List<ProductStatis> productStatis = new List<ProductStatis>();
-            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"SELECT c.prodinfo FROM c",requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("ProductSum") }))
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"SELECT c.prodinfo,c.service FROM c",requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("ProductSum") }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                 {
                     foreach (var itemCount in json.RootElement.GetProperty("Documents").EnumerateArray())
                     {
+                        //软体产品
                         List<SchoolProductSumProdInfo> prodInfo = itemCount.GetProperty("prodinfo").ToObject<List<SchoolProductSumProdInfo>>();
                         foreach (var tempProdInfo in prodInfo)
                         {
-                            ProductStatis tempPerod = productStatis.Find(x => x.prodName.Equals(tempProdInfo.prodName));
+                            ProductStatis tempPerod = productStatis.Find(x => x.prodCode.Equals(tempProdInfo.prodCode));
                             if (!string.IsNullOrEmpty($"{tempPerod}"))
                             {
                                 tempPerod.Count += 1;
@@ -62,7 +66,29 @@ namespace TEAMModelBI.Controllers.Census
                                 {
                                     prodCode = tempProdInfo.prodCode,
                                     prodName = tempProdInfo.prodName,
-                                    dataType = tempProdInfo.dataType,
+                                    //dataType = tempProdInfo.dataType,
+                                    Count = 1,
+                                };
+                                productStatis.Add(tempProd);
+                            }
+                        }
+
+                        //服务产品
+                        List<SchoolProductSumData> service = itemCount.GetProperty("service").ToObject<List<SchoolProductSumData>>();
+                        foreach (var ser in service)
+                        {
+                            ProductStatis tempPerod = productStatis.Find(x => x.prodCode.Equals(ser.prodCode));
+                            if (!string.IsNullOrEmpty($"{tempPerod}"))
+                            {
+                                tempPerod.Count += 1;
+                            }
+                            else
+                            {
+                                ProductStatis tempProd = new ProductStatis()
+                                {
+                                    prodCode = ser.prodCode,
+                                    prodName = prodict[ser.prodCode],
+                                    //dataType = "",
                                     Count = 1,
                                 };
                                 productStatis.Add(tempProd);
@@ -116,15 +142,16 @@ namespace TEAMModelBI.Controllers.Census
             List<ProductStatis> productStatis = new List<ProductStatis>();
 
             var cosmosClient = _azureCosmos.GetCosmosClient();
-            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"SELECT c.id,c.prodinfo FROM c where c.id='{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("ProductSum") }))
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"SELECT c.prodinfo,c.service FROM c where c.id='{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("ProductSum") }))
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 foreach (var itemCount in json.RootElement.GetProperty("Documents").EnumerateArray())
                 {
+                    //软件
                     List<SchoolProductSumProdInfo> prodInfo = itemCount.GetProperty("prodinfo").ToObject<List<SchoolProductSumProdInfo>>();
                     foreach (var tempProdInfo in prodInfo)
                     {
-                        ProductStatis tempPerod = productStatis.Find(x => x.prodName.Equals(tempProdInfo.prodName));
+                        ProductStatis tempPerod = productStatis.Find(x => x.prodCode.Equals(tempProdInfo.prodCode));
                         if (!string.IsNullOrEmpty($"{tempPerod}"))
                         {
                             tempPerod.Count += 1;
@@ -135,7 +162,28 @@ namespace TEAMModelBI.Controllers.Census
                             {
                                 prodCode = tempProdInfo.prodCode,
                                 prodName = tempProdInfo.prodName,
-                                dataType = tempProdInfo.dataType,
+                                //dataType = tempProdInfo.dataType,
+                                Count = 1,
+                            };
+                            productStatis.Add(tempProd);
+                        }
+                    }
+                    //服务产品
+                    List<SchoolProductSumData> service = itemCount.GetProperty("service").ToObject<List<SchoolProductSumData>>();
+                    foreach (var ser in service)
+                    {
+                        ProductStatis tempPerod = productStatis.Find(x => x.prodCode.Equals(ser.prodCode));
+                        if (!string.IsNullOrEmpty($"{tempPerod}"))
+                        {
+                            tempPerod.Count += 1;
+                        }
+                        else
+                        {
+                            ProductStatis tempProd = new ProductStatis()
+                            {
+                                prodCode = ser.prodCode,
+                                prodName = prodict[ser.prodCode],
+                                //dataType = "",
                                 Count = 1,
                             };
                             productStatis.Add(tempProd);
@@ -153,7 +201,7 @@ namespace TEAMModelBI.Controllers.Census
 
             public string prodName { get; set; }
 
-            public string dataType { get; set; }
+            //public string dataType { get; set; }
 
             public long Count { get; set; }