HomeworkController.cs 76 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372
  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.SDK.Models;
  11. using TEAMModelOS.SDK;
  12. using TEAMModelOS.SDK.DI;
  13. using TEAMModelOS.SDK.Extension;
  14. using TEAMModelOS.SDK.Helper.Common.StringHelper;
  15. using TEAMModelOS.Filter;
  16. using Microsoft.Extensions.Configuration;
  17. using Microsoft.Extensions.Options;
  18. using System.Net.Http;
  19. using TEAMModelOS.Models;
  20. using Azure.Messaging.ServiceBus;
  21. using System.IO;
  22. using System.Linq;
  23. using HTEXLib.COMM.Helpers;
  24. namespace TEAMModelOS.Controllers.Learn
  25. {
  26. // TODO 代码优化
  27. /// <summary>
  28. /// 作业活动
  29. /// </summary>
  30. ///
  31. [ProducesResponseType(StatusCodes.Status200OK)]
  32. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  33. [Route("common/homework")]
  34. [ApiController]
  35. public class HomeworkController : ControllerBase
  36. {
  37. private readonly AzureRedisFactory _azureRedis;
  38. private readonly AzureCosmosFactory _azureCosmos;
  39. private readonly SnowflakeId _snowflakeId;
  40. private readonly AzureServiceBusFactory _serviceBus;
  41. private readonly DingDing _dingDing;
  42. private readonly Option _option;
  43. private readonly AzureStorageFactory _azureStorage;
  44. private readonly IHttpClientFactory _clientFactory;
  45. public IConfiguration _configuration { get; set; }
  46. public HomeworkController(AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option,
  47. AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, IHttpClientFactory clientFactory, IConfiguration configuration)
  48. {
  49. _snowflakeId = snowflakeId;
  50. _serviceBus = serviceBus;
  51. _azureCosmos = azureCosmos;
  52. _dingDing = dingDing;
  53. _option = option?.Value;
  54. _azureRedis = azureRedis;
  55. _azureStorage = azureStorage;
  56. _clientFactory = clientFactory;
  57. _configuration = configuration;
  58. }
  59. /// <summary>
  60. /// 新增 或 修改投票活动
  61. /// </summary>
  62. /// <param name="request"></param>
  63. /// <returns></returns>
  64. [ProducesDefaultResponseType]
  65. [HttpPost("upsert")]
  66. [AuthToken(Roles = "teacher,admin", Permissions = "schoolAc-upd")]
  67. public async Task<IActionResult> Upsert(Homework homework)
  68. {
  69. try {
  70. var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
  71. var client = _azureCosmos.GetCosmosClient();
  72. homework.pk = "Homework";
  73. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  74. if (!homework.code.StartsWith("Homework-"))
  75. {
  76. homework.code = $"Homework-{homework.code}";
  77. }
  78. homework.creatorId = userid;
  79. homework.createTime = now;
  80. if (homework.startTime <= 0)
  81. {
  82. homework.startTime = now;
  83. }
  84. homework.ttl = -1;
  85. if (string.IsNullOrEmpty(homework.id))
  86. {
  87. homework.id = Guid.NewGuid().ToString();
  88. if (homework.startTime > now)
  89. {
  90. homework.progress = "pending";
  91. }
  92. else
  93. {
  94. homework.progress = "going";
  95. }
  96. homework.progress = "going";
  97. var messageBlob = new ServiceBusMessage();
  98. string blobcntr = null;
  99. if (homework.scope.Equals("school"))
  100. {
  101. blobcntr = homework.school;
  102. homework.size = await _azureStorage.GetBlobContainerClient(homework.school).GetBlobsSize($"homework/{homework.id}");
  103. messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "insert", root = $"homework/{homework.id}", name = $"{homework.school}" }.ToJsonString());
  104. }
  105. else
  106. {
  107. blobcntr = homework.creatorId;
  108. homework.size = await _azureStorage.GetBlobContainerClient(homework.creatorId).GetBlobsSize($"homework/{homework.id}");
  109. messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "insert", root = $"homework/{homework.id}", name = $"{homework.creatorId}" }.ToJsonString());
  110. }
  111. messageBlob.ApplicationProperties.Add("name", "BlobRoot");
  112. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  113. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  114. homework.recordUrl = $"/homework/{homework.id}/record.json";
  115. var cods = new { records = new List<string>(), userids = new List<string>(), question = new List<QuestionRecord>() };
  116. await _azureStorage.UploadFileByContainer(blobcntr, cods.ToJsonString(), "homework", $"{homework.id}/record.json");
  117. homework = await client.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(homework, new PartitionKey($"{homework.code}"));
  118. }
  119. else
  120. {
  121. string blobcntr = null;
  122. var response = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync(homework.id, new PartitionKey($"{homework.code}"));
  123. var messageBlob = new ServiceBusMessage();
  124. if (homework.scope.Equals("school"))
  125. {
  126. blobcntr = homework.school;
  127. homework.size = await _azureStorage.GetBlobContainerClient(homework.school).GetBlobsSize($"homework/{homework.id}");
  128. messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "update", root = $"homework/{homework.id}", name = $"{homework.school}" }.ToJsonString());
  129. }
  130. else
  131. {
  132. blobcntr = homework.creatorId;
  133. homework.size = await _azureStorage.GetBlobContainerClient(homework.creatorId).GetBlobsSize($"homework/{homework.id}");
  134. messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "update", root = $"homework/{homework.id}", name = $"{homework.creatorId}" }.ToJsonString());
  135. }
  136. messageBlob.ApplicationProperties.Add("name", "BlobRoot");
  137. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  138. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  139. if (response.Status == 200)
  140. {
  141. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  142. var info = json.ToObject<Homework>();
  143. if (info.progress.Equals("going"))
  144. {
  145. return Ok(new { v = "活动正在进行中" });
  146. }
  147. if (homework.startTime > now)
  148. {
  149. homework.progress = "pending";
  150. }
  151. else
  152. {
  153. homework.progress = "going";
  154. }
  155. homework.progress = info.progress;
  156. homework.recordUrl = $"/homework/{homework.id}/record.json";
  157. homework = await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(homework, info.id, new PartitionKey($"{info.code}"));
  158. }
  159. else
  160. {
  161. if (homework.startTime > now)
  162. {
  163. homework.progress = "pending";
  164. }
  165. else
  166. {
  167. homework.progress = "going";
  168. }
  169. homework.progress = "going";
  170. homework.recordUrl = $"/homework/{homework.id}/record.json";
  171. var cods = new { records = new List<string>(), userids = new List<string>(), question = new List<QuestionRecord>() };
  172. await _azureStorage.UploadFileByContainer(blobcntr, cods.ToJsonString(), "homework", $"{homework.id}/record.json");
  173. homework = await client.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(homework, new PartitionKey($"{homework.code}"));
  174. }
  175. }
  176. return Ok(new { homework });
  177. } catch (CosmosException ex) {
  178. return Ok(new { error = ex.Status });
  179. }
  180. catch (Exception ex)
  181. {
  182. return Ok(new { error = 400 });
  183. }
  184. }
  185. /// <summary>
  186. /// 查询问卷调查,用于列表,编辑,查看
  187. /// </summary>
  188. /// <data>
  189. ///Survey-学校/教师编码 活动分区 !"code":"hbcn"/1606285227
  190. ///时间筛选范围开始时间 默认30天之前 ?"stime":1608274766154
  191. ///时间筛选范围结束时间 默认当前时间 ?"etime":1608274766666
  192. ///每页大小 ?"count":10/null/Undefined
  193. ///分页Token ?"continuationToken":Undefined/null/"[{\"token\":\"+RID:~omxMAP3ipcSEEwAAAAAAAA==#RT:2#TRC:20#ISV:2#IEO:65551#QCF:1#FPC:AYQTAAAAAAAAiRMAAAAAAAA=\",\"range\":{\"min\":\"\",\"max\":\"FF\"}}]"
  194. /// 当前状态 ?"progress":Undefined/null/"" 表示两种状态都要查询/ "going"/"finish" 表示查询进行中/ 或者已完成 学生端只能查询正在进行或已经结束 going 已发布|finish 已结束
  195. /// </data>
  196. /// <param name="request"></param>
  197. /// <returns></returns>
  198. [ProducesDefaultResponseType]
  199. [HttpPost("find")]
  200. [AuthToken(Roles = "teacher,admin,student", Permissions = "schoolAc-read,schoolAc-upd")]
  201. public async Task<IActionResult> Find(JsonElement request) {
  202. try
  203. {
  204. var client = _azureCosmos.GetCosmosClient();
  205. var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
  206. //必须有学校或者教师编码
  207. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  208. //开始时间,默认最近三十天
  209. var stimestamp = DateTimeOffset.UtcNow.AddDays(-30).ToUnixTimeMilliseconds();
  210. if (request.TryGetProperty("stime", out JsonElement stime))
  211. {
  212. if (long.TryParse($"{stime}", out long data))
  213. {
  214. stimestamp = data;
  215. };
  216. };
  217. //默认当前时间
  218. var etimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  219. if (request.TryGetProperty("etime", out JsonElement etime))
  220. {
  221. if (long.TryParse($"{etime}", out long data))
  222. {
  223. etimestamp = data;
  224. };
  225. };
  226. var progresssql = "";
  227. if (request.TryGetProperty("progress", out JsonElement progress))
  228. {
  229. if (!progress.ValueKind.Equals(JsonValueKind.Undefined) && !progress.ValueKind.Equals(JsonValueKind.Null) && progress.ValueKind.Equals(JsonValueKind.String))
  230. {
  231. progresssql = $" and c.progress='{progress}' ";
  232. }
  233. }
  234. string continuationToken = null;
  235. //默认不指定返回大小
  236. int? topcout = null;
  237. if (request.TryGetProperty("count", out JsonElement jcount))
  238. {
  239. if (int.TryParse($"{jcount}", out int data))
  240. {
  241. topcout = data;
  242. }
  243. };
  244. //是否需要进行分页查询,默认不分页
  245. bool iscontinuation = false;
  246. //如果指定了返回大小
  247. if (request.TryGetProperty("continuationToken", out JsonElement continuation))
  248. {
  249. //指定了cancellationToken 表示需要进行分页
  250. if (!continuation.ValueKind.Equals(JsonValueKind.Null) && !continuation.ValueKind.Equals(JsonValueKind.Undefined))
  251. {
  252. continuationToken = continuation.GetString();
  253. iscontinuation = true;
  254. }
  255. };
  256. List<Homework> homeworks = new List<Homework>();
  257. var query = $"select c.owner, c.id,c.name,c.code,c.startTime,c.endTime,c.progress,c.classes,c.scope,c.school from c where c.createTime >= {stimestamp} and c.createTime <= {etimestamp} {progresssql } and c.ttl=-1 ";
  258. if (string.IsNullOrEmpty(school))
  259. {
  260. query = $"{query} and c.scope='private' ";
  261. }
  262. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<Homework>(queryText: query,
  263. requestOptions: new QueryRequestOptions() { MaxItemCount = topcout, PartitionKey = new PartitionKey($"Homework-{code}") }))
  264. {
  265. if (!string.IsNullOrEmpty(school))
  266. {
  267. //只能查出相关学校的
  268. if (!item.scope.Equals("private") && !string.IsNullOrEmpty(item.school) && item.school.Equals(school))
  269. {
  270. homeworks.Add(item);
  271. }
  272. //和自己私人发布的
  273. if (item.scope.Equals("private"))
  274. {
  275. homeworks.Add(item);
  276. }
  277. }
  278. else
  279. {
  280. homeworks.Add(item);
  281. }
  282. }
  283. return Ok(new { homeworks });
  284. }
  285. catch (CosmosException ex)
  286. {
  287. return Ok(new { error = ex.Status });
  288. }
  289. catch (Exception ex) {
  290. return Ok(new { error = 400 });
  291. }
  292. }
  293. ///<summary>
  294. /// 查询问卷调查,用于创建者列表,编辑,查看,作答人员查看
  295. /// </summary>
  296. /// <data>
  297. /// ! "id":"3c075347-75ef-4bcb-ae03-68678d02d5ef",
  298. /// ! "code":"Survey-hbcn"/"code":"Survey-1606285227"
  299. /// </data>
  300. /// <param name="request"></param>
  301. /// <returns></returns>
  302. [ProducesDefaultResponseType]
  303. [HttpPost("find-id")]
  304. [AuthToken(Roles = "teacher,admin,student", Permissions = "schoolAc-read,schoolAc-upd")]
  305. public async Task<IActionResult> FindById(JsonElement request) {
  306. Homework work = null;
  307. var client = _azureCosmos.GetCosmosClient();
  308. var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
  309. //活动id
  310. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  311. //活动分区
  312. if (!request.TryGetProperty("code", out JsonElement _code)) return BadRequest();
  313. try
  314. {
  315. work = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Homework>(id.GetString(), new PartitionKey($"Homework-{_code}"));
  316. return Ok(new { work, status = 200 });
  317. }
  318. catch (CosmosException ex)
  319. {
  320. return Ok(new { homework = work, status = 404 });
  321. }
  322. catch (Exception ex)
  323. {
  324. await _dingDing.SendBotMsg($"OS,{_option.Location},common/survey/find-id\n{ex.Message}{ex.StackTrace}\n{id}\n{_code} ", GroupNames.醍摩豆服務運維群組);
  325. return Ok(new { work, status = 404 });
  326. }
  327. }
  328. /// <summary>
  329. /// 删除问卷调查 TODO 使用ttl删除,并处理相关事务逻辑
  330. /// </summary>
  331. /// <param name="request"></param>
  332. /// <returns></returns>
  333. [ProducesDefaultResponseType]
  334. [HttpPost("delete")]
  335. [AuthToken(Roles = "teacher,admin", Permissions = "schoolAc-upd")]
  336. public async Task<IActionResult> Delete(JsonElement request) {
  337. try {
  338. var client = _azureCosmos.GetCosmosClient();
  339. var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
  340. if (!request.TryGetProperty("id", out JsonElement _id)) return BadRequest();
  341. if (!request.TryGetProperty("code", out JsonElement __code)) return BadRequest();
  342. Homework homeworkd = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Homework>(_id.GetString(), new PartitionKey($"Homework-{__code}"));
  343. bool flag = false;
  344. //必须是本人或者这个学校的管理者才能删除
  345. if (homeworkd.creatorId == userid)
  346. {
  347. flag = true;
  348. }
  349. else
  350. {
  351. if (homeworkd.scope.Equals("school") && homeworkd.school.Equals(school))
  352. {
  353. flag = true;
  354. }
  355. }
  356. if (flag)
  357. {
  358. //使用ttl删除,并处理相关事务逻辑
  359. homeworkd.ttl = 1;
  360. homeworkd.status = 404;
  361. homeworkd = await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(homeworkd, homeworkd.id, new PartitionKey($"{homeworkd.code}"));
  362. //删除blob 相关资料
  363. await _azureStorage.GetBlobServiceClient().DeleteBlobs(_dingDing, $"{__code}".Replace("Homework-", ""), new List<string> { Path.Combine("homework", homeworkd.id) + "/" });
  364. //通知删除信息
  365. var messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "delete", root = $"homework/{homeworkd.id}", name = $"{__code}" }.ToJsonString());
  366. messageBlob.ApplicationProperties.Add("name", "BlobRoot");
  367. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  368. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  369. await _dingDing.SendBotMsg($"{_option.Location}-作业活动【{homeworkd.name}-{homeworkd.id}】被删除", GroupNames.成都开发測試群組);
  370. return Ok(new { flag });
  371. }
  372. else
  373. {
  374. return Ok(new { flag });
  375. }
  376. } catch (CosmosException ex) {
  377. return Ok(new { flag = false, error = 404 });
  378. }
  379. }
  380. public class TypeUser {
  381. public string userid { get; set; }
  382. public string userType { get; set; }
  383. public string userSchool { get; set; }
  384. public string username { get; set; }
  385. public List<TypeUserClass> classes { get; set; } = new List<TypeUserClass>();
  386. }
  387. public class TypeUserClass
  388. {
  389. public string id { get; set; }
  390. public string name { get; set; }
  391. }
  392. public class HomeworkUser
  393. {
  394. public string userid { get; set; }
  395. public string userType { get; set; }
  396. public string userSchool { get; set; }
  397. public long submitTime { get; set; }
  398. public double score { get; set; } = -1;
  399. public double star { get; set; } = -1;
  400. public double teacherStar { get; set; } = -1;
  401. public bool submit { get; set; }
  402. public string username { get; set; }
  403. public List<TypeUserClass> classes { get; set; } = new List<TypeUserClass>();
  404. public List<string> replies { get; set; } = new List<string>();
  405. public List<Attachment> content { get; set; } = new List<Attachment>();
  406. }
  407. /// <summary>
  408. /// 互动
  409. /// </summary>
  410. /// <param name="request"></param>
  411. /// <returns></returns>
  412. [ProducesDefaultResponseType]
  413. [HttpPost("interact")]
  414. [AuthToken(Roles = "teacher,student,admin")]
  415. public async Task<IActionResult> Interact(JsonElement request)
  416. {
  417. if (!HttpContext.Items.TryGetValue("Scope", out object _scope)) return BadRequest();
  418. var client = _azureCosmos.GetCosmosClient();
  419. var (userid, name, _, school) = HttpContext.GetAuthTokenInfo();
  420. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  421. if (!request.TryGetProperty("opt", out JsonElement _opt)) return BadRequest();
  422. if (!request.TryGetProperty("id", out JsonElement _id)) return BadRequest();
  423. if (!request.TryGetProperty("code", out JsonElement __code)) return BadRequest();
  424. // if (!request.TryGetProperty("teacher", out JsonElement _teacher)) return BadRequest();
  425. if (!request.TryGetProperty("targetType", out JsonElement _targetType)) return BadRequest();
  426. string tbname = "Student";
  427. if ($"{_targetType}".Equals("research", StringComparison.OrdinalIgnoreCase)|| $"{_targetType}".Equals("yxtrain", StringComparison.OrdinalIgnoreCase))
  428. {
  429. tbname = "Teacher";
  430. }
  431. else if ($"{_targetType}".Equals("student", StringComparison.OrdinalIgnoreCase))
  432. {
  433. tbname = "Student";
  434. }
  435. try
  436. {
  437. Homework homework = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Homework>($"{_id}", new PartitionKey($"Homework-{__code}"));
  438. string teacher = homework.creatorId;
  439. switch (true)
  440. { //作答记录
  441. case bool when $"{_opt}".Equals("AnswerRecordAll", StringComparison.OrdinalIgnoreCase):
  442. try
  443. { // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  444. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  445. // if (!request.TryGetProperty("typeUsers", out JsonElement _typeUsers)) return BadRequest();
  446. if (!request.TryGetProperty("listIds", out JsonElement _listIds)) return BadRequest();
  447. List<string> listIds = _listIds.ToJsonString().ToObject<List<string>>();
  448. List<TypeUser> typeUsers = new List<TypeUser>();
  449. (List<RMember> tmdinfos, List<RGroupList> classInfo) = await GroupListService.GetStutmdidListids(client, _dingDing, listIds, homework.school);
  450. var addStudentsCls = tmdinfos.FindAll(x => x.type == 2);
  451. var addTmdidsCls = tmdinfos.FindAll(x => x.type == 1);
  452. if ($"{_targetType}".Equals("research", StringComparison.OrdinalIgnoreCase) || $"{_targetType}".Equals("yxtrain", StringComparison.OrdinalIgnoreCase))
  453. {
  454. if (tmdinfos.IsNotEmpty())
  455. {
  456. tmdinfos.ForEach(x => {
  457. var clases= classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList() ;
  458. typeUsers.Add(new TypeUser() { userid = x.id, userType = "tmdid", username = x.name, classes = clases.Select(x=>new TypeUserClass{id= x.id,name=x.name}).ToList() });
  459. });
  460. }
  461. }
  462. else {
  463. if (addTmdidsCls.IsNotEmpty())
  464. {
  465. addTmdidsCls.ForEach(x => {
  466. var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
  467. typeUsers.Add(new TypeUser() { userid = x.id, userType = "tmdid", username = x.name, classes = clases.Select(x => new TypeUserClass { id = x.id, name = x.name }).ToList() });
  468. });
  469. }
  470. if (addStudentsCls.IsNotEmpty())
  471. {
  472. addStudentsCls.ForEach(x => {
  473. var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
  474. typeUsers.Add(new TypeUser() { 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() });
  475. });
  476. }
  477. }
  478. List<dynamic> rscs = new List<dynamic>();
  479. string debateCode = "";
  480. string debateTbname = "";
  481. if (homework.scope.Equals("school"))
  482. {
  483. debateTbname = "School";
  484. debateCode = $"Debate-{homework.school}";
  485. }
  486. else
  487. {
  488. debateTbname = "Teacher";
  489. debateCode = $"Debate-{homework.creatorId}";
  490. }
  491. List<Debate> debates = new List<Debate>();
  492. string sql = $"select value(c) from c where c.comid='{_id}'";
  493. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, debateTbname).GetItemQueryIterator<Debate>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(debateCode) }))
  494. {
  495. debates.Add(item);
  496. }
  497. List<HomeworkUser> users = new List<HomeworkUser>();
  498. foreach (var typeuser in typeUsers) {
  499. var us= users.Find(x => x.userid.Equals(typeuser.userid));
  500. if (us != null) { continue; }
  501. HomeworkUser user = new HomeworkUser() { userid=typeuser.userid,userSchool=typeuser.userSchool,userType=typeuser.userType,username=typeuser.username,classes=typeuser.classes};
  502. string partition = $"HomeworkRecord-{typeuser.userid}";
  503. if (typeuser.userType.Equals("student"))
  504. {
  505. partition = $"HomeworkRecord-{typeuser.userSchool}-{typeuser.userid}";
  506. }
  507. else
  508. {
  509. partition = $"HomeworkRecord-{typeuser.userid}";
  510. }
  511. HomeworkRecord record = null;
  512. try
  513. {
  514. record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(partition));
  515. double star = -1;
  516. List<double> stars = record.comments.Select(x => x.star).ToList();
  517. if (stars.IsNotEmpty())
  518. {
  519. star = stars.Sum() / stars.Count;
  520. }
  521. user.submit = true;
  522. user.star = star;
  523. user.score = record.score;
  524. user.submitTime = record.time;
  525. user.content = record.content;
  526. // user.username = typeuser.username;
  527. var teacherComment = record.comments.Where(x => x.identity.Equals("teacher") && record.teacher.Equals(userid)).FirstOrDefault();
  528. if (teacherComment != null)
  529. {
  530. user.teacherStar = teacherComment.star;
  531. List<string> replies = new List<string>();
  532. teacherComment.replyIds.ForEach(x => {
  533. var reply = debates.SelectMany(x => x.replies).ToList().Find(r => r.id.Equals(x));
  534. if (reply != null)
  535. {
  536. replies.Add(reply.comment);
  537. }
  538. });
  539. user.replies = replies;
  540. }
  541. }
  542. catch (CosmosException ex)
  543. {
  544. user.submit = false;
  545. record = null;
  546. }
  547. users.Add(user);
  548. }
  549. return Ok(new { users });
  550. }
  551. catch (CosmosException ex)
  552. {
  553. return Ok(new { error = 404 });
  554. }
  555. //作答记录
  556. case bool when $"{_opt}".Equals("AnswerRecord", StringComparison.OrdinalIgnoreCase):
  557. try
  558. { // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  559. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  560. if (!request.TryGetProperty("userid", out JsonElement _userid)) return BadRequest();
  561. if (!request.TryGetProperty("userType", out JsonElement _userType)) return BadRequest();
  562. string partition = $"HomeworkRecord-{_userid}";
  563. if ($"{_userType}".Equals("student"))
  564. {
  565. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  566. partition = $"HomeworkRecord-{_userSchool}-{_userid}";
  567. }
  568. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(partition));
  569. return Ok(new { record });
  570. }
  571. catch (CosmosException ex) {
  572. return Ok(new {error=404 });
  573. }
  574. //提交答案
  575. case bool when $"{_opt}".Equals("SubmitAnswer", StringComparison.OrdinalIgnoreCase):
  576. if (!request.TryGetProperty("content", out JsonElement _content)) return BadRequest();
  577. request.TryGetProperty("answer", out JsonElement _answer);
  578. string partitionKey = $"HomeworkRecord-{userid}";
  579. if ($"{_scope}".Equals(Constant.ScopeStudent))
  580. {
  581. partitionKey = $"HomeworkRecord-{school}-{userid}";
  582. }
  583. List<Attachment> content = _content.ToObject<List<Attachment>>();
  584. int taskStatus = -1;
  585. byte msgid = 0;
  586. if (content != null)
  587. {
  588. try
  589. {
  590. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(partitionKey));
  591. record.content = content;
  592. record.answer = $"{_answer}";
  593. record.submitCount += 1;
  594. await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<HomeworkRecord>(record, $"{_id}", new PartitionKey(partitionKey));
  595. taskStatus = 1;
  596. msgid = 1;
  597. }
  598. catch (CosmosException ex)
  599. {
  600. if (ex.Status == 404)
  601. {
  602. HomeworkRecord record = new HomeworkRecord
  603. {
  604. teacher = $"{teacher}",
  605. school = school,
  606. id = $"{_id}",
  607. code = partitionKey,
  608. content = content,
  609. answer = $"{_answer}",
  610. pk = "HomeworkRecord",
  611. ttl = -1,
  612. time = now,
  613. submitCount = 1,
  614. comid = Guid.NewGuid().ToString()
  615. };
  616. record = await client.GetContainer(Constant.TEAMModelOS, tbname).CreateItemAsync<HomeworkRecord>(record, new PartitionKey(partitionKey));
  617. taskStatus = 1;
  618. msgid = 1;
  619. }
  620. }
  621. //TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO 写入方便教师查看的作答记录
  622. try
  623. {
  624. if ($"{_scope}".Equals(Constant.ScopeStudent)) {
  625. StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>($"{_id}", new PartitionKey($"Activity-{school}-{userid}"));
  626. activity.taskStatus = taskStatus;
  627. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, $"{_id}", new PartitionKey($"Activity-{school}-{userid}"));
  628. }
  629. if ($"{_scope}".Equals(Constant.ScopeTmdUser))
  630. {
  631. StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>($"{_id}", new PartitionKey($"Activity-{userid}"));
  632. activity.taskStatus = taskStatus;
  633. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, $"{_id}", new PartitionKey($"Activity-{userid}"));
  634. }
  635. if ($"{_scope}".Equals(Constant.ScopeTeacher))
  636. {
  637. StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<StuActivity>($"{_id}", new PartitionKey($"Activity-{userid}"));
  638. activity.taskStatus = taskStatus;
  639. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<StuActivity>(activity, $"{_id}", new PartitionKey($"Activity-{userid}"));
  640. }
  641. }
  642. catch (CosmosException ex)
  643. {
  644. taskStatus = -1;
  645. }
  646. return Ok(new { msgid, taskStatus });
  647. }
  648. else {
  649. return Ok(new { msgid, taskStatus ,error =400});
  650. }
  651. //评论
  652. case bool when $"{_opt}".Equals("ReadAllComment", StringComparison.OrdinalIgnoreCase):
  653. // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  654. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  655. try
  656. {
  657. if (!request.TryGetProperty("userid", out JsonElement _userid)) return BadRequest();
  658. if (!request.TryGetProperty("userType", out JsonElement __userType)) return BadRequest();
  659. string _partition = $"HomeworkRecord-{_userid}";
  660. string userSchool = school;
  661. if ($"{__userType}".Equals("student"))
  662. {
  663. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  664. userSchool = $"{_userSchool}";
  665. _partition = $"HomeworkRecord-{_userSchool}-{_userid}";
  666. }
  667. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(_partition));
  668. string debateCode = "";
  669. string debateTbname = "";
  670. if (homework.scope.Equals("school"))
  671. {
  672. debateTbname = "School";
  673. debateCode = $"Debate-{homework.school}";
  674. }
  675. else
  676. {
  677. debateTbname = "Teacher";
  678. debateCode = $"Debate-{homework.creatorId}";
  679. }
  680. Debate debate = null;
  681. try
  682. {
  683. debate = await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReadItemAsync<Debate>($"{record.comid}", new PartitionKey(debateCode));
  684. } catch (CosmosException ex) {
  685. debate = null;
  686. }
  687. double star = -1;
  688. List<double> stars = record.comments.FindAll(y => y.identity.Equals("student")).Select(x => x.star).ToList();
  689. if (stars.IsNotEmpty()) {
  690. star = stars.Sum() / stars.Count;
  691. }
  692. List<dynamic> comments = new List<dynamic>();
  693. if (debate != null) {
  694. record.comments.ForEach(y => {
  695. List<dynamic> replies = new List<dynamic>();
  696. y.replyIds.ForEach(x => {
  697. var reply = debate.replies.Find(r => r.id.Equals(x));
  698. if (reply != null)
  699. {
  700. replies.Add(new { reply.comment ,reply.time} );
  701. }
  702. });
  703. comments.Add(new
  704. {
  705. identity = y.identity,
  706. star = y.star,
  707. replies = replies,
  708. userid = y.userid,
  709. username = y.username,
  710. userType = y.userType,
  711. userSchool = userSchool
  712. });
  713. });
  714. }
  715. return Ok(new { star, comments, record });
  716. }
  717. catch (CosmosException ex) {
  718. return Ok(new { error = 404 });
  719. }
  720. case bool when $"{_opt}".Equals("CommentAndStar", StringComparison.OrdinalIgnoreCase):
  721. try
  722. {
  723. // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  724. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  725. if (!request.TryGetProperty("userid", out JsonElement __userid)) return BadRequest();
  726. if (!request.TryGetProperty("userName", out JsonElement __userName)) return BadRequest();
  727. if (!request.TryGetProperty("userType", out JsonElement __userType)) return BadRequest();
  728. if (!request.TryGetProperty("identity", out JsonElement __identity)) return BadRequest();
  729. string userSchool = school;
  730. string _partition = $"HomeworkRecord-{__userid}";
  731. if ($"{__userType}".Equals("student"))
  732. {
  733. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  734. userSchool = $"{_userSchool}";
  735. _partition = $"HomeworkRecord-{_userSchool}-{__userid}";
  736. }
  737. if (!request.TryGetProperty("comment", out JsonElement _comment)) return BadRequest();
  738. if (!request.TryGetProperty("star", out JsonElement _star)) return BadRequest();
  739. double star = -1;
  740. double.TryParse($"{_star}",out star);
  741. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(_partition));
  742. ///话题对象,id为学生的作答记录的comid ,根据scope确定, code 为Debate-{schoolId},作业活动所在的学校编码|Debate-{teacherId},作业活动所在的教师编码
  743. string debateCode = "";
  744. string debateTbname = "";
  745. if (homework.scope.Equals("school"))
  746. {
  747. debateTbname = "School";
  748. debateCode = $"Debate-{homework.school}";
  749. }
  750. else {
  751. debateTbname = "Teacher";
  752. debateCode = $"Debate-{homework.creatorId}";
  753. }
  754. string userType = $"{_scope}".Equals("student") ? "student" : "tmdid";
  755. string replyId = Guid.NewGuid().ToString();
  756. DebateReply debateReply = new DebateReply
  757. {
  758. atUserType = $"{__userType}",
  759. userType = userType,
  760. id = replyId,
  761. pid = $"{record.comid}",
  762. tmdid = userid,
  763. tmdname = name,
  764. school= $"{userSchool}",
  765. comment = $"{_comment}",
  766. atTmdid = $"{__userid}",
  767. atTmdname = $"{__userName}" ,
  768. time = now
  769. };
  770. Debate debate = null;
  771. try
  772. {
  773. debate = await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReadItemAsync<Debate>($"{record.comid}", new PartitionKey(debateCode));
  774. debate.replies.Add(debateReply);
  775. await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReplaceItemAsync<Debate>(debate,$"{record.comid}", new PartitionKey(debateCode));
  776. } catch (CosmosException ex) {
  777. debate = new Debate
  778. {
  779. userType = $"{__userType}",
  780. comid = $"{homework.id}",
  781. code = debateCode,
  782. id = $"{record.comid}",
  783. tmdid = $"{__userid}",
  784. tmdname = $"{__userName}",
  785. title = $"{__userName}-{homework.name}",
  786. time = now,
  787. comment = "",
  788. school =homework.school,
  789. replies = new List<DebateReply>() { debateReply },
  790. source = "homework",
  791. openType = 0,
  792. ttl = -1,
  793. pk = "Debate"
  794. };
  795. await client.GetContainer(Constant.TEAMModelOS, debateTbname).CreateItemAsync<Debate>(debate, new PartitionKey(debateCode));
  796. }
  797. string identity = $"{__identity}";
  798. if (string.IsNullOrEmpty(identity))
  799. {
  800. identity = "student";
  801. }
  802. HomeworkComment homeworkComment = record.comments.Find(x => x.userid.Equals(userid));
  803. if (homeworkComment != null)
  804. {
  805. homeworkComment.star = star;
  806. // homeworkComment.replyIds.Add(replyId);
  807. homeworkComment.replyIds = new List<string> { replyId };
  808. }
  809. else
  810. {
  811. homeworkComment = new HomeworkComment
  812. {
  813. star= star,
  814. identity = identity,
  815. userType = $"{_scope}".Equals("student") ? "student" : "tmdid",
  816. userid = userid,
  817. username = name,
  818. school = school,
  819. replyIds = new List<string> { replyId }
  820. };
  821. record.comments.Add(homeworkComment);
  822. }
  823. record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<HomeworkRecord>(record,$"{_id}", new PartitionKey(_partition));
  824. return Ok(new { star, userid, username=name, identity, userType, userSchool, replies = new List<string>() { $"{_comment}" } });
  825. }
  826. catch (CosmosException ex)
  827. {
  828. return Ok(new { error = 404 });
  829. }
  830. catch (Exception ex) {
  831. return BadRequest(new { error = 400 });
  832. }
  833. //打分
  834. case bool when $"{_opt}".Equals("MarkScore", StringComparison.OrdinalIgnoreCase):
  835. try
  836. {
  837. // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  838. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  839. if (!request.TryGetProperty("userid", out JsonElement __userid)) return BadRequest();
  840. if (!request.TryGetProperty("userName", out JsonElement __userName)) return BadRequest();
  841. if (!request.TryGetProperty("userType", out JsonElement __userType)) return BadRequest();
  842. if (!request.TryGetProperty("identity", out JsonElement __identity)) return BadRequest();
  843. string userSchool = school;
  844. string _partition = $"HomeworkRecord-{__userid}";
  845. if ($"{__userType}".Equals("student"))
  846. {
  847. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  848. userSchool = $"{_userSchool}";
  849. _partition = $"HomeworkRecord-{_userSchool}-{__userid}";
  850. }
  851. if (!request.TryGetProperty("comment", out JsonElement _comment)) return BadRequest();
  852. if (!request.TryGetProperty("star", out JsonElement _star)) return BadRequest();
  853. double star = -1;
  854. double.TryParse($"{_star}", out star);
  855. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(_partition));
  856. ///话题对象,id为学生的作答记录的comid ,根据scope确定, code 为Debate-{schoolId},作业活动所在的学校编码|Debate-{teacherId},作业活动所在的教师编码
  857. string debateCode = "";
  858. string debateTbname = "";
  859. if (homework.scope.Equals("school"))
  860. {
  861. debateTbname = "School";
  862. debateCode = $"Debate-{homework.school}";
  863. }
  864. else
  865. {
  866. debateTbname = "Teacher";
  867. debateCode = $"Debate-{homework.creatorId}";
  868. }
  869. string userType = $"{_scope}".Equals("student") ? "student" : "tmdid";
  870. string replyId = Guid.NewGuid().ToString();
  871. DebateReply debateReply = new DebateReply
  872. {
  873. atUserType = $"{__userType}",
  874. userType = userType,
  875. id = replyId,
  876. pid = $"{record.comid}",
  877. tmdid = userid,
  878. tmdname = name,
  879. school = $"{userSchool}",
  880. comment = $"{_comment}",
  881. atTmdid = $"{__userid}",
  882. atTmdname = $"{__userName}",
  883. time = now
  884. };
  885. Debate debate = null;
  886. try
  887. {
  888. debate = await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReadItemAsync<Debate>($"{record.comid}", new PartitionKey(debateCode));
  889. debate.replies.Add(debateReply);
  890. await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReplaceItemAsync<Debate>(debate, $"{record.comid}", new PartitionKey(debateCode));
  891. }
  892. catch (CosmosException ex)
  893. {
  894. debate = new Debate
  895. {
  896. userType = $"{__userType}",
  897. comid = $"{homework.id}",
  898. code = debateCode,
  899. id = $"{record.comid}",
  900. tmdid = $"{__userid}",
  901. tmdname = $"{__userName}",
  902. title = $"{__userName}-{homework.name}",
  903. time = now,
  904. comment = "",
  905. school = homework.school,
  906. replies = new List<DebateReply>() { debateReply },
  907. source = "homework",
  908. openType = 0,
  909. ttl = -1,
  910. pk = "Debate"
  911. };
  912. await client.GetContainer(Constant.TEAMModelOS, debateTbname).CreateItemAsync<Debate>(debate, new PartitionKey(debateCode));
  913. }
  914. string identity = $"{__identity}";
  915. if (string.IsNullOrEmpty(identity))
  916. {
  917. identity = "teacher";
  918. }
  919. HomeworkComment homeworkComment = record.comments.Find(x => x.userid.Equals(userid));
  920. if (homeworkComment != null)
  921. {
  922. homeworkComment.star = star;
  923. homeworkComment.replyIds=new List<string> { replyId };
  924. }
  925. else
  926. {
  927. homeworkComment = new HomeworkComment
  928. {
  929. star = star,
  930. identity = identity,
  931. userType = $"{_scope}".Equals("student") ? "student" : "tmdid",
  932. userid = userid,
  933. username = name,
  934. school = school,
  935. replyIds = new List<string> { replyId }
  936. };
  937. record.comments.Add(homeworkComment);
  938. }
  939. if (!request.TryGetProperty("score", out JsonElement _score)) return BadRequest();
  940. record.score = double.Parse($"{_score}");
  941. await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<HomeworkRecord>(record, $"{_id}", new PartitionKey(_partition));
  942. return Ok(new { status = true });
  943. }
  944. catch (CosmosException ex)
  945. {
  946. return Ok(new { error = 404 });
  947. }
  948. catch (Exception ex)
  949. {
  950. return BadRequest(new { error = 400 });
  951. }
  952. }
  953. }
  954. catch (CosmosException ex)
  955. {
  956. }
  957. return Ok();
  958. }
  959. public class HomeworkReply
  960. {
  961. /// <summary>
  962. /// 角色类型 成员 student 学校 teacher
  963. /// </summary>
  964. public string roleType { get; set; }
  965. /// <summary>
  966. /// 某人对你这个能力点的学习评价的的评语记录的Id集合。
  967. /// </summary>
  968. public string reply { get; set; }
  969. }
  970. // /// <summary>
  971. // /// 撤消作业
  972. // /// </summary>
  973. // /// <param name="request"></param>
  974. // /// <returns></returns>
  975. // [ProducesDefaultResponseType]
  976. // [HttpPost("cancel")]
  977. // public async Task<IActionResult> Cancel(JsonElement requert)
  978. // {
  979. // /* if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
  980. // //if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  981. // var jwt = new JwtSecurityToken(id_token.GetString());
  982. // if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
  983. // var id = jwt.Payload.Sub;
  984. // //var id = "03245d02-71ba-4e44-97dd-1e66c91bff6c";
  985. // //if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  986. // var client = _azureCosmos.GetCosmosClient();
  987. // //權限token
  988. // *//* jwt.Payload.TryGetValue("name", out object name);
  989. // jwt.Payload.TryGetValue("picture", out object picture);*//*
  990. // var response = await client.GetContainer("TEAMModelOSTemp", "Teacher").ReadItemStreamAsync(id, new PartitionKey($"Homework-{id_token}"));
  991. // if (response.Status == 200)
  992. // {
  993. // using var json = await JsonDocument.ParseAsync(response.ContentStream);
  994. // int status = json.RootElement.GetProperty("status").GetInt32();
  995. // }
  996. // return Ok();*/
  997. // ResponseBuilder builder = ResponseBuilder.custom();
  998. // requert.TryGetProperty("id", out JsonElement homeWorkId);
  999. // List<Homework> homeWorks = await _azureCosmos.FindByDict<Homework>(new Dictionary<string, object> { { "id", homeWorkId.ToString() } });
  1000. // foreach (Homework homeWork in homeWorks)
  1001. // {
  1002. // homeWork.status = 100;
  1003. // }
  1004. // List<Homework> homeWorks1 = await _azureCosmos.UpdateAll<Homework>(homeWorks);
  1005. // //查询之前是否有 关联关系表 HomeWorkStudent 有则删除
  1006. // List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", homeWorkId.ToString() } });
  1007. // if (homeWorkStudents.IsNotEmpty())
  1008. // {
  1009. // //TODO 删除上传的文件
  1010. // await _azureCosmos.DeleteAll(homeWorkStudents);
  1011. // }
  1012. // //return builder.Data(homeWorks1).build();
  1013. // return Ok(homeWorks1);
  1014. // }
  1015. // /// <summary>
  1016. // /// 删除作业
  1017. // /// </summary>
  1018. // /// <param name="request"></param>
  1019. // /// <returns></returns>
  1020. // [ProducesDefaultResponseType]
  1021. // [HttpPost("delete")]
  1022. // public async Task<IActionResult> Delete(IdPk request)
  1023. // {
  1024. // //ResponseBuilder builder = ResponseBuilder.custom();
  1025. // //IdPk idPk = await _azureCosmos.DeleteAsync<Homework>(request);
  1026. // ////按作业id删除提交记录
  1027. // //List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", idPk.id } });
  1028. // ////TODO 删除上传的文件
  1029. // //await _azureCosmos.DeleteAll<HomeworkRecord>(homeWorkStudents);
  1030. // ////return builder.Data(idPk).build();
  1031. // //return Ok(idPk);
  1032. // }
  1033. // /// <summary>
  1034. // /// 新增或修改 作业活动 同时创建关联关系表
  1035. // /// </summary>
  1036. // /// <param name="request"></param>
  1037. // /// <returns></returns>
  1038. // [ProducesDefaultResponseType]
  1039. // [HttpPost("upsert")]
  1040. // public async Task<IActionResult> Upsert(HomeworkDto request)
  1041. // {
  1042. // ResponseBuilder builder = ResponseBuilder.custom();
  1043. // //新增
  1044. // var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
  1045. // if (string.IsNullOrEmpty(homework.homeWork.id))
  1046. // {
  1047. // homework.homeWork.code = "Homework-" + id;
  1048. // homework.homeWork.id = _snowflakeId.NextId()+"";
  1049. // homework.homeWork.status = 100;
  1050. // homework.reset = true;
  1051. // homework.homeWork.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  1052. // }
  1053. // /*if (homework.homeWork.publishModel.Equals("0"))
  1054. // {
  1055. // homework.homeWork.startTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  1056. // homework.homeWork.status = 200;
  1057. // }
  1058. // else if (homework.homeWork.publishModel.Equals("1"))
  1059. // {
  1060. // //TimerWork<HomeWork>(homework.@params.homeWork.startTime,new Dictionary<string, object> { { "id", homework.@params.homeWork.id } });
  1061. // //设定开始时间
  1062. // string msgId = _snowflakeId.NextId() + "";
  1063. // long SequenceNumber = await _serviceBus.GetServiceBusClient().SendLeamMessage<Homework>(Constants.TopicName, homework.homeWork.id, homework.homeWork.code, homework.homeWork.startTime,"going", msgId);
  1064. // homework.homeWork.sequenceNumber = SequenceNumber;
  1065. // //serviceBusReviceService.ReciveMessageAsync();
  1066. // //await _serviceBus.ReciveMessageAsync<Homework>(Constants.SubName);
  1067. // //_timerWorkService.TimerWork<Homework>(homework.@params.homeWork.startTime,200, new Dictionary<string, object> { { "id", homework.@params.homeWork.id } });
  1068. // }*/
  1069. // if (homework.homeWork.status == 0) {
  1070. // if (homework.homeWork.startTime < DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()) homework.homeWork.status = 200;
  1071. // else homework.homeWork.status = 100;
  1072. // }
  1073. // Homework homeWork = await _azureCosmos.SaveOrUpdate<Homework>(homework.homeWork);
  1074. // //设定结束时间
  1075. // /*string msgEndId = _snowflakeId.NextId() + "";
  1076. // await _serviceBus.GetServiceBusClient().SendLeamMessage<Homework>(Constants.TopicName, homework.homeWork.id, homework.homeWork.code, homework.homeWork.endTime);*/
  1077. // //_timerWorkService.TimerWork<Homework>(homework.@params.homeWork.endTime, 300, new Dictionary<string, object> { { "id", homework.@params.homeWork.id } });
  1078. // //清除作业
  1079. // if (homework.reset)
  1080. // {
  1081. // //根据作业发布对象查找到每一个具体学生生成关联关系表 HomeWorkStudent
  1082. // // List<Target> targets = homework.@params.homeWork.target;
  1083. // //List<HomeworkRecord> homeWorkStudents = new List<HomeworkRecord>();
  1084. // // foreach (Target target in targets)
  1085. // // {
  1086. // //查询之前是否有 关联关系表 HomeWorkStudent 有则删除
  1087. // List<HomeworkRecord> homeWorks = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", homework.homeWork.id } });
  1088. // if (homeWorks.IsNotEmpty())
  1089. // {
  1090. // await _azureCosmos.DeleteAll(homeWorks);
  1091. // }
  1092. // //List<ClassStudent> classroom = await _cosmos.FindByDict<ClassStudent>(new Dictionary<string, object> { { "id", target.classroomCode }});
  1093. // //if (classroom.IsNotEmpty())
  1094. // //{
  1095. // // foreach (ClassStudent student in classroom)
  1096. // // {
  1097. // // HomeworkRecord homeWorkStudent = new HomeworkRecord();
  1098. // // homeWorkStudent.code = student.code;
  1099. // // homeWorkStudent.id = homework.@params.homeWork.id;
  1100. // // homeWorkStudent.classroom.code = target.classroomCode;
  1101. // // homeWorkStudent.classroom.name = target.classroomName;
  1102. // // homeWorkStudents.Add(homeWorkStudent);
  1103. // // }
  1104. // //}
  1105. // //}
  1106. // //if (homeWorkStudents.IsNotEmpty())
  1107. // //{
  1108. // // foreach (HomeworkRecord homeWorkStudents1 in homeWorkStudents)
  1109. // // {
  1110. // // List<Student> student = await _cosmos.FindById<Student>(homeWorkStudents1.code);//FindByDict<Student>(new Dictionary<string, object> { { "id", homeWorkStudents1.studentId } });
  1111. // // if (student.IsNotEmpty())
  1112. // // {
  1113. // // homeWorkStudents1.code = student[0].studentId;
  1114. // // // homeWorkStudents1.nativeroom.code = student[0].classroomCode;
  1115. // // }
  1116. // // }
  1117. // // await _cosmos.SaveOrUpdateAll<HomeworkRecord>(homeWorkStudents);
  1118. // //}
  1119. // }
  1120. // //return builder.Data(homeWork).build();
  1121. // return Ok(homeWork);
  1122. // }
  1123. // /// <summary>
  1124. // /// 新增或修改学生作业关联表
  1125. // /// </summary>
  1126. // /// <param name="request"></param>
  1127. // /// <returns></returns>
  1128. // [ProducesDefaultResponseType]
  1129. // [HttpPost("upsert-record")]
  1130. // public async Task<IActionResult> UpsertRecord(List<HomeworkRecord> request)
  1131. // {
  1132. // //ResponseBuilder builder = ResponseBuilder.custom();
  1133. // await _azureCosmos.SaveOrUpdateAll<HomeworkRecord>(request);
  1134. // //return builder.Data(request).build();
  1135. // return Ok(request);
  1136. // }
  1137. // /// <summary>
  1138. // /// 查询作业活动
  1139. // /// </summary>
  1140. // /// <param name="request"></param>
  1141. // /// <returns></returns>
  1142. // [ProducesDefaultResponseType]
  1143. // [HttpPost("find")]
  1144. // public async Task<IActionResult> Find(JsonElement request)
  1145. // {
  1146. // ResponseBuilder builder = ResponseBuilder.custom();
  1147. // List<Homework> data = new List<Homework>();
  1148. // List<HomeworkFindDto> homeWorkFindDtos = new List<HomeworkFindDto>();
  1149. // if (StringHelper.getKeyCount(request) > 0)
  1150. // {
  1151. // data = await _azureCosmos.FindByDict<Homework>(request);
  1152. // //判断作业提交信息
  1153. // if (data.IsNotEmpty())
  1154. // {
  1155. // foreach (Homework homeWork in data)
  1156. // {
  1157. // //HomeworkFindDto homeWorkFindDto = new HomeworkFindDto();
  1158. // List<string> pro = new List<string>();
  1159. // pro.Add("submit");
  1160. // List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(dict: new Dictionary<string, object> { { "id", homeWork.id } }, propertys: pro);
  1161. // int sub = 0;
  1162. // Dictionary<string, object> dict = new Dictionary<string, object>();
  1163. // dict.Add("Sum", homeWorkStudents.Count);
  1164. // dict.Add("Finish", sub);
  1165. // HomeworkFindDto homeWorkFindDto = homeWork.ToJsonString().ToObject<HomeworkFindDto>();
  1166. // homeWorkFindDto.statistics = dict;
  1167. // homeWorkFindDtos.Add(homeWorkFindDto);
  1168. // }
  1169. // }
  1170. // }
  1171. // else
  1172. // {
  1173. // ///return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
  1174. // return Ok("参数异常!");
  1175. // }
  1176. // //return builder.Data(homeWorkFindDtos).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
  1177. // return Ok(new { homeWorkFindDtos, data.Count });
  1178. // }
  1179. // /// <summary>
  1180. // /// 查询作业学生关联
  1181. // /// </summary>
  1182. // /// <param name="request"></param>
  1183. // /// <returns></returns>
  1184. // [ProducesDefaultResponseType]
  1185. // [HttpPost("find-record")]
  1186. // public async Task<IActionResult> FindRecord(JsonElement requert)
  1187. // {
  1188. // var client = _azureCosmos.GetCosmosClient();
  1189. // //if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  1190. // //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
  1191. // if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
  1192. // var jwt = new JwtSecurityToken(id_token.GetString());
  1193. // if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
  1194. // var id = jwt.Payload.Sub;
  1195. // List<object> records = new List<object>();
  1196. // var query = $"select c.id,c.classroom,c.submit, c.submitTime,c.score,c.content,c.stuCmt,c.tchCmt from c where id = {id}";
  1197. // await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"HomeworkRecord-{id}") }))
  1198. // {
  1199. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1200. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1201. // {
  1202. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  1203. // {
  1204. // records.Add(obj.ToObject<object>());
  1205. // }
  1206. // }
  1207. // }
  1208. // return Ok(new { records });
  1209. // /*ResponseBuilder builder = ResponseBuilder.custom();
  1210. // List<HomeworkRecord> data = new List<HomeworkRecord>();
  1211. // if (StringHelper.getKeyCount(request) > 0)
  1212. // {
  1213. // data = await _azureCosmos.FindByDict<HomeworkRecord>(request);
  1214. // }
  1215. // else
  1216. // {
  1217. // return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
  1218. // }
  1219. // return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  1220. // }
  1221. // /// <summary>
  1222. // /// 教师作业打分评论
  1223. // /// </summary>
  1224. // /// <param name="request"></param>
  1225. // /// <returns></returns>
  1226. // [ProducesDefaultResponseType]
  1227. // [HttpPost("tch-score")]
  1228. // public async Task<IActionResult> TchScore(HomeworkScoringDto request)
  1229. // {
  1230. // ResponseBuilder builder = ResponseBuilder.custom();
  1231. // List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "code", homework.studentId }, { "id", homework.homeWorkId } });
  1232. // HomeworkRecord data = new HomeworkRecord();
  1233. // if (homeWorkStudents.IsNotEmpty())
  1234. // {
  1235. // homeWorkStudents[0].score = homework.score ?? homeWorkStudents[0].score;
  1236. // HomeWorkComment homeWorkComment = new HomeWorkComment
  1237. // {
  1238. // comment = homework.comments,
  1239. // createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
  1240. // TEAMModelId = homework.TEAMModelId
  1241. // };
  1242. // homeWorkStudents[0].tchCmt = homeWorkComment;
  1243. // data = await _azureCosmos.SaveOrUpdate(homeWorkStudents[0]);
  1244. // }
  1245. // //return builder.Data(data).build();
  1246. // return Ok(data);
  1247. // }
  1248. // /// <summary>
  1249. // /// 学生作业打分评论
  1250. // /// </summary>
  1251. // /// <param name="request"></param>
  1252. // /// <returns></returns>
  1253. // [ProducesDefaultResponseType]
  1254. // [HttpPost("stu-score")]
  1255. // public async Task<IActionResult> StuScore(HomeworkCommentDto request)
  1256. // {
  1257. // ResponseBuilder builder = ResponseBuilder.custom();
  1258. // List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "code", homework.studentId }, { "id", homework.homeWorkId } });
  1259. // List<Homework> homeWorks = await _azureCosmos.FindByDict<Homework>(new Dictionary<string, object> { { "id", homework.homeWorkId } });
  1260. // HomeworkRecord data = new HomeworkRecord();
  1261. // if (homeWorks.IsNotEmpty() && homeWorks[0].other.Contains("comment"))
  1262. // {
  1263. // if (homeWorkStudents.IsNotEmpty())
  1264. // {
  1265. // if (string.IsNullOrEmpty(homework.commentid))
  1266. // {
  1267. // //评论
  1268. // StudentComment homeWorkComment = new StudentComment
  1269. // {
  1270. // commentid = _snowflakeId.NextId() + "",
  1271. // comment = homework.comment,
  1272. // createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
  1273. // fromId = homework.fromId,
  1274. // score = homework.score
  1275. // };
  1276. // homeWorkStudents[0].stuCmt.Add(homeWorkComment);
  1277. // }
  1278. // else
  1279. // {
  1280. // //回复评论
  1281. // foreach (StudentComment comment in homeWorkStudents[0].stuCmt)
  1282. // {
  1283. // if (comment.commentid == homework.commentid)
  1284. // {
  1285. // Reply reply = new Reply();
  1286. // reply.fromId = homework.fromId;
  1287. // reply.toId = homework.toId;
  1288. // reply.identity = homework.identity;
  1289. // reply.comment = homework.comment;
  1290. // reply.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  1291. // comment.reply.Add(reply);
  1292. // }
  1293. // }
  1294. // }
  1295. // data = await _azureCosmos.Update(homeWorkStudents[0]);
  1296. // }
  1297. // //return builder.Data(data).build();
  1298. // return Ok(data);
  1299. // }
  1300. // else {
  1301. // //return builder.Error(ResponseCode.FAILED, "未开放互评!").build();
  1302. // return Ok("未开放互评!");
  1303. // }
  1304. // }
  1305. }
  1306. }