|
@@ -45,7 +45,8 @@ namespace TEAMModelOS.Controllers
|
|
private readonly double bytes = 1073741824;
|
|
private readonly double bytes = 1073741824;
|
|
private readonly int redisAclassoneDbNum = 8; //AclassOne Redis DB號
|
|
private readonly int redisAclassoneDbNum = 8; //AclassOne Redis DB號
|
|
private readonly IConfiguration _configuration;
|
|
private readonly IConfiguration _configuration;
|
|
- public SchoolController(AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration)
|
|
|
|
|
|
+ private readonly CoreAPIHttpService _coreAPIHttpService;
|
|
|
|
+ public SchoolController(CoreAPIHttpService coreAPIHttpService,AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration)
|
|
{
|
|
{
|
|
_azureCosmos = azureCosmos;
|
|
_azureCosmos = azureCosmos;
|
|
_azureStorage = azureStorage;
|
|
_azureStorage = azureStorage;
|
|
@@ -53,6 +54,7 @@ namespace TEAMModelOS.Controllers
|
|
_dingDing = dingDing;
|
|
_dingDing = dingDing;
|
|
_option = option?.Value;
|
|
_option = option?.Value;
|
|
_configuration = configuration;
|
|
_configuration = configuration;
|
|
|
|
+ _coreAPIHttpService = coreAPIHttpService;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// <summary>
|
|
/// 修改学校信息
|
|
/// 修改学校信息
|
|
@@ -1407,6 +1409,7 @@ namespace TEAMModelOS.Controllers
|
|
avaliable = school.size;
|
|
avaliable = school.size;
|
|
// 取得學校目前的總空間數(G)
|
|
// 取得學校目前的總空間數(G)
|
|
teacherSpace = avaliable - usedSpace;
|
|
teacherSpace = avaliable - usedSpace;
|
|
|
|
+ List<SchoolTeacher> teachersInschool = new List<SchoolTeacher>();
|
|
switch (action)
|
|
switch (action)
|
|
{
|
|
{
|
|
case "baseSpace": // 現在的教師空間
|
|
case "baseSpace": // 現在的教師空間
|
|
@@ -1442,61 +1445,41 @@ namespace TEAMModelOS.Controllers
|
|
}
|
|
}
|
|
|
|
|
|
queryText = $"select * from c where c.id in ({string.Join(",", ids.Select(o => $"'{o}'"))})";
|
|
queryText = $"select * from c where c.id in ({string.Join(",", ids.Select(o => $"'{o}'"))})";
|
|
-
|
|
|
|
|
|
+
|
|
await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{school_code}") }))
|
|
await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: queryText, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{school_code}") }))
|
|
{
|
|
{
|
|
using var jsoncm = await JsonDocument.ParseAsync(item.ContentStream);
|
|
using var jsoncm = await JsonDocument.ParseAsync(item.ContentStream);
|
|
- if (jsoncm.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0 && count.GetInt16() == list.GetArrayLength())
|
|
|
|
|
|
+ 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());
|
|
|
|
|
|
- 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(Constant.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;
|
|
|
|
- //最後一起修改
|
|
|
|
- //huanghb 2021,7.21修改 ,不用再统计到Teacher-Base中 ,Teacher-Base只记录教师自己的空间大小,并包含其他学校赠与的空间,其他学校的赠与空间放在School 表的Teacher-hbcn(SchoolTeacher)中SchoolTeacher
|
|
|
|
- //,并在教师登陆的时候 一并计算个人空间和总空间大小。其中总空间大小包含(个人空间+多个学校累加的空间大小,并且如果退出或者被移除Teacher-Base 的"schools": [],为空,则已经实现自动回收)
|
|
|
|
- // await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacherHimself, teacherHimself.id, new PartitionKey("Base"));
|
|
|
|
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<SchoolTeacher>(teacher, obj.GetProperty("id").ToString(), new PartitionKey($"Teacher-{school_code}"));
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- status = "3";
|
|
|
|
- err = "有老師不存在於 Teacher 的DB";
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ // 修改DB裡Teacher的size
|
|
|
|
+ var response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.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;
|
|
|
|
+ //最後一起修改
|
|
|
|
+ //huanghb 2021,7.21修改 ,不用再统计到Teacher-Base中 ,Teacher-Base只记录教师自己的空间大小,并包含其他学校赠与的空间,其他学校的赠与空间放在School 表的Teacher-hbcn(SchoolTeacher)中SchoolTeacher
|
|
|
|
+ //,并在教师登陆的时候 一并计算个人空间和总空间大小。其中总空间大小包含(个人空间+多个学校累加的空间大小,并且如果退出或者被移除Teacher-Base 的"schools": [],为空,则已经实现自动回收)
|
|
|
|
+ // await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacherHimself, teacherHimself.id, new PartitionKey("Base"));
|
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<SchoolTeacher>(teacher, obj.GetProperty("id").ToString(), new PartitionKey($"Teacher-{school_code}"));
|
|
}
|
|
}
|
|
else
|
|
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();
|
|
|
|
|
|
+ status = "3";
|
|
|
|
+ err = "有老師不存在於 Teacher 的DB";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return Ok(new { status, err, errTeachers });
|
|
return Ok(new { status, err, errTeachers });
|
|
@@ -1512,7 +1495,7 @@ namespace TEAMModelOS.Controllers
|
|
{
|
|
{
|
|
// 修改的筆數
|
|
// 修改的筆數
|
|
record = count.ToString();
|
|
record = count.ToString();
|
|
- List<SchoolTeacher> teachersInschool = new List<SchoolTeacher>();
|
|
|
|
|
|
+ //List<SchoolTeacher> teachersInschool = new List<SchoolTeacher>();
|
|
foreach (var obj in jsoncm.RootElement.GetProperty("Documents").EnumerateArray())
|
|
foreach (var obj in jsoncm.RootElement.GetProperty("Documents").EnumerateArray())
|
|
{
|
|
{
|
|
teachersInschool.Add(obj.ToObject<SchoolTeacher>());
|
|
teachersInschool.Add(obj.ToObject<SchoolTeacher>());
|
|
@@ -1567,5 +1550,63 @@ namespace TEAMModelOS.Controllers
|
|
return BadRequest();
|
|
return BadRequest();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
|
+ [HttpPost("teacher-import-manage")]
|
|
|
|
+ [Authorize(Roles = "IES")]
|
|
|
|
+ [AuthToken( Roles ="admin,teacher")]
|
|
|
|
+ public async Task<IActionResult> TeacherImportManage(JsonElement request) {
|
|
|
|
+ if (!request.TryGetProperty("opt", out JsonElement _opt)) { return BadRequest(); }
|
|
|
|
+ if (!request.TryGetProperty("schoolId", out JsonElement _schoolId)) { return BadRequest(); }
|
|
|
|
+ if (!request.TryGetProperty("teachers", out JsonElement _teachers) || !_teachers.ValueKind.Equals(JsonValueKind.Array)) { return BadRequest(); }
|
|
|
|
+ TeacherImport teacherImport = null;
|
|
|
|
+ switch ($"{_opt}") {
|
|
|
|
+ case "upsert":
|
|
|
|
+ List<CoreUser> coreUsers = null;
|
|
|
|
+ List<ImportTeacher> teachers = _teachers.ToObject<List<ImportTeacher>>();
|
|
|
|
+ var ids = teachers.Where(x => !string.IsNullOrWhiteSpace(x.id)).Select(x => x.id);
|
|
|
|
+ if (ids.Any()) {
|
|
|
|
+ var content = new StringContent(ids.ToJsonString(), Encoding.UTF8, "application/json");
|
|
|
|
+ string json = await _coreAPIHttpService.GetUserInfos(content);
|
|
|
|
+ if (!string.IsNullOrWhiteSpace(json)) {
|
|
|
|
+ coreUsers = json.ToObject<List<CoreUser>>();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ string sql = $"select value(c.id) from c where c.id in ({string.Join(",",coreUsers.Select(x=>$"'{x.id}'"))}) ";
|
|
|
|
+ List<string> idsInSchool = new List<string>();
|
|
|
|
+ await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
|
|
|
|
+ .GetItemQueryIterator<string>(queryText:sql,requestOptions:new QueryRequestOptions { PartitionKey= new PartitionKey($"Teacher-{_schoolId}")})) {
|
|
|
|
+ idsInSchool.Add(item);
|
|
|
|
+ }
|
|
|
|
+ if (coreUsers.Any())
|
|
|
|
+ {
|
|
|
|
+ teachers.ForEach(t => {
|
|
|
|
+ string id= idsInSchool.Find(x => x.Equals(t.id));
|
|
|
|
+ if (!string.IsNullOrWhiteSpace(id)) {
|
|
|
|
+ t.status = "join";
|
|
|
|
+ }
|
|
|
|
+ CoreUser coreUser = coreUsers.Find(x => x.searchKey.Equals(t.id));
|
|
|
|
+ if (coreUser != null) {
|
|
|
|
+ t.id = coreUser.id;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ teacherImport = new TeacherImport {id = $"{_schoolId}", code = "TeacherImport", pk = "TeacherImport", teachers=teachers};
|
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(teacherImport, new PartitionKey("TeacherImport"));
|
|
|
|
+ break;
|
|
|
|
+ case "find":
|
|
|
|
+ Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync($"{_schoolId}", new PartitionKey("TeacherImport"));
|
|
|
|
+ if (response.Status == 200)
|
|
|
|
+ {
|
|
|
|
+ teacherImport = JsonDocument.Parse(response.Content).RootElement.ToObject<TeacherImport>();
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ teacherImport= new TeacherImport { id=$"{_schoolId}",code= "TeacherImport",pk= "TeacherImport",teachers= new List<ImportTeacher>() };
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ return Ok(new { teacherImport });
|
|
|
|
+
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|