|
@@ -378,14 +378,14 @@ namespace TEAMModelOS.Controllers
|
|
serviceProductAclassoneResult.startDate = serviceProductResultRow.startDate;
|
|
serviceProductAclassoneResult.startDate = serviceProductResultRow.startDate;
|
|
serviceProductAclassoneResult.endDate = serviceProductResultRow.endDate;
|
|
serviceProductAclassoneResult.endDate = serviceProductResultRow.endDate;
|
|
serviceProductAclassoneResult.avaliable = serviceProductResultRow.avaliable;
|
|
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)
|
|
if (json.RootElement.TryGetProperty("aclassone", out JsonElement aclassoneJobj) && aclassoneJobj.ValueKind != JsonValueKind.Null)
|
|
{
|
|
{
|
|
int total = (aclassoneJobj.TryGetProperty("total", out JsonElement totalJobj)) ? totalJobj.GetInt32() : 0;
|
|
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);
|
|
service.Add(serviceProductAclassoneResult);
|
|
break;
|
|
break;
|
|
@@ -737,8 +737,7 @@ namespace TEAMModelOS.Controllers
|
|
staNum = ids.EnumerateArray().Count();
|
|
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>
|
|
/// <summary>
|
|
- /// 取得某學校AClassOne動態使用數
|
|
|
|
|
|
+ /// 取得某學校AClassOne動態可使用數
|
|
/// </summary>
|
|
/// </summary>
|
|
public int GetSchoolDynamicAclassOne(string schoolCode)
|
|
public int GetSchoolDynamicAclassOne(string schoolCode)
|
|
{
|
|
{
|
|
@@ -780,6 +779,14 @@ namespace TEAMModelOS.Controllers
|
|
return result;
|
|
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>
|
|
/// <summary>
|
|
/// [測試用]放入某學校的AClassOne動態學生ID
|
|
/// [測試用]放入某學校的AClassOne動態學生ID
|
|
/// </summary>
|
|
/// </summary>
|
|
@@ -817,30 +824,75 @@ namespace TEAMModelOS.Controllers
|
|
{
|
|
{
|
|
if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
|
|
if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
|
|
if (!request.TryGetProperty("student_ids", out JsonElement student_ids)) 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();
|
|
return BadRequest();
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|