DataMigrationController.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. using Azure.Cosmos;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Newtonsoft.Json;
  5. using StackExchange.Redis;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Net;
  11. using System.Net.Http;
  12. using System.Net.Http.Json;
  13. using System.Text;
  14. using System.Text.Json;
  15. using System.Threading.Tasks;
  16. using TEAMModelOS.SDK.DI;
  17. using TEAMModelOS.SDK.Extension;
  18. using TEAMModelOS.SDK;
  19. using TEAMModelOS.SDK.Models;
  20. using TEAMModelOS.SDK.Models.Cosmos.Common;
  21. using TEAMModelOS.SDK.Models.Service;
  22. using TEAMModelOS.Services.Common;
  23. using HTEXLib.COMM.Helpers;
  24. namespace TEAMModelOS.Controllers
  25. {
  26. [Route("data-migration")]
  27. [ApiController]
  28. public class DataMigrationController : ControllerBase
  29. {
  30. ///Teacher表
  31. ///
  32. /// 复制的数据
  33. /// Base ==>>Student //IES5&教研中心
  34. /// 迁移的数据 StuCourse ==>> Student //IES5
  35. /// Activity ==>> Student //IES5
  36. ///
  37. private readonly AzureStorageFactory _azureStorage;
  38. private readonly AzureRedisFactory _azureRedis;
  39. private readonly AzureCosmosFactory _azureCosmos;
  40. private readonly DingDing _dingDing;
  41. public DataMigrationController(AzureCosmosFactory azureCosmos, AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, DingDing dingDing)
  42. {
  43. _azureCosmos = azureCosmos;
  44. _azureRedis = azureRedis;
  45. _azureStorage = azureStorage;
  46. _dingDing = dingDing;
  47. }
  48. /// <summary>
  49. /// 迁移教师基础信息,并处理历史数据。
  50. /// </summary>
  51. /// <param name="data"></param>
  52. /// <returns></returns>
  53. [ProducesDefaultResponseType]
  54. //[AuthToken(Roles = "teacher")]
  55. [HttpGet("restore-stulist")]
  56. public async Task<IActionResult> RestoreStulist() {
  57. try {
  58. var client = _azureCosmos.GetCosmosClient();
  59. List<School> schools = new List<School>(0);
  60. 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") }))
  61. {
  62. schools.Add(item);
  63. }
  64. foreach (var school in schools)
  65. {
  66. // List<GroupList> teachlists = new List<GroupList>();
  67. // List<GroupList> reschlists = new List<GroupList>();
  68. 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}") }))
  69. {
  70. List<Member> members = new List<Member>();
  71. if (item.students.IsNotEmpty())
  72. {
  73. item.students.ForEach(x => {
  74. members.Add(new Member { id = x.id, code = x.code.Replace("Base-", ""), type = 2 });
  75. });
  76. }
  77. if (item.tmids.IsNotEmpty())
  78. {
  79. item.tmids.ForEach(x => {
  80. members.Add(new Member { id = x, type = 1 });
  81. });
  82. }
  83. GroupList group = new GroupList
  84. {
  85. year=DateTimeOffset.UtcNow.Year,
  86. pk = "GroupList",
  87. id = item.id,
  88. code = $"GroupList-{school.id}",
  89. name = item.name,
  90. ttl = -1,
  91. no = item.no,
  92. periodId = string.IsNullOrEmpty(item.periodId) ? school.period[0]?.id : item.periodId,
  93. scope = "school",
  94. creatorId = item.creatorId,
  95. type = "teach",
  96. members = members,
  97. tcount = members.FindAll(x => x.type == 1).Count,
  98. scount = members.FindAll(x => x.type == 2).Count,
  99. school = school.id
  100. };
  101. await client.GetContainer(Constant.TEAMModelOS, "School").UpsertItemAsync(group, new PartitionKey(group.code));
  102. // teachlists.Add(group);
  103. }
  104. //if (teachlists.IsNotEmpty())
  105. //{
  106. // await GroupListService.GetGroupListMemberInfo(client, "teach", teachlists, "School", _dingDing);
  107. //}
  108. 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}") }))
  109. {
  110. List<Member> members = new List<Member>();
  111. if (item.teachers.IsNotEmpty())
  112. {
  113. item.teachers.ForEach(x => {
  114. members.Add(new Member { id = x, type = 1 });
  115. });
  116. }
  117. GroupList group = new GroupList
  118. {
  119. year = DateTimeOffset.UtcNow.Year,
  120. pk = "GroupList",
  121. id = item.id,
  122. code = $"GroupList-{school.id}",
  123. name = item.name,
  124. ttl = -1,
  125. no = item.no,
  126. scope = "school",
  127. creatorId = item.creatorId,
  128. type = "research",
  129. members = members,
  130. tcount = members.FindAll(x => x.type == 1).Count,
  131. scount = members.FindAll(x => x.type == 2).Count,
  132. school = school.id
  133. };
  134. await client.GetContainer(Constant.TEAMModelOS, "School").UpsertItemAsync(group, new PartitionKey(group.code));
  135. // reschlists.Add(group);
  136. }
  137. //if (reschlists.IsNotEmpty())
  138. //{
  139. // await GroupListService.GetGroupListMemberInfo(client, "research", reschlists, "School", _dingDing);
  140. //}
  141. }
  142. // List<GroupList> groupLists = new List<GroupList>();
  143. 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") }))
  144. {
  145. List<Member> members = new List<Member>();
  146. if (item.students.IsNotEmpty())
  147. {
  148. item.students.ForEach(x => {
  149. members.Add(new Member { id = x.id, code = x.code.Replace("Base-", ""), type = 2 });
  150. });
  151. }
  152. if (item.tmids.IsNotEmpty())
  153. {
  154. item.tmids.ForEach(x => {
  155. members.Add(new Member { id = x, type = 1 });
  156. });
  157. }
  158. GroupList group = new GroupList
  159. {
  160. year = DateTimeOffset.UtcNow.Year,
  161. pk = "GroupList",
  162. id = item.id,
  163. code = $"GroupList",
  164. name = item.name,
  165. ttl = -1,
  166. no = item.no,
  167. scope = "school",
  168. creatorId = item.creatorId,
  169. type = "teach",
  170. tcount = members.FindAll(x => x.type == 1).Count,
  171. scount = members.FindAll(x => x.type == 2).Count,
  172. members = members,
  173. };
  174. await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(group, new PartitionKey(group.code));
  175. //groupLists.Add(group);
  176. }
  177. // await GroupListService.GetGroupListMemberInfo(client, "teach", groupLists, "Teacher",_dingDing);
  178. }
  179. catch (Exception ex) {
  180. await _dingDing.SendBotMsg($"OS,restore-stulist()\n{ex.Message}{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
  181. }
  182. return Ok();
  183. }
  184. /// <summary>
  185. /// 迁移教师基础信息,并处理历史数据。
  186. /// </summary>
  187. /// <param name="data"></param>
  188. /// <returns></returns>
  189. [ProducesDefaultResponseType]
  190. //[AuthToken(Roles = "teacher")]
  191. [HttpGet("restore-tmd-course&activity")]
  192. public async Task<IActionResult> RestoreTmdCourseAndActivity()
  193. {
  194. var client = _azureCosmos.GetCosmosClient();
  195. List<StuActivity> activities = new List<StuActivity>();
  196. List<StuCourse> stuCourses = new List<StuCourse>();
  197. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<StuActivity>(queryText: "select value(c) from c where c.pk='Activity'"))
  198. {
  199. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync<StuActivity>(item, partitionKey: new PartitionKey(item.code));
  200. activities.Add(item);
  201. }
  202. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<StuCourse>(queryText: "select value(c) from c where c.pk='StuCourse'"))
  203. {
  204. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync<StuCourse>(item, partitionKey: new PartitionKey(item.code));
  205. stuCourses.Add(item);
  206. }
  207. return Ok(new { activities, stuCourses });
  208. }
  209. /// <summary>
  210. /// 迁移教师基础信息,并处理历史数据。
  211. /// </summary>
  212. /// <param name="data"></param>
  213. /// <returns></returns>
  214. [ProducesDefaultResponseType]
  215. //[AuthToken(Roles = "teacher")]
  216. [HttpGet("restore-tmduser")]
  217. public async Task<IActionResult> RestoreTmdUser()
  218. {
  219. var client = _azureCosmos.GetCosmosClient();
  220. List<TmdUser> users = new List<TmdUser>();
  221. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Teacher>(requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  222. {
  223. ///修复历史数据
  224. if (item.size > 0)
  225. {
  226. if (item.pk == null)
  227. {
  228. item.pk = "Teacher";
  229. await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(item, item.id, partitionKey: new PartitionKey("Base"));
  230. }
  231. try
  232. {
  233. TmdUser user = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<TmdUser>(item.id, partitionKey: new PartitionKey("Base"));
  234. item.schools.ForEach(x => {
  235. if (user.schools.Find(y => y.schoolId.Equals(x.schoolId)) == null)
  236. {
  237. user.schools.Add(new TmdUser.School { name = x.name, schoolId = x.schoolId, time = x.time, status = x.status });
  238. }
  239. });
  240. users.Add(user);
  241. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<TmdUser>(user, user.id, partitionKey: new PartitionKey("Base"));
  242. }
  243. catch (CosmosException ex)
  244. {
  245. if (ex.Status == 404)
  246. {
  247. TmdUser user = item.ToJsonString().ToObject<TmdUser>();
  248. await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync<TmdUser>(user, partitionKey: new PartitionKey("Base"));
  249. users.Add(user);
  250. }
  251. }
  252. }
  253. else
  254. {
  255. await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemAsync<Teacher>(item.id, partitionKey: new PartitionKey("Base"));
  256. }
  257. }
  258. return Ok(new { users });
  259. }
  260. }
  261. }