CrazyIter_Bin vor 3 Jahren
Ursprung
Commit
318da1497f

+ 106 - 1
TEAMModelAPI/Controllers/School/TeacherController.cs

@@ -28,6 +28,7 @@ using Azure.Storage.Blobs.Models;
 using HTEXLib.COMM.Helpers;
 using Microsoft.AspNetCore.Authorization;
 using System.Net.Http;
+using System.ComponentModel.DataAnnotations;
 
 namespace TEAMModelAPI.Controllers
 {
@@ -105,7 +106,7 @@ namespace TEAMModelAPI.Controllers
             teachers.Select(x => new { x.id, x.name, x.picture, x.job, x.subjectIds, x.roles }).ToList().ForEach(x => {
                 var  coreUser= coreUsers.Find(c=>c.id.Equals(x.id));
                 if (coreUser != null) {
-                    tchs.Add(new {x.id,x.name,x.picture,x.job,x.subjectIds,x.roles,coreUser.searchKey });
+                    tchs.Add(new {x.id,coreUser.name, coreUser.picture,x.job,x.subjectIds,x.roles,coreUser.searchKey });
                 }
             });
             return Ok(new
@@ -158,5 +159,109 @@ namespace TEAMModelAPI.Controllers
             }
         }
 
+         
+        /// <summary>
+        /// 批量导入教师信息,并加入学校。可以导入学科,但需要填写学段id
+        /// </summary>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("import-school-teacher")]
+        [ApiToken(Auth = "1502", Name = "学校教师信息", RW = "R", Limit = false)]
+        public async Task<IActionResult> ImportSchoolTeacher(JsonElement json) {
+            //如果需要同时导入学科,则需要填写学段
+            var (id, school) = HttpContext.GetApiTokenInfo();
+            if (!json.TryGetProperty("teachers", out JsonElement _teachers) || !_teachers.ValueKind.Equals(JsonValueKind.Array)) { return BadRequest(); }
+            IEnumerable<ImportTech> teachers = _teachers.ToObject<List<ImportTech>>();
+            var result = teachers.Valid();
+            if (!result.isVaild)
+            {
+                return Ok(new { error = 2, msg = result });
+            }
+            List<string> searchKey = teachers.Select(x=>x.id).ToList();
+            var keys = searchKey.Where(x => !string.IsNullOrWhiteSpace(x));
+            var content = new StringContent(keys.ToJsonString(), Encoding.UTF8, "application/json");
+            string ujson = await _coreAPIHttpService.GetUserInfos(content);
+            List<CoreUser> coreUsers = new List<CoreUser>();
+            if (!string.IsNullOrWhiteSpace(ujson))
+            {
+                coreUsers = ujson.ToObject<List<CoreUser>>();
+            }
+            IEnumerable<string> unexist = new List<string>();
+            if (coreUsers.Any())
+            {
+                unexist = searchKey.Except(coreUsers.Select(x => x.id));
+            }
+            else
+            {
+                return Ok(new { error = 1, msg = "没有找到对应的教师信息!" });
+            }
+            var exist = coreUsers.Select(x => x.id);
+            //注册了账号的教师
+            teachers = teachers.Where(x => exist.Contains(x.id));
+           
+            List<Teacher> teachersList = new List<Teacher>();
+            List<SchoolTeacher>  schoolTeachers = new List<SchoolTeacher>();
+            string sql = $"select value(c) from c where c.id in ({string.Join(",",teachers.Select(x=>$"'{x.id}'"))})";
+            await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher)
+                .GetItemQueryIterator<Teacher>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") })) {
+                teachersList.Add(item);
+            }
+            await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
+              .GetItemQueryIterator<SchoolTeacher>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Teacher-{school}") }))
+            {
+                schoolTeachers.Add(item);
+            }
+            long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+            School data = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(school, new PartitionKey("Base"));
+            foreach (var item in teachers) {
+                var teacher = teachersList.Find(x => x.id.Equals(item.id));
+                if (teacher != null)
+                {
+                    var sch= teacher.schools?.Find(x => x.schoolId.Equals(school));
+                    if (sch == null) {
+                        if (teacher.schools.IsNotEmpty())
+                        {
+                            teacher.schools.Add(new Teacher.TeacherSchool {schoolId= school,name=data.name,status="join",time= now ,picture=data.picture,areaId=data.areaId});
+                        }
+                        else {
+                            teacher.defaultSchool = school;
+                            teacher.size = teacher.size + 1 ;
+                            teacher.schools = new List<Teacher.TeacherSchool> { new Teacher.TeacherSchool { schoolId = school, name = data.name, status = "join", time = now, picture = data.picture, areaId = data.areaId } };
+                        }
+                    }
+                }
+                else {
+                    var coreUser=  coreUsers.Find(x => x.id.Equals(item.id));
+                    teacher = new Teacher
+                    {
+                        id = coreUser.id,
+                        name = coreUser.name,
+                        picture = coreUser.picture,
+                        defaultSchool=school,
+                        size=2,
+                        code="Base",
+                        pk="Base",
+                        schools = new List<Teacher.TeacherSchool> { new Teacher.TeacherSchool { schoolId = school, name = data.name, status = "join", time = now, picture = data.picture, areaId = data.areaId } }
+                    };
+                }
+            }
+            return Ok();
+        }
+    }
+    public class ImportTech {
+        [Required(ErrorMessage = "教师id必须设置")]
+        public string id { get; set; }
+        public List<ImportTechSubject> subjects { get; set; }
+        [ RegularExpression(@"[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}", ErrorMessage = "学段的uuid格式错误!")]
+        public string periodId { get; set; }
+        public string job { get; set; }
     }
+    public class ImportTechSubject
+    {
+        [RegularExpression(@"[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}", ErrorMessage = "科目的uuid格式错误!")]
+        public string id { get; set; }
+        [Required(ErrorMessage = "科目名称 必须设置")]
+        public string name { get; set; }
+    }
+
 }

+ 1 - 1
TEAMModelOS.FunctionV4/CosmosDB/TriggerCorrect.cs

@@ -34,8 +34,8 @@ namespace TEAMModelOS.FunctionV4
                 {
                     try
                     {
-                        await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
                         await table_cancel.DeleteSingle<ChangeRecord>(record.PartitionKey, record.RowKey);
+                        await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
                     }
                     catch (Exception)
                     {

+ 1 - 1
TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs

@@ -38,8 +38,8 @@ namespace TEAMModelOS.FunctionV4
                     {
                         try
                         {
-                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
                             await table_cancel.DeleteSingle<ChangeRecord>(record.PartitionKey, record.RowKey);
+                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
                         }
                         catch (Exception)
                         {

+ 2 - 1
TEAMModelOS.FunctionV4/CosmosDB/TriggerExamLite.cs

@@ -36,8 +36,9 @@ namespace TEAMModelOS.FunctionV4
                     {
                         try
                         {
-                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
                             await table_cancel.DeleteSingle<ChangeRecord>(record.PartitionKey, record.RowKey);
+                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
+                           
                         }
                         catch (Exception)
                         {

+ 2 - 1
TEAMModelOS.FunctionV4/CosmosDB/TriggerHomework.cs

@@ -36,8 +36,9 @@ namespace TEAMModelOS.FunctionV4
                     {
                         try
                         {
-                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
                             await table_cancel.DeleteSingle<ChangeRecord>(record.PartitionKey, record.RowKey);
+                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
+                          
                         }
                         catch (Exception)
                         {

+ 2 - 1
TEAMModelOS.FunctionV4/CosmosDB/TriggerStudy.cs

@@ -36,8 +36,9 @@ namespace TEAMModelOS.FunctionV4
                     {
                         try
                         {
-                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
                             await table_cancel.DeleteSingle<ChangeRecord>(record.PartitionKey, record.RowKey);
+                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
+                          
                         }
                         catch (Exception ) {
                             continue;

+ 2 - 1
TEAMModelOS.FunctionV4/CosmosDB/TriggerSurvey.cs

@@ -44,8 +44,9 @@ namespace TEAMModelOS.FunctionV4
                     {
                         try
                         {
-                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
                             await table_cancel.DeleteSingle<ChangeRecord>(record.PartitionKey, record.RowKey);
+                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
+                         
                         }
                         catch (Exception)
                         {

+ 1 - 1
TEAMModelOS.FunctionV4/CosmosDB/TriggerVote.cs

@@ -41,8 +41,8 @@ namespace TEAMModelOS.FunctionV4
                     {
                         try
                         {
-                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
                             await table_cancel.DeleteSingle<ChangeRecord>(record.PartitionKey, record.RowKey);
+                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
                         }
                         catch (Exception)
                         {

+ 38 - 7
TEAMModelOS.FunctionV4/ServiceBus/ActiveTaskTopic.cs

@@ -1026,19 +1026,50 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                                 msgs.Add(update);
                                 break;
                             case "up-baseinfo":///更新基础信息,名称科目,年级,分类等,不能删除 ,由update-lesson-baseinfo 触发。
-                                if (updates.Count > 1)
-                                {
-                                    isReplace = true;
-                                }
-                                else
-                                {
-                                    isReplace = false;
+                                isReplace = true;
+                                msgs.Add(update);
+                                break;
+                            case "up-expire"://消除过期时间,消除后需要取消已经排程的通知订阅
+                                try {
+                                    var table = _azureStorage.GetCloudTableClient().GetTableReference("ChangeRecord");
+                                    List<ChangeRecord> records = await table.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", lessonRecord.id } });
+                                    foreach (var record in records)
+                                    {
+                                        try
+                                        {
+                                            await table.DeleteSingle<ChangeRecord>(record.PartitionKey, record.RowKey);
+                                            await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
+                                        }
+                                        catch (Exception)
+                                        {
+                                            continue;
+                                        }
+                                    }
+                                } catch (Exception) {
+                                    break;
                                 }
+                                isReplace = true;
                                 msgs.Add(update);
                                 break;
                             case "delete":
                                 try
                                 {
+                                    if (lessonRecord.expire > 0) {
+                                        var table = _azureStorage.GetCloudTableClient().GetTableReference("ChangeRecord");
+                                        List<ChangeRecord> records = await table.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", lessonRecord.id } });
+                                        foreach (var record in records)
+                                        {
+                                            try
+                                            {
+                                                await table.DeleteSingle<ChangeRecord>(record.PartitionKey, record.RowKey);
+                                                await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
+                                            }
+                                            catch (Exception)
+                                            {
+                                                continue;
+                                            }
+                                        }
+                                    }
                                     await client.GetContainer(Constant.TEAMModelOS, tbname).DeleteItemAsync<LessonRecord>(lessonId, new PartitionKey(code));
                                     await _azureStorage.GetBlobServiceClient().DeleteBlobs(_dingDing, blobname, new List<string> { $"records/{_lessonId}" });
                                     await client.GetContainer(Constant.TEAMModelOS, tbname).DeleteItemStreamAsync(lessonRecord.id,new PartitionKey ($"Bloblog-{blobname}"));

+ 13 - 1
TEAMModelOS/Controllers/Both/LessonRecordController.cs

@@ -370,6 +370,18 @@ namespace TEAMModelOS.Controllers
                         break;
                     }
                 }
+                long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                //查询时处理已经过期的课例。防止ServiceBus未触发的。
+                var expireRecords= lessonRecords.Where(x=> x.expire > 0 && now > x.expire);
+                foreach (var item in expireRecords) {
+                    //item.status = 404;
+                    //await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync(item, item.id, new PartitionKey(item.code));
+                    var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
+                    var messageChange = new ServiceBusMessage(new { delete_id=item.id,tmdid=item.tmdid,scope=item.scope,opt="delete",school=item.school }.ToJsonString());
+                    messageChange.ApplicationProperties.Add("name", "LessonRecordEvent");
+                    await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageChange);
+                    return Ok(new { status = 200 });
+                }
                 var tmdids = lessonRecords.Select(x => x.tmdid).ToHashSet();
                 if (tmdids != null && tmdids.Count > 0)
                 {
@@ -406,7 +418,7 @@ namespace TEAMModelOS.Controllers
                 }
                 return Ok(new { currCount = lessonRecords.Count, continuationToken, lessonRecords });
             }
-            catch (Exception ex)
+            catch (Exception )
             {
                 continuationToken = null;
                 return Ok(new { currCount = 0, continuationToken = continuationToken, lessonRecords });

+ 3 - 2
TEAMModelOS/Controllers/XTest/TestController.cs

@@ -655,9 +655,10 @@ namespace TEAMModelOS.Controllers
 
 
             try {
-                BlobDownloadResult baseblobDownload = await _azureStorage.GetBlobContainerClient("hbcn").GetBlobClient($"/111/IES/base.json").DownloadContentAsync();
+                BlobDownloadResult baseblobDownload = await _azureStorage.GetBlobContainerClient("habook").GetBlobClient($"/records/299813002894381056/IES/Base.json").DownloadContentAsync();
                 LessonBase lessonBase = baseblobDownload.Content.ToObjectFromJson<LessonBase>();
-            
+                return Ok(lessonBase);
+
             } catch (RequestFailedException ex)when(ex.Status==404) {
                 return BadRequest("文件不存在!");
             }