Quellcode durchsuchen

分配AClassOne固定授權學生API

jeff vor 4 Jahren
Ursprung
Commit
2eaca50c9e

+ 2 - 2
TEAMModelOS.SDK/Models/Cosmos/School/SchoolProduct.cs

@@ -138,8 +138,8 @@ namespace TEAMModelOS.SDK.Models
     }
     public class ServiceProductAclassoneResult : ServiceProductResult
     {
-        public int used { get; set; }
-        public int less { get; set; }
+        public int staUsed { get; set; }
+        public int dynUsed { get; set; }
     }
     public class ServiceProductAuth
     {

+ 75 - 23
TEAMModelOS/Controllers/School/SchoolController.cs

@@ -378,14 +378,14 @@ namespace TEAMModelOS.Controllers
                                         serviceProductAclassoneResult.startDate = serviceProductResultRow.startDate;
                                         serviceProductAclassoneResult.endDate = serviceProductResultRow.endDate;
                                         serviceProductAclassoneResult.avaliable = serviceProductResultRow.avaliable;
-                                        serviceProductAclassoneResult.used = 0;
-                                        serviceProductAclassoneResult.less = 0;
+                                        serviceProductAclassoneResult.staUsed = 0;
+                                        serviceProductAclassoneResult.dynUsed = 0;
                                         if (json.RootElement.TryGetProperty("aclassone", out JsonElement aclassoneJobj) && aclassoneJobj.ValueKind != JsonValueKind.Null)
                                         {
                                             int total = (aclassoneJobj.TryGetProperty("total", out JsonElement totalJobj)) ? totalJobj.GetInt32() : 0;
-                                            serviceProductAclassoneResult.used = (aclassoneJobj.TryGetProperty("used", out JsonElement usedJobj)) ? usedJobj.GetInt32() : 0; //固定分配數
-                                            int dynamicUsed = GetSchoolDynamicAclassOne(school_code.GetString()); //動態分配數
-                                            serviceProductAclassoneResult.less = total - serviceProductAclassoneResult.used - dynamicUsed;
+                                            serviceProductAclassoneResult.staUsed = (aclassoneJobj.TryGetProperty("used", out JsonElement usedJobj)) ? usedJobj.GetInt32() : 0; //固定分配數
+                                            List<string> dyncIdList = GetSchoolDynamicAclassOneIDList(school_code.GetString()); //動態使用ID
+                                            serviceProductAclassoneResult.dynUsed = dyncIdList.Count;
                                         }
                                         service.Add(serviceProductAclassoneResult);
                                         break;
@@ -737,8 +737,7 @@ namespace TEAMModelOS.Controllers
                                 staNum = ids.EnumerateArray().Count();
                             }
                         }
-                        List<string> dyncIdList = GetSchoolDynamicAclassOneIDList(school_code.GetString()); //動態ID List
-                        dyncNum = dyncIdList.Count;
+                        dyncNum = (int)GetSchoolDynamicAclassOneIDCount(school_code.GetString()); //動態ID使用數
                     }
                 }
             }
@@ -747,7 +746,7 @@ namespace TEAMModelOS.Controllers
         }
 
         /// <summary>
-        /// 取得某學校AClassOne動態使用數 
+        /// 取得某學校AClassOne動態使用數 
         /// </summary>
         public int GetSchoolDynamicAclassOne(string schoolCode)
         {
@@ -780,6 +779,14 @@ namespace TEAMModelOS.Controllers
             return result;
         }
 
+        public long GetSchoolDynamicAclassOneIDCount(string schoolCode)
+        {
+            string key = schoolCode + ":" + "AclassOne" + ":" + "dynamicIds";
+            var redisClient = _azureRedis.GetRedisClient(8);
+            long result = redisClient.SetLength(key);
+            return result;
+        }
+
         /// <summary>
         /// [測試用]放入某學校的AClassOne動態學生ID 
         /// </summary>
@@ -817,30 +824,75 @@ namespace TEAMModelOS.Controllers
         {
             if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
             if (!request.TryGetProperty("student_ids", out JsonElement student_ids)) return BadRequest();
-            List<string> resultIds = new List<string>();
-            var clientContainer = _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School");
-            var response = await clientContainer.ReadItemStreamAsync(school_code.ToString(), new PartitionKey("Product"));
-            if (response.Status == 200)
+            try
             {
-                using (Stream stream = response.ContentStream)
+                List<string> studentIds = System.Text.Json.JsonSerializer.Deserialize<List<string>>(student_ids.ToJsonString()); //新的學生ID列
+
+                /* ERROR CODE定義:
+                 * 0: 無錯誤
+                 * 1: AClassOne授權數不足或無AClassOne授權
+                 */
+                int status = 0;
+                string err = "";
+                List<string> ids = new List<string>();
+                var clientContainer = _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School");
+                var response = await clientContainer.ReadItemStreamAsync(school_code.ToString(), new PartitionKey("Product"));
+                if (response.Status == 200)
                 {
-                    using (StreamReader streamReader = new StreamReader(stream))
+                    int total = 0; //(回傳值)可分配總數
+                    int staNum = 0; //(回傳值)固定分配數
+                    int dyncNum = 0; //(回傳值)動態分配數
+                    using (Stream stream = response.ContentStream)
                     {
-                        string content = streamReader.ReadToEnd();
-                        var schoolProduct = System.Text.Json.JsonSerializer.Deserialize<SchoolProduct>(content);
-                        //STEP1 將學生ID放入 School.Product.aclassone.ids,更新aclassone.used
-
-                        //STEP2 更新Redis.hbcn:AclassOne:dynamic
-
-                        return Ok(new { resultIds });
+                        using (StreamReader streamReader = new StreamReader(stream))
+                        {
+                            string content = streamReader.ReadToEnd();
+                            SchoolProduct schoolProduct = System.Text.Json.JsonSerializer.Deserialize<SchoolProduct>(content);
+                            if (schoolProduct.aclassone != null) //有AClassOne產品授權,schoolProduct.aclassone不會為null
+                            {
+                                total = schoolProduct.aclassone.total;
+                                List<string> studentIdsInDB = schoolProduct.aclassone.ids; //舊的學生ID列
+                                int totalInDB = schoolProduct.aclassone.total;
+                                //STEP1 驗證所給的ID數是否超過AClassOne總數
+                                if (studentIds.Count > totalInDB)
+                                {
+                                    status = 1;
+                                    err = "AclassOne numbers is not enouth.";
+                                    return Ok(new { status, err });
+                                }
+                                //STEP2 將學生ID放入 School.Product.aclassone.ids,更新aclassone.used
+                                schoolProduct.aclassone.ids = studentIds;
+                                staNum = schoolProduct.aclassone.used = studentIds.Count;
+                                ////Update
+                                await clientContainer.ReplaceItemAsync<SchoolProduct>(schoolProduct, schoolProduct.id, new PartitionKey("Product"));
+                                //STEP3更新Redis.hbcn:AclassOne:dynamic ※註:只更新動態ID可用數,不更動動態ID列表,所以若可用數為0,當天被動態分配到的學生仍可使用至今日0時才會被清掉
+                                int dynamicAclassCount = totalInDB - studentIds.Count; //動態可使用數
+                                dyncNum = (int)GetSchoolDynamicAclassOneIDCount(school_code.GetString()); //動態ID已使用數
+                                var redisClient = _azureRedis.GetRedisClient(8);                        
+                                string key = school_code.GetString() + ":" + "AclassOne" + ":" + "dynamic";
+                                int updDynAclassCount = (dynamicAclassCount - dyncNum > 0) ? dynamicAclassCount - dyncNum : 0;
+                                redisClient.StringSet(key, updDynAclassCount);
+
+                                return Ok(new { status, err, total, staNum, dyncNum });
+                            }
+                            else
+                            {
+                                status = 1;
+                                err = "AClassOne has no authorization.";
+                                return Ok(new { status, err });
+                            }
+                        }
                     }
                 }
+                else
+                {
+                    return BadRequest();
+                }
             }
-            else
+            catch (Exception ex)
             {
                 return BadRequest();
             }
-
         }
     }
 }