TriggerHomework.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. using Azure.Cosmos;
  2. using Azure.Messaging.ServiceBus;
  3. using HTEXLib.COMM.Helpers;
  4. using Microsoft.Azure.Documents;
  5. using Microsoft.Extensions.Configuration;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Text.Json;
  11. using System.Threading.Tasks;
  12. using TEAMModelOS.SDK;
  13. using TEAMModelOS.SDK.DI;
  14. using TEAMModelOS.SDK.Extension;
  15. using TEAMModelOS.SDK.Models;
  16. using TEAMModelOS.SDK.Models.Cosmos.Common;
  17. using TEAMModelOS.SDK.Models.Service;
  18. using TEAMModelOS.SDK.Models.Service.BI;
  19. namespace TEAMModelOS.FunctionV4
  20. {
  21. public static class TriggerHomework
  22. {
  23. public static async Task Trigger(CoreAPIHttpService _coreAPIHttpService, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing,
  24. CosmosClient client, JsonElement input, TriggerData tdata, AzureRedisFactory _azureRedis, IConfiguration _configuration)
  25. {
  26. try
  27. {
  28. if ((tdata.status != null && tdata.status.Value == 404))
  29. {
  30. await client.GetContainer(Constant.TEAMModelOS, "Common").DeleteItemStreamAsync(tdata.id, new PartitionKey(tdata.code));
  31. ActivityList data = input.ToObject<ActivityList>();
  32. await ActivityService.DeleteActivity(_coreAPIHttpService, client, _dingDing, data);
  33. var table_cancel = _azureStorage.GetCloudTableClient().GetTableReference("ChangeRecord");
  34. List<ChangeRecord> records = await table_cancel.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", tdata.id } });
  35. foreach (var record in records)
  36. {
  37. try
  38. {
  39. await table_cancel.DeleteSingle<ChangeRecord>(record.PartitionKey, record.RowKey);
  40. await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), record.sequenceNumber);
  41. }
  42. catch (Exception)
  43. {
  44. continue;
  45. }
  46. }
  47. await BIStats.SetTypeAddStats(client, tdata.school, "Homework", -1, careDate: tdata.startTime);//BI统计增/减量
  48. return;
  49. }
  50. var adid = tdata.id;
  51. var adcode = "";
  52. string blobcntr = null;
  53. if (tdata.scope.Equals("school"))
  54. {
  55. adcode = $"Activity-{tdata.school}";
  56. blobcntr = tdata.school;
  57. }
  58. else
  59. {
  60. adcode = $"Activity-{tdata.creatorId}";
  61. blobcntr = tdata.creatorId;
  62. }
  63. //await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}作业活动【{tdata.name}-{tdata.id}-ttl={tdata.ttl}】正在操作", GroupNames.醍摩豆服務運維群組);
  64. Homework work = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Homework>(tdata.id, new Azure.Cosmos.PartitionKey($"{tdata.code}"));
  65. var table = _azureStorage.GetCloudTableClient().GetTableReference("ChangeRecord");
  66. if (work != null)
  67. {
  68. string PartitionKey = string.Format("{0}{1}{2}", work.code, "-", work.progress);
  69. List<ChangeRecord> changeRecords = await table.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", tdata.id }, { "PartitionKey", PartitionKey } });
  70. switch (work.progress)
  71. {
  72. case "pending":
  73. var messageWork = new ServiceBusMessage(new { tdata.id, progress = "going", tdata.code }.ToJsonString());
  74. messageWork.ApplicationProperties.Add("name", "Homework");
  75. if (changeRecords.Count > 0)
  76. {
  77. try
  78. {
  79. await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
  80. }
  81. catch (Exception)
  82. {
  83. }
  84. long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWork, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
  85. changeRecords[0].sequenceNumber = start;
  86. await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
  87. }
  88. else
  89. {
  90. long start = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWork, DateTimeOffset.FromUnixTimeMilliseconds(tdata.startTime));
  91. ChangeRecord changeRecord = new()
  92. {
  93. RowKey = tdata.id,
  94. PartitionKey = PartitionKey,
  95. sequenceNumber = start,
  96. msgId = messageWork.MessageId
  97. };
  98. await table.Save<ChangeRecord>(changeRecord);
  99. }
  100. break;
  101. case "going":
  102. await Activity(_coreAPIHttpService, _serviceBus, _dingDing, client, _configuration, work);
  103. var messageWorkEnd = new ServiceBusMessage(new { id = tdata.id, progress = "finish", code = tdata.code }.ToJsonString());
  104. messageWorkEnd.ApplicationProperties.Add("name", "Homework");
  105. if (changeRecords.Count > 0)
  106. {
  107. long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
  108. try
  109. {
  110. await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
  111. }
  112. catch (Exception)
  113. {
  114. }
  115. changeRecords[0].sequenceNumber = end;
  116. await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
  117. }
  118. else
  119. {
  120. long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
  121. ChangeRecord changeRecord = new()
  122. {
  123. RowKey = tdata.id,
  124. PartitionKey = PartitionKey,
  125. sequenceNumber = end,
  126. msgId = messageWorkEnd.MessageId
  127. };
  128. await table.Save<ChangeRecord>(changeRecord);
  129. }
  130. //if (bustasks.IsNotEmpty())
  131. //{
  132. // await Task.WhenAll(bustasks);
  133. //}
  134. break;
  135. case "finish":
  136. await Activity(_coreAPIHttpService, _serviceBus, _dingDing, client, _configuration, work);
  137. List<(string pId, List<string> gid)> gls = new List<(string pId, List<string> gid)>();
  138. if (work.groupLists.Count > 0)
  139. {
  140. var group = work.groupLists;
  141. foreach (var gp in group)
  142. {
  143. foreach (KeyValuePair<string, List<string>> pp in gp)
  144. {
  145. gls.Add((pp.Key, pp.Value));
  146. }
  147. }
  148. }
  149. //处理家庭作业活动结束统计账户信息
  150. if (work.staffIds.Count == 0) {
  151. List<FMember> idsList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, client, _dingDing, work.school, work.classes, work.stuLists, work.tchLists,gls);
  152. work.staffIds = idsList;
  153. await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Homework>(work, work.id, new Azure.Cosmos.PartitionKey(work.code));
  154. }
  155. break;
  156. }
  157. }
  158. }
  159. catch (CosmosException e)
  160. {
  161. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-CosmosDB异常{e.Message}\n{e.StackTrace}\n{e.Status}", GroupNames.醍摩豆服務運維群組);
  162. }
  163. catch (Exception ex)
  164. {
  165. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}研修作业活动异常{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  166. }
  167. }
  168. private static async Task Activity(CoreAPIHttpService _coreAPIHttpService, AzureServiceBusFactory _serviceBus, DingDing _dingDing, CosmosClient client, IConfiguration _configuration, Homework work)
  169. {
  170. List<(string pId, List<string> gid)> ps = new List<(string pId, List<string> gid)>();
  171. if (work.groupLists.Count > 0)
  172. {
  173. var group = work.groupLists;
  174. foreach (var gp in group)
  175. {
  176. foreach (KeyValuePair<string, List<string>> pp in gp)
  177. {
  178. ps.Add((pp.Key, pp.Value));
  179. }
  180. }
  181. }
  182. List<string> classes = ExamService.getClasses(work.classes, work.stuLists);
  183. (List<RMember> tmdids, List<RGroupList> classLists) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, classes, work.school, ps);
  184. var addStudentsCls = tmdids.FindAll(x => x.type == 2);
  185. var addTmdidsCls = tmdids.FindAll(x => x.type == 1);
  186. List<StuActivity> stuActivities = new();
  187. List<StuActivity> tmdActivities = new();
  188. List<StuActivity> tchActivities = new();
  189. List<string> tIds = addStudentsCls.Select(x => x.id).ToList();
  190. List<StuActivity> tac = new();
  191. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<StuActivity>(queryText: $"select value(c) from c where c.id ='{work.id}' and c.type = 'Homework'"))
  192. {
  193. tac.Add(item);
  194. }
  195. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<StuActivity>(queryText: $"select value(c) from c where c.id ='{work.id}' and c.type = 'Homework'"))
  196. {
  197. tac.Add(item);
  198. }
  199. List<string> sub = new();
  200. if (work.tchLists.Count == 0)
  201. {
  202. if (work.targets.Count > 0)
  203. {
  204. foreach (var course in work.targets)
  205. {
  206. var info = course.ToObject<List<string>>();
  207. if (info.Count > 1)
  208. {
  209. sub.Add(info[0]);
  210. }
  211. }
  212. }
  213. }
  214. if (addTmdidsCls.IsNotEmpty())
  215. {
  216. addTmdidsCls.ForEach(x =>
  217. {
  218. HashSet<string> classIds = new HashSet<string>();
  219. classLists.ForEach(z =>
  220. {
  221. z.members.ForEach(y =>
  222. {
  223. if (y.id.Equals(x.id) && y.type == 1)
  224. {
  225. classIds.Add(z.id);
  226. }
  227. });
  228. });
  229. int sta = -1;
  230. if (tac.Count > 0)
  231. {
  232. StuActivity activity = tac.Where(t => t.code.Equals($"Activity-{x.id}")).FirstOrDefault();
  233. if (activity != null)
  234. {
  235. sta = activity.taskStatus;
  236. }
  237. }
  238. tmdActivities.Add(new StuActivity
  239. {
  240. pk = "Activity",
  241. id = work.id,
  242. code = $"Activity-{x.id}",
  243. type = "Homework",
  244. name = work.name,
  245. startTime = work.startTime,
  246. endTime = work.endTime,
  247. scode = work.code,
  248. scope = work.scope,
  249. school = work.school,
  250. creatorId = work.creatorId,
  251. subjects = sub,
  252. blob = work.blob,
  253. owner = work.owner,
  254. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
  255. taskStatus = sta,
  256. mustSubmit = work.mustSubmit,
  257. classIds = classIds.ToList()
  258. });
  259. });
  260. }
  261. if (addStudentsCls.IsNotEmpty())
  262. {
  263. addStudentsCls.ForEach(x =>
  264. {
  265. HashSet<string> classIds = new HashSet<string>();
  266. classLists.ForEach(z =>
  267. {
  268. z.members.ForEach(y =>
  269. {
  270. if (y.id.Equals(x.id) && y.type == 2)
  271. {
  272. classIds.Add(z.id);
  273. }
  274. });
  275. });
  276. int sta = -1;
  277. if (tac.Count > 0)
  278. {
  279. StuActivity activity = tac.Where(t => t.code.Equals($"Activity-{x.code.Replace("Base-", "")}-{x.id}")).FirstOrDefault();
  280. if (activity != null)
  281. {
  282. sta = activity.taskStatus;
  283. }
  284. }
  285. stuActivities.Add(new StuActivity
  286. {
  287. pk = "Activity",
  288. id = work.id,
  289. code = $"Activity-{x.code.Replace("Base-", "")}-{x.id}",
  290. type = "Homework",
  291. name = work.name,
  292. startTime = work.startTime,
  293. endTime = work.endTime,
  294. scode = work.code,
  295. scope = work.scope,
  296. school = work.school,
  297. creatorId = work.creatorId,
  298. subjects = sub,
  299. blob = work.blob,
  300. owner = work.owner,
  301. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
  302. taskStatus = sta,
  303. classIds = classIds.ToList(),
  304. mustSubmit = work.mustSubmit
  305. });
  306. });
  307. }
  308. (List<RMember> tchList, List<RGroupList> classInfos) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, work.tchLists, work.school, ps);
  309. (string standard, List<string> tmdids, string school, List<string> update, int statistics) list = (null, null, null, new List<string> { StatisticsService.OfflineRecord }, 0);
  310. if (tchList.IsNotEmpty())
  311. {
  312. list.tmdids = tchList.Select(x => x.id).ToList();
  313. School school = null;
  314. if (!string.IsNullOrEmpty(work.school))
  315. {
  316. school = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(work.school, new Azure.Cosmos.PartitionKey("Base"));
  317. list.school = school.id;
  318. list.standard = school.standard;
  319. }
  320. tchList.ForEach(x =>
  321. {
  322. HashSet<string> classIds = new();
  323. classInfos.ForEach(z =>
  324. {
  325. z.members.ForEach(y =>
  326. {
  327. if (y.id.Equals(x.id) && y.type == 1)
  328. {
  329. classIds.Add(z.id);
  330. }
  331. });
  332. });
  333. int sta = -1;
  334. if (tac.Count > 0)
  335. {
  336. StuActivity activity = tac.Where(t => t.code.Equals($"Activity-{x.id}")).FirstOrDefault();
  337. if (activity != null)
  338. {
  339. sta = activity.taskStatus;
  340. }
  341. }
  342. tchActivities.Add(new StuActivity
  343. {
  344. pk = "Activity",
  345. id = work.id,
  346. code = $"Activity-{x.id}",
  347. type = "Homework",
  348. name = work.name,
  349. startTime = work.startTime,
  350. endTime = work.endTime,
  351. scode = work.code,
  352. scope = work.scope,
  353. school = work.school,
  354. creatorId = work.creatorId,
  355. subjects = new List<string> { "" },
  356. blob = work.blob,
  357. owner = work.owner,
  358. createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
  359. taskStatus = sta,
  360. classIds = classIds.ToList()
  361. });
  362. });
  363. }
  364. await ActivityService.SaveStuActivity(client, _dingDing, stuActivities, tmdActivities, tchActivities);
  365. await StatisticsService.SendServiceBus(list, _configuration, _serviceBus, client);
  366. }
  367. }
  368. }