HomeworkService.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. using Azure.Cosmos;
  2. using Azure.Messaging.ServiceBus;
  3. using HTEXLib.COMM.Helpers;
  4. using Microsoft.Extensions.Configuration;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.Json;
  10. using System.Threading.Tasks;
  11. using TEAMModelOS.SDK.DI;
  12. using TEAMModelOS.SDK.Extension;
  13. using TEAMModelOS.SDK.Models;
  14. using TEAMModelOS.SDK.Services;
  15. namespace TEAMModelOS.SDK
  16. {
  17. public static class HomeworkService
  18. {
  19. public static async Task<List<HomeworkUser>> AnswerRecordAll(CosmosClient client, CoreAPIHttpService _coreAPIHttpService,DingDing _dingDing, Homework homework, string userid, string tbname,List<string> listIds , string _targetType= "student")
  20. {
  21. List<TypeUser> typeUsers = new List<TypeUser>();
  22. (List<RMember> tmdinfos, List<RGroupList> classInfo) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, listIds, homework.school, null, -1, homework.startTime);
  23. var addStudentsCls = tmdinfos.FindAll(x => x.type == 2);
  24. var addTmdidsCls = tmdinfos.FindAll(x => x.type == 1);
  25. if ($"{_targetType}".Equals("research", StringComparison.OrdinalIgnoreCase) || $"{_targetType}".Equals("yxtrain", StringComparison.OrdinalIgnoreCase))
  26. {
  27. if (tmdinfos.IsNotEmpty())
  28. {
  29. tmdinfos.ForEach(x => {
  30. var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
  31. typeUsers.Add(new TypeUser() { irs=x.irs, no=x.no, nickname =x.nickname, userid = x.id, userType = "tmdid", username = x.name, classes = clases.Select(x => new TypeUserClass { id = x.id, name = x.name }).ToList() });
  32. });
  33. }
  34. }
  35. else
  36. {
  37. if (addTmdidsCls.IsNotEmpty())
  38. {
  39. addTmdidsCls.ForEach(x => {
  40. var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
  41. typeUsers.Add(new TypeUser() { irs = x.irs, no = x.no, nickname = x.nickname, userid = x.id, userType = "tmdid", username = x.name, classes = clases.Select(x => new TypeUserClass { id = x.id, name = x.name }).ToList() });
  42. });
  43. }
  44. if (addStudentsCls.IsNotEmpty())
  45. {
  46. addStudentsCls.ForEach(x => {
  47. var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
  48. typeUsers.Add(new TypeUser() { irs = x.irs, no = x.no, nickname = x.nickname, userid = x.id, userType = "student", username = x.name, userSchool = x.code.Replace("Base-", ""), classes = clases.Select(x => new TypeUserClass { id = x.id, name = x.name }).ToList() });
  49. });
  50. }
  51. }
  52. List<dynamic> rscs = new List<dynamic>();
  53. string debateCode = "";
  54. string debateTbname = "";
  55. if (homework.scope.Equals("school"))
  56. {
  57. debateTbname = "School";
  58. debateCode = $"Debate-{homework.school}";
  59. }
  60. else
  61. {
  62. debateTbname = "Teacher";
  63. debateCode = $"Debate-{homework.creatorId}";
  64. }
  65. List<Debate> debates = new List<Debate>();
  66. string sql = $"select value(c) from c where c.comid='{homework.id}'";
  67. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, debateTbname).GetItemQueryIterator<Debate>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(debateCode) }))
  68. {
  69. debates.Add(item);
  70. }
  71. List<HomeworkUser> users = new List<HomeworkUser>();
  72. foreach (var typeuser in typeUsers)
  73. {
  74. var us = users.Find(x => x.userid.Equals(typeuser.userid));
  75. if (us != null) { continue; }
  76. HomeworkUser user = new HomeworkUser() { irs = typeuser.irs, no = typeuser.no, nickname = typeuser.nickname, userid = typeuser.userid, userSchool = typeuser.userSchool, userType = typeuser.userType, username = typeuser.username, classes = typeuser.classes };
  77. string partition = $"HomeworkRecord-{typeuser.userid}";
  78. if (typeuser.userType.Equals("student"))
  79. {
  80. partition = $"HomeworkRecord-{typeuser.userSchool}-{typeuser.userid}";
  81. }
  82. else
  83. {
  84. partition = $"HomeworkRecord-{typeuser.userid}";
  85. }
  86. HomeworkRecord record = null;
  87. try
  88. {
  89. record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{homework.id}", new PartitionKey(partition));
  90. double star = -1;
  91. List<double> stars = record.comments.FindAll(s => s.identity.Equals("student")).Select(x => x.star).ToList();
  92. if (stars.IsNotEmpty())
  93. {
  94. star = stars.Sum() / stars.Count;
  95. }
  96. user.submit = true;
  97. user.studentStar = star;
  98. user.score = record.score;
  99. user.submitTime = record.time;
  100. user.content = record.content;
  101. // user.username = typeuser.username;
  102. var teacherComment = record.comments.Where(x => x.identity.Equals("teacher") && record.teacher.Equals(userid)).FirstOrDefault();
  103. if (teacherComment != null)
  104. {
  105. user.teacherStar = teacherComment.star;
  106. List<string> replies = new List<string>();
  107. teacherComment.replyIds.ForEach(x => {
  108. var reply = debates.SelectMany(x => x.replies).ToList().Find(r => r.id.Equals(x));
  109. if (reply != null)
  110. {
  111. replies.Add(reply.comment);
  112. }
  113. });
  114. user.replies = replies;
  115. }
  116. }
  117. catch (CosmosException ex)
  118. {
  119. user.submit = false;
  120. record = null;
  121. }
  122. users.Add(user);
  123. }
  124. return users;
  125. }
  126. public static async Task<string> saveMoreAsync(CosmosClient client, DingDing _dingDing, Homework work, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, IConfiguration _configuration, AzureRedisFactory _azureRedis)
  127. {
  128. try
  129. {
  130. work.ttl = -1;
  131. work.code = "Homework-" + work.school;
  132. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  133. work.createTime = now;
  134. string blobcntr = null;
  135. blobcntr = work.school;
  136. work.size = await _azureStorage.GetBlobContainerClient(work.school).GetBlobsSize($"homework/{work.id}");
  137. await BlobService.RefreshBlobRoot(new BlobRefreshMessage { progress = "insert", root = $"homework", name = $"{blobcntr}" }, _serviceBus, _configuration, _azureRedis);
  138. work.recordUrl = $"/homework/{work.id}/record.json";
  139. var cods = new { records = new List<string>(), userids = new List<string>(), question = new List<QuestionRecord>() };
  140. await _azureStorage.GetBlobContainerClient(blobcntr).UploadFileByContainer(cods.ToJsonString(), "homework", $"{work.id}/record.json");
  141. work.id = Guid.NewGuid().ToString();
  142. if (string.IsNullOrEmpty(work.id))
  143. {
  144. if (work.publish == 1)
  145. {
  146. work.progress = "pending";
  147. }
  148. else {
  149. if (work.startTime > now)
  150. {
  151. work.progress = "pending";
  152. }
  153. else
  154. {
  155. work.progress = "going";
  156. }
  157. }
  158. await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(work, new PartitionKey($"{work.code}"));
  159. }
  160. else
  161. {
  162. await client.GetContainer("TEAMModelOS", "Common").UpsertItemAsync(work, new PartitionKey($"{work.code}"));
  163. }
  164. return work.id;
  165. }
  166. catch (Exception e)
  167. {
  168. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-HomeworkService-saveMore\n{e.Message}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
  169. return "";
  170. }
  171. }
  172. }
  173. public class TypeUser
  174. {
  175. public string irs { get; set; }
  176. public string no { get; set; }
  177. public string nickname { get; set; }
  178. public string userid { get; set; }
  179. public string userType { get; set; }
  180. public string userSchool { get; set; }
  181. public string username { get; set; }
  182. public List<TypeUserClass> classes { get; set; } = new List<TypeUserClass>();
  183. }
  184. public class TypeUserClass
  185. {
  186. public string id { get; set; }
  187. public string name { get; set; }
  188. }
  189. public class HomeworkUser
  190. {
  191. public string irs { get; set; }
  192. public string no { get; set; }
  193. public string nickname { get; set; }
  194. public string userid { get; set; }
  195. public string userType { get; set; }
  196. public string userSchool { get; set; }
  197. public long submitTime { get; set; }
  198. public double score { get; set; } = -1;
  199. public double studentStar { get; set; } = -1;
  200. public double teacherStar { get; set; } = -1;
  201. public bool submit { get; set; }
  202. public string username { get; set; }
  203. public List<TypeUserClass> classes { get; set; } = new List<TypeUserClass>();
  204. public List<string> replies { get; set; } = new List<string>();
  205. public List<Attachment> content { get; set; } = new List<Attachment>();
  206. }
  207. }