HomeworkController.cs 77 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377
  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("Standard", out object standard)) return BadRequest();
  418. if (!HttpContext.Items.TryGetValue("Scope", out object _scope)) return BadRequest();
  419. var client = _azureCosmos.GetCosmosClient();
  420. var (userid, name, _, school) = HttpContext.GetAuthTokenInfo();
  421. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  422. if (!request.TryGetProperty("opt", out JsonElement _opt)) return BadRequest();
  423. if (!request.TryGetProperty("id", out JsonElement _id)) return BadRequest();
  424. if (!request.TryGetProperty("code", out JsonElement __code)) return BadRequest();
  425. // if (!request.TryGetProperty("teacher", out JsonElement _teacher)) return BadRequest();
  426. if (!request.TryGetProperty("targetType", out JsonElement _targetType)) return BadRequest();
  427. string tbname = "Student";
  428. if ($"{_targetType}".Equals("research", StringComparison.OrdinalIgnoreCase)|| $"{_targetType}".Equals("yxtrain", StringComparison.OrdinalIgnoreCase))
  429. {
  430. tbname = "Teacher";
  431. }
  432. else if ($"{_targetType}".Equals("student", StringComparison.OrdinalIgnoreCase))
  433. {
  434. tbname = "Student";
  435. }
  436. try
  437. {
  438. Homework homework = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Homework>($"{_id}", new PartitionKey($"Homework-{__code}"));
  439. string teacher = homework.creatorId;
  440. switch (true)
  441. { //作答记录
  442. case bool when $"{_opt}".Equals("AnswerRecordAll", StringComparison.OrdinalIgnoreCase):
  443. try
  444. { // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  445. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  446. // if (!request.TryGetProperty("typeUsers", out JsonElement _typeUsers)) return BadRequest();
  447. if (!request.TryGetProperty("listIds", out JsonElement _listIds)) return BadRequest();
  448. List<string> listIds = _listIds.ToJsonString().ToObject<List<string>>();
  449. List<TypeUser> typeUsers = new List<TypeUser>();
  450. (List<RMember> tmdinfos, List<RGroupList> classInfo) = await GroupListService.GetStutmdidListids(client, _dingDing, listIds, homework.school);
  451. var addStudentsCls = tmdinfos.FindAll(x => x.type == 2);
  452. var addTmdidsCls = tmdinfos.FindAll(x => x.type == 1);
  453. if ($"{_targetType}".Equals("research", StringComparison.OrdinalIgnoreCase) || $"{_targetType}".Equals("yxtrain", StringComparison.OrdinalIgnoreCase))
  454. {
  455. if (tmdinfos.IsNotEmpty())
  456. {
  457. tmdinfos.ForEach(x => {
  458. var clases= classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList() ;
  459. 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() });
  460. });
  461. }
  462. }
  463. else {
  464. if (addTmdidsCls.IsNotEmpty())
  465. {
  466. addTmdidsCls.ForEach(x => {
  467. var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
  468. 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() });
  469. });
  470. }
  471. if (addStudentsCls.IsNotEmpty())
  472. {
  473. addStudentsCls.ForEach(x => {
  474. var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
  475. 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() });
  476. });
  477. }
  478. }
  479. List<dynamic> rscs = new List<dynamic>();
  480. string debateCode = "";
  481. string debateTbname = "";
  482. if (homework.scope.Equals("school"))
  483. {
  484. debateTbname = "School";
  485. debateCode = $"Debate-{homework.school}";
  486. }
  487. else
  488. {
  489. debateTbname = "Teacher";
  490. debateCode = $"Debate-{homework.creatorId}";
  491. }
  492. List<Debate> debates = new List<Debate>();
  493. string sql = $"select value(c) from c where c.comid='{_id}'";
  494. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, debateTbname).GetItemQueryIterator<Debate>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(debateCode) }))
  495. {
  496. debates.Add(item);
  497. }
  498. List<HomeworkUser> users = new List<HomeworkUser>();
  499. foreach (var typeuser in typeUsers) {
  500. var us= users.Find(x => x.userid.Equals(typeuser.userid));
  501. if (us != null) { continue; }
  502. HomeworkUser user = new HomeworkUser() { userid=typeuser.userid,userSchool=typeuser.userSchool,userType=typeuser.userType,username=typeuser.username,classes=typeuser.classes};
  503. string partition = $"HomeworkRecord-{typeuser.userid}";
  504. if (typeuser.userType.Equals("student"))
  505. {
  506. partition = $"HomeworkRecord-{typeuser.userSchool}-{typeuser.userid}";
  507. }
  508. else
  509. {
  510. partition = $"HomeworkRecord-{typeuser.userid}";
  511. }
  512. HomeworkRecord record = null;
  513. try
  514. {
  515. record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(partition));
  516. double star = -1;
  517. List<double> stars = record.comments.Select(x => x.star).ToList();
  518. if (stars.IsNotEmpty())
  519. {
  520. star = stars.Sum() / stars.Count;
  521. }
  522. user.submit = true;
  523. user.star = star;
  524. user.score = record.score;
  525. user.submitTime = record.time;
  526. user.content = record.content;
  527. // user.username = typeuser.username;
  528. var teacherComment = record.comments.Where(x => x.identity.Equals("teacher") && record.teacher.Equals(userid)).FirstOrDefault();
  529. if (teacherComment != null)
  530. {
  531. user.teacherStar = teacherComment.star;
  532. List<string> replies = new List<string>();
  533. teacherComment.replyIds.ForEach(x => {
  534. var reply = debates.SelectMany(x => x.replies).ToList().Find(r => r.id.Equals(x));
  535. if (reply != null)
  536. {
  537. replies.Add(reply.comment);
  538. }
  539. });
  540. user.replies = replies;
  541. }
  542. }
  543. catch (CosmosException ex)
  544. {
  545. user.submit = false;
  546. record = null;
  547. }
  548. users.Add(user);
  549. }
  550. return Ok(new { users });
  551. }
  552. catch (CosmosException ex)
  553. {
  554. return Ok(new { error = 404 });
  555. }
  556. //作答记录
  557. case bool when $"{_opt}".Equals("AnswerRecord", StringComparison.OrdinalIgnoreCase):
  558. try
  559. { // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  560. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  561. if (!request.TryGetProperty("userid", out JsonElement _userid)) return BadRequest();
  562. if (!request.TryGetProperty("userType", out JsonElement _userType)) return BadRequest();
  563. string partition = $"HomeworkRecord-{_userid}";
  564. if ($"{_userType}".Equals("student"))
  565. {
  566. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  567. partition = $"HomeworkRecord-{_userSchool}-{_userid}";
  568. }
  569. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(partition));
  570. return Ok(new { record });
  571. }
  572. catch (CosmosException ex) {
  573. return Ok(new {error=404 });
  574. }
  575. //提交答案
  576. case bool when $"{_opt}".Equals("SubmitAnswer", StringComparison.OrdinalIgnoreCase):
  577. if (!request.TryGetProperty("content", out JsonElement _content)) return BadRequest();
  578. request.TryGetProperty("answer", out JsonElement _answer);
  579. string partitionKey = $"HomeworkRecord-{userid}";
  580. if ($"{_scope}".Equals(Constant.ScopeStudent))
  581. {
  582. partitionKey = $"HomeworkRecord-{school}-{userid}";
  583. }
  584. List<Attachment> content = _content.ToObject<List<Attachment>>();
  585. int taskStatus = -1;
  586. byte msgid = 0;
  587. if (content != null)
  588. {
  589. try
  590. {
  591. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(partitionKey));
  592. record.content = content;
  593. record.answer = $"{_answer}";
  594. record.submitCount += 1;
  595. await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<HomeworkRecord>(record, $"{_id}", new PartitionKey(partitionKey));
  596. taskStatus = 1;
  597. msgid = 1;
  598. }
  599. catch (CosmosException ex)
  600. {
  601. if (ex.Status == 404)
  602. {
  603. HomeworkRecord record = new HomeworkRecord
  604. {
  605. teacher = $"{teacher}",
  606. school = school,
  607. id = $"{_id}",
  608. code = partitionKey,
  609. content = content,
  610. answer = $"{_answer}",
  611. pk = "HomeworkRecord",
  612. ttl = -1,
  613. time = now,
  614. submitCount = 1,
  615. comid = Guid.NewGuid().ToString()
  616. };
  617. record = await client.GetContainer(Constant.TEAMModelOS, tbname).CreateItemAsync<HomeworkRecord>(record, new PartitionKey(partitionKey));
  618. taskStatus = 1;
  619. msgid = 1;
  620. }
  621. if (content.Exists(x => x.prime == true)) {
  622. await StatisticsService.SendServiceBus($"{standard}", $"{userid}", $"{school}", StatisticsService.TeacherClass, 1, _configuration, _serviceBus);
  623. }
  624. }
  625. //TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO 写入方便教师查看的作答记录
  626. try
  627. {
  628. if ($"{_scope}".Equals(Constant.ScopeStudent)) {
  629. StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>($"{_id}", new PartitionKey($"Activity-{school}-{userid}"));
  630. activity.taskStatus = taskStatus;
  631. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, $"{_id}", new PartitionKey($"Activity-{school}-{userid}"));
  632. }
  633. if ($"{_scope}".Equals(Constant.ScopeTmdUser))
  634. {
  635. StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>($"{_id}", new PartitionKey($"Activity-{userid}"));
  636. activity.taskStatus = taskStatus;
  637. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, $"{_id}", new PartitionKey($"Activity-{userid}"));
  638. }
  639. if ($"{_scope}".Equals(Constant.ScopeTeacher))
  640. {
  641. StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<StuActivity>($"{_id}", new PartitionKey($"Activity-{userid}"));
  642. activity.taskStatus = taskStatus;
  643. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<StuActivity>(activity, $"{_id}", new PartitionKey($"Activity-{userid}"));
  644. }
  645. }
  646. catch (CosmosException ex)
  647. {
  648. taskStatus = -1;
  649. }
  650. return Ok(new { msgid, taskStatus });
  651. }
  652. else {
  653. return Ok(new { msgid, taskStatus ,error =400});
  654. }
  655. //评论
  656. case bool when $"{_opt}".Equals("ReadAllComment", StringComparison.OrdinalIgnoreCase):
  657. // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  658. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  659. try
  660. {
  661. if (!request.TryGetProperty("userid", out JsonElement _userid)) return BadRequest();
  662. if (!request.TryGetProperty("userType", out JsonElement __userType)) return BadRequest();
  663. string _partition = $"HomeworkRecord-{_userid}";
  664. string userSchool = school;
  665. if ($"{__userType}".Equals("student"))
  666. {
  667. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  668. userSchool = $"{_userSchool}";
  669. _partition = $"HomeworkRecord-{_userSchool}-{_userid}";
  670. }
  671. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(_partition));
  672. string debateCode = "";
  673. string debateTbname = "";
  674. if (homework.scope.Equals("school"))
  675. {
  676. debateTbname = "School";
  677. debateCode = $"Debate-{homework.school}";
  678. }
  679. else
  680. {
  681. debateTbname = "Teacher";
  682. debateCode = $"Debate-{homework.creatorId}";
  683. }
  684. Debate debate = null;
  685. try
  686. {
  687. debate = await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReadItemAsync<Debate>($"{record.comid}", new PartitionKey(debateCode));
  688. } catch (CosmosException ex) {
  689. debate = null;
  690. }
  691. double star = -1;
  692. List<double> stars = record.comments.FindAll(y => y.identity.Equals("student")).Select(x => x.star).ToList();
  693. if (stars.IsNotEmpty()) {
  694. star = stars.Sum() / stars.Count;
  695. }
  696. List<dynamic> comments = new List<dynamic>();
  697. if (debate != null) {
  698. record.comments.ForEach(y => {
  699. List<dynamic> replies = new List<dynamic>();
  700. y.replyIds.ForEach(x => {
  701. var reply = debate.replies.Find(r => r.id.Equals(x));
  702. if (reply != null)
  703. {
  704. replies.Add(new { reply.comment ,reply.time} );
  705. }
  706. });
  707. comments.Add(new
  708. {
  709. identity = y.identity,
  710. star = y.star,
  711. replies = replies,
  712. userid = y.userid,
  713. username = y.username,
  714. userType = y.userType,
  715. userSchool = userSchool
  716. });
  717. });
  718. }
  719. return Ok(new { star, comments, record });
  720. }
  721. catch (CosmosException ex) {
  722. return Ok(new { error = 404 });
  723. }
  724. case bool when $"{_opt}".Equals("CommentAndStar", StringComparison.OrdinalIgnoreCase):
  725. try
  726. {
  727. // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  728. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  729. if (!request.TryGetProperty("userid", out JsonElement __userid)) return BadRequest();
  730. if (!request.TryGetProperty("userName", out JsonElement __userName)) return BadRequest();
  731. if (!request.TryGetProperty("userType", out JsonElement __userType)) return BadRequest();
  732. if (!request.TryGetProperty("identity", out JsonElement __identity)) return BadRequest();
  733. string userSchool = school;
  734. string _partition = $"HomeworkRecord-{__userid}";
  735. if ($"{__userType}".Equals("student"))
  736. {
  737. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  738. userSchool = $"{_userSchool}";
  739. _partition = $"HomeworkRecord-{_userSchool}-{__userid}";
  740. }
  741. if (!request.TryGetProperty("comment", out JsonElement _comment)) return BadRequest();
  742. if (!request.TryGetProperty("star", out JsonElement _star)) return BadRequest();
  743. double star = -1;
  744. double.TryParse($"{_star}",out star);
  745. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(_partition));
  746. ///话题对象,id为学生的作答记录的comid ,根据scope确定, code 为Debate-{schoolId},作业活动所在的学校编码|Debate-{teacherId},作业活动所在的教师编码
  747. string debateCode = "";
  748. string debateTbname = "";
  749. if (homework.scope.Equals("school"))
  750. {
  751. debateTbname = "School";
  752. debateCode = $"Debate-{homework.school}";
  753. }
  754. else {
  755. debateTbname = "Teacher";
  756. debateCode = $"Debate-{homework.creatorId}";
  757. }
  758. string userType = $"{_scope}".Equals("student") ? "student" : "tmdid";
  759. string replyId = Guid.NewGuid().ToString();
  760. DebateReply debateReply = new DebateReply
  761. {
  762. atUserType = $"{__userType}",
  763. userType = userType,
  764. id = replyId,
  765. pid = $"{record.comid}",
  766. tmdid = userid,
  767. tmdname = name,
  768. school= $"{userSchool}",
  769. comment = $"{_comment}",
  770. atTmdid = $"{__userid}",
  771. atTmdname = $"{__userName}" ,
  772. time = now
  773. };
  774. Debate debate = null;
  775. try
  776. {
  777. debate = await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReadItemAsync<Debate>($"{record.comid}", new PartitionKey(debateCode));
  778. debate.replies.Add(debateReply);
  779. await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReplaceItemAsync<Debate>(debate,$"{record.comid}", new PartitionKey(debateCode));
  780. } catch (CosmosException ex) {
  781. debate = new Debate
  782. {
  783. userType = $"{__userType}",
  784. comid = $"{homework.id}",
  785. code = debateCode,
  786. id = $"{record.comid}",
  787. tmdid = $"{__userid}",
  788. tmdname = $"{__userName}",
  789. title = $"{__userName}-{homework.name}",
  790. time = now,
  791. comment = "",
  792. school =homework.school,
  793. replies = new List<DebateReply>() { debateReply },
  794. source = "homework",
  795. openType = 0,
  796. ttl = -1,
  797. pk = "Debate"
  798. };
  799. await client.GetContainer(Constant.TEAMModelOS, debateTbname).CreateItemAsync<Debate>(debate, new PartitionKey(debateCode));
  800. }
  801. string identity = $"{__identity}";
  802. if (string.IsNullOrEmpty(identity))
  803. {
  804. identity = "student";
  805. }
  806. HomeworkComment homeworkComment = record.comments.Find(x => x.userid.Equals(userid));
  807. if (homeworkComment != null)
  808. {
  809. homeworkComment.star = star;
  810. // homeworkComment.replyIds.Add(replyId);
  811. homeworkComment.replyIds = new List<string> { replyId };
  812. }
  813. else
  814. {
  815. homeworkComment = new HomeworkComment
  816. {
  817. star= star,
  818. identity = identity,
  819. userType = $"{_scope}".Equals("student") ? "student" : "tmdid",
  820. userid = userid,
  821. username = name,
  822. school = school,
  823. replyIds = new List<string> { replyId }
  824. };
  825. record.comments.Add(homeworkComment);
  826. }
  827. record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<HomeworkRecord>(record,$"{_id}", new PartitionKey(_partition));
  828. return Ok(new { star, userid, username=name, identity, userType, userSchool, replies = new List<string>() { $"{_comment}" } });
  829. }
  830. catch (CosmosException ex)
  831. {
  832. return Ok(new { error = 404 });
  833. }
  834. catch (Exception ex) {
  835. return BadRequest(new { error = 400 });
  836. }
  837. //打分
  838. case bool when $"{_opt}".Equals("MarkScore", StringComparison.OrdinalIgnoreCase):
  839. try
  840. {
  841. // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  842. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  843. if (!request.TryGetProperty("userid", out JsonElement __userid)) return BadRequest();
  844. if (!request.TryGetProperty("userName", out JsonElement __userName)) return BadRequest();
  845. if (!request.TryGetProperty("userType", out JsonElement __userType)) return BadRequest();
  846. if (!request.TryGetProperty("identity", out JsonElement __identity)) return BadRequest();
  847. string userSchool = school;
  848. string _partition = $"HomeworkRecord-{__userid}";
  849. if ($"{__userType}".Equals("student"))
  850. {
  851. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  852. userSchool = $"{_userSchool}";
  853. _partition = $"HomeworkRecord-{_userSchool}-{__userid}";
  854. }
  855. if (!request.TryGetProperty("comment", out JsonElement _comment)) return BadRequest();
  856. if (!request.TryGetProperty("star", out JsonElement _star)) return BadRequest();
  857. double star = -1;
  858. double.TryParse($"{_star}", out star);
  859. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(_partition));
  860. ///话题对象,id为学生的作答记录的comid ,根据scope确定, code 为Debate-{schoolId},作业活动所在的学校编码|Debate-{teacherId},作业活动所在的教师编码
  861. string debateCode = "";
  862. string debateTbname = "";
  863. if (homework.scope.Equals("school"))
  864. {
  865. debateTbname = "School";
  866. debateCode = $"Debate-{homework.school}";
  867. }
  868. else
  869. {
  870. debateTbname = "Teacher";
  871. debateCode = $"Debate-{homework.creatorId}";
  872. }
  873. string userType = $"{_scope}".Equals("student") ? "student" : "tmdid";
  874. string replyId = Guid.NewGuid().ToString();
  875. DebateReply debateReply = new DebateReply
  876. {
  877. atUserType = $"{__userType}",
  878. userType = userType,
  879. id = replyId,
  880. pid = $"{record.comid}",
  881. tmdid = userid,
  882. tmdname = name,
  883. school = $"{userSchool}",
  884. comment = $"{_comment}",
  885. atTmdid = $"{__userid}",
  886. atTmdname = $"{__userName}",
  887. time = now
  888. };
  889. Debate debate = null;
  890. try
  891. {
  892. debate = await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReadItemAsync<Debate>($"{record.comid}", new PartitionKey(debateCode));
  893. debate.replies.Add(debateReply);
  894. await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReplaceItemAsync<Debate>(debate, $"{record.comid}", new PartitionKey(debateCode));
  895. }
  896. catch (CosmosException ex)
  897. {
  898. debate = new Debate
  899. {
  900. userType = $"{__userType}",
  901. comid = $"{homework.id}",
  902. code = debateCode,
  903. id = $"{record.comid}",
  904. tmdid = $"{__userid}",
  905. tmdname = $"{__userName}",
  906. title = $"{__userName}-{homework.name}",
  907. time = now,
  908. comment = "",
  909. school = homework.school,
  910. replies = new List<DebateReply>() { debateReply },
  911. source = "homework",
  912. openType = 0,
  913. ttl = -1,
  914. pk = "Debate"
  915. };
  916. await client.GetContainer(Constant.TEAMModelOS, debateTbname).CreateItemAsync<Debate>(debate, new PartitionKey(debateCode));
  917. }
  918. string identity = $"{__identity}";
  919. if (string.IsNullOrEmpty(identity))
  920. {
  921. identity = "teacher";
  922. }
  923. HomeworkComment homeworkComment = record.comments.Find(x => x.userid.Equals(userid));
  924. if (homeworkComment != null)
  925. {
  926. homeworkComment.star = star;
  927. homeworkComment.replyIds=new List<string> { replyId };
  928. }
  929. else
  930. {
  931. homeworkComment = new HomeworkComment
  932. {
  933. star = star,
  934. identity = identity,
  935. userType = $"{_scope}".Equals("student") ? "student" : "tmdid",
  936. userid = userid,
  937. username = name,
  938. school = school,
  939. replyIds = new List<string> { replyId }
  940. };
  941. record.comments.Add(homeworkComment);
  942. }
  943. if (!request.TryGetProperty("score", out JsonElement _score)) return BadRequest();
  944. record.score = double.Parse($"{_score}");
  945. await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<HomeworkRecord>(record, $"{_id}", new PartitionKey(_partition));
  946. return Ok(new { status = true });
  947. }
  948. catch (CosmosException ex)
  949. {
  950. return Ok(new { error = 404 });
  951. }
  952. catch (Exception ex)
  953. {
  954. return BadRequest(new { error = 400 });
  955. }
  956. }
  957. }
  958. catch (CosmosException ex)
  959. {
  960. }
  961. return Ok();
  962. }
  963. public class HomeworkReply
  964. {
  965. /// <summary>
  966. /// 角色类型 成员 student 学校 teacher
  967. /// </summary>
  968. public string roleType { get; set; }
  969. /// <summary>
  970. /// 某人对你这个能力点的学习评价的的评语记录的Id集合。
  971. /// </summary>
  972. public string reply { get; set; }
  973. }
  974. // /// <summary>
  975. // /// 撤消作业
  976. // /// </summary>
  977. // /// <param name="request"></param>
  978. // /// <returns></returns>
  979. // [ProducesDefaultResponseType]
  980. // [HttpPost("cancel")]
  981. // public async Task<IActionResult> Cancel(JsonElement requert)
  982. // {
  983. // /* if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
  984. // //if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  985. // var jwt = new JwtSecurityToken(id_token.GetString());
  986. // if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
  987. // var id = jwt.Payload.Sub;
  988. // //var id = "03245d02-71ba-4e44-97dd-1e66c91bff6c";
  989. // //if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  990. // var client = _azureCosmos.GetCosmosClient();
  991. // //權限token
  992. // *//* jwt.Payload.TryGetValue("name", out object name);
  993. // jwt.Payload.TryGetValue("picture", out object picture);*//*
  994. // var response = await client.GetContainer("TEAMModelOSTemp", "Teacher").ReadItemStreamAsync(id, new PartitionKey($"Homework-{id_token}"));
  995. // if (response.Status == 200)
  996. // {
  997. // using var json = await JsonDocument.ParseAsync(response.ContentStream);
  998. // int status = json.RootElement.GetProperty("status").GetInt32();
  999. // }
  1000. // return Ok();*/
  1001. // ResponseBuilder builder = ResponseBuilder.custom();
  1002. // requert.TryGetProperty("id", out JsonElement homeWorkId);
  1003. // List<Homework> homeWorks = await _azureCosmos.FindByDict<Homework>(new Dictionary<string, object> { { "id", homeWorkId.ToString() } });
  1004. // foreach (Homework homeWork in homeWorks)
  1005. // {
  1006. // homeWork.status = 100;
  1007. // }
  1008. // List<Homework> homeWorks1 = await _azureCosmos.UpdateAll<Homework>(homeWorks);
  1009. // //查询之前是否有 关联关系表 HomeWorkStudent 有则删除
  1010. // List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", homeWorkId.ToString() } });
  1011. // if (homeWorkStudents.IsNotEmpty())
  1012. // {
  1013. // //TODO 删除上传的文件
  1014. // await _azureCosmos.DeleteAll(homeWorkStudents);
  1015. // }
  1016. // //return builder.Data(homeWorks1).build();
  1017. // return Ok(homeWorks1);
  1018. // }
  1019. // /// <summary>
  1020. // /// 删除作业
  1021. // /// </summary>
  1022. // /// <param name="request"></param>
  1023. // /// <returns></returns>
  1024. // [ProducesDefaultResponseType]
  1025. // [HttpPost("delete")]
  1026. // public async Task<IActionResult> Delete(IdPk request)
  1027. // {
  1028. // //ResponseBuilder builder = ResponseBuilder.custom();
  1029. // //IdPk idPk = await _azureCosmos.DeleteAsync<Homework>(request);
  1030. // ////按作业id删除提交记录
  1031. // //List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", idPk.id } });
  1032. // ////TODO 删除上传的文件
  1033. // //await _azureCosmos.DeleteAll<HomeworkRecord>(homeWorkStudents);
  1034. // ////return builder.Data(idPk).build();
  1035. // //return Ok(idPk);
  1036. // }
  1037. // /// <summary>
  1038. // /// 新增或修改 作业活动 同时创建关联关系表
  1039. // /// </summary>
  1040. // /// <param name="request"></param>
  1041. // /// <returns></returns>
  1042. // [ProducesDefaultResponseType]
  1043. // [HttpPost("upsert")]
  1044. // public async Task<IActionResult> Upsert(HomeworkDto request)
  1045. // {
  1046. // ResponseBuilder builder = ResponseBuilder.custom();
  1047. // //新增
  1048. // var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
  1049. // if (string.IsNullOrEmpty(homework.homeWork.id))
  1050. // {
  1051. // homework.homeWork.code = "Homework-" + id;
  1052. // homework.homeWork.id = _snowflakeId.NextId()+"";
  1053. // homework.homeWork.status = 100;
  1054. // homework.reset = true;
  1055. // homework.homeWork.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  1056. // }
  1057. // /*if (homework.homeWork.publishModel.Equals("0"))
  1058. // {
  1059. // homework.homeWork.startTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  1060. // homework.homeWork.status = 200;
  1061. // }
  1062. // else if (homework.homeWork.publishModel.Equals("1"))
  1063. // {
  1064. // //TimerWork<HomeWork>(homework.@params.homeWork.startTime,new Dictionary<string, object> { { "id", homework.@params.homeWork.id } });
  1065. // //设定开始时间
  1066. // string msgId = _snowflakeId.NextId() + "";
  1067. // long SequenceNumber = await _serviceBus.GetServiceBusClient().SendLeamMessage<Homework>(Constants.TopicName, homework.homeWork.id, homework.homeWork.code, homework.homeWork.startTime,"going", msgId);
  1068. // homework.homeWork.sequenceNumber = SequenceNumber;
  1069. // //serviceBusReviceService.ReciveMessageAsync();
  1070. // //await _serviceBus.ReciveMessageAsync<Homework>(Constants.SubName);
  1071. // //_timerWorkService.TimerWork<Homework>(homework.@params.homeWork.startTime,200, new Dictionary<string, object> { { "id", homework.@params.homeWork.id } });
  1072. // }*/
  1073. // if (homework.homeWork.status == 0) {
  1074. // if (homework.homeWork.startTime < DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()) homework.homeWork.status = 200;
  1075. // else homework.homeWork.status = 100;
  1076. // }
  1077. // Homework homeWork = await _azureCosmos.SaveOrUpdate<Homework>(homework.homeWork);
  1078. // //设定结束时间
  1079. // /*string msgEndId = _snowflakeId.NextId() + "";
  1080. // await _serviceBus.GetServiceBusClient().SendLeamMessage<Homework>(Constants.TopicName, homework.homeWork.id, homework.homeWork.code, homework.homeWork.endTime);*/
  1081. // //_timerWorkService.TimerWork<Homework>(homework.@params.homeWork.endTime, 300, new Dictionary<string, object> { { "id", homework.@params.homeWork.id } });
  1082. // //清除作业
  1083. // if (homework.reset)
  1084. // {
  1085. // //根据作业发布对象查找到每一个具体学生生成关联关系表 HomeWorkStudent
  1086. // // List<Target> targets = homework.@params.homeWork.target;
  1087. // //List<HomeworkRecord> homeWorkStudents = new List<HomeworkRecord>();
  1088. // // foreach (Target target in targets)
  1089. // // {
  1090. // //查询之前是否有 关联关系表 HomeWorkStudent 有则删除
  1091. // List<HomeworkRecord> homeWorks = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "id", homework.homeWork.id } });
  1092. // if (homeWorks.IsNotEmpty())
  1093. // {
  1094. // await _azureCosmos.DeleteAll(homeWorks);
  1095. // }
  1096. // //List<ClassStudent> classroom = await _cosmos.FindByDict<ClassStudent>(new Dictionary<string, object> { { "id", target.classroomCode }});
  1097. // //if (classroom.IsNotEmpty())
  1098. // //{
  1099. // // foreach (ClassStudent student in classroom)
  1100. // // {
  1101. // // HomeworkRecord homeWorkStudent = new HomeworkRecord();
  1102. // // homeWorkStudent.code = student.code;
  1103. // // homeWorkStudent.id = homework.@params.homeWork.id;
  1104. // // homeWorkStudent.classroom.code = target.classroomCode;
  1105. // // homeWorkStudent.classroom.name = target.classroomName;
  1106. // // homeWorkStudents.Add(homeWorkStudent);
  1107. // // }
  1108. // //}
  1109. // //}
  1110. // //if (homeWorkStudents.IsNotEmpty())
  1111. // //{
  1112. // // foreach (HomeworkRecord homeWorkStudents1 in homeWorkStudents)
  1113. // // {
  1114. // // List<Student> student = await _cosmos.FindById<Student>(homeWorkStudents1.code);//FindByDict<Student>(new Dictionary<string, object> { { "id", homeWorkStudents1.studentId } });
  1115. // // if (student.IsNotEmpty())
  1116. // // {
  1117. // // homeWorkStudents1.code = student[0].studentId;
  1118. // // // homeWorkStudents1.nativeroom.code = student[0].classroomCode;
  1119. // // }
  1120. // // }
  1121. // // await _cosmos.SaveOrUpdateAll<HomeworkRecord>(homeWorkStudents);
  1122. // //}
  1123. // }
  1124. // //return builder.Data(homeWork).build();
  1125. // return Ok(homeWork);
  1126. // }
  1127. // /// <summary>
  1128. // /// 新增或修改学生作业关联表
  1129. // /// </summary>
  1130. // /// <param name="request"></param>
  1131. // /// <returns></returns>
  1132. // [ProducesDefaultResponseType]
  1133. // [HttpPost("upsert-record")]
  1134. // public async Task<IActionResult> UpsertRecord(List<HomeworkRecord> request)
  1135. // {
  1136. // //ResponseBuilder builder = ResponseBuilder.custom();
  1137. // await _azureCosmos.SaveOrUpdateAll<HomeworkRecord>(request);
  1138. // //return builder.Data(request).build();
  1139. // return Ok(request);
  1140. // }
  1141. // /// <summary>
  1142. // /// 查询作业活动
  1143. // /// </summary>
  1144. // /// <param name="request"></param>
  1145. // /// <returns></returns>
  1146. // [ProducesDefaultResponseType]
  1147. // [HttpPost("find")]
  1148. // public async Task<IActionResult> Find(JsonElement request)
  1149. // {
  1150. // ResponseBuilder builder = ResponseBuilder.custom();
  1151. // List<Homework> data = new List<Homework>();
  1152. // List<HomeworkFindDto> homeWorkFindDtos = new List<HomeworkFindDto>();
  1153. // if (StringHelper.getKeyCount(request) > 0)
  1154. // {
  1155. // data = await _azureCosmos.FindByDict<Homework>(request);
  1156. // //判断作业提交信息
  1157. // if (data.IsNotEmpty())
  1158. // {
  1159. // foreach (Homework homeWork in data)
  1160. // {
  1161. // //HomeworkFindDto homeWorkFindDto = new HomeworkFindDto();
  1162. // List<string> pro = new List<string>();
  1163. // pro.Add("submit");
  1164. // List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(dict: new Dictionary<string, object> { { "id", homeWork.id } }, propertys: pro);
  1165. // int sub = 0;
  1166. // Dictionary<string, object> dict = new Dictionary<string, object>();
  1167. // dict.Add("Sum", homeWorkStudents.Count);
  1168. // dict.Add("Finish", sub);
  1169. // HomeworkFindDto homeWorkFindDto = homeWork.ToJsonString().ToObject<HomeworkFindDto>();
  1170. // homeWorkFindDto.statistics = dict;
  1171. // homeWorkFindDtos.Add(homeWorkFindDto);
  1172. // }
  1173. // }
  1174. // }
  1175. // else
  1176. // {
  1177. // ///return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
  1178. // return Ok("参数异常!");
  1179. // }
  1180. // //return builder.Data(homeWorkFindDtos).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();
  1181. // return Ok(new { homeWorkFindDtos, data.Count });
  1182. // }
  1183. // /// <summary>
  1184. // /// 查询作业学生关联
  1185. // /// </summary>
  1186. // /// <param name="request"></param>
  1187. // /// <returns></returns>
  1188. // [ProducesDefaultResponseType]
  1189. // [HttpPost("find-record")]
  1190. // public async Task<IActionResult> FindRecord(JsonElement requert)
  1191. // {
  1192. // var client = _azureCosmos.GetCosmosClient();
  1193. // //if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  1194. // //var (id, name, picture, _) = HttpContext.GetAuthTokenInfo();
  1195. // if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
  1196. // var jwt = new JwtSecurityToken(id_token.GetString());
  1197. // if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
  1198. // var id = jwt.Payload.Sub;
  1199. // List<object> records = new List<object>();
  1200. // var query = $"select c.id,c.classroom,c.submit, c.submitTime,c.score,c.content,c.stuCmt,c.tchCmt from c where id = {id}";
  1201. // await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"HomeworkRecord-{id}") }))
  1202. // {
  1203. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1204. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1205. // {
  1206. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  1207. // {
  1208. // records.Add(obj.ToObject<object>());
  1209. // }
  1210. // }
  1211. // }
  1212. // return Ok(new { records });
  1213. // /*ResponseBuilder builder = ResponseBuilder.custom();
  1214. // List<HomeworkRecord> data = new List<HomeworkRecord>();
  1215. // if (StringHelper.getKeyCount(request) > 0)
  1216. // {
  1217. // data = await _azureCosmos.FindByDict<HomeworkRecord>(request);
  1218. // }
  1219. // else
  1220. // {
  1221. // return builder.Error(ResponseCode.PARAMS_ERROR, "参数异常!").build();
  1222. // }
  1223. // return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  1224. // }
  1225. // /// <summary>
  1226. // /// 教师作业打分评论
  1227. // /// </summary>
  1228. // /// <param name="request"></param>
  1229. // /// <returns></returns>
  1230. // [ProducesDefaultResponseType]
  1231. // [HttpPost("tch-score")]
  1232. // public async Task<IActionResult> TchScore(HomeworkScoringDto request)
  1233. // {
  1234. // ResponseBuilder builder = ResponseBuilder.custom();
  1235. // List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "code", homework.studentId }, { "id", homework.homeWorkId } });
  1236. // HomeworkRecord data = new HomeworkRecord();
  1237. // if (homeWorkStudents.IsNotEmpty())
  1238. // {
  1239. // homeWorkStudents[0].score = homework.score ?? homeWorkStudents[0].score;
  1240. // HomeWorkComment homeWorkComment = new HomeWorkComment
  1241. // {
  1242. // comment = homework.comments,
  1243. // createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
  1244. // TEAMModelId = homework.TEAMModelId
  1245. // };
  1246. // homeWorkStudents[0].tchCmt = homeWorkComment;
  1247. // data = await _azureCosmos.SaveOrUpdate(homeWorkStudents[0]);
  1248. // }
  1249. // //return builder.Data(data).build();
  1250. // return Ok(data);
  1251. // }
  1252. // /// <summary>
  1253. // /// 学生作业打分评论
  1254. // /// </summary>
  1255. // /// <param name="request"></param>
  1256. // /// <returns></returns>
  1257. // [ProducesDefaultResponseType]
  1258. // [HttpPost("stu-score")]
  1259. // public async Task<IActionResult> StuScore(HomeworkCommentDto request)
  1260. // {
  1261. // ResponseBuilder builder = ResponseBuilder.custom();
  1262. // List<HomeworkRecord> homeWorkStudents = await _azureCosmos.FindByDict<HomeworkRecord>(new Dictionary<string, object> { { "code", homework.studentId }, { "id", homework.homeWorkId } });
  1263. // List<Homework> homeWorks = await _azureCosmos.FindByDict<Homework>(new Dictionary<string, object> { { "id", homework.homeWorkId } });
  1264. // HomeworkRecord data = new HomeworkRecord();
  1265. // if (homeWorks.IsNotEmpty() && homeWorks[0].other.Contains("comment"))
  1266. // {
  1267. // if (homeWorkStudents.IsNotEmpty())
  1268. // {
  1269. // if (string.IsNullOrEmpty(homework.commentid))
  1270. // {
  1271. // //评论
  1272. // StudentComment homeWorkComment = new StudentComment
  1273. // {
  1274. // commentid = _snowflakeId.NextId() + "",
  1275. // comment = homework.comment,
  1276. // createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
  1277. // fromId = homework.fromId,
  1278. // score = homework.score
  1279. // };
  1280. // homeWorkStudents[0].stuCmt.Add(homeWorkComment);
  1281. // }
  1282. // else
  1283. // {
  1284. // //回复评论
  1285. // foreach (StudentComment comment in homeWorkStudents[0].stuCmt)
  1286. // {
  1287. // if (comment.commentid == homework.commentid)
  1288. // {
  1289. // Reply reply = new Reply();
  1290. // reply.fromId = homework.fromId;
  1291. // reply.toId = homework.toId;
  1292. // reply.identity = homework.identity;
  1293. // reply.comment = homework.comment;
  1294. // reply.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  1295. // comment.reply.Add(reply);
  1296. // }
  1297. // }
  1298. // }
  1299. // data = await _azureCosmos.Update(homeWorkStudents[0]);
  1300. // }
  1301. // //return builder.Data(data).build();
  1302. // return Ok(data);
  1303. // }
  1304. // else {
  1305. // //return builder.Error(ResponseCode.FAILED, "未开放互评!").build();
  1306. // return Ok("未开放互评!");
  1307. // }
  1308. // }
  1309. }
  1310. }