Browse Source

查询毕业班级,和毕业学生。

CrazyIter_Bin 2 years ago
parent
commit
00830da640

+ 19 - 7
TEAMModelOS.SDK/Models/Service/StudentService.cs

@@ -1396,16 +1396,16 @@ namespace TEAMModelOS.SDK
         /// </summary>
         /// <param name="schoolId"></param>
         /// <returns> [{id,name,picture,year,no,classId,classNo,className,gradeId,periodId},{id,name,picture,..}..]</returns>
-        public static async Task<List<object>> getAllStudent(AzureCosmosFactory _azureCosmos, DingDing _dingDing, Option _option, string schoolId)
+        public static async Task<List<object>> getAllStudent(AzureCosmosFactory _azureCosmos, DingDing _dingDing, Option _option, string schoolId,int inyear ,int graduate=0 )
         {
             try
             {
                 //TODO : 進階查詢選項調整、部分地方可用並行處理
                 //以學校學生角度去抓資料
-                Dictionary<string, List<(string id, string name, string picture, int year, string no, string periodId, string irs,string imei,string gender, List<StudentGuardian> guardians)>> dicClassStuds =
-                    new Dictionary<string, List<(string id, string name, string picture, int year, string no, string periodId, string irs, string imei, string gender, List<StudentGuardian> guardians)>>();
-                List<(string id, string name, string picture, int year, string no, string periodId, string irs, string imei, string gender, List<StudentGuardian> guardians)> notJoinClassStuds = 
-                    new List<(string id, string name, string picture, int year, string no, string periodId, string irs, string imei, string gender, List<StudentGuardian> guardians)>();
+                Dictionary<string, List<(string id, string name, string picture, int year, string no, string periodId, string irs,string imei,string gender,int graduate, List<StudentGuardian> guardians)>> dicClassStuds =
+                    new Dictionary<string, List<(string id, string name, string picture, int year, string no, string periodId, string irs, string imei, string gender, int graduate, List<StudentGuardian> guardians)>>();
+                List<(string id, string name, string picture, int year, string no, string periodId, string irs, string imei, string gender, int graduate, List<StudentGuardian> guardians)> notJoinClassStuds = 
+                    new List<(string id, string name, string picture, int year, string no, string periodId, string irs, string imei, string gender, int graduate, List<StudentGuardian> guardians)>();
 
 
                 List<Imei> imeis= new List<Imei>();
@@ -1414,7 +1414,15 @@ namespace TEAMModelOS.SDK
                    .GetItemQueryIterator<Imei>(queryText:imeiQueryText,requestOptions:new QueryRequestOptions { PartitionKey= new PartitionKey("Imei")})){
                     imeis.Add(item);
                 }
-                string queryText = $"SELECT  *  FROM c WHERE c.code = 'Base-{schoolId}'";
+                string queryText = "";
+                if (graduate == 0)
+                {
+                    queryText = $"SELECT  *  FROM c WHERE c.code = 'Base-{schoolId}' and (c.graduate = 0 or IS_DEFINED(c.graduate) = false )";
+                }
+                else {
+                    queryText = $"SELECT  *  FROM c WHERE c.code = 'Base-{schoolId}' and  c.graduate = 1 and c.year ={inyear} ";
+                }
+                 
 
                 //回傳用ContinuationToken
                 string continuationToken = string.Empty;
@@ -1464,6 +1472,7 @@ namespace TEAMModelOS.SDK
                                             $"{irs}",
                                             imeiObj?.id,//imei
                                             acc.TryGetProperty("gender", out JsonElement _gender) && _gender.ValueKind.Equals(JsonValueKind.String) ? _gender.GetString() : null,
+                                              acc.TryGetProperty("graduate", out JsonElement _graduate) && _graduate.ValueKind.Equals(JsonValueKind.Number) ? int.Parse($"{_graduate}"): 0,
                                             guardians
                                         )
                                     );
@@ -1482,6 +1491,7 @@ namespace TEAMModelOS.SDK
                                                 $"{irs}",
                                                 imeiObj?.id,//imei
                                                 acc.TryGetProperty("gender", out JsonElement _gender) && _gender.ValueKind.Equals(JsonValueKind.String) ? _gender.GetString() : null,
+                                                  acc.TryGetProperty("graduate", out JsonElement _graduate) && _graduate.ValueKind.Equals(JsonValueKind.Number) ? int.Parse($"{_graduate}") : 0,
                                                 guardians
                                             )
                                         );
@@ -1489,7 +1499,7 @@ namespace TEAMModelOS.SDK
                                 else
                                 {
                                     dicClassStuds.Add(classId,
-                                            new List<(string id, string name, string picture, int year, string no, string periodId, string irs,string imei,string gender, List<StudentGuardian> guardians)>()
+                                            new List<(string id, string name, string picture, int year, string no, string periodId, string irs,string imei,string gender,int graduate, List<StudentGuardian> guardians)>()
                                             {
                                                 (
                                                     acc.GetProperty("id").GetString(),
@@ -1500,6 +1510,7 @@ namespace TEAMModelOS.SDK
                                                     $"{irs}"  ,
                                                     imeiObj?.id,//imei
                                                     acc.TryGetProperty("gender", out JsonElement _gender) && _gender.ValueKind.Equals(JsonValueKind.String) ? _gender.GetString() : null,
+                                                      acc.TryGetProperty("graduate", out JsonElement _graduate) && _graduate.ValueKind.Equals(JsonValueKind.Number) ? int.Parse($"{_graduate}"): 0,
                                                     guardians
                                                 )
                                             }
@@ -1553,6 +1564,7 @@ namespace TEAMModelOS.SDK
                                          irs = o.irs,
                                          imei=o.imei,
                                          gender = o.gender,
+                                         graduate=   o.graduate,
                                          guardians =o.guardians,
                                      });
                     ret.AddRange(tmp);

+ 59 - 76
TEAMModelOS/Controllers/School/ClassController.cs

@@ -58,6 +58,9 @@ namespace TEAMModelOS.Controllers
                 classroom.code = "Class-" + classroom.school;
                 if (string.IsNullOrEmpty(classroom.id))
                 {
+                    if (classroom.graduate != 0) {
+                        return BadRequest("已毕业的班级不能被编辑");
+                    }
                     List<string> resultIds = new List<string>();
                     await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.periodId = '{classroom.periodId}' and c.no = '{classroom.no}' and c.year = '{classroom.year}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(classroom.code) }))
                     {
@@ -86,6 +89,10 @@ namespace TEAMModelOS.Controllers
                     {
                         using var json = await JsonDocument.ParseAsync(response.ContentStream);
                         Class @class = json.ToObject<Class>();
+                        if (classroom.graduate != 0)
+                        {
+                            return BadRequest("已毕业的班级不能被编辑");
+                        }
                         if (!@class.no.Equals(classroom.no))
                         {
                             List<string> resultIds = new List<string>();
@@ -158,47 +165,65 @@ namespace TEAMModelOS.Controllers
             }
 
         }
-
+        /// <summary>
+        /// 已弃用
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
         [ProducesDefaultResponseType]
-        //[AuthToken(Roles = "teacher")]
         [HttpPost("find")]
-        [Authorize(Roles = "IES")]
+#if !DEBUG
+[Authorize(Roles = "IES")]
+#endif
         public async Task<IActionResult> Find(JsonElement request)
         {
-            //ResponseBuilder builder = ResponseBuilder.custom();
             if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
             try
-            {
-                var client = _azureCosmos.GetCosmosClient();
-                List<object> classrooms = new List<object>();
-                StringBuilder sql = new StringBuilder();
-                sql.Append("select c.id,c.no,c.point,c.name,c.teacher,c.periodId,c.gradeId,c.sn,c.style,c.scope,c.type,c.code,c.openType,c.x,c.y,ARRAY_LENGTH(c.students) AS studCount from c ");
-                Dictionary<string, object> dict = new Dictionary<string, object>();
-                var emobj = request.EnumerateObject();
-                while (emobj.MoveNext())
+            {   
+                //增加毕业查询。当毕业查询字段1时,则需要传入入学年份。
+                int graduate = 0;
+                int inyear = 0;
+                //讀取該間學校所有的學生資訊
+                if (request.TryGetProperty("graduate", out JsonElement _graduate) && $"{_graduate}".Equals("1"))
                 {
-                    dict[emobj.Current.Name] = emobj.Current.Value;
+                    if (request.TryGetProperty("year", out JsonElement _year) && _year.ValueKind.Equals(JsonValueKind.Number))
+                    {
+                        if (int.TryParse($"{_year}", out inyear) && inyear > 0)
+                        {
+
+                        }
+                        else
+                        {
+                            return BadRequest("入学年份大于0");
+                        }
+                    }
+                    else
+                    {
+                        return BadRequest("请输入毕业学生的入学年份");
+                    }
                 }
-                //处理code
-                if (dict.TryGetValue("school_code", out object _))
-                {
-                    dict.Remove("school_code");
+                string sql = "";
+                if (graduate == 0) {
+                    sql = $"SELECT c.id,c.x,c.y,c.name,c.year,c.teacher,c.periodId,c.gradeId,c.room,c.sn,c.no,c.style,c.status,c.openType,c.school, c.graduate, " +
+                   $" ARRAY_LENGTH(c.students) AS studCount FROM c where c.graduate = 0 or  IS_DEFINED(c.graduate) = false";
+                }
+                else {
+                    sql = $"SELECT c.id,c.x,c.y,c.name,c.year,c.teacher,c.periodId,c.gradeId,c.room,c.sn,c.no,c.style,c.status,c.openType,c.school, c.graduate, " +
+                       $" ARRAY_LENGTH(c.students) AS studCount FROM c where c.graduate =1 and c.year ={inyear}";
                 }
-                AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
-                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
+                List<object> school_classes = new List<object>();
+                var client = _azureCosmos.GetCosmosClient();
+                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator
+                   (queryText:sql,
+                   requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
                 {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                    var jsonc = await JsonDocument.ParseAsync(item.ContentStream);
+                    foreach (var classeinfo in jsonc.RootElement.GetProperty("Documents").EnumerateArray())
                     {
-                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                        {
-                            classrooms.Add(obj.ToObject<object>());
-                        }
+                        school_classes.Add(classeinfo.ToObject<object>());
                     }
                 }
-                return Ok(new { classrooms });
-                /*List<Classroom> sc = await _azureCosmos.FindByDict<Classroom>(request);
-                return builder.Data(sc).build();*/
+                return Ok(new { school_classes });
             }
             catch (Exception ex)
             {
@@ -218,7 +243,10 @@ namespace TEAMModelOS.Controllers
            
             try
             {
-                string school_code = code.ToString();
+                Class clssz = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<Class>($"{id}", new PartitionKey($"Class-{code}"));
+                if (clssz.graduate == 1) {
+                    return BadRequest("已毕业的班级不能被删除。");
+                }
                 var client = _azureCosmos.GetCosmosClient();
                 List<Student> students = new List<Student>();
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<Student>(queryText: $"select *  from c where c.classId='{id}' ", requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Base-{code}") }))
@@ -247,60 +275,15 @@ namespace TEAMModelOS.Controllers
                 change.listid = $"{id}";
                 change.scope = "school";
                 change.originCode = $"{code}";
-                change.school = $"{school_code}";
+                change.school = $"{code}";
                 change.type = "class";
                 change.status = "delete";
                 var messageChange = new ServiceBusMessage(change.ToJsonString());
                 messageChange.ApplicationProperties.Add("name", "GroupChange");
                 var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
                 await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageChange);
-                //查询含有该班级的课程ID
-
-                /*
-                List<string> cids = new List<string>();
-                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(
-                    queryText: $"select distinct c.id from c join A0 in c.schedule where A0.classId = '{id}'",
-                    requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Course-{code}") }))
-                {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                    {
-                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                        while (accounts.MoveNext())
-                        {
-                            JsonElement account = accounts.Current;
-                            cids.Add(account.GetProperty("id").GetString());
-                        }
-                    }
-                }
-                List<Task<ItemResponse<Course>>> taskCourses = new List<Task<ItemResponse<Course>>>();
-                List<Course> courses = new List<Course>();
-                if(cids.IsNotEmpty())
-                {
-                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Course>(
-                       queryText: $"select value(c) from c where c.id in ({string.Join(",", cids.Select(o => $"'{o}'"))})",
-                       requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Course-{code}") }))
-                    {
-                        courses.Add(item);
-                    }
-                }
-               
-                foreach (Course course in courses)
-                {
-                    for (int i =0;i< course.schedule.Count;i++) {
-                        if (!string.IsNullOrEmpty(course.schedule[i].classId)) {
-                            string classId = course.schedule[i].classId;
-                            if (classId.Equals(id.GetString())) { 
-                                course.schedule.RemoveAt(i);
-                            }
-                        }
-                    }
-                    taskCourses.Add(client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(course, course.id, new PartitionKey((course.code))));
-                }
-                await Task.WhenAll(taskCourses);
-                */
                 await Task.WhenAll(tasks);
-                Class classroom=   await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemAsync<Class>(id.ToString(), new PartitionKey($"Class-{school_code}"));
+                Class classroom=   await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemAsync<Class>(id.ToString(), new PartitionKey($"Class-{code}"));
                 return Ok(new { classroom });
             }
             catch (Exception ex)

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

@@ -170,8 +170,27 @@ namespace TEAMModelOS.Controllers
                         await CheckStudent(_serviceBus, _configuration, _azureCosmos, schoolId.GetString(), webStudents, preStudents);
                         return this.Ok(new { code = $"Base-{schoolId.GetString()}", students = retUpsert.studs, retUpsert.classDuplNos, retUpsert.errorIds });
                     case "read":
+                        //增加毕业查询。当毕业查询字段1时,则需要传入入学年份。
+                        int graduate = 0;
+                        int inyear = 0;
                         //讀取該間學校所有的學生資訊
-                        var students = await StudentService.getAllStudent(_azureCosmos, _dingDing, _option, schoolId.GetString());
+                        if (request.TryGetProperty("graduate", out JsonElement _graduate) && $"{_graduate}".Equals("1")) {
+                            if (request.TryGetProperty("year", out JsonElement _year) && _year.ValueKind.Equals(JsonValueKind.Number))
+                            {
+                                if (int.TryParse($"{_year}", out inyear) && inyear > 0)
+                                {
+
+                                }
+                                else {
+                                    return BadRequest("入学年份大于0");
+                                }
+                            }
+                            else {
+                                return BadRequest("请输入毕业学生的入学年份");
+                            }
+                        }
+                      
+                        var students = await StudentService.getAllStudent(_azureCosmos, _dingDing, _option, schoolId.GetString(), inyear, graduate);
                         return this.Ok(new { code = $"Base-{schoolId.GetString()}", students });
                     case "update":
                         //更新學生資料,批量密碼重置,基本資訊更新(姓名、教室ID、性別、學年及座號)

+ 3 - 1
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -617,8 +617,10 @@ namespace TEAMModelOS.Controllers
 
                 //取得班级
                 List<object> school_classes = new List<object>();
+
                 await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator
-                    (queryText: $"SELECT c.id,c.x,c.y,c.name,c.year,c.teacher,c.periodId,c.gradeId,c.room,c.sn,c.no,c.style,c.status,c.openType,c.school, ARRAY_LENGTH(c.students) AS studCount FROM c",
+                    (queryText: $"SELECT c.id,c.x,c.y,c.name,c.year,c.teacher,c.periodId,c.gradeId,c.room,c.sn,c.no,c.style,c.status,c.openType,c.school, c.graduate, " +
+                    $" ARRAY_LENGTH(c.students) AS studCount FROM c where c.graduate = 0 or  IS_DEFINED(c.graduate) = false",
                     requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
                 {
                     var jsonc = await JsonDocument.ParseAsync(item.ContentStream);