浏览代码

1.取得HiTaechCC授權數邏輯修正:追加授權到期條件 2.取得HiTeachCC授權狀況API 3.[BI]取得產品分析統計結果API返回值追加學校資訊欄

jeff 2 年之前
父节点
当前提交
ba362b2119

+ 34 - 1
TEAMModelBI/Controllers/BIProductAnalysis/ProductAnalysisController.cs

@@ -88,8 +88,32 @@ namespace TEAMModelBI.Controllers.ProductAnalysis
                 long dateTimeToSec = dateTimeTo.ToUnixTimeSeconds();
 
                 //CosmosDB資料取得
-                List<ProdAnalysisApiResult> result = new List<ProdAnalysisApiResult>();
+                ////取得學校基本資訊 => 記入Dictionary
+                Dictionary<string, Dictionary<string, string>> schDic = new();
                 string schIdListStr = JsonSerializer.Serialize(schoolIds);
+                string SqlSch = $"SELECT c.id, c.name, c.code, c.region, c.province, c.city, c.dist FROM c WHERE ARRAY_CONTAINS({schIdListStr}, c.id, true) AND (c.code = 'Base' OR c.code = 'VirtualBase')";
+                await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: SqlSch, requestOptions: null))
+                {
+                    var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                    {
+                        string schId = obj.GetProperty("id").GetString();
+                        string name = Convert.ToString(obj.GetProperty("name"));
+                        string region = Convert.ToString(obj.GetProperty("region"));
+                        string province = Convert.ToString(obj.GetProperty("province"));
+                        string city = Convert.ToString(obj.GetProperty("city"));
+                        string dist = Convert.ToString(obj.GetProperty("dist"));
+                        string type = Convert.ToString(obj.GetProperty("code"));
+                        if (!schDic.ContainsKey(schId))
+                        {
+                            Dictionary<string, string> schDicRow = new() { { "name", name }, { "region", region }, { "province", province }, { "city", city }, { "dist", dist }, { "type", type } };
+                            schDic.Add(schId, schDicRow);
+                        }
+                    }
+                }
+
+                ////取得產品分析資訊
+                List<ProdAnalysisApiResult> result = new List<ProdAnalysisApiResult>();
                 string Sql = $"SELECT * FROM c WHERE c.toolType = '{prod}' AND c.dateUnit = '{dateUnit}' AND ARRAY_CONTAINS({schIdListStr}, c.schoolId, true) AND c.dateTime >= {dateTimeFromSec} AND c.dateTime <= {dateTimeToSec}";
                 await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: Sql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ProdAnalysis") }))
                 {
@@ -97,6 +121,15 @@ namespace TEAMModelBI.Controllers.ProductAnalysis
                     foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
                     {
                         ProdAnalysisApiResult resultRow = obj.ToObject<ProdAnalysisApiResult>();
+                        if (schDic.ContainsKey(resultRow.schoolId))
+                        {
+                            resultRow.school.name = schDic[resultRow.schoolId]["name"];
+                            resultRow.school.region = schDic[resultRow.schoolId]["region"];
+                            resultRow.school.province = schDic[resultRow.schoolId]["province"];
+                            resultRow.school.city = schDic[resultRow.schoolId]["city"];
+                            resultRow.school.dist = schDic[resultRow.schoolId]["dist"];
+                            resultRow.school.type = schDic[resultRow.schoolId]["type"];
+                        }
                         result.Add(resultRow);
                     }
                 }

+ 15 - 0
TEAMModelOS.SDK/Models/Cosmos/School/ProductAnalysis.cs

@@ -157,6 +157,11 @@ namespace TEAMModelOS.SDK.Models
 
     public class ProdAnalysisApiResult : ProdAnalysis
     {
+        public ProdAnalysisApiResult()
+        {
+            school = new SchoolSimple();
+        }
+        public SchoolSimple school { get; set; }
         public string dateUnit { get; set; }
         public string date { get; set; } //日期 [例] 2022、202203、20220314
         public int year { get; set; } //统计日期:年
@@ -184,4 +189,14 @@ namespace TEAMModelOS.SDK.Models
         public long createDate { get; set; } //統計時間
         public int? ttl { get; set; } = -1;
     }
+
+    public class SchoolSimple
+    {
+        public string name { get; set; }
+        public string region { get; set; }
+        public string province { get; set; }
+        public string city { get; set; }
+        public string dist { get; set; }
+        public string type { get; set; }
+}
 }

+ 8 - 2
TEAMModelOS/Controllers/Client/HiTeachController.cs

@@ -201,8 +201,14 @@ namespace TEAMModelOS.Controllers.Client
                     size = teacher.size;
                     foreach (var school in teacher.schools)
                     {
-                        SchoolTeacher st = await db.GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<SchoolTeacher>(tid, new PartitionKey($"Teacher-{school.schoolId}"));
-                        size += st.size;
+                        try
+                        {
+                            SchoolTeacher st = await db.GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<SchoolTeacher>(tid, new PartitionKey($"Teacher-{school.schoolId}"));
+                            size += st.size;
+                        }
+                        catch (CosmosException)
+                        {
+                        }
                     }
                 }
                 (long usedSize, long teach, long total, long surplus, Dictionary<string, double?> catalog) space = await BlobService.GetSurplusSpace($"{(sp ? request.school : tid)}", request.sp, _option.Location, _azureCosmos, _azureRedis, _azureStorage, _dingDing,_httpTrigger);

+ 3 - 2
TEAMModelOS/Controllers/Client/HiTeachccControlller.cs

@@ -106,9 +106,10 @@ namespace TEAMModelOS.Controllers.Client
             var sp = request.sp.Equals("school", StringComparison.OrdinalIgnoreCase);
             try
             {
-                //判斷是否有足夠的CC授權,每個老師一天扣除一個授權           
+                //判斷是否有足夠的CC授權,每個老師一天扣除一個授權
+                long now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
                 await foreach (Response item in db.GetContainer(Constant.TEAMModelOS, Constant.School).GetItemQueryStreamIterator(
-                    queryText: $"SELECT TOP 1 c.deviceMax, c.clientQty, c.prodCode FROM c WHERE c.prodCode = 'LZLL6ZEI'",
+                    queryText: $"SELECT TOP 1 c.deviceMax, c.clientQty, c.prodCode FROM c WHERE c.prodCode = 'LZLL6ZEI' AND (c.endDate >= {now} OR c.endDate = 0)",
                     requestOptions: new() { PartitionKey = new($"Product-{request.school}") }))
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);

+ 34 - 0
TEAMModelOS/Controllers/School/SchoolController.cs

@@ -1063,6 +1063,40 @@ namespace TEAMModelOS.Controllers
             }
         }
 
+        [ProducesDefaultResponseType]
+        [HttpPost("get-auth-hitcc")]
+        [Authorize(Roles = "IES")]
+        public async Task<IActionResult> GetHiteachCCAuth(JsonElement request)
+        {
+            if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
+            var db = _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School");
+            var r8 = _azureRedis.GetRedisClient(8);
+            long now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
+            //取得HiTeachCC的有效授權
+            int avaliable = 0;
+            int dmax = 0;
+            int client = 0;
+            await foreach (var item in db.GetItemQueryStreamIterator($"SELECT c.clientQty, c.deviceMax FROM c WHERE c.prodCode='LZLL6ZEI' AND (c.endDate >= {now} OR c.endDate = 0)",
+                requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Product-{school_code}") }))
+            {
+                var json = await JsonDocument.ParseAsync(item.ContentStream);
+                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                {
+                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                    {
+                        dmax = obj.GetProperty("deviceMax").GetInt32();
+                        client = obj.GetProperty("clientQty").GetInt32();
+                    }
+                }
+            }
+            //取得CC授權使用狀態
+            var hashs = await r8.HashGetAllAsync($"CC:License:{school_code.GetString()}");
+            var ccuser = hashs.Select(x => JsonDocument.Parse(x.Value.ToString())).ToList();
+            avaliable = dmax - ccuser.Count;
+
+            return Ok(new { dmax = dmax, client = client, avaliable = avaliable, ccuser = ccuser });
+        }
+
         /// <summary>
         /// 計算各產品的購買歷史紀錄 [舊制,不使用]
         /// </summary>

+ 10 - 2
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -781,10 +781,18 @@ namespace TEAMModelOS.Controllers
                 List<SchoolProductSumData> services = new List<SchoolProductSumData>();
                 //获取HiTeachCC的授权
                 int cc_avaliable = 0;
-                await foreach (var item in   client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<int>("select value count(1) from c where c.prodCode='LZLL6ZEI'",
+                long now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator($"select value c.deviceMax from c where c.prodCode='LZLL6ZEI' AND (c.endDate >= {now} OR c.endDate = 0)",
                     requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Product-{school_code}") }))
                 {
-                    cc_avaliable = item;
+                    var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                    {
+                        foreach (var dmax in json.RootElement.GetProperty("Documents").EnumerateArray())
+                        {
+                            cc_avaliable = dmax.GetInt32();
+                        }
+                    }
                 }
                 services.Add(new SchoolProductSumData { prodCode = "LZLL6ZEI", avaliable = cc_avaliable });