HomeworkController.cs 76 KB

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