HomeworkController.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. using Azure.Cosmos;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IdentityModel.Tokens.Jwt;
  7. using System.Text.Json;
  8. using System.Threading.Tasks;
  9. using TEAMModelOS.Models.Dto;
  10. using TEAMModelOS.Models.StudentInfo;
  11. using TEAMModelOS.Models.TeacherInfo;
  12. using TEAMModelOS.SDK;
  13. using TEAMModelOS.SDK.Context.Constant.Common;
  14. using TEAMModelOS.SDK.DI;
  15. using TEAMModelOS.SDK.Extension;
  16. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  17. using TEAMModelOS.SDK.Helper.Common.StringHelper;
  18. namespace TEAMModelOS.Controllers.Learn
  19. {
  20. /// <summary>
  21. /// 作业活动
  22. /// </summary>
  23. ///
  24. [ProducesResponseType(StatusCodes.Status200OK)]
  25. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  26. [Route("teacher/homework")]
  27. [ApiController]
  28. public class HomeworkController : ControllerBase
  29. {
  30. private readonly SnowflakeId _snowflakeId;
  31. private readonly AzureCosmosFactory _azureCosmos;
  32. private readonly AzureServiceBusFactory _serviceBus;
  33. public HomeworkController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus , SnowflakeId snowflakeId)
  34. {
  35. _azureCosmos = azureCosmos;
  36. _snowflakeId = snowflakeId;
  37. _serviceBus = serviceBus;
  38. }
  39. /// <summary>
  40. /// 撤消作业
  41. /// </summary>
  42. /// <param name="request"></param>
  43. /// <returns></returns>
  44. [ProducesDefaultResponseType]
  45. [HttpPost("cancel")]
  46. public async Task<IActionResult> Cancel(JsonElement requert)
  47. {
  48. /* if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
  49. //if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  50. var jwt = new JwtSecurityToken(id_token.GetString());
  51. if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
  52. var id = jwt.Payload.Sub;
  53. //var id = "03245d02-71ba-4e44-97dd-1e66c91bff6c";
  54. //if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  55. var client = _azureCosmos.GetCosmosClient();
  56. //權限token
  57. *//* jwt.Payload.TryGetValue("name", out object name);
  58. jwt.Payload.TryGetValue("picture", out object picture);*//*
  59. var response = await client.GetContainer("TEAMModelOSTemp", "Teacher").ReadItemStreamAsync(id, new PartitionKey($"Homework-{id_token}"));
  60. if (response.Status == 200)
  61. {
  62. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  63. int status = json.RootElement.GetProperty("status").GetInt32();
  64. }
  65. return Ok();*/
  66. ResponseBuilder builder = ResponseBuilder.custom();
  67. requert.TryGetProperty("id", out JsonElement homeWorkId);
  68. List<Homework> homeWorks = await _azureCosmos.FindByDict<Homework>(new Dictionary<string, object> { { "id", homeWorkId.ToString() } });
  69. foreach (Homework homeWork in homeWorks)
  70. {
  71. homeWork.status = 100;
  72. }
  73. List<Homework> homeWorks1 = await _azureCosmos.UpdateAll<Homework>(homeWorks);
  74. //查询之前是否有 关联关系表 HomeWorkStudent 有则删除
  75. List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", homeWorkId.ToString() } });
  76. if (homeWorkStudents.IsNotEmpty())
  77. {
  78. //TODO 删除上传的文件
  79. await _azureCosmos.DeleteAll(homeWorkStudents);
  80. }
  81. //return builder.Data(homeWorks1).build();
  82. return Ok(homeWorks1);
  83. }
  84. /// <summary>
  85. /// 删除作业
  86. /// </summary>
  87. /// <param name="request"></param>
  88. /// <returns></returns>
  89. [ProducesDefaultResponseType]
  90. [HttpPost("delete")]
  91. public async Task<IActionResult> Delete(IdPk request)
  92. {
  93. ResponseBuilder builder = ResponseBuilder.custom();
  94. IdPk idPk = await _azureCosmos.DeleteAsync<Homework>(request);
  95. //按作业id删除提交记录
  96. List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", idPk.id } });
  97. //TODO 删除上传的文件
  98. await _azureCosmos.DeleteAll<HomeworkRecord>(homeWorkStudents);
  99. //return builder.Data(idPk).build();
  100. return Ok(idPk);
  101. }
  102. /// <summary>
  103. /// 新增或修改 作业活动 同时创建关联关系表
  104. /// </summary>
  105. /// <param name="request"></param>
  106. /// <returns></returns>
  107. [ProducesDefaultResponseType]
  108. [HttpPost("upsert")]
  109. public async Task<IActionResult> Upsert(HomeworkDto request)
  110. {
  111. ResponseBuilder builder = ResponseBuilder.custom();
  112. //新增
  113. var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
  114. if (string.IsNullOrEmpty(request.homeWork.id))
  115. {
  116. request.homeWork.code = "Homework-" + id;
  117. request.homeWork.id = _snowflakeId.NextId()+"";
  118. request.homeWork.status = 100;
  119. request.reset = true;
  120. request.homeWork.createTime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();
  121. }
  122. /*if (request.homeWork.publishModel.Equals("0"))
  123. {
  124. request.homeWork.startTime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
  125. request.homeWork.status = 200;
  126. }
  127. else if (request.homeWork.publishModel.Equals("1"))
  128. {
  129. //TimerWork<HomeWork>(request.@params.homeWork.startTime,new Dictionary<string, object> { { "id", request.@params.homeWork.id } });
  130. //设定开始时间
  131. string msgId = _snowflakeId.NextId() + "";
  132. long SequenceNumber = await _serviceBus.GetServiceBusClient().SendLeamMessage<Homework>(Constants.TopicName, request.homeWork.id, request.homeWork.code, request.homeWork.startTime,"going", msgId);
  133. request.homeWork.sequenceNumber = SequenceNumber;
  134. //serviceBusReviceService.ReciveMessageAsync();
  135. //await _serviceBus.ReciveMessageAsync<Homework>(Constants.SubName);
  136. //_timerWorkService.TimerWork<Homework>(request.@params.homeWork.startTime,200, new Dictionary<string, object> { { "id", request.@params.homeWork.id } });
  137. }*/
  138. if (request.homeWork.status == 0) {
  139. if (request.homeWork.startTime < new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds()) request.homeWork.status = 200;
  140. else request.homeWork.status = 100;
  141. }
  142. Homework homeWork = await _azureCosmos.SaveOrUpdate<Homework>(request.homeWork);
  143. //设定结束时间
  144. string msgEndId = _snowflakeId.NextId() + "";
  145. await _serviceBus.GetServiceBusClient().SendLeamMessage<Homework>(Constants.TopicName, request.homeWork.id, request.homeWork.code, request.homeWork.endTime,"finish");
  146. //_timerWorkService.TimerWork<Homework>(request.@params.homeWork.endTime, 300, new Dictionary<string, object> { { "id", request.@params.homeWork.id } });
  147. //清除作业
  148. if (request.reset)
  149. {
  150. //根据作业发布对象查找到每一个具体学生生成关联关系表 HomeWorkStudent
  151. // List<Target> targets = request.@params.homeWork.target;
  152. //List<HomeworkRecord> homeWorkStudents = new List<HomeworkRecord>();
  153. // foreach (Target target in targets)
  154. // {
  155. //查询之前是否有 关联关系表 HomeWorkStudent 有则删除
  156. List<HomeworkRecord> homeWorks = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", request.homeWork.id } });
  157. if (homeWorks.IsNotEmpty())
  158. {
  159. await _azureCosmos.DeleteAll(homeWorks);
  160. }
  161. //List<ClassStudent> classroom = await _cosmos.FindByDict<ClassStudent>(new Dictionary<string, object> { { "id", target.classroomCode }});
  162. //if (classroom.IsNotEmpty())
  163. //{
  164. // foreach (ClassStudent student in classroom)
  165. // {
  166. // HomeworkRecord homeWorkStudent = new HomeworkRecord();
  167. // homeWorkStudent.code = student.code;
  168. // homeWorkStudent.id = request.@params.homeWork.id;
  169. // homeWorkStudent.classroom.code = target.classroomCode;
  170. // homeWorkStudent.classroom.name = target.classroomName;
  171. // homeWorkStudents.Add(homeWorkStudent);
  172. // }
  173. //}
  174. //}
  175. //if (homeWorkStudents.IsNotEmpty())
  176. //{
  177. // foreach (HomeworkRecord homeWorkStudents1 in homeWorkStudents)
  178. // {
  179. // List<Student> student = await _cosmos.FindById<Student>(homeWorkStudents1.code);//FindByDict<Student>(new Dictionary<string, object> { { "id", homeWorkStudents1.studentId } });
  180. // if (student.IsNotEmpty())
  181. // {
  182. // homeWorkStudents1.code = student[0].studentId;
  183. // // homeWorkStudents1.nativeroom.code = student[0].classroomCode;
  184. // }
  185. // }
  186. // await _cosmos.SaveOrUpdateAll<HomeworkRecord>(homeWorkStudents);
  187. //}
  188. }
  189. //return builder.Data(homeWork).build();
  190. return Ok(homeWork);
  191. }
  192. /// <summary>
  193. /// 新增或修改学生作业关联表
  194. /// </summary>
  195. /// <param name="request"></param>
  196. /// <returns></returns>
  197. [ProducesDefaultResponseType]
  198. [HttpPost("upsert-record")]
  199. public async Task<IActionResult> UpsertRecord(List<HomeworkRecord> request)
  200. {
  201. //ResponseBuilder builder = ResponseBuilder.custom();
  202. await _azureCosmos.SaveOrUpdateAll<HomeworkRecord>(request);
  203. //return builder.Data(request).build();
  204. return Ok(request);
  205. }
  206. /// <summary>
  207. /// 查询作业活动
  208. /// </summary>
  209. /// <param name="request"></param>
  210. /// <returns></returns>
  211. [ProducesDefaultResponseType]
  212. [HttpPost("find")]
  213. public async Task<IActionResult> Find(JsonElement request)
  214. {
  215. ResponseBuilder builder = ResponseBuilder.custom();
  216. List<Homework> data = new List<Homework>();
  217. List<HomeworkFindDto> homeWorkFindDtos = new List<HomeworkFindDto>();
  218. if (StringHelper.getKeyCount(request) > 0)
  219. {
  220. data = await _azureCosmos.FindByDict<Homework>(request);
  221. //判断作业提交信息
  222. if (data.IsNotEmpty())
  223. {
  224. foreach (Homework homeWork in data)
  225. {
  226. //HomeworkFindDto homeWorkFindDto = new HomeworkFindDto();
  227. List<string> pro = new List<string>();
  228. pro.Add("submit");
  229. List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(dict: new Dictionary<string, object> { { "id", homeWork.id } }, propertys: pro);
  230. int sub = 0;
  231. Dictionary<string, object> dict = new Dictionary<string, object>();
  232. dict.Add("Sum", homeWorkStudents.Count);
  233. dict.Add("Finish", sub);
  234. HomeworkFindDto homeWorkFindDto = homeWork.ToJsonString().ToObject<HomeworkFindDto>();
  235. homeWorkFindDto.statistics = dict;
  236. homeWorkFindDtos.Add(homeWorkFindDto);
  237. }
  238. }
  239. }
  240. else
  241. {
  242. ///return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
  243. return Ok("参数异常!");
  244. }
  245. //return builder.Data(homeWorkFindDtos).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
  246. return Ok(new { homeWorkFindDtos, data.Count });
  247. }
  248. /// <summary>
  249. /// 查询作业学生关联
  250. /// </summary>
  251. /// <param name="request"></param>
  252. /// <returns></returns>
  253. [ProducesDefaultResponseType]
  254. [HttpPost("find-record")]
  255. public async Task<IActionResult> FindRecord(JsonElement requert)
  256. {
  257. var client = _azureCosmos.GetCosmosClient();
  258. //if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  259. //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
  260. if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
  261. var jwt = new JwtSecurityToken(id_token.GetString());
  262. if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
  263. var id = jwt.Payload.Sub;
  264. List<object> records = new List<object>();
  265. var query = $"select c.id,c.classroom,c.submit, c.submitTime,c.score,c.content,c.stuCmt,c.tchCmt from c where id = {id}";
  266. await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"HomeworkRecord-{id}") }))
  267. {
  268. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  269. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  270. {
  271. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  272. {
  273. records.Add(obj.ToObject<object>());
  274. }
  275. }
  276. }
  277. return Ok(new { records });
  278. /*ResponseBuilder builder = ResponseBuilder.custom();
  279. List<HomeworkRecord> data = new List<HomeworkRecord>();
  280. if (StringHelper.getKeyCount(request) > 0)
  281. {
  282. data = await _azureCosmos.FindByDict<HomeworkRecord>(request);
  283. }
  284. else
  285. {
  286. return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
  287. }
  288. return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  289. }
  290. /// <summary>
  291. /// 教师作业打分评论
  292. /// </summary>
  293. /// <param name="request"></param>
  294. /// <returns></returns>
  295. [ProducesDefaultResponseType]
  296. [HttpPost("tch-score")]
  297. public async Task<IActionResult> TchScore(HomeworkScoringDto request)
  298. {
  299. ResponseBuilder builder = ResponseBuilder.custom();
  300. List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "code", request.studentId }, { "id", request.homeWorkId } });
  301. HomeworkRecord data = new HomeworkRecord();
  302. if (homeWorkStudents.IsNotEmpty())
  303. {
  304. homeWorkStudents[0].score = request.score ?? homeWorkStudents[0].score;
  305. HomeWorkComment homeWorkComment = new HomeWorkComment
  306. {
  307. comment = request.comments,
  308. createTime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds(),
  309. TEAMModelId = request.TEAMModelId
  310. };
  311. homeWorkStudents[0].tchCmt = homeWorkComment;
  312. data = await _azureCosmos.SaveOrUpdate(homeWorkStudents[0]);
  313. }
  314. //return builder.Data(data).build();
  315. return Ok(data);
  316. }
  317. /// <summary>
  318. /// 学生作业打分评论
  319. /// </summary>
  320. /// <param name="request"></param>
  321. /// <returns></returns>
  322. [ProducesDefaultResponseType]
  323. [HttpPost("stu-score")]
  324. public async Task<IActionResult> StuScore(HomeworkCommentDto request)
  325. {
  326. ResponseBuilder builder = ResponseBuilder.custom();
  327. List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "code", request.studentId }, { "id", request.homeWorkId } });
  328. List<Homework> homeWorks = await _azureCosmos.FindByDict<Homework>(new Dictionary<string, object> { { "id", request.homeWorkId } });
  329. HomeworkRecord data = new HomeworkRecord();
  330. if (homeWorks.IsNotEmpty() && homeWorks[0].other.Contains("comment"))
  331. {
  332. if (homeWorkStudents.IsNotEmpty())
  333. {
  334. if (string.IsNullOrEmpty(request.commentid))
  335. {
  336. //评论
  337. StudentComment homeWorkComment = new StudentComment
  338. {
  339. commentid = _snowflakeId.NextId() + "",
  340. comment = request.comment,
  341. createTime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds(),
  342. fromId = request.fromId,
  343. score = request.score
  344. };
  345. homeWorkStudents[0].stuCmt.Add(homeWorkComment);
  346. }
  347. else
  348. {
  349. //回复评论
  350. foreach (StudentComment comment in homeWorkStudents[0].stuCmt)
  351. {
  352. if (comment.commentid == request.commentid)
  353. {
  354. Reply reply = new Reply();
  355. reply.fromId = request.fromId;
  356. reply.toId = request.toId;
  357. reply.identity = request.identity;
  358. reply.comment = request.comment;
  359. reply.createTime = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
  360. comment.reply.Add(reply);
  361. }
  362. }
  363. }
  364. data = await _azureCosmos.Update(homeWorkStudents[0]);
  365. }
  366. //return builder.Data(data).build();
  367. return Ok(data);
  368. }
  369. else {
  370. //return builder.Error(ResponseCode.FAILED, "未开放互评!").build();
  371. return Ok("未开放互评!");
  372. }
  373. }
  374. }
  375. }