CourseServiceBus.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. using Azure.Cosmos;
  2. using Microsoft.Azure.WebJobs;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. using System.Text.Json;
  7. using System.Threading.Tasks;
  8. using TEAMModelOS.SDK.DI;
  9. using TEAMModelOS.SDK.Extension;
  10. using TEAMModelOS.SDK;
  11. using TEAMModelOS.SDK.Models;
  12. using TEAMModelOS.SDK.Models.Cosmos.Common;
  13. using HTEXLib.COMM.Helpers;
  14. namespace TEAMModelFunction
  15. {
  16. public class CourseServiceBus
  17. {
  18. private readonly AzureCosmosFactory _azureCosmos;
  19. private readonly DingDing _dingDing;
  20. public CourseServiceBus(AzureCosmosFactory azureCosmos, DingDing dingDing)
  21. {
  22. _azureCosmos = azureCosmos;
  23. _dingDing = dingDing;
  24. }
  25. /// <summary>
  26. /// 完善课程变更
  27. /// </summary>
  28. /// <data msg>
  29. /// CourseChange
  30. ///// </data>
  31. /// <param name="msg"></param>
  32. /// <returns></returns>
  33. [FunctionName("Course")]
  34. public async Task Course([ServiceBusTrigger("%Azure:ServiceBus:ActiveTask%", "course", Connection = "Azure:ServiceBus:ConnectionString")] string msg)
  35. {
  36. var client = _azureCosmos.GetCosmosClient();
  37. try
  38. {
  39. //await _dingDing.SendBotMsg($"ServiceBus,CourseChange:{msg}", GroupNames.醍摩豆服務運維群組);
  40. var jsonMsg = JsonDocument.Parse(msg);
  41. CourseChange courseChange = msg.ToObject<CourseChange>();
  42. if (courseChange == null) {
  43. return;
  44. }
  45. foreach (var cls in courseChange.addClass) {
  46. (List<TmdInfo> addTmdidsCls, List<StuInfo> addStudentsCls,List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing,new List<string> { cls}, courseChange.school);
  47. foreach (var stu in addStudentsCls) {
  48. try
  49. {
  50. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  51. if (!stuCourse.Value.classId.Contains(cls)) {
  52. stuCourse.Value.classId.Add(cls);
  53. }
  54. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  55. }
  56. catch (CosmosException ex)
  57. {
  58. if (ex.Response.Status == 404)
  59. {
  60. var course = new StuCourse
  61. {
  62. id = courseChange.id,
  63. scode = courseChange.code,
  64. name = courseChange.name,
  65. code = $"StuCourse-{courseChange.school}-{stu.id}",
  66. scope = courseChange.scope,
  67. school = courseChange.school,
  68. creatorId = courseChange.creatorId,
  69. classId= new List<string> { cls},
  70. pk = "StuCourse",
  71. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  72. };
  73. await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
  74. }
  75. }
  76. }
  77. foreach (var tmd in addTmdidsCls)
  78. {
  79. try
  80. {
  81. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  82. if (!stuCourse.Value.classId.Contains(cls))
  83. {
  84. stuCourse.Value.classId.Add(cls);
  85. }
  86. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  87. }
  88. catch (CosmosException ex)
  89. {
  90. if (ex.Response.Status == 404)
  91. {
  92. var course = new StuCourse
  93. {
  94. id = courseChange.id,
  95. scode = courseChange.code,
  96. name = courseChange.name,
  97. code = $"StuCourse-{tmd.id}",
  98. scope = courseChange.scope,
  99. school = courseChange.school,
  100. creatorId = courseChange.creatorId,
  101. classId = new List<string> { cls },
  102. pk = "StuCourse",
  103. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  104. };
  105. await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
  106. }
  107. }
  108. }
  109. }
  110. foreach (var list in courseChange.addList)
  111. {
  112. (List<TmdInfo> addTmdidsCls, List<StuInfo> addStudentsCls,List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { list }, courseChange.school);
  113. foreach (var stu in addStudentsCls)
  114. {
  115. try
  116. {
  117. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}"));
  118. if (!stuCourse.Value.stulist.Contains(list))
  119. {
  120. stuCourse.Value.stulist.Add(list);
  121. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}"));
  122. }
  123. }
  124. catch (CosmosException ex)
  125. {
  126. if (ex.Response.Status == 404)
  127. {
  128. var course = new StuCourse
  129. {
  130. id = courseChange.id,
  131. scode = courseChange.code,
  132. name = courseChange.name,
  133. code = $"StuCourse-{courseChange.school}-{stu.id}",
  134. scope = courseChange.scope,
  135. school = courseChange.school,
  136. creatorId = courseChange.creatorId,
  137. stulist = new List<string> { list },
  138. pk = "StuCourse",
  139. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  140. };
  141. await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
  142. }
  143. }
  144. }
  145. foreach (var tmd in addTmdidsCls)
  146. {
  147. try
  148. {
  149. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  150. if (!stuCourse.Value.stulist.Contains(list))
  151. {
  152. stuCourse.Value.stulist.Add(list);
  153. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  154. }
  155. }
  156. catch (CosmosException ex)
  157. {
  158. if (ex.Response.Status == 404)
  159. {
  160. var course = new StuCourse
  161. {
  162. id = courseChange.id,
  163. scode = courseChange.code,
  164. name = courseChange.name,
  165. code = $"StuCourse-{tmd.id}",
  166. scope = courseChange.scope,
  167. school = courseChange.school,
  168. creatorId = courseChange.creatorId,
  169. stulist = new List<string> { list },
  170. pk = "StuCourse",
  171. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  172. };
  173. await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
  174. }
  175. }
  176. }
  177. }
  178. foreach (var delCls in courseChange.delClass) {
  179. (List<TmdInfo> delTmdidsCls, List<StuInfo> delStudentsCls,List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { delCls }, courseChange.school);
  180. foreach (var stu in delStudentsCls)
  181. {
  182. try
  183. {
  184. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  185. if (stuCourse.Value.classId.Contains(delCls))
  186. {
  187. stuCourse.Value.classId.Remove(delCls);
  188. }
  189. if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
  190. {
  191. //当两个列表都不存在时则直接删除
  192. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>( courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  193. }
  194. else {
  195. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  196. }
  197. }
  198. catch (CosmosException ex)
  199. {
  200. }
  201. }
  202. foreach (var tmd in delTmdidsCls)
  203. {
  204. try
  205. {
  206. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  207. if (stuCourse.Value.classId.Contains(delCls))
  208. {
  209. stuCourse.Value.classId.Remove(delCls);
  210. }
  211. if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
  212. {
  213. //当两个列表都不存在时则直接删除
  214. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  215. }
  216. else
  217. {
  218. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  219. }
  220. }
  221. catch (CosmosException ex)
  222. {
  223. }
  224. }
  225. }
  226. foreach (var delList in courseChange.delList)
  227. {
  228. (List<TmdInfo> delTmdidsCls, List<StuInfo> delStudentsCls, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { delList }, courseChange.school);
  229. foreach (var stu in delStudentsCls)
  230. {
  231. try
  232. {
  233. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  234. if (stuCourse.Value.stulist.Contains(delList))
  235. {
  236. stuCourse.Value.stulist.Remove(delList);
  237. }
  238. if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
  239. {
  240. //当两个列表都不存在时则直接删除
  241. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  242. }
  243. else
  244. {
  245. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  246. }
  247. }
  248. catch (CosmosException ex)
  249. {
  250. }
  251. }
  252. foreach (var tmd in delTmdidsCls)
  253. {
  254. try
  255. {
  256. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  257. if (stuCourse.Value.stulist.Contains(delList))
  258. {
  259. stuCourse.Value.stulist.Remove(delList);
  260. }
  261. if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
  262. {
  263. //当两个列表都不存在时则直接删除
  264. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  265. }
  266. else
  267. {
  268. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  269. }
  270. }
  271. catch (CosmosException ex)
  272. {
  273. }
  274. }
  275. }
  276. }
  277. catch (Exception ex)
  278. {
  279. await _dingDing.SendBotMsg($"CourseServiceBus-Course\n{ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  280. }
  281. }
  282. }
  283. }