ActivityService.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  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 TEAMModelOS.SDK.Models;
  14. using TEAMModelOS.SDK.Models.Cosmos.Common;
  15. using TEAMModelOS.SDK.Models.Service;
  16. using HTEXLib.COMM.Helpers;
  17. namespace TEAMModelOS.SDK
  18. {
  19. public class ActivityService
  20. {
  21. public static async Task FixActivity(CosmosClient client, DingDing _dingDing, GroupChange groupChange, string type)
  22. {
  23. try
  24. {
  25. var query = $"SELECT distinct c.owner, c.id,c.code, c.classes,c.stuLists,c.subjects,c.progress,c.scope,c.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime FROM c where c.pk='{type}' " +
  26. $" and (( array_contains(c.classes,'{groupChange.listid}')) or ( array_contains(c.stuLists,'{groupChange.listid}'))or ( array_contains(c.tchLists,'{groupChange.listid}')))";
  27. //$"and A1 in('{groupChange.listid}') ";
  28. List<MQActivity> datas = new List<MQActivity>();
  29. if (groupChange.scope.Equals("school", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(groupChange.school))
  30. {
  31. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<MQActivity>(queryText: query,
  32. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{groupChange.school}") }))
  33. {
  34. datas.Add(item);
  35. }
  36. ///还要处理该学校每个老师发布的班级的
  37. List<SchoolTeacher> teachers = new List<SchoolTeacher>();
  38. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<SchoolTeacher>(queryText: $"SELECT c.id, c.name FROM c",
  39. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{groupChange.school}") }))
  40. {
  41. teachers.Add(item);
  42. }
  43. foreach (var techer in teachers)
  44. {
  45. var queryTech = $"SELECT distinct c.owner, c.id,c.code, c.classes,c.stuLists,c.subjects,c.progress,c.scope,c.startTime,c.school,c.creatorId,c.name,c.pk ,c.endTime FROM c " +
  46. $" where c.school='{groupChange.school}' and c.pk='{type}'" +
  47. $" and (( array_contains(c.classes,'{groupChange.listid}')) or ( array_contains(c.stuLists,'{groupChange.listid}')))";
  48. // $" and A1 in('{groupChange.listid}') ";
  49. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<MQActivity>(queryText: queryTech,
  50. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{techer.id}") }))
  51. {
  52. datas.Add(item);
  53. }
  54. }
  55. }
  56. if (groupChange.scope.Equals("private", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(groupChange.creatorId))
  57. {
  58. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<MQActivity>(queryText: query,
  59. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{groupChange.creatorId}") }))
  60. {
  61. datas.Add(item);
  62. }
  63. }
  64. long nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  65. foreach (MQActivity activity in datas)
  66. {
  67. //已经完结的不再允许加入,还未开始的。
  68. if (string.IsNullOrEmpty(activity.progress)|| activity.progress.Equals("finish") || activity.progress.Equals("pending"))
  69. {
  70. continue;
  71. }
  72. List<string> classes = ExamService.getClasses(activity.classes, activity.stuLists);
  73. //stujoin新加入名单的
  74. foreach (Member member in groupChange.stujoin)
  75. {
  76. var stucourse = new StuActivity
  77. {
  78. id = activity.id,
  79. scode = activity.code,
  80. name = activity.name,
  81. code = $"Activity-{member.code.Replace("Base-", "")}-{member.id}",
  82. scope = activity.scope,
  83. school = activity.school,
  84. creatorId = activity.creatorId,
  85. pk = "Activity",
  86. type = type,
  87. subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List<string>() { activity.subjects[0].id } : new List<string>() { "" },
  88. startTime = activity.startTime,
  89. endTime = activity.endTime,
  90. blob = activity.blob,
  91. owner = activity.owner,
  92. createTime = nowtime,
  93. taskStatus = -1,
  94. classIds = classes
  95. };
  96. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  97. }
  98. //tmdjoin新加入的
  99. foreach (Member member in groupChange.tmdjoin)
  100. {
  101. var stucourse = new StuActivity
  102. {
  103. id = activity.id,
  104. scode = activity.code,
  105. name = activity.name,
  106. code = $"Activity-{member.id}",
  107. scope = activity.scope,
  108. school = activity.school,
  109. creatorId = activity.creatorId,
  110. pk = "Activity",
  111. type = type,
  112. subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List<string>() { activity.subjects[0].id } : new List<string>() { "" },
  113. startTime = activity.startTime,
  114. endTime = activity.endTime,
  115. blob = activity.blob,
  116. owner = activity.owner,
  117. createTime = nowtime,
  118. taskStatus = -1,
  119. classIds = classes
  120. };
  121. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  122. }
  123. //tchjoin新加入的
  124. foreach (Member member in groupChange.tchjoin)
  125. {
  126. var stucourse = new StuActivity
  127. {
  128. id = activity.id,
  129. scode = activity.code,
  130. name = activity.name,
  131. code = $"Activity-{member.id}",
  132. scope = activity.scope,
  133. school = activity.school,
  134. creatorId = activity.creatorId,
  135. pk = "Activity",
  136. type = type,
  137. subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List<string>() { activity.subjects[0].id } : new List<string>() { "" },
  138. startTime = activity.startTime,
  139. endTime = activity.endTime,
  140. blob = activity.blob,
  141. owner = activity.owner,
  142. createTime = nowtime,
  143. taskStatus = -1,
  144. classIds = classes
  145. };
  146. await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  147. }
  148. foreach (Member member in groupChange.stuleave)
  149. {
  150. try
  151. {
  152. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{member.code.Replace("Base-", "")}-{member.id}"));
  153. }
  154. catch (CosmosException)
  155. {
  156. continue;
  157. // 继续执行 删除失败
  158. }
  159. }
  160. foreach (Member member in groupChange.tmdleave)
  161. {
  162. try
  163. {
  164. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{member.id}"));
  165. }
  166. catch (CosmosException)
  167. {
  168. continue;
  169. // 继续执行 删除失败
  170. }
  171. }
  172. foreach (Member member in groupChange.tchleave)
  173. {
  174. try
  175. {
  176. await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{member.id}"));
  177. }
  178. catch (CosmosException)
  179. {
  180. continue;
  181. // 继续执行 删除失败
  182. }
  183. }
  184. }
  185. }
  186. catch (Exception ex)
  187. {
  188. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixActivity\n{ex.Message}{ex.StackTrace}{groupChange.ToJsonString()}{type}", GroupNames.醍摩豆服務運維群組);
  189. }
  190. }
  191. public static async Task FixStuCourse(CosmosClient client, DingDing _dingDing, GroupChange groupChange)
  192. {
  193. //1.查找学校或教师的课程是否包含该名单的课程。
  194. 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 = '{groupChange.listid}'";
  195. List<Course> courses = new List<Course>();
  196. if (groupChange.scope.Equals("school") && !string.IsNullOrEmpty(groupChange.school))
  197. {
  198. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Course>(queryText: query,
  199. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{groupChange.school}") }))
  200. {
  201. courses.Add(item);
  202. }
  203. }
  204. if (groupChange.scope.Equals("private") && !string.IsNullOrEmpty(groupChange.creatorId))
  205. {
  206. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Course>(queryText: query,
  207. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{groupChange.creatorId}") }))
  208. {
  209. courses.Add(item);
  210. }
  211. }
  212. long nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  213. // await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixStuCourse\n名单发生变更 需要处理的课程\n{courses.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
  214. //2.获取课程的id 并尝试添加或移除对应的学生课程记录StuCourse。
  215. foreach (var course in courses)
  216. {
  217. //学生新加入名单的
  218. foreach (Member member in groupChange.stujoin)
  219. {
  220. var stucourse = new StuCourse
  221. {
  222. id = course.id,
  223. scode = course.code,
  224. name = course.name,
  225. code = $"StuCourse-{member.code.Replace("Base-", "")}-{member.id}",
  226. scope = course.scope,
  227. school = course.school,
  228. creatorId = course.creatorId,
  229. pk = "StuCourse",
  230. stulist = new List<string> { groupChange.listid },
  231. createTime = nowtime
  232. };
  233. // await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixStuCourse\n名单发生变更 新建课程中间表\n{stucourse.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
  234. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  235. }
  236. //tmd新加入的
  237. foreach (Member member in groupChange.tmdjoin)
  238. {
  239. var stucourse = new StuCourse
  240. {
  241. id = course.id,
  242. scode = course.code,
  243. name = course.name,
  244. code = $"StuCourse-{member.id}",
  245. scope = course.scope,
  246. school = course.school,
  247. creatorId = course.creatorId,
  248. pk = "StuCourse",
  249. stulist = new List<string> { groupChange.listid },
  250. createTime = nowtime
  251. };
  252. // await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixStuCourse\n名单发生变更 新建课程中间表\n{stucourse.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
  253. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  254. }
  255. //移除名单的。 在点击相关的课程,再去二次校验是否存在,不存在则再去删除。
  256. foreach (var delStu in groupChange.stuleave)
  257. {
  258. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(course.id, new PartitionKey($"StuCourse-{delStu.code.Replace("Base-", "")}-{delStu.id}"));
  259. }
  260. foreach (var delTmd in groupChange.tmdleave)
  261. {
  262. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(course.id, new PartitionKey($"StuCourse-{delTmd}"));
  263. }
  264. }
  265. }
  266. public static async Task<string> SaveStuActivity(CosmosClient client, DingDing _dingDing, List<StuActivity> stuActivities, List<StuActivity> tmdActivities, List<StuActivity> tchActivities)
  267. {
  268. try
  269. {
  270. if (stuActivities.IsNotEmpty())
  271. {
  272. foreach (var x in stuActivities)
  273. {
  274. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(x, new PartitionKey(x.code));
  275. }
  276. }
  277. if (tmdActivities.IsNotEmpty())
  278. {
  279. foreach (var x in tmdActivities)
  280. {
  281. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(x, new PartitionKey(x.code));
  282. }
  283. }
  284. if (tchActivities.IsNotEmpty())
  285. {
  286. foreach (var x in tchActivities)
  287. {
  288. await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(x, new PartitionKey(x.code));
  289. }
  290. }
  291. }
  292. catch (Exception ex)
  293. {
  294. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-OS,TriggerStuActivity-SaveStuActivity\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  295. }
  296. return "";
  297. }
  298. public static async Task RefreshStuActivity(CosmosClient client, DingDing _dingDing, string id, string code)
  299. {
  300. MQActivity activity = null;
  301. try
  302. {
  303. var aactivity = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync(id, new Azure.Cosmos.PartitionKey(code));
  304. using var da = await JsonDocument.ParseAsync(aactivity.ContentStream);
  305. activity = da.ToObject<MQActivity>();
  306. }
  307. catch (CosmosException)
  308. {
  309. activity = null;
  310. }
  311. if (activity != null)
  312. {
  313. List<string> classes = ExamService.getClasses(activity.classes, activity.stuLists);
  314. (List<RMember> tmdIds, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(client, _dingDing, classes, activity.school);
  315. var students = tmdIds.FindAll(x => x.type == 2);
  316. var tmdids = tmdIds.FindAll(x => x.type == 1);
  317. if (tmdids.IsNotEmpty())
  318. {
  319. foreach (RMember tmdid in tmdids)
  320. {
  321. var stucourse = new StuActivity
  322. {
  323. id = activity.id,
  324. scode = activity.code,
  325. name = activity.name,
  326. code = $"Activity-{tmdid.id}",
  327. source = activity.source,
  328. scope = activity.scope,
  329. school = activity.school,
  330. creatorId = activity.creatorId,
  331. pk = "Activity",
  332. type = activity.pk,
  333. subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List<string>() { activity.subjects[0].id } : new List<string>() { "" },
  334. startTime = activity.startTime,
  335. endTime = activity.endTime,
  336. blob = activity.blob,
  337. owner = activity.owner,
  338. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
  339. taskStatus = -1,
  340. classIds = classes
  341. };
  342. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  343. }
  344. }
  345. if (students.IsNotEmpty())
  346. {
  347. foreach (RMember student in students)
  348. {
  349. var stucourse = new StuActivity
  350. {
  351. id = activity.id,
  352. scode = activity.code,
  353. name = activity.name,
  354. code = $"Activity-{activity.school}-{student.id}",
  355. scope = activity.scope,
  356. source = activity.source,
  357. school = activity.school,
  358. creatorId = activity.creatorId,
  359. pk = "Activity",
  360. type = activity.pk,
  361. subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List<string>() { activity.subjects[0].id } : new List<string>() { "" },
  362. startTime = activity.startTime,
  363. endTime = activity.endTime,
  364. blob = activity.blob,
  365. owner = activity.owner,
  366. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
  367. taskStatus = -1,
  368. classIds = classes
  369. };
  370. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  371. }
  372. }
  373. }
  374. }
  375. }
  376. }