|
@@ -31,6 +31,11 @@ using static TEAMModelOS.SDK.GroupListService;
|
|
|
using TEAMModelOS.Controllers.Both;
|
|
|
using CourseDto = TEAMModelOS.Controllers.Both.CourseDto;
|
|
|
using DocumentFormat.OpenXml.Drawing.Charts;
|
|
|
+using Grpc.Core;
|
|
|
+using Org.BouncyCastle.Asn1.Ocsp;
|
|
|
+using DocumentFormat.OpenXml.Office2010.Excel;
|
|
|
+using System.Security.Claims;
|
|
|
+using TEAMModelOS.Controllers.Analysis;
|
|
|
|
|
|
namespace TEAMModelOS.Controllers
|
|
|
{
|
|
@@ -1747,92 +1752,527 @@ namespace TEAMModelOS.Controllers
|
|
|
/// <returns></returns>
|
|
|
[ProducesDefaultResponseType]
|
|
|
|
|
|
- [HttpPost("backups")]
|
|
|
+ [HttpPost("process-grouplist-backups")]
|
|
|
#if !DEBUG
|
|
|
[AuthToken(Roles = "teacher,admin")]
|
|
|
[Authorize(Roles = "IES")]
|
|
|
#endif
|
|
|
public async Task<IActionResult> Backups(JsonElement json) {
|
|
|
- if (!json.TryGetProperty("targetStudyYear", out JsonElement _targetStudyYear)) { return BadRequest(); }
|
|
|
- if (!json.TryGetProperty("sourceStudyYear", out JsonElement _sourceStudyYear)) { return BadRequest(); }
|
|
|
- if (!json.TryGetProperty("schoolId", out JsonElement _schoolId)) { return BadRequest(); }
|
|
|
- string schoolId = _schoolId.GetString();
|
|
|
- int targetStudyYear = _targetStudyYear.GetInt32();
|
|
|
- int sourceStudyYear = _sourceStudyYear.GetInt32();
|
|
|
- // var (userid, _, _, schoolId) = HttpContext.GetAuthTokenInfo();
|
|
|
- School school = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(schoolId, new PartitionKey("Base"));
|
|
|
- List<Class> expireClass = new List<Class>();
|
|
|
- List<Class> okClass = new List<Class>();
|
|
|
- foreach (var period in school.period) {
|
|
|
-
|
|
|
- int syear = 0;
|
|
|
- int eyear = 0;
|
|
|
- DateTimeOffset expireData = default;
|
|
|
- //sourceStudyYear:2023 targetStudyYear:2022
|
|
|
- if (sourceStudyYear>targetStudyYear && sourceStudyYear-targetStudyYear==1)
|
|
|
- {
|
|
|
- eyear=targetStudyYear;
|
|
|
- syear= targetStudyYear-period.grades.Count()+1;
|
|
|
- var semesters = period.semesters.Where(x => x.start==1);
|
|
|
- if (semesters!=null && semesters.Count()>0)
|
|
|
+ if (!json.TryGetProperty("grant_type", out JsonElement _grant_type)) return BadRequest();
|
|
|
+ switch (true) {
|
|
|
+ case bool when $"{_grant_type}".Equals("ignore", StringComparison.OrdinalIgnoreCase):
|
|
|
{
|
|
|
- string date = $"{eyear}-{semesters.First().month}-{semesters.First().day}";
|
|
|
- DateTimeOffset.TryParse(date, out expireData);
|
|
|
+ json.TryGetProperty("keys", out JsonElement _keys);
|
|
|
+ List<string> keys = _keys.ToObject<List<string>>();
|
|
|
+ foreach (var key in keys) {
|
|
|
+ var data = await _azureRedis.GetRedisClient(8).StringGetAsync(key);
|
|
|
+ if (data.HasValue)
|
|
|
+ {
|
|
|
+ SemesterStudyYearNotify notify = data.ToString().ToObject<SemesterStudyYearNotify>();
|
|
|
+ notify.ignore=1;
|
|
|
+ await _azureRedis.GetRedisClient(8).StringSetAsync(key, notify.ToJsonString());
|
|
|
+ //3天 * 24 =72小时
|
|
|
+#if DEBUG
|
|
|
+ await _azureRedis.GetRedisClient(8).KeyExpireAsync(key, new TimeSpan(0, 0, 60));
|
|
|
+#else
|
|
|
+ await _azureRedis.GetRedisClient(8).KeyExpireAsync(key, new TimeSpan(72, 0, 0));
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Ok(new { code = 200 });
|
|
|
}
|
|
|
- }
|
|
|
- else if (sourceStudyYear<targetStudyYear && targetStudyYear-sourceStudyYear==1)
|
|
|
- {
|
|
|
- //sourceStudyYear:2023 targetStudyYear:2024
|
|
|
-
|
|
|
- eyear=sourceStudyYear;
|
|
|
- syear= sourceStudyYear-period.grades.Count()+1;
|
|
|
- var semesters = SchoolService.SortSemester(period.semesters);
|
|
|
- if (semesters!=null && semesters.Count()>0)
|
|
|
+ case bool when $"{_grant_type}".Equals("sync_edited", StringComparison.OrdinalIgnoreCase):
|
|
|
{
|
|
|
- string date = $"{eyear}-{semesters.Last().month}-{semesters.Last().day}";
|
|
|
- var semesterInfo = SchoolService.GetSemester(period, time: date);
|
|
|
- expireData= semesterInfo.nextSemester;
|
|
|
+ try {
|
|
|
+ json.TryGetProperty("editedStus", out JsonElement _editedStus);
|
|
|
+ List<GroupListSemester> groupListSemesters = _editedStus.ToObject<List<GroupListSemester>>();
|
|
|
+ List<RMember> syncedMembers = new List<RMember>();
|
|
|
+ foreach (var z in groupListSemesters)
|
|
|
+ {
|
|
|
+ z.code=$"GroupListSemester-{z.school}";
|
|
|
+ Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(z.id, new PartitionKey(z.code));
|
|
|
+ if (response.Status==200)
|
|
|
+ {
|
|
|
+ GroupListSemester groupListSemester = JsonDocument.Parse(response.Content).ToObject<GroupListSemester>();
|
|
|
+ var notIn = z.members.ExceptBy(groupListSemester.members.Select(z => z.id), x => x.id);
|
|
|
+ if (notIn!=null && notIn.Count()>0)
|
|
|
+ {
|
|
|
+ syncedMembers.AddRange(notIn);
|
|
|
+ groupListSemester.members.AddRange(notIn);
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(groupListSemester, new PartitionKey(z.code));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ z.scope="school";
|
|
|
+ z.type="class";
|
|
|
+ z.pk= "GroupListSemester";
|
|
|
+ syncedMembers.AddRange(z.members);
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(z, new PartitionKey(z.code));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Ok(new { code = 200 , syncedMembers });
|
|
|
+ }
|
|
|
+ catch (Exception ex ){
|
|
|
+ await _dingDing.SendBotMsg($"{_option.Location},{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
|
|
|
+ return Ok(new { code = 500 });
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- if (sourceStudyYear==targetStudyYear)
|
|
|
- {
|
|
|
- //sourceStudyYear:2023 targetStudyYear:2024
|
|
|
+ }
|
|
|
+ return Ok(new { code=400 });
|
|
|
+ }
|
|
|
|
|
|
- eyear=sourceStudyYear;
|
|
|
- syear= sourceStudyYear-period.grades.Count()+1;
|
|
|
- var semesters = SchoolService.SortSemester(period.semesters);
|
|
|
- if (semesters!=null && semesters.Count()>0)
|
|
|
- {
|
|
|
- string date = $"{eyear}-{semesters.Last().month}-{semesters.Last().day}";
|
|
|
- var semesterInfo = SchoolService.GetSemester(period, time: date);
|
|
|
- expireData= semesterInfo.nextSemester;
|
|
|
- }
|
|
|
- }
|
|
|
- if (syear>0 && eyear>0)
|
|
|
+ //新学年8.1号开学 ,第二学期开学2.17,设置提示区间60天
|
|
|
+ //2023-8-7 type = "studyYearStarted";新学年已经开始
|
|
|
+ //2023-10-7 type = "";不提示
|
|
|
+ //2024-1-20 type = "semesterEnding";本学期即将结束
|
|
|
+ //2024-3-20 type = "semesterStarted";新学期已经开始
|
|
|
+ //2024-4-20 type = "";不提示
|
|
|
+ //2024-7-20 type = "studyYearEnding";本学年即将结束
|
|
|
+ /// <
|
|
|
+ /// summary>
|
|
|
+ /// 检查当前学期的开学时间和学期结束时间
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="json"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
+
|
|
|
+ [HttpPost("check-class-sync")]
|
|
|
+#if !DEBUG
|
|
|
+[AuthToken(Roles = "teacher,admin")]
|
|
|
+ [Authorize(Roles = "IES")]
|
|
|
+#endif
|
|
|
+ public async Task<IActionResult> CheckSemesters(JsonElement json)
|
|
|
+ {
|
|
|
+ if (!json.TryGetProperty("schoolId", out JsonElement _schoolId)) { return BadRequest(); }
|
|
|
+ School school = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(_schoolId.GetString(), new PartitionKey("Base"));
|
|
|
+
|
|
|
+ List<dynamic> periodNotify = new List<dynamic>();
|
|
|
+ foreach (var period in school.period) {
|
|
|
+ if (period!=null)
|
|
|
{
|
|
|
- long expireTime = expireData.ToUnixTimeSeconds();
|
|
|
- string sqlClass = $"select value c from c where c.year>={syear} and c.year<={eyear} and c.periodId='{period.id}'";
|
|
|
- var resultClasses = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Class>(sqlClass, $"Class-{schoolId}");
|
|
|
- if (resultClasses.list.IsNotEmpty())
|
|
|
+ //var semesterInfo = SchoolService.GetSemester(period, DateTimeOffset.Now.ToUnixTimeMilliseconds());
|
|
|
+ var semesterInfo = SchoolService.GetSemester(period, time:$"{json.GetProperty("time")}");
|
|
|
+ var start = period.semesters.Where(z => z.start==1).FirstOrDefault();
|
|
|
+ if (start!=null)
|
|
|
{
|
|
|
-
|
|
|
- string sqlStudent = $"select distinct value c.classId from c where c.classId in ({string.Join(",", resultClasses.list.Select(z => $"'{z.id}'"))}) and c.periodId='{period.id}' and c._ts>={expireTime}";
|
|
|
- var resultExpireClass = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).GetList<string>(sqlStudent, $"Base-{schoolId}");
|
|
|
- if (resultExpireClass.list.IsNotEmpty())
|
|
|
+
|
|
|
+ var alreadySemester = semesterInfo.date.Subtract(semesterInfo.currSemesterDate);
|
|
|
+ var soonSemester = semesterInfo.nextSemester.Subtract(semesterInfo.date);
|
|
|
+ var semesterStarted = Math.Abs((int)alreadySemester.TotalDays);
|
|
|
+ var semesterEnding = Math.Abs((int)soonSemester.TotalDays);
|
|
|
+
|
|
|
+ string currStudyYear = $"{semesterInfo.studyYear}-{start.month}-{start.day}";
|
|
|
+ string nextStudyYear = $"{(semesterInfo.studyYear+1)}-{start.month}-{start.day}";
|
|
|
+ DateTimeOffset.TryParse(currStudyYear, out DateTimeOffset currYear);
|
|
|
+ DateTimeOffset.TryParse(nextStudyYear, out DateTimeOffset nextYear);
|
|
|
+ var alreadyYear = semesterInfo.date.Subtract(currYear);
|
|
|
+ var soonYear = nextYear.Subtract(semesterInfo.date);
|
|
|
+ var studyYearStarted = Math.Abs((int)alreadyYear.TotalDays);
|
|
|
+ var studyYearEnding = Math.Abs((int)soonYear.TotalDays);
|
|
|
+ string type = string.Empty;
|
|
|
+ //开始天数小于60天
|
|
|
+ if (semesterStarted<=60)
|
|
|
+ {
|
|
|
+ type = "semesterStarted";
|
|
|
+ }
|
|
|
+ //结束天数小于60天
|
|
|
+ if (semesterEnding<=60)
|
|
|
{
|
|
|
- var warnData = resultClasses.list.Where(z => resultExpireClass.list.Contains(z.id));
|
|
|
- if (warnData!=null && warnData.Count()>0) {
|
|
|
- expireClass.AddRange(warnData);
|
|
|
+ type = "semesterEnding";
|
|
|
+
|
|
|
+ }
|
|
|
+ //开始天数小于60天
|
|
|
+ if (studyYearStarted<=60)
|
|
|
+ {
|
|
|
+ type = "studyYearStarted";
|
|
|
+ }
|
|
|
+ //结束天数小于60天
|
|
|
+ if (studyYearEnding<=60)
|
|
|
+ {
|
|
|
+ type = "studyYearEnding";
|
|
|
+ }
|
|
|
+
|
|
|
+ string sqlClass = string.Empty;
|
|
|
+ string idPrefix = string.Empty;
|
|
|
+ string key =string.Empty;
|
|
|
+ var lastSemesterDate = semesterInfo.currSemesterDate.AddDays(-1);
|
|
|
+ var lastSemesterInfo = SchoolService.GetSemester(period, lastSemesterDate.ToUnixTimeMilliseconds());
|
|
|
+ if (type.Contains("Started"))
|
|
|
+ { //semesterStarted studyYearStarted
|
|
|
+ //获取上学期的任意时间,以获取学年,学期信息。
|
|
|
+ sqlClass = $"select value c from c where c.year >={lastSemesterInfo.studyYear-period.grades.Count+1} and c.year <={lastSemesterInfo.studyYear} and c.periodId='{period.id}' ";
|
|
|
+ idPrefix=$"{lastSemesterInfo.studyYear}-{lastSemesterInfo.currSemester.id}-";
|
|
|
+ key = $"SemesterStudyYearNotify:{_schoolId}:{lastSemesterInfo.studyYear}:{lastSemesterInfo.currSemester.id}:{type}";
|
|
|
+ }
|
|
|
+ //Ending //semesterEnding studyYearEnding
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sqlClass = $"select value c from c where c.year >={semesterInfo.studyYear-period.grades.Count+1} and c.year <={semesterInfo.studyYear} and c.periodId='{period.id}' ";
|
|
|
+ idPrefix=$"{semesterInfo.studyYear}-{semesterInfo.currSemester.id}-";
|
|
|
+ key = $"SemesterStudyYearNotify:{_schoolId}:{semesterInfo.studyYear}:{semesterInfo.currSemester.id}:{type}";
|
|
|
+ }
|
|
|
+ var keyExists = await _azureRedis.GetRedisClient(8).KeyExistsAsync(key);
|
|
|
+ if (keyExists)
|
|
|
+ {
|
|
|
+ var data = await _azureRedis.GetRedisClient(8).StringGetAsync(key);
|
|
|
+ if (data.HasValue)
|
|
|
+ {
|
|
|
+ SemesterStudyYearNotify notify = data.ToString().ToObject<SemesterStudyYearNotify>();
|
|
|
+ if (notify.ignore==1)
|
|
|
+ {
|
|
|
+ //忽略提示
|
|
|
+ type="";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //已经处理过的不再处理
|
|
|
+ if (notify.process==1)
|
|
|
+ {
|
|
|
+ type="";
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- var okData= resultClasses.list.Where(z => !resultExpireClass.list.Contains(z.id));
|
|
|
- if (okData!=null && okData.Count()>0) {
|
|
|
- okClass.AddRange(okData);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ await _azureRedis.GetRedisClient(8).StringSetAsync(key, new SemesterStudyYearNotify { studyYear=semesterInfo.studyYear, semester=semesterInfo.currSemester.id, ignore=0, type=type }.ToJsonString());
|
|
|
+ //60天 * 24 =1440小时
|
|
|
+ await _azureRedis.GetRedisClient(8).KeyExpireAsync(key, new TimeSpan(1440, 0, 0));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /*
|
|
|
+ //2022-11-01
|
|
|
+ var dataSemester = SchoolService.GetSemester(period, 1667232000000);
|
|
|
+ string id = $"{dataSemester.studyYear}-{dataSemester.currSemester.id}-{group.id}";
|
|
|
+ string code = $"GroupListSemester-{school.id}";
|
|
|
+ GroupListSemester groupListSemester = group.ToJsonString().ToObject<GroupListSemester>();
|
|
|
+ groupListSemester.id = id;
|
|
|
+ groupListSemester.code = code;
|
|
|
+ groupListSemester.pk="GroupListSemester";
|
|
|
+ groupListSemester.semesterId=dataSemester.currSemester.id;
|
|
|
+ groupListSemester.groupListId=group.id;
|
|
|
+ groupListSemester.studyYear=dataSemester.studyYear;
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync<GroupListSemester>(groupListSemester, new PartitionKey(groupListSemester.code));
|
|
|
+ listSemesters.Add(groupListSemester);
|
|
|
+ */
|
|
|
+
|
|
|
+ //已同步的学生。
|
|
|
+ List<Student> syncedStus = new List<Student>();
|
|
|
+ //未同步的学生
|
|
|
+ //List<dynamic> unsyncStus = new List<dynamic>();
|
|
|
+ //有调整的学生
|
|
|
+ List<dynamic> editedStus = new List<dynamic>();
|
|
|
+ if (!string.IsNullOrWhiteSpace(type))
|
|
|
+ {
|
|
|
+ var resultClasses = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<Class>(sqlClass, $"Class-{school.id}");
|
|
|
+ if (resultClasses.list.IsNotEmpty()) {
|
|
|
+ string sqlStudents = $"select value c from c where c.classId in ({string.Join(",", resultClasses.list.Select(z => $"'{z.id}'"))})";
|
|
|
+ var resultStudents = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).GetList<Student>(sqlStudents, $"Base-{school.id}");
|
|
|
+ if (resultStudents.list.IsNotEmpty()) {
|
|
|
+ foreach (var clazz in resultClasses.list) {
|
|
|
+ string id = $"{idPrefix}{clazz.id}";
|
|
|
+ string code = $"GroupListSemester-{school.id}";
|
|
|
+ var studentList = resultStudents.list.FindAll(z => z.classId.Equals(clazz.id));
|
|
|
+ Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(id, new PartitionKey(code));
|
|
|
+ if (response.Status==200)
|
|
|
+ {
|
|
|
+ bool changeGroupListSemester = false;
|
|
|
+ GroupListSemester groupListSemester = JsonDocument.Parse(response.Content).ToObject<GroupListSemester>();
|
|
|
+ var stuslist = studentList.ExceptBy(groupListSemester.members.Select(z=>z.id), x => x.id);
|
|
|
+ //学年学期结束 不用处理有更新编辑的学生,直接批量处理。
|
|
|
+ if (type.Contains("Ending", StringComparison.OrdinalIgnoreCase)) {
|
|
|
+ if (stuslist.Any() && stuslist.Count()>0)
|
|
|
+ {
|
|
|
+ //var stus = new
|
|
|
+ //{
|
|
|
+ // id=id ,
|
|
|
+ // status=200,
|
|
|
+ // type,
|
|
|
+ // periodId = period.id,
|
|
|
+ // periodName = period.name,
|
|
|
+ // classId = clazz.id,
|
|
|
+ // className = clazz.name,
|
|
|
+ // students = stuslist.Select(z => new { z.id, z.name, z.picture, z._ts })
|
|
|
+ //};
|
|
|
+ groupListSemester.members.AddRange(stuslist.Select(z => new RMember {
|
|
|
+ id= z.id,
|
|
|
+ code=z.schoolId,
|
|
|
+ name =z.name,
|
|
|
+ type=2,
|
|
|
+ picture=z.picture,
|
|
|
+ gender=z.gender,
|
|
|
+ no=z.no,
|
|
|
+ irs=z.irs,
|
|
|
+ classId=z.classId,
|
|
|
+ groupId=z.groupId,
|
|
|
+ groupName=z.groupName,
|
|
|
+ graduate=z.graduate,
|
|
|
+ year=z.year,
|
|
|
+ periodId=z.periodId,
|
|
|
+ }));
|
|
|
+ changeGroupListSemester = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (type.Contains("Started", StringComparison.OrdinalIgnoreCase))
|
|
|
+ {
|
|
|
+ if (stuslist.Any() && stuslist.Count()>0) {
|
|
|
+ //获取开学时间
|
|
|
+ var kxdata = $"{semesterInfo.currSemesterDate.Year}-{semesterInfo.currSemester.month}-{semesterInfo.currSemester.day}";
|
|
|
+ DateTimeOffset.TryParse(kxdata, out DateTimeOffset kxData);
|
|
|
+ long time = kxData.ToUnixTimeSeconds();
|
|
|
+ var editStu = stuslist.Where(z => z._ts>=time);
|
|
|
+ if (editStu!=null && editStu.Count()>0) {
|
|
|
+ var stus = new
|
|
|
+ {
|
|
|
+ id = id,
|
|
|
+ status = 404,
|
|
|
+ type,
|
|
|
+ periodId = period.id,
|
|
|
+ periodName = period.name,
|
|
|
+ groupListId = clazz.id,
|
|
|
+ name = clazz.name,
|
|
|
+ className = clazz.name,
|
|
|
+ school = school.id,
|
|
|
+ no = clazz.no,
|
|
|
+ year = clazz.year,
|
|
|
+ studyYear = lastSemesterInfo.studyYear,
|
|
|
+ semesterId = lastSemesterInfo.currSemester.id,
|
|
|
+ leader = clazz.teacher?.id,
|
|
|
+ grades = new List<int> { clazz.year },
|
|
|
+ members = editStu.Select(z => new {
|
|
|
+ z.id,
|
|
|
+ code = z.schoolId,
|
|
|
+ gender = z.gender,
|
|
|
+ no = z.no,
|
|
|
+ irs = z.irs,
|
|
|
+ classId = z.classId,
|
|
|
+ groupId = z.groupId,
|
|
|
+ groupName = z.groupName,
|
|
|
+ graduate = z.graduate,
|
|
|
+ periodId = z.periodId,
|
|
|
+ z.name,
|
|
|
+ z.picture,
|
|
|
+ z._ts,
|
|
|
+ z.year
|
|
|
+ })
|
|
|
+ };
|
|
|
+ editedStus.Add(stus);
|
|
|
+ }
|
|
|
+ var uneditStu = studentList.Where(z => z._ts<time);
|
|
|
+ if (uneditStu!=null &&uneditStu.Count()>0)
|
|
|
+ {
|
|
|
+ //var stus = new
|
|
|
+ //{
|
|
|
+ // id = id,
|
|
|
+ // status = 200,
|
|
|
+ // type,
|
|
|
+ // periodId = period.id,
|
|
|
+ // periodName = period.name,
|
|
|
+ // classId = clazz.id,
|
|
|
+ // className = clazz.name,
|
|
|
+ // students = uneditStu.Select(z => new { z.id, z.name, z.picture, z._ts })
|
|
|
+ //};
|
|
|
+ groupListSemester.members.AddRange(uneditStu.Select(z => new RMember
|
|
|
+ {
|
|
|
+ id= z.id,
|
|
|
+ code=z.schoolId,
|
|
|
+ name =z.name,
|
|
|
+ type=2,
|
|
|
+ picture=z.picture,
|
|
|
+ gender=z.gender,
|
|
|
+ no=z.no,
|
|
|
+ irs=z.irs,
|
|
|
+ classId=z.classId,
|
|
|
+ groupId=z.groupId,
|
|
|
+ groupName=z.groupName,
|
|
|
+ graduate=z.graduate,
|
|
|
+ year=z.year,
|
|
|
+ periodId=z.periodId,
|
|
|
+ }));
|
|
|
+ changeGroupListSemester = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (changeGroupListSemester) {
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync(groupListSemester, new PartitionKey(code));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //学年学期结束 不用处理有更新编辑的学生,直接批量处理。
|
|
|
+ if (type.Contains("Ending", StringComparison.OrdinalIgnoreCase))
|
|
|
+ {
|
|
|
+ //var stus = new
|
|
|
+ //{
|
|
|
+ // id = id,
|
|
|
+ // status = 404,
|
|
|
+ // type,
|
|
|
+ // periodId = period.id,
|
|
|
+ // periodName = period.name,
|
|
|
+ // classId = clazz.id,
|
|
|
+ // className = clazz.name,
|
|
|
+ // students = studentList.Select(z => new { z.id, z.name, z.picture, z._ts })
|
|
|
+ //};
|
|
|
+
|
|
|
+ GroupListSemester groupListSemester = new GroupListSemester();
|
|
|
+ groupListSemester.id = id;
|
|
|
+ groupListSemester.name=clazz.name;
|
|
|
+ groupListSemester.no=clazz.no;
|
|
|
+ groupListSemester.periodId=period.id;
|
|
|
+ groupListSemester.scope="school";
|
|
|
+ groupListSemester.school=school.id;
|
|
|
+ groupListSemester.type="class";
|
|
|
+ groupListSemester.year=clazz.year;
|
|
|
+ groupListSemester.studyYear=semesterInfo.studyYear;
|
|
|
+ groupListSemester.code = code;
|
|
|
+ groupListSemester.pk="GroupListSemester";
|
|
|
+ groupListSemester.semesterId=semesterInfo.currSemester.id;
|
|
|
+ groupListSemester.groupListId=clazz.id;
|
|
|
+ groupListSemester.members.AddRange(studentList.Select(z => new RMember
|
|
|
+ {
|
|
|
+ id= z.id,
|
|
|
+ code=z.schoolId,
|
|
|
+ name =z.name,
|
|
|
+ type=2,
|
|
|
+ picture=z.picture,
|
|
|
+ gender=z.gender,
|
|
|
+ no=z.no,
|
|
|
+ irs=z.irs,
|
|
|
+ classId=z.classId,
|
|
|
+ groupId=z.groupId,
|
|
|
+ groupName=z.groupName,
|
|
|
+ graduate=z.graduate,
|
|
|
+ year=z.year,
|
|
|
+ periodId=z.periodId,
|
|
|
+ }));
|
|
|
+ groupListSemester.scount = groupListSemester.members.Count();
|
|
|
+ groupListSemester.leader=clazz.teacher?.id;
|
|
|
+ groupListSemester.grades.Add(clazz.year);
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync<GroupListSemester>(groupListSemester, new PartitionKey(groupListSemester.code));
|
|
|
+ }
|
|
|
+ //开始则需要处理当前学期有变更的学生数据
|
|
|
+ if (type.Contains("Started", StringComparison.OrdinalIgnoreCase))
|
|
|
+ {
|
|
|
+ //获取开学时间
|
|
|
+ var kxdata = $"{semesterInfo.currSemesterDate.Year}-{semesterInfo.currSemester.month}-{semesterInfo.currSemester.day}";
|
|
|
+ DateTimeOffset.TryParse(kxdata, out DateTimeOffset kxData);
|
|
|
+ long time = kxData.ToUnixTimeSeconds();
|
|
|
+ //在开学日期之后编辑的学生
|
|
|
+ var editStu = studentList.FindAll(z => z._ts>=time);
|
|
|
+ if (editStu.IsNotEmpty()) {
|
|
|
+ var stus = new
|
|
|
+ {
|
|
|
+ id = id,
|
|
|
+ status = 404,
|
|
|
+ type,
|
|
|
+ periodId = period.id,
|
|
|
+ periodName = period.name,
|
|
|
+ groupListId = clazz.id,
|
|
|
+ name = clazz.name,
|
|
|
+ className = clazz.name,
|
|
|
+ school = school.id,
|
|
|
+ no = clazz.no,
|
|
|
+ year = clazz.year,
|
|
|
+ studyYear = lastSemesterInfo.studyYear,
|
|
|
+ semesterId = lastSemesterInfo.currSemester.id,
|
|
|
+ leader = clazz.teacher?.id,
|
|
|
+ grades = new List<int> { clazz.year },
|
|
|
+ members = editStu.Select(z => new { z.id,
|
|
|
+ code = z.schoolId,
|
|
|
+ gender = z.gender,
|
|
|
+ no = z.no,
|
|
|
+ irs = z.irs,
|
|
|
+ classId = z.classId,
|
|
|
+ groupId = z.groupId,
|
|
|
+ groupName = z.groupName,
|
|
|
+ graduate = z.graduate,
|
|
|
+ periodId = z.periodId,
|
|
|
+ z.name, z.picture, z._ts,z.year })
|
|
|
+ };
|
|
|
+ editedStus.Add(stus);
|
|
|
+ }
|
|
|
+ //在开学日期之前编辑的学生
|
|
|
+ var uneditStu = studentList.FindAll(z => z._ts<time);
|
|
|
+ if (uneditStu.IsNotEmpty()) {
|
|
|
+ //var stus = new
|
|
|
+ //{
|
|
|
+ // id = id,
|
|
|
+ // status = 404,
|
|
|
+ // type,
|
|
|
+ // periodId = period.id,
|
|
|
+ // periodName = period.name,
|
|
|
+ // classId = clazz.id,
|
|
|
+ // className = clazz.name,
|
|
|
+ // students = uneditStu.Select(z => new { z.id, z.name, z.picture, z._ts })
|
|
|
+ //};
|
|
|
+ GroupListSemester groupListSemester = new GroupListSemester();
|
|
|
+ groupListSemester.id = id;
|
|
|
+ groupListSemester.name=clazz.name;
|
|
|
+ groupListSemester.no=clazz.no;
|
|
|
+ groupListSemester.periodId=period.id;
|
|
|
+ groupListSemester.scope="school";
|
|
|
+ groupListSemester.school=school.id;
|
|
|
+ groupListSemester.type="class";
|
|
|
+ groupListSemester.year=clazz.year;
|
|
|
+ groupListSemester.studyYear=lastSemesterInfo.studyYear;
|
|
|
+ groupListSemester.code = code;
|
|
|
+ groupListSemester.pk="GroupListSemester";
|
|
|
+ groupListSemester.semesterId=lastSemesterInfo.currSemester.id;
|
|
|
+ groupListSemester.groupListId=clazz.id;
|
|
|
+ groupListSemester.members.AddRange(studentList.Select(z => new RMember
|
|
|
+ {
|
|
|
+ id= z.id,
|
|
|
+ code=z.schoolId,
|
|
|
+ name =z.name,
|
|
|
+ type=2,
|
|
|
+ picture=z.picture,
|
|
|
+ gender=z.gender,
|
|
|
+ no=z.no,
|
|
|
+ irs=z.irs,
|
|
|
+ classId=z.classId,
|
|
|
+ groupId=z.groupId,
|
|
|
+ groupName=z.groupName,
|
|
|
+ graduate=z.graduate,
|
|
|
+ year=z.year,
|
|
|
+ periodId=z.periodId,
|
|
|
+ }));
|
|
|
+ groupListSemester.scount = groupListSemester.members.Count();
|
|
|
+ groupListSemester.leader=clazz.teacher?.id;
|
|
|
+ groupListSemester.grades.Add(clazz.year);
|
|
|
+ await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).UpsertItemAsync<GroupListSemester>(groupListSemester, new PartitionKey(groupListSemester.code));
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ //已经处理过的数据则不需要在进行处理
|
|
|
+ if (editedStus.IsEmpty() && !string.IsNullOrWhiteSpace(type))
|
|
|
+ {
|
|
|
+ keyExists = await _azureRedis.GetRedisClient(8).KeyExistsAsync(key);
|
|
|
+ if (keyExists)
|
|
|
+ {
|
|
|
+ var data = await _azureRedis.GetRedisClient(8).StringGetAsync(key);
|
|
|
+ if (data.HasValue)
|
|
|
+ {
|
|
|
+ SemesterStudyYearNotify notify = data.ToString().ToObject<SemesterStudyYearNotify>();
|
|
|
+ notify.process = 1;
|
|
|
+ await _azureRedis.GetRedisClient(8).StringSetAsync(key, notify.ToJsonString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ type="";
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ periodNotify.Add(new { studyYearStarted, studyYearEnding, semesterStarted, semesterEnding, type, key, editedStus, periodId = period.id, periodName = period.name });
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- return Ok(new { expireClass, okClass });
|
|
|
+ return Ok(new { code = 200, periodNotify });
|
|
|
}
|
|
|
}
|
|
|
}
|