소스 검색

Merge branch 'master' into develop

CrazyIter_Bin 2 년 전
부모
커밋
9d571769c8

+ 105 - 32
TEAMModelOS.SDK/Models/Service/StudentService.cs

@@ -816,8 +816,7 @@ namespace TEAMModelOS.SDK
                     writerNew.Flush();
                     writerNew.Flush();
                     if (!string.IsNullOrWhiteSpace(stud.Value.imei))
                     if (!string.IsNullOrWhiteSpace(stud.Value.imei))
                     {
                     {
-                        Imei imei = new Imei { id = stud.Value.imei, code = "Imei", pk = "Imei", stuid = stud.Key, school = schoolId };
-                        await cosmosContainer.UpsertItemAsync(imei, new PartitionKey($"Imei"));
+                        await upsertImei(stud.Key, stud.Value.imei, schoolId, "keep", cosmosContainer);
                     }
                     }
                     var response = await cosmosContainer.CreateItemStreamAsync(memoryStream, new PartitionKey($"Base-{schoolId}"));
                     var response = await cosmosContainer.CreateItemStreamAsync(memoryStream, new PartitionKey($"Base-{schoolId}"));
 
 
@@ -917,6 +916,90 @@ namespace TEAMModelOS.SDK
             }
             }
             return (null, null, null);
             return (null, null, null);
         }
         }
+        /// <summary>
+        /// grand_type 
+        /// 为import:如果导入则已最新,没导入则不动这个字段的值,维持现状
+        /// 为create:如果有值,则绑定,并删除stuid关联的别的imei.
+        /// 为update 
+        /// 为delete
+        /// </summary>
+        /// <param name="stuid"></param>
+        /// <param name="imei"></param>
+        /// <param name="schoolId"></param>
+        /// <param name="grand_type"></param>
+        /// <param name="cosmosContainer"> 
+        /// clean 当传入的电子学生证值为空,判断要强制清除关联的学生电子学生证 ,
+        /// keep 保持现状,导入时
+        /// delete 因学生被删除,强制删除电子学生证。</param>
+        /// <returns></returns>
+        public static async Task upsertImei(string stuid ,string imeiid,string schoolId,string grand_type, CosmosContainer cosmosContainer) {
+            List<Imei> imeis = new List<Imei>();
+            string sql = $"select value c from c where c.stuid='{stuid}'  and c.school='{schoolId}' ";
+            await foreach (var item in cosmosContainer.GetItemQueryIterator<Imei>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Imei") }))
+            {
+                imeis.Add(item);
+            }
+            switch (grand_type)
+            {
+                case "clean":
+                case "keep":
+                    bool notin = true;
+                    List<Imei> update = new List<Imei>();
+                    List<Imei> delete = new List<Imei>();
+                    imeis.ForEach(x => {
+                        //如果传入的电子学生证id不存在,且是单个更新或创建,则解除学生id的电子学生证绑定,并删除该电子学生证。
+                        if (string.IsNullOrWhiteSpace(imeiid)) {
+                            if (grand_type.Equals("clean") )
+                            {
+                                delete.Add(x);
+                            }// 如果是导入模式,且电子学生证没有值则不动。
+                        }
+                        else {
+                            //如果电子学生证有值则,解除之前的所有与当前电子学生证id不符的绑定。
+                            if (!x.id.Equals(imeiid))
+                            {
+                                x.stuid = null;
+                                x.school = null;
+                                delete.Add(x);
+                            }
+                            else
+                            {
+                                //存在且正确绑定
+                                notin = false;
+                            }
+                        }
+                        
+                    });
+                    //当前学生还未有任何电子学生证,且有新的电子学生证id传入,则需要捞出电子学生证,绑定,如果没有捞出,则新建电子学生证,并绑定
+                    if (notin && !string.IsNullOrWhiteSpace(imeiid))
+                    {
+                        var imeiResponse = await cosmosContainer.ReadItemStreamAsync(imeiid, new PartitionKey("Imei"));
+                        if (imeiResponse.Status == 200)
+                        {
+                            Imei imeiDb = JsonDocument.Parse(imeiResponse.Content).RootElement.Deserialize<Imei>();
+                            imeiDb.stuid = stuid;
+                            imeiDb.school = schoolId;
+                            await cosmosContainer.ReplaceItemAsync(imeiDb, imeiDb.id, new PartitionKey("Imei"));
+                        }
+                        else
+                        {
+                            Imei imei = new Imei { id = imeiid, code = "Imei", pk = "Imei", stuid = stuid, school = schoolId };
+                            await cosmosContainer.CreateItemAsync(imei, new PartitionKey($"Imei"));
+                        };
+                    }
+                    if (delete.Any())
+                    {
+                        await cosmosContainer.DeleteItemsStreamAsync(delete.Select(x => x.id).ToList(), "Imei");
+                    }
+                    break;
+                case "delete":
+                    if (imeis.Any()) {
+                        await cosmosContainer.DeleteItemsStreamAsync(imeis.Select(x => x.id).ToList(), "Imei");
+                    }
+                    break;
+            }
+            
+        }
 
 
         /// <summary>
         /// <summary>
         /// 單純建立單一學生
         /// 單純建立單一學生
@@ -993,17 +1076,15 @@ namespace TEAMModelOS.SDK
                 }
                 }
                 writer.WriteEndObject();
                 writer.WriteEndObject();
                 writer.Flush();
                 writer.Flush();
-                if (!string.IsNullOrWhiteSpace(studCreateInfo.imei))
-                {
-                    Imei imei = new Imei { id = studCreateInfo.imei, code = "Imei", pk = "Imei", stuid = studCreateInfo.id, school = schoolId };
-                    await _azureCosmos
-                                .GetCosmosClient()
-                                .GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(imei, new PartitionKey($"Imei"));
-                }
+                
                 var response = await _azureCosmos
                 var response = await _azureCosmos
                                 .GetCosmosClient()
                                 .GetCosmosClient()
                                 .GetContainer(Constant.TEAMModelOS, "Student")
                                 .GetContainer(Constant.TEAMModelOS, "Student")
                                 .CreateItemStreamAsync(stream, new PartitionKey($"Base-{schoolId}"));
                                 .CreateItemStreamAsync(stream, new PartitionKey($"Base-{schoolId}"));
+                //更新电子学生证、
+                await upsertImei(studCreateInfo.id, studCreateInfo.imei, schoolId, "keep", _azureCosmos
+                               .GetCosmosClient()
+                               .GetContainer(Constant.TEAMModelOS, "Student"));
                 if (response.Status == (int)HttpStatusCode.Created || response.Status == (int)HttpStatusCode.OK) return true;
                 if (response.Status == (int)HttpStatusCode.Created || response.Status == (int)HttpStatusCode.OK) return true;
                 if (response.Status == (int)HttpStatusCode.Conflict) return false;
                 if (response.Status == (int)HttpStatusCode.Conflict) return false;
                 else
                 else
@@ -1011,6 +1092,7 @@ namespace TEAMModelOS.SDK
                     await _dingDing.SendBotMsg($"IES5,{_option.Location},StudentController/createStudent()\nCosmosDB Create response status = {response.Status}\nID:{studCreateInfo.id}", GroupNames.醍摩豆服務運維群組);
                     await _dingDing.SendBotMsg($"IES5,{_option.Location},StudentController/createStudent()\nCosmosDB Create response status = {response.Status}\nID:{studCreateInfo.id}", GroupNames.醍摩豆服務運維群組);
                     return false;
                     return false;
                 }
                 }
+                
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
@@ -1488,9 +1570,11 @@ namespace TEAMModelOS.SDK
                     string id = string.Empty;
                     string id = string.Empty;
                     try
                     try
                     {
                     {
+                       
                         JsonElement student = students.Current;
                         JsonElement student = students.Current;
                         id = student.GetProperty("id").GetString();
                         id = student.GetProperty("id").GetString();
                         var ret = await container.DeleteItemStreamAsync(id, new PartitionKey($"Base-{schoolId}"));
                         var ret = await container.DeleteItemStreamAsync(id, new PartitionKey($"Base-{schoolId}"));
+                        await upsertImei(id, null, schoolId, "delete", container);
                         if (ret.Status == (int)HttpStatusCode.NoContent) sucIds.Add(id);
                         if (ret.Status == (int)HttpStatusCode.NoContent) sucIds.Add(id);
                         await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(queryText: $"select value(c) from c join A0 in c.members where A0.id = '{id}' and A0.code='{schoolId}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{schoolId}") }))
                         await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(queryText: $"select value(c) from c join A0 in c.members where A0.id = '{id}' and A0.code='{schoolId}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{schoolId}") }))
                         {
                         {
@@ -1751,7 +1835,7 @@ namespace TEAMModelOS.SDK
         /// <param name="students"></param>
         /// <param name="students"></param>
         /// <returns></returns>
         /// <returns></returns>
         public static async Task<(List<object> studs, Dictionary<string, List<string>> classDuplNos, List<string> nonexistentIds, List<string> errorIds, Dictionary<string, List<string>> errorNos, List<string> errorClassId)>
         public static async Task<(List<object> studs, Dictionary<string, List<string>> classDuplNos, List<string> nonexistentIds, List<string> errorIds, Dictionary<string, List<string>> errorNos, List<string> errorClassId)>
-            updateStudents(AzureCosmosFactory _azureCosmos, DingDing _dingDing, Option _option, string schoolId, JsonElement.ArrayEnumerator students)
+            updateStudents(AzureCosmosFactory _azureCosmos, DingDing _dingDing, Option _option, string schoolId, JsonElement.ArrayEnumerator students,bool cleanImei)
         {
         {
             try
             try
             {
             {
@@ -2091,23 +2175,7 @@ namespace TEAMModelOS.SDK
                                                     writer.WriteString("irs", studentInfos[id].irs);
                                                     writer.WriteString("irs", studentInfos[id].irs);
                                                 }
                                                 }
                                                 break;
                                                 break;
-                                            case bool _ when element.Name.Equals("imei", StringComparison.Ordinal):
-                                                //移除座號的話會給空的
-                                                if (studentInfos[id].imei != null && studentInfos[id].imei.Length == 0)
-                                                {
-                                                    writer.WriteNull("imei");
-                                                    tmpData.imei = null;
-                                                }
-                                                else if (string.IsNullOrWhiteSpace(studentInfos[id].imei))
-                                                {
-                                                    element.WriteTo(writer);
-                                                    tmpData.imei = element.Value.GetString();
-                                                }
-                                                else
-                                                {
-                                                    writer.WriteString("imei", studentInfos[id].imei);
-                                                }
-                                                break;
+                                            
                                             case bool _ when element.Name.StartsWith("_", StringComparison.Ordinal):
                                             case bool _ when element.Name.StartsWith("_", StringComparison.Ordinal):
                                                 break;
                                                 break;
                                             default:
                                             default:
@@ -2158,12 +2226,17 @@ namespace TEAMModelOS.SDK
                                     
                                     
                                     writer.WriteEndObject();
                                     writer.WriteEndObject();
                                     writer.Flush();
                                     writer.Flush();
-                                    if (!string.IsNullOrWhiteSpace(studentInfos[id].imei))
+                                    //编辑是是否要明确清除电子学生证。
+                                    if (cleanImei)
                                     {
                                     {
-                                        Imei imei = new Imei { id = studentInfos[id].imei, code = "Imei", pk = "Imei", stuid = id, school = schoolId };
-                                        await _azureCosmos
-                                                    .GetCosmosClient()
-                                                    .GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(imei, new PartitionKey($"Imei"));
+                                        await upsertImei(id, studentInfos[id].imei, schoolId, "clean", _azureCosmos
+                                                         .GetCosmosClient()
+                                                         .GetContainer(Constant.TEAMModelOS, "Student"));
+                                    }
+                                    else {
+                                        await upsertImei(id, studentInfos[id].imei, schoolId, "keep", _azureCosmos
+                                                       .GetCosmosClient()
+                                                       .GetContainer(Constant.TEAMModelOS, "Student"));
                                     }
                                     }
                                     try
                                     try
                                     {
                                     {

+ 1 - 1
TEAMModelOS/Controllers/OpenApi/OpenSchool/ScGroupListController.cs

@@ -134,7 +134,7 @@ namespace TEAMModelOS.Controllers
                     List<Student> webStudents = json.GetProperty("students").ToObject<List<Student>>();
                     List<Student> webStudents = json.GetProperty("students").ToObject<List<Student>>();
                     webStudents.ForEach(x => x.periodId = $"{_periodId}");
                     webStudents.ForEach(x => x.periodId = $"{_periodId}");
                     List<Student> preStudents = await StudentService.GeStudentData(_azureCosmos, school, webStudents?.Select(x => x.id));
                     List<Student> preStudents = await StudentService.GeStudentData(_azureCosmos, school, webStudents?.Select(x => x.id));
-                    var retUpdate = await StudentService.updateStudents(_azureCosmos, _dingDing, _option, school, json.GetProperty("students").EnumerateArray());
+                    var retUpdate = await StudentService.updateStudents(_azureCosmos, _dingDing, _option, school, json.GetProperty("students").EnumerateArray(),false);
                     await StudentService.CheckStudent(_serviceBus, _configuration, _azureCosmos, school, webStudents, preStudents);
                     await StudentService.CheckStudent(_serviceBus, _configuration, _azureCosmos, school, webStudents, preStudents);
                     return Ok(new { code = school, students = retUpdate.studs, retUpdate.classDuplNos, retUpdate.nonexistentIds, retUpdate.errorNos, retUpdate.errorClassId });
                     return Ok(new { code = school, students = retUpdate.studs, retUpdate.classDuplNos, retUpdate.nonexistentIds, retUpdate.errorNos, retUpdate.errorClassId });
                 }
                 }

+ 8 - 1
TEAMModelOS/Controllers/Student/StudentController.cs

@@ -175,8 +175,15 @@ namespace TEAMModelOS.Controllers
                     case "update":
                     case "update":
                         //更新學生資料,批量密碼重置,基本資訊更新(姓名、教室ID、性別、學年及座號)
                         //更新學生資料,批量密碼重置,基本資訊更新(姓名、教室ID、性別、學年及座號)
                         webStudents = request.GetProperty("students").ToObject<List<Student>>();
                         webStudents = request.GetProperty("students").ToObject<List<Student>>();
+                        var cleanImei  = false;
+                         
+                        if (request.GetProperty("cleanImei").ValueKind.Equals(JsonValueKind.True))
+                        {
+                            cleanImei = true;
+                        }
+                        
                         preStudents = await StudentService.GeStudentData(_azureCosmos, schoolId.GetString(), webStudents?.Select(x => x.id));
                         preStudents = await StudentService.GeStudentData(_azureCosmos, schoolId.GetString(), webStudents?.Select(x => x.id));
-                        var retUpdate = await StudentService.updateStudents(_azureCosmos, _dingDing, _option, schoolId.GetString(), request.GetProperty("students").EnumerateArray());
+                        var retUpdate = await StudentService.updateStudents(_azureCosmos, _dingDing, _option, schoolId.GetString(), request.GetProperty("students").EnumerateArray(), cleanImei);
                         await StudentService.CheckStudent(_serviceBus, _configuration, _azureCosmos, schoolId.GetString(), webStudents, preStudents);
                         await StudentService.CheckStudent(_serviceBus, _configuration, _azureCosmos, schoolId.GetString(), webStudents, preStudents);
                         return this.Ok(new { code = $"Base-{schoolId.GetString()}", students = retUpdate.studs, retUpdate.classDuplNos, retUpdate.nonexistentIds, retUpdate.errorNos, retUpdate.errorClassId });
                         return this.Ok(new { code = $"Base-{schoolId.GetString()}", students = retUpdate.studs, retUpdate.classDuplNos, retUpdate.nonexistentIds, retUpdate.errorNos, retUpdate.errorClassId });
                     case "delete":
                     case "delete":