StuListServiceBus.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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.Helper.Common.CollectionHelper;
  11. using TEAMModelOS.SDK.Models;
  12. using TEAMModelOS.SDK.Models.Cosmos.Common;
  13. namespace TEAMModelFunction
  14. {
  15. public class MQActivity {
  16. public string id { get; set; }
  17. public string code { get; set; }
  18. public string owner { get; set; }
  19. public List<string> classes { get; set; }
  20. //如果已经完成则不写入???
  21. public string progress { get; set; }
  22. public string scope { get; set; }
  23. public string school { get; set; }
  24. public string creatorId { get; set; }
  25. public string pk { get; set; }
  26. public string name { get; set; }
  27. public List<string> subjects { get; set; }
  28. public string blob { get; set; }
  29. public long startTime { get; set; }
  30. public long endTime { get; set; }
  31. }
  32. public class StuListServiceBus
  33. {
  34. private readonly AzureCosmosFactory _azureCosmos;
  35. private readonly DingDing _dingDing;
  36. public StuListServiceBus(AzureCosmosFactory azureCosmos, DingDing dingDing)
  37. {
  38. _azureCosmos = azureCosmos;
  39. _dingDing = dingDing;
  40. }
  41. /// <summary>
  42. /// 完善课程变更,StuListChange, originCode是学校编码 则表示名单是学校自定义名单,如果是tmdid则表示醍摩豆的私有名单,scope=school,private。
  43. /// </summary>
  44. /// <data msg>
  45. /// CourseChange
  46. ///// </data>
  47. /// <param name="msg"></param>
  48. /// <returns></returns>
  49. [FunctionName("StuList")]
  50. public async Task StuList([ServiceBusTrigger("%Azure:ServiceBus:ActiveTask%", "stulist", Connection = "Azure:ServiceBus:ConnectionString")] string msg)
  51. {
  52. var client = _azureCosmos.GetCosmosClient();
  53. try
  54. {
  55. await _dingDing.SendBotMsg($"ServiceBus,StuList:{msg}", GroupNames.醍摩豆服務運維群組);
  56. var jsonMsg = JsonDocument.Parse(msg);
  57. StuListChange stuListChange = msg.ToObject<StuListChange>();
  58. //名单变动修改学生课程关联信息
  59. await FixStuCourse(client, stuListChange);
  60. //Vote投票 Survey问卷 Exam评测 Learn学习活动 Homework作业活动
  61. //名单变动修改学生问卷关联信息
  62. await FixActivity(client, stuListChange, "Survey");
  63. //名单变动修改学生投票关联信息
  64. await FixActivity(client, stuListChange, "Vote");
  65. //名单变动修改学生评测关联信息
  66. await FixActivity(client, stuListChange, "Exam");
  67. //TODO学习活动
  68. //await FixActivity(client, stuListChange, "Learn");
  69. //TODO作业活动
  70. // await FixActivity(client, stuListChange, "Homework");
  71. }
  72. catch (Exception ex)
  73. {
  74. await _dingDing.SendBotMsg($"StuListServiceBus-StuList\n{ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  75. }
  76. }
  77. public async Task FixActivity(CosmosClient client, StuListChange stuListChange, string type) {
  78. var query = $"SELECT distinct c.owner, c.id,c.code, c.classes,c.subjects,c.progress,c.scope,c.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime FROM c join A1 in c.classes where c.pk='{type}' and A1 in('{stuListChange.listid}') ";
  79. List<MQActivity> datas = new List<MQActivity>();
  80. await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<MQActivity>(queryText: query,
  81. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{stuListChange.originCode}") }))
  82. {
  83. datas.Add(item);
  84. }
  85. foreach (MQActivity activity in datas) {
  86. //已经完结的不再允许加入
  87. if (activity.progress.Equals("finish")||activity.progress.Equals("pending")) {
  88. continue;
  89. }
  90. //学生新加入名单的
  91. foreach (Students students in stuListChange.stujoin)
  92. {
  93. var stucourse = new StuActivity
  94. {
  95. id = activity.id,
  96. scode = activity.code,
  97. name = activity.name,
  98. code = $"Activity-{activity.school}-{students.id}",
  99. scope = activity.scope,
  100. school = activity.school,
  101. creatorId = activity.creatorId,
  102. pk = "Activity",
  103. type = type,
  104. subjects = type.Equals("Exam") ? activity.subjects : new List<string>() { "" },
  105. startTime = activity.startTime,
  106. endTime = activity.endTime
  107. };
  108. await client.GetContainer("TEAMModelOS", "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  109. }//tmd新加入的
  110. foreach (string tmdid in stuListChange.tmdjoin)
  111. {
  112. var stucourse = new StuActivity
  113. {
  114. id = activity.id,
  115. scode = activity.code,
  116. name = activity.name,
  117. code = $"Activity-{tmdid}",
  118. scope = activity.scope,
  119. school = activity.school,
  120. creatorId = activity.creatorId,
  121. pk = "Activity",
  122. type = type,
  123. subjects= type.ToLower().Equals("Exam")?activity.subjects:new List<string>() {"" }
  124. };
  125. await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  126. }
  127. }
  128. }
  129. public async Task FixStuCourse(CosmosClient client, StuListChange stuListChange) {
  130. //1.查找学校或教师的课程是否包含该名单的课程。
  131. var query = $"select distinct c.code,c.id,c.no,c.name,c.scope, c.creatorId,c.school from c join A0 in c.schedule where A0.stulist = '{stuListChange.listid}'";
  132. List<Course> courses = new List<Course>();
  133. if (stuListChange.scope.Equals("school"))
  134. {
  135. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Course>(queryText: query,
  136. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{stuListChange.originCode}") }))
  137. {
  138. courses.Add(item);
  139. }
  140. }
  141. else
  142. {
  143. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Course>(queryText: query,
  144. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{stuListChange.originCode}") }))
  145. {
  146. courses.Add(item);
  147. }
  148. }
  149. //2.获取课程的id 并尝试添加或移除对应的学生课程记录StuCourse。
  150. foreach (var course in courses)
  151. {
  152. //学生新加入名单的
  153. foreach (Students students in stuListChange.stujoin)
  154. {
  155. var stucourse = new StuCourse
  156. {
  157. id = course.id,
  158. scode = course.code,
  159. name = course.name,
  160. code = $"StuCourse-{course.school}-{students.id}",
  161. scope = course.scope,
  162. school = course.school,
  163. creatorId = course.creatorId,
  164. pk = "StuCourse"
  165. };
  166. await client.GetContainer("TEAMModelOS", "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  167. }
  168. //tmd新加入的
  169. foreach (string tmdid in stuListChange.tmdjoin)
  170. {
  171. var stucourse = new StuCourse
  172. {
  173. id = course.id,
  174. scode = course.code,
  175. name = course.name,
  176. code = $"StuCourse-{tmdid}",
  177. scope = course.scope,
  178. school = course.school,
  179. creatorId = course.creatorId,
  180. pk = "StuCourse"
  181. };
  182. await client.GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  183. }
  184. //移除名单的。 在点击相关的课程,再去二次校验是否存在,不存在则再去删除。
  185. //foreach (var delStu in stuListChange.stuleave)
  186. //{
  187. // await client.GetContainer("TEAMModelOS", "Student").DeleteItemStreamAsync(course.id, new PartitionKey($"Course-{course.school}-{delStu.id}"));
  188. //}
  189. //foreach (var delTmd in stuListChange.tmdhleave)
  190. //{
  191. // await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemStreamAsync(course.id, new PartitionKey($"Course-{delTmd}"));
  192. //}
  193. }
  194. }
  195. }
  196. }