DataMigrationController.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. namespace TEAMModelOS.Controllers
  24. {
  25. [Route("data-migration")]
  26. [ApiController]
  27. public class DataMigrationController : ControllerBase
  28. {
  29. ///Teacher表
  30. ///
  31. /// 复制的数据
  32. /// Base ==>>Student //IES5&教研中心
  33. /// 迁移的数据 StuCourse ==>> Student //IES5
  34. /// Activity ==>> Student //IES5
  35. ///
  36. private readonly AzureStorageFactory _azureStorage;
  37. private readonly AzureRedisFactory _azureRedis;
  38. private readonly AzureCosmosFactory _azureCosmos;
  39. private readonly DingDing _dingDing;
  40. public DataMigrationController(AzureCosmosFactory azureCosmos, AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, DingDing dingDing)
  41. {
  42. _azureCosmos = azureCosmos;
  43. _azureRedis = azureRedis;
  44. _azureStorage = azureStorage;
  45. _dingDing = dingDing;
  46. }
  47. /// <summary>
  48. /// 迁移教师基础信息,并处理历史数据。
  49. /// </summary>
  50. /// <param name="data"></param>
  51. /// <returns></returns>
  52. [ProducesDefaultResponseType]
  53. //[AuthToken(Roles = "teacher")]
  54. [HttpGet("restore-tmd-course&activity")]
  55. public async Task<IActionResult> RestoreTmdCourseAndActivity()
  56. {
  57. var client = _azureCosmos.GetCosmosClient();
  58. List<StuActivity> activities = new List<StuActivity>();
  59. List<StuCourse> stuCourses = new List<StuCourse>();
  60. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<StuActivity>(queryText: "select value(c) from c where c.pk='Activity'"))
  61. {
  62. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync<StuActivity>(item, partitionKey: new PartitionKey(item.code));
  63. activities.Add(item);
  64. }
  65. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<StuCourse>(queryText: "select value(c) from c where c.pk='StuCourse'"))
  66. {
  67. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync<StuCourse>(item, partitionKey: new PartitionKey(item.code));
  68. stuCourses.Add(item);
  69. }
  70. return Ok(new { activities, stuCourses });
  71. }
  72. /// <summary>
  73. /// 迁移教师基础信息,并处理历史数据。
  74. /// </summary>
  75. /// <param name="data"></param>
  76. /// <returns></returns>
  77. [ProducesDefaultResponseType]
  78. //[AuthToken(Roles = "teacher")]
  79. [HttpGet("restore-tmduser")]
  80. public async Task<IActionResult> RestoreTmdUser()
  81. {
  82. var client = _azureCosmos.GetCosmosClient();
  83. List<TmdUser> users = new List<TmdUser>();
  84. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Teacher>(requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  85. {
  86. ///修复历史数据
  87. if (item.size > 0)
  88. {
  89. if (item.pk == null)
  90. {
  91. item.pk = "Teacher";
  92. await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(item, item.id, partitionKey: new PartitionKey("Base"));
  93. }
  94. try
  95. {
  96. TmdUser user = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<TmdUser>(item.id, partitionKey: new PartitionKey("Base"));
  97. item.schools.ForEach(x => {
  98. if (user.schools.Find(y => y.schoolId.Equals(x.schoolId)) == null)
  99. {
  100. user.schools.Add(new TmdUser.School { name = x.name, schoolId = x.schoolId, time = x.time, status = x.status });
  101. }
  102. });
  103. users.Add(user);
  104. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<TmdUser>(user, user.id, partitionKey: new PartitionKey("Base"));
  105. }
  106. catch (CosmosException ex)
  107. {
  108. if (ex.Status == 404)
  109. {
  110. TmdUser user = item.ToJsonString().ToObject<TmdUser>();
  111. await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync<TmdUser>(user, partitionKey: new PartitionKey("Base"));
  112. users.Add(user);
  113. }
  114. }
  115. }
  116. else
  117. {
  118. await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemAsync<Teacher>(item.id, partitionKey: new PartitionKey("Base"));
  119. }
  120. }
  121. return Ok(new { users });
  122. }
  123. }
  124. }