FixDataController.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  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("fix-data")]
  27. [ApiController]
  28. public class FixDataController : ControllerBase
  29. {
  30. private readonly AzureStorageFactory _azureStorage;
  31. private readonly AzureRedisFactory _azureRedis;
  32. private readonly AzureCosmosFactory _azureCosmos;
  33. private readonly DingDing _dingDing;
  34. public FixDataController(AzureCosmosFactory azureCosmos, AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, DingDing dingDing)
  35. {
  36. _azureCosmos = azureCosmos;
  37. _azureRedis = azureRedis;
  38. _azureStorage = azureStorage;
  39. _dingDing = dingDing;
  40. }
  41. /// <summary>
  42. /// 修复学生的id
  43. /// </summary>
  44. /// <param name="data"></param>
  45. /// <returns></returns>
  46. [ProducesDefaultResponseType]
  47. //[AuthToken(Roles = "teacher")]
  48. [HttpPost("fix-student-id")]
  49. public async Task<IActionResult> FixStudentId(JsonElement data) {
  50. var client = _azureCosmos.GetCosmosClient();
  51. var queryslt = $"SELECT value(c) FROM c ";
  52. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<Student>(queryText: queryslt)) {
  53. //item.id
  54. }
  55. return Ok();
  56. }
  57. /// <summary>
  58. /// 修复学生的id
  59. /// </summary>
  60. /// <param name="data"></param>
  61. /// <returns></returns>
  62. [ProducesDefaultResponseType]
  63. //[AuthToken(Roles = "teacher")]
  64. [HttpPost("fix-school")]
  65. public async Task<IActionResult> FixSchool(JsonElement data)
  66. {
  67. List<string> arr = new List<string> { "xnygxx",
  68. "xcsyxx",
  69. "lxxcfx",
  70. "gxjrxx",
  71. "cdgxsx",
  72. "yzxx",
  73. "njtsjy",
  74. "lrtsxx",
  75. "rhsyzx",
  76. "wjylxx",
  77. "yfps",
  78. "kjyxx",
  79. "dsgjxx",
  80. "ydzt",
  81. "hqrh",
  82. "czmdzz",
  83. "hsbhmz",
  84. "cdtmd",
  85. "hbcn",
  86. "habook"};
  87. var client = _azureCosmos.GetCosmosClient();
  88. 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") }))
  89. {
  90. if (string.IsNullOrEmpty(item.areaId)) {
  91. item.standard = "standard2";
  92. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(item, item.id, new PartitionKey("Base"));
  93. }
  94. //if (arr.Contains(item.id))
  95. //{
  96. // item.areaId = "02944f32-f534-3397-ea56-e6f1fc6c3714";
  97. // item.standard = "standard2";
  98. // await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(item, item.id, new PartitionKey("Base"));
  99. //}
  100. //else if (item.standard.Equals("standard2")) {
  101. // item.areaId = null;
  102. // item.standard = null;
  103. // await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(item, item.id, new PartitionKey("Base"));
  104. //}
  105. }
  106. return Ok();
  107. }
  108. [ProducesDefaultResponseType]
  109. //[AuthToken(Roles = "teacher")]
  110. [HttpPost("fix-item")]
  111. public async Task<IActionResult> FixItem(JsonElement data) {
  112. var client = _azureCosmos.GetCosmosClient();
  113. List<School> schools = new List<School>();
  114. 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") })){
  115. schools.Add(item);
  116. }
  117. Random random = new Random();
  118. foreach (var school in schools) {
  119. List<ItemInfo> items = new List<ItemInfo>();
  120. var queryslt = $"SELECT value(c) FROM c where c.pid = null ";
  121. List<ItemInfo> noPeriodId = new List<ItemInfo>();
  122. List<ItemInfo> noSubjectId = new List<ItemInfo>();
  123. List<ItemInfo> noGradeIds = new List<ItemInfo>();
  124. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<ItemInfo>(queryText: queryslt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{school.id}") }))
  125. {
  126. if (string.IsNullOrEmpty(item.periodId))
  127. {
  128. noPeriodId.Add(item);
  129. }
  130. if (string.IsNullOrEmpty(item.subjectId))
  131. {
  132. noSubjectId.Add(item);
  133. }
  134. if (!item.gradeIds.IsNotEmpty())
  135. {
  136. noGradeIds.Add(item);
  137. }
  138. bool errorData = false;
  139. foreach (var x in item.gradeIds)
  140. {
  141. if (string.IsNullOrEmpty(x))
  142. {
  143. errorData = true;
  144. }
  145. }
  146. if (errorData)
  147. {
  148. List<string> grds = new List<string>();
  149. item.gradeIds.ForEach(x => {
  150. if (string.IsNullOrEmpty(x))
  151. {
  152. grds.Add($"{random.Next(0, 5)}");
  153. }
  154. else
  155. {
  156. grds.Add(x);
  157. }
  158. });
  159. item.gradeIds = grds;
  160. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<ItemInfo>(item, item.id, new PartitionKey(item.code));
  161. }
  162. items.Add(item);
  163. }
  164. List<ItemInfo> unMatch = new List<ItemInfo>();
  165. foreach (var item in items)
  166. {
  167. bool match = false;
  168. school.period.ForEach(x =>
  169. {
  170. if (item.periodId.Equals(x.id))
  171. {
  172. if (x.subjects.Select(y => y.id).Contains(item.subjectId))
  173. {
  174. match = true;
  175. }
  176. }
  177. });
  178. if (!match)
  179. {
  180. unMatch.Add(item);
  181. }
  182. }
  183. if (noGradeIds.IsNotEmpty())
  184. {
  185. var ids = noGradeIds.Select(x => x.id);
  186. await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemsAsync<ItemInfo>(ids.ToList(), $"Item-{school.id}");
  187. foreach (var rm in noGradeIds)
  188. {
  189. items.Remove(rm);
  190. }
  191. }
  192. if (noPeriodId.IsNotEmpty())
  193. {
  194. var ids = noPeriodId.Select(x => x.id);
  195. await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemsAsync<ItemInfo>(ids.ToList(), $"Item-{school.id}");
  196. foreach (var rm in noPeriodId)
  197. {
  198. items.Remove(rm);
  199. }
  200. }
  201. if (noSubjectId.IsNotEmpty())
  202. {
  203. var ids = noSubjectId.Select(x => x.id);
  204. await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemsAsync<ItemInfo>(ids.ToList(), $"Item-{school.id}");
  205. foreach (var rm in noSubjectId)
  206. {
  207. items.Remove(rm);
  208. }
  209. }
  210. if (unMatch.IsNotEmpty())
  211. {
  212. var ids = unMatch.Select(x => x.id);
  213. await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemsAsync<ItemInfo>(ids.ToList(), $"Item-{school.id}");
  214. foreach (var rm in unMatch)
  215. {
  216. items.Remove(rm);
  217. }
  218. }
  219. List<ItemCond> itemConds = new List<ItemCond>();
  220. items.GroupBy(x => x.periodId).Select(y => new { key = y.Key, list = y.ToList() }).ToList().ForEach(z =>
  221. {
  222. ItemCond cond = new ItemCond() { id = z.key, code = $"ItemCond-{school.id}", pk = "ItemCond", ttl = -1, count = z.list.Count, grades = new List<GradeCount>(), subjects = new List<SubjectCount>() };
  223. z.list.ForEach(y =>
  224. {
  225. ItemService.CountItemCond(y, null, cond);
  226. });
  227. itemConds.Add(cond);
  228. });
  229. itemConds.ForEach(async cond =>
  230. {
  231. await client.GetContainer(Constant.TEAMModelOS, "School").UpsertItemAsync<ItemCond>(cond, new PartitionKey(cond.code));
  232. });
  233. }
  234. return Ok(new { });
  235. }
  236. /// <summary>
  237. /// 修复名单的scope,school,creatorid
  238. /// </summary>
  239. /// <param name="request"></param>
  240. /// <returns></returns>
  241. [ProducesDefaultResponseType]
  242. //[AuthToken(Roles = "teacher")]
  243. [HttpPost("fix-stulist-scope&school&creatorid")]
  244. public async Task<IActionResult> FixStulist(JsonElement data)
  245. {
  246. try
  247. {
  248. var client = _azureCosmos.GetCosmosClient();
  249. //先处理未关联课程的教师私人名单
  250. 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") })) {
  251. string scdsql = $"SELECT value(A1) FROM c join A1 in c.schedule where A1.stulist='{item.id}'";
  252. int count = 0;
  253. await foreach (var schedule in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Schedule>(queryText: scdsql ))
  254. {
  255. count += 1;
  256. }
  257. if (count == 0) {
  258. await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemStreamAsync(item.id, new PartitionKey("StuList"));
  259. }
  260. }
  261. HashSet<string> plistId = new HashSet<string>();
  262. List<KeyValuePair<string, string>> pkeyValuePairs = new List<KeyValuePair<string, string>>();
  263. List<StuList> pstuLists = new List<StuList>();
  264. //List<Course> pcourses = new List<Course>();
  265. //处理私人名单
  266. string sql = "select value(c) from c where c.pk='Course' ";
  267. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Course>(queryText: sql))
  268. {
  269. if (item.schedule.IsNotEmpty()) {
  270. foreach (var scd in item.schedule) {
  271. if (!string.IsNullOrEmpty(scd.stulist)) {
  272. plistId.Add(scd.stulist);
  273. var tmdid= item.code.Replace("Course-", "");
  274. pkeyValuePairs.Add(new KeyValuePair<string, string>(scd.stulist, tmdid));
  275. item.creatorId = tmdid;
  276. item.scope = "private";
  277. await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(item, item.id, new PartitionKey(item.code));
  278. }
  279. }
  280. }
  281. }
  282. List<string> pfaildId = new List<string>();
  283. foreach (var list in plistId) {
  284. try {
  285. StuList stuList= await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<StuList>(list, new PartitionKey("StuList"));
  286. var a = pkeyValuePairs.Where(x => x.Key == list).FirstOrDefault();
  287. if (stuList.students.IsNotEmpty()) {
  288. stuList.school = stuList.students[0].code.Replace("Base-", "");
  289. }
  290. stuList.creatorId = a.Value;
  291. stuList.scope = "private";
  292. await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<StuList>(stuList, list, new PartitionKey("StuList"));
  293. } catch (CosmosException ex) {
  294. pfaildId.Add(list);
  295. }
  296. }
  297. await _dingDing.SendBotMsg($"TEAMModelFunction,ActivityHttpTrigger,fix-stulist-scope&school&creatorid()\n修复失败私人的名单pfaildId:\n {pfaildId.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
  298. //处理学校的名单
  299. HashSet<string> slistId = new HashSet<string>();
  300. List<KeyValuePair<string, string>> skeyValuePairs = new List<KeyValuePair<string, string>>();
  301. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Course>(queryText: sql))
  302. {
  303. if (item.schedule.IsNotEmpty())
  304. {
  305. foreach (var scd in item.schedule)
  306. {
  307. if (!string.IsNullOrEmpty(scd.stulist))
  308. {
  309. slistId.Add(scd.stulist);
  310. var school = item.code.Replace("Course-", "");
  311. skeyValuePairs.Add(new KeyValuePair<string, string>(scd.stulist, school));
  312. item.scope = "school";
  313. item.school = school;
  314. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(item, item.id, new PartitionKey(item.code));
  315. }
  316. }
  317. }
  318. }
  319. List<string> sfaildId = new List<string>();
  320. foreach (var list in skeyValuePairs)
  321. {
  322. try
  323. {
  324. StuList stuList = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<StuList>(list.Key, new PartitionKey($"StuList-{list.Value}"));
  325. stuList.scope = "school";
  326. stuList.school = list.Value;
  327. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<StuList>(stuList, list.Key, new PartitionKey(stuList.code));
  328. }
  329. catch (CosmosException ex)
  330. {
  331. sfaildId.Add(list.Key);
  332. }
  333. }
  334. await _dingDing.SendBotMsg($"TEAMModelFunction,ActivityHttpTrigger,fix-stulist-scope&school&creatorid()\n修复失败学校的的名单sfaildId:\n {sfaildId.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
  335. return Ok(new { });
  336. }
  337. catch (Exception ex)
  338. {
  339. await _dingDing.SendBotMsg($"TEAMModelFunction,ActivityHttpTrigger,fix-stulist-scope&school&creatorid()\n{ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  340. return BadRequest();
  341. }
  342. }
  343. /// <summary>
  344. /// 修复blob容器逻辑
  345. /// </summary>
  346. /// <param name="request"></param>
  347. /// <returns></returns>
  348. [ProducesDefaultResponseType]
  349. //[AuthToken(Roles = "teacher")]
  350. [HttpPost("fix-blob-content")]
  351. public async Task<IActionResult> FixBlobContent(JsonElement data) {
  352. try
  353. {
  354. var client = _azureCosmos.GetCosmosClient();
  355. await FixDataService.FixBlobContent(client, _dingDing, _azureStorage, data);
  356. return Ok(new { });
  357. }
  358. catch (Exception ex)
  359. {
  360. await _dingDing.SendBotMsg($"TEAMModelFunction,ActivityHttpTrigger,fix-blob-content()\n{ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  361. return BadRequest();
  362. }
  363. }
  364. /// <summary>
  365. /// 修复blob容器逻辑
  366. /// </summary>
  367. /// <param name="request"></param>
  368. /// <returns></returns>
  369. [ProducesDefaultResponseType]
  370. //[AuthToken(Roles = "teacher")]
  371. [HttpPost("fix-student-info")]
  372. public async Task<IActionResult> FixStudentInfo(JsonElement data)
  373. {
  374. try
  375. {
  376. var client = _azureCosmos.GetCosmosClient();
  377. var list= await FixDataService.FixStudentInfo(client, _dingDing, _azureStorage, data);
  378. return Ok(new { list});
  379. }
  380. catch (Exception ex)
  381. {
  382. await _dingDing.SendBotMsg($"TEAMModelFunction,ActivityHttpTrigger,fix-blob-content()\n{ex.Message}{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  383. return BadRequest();
  384. }
  385. }
  386. }
  387. }