HomeworkService.cs 10 KB

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