FixDataService.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. using Azure;
  2. using Azure.Cosmos;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Text.Json;
  9. using System.Threading.Tasks;
  10. using TEAMModelOS.SDK.DI;
  11. using TEAMModelOS.SDK.Extension;
  12. using TEAMModelOS.SDK;
  13. using HTEXLib.COMM.Helpers;
  14. using TEAMModelOS.SDK.Models.Cosmos.Common;
  15. namespace TEAMModelOS.SDK.Models.Service
  16. {
  17. public static class FixDataService
  18. {
  19. /// <summary>
  20. /// 修复学生数据
  21. /// </summary>
  22. /// <param name="client"></param>
  23. /// <param name="_dingDing"></param>
  24. /// <param name="_azureStorage"></param>
  25. /// <param name="data"></param>
  26. /// <returns></returns>
  27. public static async Task<List<Student>> FixStudentInfo(CosmosClient client, DingDing _dingDing, AzureStorageFactory _azureStorage, JsonElement data)
  28. {
  29. var code = data.GetProperty("code").GetString();
  30. var ids = data.GetProperty("ids").ToObject<List<string>>();
  31. var dict = data.GetProperty("dict").ToObject<Dictionary<string, object>>();
  32. string queryText = $"SELECT VALUE c FROM c WHERE c.id IN ({string.Join(",", ids.Select(o => $"'{o}'"))})";
  33. List<Student> students = new List<Student>();
  34. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student")
  35. .GetItemQueryIterator<Student>(
  36. queryText: queryText,
  37. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{code}") }))
  38. {
  39. foreach (var key in dict.Keys)
  40. {
  41. switch (key)
  42. {
  43. case "classId":
  44. item.classId = $"{ dict[key]}";
  45. break;
  46. case "periodId":
  47. item.periodId = $"{ dict[key]}";
  48. break;
  49. case "schoolId":
  50. item.schoolId = $"{ dict[key]}";
  51. break;
  52. case "year":
  53. int year = DateTime.Now.Year;
  54. int.TryParse($"dict[key]", out year);
  55. item.year = year;
  56. break;
  57. default:
  58. break;
  59. }
  60. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<Student>(item, item.id, new PartitionKey(item.code));
  61. students.Add(item);
  62. }
  63. }
  64. return students;
  65. }
  66. /// <summary>
  67. /// 修复内容模块数据
  68. /// </summary>
  69. /// <param name="client"></param>
  70. /// <param name="_dingDing"></param>
  71. /// <param name="_azureStorage"></param>
  72. /// <param name="data"></param>
  73. /// <returns></returns>
  74. public static async Task FixBlobContent(CosmosClient client, DingDing _dingDing, AzureStorageFactory _azureStorage, JsonElement data)
  75. {
  76. if (data.TryGetProperty("doPrivate", out JsonElement _doPrivate) && $"{_doPrivate}".Equals("yes", StringComparison.OrdinalIgnoreCase))
  77. {
  78. foreach (var cnt in _azureStorage.GetBlobServiceClient().GetBlobContainers())
  79. {
  80. if (cnt.Name.Length == 10 && int.TryParse(cnt.Name, out _))
  81. {
  82. await doFixBlob(client, _azureStorage, cnt.Name, "private");
  83. }
  84. }
  85. }
  86. List<School> schools = new List<School>();
  87. 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") }))
  88. {
  89. schools.Add(item);
  90. }
  91. foreach (var school in schools)
  92. {
  93. await doFixBlob(client, _azureStorage, school.id, "school");
  94. }
  95. }
  96. private static async Task doFixBlob(CosmosClient client, AzureStorageFactory _azureStorage, string name, string scope)
  97. {
  98. List<string> prefixs = new List<string>() { "audio", "doc", "image", "other", "res", "video" };
  99. var ContainerClient = _azureStorage.GetBlobContainerClient($"{name}");
  100. var tb = "Teacher";
  101. if (scope != "private")
  102. {
  103. tb = "School";
  104. }
  105. List<string> ids = new List<string>();
  106. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, tb).GetItemQueryIterator<Bloblog>(queryDefinition: new QueryDefinition("select c.id from c "), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Bloblog-{name}") }))
  107. {
  108. ids.Add(item.id);
  109. }
  110. await client.GetContainer(Constant.TEAMModelOS, tb).DeleteItemsStreamAsync(ids, $"Bloblog-{name}");
  111. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  112. foreach (var prefix in prefixs)
  113. {
  114. if (prefix.Equals("res"))
  115. {
  116. List<string> itemres = await ContainerClient.List(prefix);
  117. if (itemres.IsNotEmpty())
  118. {
  119. HashSet<string> set = new HashSet<string>();
  120. itemres.ForEach(x =>
  121. {
  122. var uri = x.Split("/");
  123. set.Add($"res/{uri[1]}");
  124. });
  125. foreach (var item in set)
  126. {
  127. var urlsSize = await ContainerClient.GetBlobsSize(item);
  128. var url = item;
  129. if (!item.EndsWith(".hte", StringComparison.OrdinalIgnoreCase) && !item.EndsWith(".HTEX", StringComparison.OrdinalIgnoreCase))
  130. {
  131. url += ".HTEX";
  132. }
  133. Bloblog bloblog = new Bloblog { id = Guid.NewGuid().ToString(), code = $"Bloblog-{name}", pk = "Bloblog", time = now, url = url, size = urlsSize != null && urlsSize.HasValue ? urlsSize.Value : 0, type = prefix };
  134. await client.GetContainer(Constant.TEAMModelOS, tb).UpsertItemAsync(bloblog, new Azure.Cosmos.PartitionKey(bloblog.code));
  135. }
  136. }
  137. }
  138. else
  139. {
  140. List<string> items = await ContainerClient.List(prefix);
  141. if (items.IsNotEmpty())
  142. {
  143. foreach (var item in items)
  144. {
  145. var urlsSize = await ContainerClient.GetBlobsSize(item);
  146. Bloblog bloblog = new Bloblog { id = Guid.NewGuid().ToString(), code = $"Bloblog-{name}", pk = "Bloblog", time = now, url = item, size = urlsSize != null && urlsSize.HasValue ? urlsSize.Value : 0, type = prefix };
  147. await client.GetContainer(Constant.TEAMModelOS, tb).UpsertItemAsync(bloblog, new Azure.Cosmos.PartitionKey(bloblog.code));
  148. }
  149. }
  150. }
  151. }
  152. }
  153. /// <summary>
  154. /// 修復學校基本資料
  155. /// </summary>
  156. /// <param name="client"></param>
  157. /// <param name="schoolCode"></param>
  158. /// <returns></returns>
  159. public static async Task<List<string>> FixSchoolPeriodId(CosmosClient client, string schoolCode)
  160. {
  161. List<string> periodIdList = new List<string>();
  162. await foreach (School schinfo in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: $"SELECT value(c) FROM c WHERE c.id = '{schoolCode}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
  163. {
  164. int periodIndex = 0;
  165. foreach (Period periodNow in schinfo.period)
  166. {
  167. if (periodNow.id.Equals("上學期") || periodNow.id.Equals("上学期") || periodNow.id.Equals("First semester"))
  168. {
  169. string periodId = Guid.NewGuid().ToString();
  170. schinfo.period[periodIndex].id = periodId;
  171. periodIdList.Add(periodId);
  172. }
  173. periodIndex++;
  174. }
  175. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(schinfo, schinfo.id, new PartitionKey("Base"));
  176. }
  177. return periodIdList;
  178. }
  179. /// <summary>
  180. /// 修復學校班級資料
  181. /// </summary>
  182. /// <param name="client"></param>
  183. /// <param name="schoolCode"></param>
  184. /// <param name="dataDic"></param>
  185. /// <returns></returns>
  186. public static async Task<List<string>> FixClassInfo(CosmosClient client, string schoolCode, Dictionary<string,string> dataDic)
  187. {
  188. List<string> classIdList = new List<string>();
  189. await foreach (Class classinfo in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Class>(queryText: $"SELECT value(c) FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{schoolCode}") }))
  190. {
  191. foreach (KeyValuePair<string, string> item in dataDic)
  192. {
  193. switch (item.Key)
  194. {
  195. case "periodId":
  196. classinfo.periodId = item.Value;
  197. break;
  198. }
  199. }
  200. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<Class>(classinfo, classinfo.id, new PartitionKey($"Class-{schoolCode}"));
  201. classIdList.Add(classinfo.id);
  202. }
  203. return classIdList;
  204. }
  205. /// <summary>
  206. /// 修復學校課程資料
  207. /// </summary>
  208. /// <param name="client"></param>
  209. /// <param name="schoolCode"></param>
  210. /// <param name="dataDic"></param>
  211. /// <returns></returns>
  212. public static async Task<List<string>> FixCourseInfo(CosmosClient client, string schoolCode, Dictionary<string, string> dataDic)
  213. {
  214. List<string> courseIdList = new List<string>();
  215. await foreach (Course courseinfo in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Course>(queryText: $"SELECT value(c) FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{schoolCode}") }))
  216. {
  217. foreach (KeyValuePair<string, string> item in dataDic)
  218. {
  219. switch (item.Key)
  220. {
  221. case "periodId":
  222. courseinfo.period.id = item.Value;
  223. break;
  224. }
  225. }
  226. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<Course>(courseinfo, courseinfo.id, new PartitionKey($"Course-{schoolCode}"));
  227. courseIdList.Add(courseinfo.id);
  228. }
  229. return courseIdList;
  230. }
  231. /// <summary>
  232. /// 修復學校知識點資料
  233. /// </summary>
  234. /// <param name="client"></param>
  235. /// <param name="schoolCode"></param>
  236. /// <param name="dataDic"></param>
  237. /// <returns></returns>
  238. public static async Task<List<string>> FixKnowledgeInfo(CosmosClient client, string schoolCode, Dictionary<string, string> dataDic)
  239. {
  240. List<string> knowledgeIdList = new List<string>();
  241. await foreach (Knowledge knowledgeinfo in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Knowledge>(queryText: $"SELECT value(c) FROM c WHERE c.pk = 'Knowledge' AND c.owner = '{schoolCode}'", requestOptions: new QueryRequestOptions() {}))
  242. {
  243. foreach (KeyValuePair<string, string> item in dataDic)
  244. {
  245. switch (item.Key)
  246. {
  247. case "periodId":
  248. knowledgeinfo.periodId = item.Value;
  249. break;
  250. }
  251. }
  252. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<Knowledge>(knowledgeinfo, knowledgeinfo.id, new PartitionKey($"{knowledgeinfo.code}"));
  253. knowledgeIdList.Add(knowledgeinfo.id);
  254. }
  255. return knowledgeIdList;
  256. }
  257. /// <summary>
  258. /// 修復學校試卷資料
  259. /// </summary>
  260. /// <param name="client"></param>
  261. /// <param name="schoolCode"></param>
  262. /// <param name="dataDic"></param>
  263. /// <returns></returns>
  264. public static async Task<List<string>> FixPaperInfo(CosmosClient client, string schoolCode, Dictionary<string, string> dataDic)
  265. {
  266. List<string> paperIdList = new List<string>();
  267. await foreach (Paper paperinfo in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Paper>(queryText: $"SELECT value(c) FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{schoolCode}") }))
  268. {
  269. foreach (KeyValuePair<string, string> item in dataDic)
  270. {
  271. switch (item.Key)
  272. {
  273. case "periodId":
  274. paperinfo.periodId = item.Value;
  275. break;
  276. }
  277. }
  278. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<Paper>(paperinfo, paperinfo.id, new PartitionKey($"Paper-{schoolCode}"));
  279. paperIdList.Add(paperinfo.id);
  280. }
  281. return paperIdList;
  282. }
  283. /// <summary>
  284. /// 修復學校課綱資料
  285. /// </summary>
  286. /// <param name="client"></param>
  287. /// <param name="schoolCode"></param>
  288. /// <param name="dataDic"></param>
  289. /// <returns></returns>
  290. public static async Task<List<string>> FixVolumeInfo(CosmosClient client, string schoolCode, Dictionary<string, string> dataDic)
  291. {
  292. List<string> volumeIdList = new List<string>();
  293. await foreach (Volume volumeinfo in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Volume>(queryText: $"SELECT value(c) FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Volume-{schoolCode}") }))
  294. {
  295. foreach (KeyValuePair<string, string> item in dataDic)
  296. {
  297. switch (item.Key)
  298. {
  299. case "periodId":
  300. volumeinfo.periodId = item.Value;
  301. break;
  302. }
  303. }
  304. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<Volume>(volumeinfo, volumeinfo.id, new PartitionKey($"Volume-{schoolCode}"));
  305. volumeIdList.Add(volumeinfo.id);
  306. }
  307. return volumeIdList;
  308. }
  309. /// <summary>
  310. /// 修復學校試題資料
  311. /// </summary>
  312. /// <param name="client"></param>
  313. /// <param name="schoolCode"></param>
  314. /// <param name="dataDic"></param>
  315. /// <returns></returns>
  316. public static async Task<List<string>> FixItemInfo(CosmosClient client, string schoolCode, Dictionary<string, string> dataDic)
  317. {
  318. List<string> itemIdList = new List<string>();
  319. await foreach (ItemInfo iteminfo in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<ItemInfo>(queryText: $"SELECT value(c) FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Item-{schoolCode}") }))
  320. {
  321. foreach (KeyValuePair<string, string> item in dataDic)
  322. {
  323. switch (item.Key)
  324. {
  325. case "periodId":
  326. iteminfo.periodId = item.Value;
  327. break;
  328. }
  329. }
  330. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<ItemInfo>(iteminfo, iteminfo.id, new PartitionKey($"Item-{schoolCode}"));
  331. itemIdList.Add(iteminfo.id);
  332. }
  333. return itemIdList;
  334. }
  335. /// <summary>
  336. /// 修復學校評測資料
  337. /// </summary>
  338. /// <param name="client"></param>
  339. /// <param name="schoolCode"></param>
  340. /// <param name="dataDic"></param>
  341. /// <returns></returns>
  342. public static async Task<List<string>> FixExamInfo(CosmosClient client, string schoolCode, Dictionary<string, string> dataDic)
  343. {
  344. List<string> examIdList = new List<string>();
  345. await foreach (ExamInfo examinfo in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<ExamInfo>(queryText: $"SELECT value(c) FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Exam-{schoolCode}") }))
  346. {
  347. foreach (KeyValuePair<string, string> item in dataDic)
  348. {
  349. switch (item.Key)
  350. {
  351. case "periodId":
  352. examinfo.period.id = item.Value;
  353. break;
  354. }
  355. }
  356. await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<ExamInfo>(examinfo, examinfo.id, new PartitionKey($"Exam-{schoolCode}"));
  357. examIdList.Add(examinfo.id);
  358. }
  359. return examIdList;
  360. }
  361. /// <summary>
  362. /// 修復學生資料
  363. /// </summary>
  364. /// <param name="client"></param>
  365. /// <param name="schoolCode"></param>
  366. /// <param name="dataDic"></param>
  367. /// <returns></returns>
  368. public static async Task<List<string>> FixStudentInfo(CosmosClient client, string schoolCode, Dictionary<string, string> dataDic)
  369. {
  370. List<string> studentIdList = new List<string>();
  371. await foreach (Student studentinfo in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<Student>(queryText: $"SELECT value(c) FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{schoolCode}") }))
  372. {
  373. foreach (KeyValuePair<string, string> item in dataDic)
  374. {
  375. switch (item.Key)
  376. {
  377. case "periodId":
  378. studentinfo.periodId = item.Value;
  379. break;
  380. }
  381. }
  382. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<Student>(studentinfo, studentinfo.id, new PartitionKey($"Base-{schoolCode}"));
  383. studentIdList.Add(studentinfo.id);
  384. }
  385. return studentIdList;
  386. }
  387. /// <summary>
  388. /// 修復评测内容
  389. /// </summary>
  390. /// <param name="client"></param>
  391. /// <param name="data"></param>
  392. /// <returns></returns>
  393. public static async Task<List<string>> FixExamPublish(CosmosClient client, JsonElement data)
  394. {
  395. List<string> infos = new List<string>();
  396. var dict = data.GetProperty("publish").GetInt32();
  397. await foreach (ExamInfo info in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<ExamInfo>(queryText: $"SELECT value(c) FROM c where c.pk = 'Exam'"))
  398. {
  399. info.publish = dict;
  400. await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<ExamInfo>(info, info.id, new PartitionKey(info.code));
  401. infos.Add(info.id);
  402. }
  403. return infos;
  404. }
  405. }
  406. }