ActivityService.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  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 " +
  26. $"where (c.status<>404 or IS_DEFINED(c.status) = false ) and c.pk='{type}' " +
  27. $" and (( array_contains(c.classes,'{groupChange.listid}')) or ( array_contains(c.stuLists,'{groupChange.listid}'))or ( array_contains(c.tchLists,'{groupChange.listid}')))";
  28. //$"and A1 in('{groupChange.listid}') ";
  29. List<MQActivity> datas = new List<MQActivity>();
  30. if (groupChange.scope.Equals("school", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(groupChange.school))
  31. {
  32. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<MQActivity>(queryText: query,
  33. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{groupChange.school}") }))
  34. {
  35. datas.Add(item);
  36. }
  37. ///还要处理该学校每个老师发布的班级的
  38. List<SchoolTeacher> teachers = new List<SchoolTeacher>();
  39. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<SchoolTeacher>(queryText: $"SELECT c.id, c.name FROM c",
  40. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{groupChange.school}") }))
  41. {
  42. teachers.Add(item);
  43. }
  44. foreach (var techer in teachers)
  45. {
  46. 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 " +
  47. $" where (c.status<>404 or IS_DEFINED(c.status) = false ) and c.school='{groupChange.school}' and c.pk='{type}'" +
  48. $" and (( array_contains(c.classes,'{groupChange.listid}')) or ( array_contains(c.stuLists,'{groupChange.listid}')))";
  49. // $" and A1 in('{groupChange.listid}') ";
  50. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<MQActivity>(queryText: queryTech,
  51. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{techer.id}") }))
  52. {
  53. datas.Add(item);
  54. }
  55. }
  56. }
  57. if (groupChange.scope.Equals("private", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(groupChange.creatorId))
  58. {
  59. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<MQActivity>(queryText: query,
  60. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{type}-{groupChange.creatorId}") }))
  61. {
  62. datas.Add(item);
  63. }
  64. }
  65. long nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  66. foreach (MQActivity activity in datas)
  67. {
  68. //已经完结的不再允许加入,还未开始的。
  69. if (string.IsNullOrEmpty(activity.progress) || activity.progress.Equals("finish") || activity.progress.Equals("pending"))
  70. {
  71. continue;
  72. }
  73. List<string> classes = ExamService.getClasses(activity.classes, activity.stuLists);
  74. List<ExamClassResult> classResults = new List<ExamClassResult>();
  75. List<PaperSimple> standerAnswers = new List<PaperSimple>();
  76. if (type.Equals("Exam")) {
  77. if (groupChange.scope.Equals("school"))
  78. {
  79. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<ExamClassResult>(queryText: $"select value(c) from c where c.examId = '{activity.id}'",
  80. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{groupChange.school}") }))
  81. {
  82. classResults.Add(item);
  83. }
  84. }
  85. else {
  86. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<ExamClassResult>(queryText: $"select value(c) from c where c.examId = '{activity.id}'",
  87. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{groupChange.creatorId}") }))
  88. {
  89. classResults.Add(item);
  90. }
  91. }
  92. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<PaperSimple>(
  93. queryText: $"select A0.answers from c join A0 in c.papers where c.id = '{activity.id}'",
  94. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{activity.code}") }))
  95. {
  96. standerAnswers.Add(item);
  97. }
  98. }
  99. //stujoin新加入名单的
  100. foreach (Member member in groupChange.stujoin)
  101. {
  102. await updateClassResulte(client, classResults, standerAnswers, member.id, groupChange,activity.id);
  103. var stucourse = new StuActivity
  104. {
  105. id = activity.id,
  106. scode = activity.code,
  107. name = activity.name,
  108. code = $"Activity-{member.code.Replace("Base-", "")}-{member.id}",
  109. scope = activity.scope,
  110. school = activity.school,
  111. creatorId = activity.creatorId,
  112. pk = "Activity",
  113. type = type,
  114. subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List<string>() { activity.subjects[0].id } : new List<string>() { "" },
  115. startTime = activity.startTime,
  116. endTime = activity.endTime,
  117. blob = activity.blob,
  118. owner = activity.owner,
  119. createTime = nowtime,
  120. taskStatus = -1,
  121. classIds = classes
  122. };
  123. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  124. }
  125. //tmdjoin新加入的
  126. foreach (Member member in groupChange.tmdjoin)
  127. {
  128. await updateClassResulte(client, classResults, standerAnswers, member.id,groupChange, activity.id);
  129. var stucourse = new StuActivity
  130. {
  131. id = activity.id,
  132. scode = activity.code,
  133. name = activity.name,
  134. code = $"Activity-{member.id}",
  135. scope = activity.scope,
  136. school = activity.school,
  137. creatorId = activity.creatorId,
  138. pk = "Activity",
  139. type = type,
  140. subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List<string>() { activity.subjects[0].id } : new List<string>() { "" },
  141. startTime = activity.startTime,
  142. endTime = activity.endTime,
  143. blob = activity.blob,
  144. owner = activity.owner,
  145. createTime = nowtime,
  146. taskStatus = -1,
  147. classIds = classes
  148. };
  149. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  150. }
  151. //tchjoin新加入的
  152. foreach (Member member in groupChange.tchjoin)
  153. {
  154. //await updateClassResulte(client, classResults, standerAnswers, member.id);
  155. var stucourse = new StuActivity
  156. {
  157. id = activity.id,
  158. scode = activity.code,
  159. name = activity.name,
  160. code = $"Activity-{member.id}",
  161. scope = activity.scope,
  162. school = activity.school,
  163. creatorId = activity.creatorId,
  164. pk = "Activity",
  165. type = type,
  166. subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List<string>() { activity.subjects[0].id } : new List<string>() { "" },
  167. startTime = activity.startTime,
  168. endTime = activity.endTime,
  169. blob = activity.blob,
  170. owner = activity.owner,
  171. createTime = nowtime,
  172. taskStatus = -1,
  173. classIds = classes
  174. };
  175. await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  176. }
  177. foreach (Member member in groupChange.stuleave)
  178. {
  179. try
  180. {
  181. await updateClassResulte(client, classResults, standerAnswers, member.id, groupChange, activity.id);
  182. StuActivity stuActivity= await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{member.code.Replace("Base-", "")}-{member.id}"));
  183. stuActivity.classIds.Remove(groupChange.listid);
  184. if (stuActivity.classIds.IsNotEmpty())
  185. {
  186. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(stuActivity,activity.id, new PartitionKey(stuActivity.code));
  187. }
  188. else {
  189. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{member.code.Replace("Base-", "")}-{member.id}"));
  190. }
  191. }
  192. catch (CosmosException)
  193. {
  194. continue;
  195. // 继续执行 删除失败
  196. }
  197. }
  198. foreach (Member member in groupChange.tmdleave)
  199. {
  200. try
  201. {
  202. await updateClassResulte(client, classResults, standerAnswers, member.id, groupChange,activity.id);
  203. StuActivity stuActivity= await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{member.id}"));
  204. stuActivity.classIds.Remove(groupChange.listid);
  205. if (stuActivity.classIds.IsNotEmpty())
  206. {
  207. await client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(stuActivity, activity.id, new PartitionKey(stuActivity.code));
  208. }
  209. else
  210. {
  211. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{member.id}"));
  212. }
  213. }
  214. catch (CosmosException)
  215. {
  216. continue;
  217. // 继续执行 删除失败
  218. }
  219. }
  220. foreach (Member member in groupChange.tchleave)
  221. {
  222. try
  223. {
  224. StuActivity stuActivity= await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<StuActivity>(activity.id, new PartitionKey($"Activity-{member.id}"));
  225. stuActivity.classIds.Remove(groupChange.listid);
  226. if (stuActivity.classIds.IsNotEmpty())
  227. {
  228. await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<StuActivity>(stuActivity, activity.id, new PartitionKey(stuActivity.code));
  229. }
  230. else
  231. {
  232. await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemAsync<StuActivity> (activity.id, new PartitionKey($"Activity-{member.id}"));
  233. }
  234. }
  235. catch (CosmosException)
  236. {
  237. continue;
  238. // 继续执行 删除失败
  239. }
  240. }
  241. }
  242. } catch (CosmosException e) {
  243. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixActivity\n{e.Message}\n{e.StackTrace}CosmosException{e.Status}", GroupNames.成都开发測試群組);
  244. }
  245. catch (Exception ex)
  246. {
  247. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixActivity\n{ex.Message}{ex.StackTrace}{groupChange.ToJsonString()}{type}", GroupNames.醍摩豆服務運維群組);
  248. }
  249. }
  250. public static async Task FixStuCourse(CosmosClient client, DingDing _dingDing, GroupChange groupChange)
  251. {
  252. //1.查找学校或教师的课程是否包含该名单的课程。
  253. 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}'";
  254. List<Course> courses = new List<Course>();
  255. if (groupChange.scope.Equals("school") && !string.IsNullOrEmpty(groupChange.school))
  256. {
  257. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Course>(queryText: query,
  258. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{groupChange.school}") }))
  259. {
  260. courses.Add(item);
  261. }
  262. }
  263. if (groupChange.scope.Equals("private") && !string.IsNullOrEmpty(groupChange.creatorId))
  264. {
  265. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Course>(queryText: query,
  266. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Course-{groupChange.creatorId}") }))
  267. {
  268. courses.Add(item);
  269. }
  270. }
  271. long nowtime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  272. // await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixStuCourse\n名单发生变更 需要处理的课程\n{courses.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
  273. //2.获取课程的id 并尝试添加或移除对应的学生课程记录StuCourse。
  274. foreach (var course in courses)
  275. {
  276. //学生新加入名单的
  277. foreach (Member member in groupChange.stujoin)
  278. {
  279. var stucourse = new StuCourse
  280. {
  281. id = course.id,
  282. scode = course.code,
  283. name = course.name,
  284. code = $"StuCourse-{member.code.Replace("Base-", "")}-{member.id}",
  285. scope = course.scope,
  286. school = course.school,
  287. creatorId = course.creatorId,
  288. pk = "StuCourse",
  289. stulist = new List<string> { groupChange.listid },
  290. createTime = nowtime
  291. };
  292. // await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixStuCourse\n名单发生变更 新建课程中间表\n{stucourse.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
  293. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  294. }
  295. //tmd新加入的
  296. foreach (Member member in groupChange.tmdjoin)
  297. {
  298. var stucourse = new StuCourse
  299. {
  300. id = course.id,
  301. scode = course.code,
  302. name = course.name,
  303. code = $"StuCourse-{member.id}",
  304. scope = course.scope,
  305. school = course.school,
  306. creatorId = course.creatorId,
  307. pk = "StuCourse",
  308. stulist = new List<string> { groupChange.listid },
  309. createTime = nowtime
  310. };
  311. // await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-GroupListService-FixStuCourse\n名单发生变更 新建课程中间表\n{stucourse.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
  312. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  313. }
  314. //移除名单的。 在点击相关的课程,再去二次校验是否存在,不存在则再去删除。
  315. foreach (var delStu in groupChange.stuleave)
  316. {
  317. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(course.id, new PartitionKey($"StuCourse-{delStu.code.Replace("Base-", "")}-{delStu.id}"));
  318. }
  319. foreach (var delTmd in groupChange.tmdleave)
  320. {
  321. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(course.id, new PartitionKey($"StuCourse-{delTmd}"));
  322. }
  323. }
  324. }
  325. public static async Task<string> SaveStuActivity(CosmosClient client, DingDing _dingDing, List<StuActivity> stuActivities, List<StuActivity> tmdActivities, List<StuActivity> tchActivities)
  326. {
  327. try
  328. {
  329. if (stuActivities.IsNotEmpty())
  330. {
  331. foreach (var x in stuActivities)
  332. {
  333. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(x, new PartitionKey(x.code));
  334. }
  335. }
  336. if (tmdActivities.IsNotEmpty())
  337. {
  338. foreach (var x in tmdActivities)
  339. {
  340. await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(x, new PartitionKey(x.code));
  341. }
  342. }
  343. if (tchActivities.IsNotEmpty())
  344. {
  345. foreach (var x in tchActivities)
  346. {
  347. await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(x, new PartitionKey(x.code));
  348. }
  349. }
  350. }
  351. catch (Exception ex)
  352. {
  353. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-OS,TriggerStuActivity-SaveStuActivity\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  354. }
  355. return "";
  356. }
  357. public static async Task RefreshStuActivity(CoreAPIHttpService _coreAPIHttpService ,CosmosClient client, DingDing _dingDing, string id, string code)
  358. {
  359. MQActivity activity = null;
  360. try
  361. {
  362. var aactivity = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync(id, new Azure.Cosmos.PartitionKey(code));
  363. using var da = await JsonDocument.ParseAsync(aactivity.ContentStream);
  364. activity = da.ToObject<MQActivity>();
  365. }
  366. catch (CosmosException)
  367. {
  368. activity = null;
  369. }
  370. if (activity != null)
  371. {
  372. List<Task<ItemResponse<StuActivity>>> tasks = new List<Task<ItemResponse<StuActivity>>>();
  373. List<string> classes = ExamService.getClasses(activity.classes, activity.stuLists);
  374. (List<RMember> tmdIds, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(_coreAPIHttpService, client, _dingDing, classes, activity.school);
  375. var students = tmdIds.FindAll(x => x.type == 2);
  376. var tmdids = tmdIds.FindAll(x => x.type == 1);
  377. if (tmdids.IsNotEmpty())
  378. {
  379. foreach (RMember tmdid in tmdids)
  380. {
  381. var response = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemStreamAsync(activity.id, new PartitionKey($"Activity-{tmdid.id}"));
  382. if (response.Status == 200) {
  383. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  384. StuActivity stu = json.ToObject<StuActivity>();
  385. stu.id = activity.id;
  386. stu.scode = activity.code;
  387. stu.name = activity.name;
  388. stu.source = activity.source;
  389. stu.scope = activity.scope;
  390. stu.school = activity.school;
  391. stu.creatorId = activity.creatorId;
  392. stu.type = activity.pk;
  393. stu.subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List<string>() { activity.subjects[0].id } : new List<string>() { "" };
  394. stu.startTime = activity.startTime;
  395. stu.endTime = activity.endTime;
  396. stu.blob = activity.blob;
  397. stu.owner = activity.owner;
  398. stu.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  399. tasks.Add(client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stu,stu.id, new PartitionKey(stu.code)));
  400. }
  401. }
  402. }
  403. if (students.IsNotEmpty())
  404. {
  405. foreach (RMember student in students)
  406. {
  407. var response = await client.GetContainer(Constant.TEAMModelOS, "Student").ReadItemStreamAsync(activity.id, new PartitionKey($"Activity-{activity.school}-{student.id}"));
  408. if (response.Status == 200)
  409. {
  410. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  411. StuActivity stu = json.ToObject<StuActivity>();
  412. stu.id = activity.id;
  413. stu.scode = activity.code;
  414. stu.name = activity.name;
  415. stu.source = activity.source;
  416. stu.scope = activity.scope;
  417. stu.school = activity.school;
  418. stu.creatorId = activity.creatorId;
  419. stu.type = activity.pk;
  420. stu.subjects = activity.pk.ToLower().Equals("exam") && activity.subjects.IsNotEmpty() ? new List<string>() { activity.subjects[0].id } : new List<string>() { "" };
  421. stu.startTime = activity.startTime;
  422. stu.endTime = activity.endTime;
  423. stu.blob = activity.blob;
  424. stu.owner = activity.owner;
  425. stu.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  426. tasks.Add(client.GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync(stu, stu.id, new PartitionKey(stu.code)));
  427. }
  428. //await client.GetContainer(Constant.TEAMModelOS, "Student").UpsertItemAsync(stucourse, new PartitionKey(stucourse.code));
  429. }
  430. }
  431. await Task.WhenAll(tasks);
  432. }
  433. }
  434. public static async Task updateClassResulte(CosmosClient client,List<ExamClassResult> classResults, List<PaperSimple> standerAnswers, string id,GroupChange change,string acId)
  435. {
  436. if (classResults.Count > 0)
  437. {
  438. foreach (var item in classResults)
  439. {
  440. if (item.info.id.Equals(change.listid)) {
  441. int index = item.studentIds.IndexOf(id);
  442. if (index == -1)
  443. {
  444. List<List<string>> standard = new List<List<string>>();
  445. foreach (PaperSimple simple in standerAnswers)
  446. {
  447. standard = simple.answers;
  448. }
  449. List<double> ansPoint = new List<double>();
  450. List<List<string>> anc = new List<List<string>>();
  451. List<List<Details>> mark = new List<List<Details>>();
  452. foreach (List<string> num in standard)
  453. {
  454. List<string> newAns = new List<string>();
  455. foreach (string san in num)
  456. {
  457. newAns.Add(san);
  458. }
  459. anc.Add(newAns);
  460. ansPoint.Add(-1);
  461. mark.Add(new List<Details>());
  462. }
  463. item.mark.Add(mark);
  464. item.ans.Add(anc);
  465. item.studentIds.Add(id);
  466. item.studentScores.Add(ansPoint);
  467. item.studentAnswers.Add(new List<string>());
  468. item.sum.Add(0);
  469. }
  470. else
  471. {
  472. item.mark.RemoveAt(index);
  473. item.ans.RemoveAt(index);
  474. item.studentIds.RemoveAt(index);
  475. item.studentScores.RemoveAt(index);
  476. item.studentAnswers.RemoveAt(index);
  477. item.sum.RemoveAt(index);
  478. }
  479. }
  480. await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(item, item.id, new PartitionKey($"{item.code}"));
  481. }
  482. /*if (change.scope.Equals("school"))
  483. {
  484. try {
  485. ExamInfo exam = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<ExamInfo>(acId, new PartitionKey($"Exam-{change.school}"));
  486. exam.updateTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  487. await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(exam, id.ToString(), new PartitionKey($"Exam-{change.school}"));
  488. } catch (Exception e) {
  489. ExamInfo exam = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<ExamInfo>(acId, new PartitionKey($"Exam-{change.creatorId}"));
  490. exam.updateTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  491. await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(exam, id.ToString(), new PartitionKey($"Exam-{change.creatorId}"));
  492. }
  493. }
  494. else {
  495. ExamInfo exam = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<ExamInfo>(acId, new PartitionKey($"Exam-{change.creatorId}"));
  496. exam.updateTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  497. await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(exam, id.ToString(), new PartitionKey($"Exam-{change.creatorId}"));
  498. }*/
  499. }
  500. }
  501. public static async Task DeleteActivity(CoreAPIHttpService _coreAPIHttpService, CosmosClient client, DingDing _dingDing, ActivityList activityList) {
  502. List<(string pId, List<string> gid)> ps = new List<(string pId, List<string> gid)>();
  503. if (activityList.groupLists.Count > 0)
  504. {
  505. var group = activityList.groupLists;
  506. foreach (var keys in group)
  507. {
  508. foreach (KeyValuePair<string, List<string>> pp in keys)
  509. {
  510. ps.Add((pp.Key, pp.Value));
  511. }
  512. }
  513. }
  514. List<string> classes = ExamService.getClasses(activityList.classes, activityList.stuLists);
  515. (List<RMember> tmdIds, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(_coreAPIHttpService, client, _dingDing, classes, activityList.school, ps);
  516. var addStudentsCls = tmdIds.FindAll(x => x.type == 2);
  517. var addTmdidsCls = tmdIds.FindAll(x => x.type == 1);
  518. List<string> tmds = new List<string>();
  519. if (addTmdidsCls.IsNotEmpty())
  520. {
  521. tmds.AddRange(addTmdidsCls.Select(x => x.id).ToList());
  522. }
  523. List<StuActivity> stuActivities = new List<StuActivity>();
  524. List<StuActivity> tmdActivities = new List<StuActivity>();
  525. List<StuActivity> tchActivities = new List<StuActivity>();
  526. if (tmds.IsNotEmpty())
  527. {
  528. tmds.ForEach(x =>
  529. {
  530. tmdActivities.Add(new StuActivity
  531. {
  532. id = activityList.id,
  533. code = $"Activity-{x}",
  534. });
  535. });
  536. }
  537. if (addStudentsCls.IsNotEmpty())
  538. {
  539. addStudentsCls.ForEach(x =>
  540. {
  541. stuActivities.Add(new StuActivity
  542. {
  543. id = activityList.id,
  544. code = $"Activity-{x.code.Replace("Base-", "")}-{x.id}",
  545. });
  546. });
  547. }
  548. (List<RMember> tchList, List<RGroupList> classInfos) = await GroupListService.GetStutmdidListids(_coreAPIHttpService, client, _dingDing, activityList.tchLists, activityList.school, ps);
  549. (string standard, List<string> tmdids, string school, List<string> update, int statistics) list = (null, null, null, new List<string> { StatisticsService.TeacherVote }, 0);
  550. if (tchList.IsNotEmpty())
  551. {
  552. list.tmdids = tchList.Select(x => x.id).ToList();
  553. School school = null;
  554. if (!string.IsNullOrEmpty(activityList.school))
  555. {
  556. school = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(activityList.school, new Azure.Cosmos.PartitionKey("Base"));
  557. list.school = school.id;
  558. list.standard = school.standard;
  559. }
  560. tchList.ForEach(x =>
  561. {
  562. tchActivities.Add(new StuActivity
  563. {
  564. id = activityList.id,
  565. code = $"Activity-{x.id}",
  566. });
  567. });
  568. }
  569. await ActivityService.DeleteStuActivity(client, _dingDing, stuActivities, tmdActivities, tchActivities);
  570. }
  571. public static async Task<string> DeleteStuActivity(CosmosClient client, DingDing _dingDing, List<StuActivity> stuActivities, List<StuActivity> tmdActivities, List<StuActivity> tchActivities)
  572. {
  573. try
  574. {
  575. if (stuActivities.IsNotEmpty())
  576. {
  577. foreach (var x in stuActivities)
  578. {
  579. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(x.id, new PartitionKey(x.code));
  580. }
  581. }
  582. if (tmdActivities.IsNotEmpty())
  583. {
  584. foreach (var x in tmdActivities)
  585. {
  586. await client.GetContainer(Constant.TEAMModelOS, "Student").DeleteItemStreamAsync(x.id, new PartitionKey(x.code));
  587. }
  588. }
  589. if (tchActivities.IsNotEmpty())
  590. {
  591. foreach (var x in tchActivities)
  592. {
  593. await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemStreamAsync(x.id, new PartitionKey(x.code));
  594. }
  595. }
  596. }
  597. catch (Exception ex)
  598. {
  599. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-OS,TriggerStuActivity-DeleteStuActivity\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  600. }
  601. return "";
  602. }
  603. }
  604. public class ActivityList
  605. {
  606. public string id { get; set; }
  607. public string school { get; set; }
  608. /// <summary>
  609. /// 行政班
  610. /// </summary>
  611. public List<string> classes { get; set; } = new List<string>();
  612. /// <summary>
  613. /// 学生名单(包含自定义个人学生名单,学校教学班)
  614. /// </summary>
  615. public List<string> stuLists { get; set; } = new List<string>();
  616. /// <summary>
  617. /// 教研组名单
  618. /// </summary>
  619. public List<string> tchLists { get; set; } = new List<string>();
  620. public List<Dictionary<string, List<string>>> groupLists { get; set; } = new List<Dictionary<string, List<string>>>();
  621. }
  622. }