CourseServiceBus.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  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. {
  44. return;
  45. }
  46. foreach (var cls in courseChange.addClass)
  47. {
  48. (List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, new List<string> { cls }, courseChange.school);
  49. var addStudentsCls = tchList.FindAll(x => x.type == 2);
  50. var addTmdidsCls = tchList.FindAll(x => x.type == 1);
  51. //(List<TmdInfo> addTmdidsCls, List<StuInfo> addStudentsCls, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { cls }, courseChange.school);
  52. foreach (var stu in addStudentsCls)
  53. {
  54. try
  55. {
  56. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  57. if (!stuCourse.Value.classId.Contains(cls))
  58. {
  59. stuCourse.Value.classId.Add(cls);
  60. }
  61. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  62. }
  63. catch (CosmosException ex)
  64. {
  65. if (ex.Response.Status == 404)
  66. {
  67. var course = new StuCourse
  68. {
  69. id = courseChange.id,
  70. scode = courseChange.code,
  71. name = courseChange.name,
  72. code = $"StuCourse-{courseChange.school}-{stu.id}",
  73. scope = courseChange.scope,
  74. school = courseChange.school,
  75. creatorId = courseChange.creatorId,
  76. classId = new List<string> { cls },
  77. pk = "StuCourse",
  78. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  79. };
  80. await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
  81. }
  82. }
  83. }
  84. foreach (var tmd in addTmdidsCls)
  85. {
  86. try
  87. {
  88. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  89. if (!stuCourse.Value.classId.Contains(cls))
  90. {
  91. stuCourse.Value.classId.Add(cls);
  92. }
  93. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  94. }
  95. catch (CosmosException ex)
  96. {
  97. if (ex.Response.Status == 404)
  98. {
  99. var course = new StuCourse
  100. {
  101. id = courseChange.id,
  102. scode = courseChange.code,
  103. name = courseChange.name,
  104. code = $"StuCourse-{tmd.id}",
  105. scope = courseChange.scope,
  106. school = courseChange.school,
  107. creatorId = courseChange.creatorId,
  108. classId = new List<string> { cls },
  109. pk = "StuCourse",
  110. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  111. };
  112. await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
  113. }
  114. }
  115. }
  116. }
  117. foreach (var list in courseChange.addList)
  118. {
  119. (List<TmdInfo> addTmdidsCls, List<StuInfo> addStudentsCls, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { list }, courseChange.school);
  120. foreach (var stu in addStudentsCls)
  121. {
  122. try
  123. {
  124. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}"));
  125. if (!stuCourse.Value.stulist.Contains(list))
  126. {
  127. stuCourse.Value.stulist.Add(list);
  128. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{stu.schoolId}-{stu.id}"));
  129. }
  130. }
  131. catch (CosmosException ex)
  132. {
  133. if (ex.Response.Status == 404)
  134. {
  135. var course = new StuCourse
  136. {
  137. id = courseChange.id,
  138. scode = courseChange.code,
  139. name = courseChange.name,
  140. code = $"StuCourse-{courseChange.school}-{stu.id}",
  141. scope = courseChange.scope,
  142. school = courseChange.school,
  143. creatorId = courseChange.creatorId,
  144. stulist = new List<string> { list },
  145. pk = "StuCourse",
  146. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  147. };
  148. await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
  149. }
  150. }
  151. }
  152. foreach (var tmd in addTmdidsCls)
  153. {
  154. try
  155. {
  156. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  157. if (!stuCourse.Value.stulist.Contains(list))
  158. {
  159. stuCourse.Value.stulist.Add(list);
  160. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  161. }
  162. }
  163. catch (CosmosException ex)
  164. {
  165. if (ex.Response.Status == 404)
  166. {
  167. var course = new StuCourse
  168. {
  169. id = courseChange.id,
  170. scode = courseChange.code,
  171. name = courseChange.name,
  172. code = $"StuCourse-{tmd.id}",
  173. scope = courseChange.scope,
  174. school = courseChange.school,
  175. creatorId = courseChange.creatorId,
  176. stulist = new List<string> { list },
  177. pk = "StuCourse",
  178. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
  179. };
  180. await client.GetContainer(Constant.TEAMModelOS, "Student").CreateItemAsync(course, new PartitionKey(course.code));
  181. }
  182. }
  183. }
  184. }
  185. foreach (var delCls in courseChange.delClass)
  186. {
  187. (List<TmdInfo> delTmdidsCls, List<StuInfo> delStudentsCls, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { delCls }, courseChange.school);
  188. foreach (var stu in delStudentsCls)
  189. {
  190. try
  191. {
  192. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  193. if (stuCourse.Value.classId.Contains(delCls))
  194. {
  195. stuCourse.Value.classId.Remove(delCls);
  196. }
  197. if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
  198. {
  199. //当两个列表都不存在时则直接删除
  200. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  201. }
  202. else
  203. {
  204. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  205. }
  206. }
  207. catch (CosmosException ex)
  208. {
  209. }
  210. }
  211. foreach (var tmd in delTmdidsCls)
  212. {
  213. try
  214. {
  215. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  216. if (stuCourse.Value.classId.Contains(delCls))
  217. {
  218. stuCourse.Value.classId.Remove(delCls);
  219. }
  220. if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
  221. {
  222. //当两个列表都不存在时则直接删除
  223. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  224. }
  225. else
  226. {
  227. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  228. }
  229. }
  230. catch (CosmosException ex)
  231. {
  232. }
  233. }
  234. }
  235. foreach (var delList in courseChange.delList)
  236. {
  237. (List<TmdInfo> delTmdidsCls, List<StuInfo> delStudentsCls, List<ClassListInfo> classLists) = await TriggerStuActivity.GetStuList(client, _dingDing, new List<string> { delList }, courseChange.school);
  238. foreach (var stu in delStudentsCls)
  239. {
  240. try
  241. {
  242. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  243. if (stuCourse.Value.stulist.Contains(delList))
  244. {
  245. stuCourse.Value.stulist.Remove(delList);
  246. }
  247. if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
  248. {
  249. //当两个列表都不存在时则直接删除
  250. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  251. }
  252. else
  253. {
  254. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{courseChange.school}-{stu.id}"));
  255. }
  256. }
  257. catch (CosmosException ex)
  258. {
  259. }
  260. }
  261. foreach (var tmd in delTmdidsCls)
  262. {
  263. try
  264. {
  265. ItemResponse<StuCourse> stuCourse = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  266. if (stuCourse.Value.stulist.Contains(delList))
  267. {
  268. stuCourse.Value.stulist.Remove(delList);
  269. }
  270. if (!stuCourse.Value.classId.IsNotEmpty() && !stuCourse.Value.stulist.IsNotEmpty())
  271. {
  272. //当两个列表都不存在时则直接删除
  273. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuCourse>(courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  274. }
  275. else
  276. {
  277. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuCourse>(stuCourse, courseChange.id, new PartitionKey($"StuCourse-{tmd.id}"));
  278. }
  279. }
  280. catch (CosmosException ex)
  281. {
  282. }
  283. }
  284. }
  285. }
  286. catch (Exception ex)
  287. {
  288. await _dingDing.SendBotMsg($"CourseServiceBus-Course\n{ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  289. }
  290. }
  291. }
  292. }