CrazyIter_Bin vor 2 Jahren
Ursprung
Commit
5dd795ce3d

+ 18 - 0
TEAMModelOS.SDK/DI/CoreAPI/CoreAPIHttpService.cs

@@ -87,6 +87,24 @@ namespace TEAMModelOS.SDK
 
         public  async Task<(HttpStatusCode code,string msg )> AdminChange(AdminChange data, string location, IConfiguration _configuration, DI.DingDing _dingDing)
         {
+            /**
+IES5 管理员变更 调用BB的webhook接口和数据格式。
+https://bb.teammodel.cn/ies5/admin-change
+{
+"school": "hbcn",
+"lang":"zh-cn",
+"adminType":"master",
+"adminAdd": [
+"1535418750"
+],
+"adminRmv": [
+"1595321354"
+]
+}
+adminType: 主管理员 ,master 次要管理员,minor
+lang 语系"zh-cn" ,zh-tw", "en-us"
+             **/
+
             try
             {
                 string url = _configuration.GetValue<string>("HaBookAuth:CoreBBAPI") + "/ies5/admin-change";

+ 59 - 7
TEAMModelOS.SDK/Models/Cosmos/School/CourseBase.cs

@@ -32,7 +32,7 @@ namespace TEAMModelOS.SDK.Models
         "creatorId": "1595321354",
         "school": "hbcn",
         "color": "red", //用于标记课程表的排课颜色
-        "gradeId": 1, //年级
+        "gradeId": 2, //年级
         "status": 1
     }
      */
@@ -81,7 +81,7 @@ namespace TEAMModelOS.SDK.Models
         /// <summary>
         /// 年级
         /// </summary>
-        public int gradeId { get; set; } = -1;
+        public HashSet<int> gradeId { get; set; } = new HashSet<int>();
 
         /// <summary>
         /// 状态
@@ -212,11 +212,9 @@ namespace TEAMModelOS.SDK.Models
         public string id { get; set; }
         public string name { get; set; }
     }
-    public class CourseBaseImport
-    {
-        public CourseBase courseBase { get; set; } = new CourseBase();
-        public List<CourseTask> courseTasks { get; set; } = new List<CourseTask>();
-    }
+
+   
+
     public class CourseCheckImport
     {
         /// <summary>
@@ -271,4 +269,58 @@ namespace TEAMModelOS.SDK.Models
         /// </summary>
         public int invalidCode { get; set; } = -1;
     }
+    public class CourseTaskInsert
+    {
+        /// <summary>
+        /// 学年
+        /// </summary>
+        public int year { get; set; }
+        /// <summary>
+        /// 学期id
+        /// </summary>
+        public string semesterId { get; set; }
+        /// <summary>
+        /// 课程名称 必填,导入课程的名称,需要与课程列表名称匹配才能导入
+        /// </summary>
+        public string courseId { get; set; }
+        /// <summary>
+        /// 名单类型
+        /// 必填,    行政班=>class   教学班=>teach
+        /// </summary>
+        public string type { get; set; }
+        /// <summary>
+        /// 行政班 教学班Id
+        /// </summary>
+        public string groupId { get; set; }
+        /// <summary>
+        /// 教师醍摩豆ID
+        /// </summary>
+        public string teacherId { get; set; }
+        /// <summary>
+        /// 教室编号 选题,表示网课或不确定上课教室,编号需要与现有教室列表的编号匹配,才能导入
+        /// </summary>
+        public string roomId { get; set; }
+        /// <summary>
+        /// -1未验证的,0.验证通过的,1.课程名称无效的,2.醍摩豆ID无效的,3.教学班名称无效的,4.教室编号无效的,5.开学日期无效的,6.课程结束日期无效的,
+        /// 7.排课时间格式不满足[1-n]-[1|2|3|4|5|6|7]-[A|D|C],8.没有对应的上课时间段,9.上课时间不在星期一至星期日,10.自定义模式下,需要配置对应的上课周,11.自定义模式下,上课周不在1-20周
+        /// 12.班级入学年-编号不存在,13.导入的班级入学年-编号在系统中重复,请检查行政班设置,14.班级入学年-编号格式错误,15根据开学时间无法获取学期信息
+        /// </summary>
+        public int invalidCode { get; set; } = -1;
+    }
+    public class CourseTaskChanged : CourseTaskInsert
+    {
+        /// <summary>
+        /// 名单类型,变更后的名单类型
+        /// 行政班=>class   教学班=>teach
+        /// </summary>
+        public string typeChanged { get; set; }
+        /// <summary>
+        /// 行政班 教学班Id,变更后的名单Id
+        /// </summary>
+        public string groupIdChanged { get; set; }
+        /// <summary>
+        /// 教师醍摩豆ID,变更后的教师id
+        /// </summary>
+        public string teacherIdChanged { get; set; }
+    }
 }

+ 112 - 124
TEAMModelOS/Controllers/Both/CourseBaseController.cs

@@ -19,6 +19,10 @@ using HTEXLib.COMM.Helpers;
 using System.Globalization;
 using TEAMModelOS.SDK;
 using Microsoft.AspNetCore.Authorization;
+using StackExchange.Redis;
+using Azure.Storage.Blobs.Models;
+using Microsoft.Azure.Amqp.Sasl;
+using DocumentFormat.OpenXml.Drawing.Charts;
 
 namespace TEAMModelOS.Controllers.Both
 {
@@ -34,9 +38,10 @@ namespace TEAMModelOS.Controllers.Both
         private readonly Option _option;
         private readonly AzureServiceBusFactory _serviceBus;
         private readonly AzureStorageFactory _azureStorage;
+        private readonly AzureRedisFactory _azureRedis;
         private static List<string> weekDays = new List<string> { "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" };
         public IConfiguration _configuration { get; set; }
-        public CourseBaseController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, AzureServiceBusFactory serviceBus, AzureStorageFactory azureStorage, IConfiguration configuration)
+        public CourseBaseController(AzureRedisFactory azureRedis,AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, AzureServiceBusFactory serviceBus, AzureStorageFactory azureStorage, IConfiguration configuration)
         {
             _azureCosmos = azureCosmos;
             _dingDing = dingDing;
@@ -44,6 +49,7 @@ namespace TEAMModelOS.Controllers.Both
             _serviceBus = serviceBus;
             _configuration = configuration;
             _azureStorage = azureStorage;
+            _azureRedis = azureRedis;
         }
         /// <summary>
         /// 更新保存课程
@@ -66,7 +72,47 @@ namespace TEAMModelOS.Controllers.Both
                 var client = _azureCosmos.GetCosmosClient();
                 switch (true)
                 {
-                    case bool when $"{grant_type}".Equals("insert", StringComparison.OrdinalIgnoreCase) || $"{grant_type}".Equals("update", StringComparison.OrdinalIgnoreCase):
+                    case bool when $"{grant_type}".Equals("list", StringComparison.OrdinalIgnoreCase):
+                        {
+                            if (  !request.TryGetProperty("scope", out JsonElement _scope) || !request.TryGetProperty("code", out JsonElement _code))
+                            {
+                                return BadRequest();
+                            }
+                            string tbname = $"{_scope}".Equals("school", StringComparison.OrdinalIgnoreCase)?Constant.School:Constant.Teacher;
+                            string code = $"CourseBase-{_code}";
+                            string baseSql = $"select value c from c ";
+                            List<CourseBase> courseBases = new List<CourseBase>();
+                            await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
+                            .GetItemQueryIterator<CourseBase>(queryText: baseSql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(code) }))
+                            {
+                                courseBases.Add(item);
+                            }
+                            return Ok(new { courseBases });
+                        }
+                    case bool when $"{grant_type}".Equals("delete", StringComparison.OrdinalIgnoreCase):
+                        {
+                            if (!request.TryGetProperty("id", out JsonElement _id) || !request.TryGetProperty("scope", out JsonElement _scope) || !request.TryGetProperty("code", out JsonElement _code))
+                            {
+                                return BadRequest();
+                            }
+                            string tbname = $"{_scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
+                            Azure.Response response= await client.GetContainer(Constant.TEAMModelOS, tbname).DeleteItemStreamAsync(_id.ToString(), new PartitionKey($"CourseBase-{_code}"));
+                            //需要联动删除排课
+                            string taskCode = $"CourseTask-{_code}-{_id}";
+                            string taskSql = $"select value c from c ";
+                            List<CourseTask> courseTasks = new List<CourseTask>();
+                            await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname)
+                            .GetItemQueryIterator<CourseTask>(queryText: taskSql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(taskCode) }))
+                            {
+                                courseTasks.Add(item);
+                            }
+                            if (courseTasks.Count > 0)
+                            {
+                                await client.GetContainer(Constant.TEAMModelOS, tbname).DeleteItemsStreamAsync(courseTasks.Select(x=>x.id).ToList(), taskCode);
+                            }
+                            return  Ok(new {code= response .Status});
+                        }
+                    case bool when $"{grant_type}".Equals("upsert", StringComparison.OrdinalIgnoreCase) :
                         {
                             if (!request.TryGetProperty("course", out JsonElement _course))
                             {
@@ -78,32 +124,71 @@ namespace TEAMModelOS.Controllers.Both
                             {
                                 courseBase.id = Guid.NewGuid().ToString();
                             }
-                            string tbname = "";
+                            string tbname = $"{courseBase.scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
                             if (courseBase.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
                             {
-                                tbname = Constant.School;
                                 courseBase.school = school;
                                 courseBase.creatorId = id;
                                 courseBase.code = $"CourseBase-{school}";
                             }
                             else
                             {
-                                tbname = Constant.Teacher;
                                 courseBase.creatorId = id;
                                 courseBase.code = $"CourseBase-{id}";
                             }
-                            var response = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemStreamAsync(courseBase.id, new PartitionKey(courseBase.code));
-                            if (response.Status == 200)
+                            await client.GetContainer(Constant.TEAMModelOS, tbname).UpsertItemAsync(courseBase, new PartitionKey(courseBase.code));
+                            return Ok(new { course = courseBase });
+                        }
+                    case bool when $"{grant_type}".Equals("read-task", StringComparison.OrdinalIgnoreCase):
+                        {
+                            if (!request.TryGetProperty("scope", out JsonElement _scope))
                             {
-                                await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync(courseBase, courseBase.id, new PartitionKey(courseBase.code));
+                                return BadRequest();
+                            }
+                            string tbname = $"{_scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
+                            if (_scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
+                            {
+
+                                if (!request.TryGetProperty("periodId", out JsonElement _periodId)) return BadRequest();
+                                if (!request.TryGetProperty("courseId", out JsonElement _courseId)) return BadRequest();
+                                int studyYear = -1;
+                                string semesterId = string.Empty;
+                                if (!request.TryGetProperty("year", out JsonElement _year) || !request.TryGetProperty("semesterId", out JsonElement _semesterId))
+                                {
+                                    //如果没传,则以当前时间获取学年和学期信息
+                                    School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
+                                    var period = schoolBase.period.Find(x => x.id.Equals($"{_periodId}"));
+                                    (Semester currSemester, int studyYear, DateTimeOffset date, DateTimeOffset nextSemester) info = SchoolService.GetSemester(period);
+                                    semesterId = info.currSemester.id;
+                                    studyYear = info.studyYear;
+                                }
+                                else {
+                                    studyYear = _year.GetInt32();
+                                    semesterId=_semesterId.GetString();
+                                } 
+                                string taskCode = $"CourseTask-{school}-{_courseId}";
+                                string taskId = $"{studyYear}-{semesterId}";
+                                Azure.Response response =  await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).ReadItemStreamAsync(taskId, new PartitionKey(taskCode));
+                                if (response.Status == 200) { 
+                                     CourseTask courseTask=JsonDocument.Parse(response.Content).RootElement.ToObject<CourseTask>();
+                                }
+                                return Ok(new { studyYear, semesterId, });
                             }
                             else
                             {
-                                await client.GetContainer(Constant.TEAMModelOS, tbname).CreateItemAsync(courseBase, new PartitionKey(courseBase.code));
+                                
                             }
-                            return Ok(new { course = courseBase });
+                            break;
+                        }
+                    case bool when $"{grant_type}".Equals("insert-task", StringComparison.OrdinalIgnoreCase) :
+                        {
+                            if ( !request.TryGetProperty("scope", out JsonElement _scope))
+                            {
+                                return BadRequest();
+                            }
+                            string tbname = $"{_scope}".Equals("school", StringComparison.OrdinalIgnoreCase) ? Constant.School : Constant.Teacher;
+                            break;
                         }
-
                     //按照模板导入进行数据转换并且进行检查
                     case bool when ($"{grant_type}".Equals("import-check") && $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase)):
                         {
@@ -489,129 +574,32 @@ namespace TEAMModelOS.Controllers.Both
                                 }
                                 checkedCount++;
                             }
-                            return Ok(new { courseCheckedImports = courseTasks , checkedCount, invalidCount= courseInvalidImports.Count, courseInvalidImports });
+                            //生成检查结果token,有效期5分钟
+                            string checkToken=$"CourseTask:CheckToken:{scope}:{school}:{Guid.NewGuid()}" ;
+                            await _azureRedis.GetRedisClient(8).StringSetAsync(checkToken, courseTasks.ToJsonString(),expiry:new TimeSpan(0,5,0));
+                            return Ok(new { courseCheckedImports = courseTasks , checkedCount, invalidCount= courseInvalidImports.Count, courseInvalidImports, checkToken });
                         }
-                    case bool when $"{grant_type}".Equals("import", StringComparison.OrdinalIgnoreCase) && $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase):
+                    case bool when $"{grant_type}".Equals("import-task", StringComparison.OrdinalIgnoreCase) && $"{scope}".Equals("school", StringComparison.OrdinalIgnoreCase):
                         {
-                            if (!request.TryGetProperty("courseBaseImports", out JsonElement _courseBaseImports)) return BadRequest();
-                            List<CourseBaseImport> courseBaseImports = _courseBaseImports.ToObject<List<CourseBaseImport>>();
-                            foreach (var courseBaseImport in courseBaseImports)
+                            request.TryGetProperty("checkToken", out JsonElement _checkToken);
+                            if (!string.IsNullOrWhiteSpace($"{_checkToken}") && $"{_checkToken}".StartsWith($"CourseTask:CheckToken:{scope}:{school}:"))
                             {
-                                string courseId = "";
-                                courseBaseImport.courseBase.pk = "CourseBase";
-                                courseBaseImport.courseBase.scope = "school";
-                                courseBaseImport.courseBase.school = school;
-                                courseBaseImport.courseBase.creatorId = id;
-                                courseBaseImport.courseBase.code = $"CourseBase-{school}";
-                                StringBuilder sql = new StringBuilder(" select top 1  value c from c ");
-                                if (!string.IsNullOrWhiteSpace(courseBaseImport.courseBase.name)
-                                    && !string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.period?.id)
-                                    && !string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.subject?.id))
+                                RedisValue value = await _azureRedis.GetRedisClient(8).StringGetAsync($"{_checkToken}");
+                                List<CourseTask> courseTasks = value.ToString().ToObject<List<CourseTask>>();
+                                if (courseTasks.IsNotEmpty())
                                 {
-                                    sql.Append($" where c.name ='{courseBaseImport.courseBase.name}' and c.period.id='{courseBaseImport.courseBase.period.id}' and c.subject.id='{courseBaseImport.courseBase.subject.id}' ");
-                                    if (!string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.major?.id))
+                                    foreach (var task in courseTasks)
                                     {
-                                        sql.Append($" and c.major.id='{courseBaseImport.courseBase.major.id}'");
-                                    }
-
-                                    CourseBase courseBaseDb = null;
-                                    await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School)
-                                    .GetItemQueryIterator<CourseBase>(queryText: sql.ToString(), requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(courseBaseImport.courseBase.code) }))
-                                    {
-                                        courseBaseDb = item;
-                                        break;
-                                    }
-                                    if (courseBaseDb != null)
-                                    {
-                                        if (!string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.desc)) {
-                                            courseBaseDb.desc=courseBaseImport.courseBase.desc;
-                                        }
-                                        if (!string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.color))
-                                        {
-                                            courseBaseDb.color = courseBaseImport.courseBase.color;
-                                        }
-                                        if (!string.IsNullOrWhiteSpace(courseBaseImport.courseBase?.no))
-                                        {
-                                            courseBaseDb.no = courseBaseImport.courseBase.no;
-                                        }
-                                        if (courseBaseImport.courseBase?.gradeId != -1) {
-                                            courseBaseDb.gradeId = courseBaseImport.courseBase.gradeId;
-                                        }
-                                        courseId = courseBaseDb.id;
-                                        courseBaseDb = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReplaceItemAsync(courseBaseDb, courseBaseDb.id, new PartitionKey(courseBaseDb.code));
-                                    }
-                                    else
-                                    {
-                                        courseBaseImport.courseBase.id= Guid.NewGuid().ToString();
-                                        courseId = courseBaseImport.courseBase.id;
-                                        courseBaseDb = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).CreateItemAsync(courseBaseImport.courseBase, new PartitionKey(courseBaseImport.courseBase.code));
-                                    }
-                                }
-                                if (courseBaseImport.courseTasks.IsNotEmpty()) {
-                                    foreach (var task in courseBaseImport.courseTasks) {
-                                        if (!string.IsNullOrWhiteSpace(task.semesterId) && task.year > 2010)
-                                        {
-                                            string taskId = $"{task.year}-{task.semesterId}";
-                                            string code = $"CourseTask-{school}-{courseId}";
-                                            Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(taskId, new PartitionKey(code));
-                                            CourseTask courseTask = null;
-                                            if (response.Status == 200)
-                                            {
-                                                var doc = JsonDocument.Parse(response.Content);
-                                                courseTask = doc.RootElement.Deserialize<CourseTask>();
-                                                courseTask.courseId = courseId;
-                                                if (courseTask.schedules.IsNotEmpty())
-                                                {
-                                                    if (task.schedules.IsNotEmpty()) { 
-                                                    
-                                                    }
-                                                }
-                                                else {
-                                                    courseTask.schedules = task.schedules.IsNotEmpty() ? task.schedules : new List<ScheduleTask>() ;
-                                                }
-                                            }
-                                            else
-                                            {
-                                                courseTask = new CourseTask
-                                                {
-                                                    id = taskId,
-                                                    code = code,
-                                                    expire = -1,
-                                                    weekCount = -1,
-                                                    timeCount = -1,
-                                                    semesterId = task.semesterId,
-                                                    year = task.year,
-                                                    courseId = courseId,
-                                                    ttl = -1,
-                                                    pk = "CourseTask",
-                                                    schedules = task.schedules.IsNotEmpty() ? task.schedules : new List<ScheduleTask>() 
-                                            };
-                                            }
-                                            //到期时间正常访问
-                                            if (task.expire == -1 || courseTask.expire > 1259510400000)
-                                            {
-                                                courseTask.expire = task.expire;
-                                            }
-                                            if (task.weekCount > 0)
-                                            {
-                                                courseTask.weekCount = task.weekCount;
-                                            }
-                                            if (task.timeCount > 0)
-                                            {
-                                                courseTask.timeCount = task.timeCount;
-                                            }
-                                        }
-                                        else {
-                                            return Ok(new {code =1,msg="学期或学年设置错误!" });
-                                        }
-                                        
+                                        await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(task, new PartitionKey(task.code));
                                     }
+                                    return Ok(new {  code=200 });
                                 }
                             }
-                            break;
+                            return BadRequest();
                         }
                 }
-            } catch (Exception ex) { 
+            } catch (Exception ex) {
+               await _dingDing.SendBotMsg($"{_option.Location},课程处理异常,{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
             }
             return Ok();
         }

+ 2 - 2
TEAMModelOS/Controllers/Third/Sc/ScDataInitController.cs

@@ -215,9 +215,9 @@ namespace TEAMModelOS.Controllers.Third
             if (!request.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
             if (!request.TryGetProperty("standard", out JsonElement standard)) return BadRequest();
             var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
-            var ScTeachers1249 = await table.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "ProjectItemID", 1249 } });
+           // var ScTeachers1249 = await table.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "ProjectItemID", 1249 } });
             //数据校验
-            var jsondata = ScTeachers1249.Select(x => new { x.schoolCode, x.tmdid, x.PXID, x.TID, x.TeacherName, x.SchoolName, x.SchoolID, x.Account, x.areaId }).ToJsonString();
+            //var jsondata = ScTeachers1249.Select(x => new { x.schoolCode, x.tmdid, x.PXID, x.TID, x.TeacherName, x.SchoolName, x.SchoolID, x.Account, x.areaId }).ToJsonString();
             //当前区已有的教师
             var ScTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "areaId", $"{areaId}" } });
             //当前区的学校

+ 11 - 6
TEAMModelOS/Controllers/XTest/TestController.cs

@@ -513,34 +513,39 @@ namespace TEAMModelOS.Controllers
             List<dynamic> uploads_rzcl = new List<dynamic>();
             List<dynamic> unupload_video = new List<dynamic>();
             List<dynamic> uploads_video = new List<dynamic>();
-            string sql = "select value c from c ";
+           
             foreach (var teacher in teachers)
             {
                 if (!string.IsNullOrWhiteSpace(teacher.schoolCode) && !string.IsNullOrWhiteSpace(teacher.tmdid))
                 {
+                    int upcont = 0;
+                    string sql = "select value c from c where c.currency=1";
                     await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher)
                     .GetItemQueryIterator<AbilitySub>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"AbilitySub-{teacher.schoolCode}-{teacher.tmdid}") }))
                     {
                         if (item.uploads.IsNotEmpty())
                         {
-                            uploads_rzcl.Add(new { teacher.TeacherName,teacher.SchoolName,teacher.PXID,time= DateTimeOffset.FromUnixTimeMilliseconds(item.uploads.OrderByDescending(m => m.time).FirstOrDefault().time).ToString("yyyy-MM-dd HH:mm:ss") });
+                            upcont++;
+                            uploads_rzcl.Add(new { teacher.TeacherName,teacher.SchoolName,teacher.PXID,time= DateTimeOffset.FromUnixTimeMilliseconds(item.uploads.OrderByDescending(m => m.time).FirstOrDefault().time).ToString("yyyy-MM-dd HH:mm:ss"), teacher?.tmdid });
 
-                        } else {
-                            unupload_rzcl.Add(new { teacher.TeacherName, teacher.SchoolName, teacher.PXID });
                         }
                     }
+                    if(upcont<3)
+                    {
+                       unupload_rzcl.Add(new { teacher.TeacherName, teacher.SchoolName, teacher.PXID ,teacher?.tmdid});
+                    }
                     string sql_video =$"select value c from c where c.id='{teacher.tmdid}'";
                     await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher)
                     .GetItemQueryIterator<ClassVideo>(queryText: sql_video, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"ClassVideo-{teacher.schoolCode}") }))
                     {
                         if (item.files.IsNotEmpty())
                         {
-                            uploads_video.Add(new { teacher.TeacherName, teacher.SchoolName, teacher.PXID, time = DateTimeOffset.FromUnixTimeMilliseconds(item.files.OrderByDescending(m => m.time).FirstOrDefault().time).ToString("yyyy-MM-dd HH:mm:ss") });
+                            uploads_video.Add(new { teacher.TeacherName, teacher.SchoolName, teacher.PXID, time = DateTimeOffset.FromUnixTimeMilliseconds(item.files.OrderByDescending(m => m.time).FirstOrDefault().time).ToString("yyyy-MM-dd HH:mm:ss"), teacher?.tmdid });
 
                         }
                         else
                         {
-                            unupload_video.Add(new { teacher.TeacherName, teacher.SchoolName, teacher.PXID });
+                            unupload_video.Add(new { teacher.TeacherName, teacher.SchoolName, teacher.PXID, teacher?.tmdid });
                         }
                     }
                 }