|
@@ -19,6 +19,7 @@ using System.Net.Http;
|
|
|
using System.Net;
|
|
|
using Newtonsoft.Json;
|
|
|
using System.Linq;
|
|
|
+using StackExchange.Redis;
|
|
|
|
|
|
namespace TEAMModelOS.Controllers
|
|
|
{
|
|
@@ -32,12 +33,17 @@ namespace TEAMModelOS.Controllers
|
|
|
|
|
|
public AzureCosmosFactory _azureCosmos;
|
|
|
private readonly AzureStorageFactory _azureStorage;
|
|
|
+ private readonly AzureRedisFactory _azureRedis;
|
|
|
private readonly DingDing _dingDing;
|
|
|
private readonly Option _option;
|
|
|
- public SchoolController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, DingDing dingDing, IOptionsSnapshot<Option> option)
|
|
|
+ int baseSpaceSize = 1; //學校保底空間大小(1G)
|
|
|
+ private readonly double bytes = 1073741824;
|
|
|
+
|
|
|
+ public SchoolController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, DingDing dingDing, IOptionsSnapshot<Option> option)
|
|
|
{
|
|
|
_azureCosmos = azureCosmos;
|
|
|
_azureStorage = azureStorage;
|
|
|
+ _azureRedis = azureRedis;
|
|
|
_dingDing = dingDing;
|
|
|
_option = option?.Value;
|
|
|
}
|
|
@@ -55,20 +61,19 @@ namespace TEAMModelOS.Controllers
|
|
|
try
|
|
|
{
|
|
|
School schoolInfo = new School();
|
|
|
- var client = _azureCosmos.GetCosmosClient();
|
|
|
- var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(requert.id, new PartitionKey($"Base"));
|
|
|
+ var client = _azureCosmos.GetCosmosClient();
|
|
|
+ var schoolContainer = client.GetContainer("TEAMModelOS", "School");
|
|
|
+ var response = await schoolContainer.ReadItemStreamAsync(requert.id, new PartitionKey($"Base"));
|
|
|
if (response.Status == 200)
|
|
|
{
|
|
|
-
|
|
|
- schoolInfo = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync(requert, new PartitionKey($"Base"));
|
|
|
+ schoolInfo = await schoolContainer.UpsertItemAsync(requert, new PartitionKey($"Base"));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- requert.code = "Base";
|
|
|
- schoolInfo = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(requert, new PartitionKey($"Base"));
|
|
|
-
|
|
|
+ requert.code = "Base";
|
|
|
+ schoolInfo = await schoolContainer.CreateItemAsync(requert, new PartitionKey($"Base"));
|
|
|
}
|
|
|
- return Ok(new { schoolInfo });
|
|
|
+ return Ok(new { schoolInfo });
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
@@ -182,9 +187,10 @@ namespace TEAMModelOS.Controllers
|
|
|
if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
|
|
|
|
|
|
var client = _azureCosmos.GetCosmosClient();
|
|
|
+ var schoolContainer = client.GetContainer("TEAMModelOS", "School");
|
|
|
//取得學校學制、年級、教室
|
|
|
List<object> classes = new List<object>();
|
|
|
- await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"SELECT c.id, c.name, c.gradeId FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
|
|
|
+ await foreach (var item in schoolContainer.GetItemQueryStreamIterator(queryText: $"SELECT c.id, c.name, c.gradeId FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
|
|
|
{
|
|
|
var jsonc = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
foreach (var classeinfo in jsonc.RootElement.GetProperty("Documents").EnumerateArray())
|
|
@@ -198,7 +204,7 @@ namespace TEAMModelOS.Controllers
|
|
|
}
|
|
|
List<object> periods = new List<object>();
|
|
|
List<object> grades = new List<object>();
|
|
|
- var responsesch = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(school_code.ToString(), new PartitionKey($"Base"));
|
|
|
+ var responsesch = await schoolContainer.ReadItemStreamAsync(school_code.ToString(), new PartitionKey($"Base"));
|
|
|
if (responsesch.Status == 200)
|
|
|
{
|
|
|
var jsons = await JsonDocument.ParseAsync(responsesch.ContentStream);
|
|
@@ -237,14 +243,14 @@ namespace TEAMModelOS.Controllers
|
|
|
public async Task<IActionResult> GetSchoolProductInfo(JsonElement request)
|
|
|
{
|
|
|
if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
|
|
|
+ var clientContainer = _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School");
|
|
|
|
|
|
- var client = _azureCosmos.GetCosmosClient();
|
|
|
List<deviceBoundRich> serialDeviceUpdList = new List<deviceBoundRich>(); //要更新DB的序號內容
|
|
|
List<SerialInfoBaseWithdeviceBoundExt> serial = new List<SerialInfoBaseWithdeviceBoundExt>(); //最後要輸出的序號結果
|
|
|
List<object> service = new List<object>();
|
|
|
List<object> hard = new List<object>();
|
|
|
List<deviceForCoreService> uuidList = new List<deviceForCoreService>(); //要向CoreService詢問deviceID及硬體資訊的UUID列表
|
|
|
- var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(school_code.ToString(), new PartitionKey("Product"));
|
|
|
+ var response = await clientContainer.ReadItemStreamAsync(school_code.ToString(), new PartitionKey("Product"));
|
|
|
if (response.Status == 200)
|
|
|
{
|
|
|
var json = await JsonDocument.ParseAsync(response.ContentStream);
|
|
@@ -254,7 +260,7 @@ namespace TEAMModelOS.Controllers
|
|
|
foreach (var serialInfo in serialJobj.EnumerateArray())
|
|
|
{
|
|
|
serial.Add(serialInfo.ToObject<SerialInfoBaseWithdeviceBoundExt>());
|
|
|
- if(serialInfo.TryGetProperty("deviceBound", out JsonElement deviceBoundJobj) && !string.IsNullOrWhiteSpace(deviceBoundJobj.ToString()) )
|
|
|
+ if (serialInfo.TryGetProperty("deviceBound", out JsonElement deviceBoundJobj) && !string.IsNullOrWhiteSpace(deviceBoundJobj.ToString()))
|
|
|
{
|
|
|
foreach (var deviceBoundRow in deviceBoundJobj.EnumerateArray())
|
|
|
{
|
|
@@ -307,8 +313,6 @@ namespace TEAMModelOS.Controllers
|
|
|
serialRow.deviceBound = deviceBoundArray;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
//服務
|
|
|
if (json.RootElement.TryGetProperty("service", out JsonElement serviceJobj))
|
|
|
{
|
|
@@ -346,12 +350,24 @@ namespace TEAMModelOS.Controllers
|
|
|
}
|
|
|
}
|
|
|
//計算各產品時間區域
|
|
|
+ bool buySpaceFlg = false;
|
|
|
+ ////取得學校空間使用狀況
|
|
|
+ var blobClient = _azureStorage.GetBlobContainerClient(school_code.ToString());
|
|
|
+ long? docSize = await blobClient.GetBlobsSize("doc");
|
|
|
+ long? videoSize = await blobClient.GetBlobsSize("video");
|
|
|
+ long? imageSize = await blobClient.GetBlobsSize("image");
|
|
|
+ long? paperSize = await blobClient.GetBlobsSize("paper");
|
|
|
+ long? itemSize = await blobClient.GetBlobsSize("item");
|
|
|
+ long? otherSize = await blobClient.GetBlobsSize("other");
|
|
|
+ long? studentSize = await blobClient.GetBlobsSize("student");
|
|
|
+ long teacherSize = 0;
|
|
|
if (serviceJobj.TryGetProperty("product", out JsonElement serviceProductJobj))
|
|
|
{
|
|
|
+
|
|
|
foreach (var serviceProductRow in serviceProductJobj.EnumerateArray())
|
|
|
{
|
|
|
ServiceProductResult serviceProductResultRow = CalServiceProductAuth(activeMainPeriod, activePeriodOfMain, serviceProductRow.ToObject<ServiceProduct>());
|
|
|
- if(!string.IsNullOrWhiteSpace(serviceProductResultRow.prodCode))
|
|
|
+ if (!string.IsNullOrWhiteSpace(serviceProductResultRow.prodCode))
|
|
|
{
|
|
|
switch (serviceProductResultRow.prodCode)
|
|
|
{
|
|
@@ -364,27 +380,27 @@ namespace TEAMModelOS.Controllers
|
|
|
serviceProductAclassoneResult.startDate = serviceProductResultRow.startDate;
|
|
|
serviceProductAclassoneResult.endDate = serviceProductResultRow.endDate;
|
|
|
serviceProductAclassoneResult.avaliable = serviceProductResultRow.avaliable;
|
|
|
- serviceProductAclassoneResult.used = 0;
|
|
|
- serviceProductAclassoneResult.less = 0;
|
|
|
- if (json.RootElement.TryGetProperty("aclassone", out JsonElement aclassoneJobj))
|
|
|
+ serviceProductAclassoneResult.staUsed = 0;
|
|
|
+ serviceProductAclassoneResult.dynUsed = 0;
|
|
|
+ if (json.RootElement.TryGetProperty("aclassone", out JsonElement aclassoneJobj) && aclassoneJobj.ValueKind != JsonValueKind.Null)
|
|
|
{
|
|
|
- serviceProductAclassoneResult.used = (aclassoneJobj.TryGetProperty("used", out JsonElement usedJobj)) ? usedJobj.GetInt32() : 0;
|
|
|
- serviceProductAclassoneResult.less = (aclassoneJobj.TryGetProperty("less", out JsonElement lessJobj)) ? lessJobj.GetInt32() : 0;
|
|
|
+ int total = (aclassoneJobj.TryGetProperty("total", out JsonElement totalJobj)) ? totalJobj.GetInt32() : 0;
|
|
|
+ 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;
|
|
|
case "IPALYEIY": //智慧教學服務空間
|
|
|
////取得目前使用狀況
|
|
|
- var blobClient = _azureStorage.GetBlobContainerClient(school_code.ToString());
|
|
|
//取得教師分配空間
|
|
|
- long teacherBlobSize = 0;
|
|
|
var query = $"SELECT SUM(c.size) as size FROM c";
|
|
|
- await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{school_code}") }))
|
|
|
+ await foreach (var item in clientContainer.GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{school_code}") }))
|
|
|
{
|
|
|
var jsonts = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
foreach (var obj in jsonts.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
{
|
|
|
- teacherBlobSize = obj.GetProperty("size").GetInt64() * 1073741824;//G換算成bytes
|
|
|
+ teacherSize = obj.GetProperty("size").GetInt64() * 1073741824;//G換算成bytes
|
|
|
}
|
|
|
}
|
|
|
//欄位取得
|
|
@@ -394,17 +410,18 @@ namespace TEAMModelOS.Controllers
|
|
|
serviceSpaceProductInfo.serviceType = serviceProductResultRow.serviceType;
|
|
|
serviceSpaceProductInfo.startDate = serviceProductResultRow.startDate;
|
|
|
serviceSpaceProductInfo.endDate = serviceProductResultRow.endDate;
|
|
|
- serviceSpaceProductInfo.avaliable = (long)serviceProductResultRow.avaliable * 1073741824; //G換算成bytes
|
|
|
- serviceSpaceProductInfo.doc = await blobClient.GetBlobsSize("doc");
|
|
|
- serviceSpaceProductInfo.video = await blobClient.GetBlobsSize("video");
|
|
|
- serviceSpaceProductInfo.image = await blobClient.GetBlobsSize("image");
|
|
|
- serviceSpaceProductInfo.paper = await blobClient.GetBlobsSize("paper");
|
|
|
- serviceSpaceProductInfo.item = await blobClient.GetBlobsSize("item");
|
|
|
- serviceSpaceProductInfo.other = await blobClient.GetBlobsSize("other");
|
|
|
- serviceSpaceProductInfo.student = await blobClient.GetBlobsSize("student");
|
|
|
- serviceSpaceProductInfo.teacher = teacherBlobSize;
|
|
|
+ serviceSpaceProductInfo.avaliable = (long)(serviceProductResultRow.avaliable + this.baseSpaceSize) * 1073741824; //G換算成bytes
|
|
|
+ serviceSpaceProductInfo.doc = docSize;
|
|
|
+ serviceSpaceProductInfo.video = videoSize;
|
|
|
+ serviceSpaceProductInfo.image = imageSize;
|
|
|
+ serviceSpaceProductInfo.paper = paperSize;
|
|
|
+ serviceSpaceProductInfo.item = itemSize;
|
|
|
+ serviceSpaceProductInfo.other = otherSize;
|
|
|
+ serviceSpaceProductInfo.student = studentSize;
|
|
|
+ serviceSpaceProductInfo.teacher = teacherSize;
|
|
|
serviceSpaceProductInfo.history = CalServiceProductOrderHistory(historyMainPeriod, historyPeriodOfMain, serviceProductRow.ToObject<ServiceProduct>()); ////購買紀錄
|
|
|
service.Add(serviceSpaceProductInfo);
|
|
|
+ buySpaceFlg = true;
|
|
|
break;
|
|
|
default:
|
|
|
service.Add(serviceProductResultRow);
|
|
@@ -413,10 +430,31 @@ namespace TEAMModelOS.Controllers
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ //學校保底空間追加
|
|
|
+ if (!buySpaceFlg) //未購買任何空間
|
|
|
+ {
|
|
|
+ dynamic serviceSpaceProductInfo = new ExpandoObject();
|
|
|
+ serviceSpaceProductInfo.prodCode = "IPALYEIY";
|
|
|
+ serviceSpaceProductInfo.noperiod = false;
|
|
|
+ serviceSpaceProductInfo.serviceType = "space";
|
|
|
+ serviceSpaceProductInfo.startDate = 0;
|
|
|
+ serviceSpaceProductInfo.endDate = 0;
|
|
|
+ serviceSpaceProductInfo.avaliable = this.baseSpaceSize * 1073741824; //1G換算成bytes
|
|
|
+ serviceSpaceProductInfo.doc = docSize;
|
|
|
+ serviceSpaceProductInfo.video = videoSize;
|
|
|
+ serviceSpaceProductInfo.image = imageSize;
|
|
|
+ serviceSpaceProductInfo.paper = paperSize;
|
|
|
+ serviceSpaceProductInfo.item = itemSize;
|
|
|
+ serviceSpaceProductInfo.other = otherSize;
|
|
|
+ serviceSpaceProductInfo.student = studentSize;
|
|
|
+ serviceSpaceProductInfo.teacher = teacherSize;
|
|
|
+ serviceSpaceProductInfo.history = null;
|
|
|
+ service.Add(serviceSpaceProductInfo);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//硬體
|
|
|
- if (json.RootElement.TryGetProperty("hard", out JsonElement hardJobj))
|
|
|
+ if (json.RootElement.TryGetProperty("hard", out JsonElement hardJobj) && hardJobj.ValueKind != JsonValueKind.Null)
|
|
|
{
|
|
|
hard.Add(hardJobj.ToObject<object>());
|
|
|
}
|
|
@@ -425,13 +463,13 @@ namespace TEAMModelOS.Controllers
|
|
|
if (serialDeviceUpdList.Count > 0)
|
|
|
{
|
|
|
SchoolProduct schoolProductItem = json.ToObject<SchoolProduct>();
|
|
|
- foreach(deviceBoundRich serialDeviceUpdRow in serialDeviceUpdList)
|
|
|
+ foreach (deviceBoundRich serialDeviceUpdRow in serialDeviceUpdList)
|
|
|
{
|
|
|
SerialInfoBaseWithdeviceBound updSerialInfo = schoolProductItem.serial.Where(s => s.serial == serialDeviceUpdRow.serial).FirstOrDefault();
|
|
|
deviceBound updDeviceBound = updSerialInfo.deviceBound.Where(d => d.uuid == serialDeviceUpdRow.uuid && d.uuid2 == serialDeviceUpdRow.uuid2).FirstOrDefault();
|
|
|
updDeviceBound.deviceId = serialDeviceUpdRow.deviceId;
|
|
|
}
|
|
|
- await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<SchoolProduct>(schoolProductItem, schoolProductItem.id, new PartitionKey("Product"));
|
|
|
+ await clientContainer.ReplaceItemAsync<SchoolProduct>(schoolProductItem, schoolProductItem.id, new PartitionKey("Product"));
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -483,16 +521,17 @@ namespace TEAMModelOS.Controllers
|
|
|
{
|
|
|
foreach (ServiceProductAuth serviceProductAuthRow in serviceProduct.auth)
|
|
|
{
|
|
|
- if(!string.IsNullOrWhiteSpace(serviceProductAuthRow.periodId) && !existPeriodIdList.Contains(serviceProductAuthRow.periodId))
|
|
|
+ if (!string.IsNullOrWhiteSpace(serviceProductAuthRow.periodId) && !existPeriodIdList.Contains(serviceProductAuthRow.periodId))
|
|
|
{
|
|
|
existPeriodIdList.Add(serviceProductAuthRow.periodId);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
List<ServicePeriod> periodOrder = periodList.Where(p => existPeriodIdList.Contains(p.periodId)).OrderBy(p => Int32.Parse(p.periodId)).ToList();
|
|
|
-
|
|
|
+
|
|
|
//combine period
|
|
|
- if (periodOrder.Count() > 0) {
|
|
|
+ if (periodOrder.Count() > 0)
|
|
|
+ {
|
|
|
|
|
|
//篩選出主週期(複數active主週期對策) ※最終篩出唯一一組 篩選原則:(1)由此產品有的副週期ID篩出 (2)若還有複數筆,則期間長者勝出
|
|
|
List<string> existMainPeriodIdList = new List<string>();
|
|
@@ -511,10 +550,10 @@ namespace TEAMModelOS.Controllers
|
|
|
periodZoneResult.startDate = (periodZone[0].startDate > mainPeriod.startDate) ? periodZone[0].startDate : mainPeriod.startDate;
|
|
|
periodZoneResult.endDate = (periodZone[0].endDate < mainPeriod.endDate) ? periodZone[0].endDate : mainPeriod.endDate;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
//return
|
|
|
ServiceProductResult serviceProductResult = new ServiceProductResult();
|
|
|
- if((serviceProduct.noperiod && periodZoneResult.startDate == 0 && periodZoneResult.endDate == 0) || (!serviceProduct.noperiod && periodZoneResult.startDate > 0 && periodZoneResult.endDate > 0))
|
|
|
+ if ((serviceProduct.noperiod && periodZoneResult.startDate == 0 && periodZoneResult.endDate == 0) || (!serviceProduct.noperiod && periodZoneResult.startDate > 0 && periodZoneResult.endDate > 0))
|
|
|
{
|
|
|
serviceProductResult.prodCode = serviceProduct.prodCode;
|
|
|
serviceProductResult.noperiod = serviceProduct.noperiod;
|
|
@@ -545,9 +584,9 @@ namespace TEAMModelOS.Controllers
|
|
|
foreach (ServiceProductAuth serviceProductAuthRow in serviceProduct.auth)
|
|
|
{
|
|
|
ServiceProductAuthHistory existServiceProductAuthHistory = serviceProductOrderList.Where(a => a.orderId == serviceProductAuthRow.orderId).FirstOrDefault();
|
|
|
- if(existServiceProductAuthHistory != null)
|
|
|
+ if (existServiceProductAuthHistory != null)
|
|
|
{
|
|
|
- if(!existServiceProductAuthHistory.periodIdList.Contains(serviceProductAuthRow.periodId))
|
|
|
+ if (!existServiceProductAuthHistory.periodIdList.Contains(serviceProductAuthRow.periodId))
|
|
|
{
|
|
|
existServiceProductAuthHistory.periodIdList.Add(serviceProductAuthRow.periodId);
|
|
|
}
|
|
@@ -567,7 +606,7 @@ namespace TEAMModelOS.Controllers
|
|
|
serviceProductOrderList.Add(serviceProductAuthHistoryRow);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
foreach (ServiceProductAuthHistory serviceProductOrderRow in serviceProductOrderList)
|
|
|
{
|
|
|
ServiceProductAuthHistoryStartEnd ServiceProductAuthHistoryStartEndRow = new ServiceProductAuthHistoryStartEnd();
|
|
@@ -627,5 +666,539 @@ namespace TEAMModelOS.Controllers
|
|
|
}
|
|
|
return periodZone;
|
|
|
}
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 取得某學校AClassOne授權及使用資料
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="request"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
+ [HttpPost("get-school-aclassone")]
|
|
|
+ public async Task<IActionResult> GetSchoolAclassoneInfo(JsonElement request)
|
|
|
+ {
|
|
|
+ if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
|
|
|
+
|
|
|
+ var clientContainer = _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School");
|
|
|
+ var response = await clientContainer.ReadItemStreamAsync(school_code.ToString(), new PartitionKey("Product"));
|
|
|
+ int total = 0; //可分配總數
|
|
|
+ int staNum = 0; //固定分配數
|
|
|
+ int dyncNum = 0; //動態分配數
|
|
|
+ List<string> staIds = new List<string>(); //固定分配學生ID列
|
|
|
+ List<string> dyncIds = new List<string>(); //動態分配學生ID列
|
|
|
+ if (response.Status == 200)
|
|
|
+ {
|
|
|
+ var json = await JsonDocument.ParseAsync(response.ContentStream);
|
|
|
+ if (json.RootElement.TryGetProperty("service", out JsonElement serviceJobj))
|
|
|
+ {
|
|
|
+ //取得active主週期
|
|
|
+ List<ServiceMainPeriod> activeMainPeriod = new List<ServiceMainPeriod>();
|
|
|
+ if (serviceJobj.TryGetProperty("mainperiod", out JsonElement mainperiodJobj))
|
|
|
+ {
|
|
|
+ foreach (var mainperiodRow in mainperiodJobj.EnumerateArray())
|
|
|
+ {
|
|
|
+ if (mainperiodRow.GetProperty("active").GetBoolean())
|
|
|
+ {
|
|
|
+ activeMainPeriod.Add(mainperiodRow.ToObject<ServiceMainPeriod>());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //取得active主週期的副週期
|
|
|
+ List<ServicePeriod> activePeriodOfMain = new List<ServicePeriod>();
|
|
|
+ if (serviceJobj.TryGetProperty("period", out JsonElement periodJobj))
|
|
|
+ {
|
|
|
+ foreach (var periodRow in periodJobj.EnumerateArray())
|
|
|
+ {
|
|
|
+ foreach (ServiceMainPeriod mainPeriodRow in activeMainPeriod)
|
|
|
+ {
|
|
|
+ if (periodRow.GetProperty("mainPeriodId").ToString() == mainPeriodRow.mainPeriodId)
|
|
|
+ {
|
|
|
+ activePeriodOfMain.Add(periodRow.ToObject<ServicePeriod>());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //取得AClassOne可用數量
|
|
|
+ if (serviceJobj.TryGetProperty("product", out JsonElement serviceProductJobj))
|
|
|
+ {
|
|
|
+ foreach (var serviceProductRow in serviceProductJobj.EnumerateArray())
|
|
|
+ {
|
|
|
+ //AClassOne買斷、週期
|
|
|
+ string prodCode = serviceProductRow.GetProperty("prodCode").GetString();
|
|
|
+ if (prodCode == "RYGVCPLY" || prodCode == "AEGMCPLY")
|
|
|
+ {
|
|
|
+ ServiceProductResult serviceProductResultRow = CalServiceProductAuth(activeMainPeriod, activePeriodOfMain, serviceProductRow.ToObject<ServiceProduct>());
|
|
|
+ total += serviceProductResultRow.avaliable;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //取得AClassOne固定分配數、動態分配數、固定分配學生ID
|
|
|
+ if (json.RootElement.TryGetProperty("aclassone", out JsonElement aclassoneJobj))
|
|
|
+ {
|
|
|
+ if (aclassoneJobj.ValueKind != JsonValueKind.Null)
|
|
|
+ {
|
|
|
+ if (aclassoneJobj.TryGetProperty("ids", out JsonElement ids) && ids.ValueKind != JsonValueKind.Null)
|
|
|
+ {
|
|
|
+ staIds = System.Text.Json.JsonSerializer.Deserialize<List<string>>(ids.ToJsonString());
|
|
|
+ staNum = staIds.Count;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dyncIds = GetSchoolDynamicAclassOneIDList(school_code.GetString());
|
|
|
+ dyncNum = dyncIds.Count;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return Ok(new { total, staNum, dyncNum, staIds, dyncIds });
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 取得某學校AClassOne動態可使用數
|
|
|
+ /// </summary>
|
|
|
+ public int GetSchoolDynamicAclassOne(string schoolCode)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ int result = 0;
|
|
|
+ string key = schoolCode + ":" + "AclassOne" + ":" + "dynamic";
|
|
|
+ var redisClient = _azureRedis.GetRedisClient(8);
|
|
|
+ var dyncount = redisClient.StringGet(key);
|
|
|
+ if (redisClient.KeyExists(key))
|
|
|
+ {
|
|
|
+ result = Int32.Parse(redisClient.StringGet(key));
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 取得某學校AClassOne動態已取用的ID List
|
|
|
+ /// </summary>
|
|
|
+ public List<string> GetSchoolDynamicAclassOneIDList(string schoolCode)
|
|
|
+ {
|
|
|
+ string key = schoolCode + ":" + "AclassOne" + ":" + "dynamicIds";
|
|
|
+ var redisClient = _azureRedis.GetRedisClient(8);
|
|
|
+ RedisValue[] redisResult = redisClient.SetMembers(key);
|
|
|
+ List<string> result = Array.ConvertAll(redisResult, x => (string)x).ToList();
|
|
|
+ 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>
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
+ [HttpPost("set-school-aclassone-dync")]
|
|
|
+ public IActionResult SetSchoolAclassoneDync(JsonElement request)
|
|
|
+ {
|
|
|
+ if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
|
|
|
+ request.TryGetProperty("student_id", out JsonElement student_id);
|
|
|
+ var redisClient = _azureRedis.GetRedisClient(8);
|
|
|
+ string key1 = school_code + ":" + "AclassOne" + ":" + "dynamicIds";
|
|
|
+ RedisValue[] redisIdsOriginal = redisClient.SetMembers(key1);
|
|
|
+ var resultIdsOriginal = Array.ConvertAll(redisIdsOriginal, x => (string)x).ToList();
|
|
|
+ redisClient.SetAdd(key1, student_id.GetString());
|
|
|
+ RedisValue[] redisIds = redisClient.SetMembers(key1);
|
|
|
+ var resultIds = Array.ConvertAll(redisIds, x => (string)x).ToList();
|
|
|
+ string key2 = school_code + ":" + "AclassOne" + ":" + "dynamic";
|
|
|
+ if (resultIds.Count > resultIdsOriginal.Count)
|
|
|
+ {
|
|
|
+ redisClient.StringDecrement(key2, 1);
|
|
|
+ }
|
|
|
+ string resultCount = redisClient.StringGet(key2);
|
|
|
+ return Ok(new { resultIds, resultCount });
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 設定某學校AClassOne固定分配授權學生
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="request"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
+ [HttpPost("set-school-aclasson-sta")]
|
|
|
+ public async Task<IActionResult> SetSchoolAclassoneStatic(JsonElement request)
|
|
|
+ {
|
|
|
+ if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
|
|
|
+ if (!request.TryGetProperty("student_ids", out JsonElement student_ids)) return BadRequest();
|
|
|
+ try
|
|
|
+ {
|
|
|
+ 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 = "";
|
|
|
+ var clientContainer = _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School");
|
|
|
+ var response = await clientContainer.ReadItemStreamAsync(school_code.ToString(), new PartitionKey("Product"));
|
|
|
+ if (response.Status == 200)
|
|
|
+ {
|
|
|
+ int total = 0; //(回傳值)可分配總數
|
|
|
+ int staNum = 0; //(回傳值)固定分配數
|
|
|
+ int dyncNum = 0; //(回傳值)動態分配數
|
|
|
+ List<string> staIds = new List<string>(); //(回傳值)固定學生ID列
|
|
|
+ List<string> dyncIds = new List<string>(); //(回傳值)動態學生ID列
|
|
|
+ using (Stream stream = response.ContentStream)
|
|
|
+ {
|
|
|
+ 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
|
|
|
+ staIds = 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 keys = school_code.GetString() + ":" + "AclassOne" + ":" + "dynamic";
|
|
|
+ int updDynAclassCount = (dynamicAclassCount - dyncNum > 0) ? dynamicAclassCount - dyncNum : 0;
|
|
|
+ redisClient.StringSet(keys, updDynAclassCount);
|
|
|
+ string keyd = school_code.GetString() + ":" + "AclassOne" + ":" + "dynamicIds";
|
|
|
+ RedisValue[] redisIds = redisClient.SetMembers(keyd);
|
|
|
+ dyncIds = Array.ConvertAll(redisIds, x => (string)x).ToList();
|
|
|
+
|
|
|
+ return Ok(new { status, err, total, staNum, dyncNum, staIds, dyncIds });
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ status = 1;
|
|
|
+ err = "AClassOne has no authorization.";
|
|
|
+ return Ok(new { status, err });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return BadRequest();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ return BadRequest();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 回收某學校AClassOne固定分配、動態分配授權學生
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="request"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
+ [HttpPost("recall-school-aclasson")]
|
|
|
+ public async Task<IActionResult> RecallSchoolAclassone(JsonElement request)
|
|
|
+ {
|
|
|
+ if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
|
|
|
+ string action = "all"; //預設回收:固定及動態均回收 sta:回收固定 dync:回收動態
|
|
|
+ if (request.TryGetProperty("mode", out JsonElement mode))
|
|
|
+ {
|
|
|
+ if(mode.GetString() == "sta" || mode.GetString() == "dync")
|
|
|
+ {
|
|
|
+ action = mode.GetString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ int status = 0;
|
|
|
+ string err = "";
|
|
|
+ var redisClient = _azureRedis.GetRedisClient(8);
|
|
|
+ string keys = school_code.GetString() + ":" + "AclassOne" + ":" + "dynamic";
|
|
|
+ string keyd = school_code.GetString() + ":" + "AclassOne" + ":" + "dynamicIds";
|
|
|
+ var clientContainer = _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School");
|
|
|
+ var response = await clientContainer.ReadItemStreamAsync(school_code.ToString(), new PartitionKey("Product"));
|
|
|
+ if (response.Status == 200)
|
|
|
+ {
|
|
|
+ int total = 0; //(回傳值)可分配總數
|
|
|
+ int staNum = 0; //(回傳值)固定分配數
|
|
|
+ int dyncNum = 0; //(回傳值)動態分配數
|
|
|
+ List<string> staIds = new List<string>(); //(回傳值)固定學生ID列
|
|
|
+ List<string> dyncIds = new List<string>(); //(回傳值)動態學生ID列
|
|
|
+ using (Stream stream = response.ContentStream)
|
|
|
+ {
|
|
|
+ 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;
|
|
|
+ staNum = schoolProduct.aclassone.used;
|
|
|
+ staIds = schoolProduct.aclassone.ids;
|
|
|
+ dyncNum = (int)GetSchoolDynamicAclassOneIDCount(school_code.GetString());
|
|
|
+ dyncIds = GetSchoolDynamicAclassOneIDList(school_code.GetString());
|
|
|
+ switch (action)
|
|
|
+ {
|
|
|
+ case "sta":
|
|
|
+ staIds = schoolProduct.aclassone.ids = new List<string>();
|
|
|
+ staNum = schoolProduct.aclassone.used = 0;
|
|
|
+ await clientContainer.ReplaceItemAsync<SchoolProduct>(schoolProduct, schoolProduct.id, new PartitionKey("Product"));
|
|
|
+ int updDynAclassCount = (total - dyncNum > 0) ? total - dyncNum : 0;
|
|
|
+ redisClient.StringSet(keys, updDynAclassCount);
|
|
|
+ break;
|
|
|
+ case "dync": //動態回收
|
|
|
+ dyncNum = 0;
|
|
|
+ dyncIds = new List<string>();
|
|
|
+ redisClient.StringSet(keys, total - staNum);
|
|
|
+ redisClient.KeyDelete(keyd);
|
|
|
+ break;
|
|
|
+ case "all": //全回收
|
|
|
+ staIds = schoolProduct.aclassone.ids = new List<string>();
|
|
|
+ staNum = schoolProduct.aclassone.used = 0;
|
|
|
+ await clientContainer.ReplaceItemAsync<SchoolProduct>(schoolProduct, schoolProduct.id, new PartitionKey("Product"));
|
|
|
+ dyncNum = 0;
|
|
|
+ dyncIds = new List<string>();
|
|
|
+ redisClient.StringSet(keys, total);
|
|
|
+ redisClient.KeyDelete(keyd);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return Ok(new { status, err, total, staNum, dyncNum, staIds, dyncIds });
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ status = 1;
|
|
|
+ err = "AClassOne has no authorization.";
|
|
|
+ return Ok(new { status, err });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return BadRequest();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 教師空間
|
|
|
+ /// </summary>
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
+ [HttpPost("teacher-space")]
|
|
|
+ public async Task<IActionResult> TeacherSpace(JsonElement request)
|
|
|
+ {
|
|
|
+ // 必要檢查
|
|
|
+ if (!request.TryGetProperty("school_code", out JsonElement code)) return BadRequest();
|
|
|
+ if (!request.TryGetProperty("action", out JsonElement type)) return BadRequest();
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ // [變數宣告]
|
|
|
+ string school_code = code.ToString(); // 學校簡碼
|
|
|
+ string action = type.ToString(); // 功能分類
|
|
|
+ string queryText = ""; // 統一sql文記憶體
|
|
|
+
|
|
|
+ // response
|
|
|
+ string status = "0";
|
|
|
+ string err = "";
|
|
|
+ List<string> errTeachers = new List<string>();
|
|
|
+
|
|
|
+ //[學校空間]
|
|
|
+ var blobClient = _azureStorage.GetBlobContainerClient(school_code.ToString());
|
|
|
+ long? docSize = await blobClient.GetBlobsSize("doc");
|
|
|
+ long? videoSize = await blobClient.GetBlobsSize("video");
|
|
|
+ long? imageSize = await blobClient.GetBlobsSize("image");
|
|
|
+ long? paperSize = await blobClient.GetBlobsSize("paper");
|
|
|
+ long? itemSize = await blobClient.GetBlobsSize("item");
|
|
|
+ long? otherSize = await blobClient.GetBlobsSize("other");
|
|
|
+ long? studentSize = await blobClient.GetBlobsSize("student");
|
|
|
+ int avaliable = this.baseSpaceSize; // (G) 目前學校申請空間總數
|
|
|
+ int teacherSpace = 0; // 教師可設定的空間量(G)
|
|
|
+ int usedSpace = 0;//已被使用的空間量(G)
|
|
|
+
|
|
|
+ // 取得學校目前的總空間數(G)
|
|
|
+ queryText = $"SELECT p.prodCode, p.avaliable FROM c JOIN p IN c.service.product WHERE c.id = '{school_code}' AND p.prodCode = 'IPALYEIY'";
|
|
|
+ await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Product") }))
|
|
|
+ {
|
|
|
+ using var jsoncm = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
+ if (jsoncm.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ {
|
|
|
+ foreach (var obj in jsoncm.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ {
|
|
|
+ avaliable += obj.GetProperty("avaliable").GetInt32();
|
|
|
+ }
|
|
|
+
|
|
|
+ docSize = docSize != null ? docSize : 0;
|
|
|
+ videoSize = videoSize != null ? videoSize : 0;
|
|
|
+ imageSize = imageSize != null ? imageSize : 0;
|
|
|
+ paperSize = paperSize != null ? paperSize : 0;
|
|
|
+ itemSize = itemSize != null ? itemSize : 0;
|
|
|
+ otherSize = otherSize != null ? otherSize : 0;
|
|
|
+ studentSize = studentSize != null ? studentSize : 0;
|
|
|
+ usedSpace = Convert.ToInt32(Math.Ceiling((double)((docSize + videoSize + imageSize + paperSize + itemSize + otherSize + studentSize) / bytes)));
|
|
|
+ teacherSpace = avaliable - usedSpace;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (action)
|
|
|
+ {
|
|
|
+ case "baseSpace": // 現在的教師空間
|
|
|
+ return Ok(new {
|
|
|
+ status,
|
|
|
+ avaliable = avaliable.ToString(),
|
|
|
+ usedSpace = usedSpace.ToString()
|
|
|
+ });
|
|
|
+ case "upd": // 修改教師空間
|
|
|
+ // [二次檢核]
|
|
|
+ if (!request.TryGetProperty("teachers", out JsonElement list)) return BadRequest();
|
|
|
+ if (list.GetArrayLength() == 0) return BadRequest();
|
|
|
+
|
|
|
+ // 教師設定總數
|
|
|
+ int setSpaceTotal = 0;
|
|
|
+
|
|
|
+ // 教師List
|
|
|
+ JsonElement.ArrayEnumerator teachers = request.GetProperty("teachers").EnumerateArray();
|
|
|
+ List<string> ids = new List<string>();
|
|
|
+ foreach (var obj in teachers) {
|
|
|
+ ids.Add(obj.GetProperty("id").ToString());
|
|
|
+ setSpaceTotal += String.IsNullOrEmpty(obj.GetProperty("size").ToString()) ? 0 : Convert.ToInt32(obj.GetProperty("size").ToString());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 檢核總數是否超過
|
|
|
+ if (setSpaceTotal > teacherSpace)
|
|
|
+ {
|
|
|
+ status = "1"; // 要設定的空間總數大於目前學校有的
|
|
|
+ err = $"設定總量({setSpaceTotal}G)超過目前空間({teacherSpace}G)";
|
|
|
+ return Ok(new { status, err });
|
|
|
+ }
|
|
|
+
|
|
|
+ queryText = $"select * from c where c.id in ({string.Join(",", ids.Select(o => $"'{o}'"))})";
|
|
|
+
|
|
|
+ await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{school_code}") }))
|
|
|
+ {
|
|
|
+ using var jsoncm = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
+ if (jsoncm.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0 && count.GetInt16() == list.GetArrayLength())
|
|
|
+ {
|
|
|
+
|
|
|
+ List<SchoolTeacher> teachersInschool = new List<SchoolTeacher>();
|
|
|
+ foreach (var obj in jsoncm.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ {
|
|
|
+ teachersInschool.Add(obj.ToObject<SchoolTeacher>());
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach (var obj in teachers)
|
|
|
+ {
|
|
|
+ SchoolTeacher teacher = teachersInschool.Where(t => t.id == obj.GetProperty("id").ToString()).FirstOrDefault<SchoolTeacher>();
|
|
|
+ int orgTeacherSize = teacher.size;
|
|
|
+ teacher.size = Convert.ToInt32(obj.GetProperty("size").ToString());
|
|
|
+
|
|
|
+ // 修改DB裡Teacher的size
|
|
|
+ var response = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(teacher.id, new PartitionKey("Base"));
|
|
|
+ if (response.Status == 200)
|
|
|
+ {
|
|
|
+ var json = await JsonDocument.ParseAsync(response.ContentStream);
|
|
|
+
|
|
|
+ //軟體
|
|
|
+ Teacher teacherHimself = json.ToObject<Teacher>();
|
|
|
+ teacherHimself.size = teacherHimself.size - orgTeacherSize + teacher.size;
|
|
|
+
|
|
|
+ //最後一起修改
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Teacher>(teacherHimself, teacherHimself.id, new PartitionKey("Base"));
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync<SchoolTeacher>(teacher, obj.GetProperty("id").ToString(), new PartitionKey($"Teacher-{school_code}"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ status = "3";
|
|
|
+ err = "有老師不存在於 Teacher 的DB";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // 有不存在的的老師ID
|
|
|
+ status = "2";
|
|
|
+ err = "有不存在的的老師ID";
|
|
|
+
|
|
|
+ List<string> teachersInschool = new List<string>();
|
|
|
+ foreach (var obj in jsoncm.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ {
|
|
|
+ teachersInschool.Add(obj.GetProperty("id").ToString());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 差集處理
|
|
|
+ errTeachers = ids.Except(teachersInschool).ToList();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Ok(new { status, err, errTeachers });
|
|
|
+ case "retract": // 收回教師空間
|
|
|
+ // [取得DB資料]
|
|
|
+ queryText = "select * from c ";
|
|
|
+ string record = "0";
|
|
|
+
|
|
|
+ await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{school_code}") }))
|
|
|
+ {
|
|
|
+ using var jsoncm = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
+ if (jsoncm.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ {
|
|
|
+ // 修改的筆數
|
|
|
+ record = count.ToString();
|
|
|
+ List<SchoolTeacher> teachersInschool = new List<SchoolTeacher>();
|
|
|
+ foreach (var obj in jsoncm.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ {
|
|
|
+ teachersInschool.Add(obj.ToObject<SchoolTeacher>());
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach (SchoolTeacher teacher in teachersInschool)
|
|
|
+ {
|
|
|
+ // 修改DB裡School的老師size
|
|
|
+ int teacherSizeInSchool = teacher.size;
|
|
|
+ teacher.size = 0;
|
|
|
+
|
|
|
+
|
|
|
+ // 修改DB裡Teacher的size
|
|
|
+ var response = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(teacher.id, new PartitionKey("Base"));
|
|
|
+ if (response.Status == 200)
|
|
|
+ {
|
|
|
+ var json = await JsonDocument.ParseAsync(response.ContentStream);
|
|
|
+
|
|
|
+ //軟體
|
|
|
+ Teacher teacherHimself = json.ToObject<Teacher>();
|
|
|
+ teacherHimself.size -= teacherSizeInSchool;
|
|
|
+
|
|
|
+ // 最後一起修改
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync<SchoolTeacher>(teacher, teacher.id, new PartitionKey($"Teacher-{school_code}"));
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<Teacher>(teacherHimself, teacherHimself.id, new PartitionKey("Base"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ status = "3";
|
|
|
+ err = "有老師不存在於 Teacher 的DB";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return Ok(new { status, record });
|
|
|
+ default:
|
|
|
+ return BadRequest(); // 不存在的功能BadRequest
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ return BadRequest();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|