123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- using Azure.Cosmos;
- using Microsoft.AspNetCore.Http;
- using Microsoft.AspNetCore.Mvc;
- using Newtonsoft.Json;
- using StackExchange.Redis;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Net.Http.Json;
- using System.Text;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Models.Cosmos.Common;
- using TEAMModelOS.SDK.Models.Service;
- using TEAMModelOS.Services.Common;
- using HTEXLib.COMM.Helpers;
- namespace TEAMModelOS.Controllers
- {
- [Route("data-migration")]
- [ApiController]
- public class DataMigrationController : ControllerBase
- {
- ///Teacher表
- ///
- /// 复制的数据
- /// Base ==>>Student //IES5&教研中心
- /// 迁移的数据 StuCourse ==>> Student //IES5
- /// Activity ==>> Student //IES5
- ///
-
- private readonly AzureStorageFactory _azureStorage;
- private readonly AzureRedisFactory _azureRedis;
- private readonly AzureCosmosFactory _azureCosmos;
- private readonly DingDing _dingDing;
- public DataMigrationController(AzureCosmosFactory azureCosmos, AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, DingDing dingDing)
- {
- _azureCosmos = azureCosmos;
- _azureRedis = azureRedis;
- _azureStorage = azureStorage;
- _dingDing = dingDing;
- }
- /// <summary>
- /// 迁移教师基础信息,并处理历史数据。
- /// </summary>
- /// <param name="data"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "teacher")]
- [HttpGet("restore-stulist")]
- public async Task<IActionResult> RestoreStulist() {
- try {
- var client = _azureCosmos.GetCosmosClient();
- List<School> schools = new List<School>(0);
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: "SELECT value(c) FROM c", requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") }))
- {
- schools.Add(item);
- }
- foreach (var school in schools)
- {
- // List<GroupList> teachlists = new List<GroupList>();
- // List<GroupList> reschlists = new List<GroupList>();
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<StuList>(queryText: "SELECT value(c) FROM c", requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"StuList-{school.id}") }))
- {
- List<Member> members = new List<Member>();
- if (item.students.IsNotEmpty())
- {
- item.students.ForEach(x => {
- members.Add(new Member { id = x.id, code = x.code.Replace("Base-", ""), type = 2 });
- });
- }
- if (item.tmids.IsNotEmpty())
- {
- item.tmids.ForEach(x => {
- members.Add(new Member { id = x, type = 1 });
- });
- }
- GroupList group = new GroupList
- {
- year=DateTimeOffset.UtcNow.Year,
- pk = "GroupList",
- id = item.id,
- code = $"GroupList-{school.id}",
- name = item.name,
- ttl = -1,
- no = item.no,
- periodId = string.IsNullOrEmpty(item.periodId) ? school.period[0]?.id : item.periodId,
- scope = "school",
- creatorId = item.creatorId,
- type = "teach",
- members = members,
- tcount = members.FindAll(x => x.type == 1).Count,
- scount = members.FindAll(x => x.type == 2).Count,
- school = school.id
- };
- await client.GetContainer(Constant.TEAMModelOS, "School").UpsertItemAsync(group, new PartitionKey(group.code));
- // teachlists.Add(group);
- }
- //if (teachlists.IsNotEmpty())
- //{
- // await GroupListService.GetGroupListMemberInfo(client, "teach", teachlists, "School", _dingDing);
- //}
-
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<TchList>(queryText: "SELECT value(c) FROM c", requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"TchList-{school.id}") }))
- {
- List<Member> members = new List<Member>();
- if (item.teachers.IsNotEmpty())
- {
- item.teachers.ForEach(x => {
- members.Add(new Member { id = x, type = 1 });
- });
- }
- GroupList group = new GroupList
- {
- year = DateTimeOffset.UtcNow.Year,
- pk = "GroupList",
- id = item.id,
- code = $"GroupList-{school.id}",
- name = item.name,
- ttl = -1,
- no = item.no,
- scope = "school",
- creatorId = item.creatorId,
- type = "research",
- members = members,
- tcount = members.FindAll(x => x.type == 1).Count,
- scount = members.FindAll(x => x.type == 2).Count,
- school = school.id
- };
- await client.GetContainer(Constant.TEAMModelOS, "School").UpsertItemAsync(group, new PartitionKey(group.code));
- // reschlists.Add(group);
- }
- //if (reschlists.IsNotEmpty())
- //{
- // await GroupListService.GetGroupListMemberInfo(client, "research", reschlists, "School", _dingDing);
- //}
-
- }
- // List<GroupList> groupLists = new List<GroupList>();
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<StuList>(queryText: "SELECT value(c) FROM c", requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"StuList") }))
- {
- List<Member> members = new List<Member>();
- if (item.students.IsNotEmpty())
- {
- item.students.ForEach(x => {
- members.Add(new Member { id = x.id, code = x.code.Replace("Base-", ""), type = 2 });
- });
- }
- if (item.tmids.IsNotEmpty())
- {
- item.tmids.ForEach(x => {
- members.Add(new Member { id = x, type = 1 });
- });
- }
- GroupList group = new GroupList
- {
- year = DateTimeOffset.UtcNow.Year,
- pk = "GroupList",
- id = item.id,
- code = $"GroupList",
- name = item.name,
- ttl = -1,
- no = item.no,
- scope = "school",
- creatorId = item.creatorId,
- type = "teach",
- tcount = members.FindAll(x => x.type == 1).Count,
- scount = members.FindAll(x => x.type == 2).Count,
- members = members,
- };
- await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(group, new PartitionKey(group.code));
- //groupLists.Add(group);
- }
- // await GroupListService.GetGroupListMemberInfo(client, "teach", groupLists, "Teacher",_dingDing);
- }
- catch (Exception ex) {
- await _dingDing.SendBotMsg($"OS,restore-stulist()\n{ex.Message}{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
- }
- return Ok();
- }
- /// <summary>
- /// 迁移教师基础信息,并处理历史数据。
- /// </summary>
- /// <param name="data"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "teacher")]
- [HttpGet("restore-tmd-course&activity")]
- public async Task<IActionResult> RestoreTmdCourseAndActivity()
- {
- var client = _azureCosmos.GetCosmosClient();
- List<StuActivity> activities = new List<StuActivity>();
- List<StuCourse> stuCourses = new List<StuCourse>();
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<StuActivity>(queryText: "select value(c) from c where c.pk='Activity'"))
- {
- await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync<StuActivity>(item, partitionKey: new PartitionKey(item.code));
- activities.Add(item);
- }
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<StuCourse>(queryText: "select value(c) from c where c.pk='StuCourse'"))
- {
- await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync<StuCourse>(item, partitionKey: new PartitionKey(item.code));
- stuCourses.Add(item);
- }
- return Ok(new { activities, stuCourses });
- }
- /// <summary>
- /// 迁移教师基础信息,并处理历史数据。
- /// </summary>
- /// <param name="data"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "teacher")]
- [HttpGet("restore-tmduser")]
- public async Task<IActionResult> RestoreTmdUser()
- {
- var client = _azureCosmos.GetCosmosClient();
- List<TmdUser> users = new List<TmdUser>();
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Teacher>(requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
- {
- ///修复历史数据
- if (item.size > 0)
- {
- if (item.pk == null)
- {
- item.pk = "Teacher";
- await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(item, item.id, partitionKey: new PartitionKey("Base"));
- }
- try
- {
- TmdUser user = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<TmdUser>(item.id, partitionKey: new PartitionKey("Base"));
- item.schools.ForEach(x => {
- if (user.schools.Find(y => y.schoolId.Equals(x.schoolId)) == null)
- {
- user.schools.Add(new TmdUser.School { name = x.name, schoolId = x.schoolId, time = x.time, status = x.status });
- }
- });
- users.Add(user);
- await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<TmdUser>(user, user.id, partitionKey: new PartitionKey("Base"));
- }
- catch (CosmosException ex)
- {
- if (ex.Status == 404)
- {
- TmdUser user = item.ToJsonString().ToObject<TmdUser>();
- await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync<TmdUser>(user, partitionKey: new PartitionKey("Base"));
- users.Add(user);
- }
- }
- }
- else
- {
- await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemAsync<Teacher>(item.id, partitionKey: new PartitionKey("Base"));
- }
- }
- return Ok(new { users });
- }
- }
- }
|