HomeworkController.cs 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084
  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. using Microsoft.AspNetCore.Authorization;
  25. namespace TEAMModelOS.Controllers.Learn
  26. {
  27. // TODO 代码优化
  28. /// <summary>
  29. /// 作业活动
  30. /// </summary>
  31. ///
  32. [ProducesResponseType(StatusCodes.Status200OK)]
  33. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  34. [Route("common/homework")]
  35. [ApiController]
  36. public class HomeworkController : ControllerBase
  37. {
  38. private readonly AzureRedisFactory _azureRedis;
  39. private readonly AzureCosmosFactory _azureCosmos;
  40. private readonly SnowflakeId _snowflakeId;
  41. private readonly AzureServiceBusFactory _serviceBus;
  42. private readonly DingDing _dingDing;
  43. private readonly Option _option;
  44. private readonly AzureStorageFactory _azureStorage;
  45. private readonly IHttpClientFactory _clientFactory;
  46. private readonly CoreAPIHttpService _coreAPIHttpService;
  47. public IConfiguration _configuration { get; set; }
  48. public HomeworkController(CoreAPIHttpService coreAPIHttpService, AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option,
  49. AzureRedisFactory azureRedis, AzureStorageFactory azureStorage, IHttpClientFactory clientFactory, IConfiguration configuration)
  50. {
  51. _snowflakeId = snowflakeId;
  52. _serviceBus = serviceBus;
  53. _azureCosmos = azureCosmos;
  54. _dingDing = dingDing;
  55. _option = option?.Value;
  56. _azureRedis = azureRedis;
  57. _azureStorage = azureStorage;
  58. _clientFactory = clientFactory;
  59. _configuration = configuration;
  60. }
  61. /// <summary>
  62. /// 新增 或 修改投票活动
  63. /// </summary>
  64. /// <param name="request"></param>
  65. /// <returns></returns>
  66. [ProducesDefaultResponseType]
  67. [HttpPost("upsert")]
  68. [Authorize(Roles = "IES")]
  69. [AuthToken(Roles = "teacher,admin", Permissions = "schoolAc-upd")]
  70. public async Task<IActionResult> Upsert(Homework homework)
  71. {
  72. try {
  73. var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
  74. var client = _azureCosmos.GetCosmosClient();
  75. homework.pk = "Homework";
  76. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  77. if (!homework.code.StartsWith("Homework-"))
  78. {
  79. homework.code = $"Homework-{homework.code}";
  80. }
  81. homework.creatorId = userid;
  82. homework.createTime = now;
  83. if (homework.startTime <= 0)
  84. {
  85. homework.startTime = now;
  86. }
  87. homework.ttl = -1;
  88. if (string.IsNullOrEmpty(homework.id))
  89. {
  90. homework.id = Guid.NewGuid().ToString();
  91. if (homework.startTime > now)
  92. {
  93. homework.progress = "pending";
  94. }
  95. else
  96. {
  97. homework.progress = "going";
  98. }
  99. homework.progress = "going";
  100. var messageBlob = new ServiceBusMessage();
  101. string blobcntr = null;
  102. if (homework.scope.Equals("school"))
  103. {
  104. blobcntr = homework.school;
  105. homework.size = await _azureStorage.GetBlobContainerClient(homework.school).GetBlobsSize($"homework/{homework.id}");
  106. messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "insert", root = $"homework/{homework.id}", name = $"{homework.school}" }.ToJsonString());
  107. }
  108. else
  109. {
  110. blobcntr = homework.creatorId;
  111. homework.size = await _azureStorage.GetBlobContainerClient(homework.creatorId).GetBlobsSize($"homework/{homework.id}");
  112. messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "insert", root = $"homework/{homework.id}", name = $"{homework.creatorId}" }.ToJsonString());
  113. }
  114. messageBlob.ApplicationProperties.Add("name", "BlobRoot");
  115. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  116. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  117. homework.recordUrl = $"/homework/{homework.id}/record.json";
  118. var cods = new { records = new List<string>(), userids = new List<string>(), question = new List<QuestionRecord>() };
  119. await _azureStorage.UploadFileByContainer(blobcntr, cods.ToJsonString(), "homework", $"{homework.id}/record.json");
  120. homework = await client.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(homework, new PartitionKey($"{homework.code}"));
  121. }
  122. else
  123. {
  124. string blobcntr = null;
  125. var response = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync(homework.id, new PartitionKey($"{homework.code}"));
  126. var messageBlob = new ServiceBusMessage();
  127. if (homework.scope.Equals("school"))
  128. {
  129. blobcntr = homework.school;
  130. homework.size = await _azureStorage.GetBlobContainerClient(homework.school).GetBlobsSize($"homework/{homework.id}");
  131. messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "update", root = $"homework/{homework.id}", name = $"{homework.school}" }.ToJsonString());
  132. }
  133. else
  134. {
  135. blobcntr = homework.creatorId;
  136. homework.size = await _azureStorage.GetBlobContainerClient(homework.creatorId).GetBlobsSize($"homework/{homework.id}");
  137. messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "update", root = $"homework/{homework.id}", name = $"{homework.creatorId}" }.ToJsonString());
  138. }
  139. messageBlob.ApplicationProperties.Add("name", "BlobRoot");
  140. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  141. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  142. if (response.Status == 200)
  143. {
  144. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  145. var info = json.ToObject<Homework>();
  146. if (info.progress.Equals("going"))
  147. {
  148. return Ok(new { v = "活动正在进行中" });
  149. }
  150. if (homework.startTime > now)
  151. {
  152. homework.progress = "pending";
  153. }
  154. else
  155. {
  156. homework.progress = "going";
  157. }
  158. homework.progress = info.progress;
  159. homework.recordUrl = $"/homework/{homework.id}/record.json";
  160. homework = await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(homework, info.id, new PartitionKey($"{info.code}"));
  161. }
  162. else
  163. {
  164. if (homework.startTime > now)
  165. {
  166. homework.progress = "pending";
  167. }
  168. else
  169. {
  170. homework.progress = "going";
  171. }
  172. homework.progress = "going";
  173. homework.recordUrl = $"/homework/{homework.id}/record.json";
  174. var cods = new { records = new List<string>(), userids = new List<string>(), question = new List<QuestionRecord>() };
  175. await _azureStorage.UploadFileByContainer(blobcntr, cods.ToJsonString(), "homework", $"{homework.id}/record.json");
  176. homework = await client.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync(homework, new PartitionKey($"{homework.code}"));
  177. }
  178. }
  179. return Ok(new { homework });
  180. } catch (CosmosException ex) {
  181. return Ok(new { error = ex.Status });
  182. }
  183. catch (Exception ex)
  184. {
  185. return Ok(new { error = 400 });
  186. }
  187. }
  188. /// <summary>
  189. /// 查询问卷调查,用于列表,编辑,查看
  190. /// </summary>
  191. /// <data>
  192. ///Survey-学校/教师编码 活动分区 !"code":"hbcn"/1606285227
  193. ///时间筛选范围开始时间 默认30天之前 ?"stime":1608274766154
  194. ///时间筛选范围结束时间 默认当前时间 ?"etime":1608274766666
  195. ///每页大小 ?"count":10/null/Undefined
  196. ///分页Token ?"continuationToken":Undefined/null/"[{\"token\":\"+RID:~omxMAP3ipcSEEwAAAAAAAA==#RT:2#TRC:20#ISV:2#IEO:65551#QCF:1#FPC:AYQTAAAAAAAAiRMAAAAAAAA=\",\"range\":{\"min\":\"\",\"max\":\"FF\"}}]"
  197. /// 当前状态 ?"progress":Undefined/null/"" 表示两种状态都要查询/ "going"/"finish" 表示查询进行中/ 或者已完成 学生端只能查询正在进行或已经结束 going 已发布|finish 已结束
  198. /// </data>
  199. /// <param name="request"></param>
  200. /// <returns></returns>
  201. [ProducesDefaultResponseType]
  202. [HttpPost("find")]
  203. [Authorize(Roles = "IES")]
  204. [AuthToken(Roles = "teacher,admin,student")]
  205. public async Task<IActionResult> Find(JsonElement request) {
  206. try
  207. {
  208. var client = _azureCosmos.GetCosmosClient();
  209. var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
  210. //必须有学校或者教师编码
  211. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  212. //开始时间,默认最近三十天
  213. var stimestamp = DateTimeOffset.UtcNow.AddDays(-30).ToUnixTimeMilliseconds();
  214. if (request.TryGetProperty("stime", out JsonElement stime))
  215. {
  216. if (long.TryParse($"{stime}", out long data))
  217. {
  218. stimestamp = data;
  219. };
  220. };
  221. //默认当前时间
  222. var etimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  223. if (request.TryGetProperty("etime", out JsonElement etime))
  224. {
  225. if (long.TryParse($"{etime}", out long data))
  226. {
  227. etimestamp = data;
  228. };
  229. };
  230. var progresssql = "";
  231. if (request.TryGetProperty("progress", out JsonElement progress))
  232. {
  233. if (!progress.ValueKind.Equals(JsonValueKind.Undefined) && !progress.ValueKind.Equals(JsonValueKind.Null) && progress.ValueKind.Equals(JsonValueKind.String))
  234. {
  235. progresssql = $" and c.progress='{progress}' ";
  236. }
  237. }
  238. string continuationToken = null;
  239. //默认不指定返回大小
  240. int? topcout = null;
  241. if (request.TryGetProperty("count", out JsonElement jcount))
  242. {
  243. if (int.TryParse($"{jcount}", out int data))
  244. {
  245. topcout = data;
  246. }
  247. };
  248. //是否需要进行分页查询,默认不分页
  249. bool iscontinuation = false;
  250. //如果指定了返回大小
  251. if (request.TryGetProperty("continuationToken", out JsonElement continuation))
  252. {
  253. //指定了cancellationToken 表示需要进行分页
  254. if (!continuation.ValueKind.Equals(JsonValueKind.Null) && !continuation.ValueKind.Equals(JsonValueKind.Undefined))
  255. {
  256. continuationToken = continuation.GetString();
  257. iscontinuation = true;
  258. }
  259. };
  260. List<Homework> homeworks = new List<Homework>();
  261. 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 ";
  262. if (string.IsNullOrEmpty(school))
  263. {
  264. query = $"{query} and c.scope='private' ";
  265. }
  266. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<Homework>(queryText: query,
  267. requestOptions: new QueryRequestOptions() { MaxItemCount = topcout, PartitionKey = new PartitionKey($"Homework-{code}") }))
  268. {
  269. if (!string.IsNullOrEmpty(school))
  270. {
  271. //只能查出相关学校的
  272. if (!item.scope.Equals("private") && !string.IsNullOrEmpty(item.school) && item.school.Equals(school))
  273. {
  274. homeworks.Add(item);
  275. }
  276. //和自己私人发布的
  277. if (item.scope.Equals("private"))
  278. {
  279. homeworks.Add(item);
  280. }
  281. }
  282. else
  283. {
  284. homeworks.Add(item);
  285. }
  286. }
  287. return Ok(new { homeworks });
  288. }
  289. catch (CosmosException ex)
  290. {
  291. return Ok(new { error = ex.Status });
  292. }
  293. catch (Exception ex) {
  294. return Ok(new { error = 400 });
  295. }
  296. }
  297. ///<summary>
  298. /// 查询问卷调查,用于创建者列表,编辑,查看,作答人员查看
  299. /// </summary>
  300. /// <data>
  301. /// ! "id":"3c075347-75ef-4bcb-ae03-68678d02d5ef",
  302. /// ! "code":"Survey-hbcn"/"code":"Survey-1606285227"
  303. /// </data>
  304. /// <param name="request"></param>
  305. /// <returns></returns>
  306. [ProducesDefaultResponseType]
  307. [Authorize(Roles = "IES")]
  308. [HttpPost("find-id")]
  309. [AuthToken(Roles = "teacher,admin,student", Permissions = "schoolAc-read,schoolAc-upd")]
  310. public async Task<IActionResult> FindById(JsonElement request) {
  311. Homework work = null;
  312. var client = _azureCosmos.GetCosmosClient();
  313. var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
  314. //活动id
  315. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  316. //活动分区
  317. if (!request.TryGetProperty("code", out JsonElement _code)) return BadRequest();
  318. try
  319. {
  320. work = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Homework>(id.GetString(), new PartitionKey($"Homework-{_code}"));
  321. return Ok(new { work, status = 200 });
  322. }
  323. catch (CosmosException ex)
  324. {
  325. return Ok(new { homework = work, status = 404 });
  326. }
  327. catch (Exception ex)
  328. {
  329. await _dingDing.SendBotMsg($"OS,{_option.Location},common/survey/find-id\n{ex.Message}{ex.StackTrace}\n{id}\n{_code} ", GroupNames.醍摩豆服務運維群組);
  330. return Ok(new { work, status = 404 });
  331. }
  332. }
  333. /// <summary>
  334. /// 删除问卷调查 TODO 使用ttl删除,并处理相关事务逻辑
  335. /// </summary>
  336. /// <param name="request"></param>
  337. /// <returns></returns>
  338. [ProducesDefaultResponseType]
  339. [HttpPost("delete")]
  340. [Authorize(Roles = "IES")]
  341. [AuthToken(Roles = "teacher,admin", Permissions = "schoolAc-upd")]
  342. public async Task<IActionResult> Delete(JsonElement request) {
  343. try {
  344. var client = _azureCosmos.GetCosmosClient();
  345. var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
  346. if (!request.TryGetProperty("id", out JsonElement _id)) return BadRequest();
  347. if (!request.TryGetProperty("code", out JsonElement __code)) return BadRequest();
  348. Homework homeworkd = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Homework>(_id.GetString(), new PartitionKey($"Homework-{__code}"));
  349. bool flag = false;
  350. //必须是本人或者这个学校的管理者才能删除
  351. if (homeworkd.creatorId == userid)
  352. {
  353. flag = true;
  354. }
  355. else
  356. {
  357. if (homeworkd.scope.Equals("school") && homeworkd.school.Equals(school))
  358. {
  359. flag = true;
  360. }
  361. }
  362. if (flag)
  363. {
  364. //使用ttl删除,并处理相关事务逻辑
  365. homeworkd.ttl = 1;
  366. homeworkd.status = 404;
  367. homeworkd = await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(homeworkd, homeworkd.id, new PartitionKey($"{homeworkd.code}"));
  368. //删除blob 相关资料
  369. await _azureStorage.GetBlobServiceClient().DeleteBlobs(_dingDing, $"{__code}".Replace("Homework-", ""), new List<string> { Path.Combine("homework", homeworkd.id) + "/" });
  370. //通知删除信息
  371. var messageBlob = new ServiceBusMessage(new { id = Guid.NewGuid().ToString(), progress = "delete", root = $"homework/{homeworkd.id}", name = $"{__code}" }.ToJsonString());
  372. messageBlob.ApplicationProperties.Add("name", "BlobRoot");
  373. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  374. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  375. await _dingDing.SendBotMsg($"{_option.Location}-作业活动【{homeworkd.name}-{homeworkd.id}】被删除", GroupNames.成都开发測試群組);
  376. return Ok(new { flag });
  377. }
  378. else
  379. {
  380. return Ok(new { flag });
  381. }
  382. } catch (CosmosException ex) {
  383. return Ok(new { flag = false, error = 404 });
  384. }
  385. }
  386. public class TypeUser {
  387. public string userid { get; set; }
  388. public string userType { get; set; }
  389. public string userSchool { get; set; }
  390. public string username { get; set; }
  391. public List<TypeUserClass> classes { get; set; } = new List<TypeUserClass>();
  392. }
  393. public class TypeUserClass
  394. {
  395. public string id { get; set; }
  396. public string name { get; set; }
  397. }
  398. public class HomeworkUser
  399. {
  400. public string userid { get; set; }
  401. public string userType { get; set; }
  402. public string userSchool { get; set; }
  403. public long submitTime { get; set; }
  404. public double score { get; set; } = -1;
  405. public double star { get; set; } = -1;
  406. public double teacherStar { get; set; } = -1;
  407. public bool submit { get; set; }
  408. public string username { get; set; }
  409. public List<TypeUserClass> classes { get; set; } = new List<TypeUserClass>();
  410. public List<string> replies { get; set; } = new List<string>();
  411. public List<Attachment> content { get; set; } = new List<Attachment>();
  412. }
  413. /// <summary>
  414. /// 互动
  415. /// </summary>
  416. /// <param name="request"></param>
  417. /// <returns></returns>
  418. [ProducesDefaultResponseType]
  419. [HttpPost("interact")]
  420. [AuthToken(Roles = "teacher,student,admin")]
  421. public async Task<IActionResult> Interact(JsonElement request)
  422. {
  423. if (!HttpContext.Items.TryGetValue("Standard", out object standard)) return BadRequest();
  424. if (!HttpContext.Items.TryGetValue("Scope", out object _scope)) return BadRequest();
  425. var client = _azureCosmos.GetCosmosClient();
  426. var (userid, name, _, school) = HttpContext.GetAuthTokenInfo();
  427. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  428. if (!request.TryGetProperty("opt", out JsonElement _opt)) return BadRequest();
  429. if (!request.TryGetProperty("id", out JsonElement _id)) return BadRequest();
  430. if (!request.TryGetProperty("code", out JsonElement __code)) return BadRequest();
  431. // if (!request.TryGetProperty("teacher", out JsonElement _teacher)) return BadRequest();
  432. if (!request.TryGetProperty("targetType", out JsonElement _targetType)) return BadRequest();
  433. string tbname = "Student";
  434. if ($"{_targetType}".Equals("research", StringComparison.OrdinalIgnoreCase)|| $"{_targetType}".Equals("yxtrain", StringComparison.OrdinalIgnoreCase))
  435. {
  436. tbname = "Teacher";
  437. }
  438. else if ($"{_targetType}".Equals("student", StringComparison.OrdinalIgnoreCase))
  439. {
  440. tbname = "Student";
  441. }
  442. try
  443. {
  444. Homework homework = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemAsync<Homework>($"{_id}", new PartitionKey($"Homework-{__code}"));
  445. string teacher = homework.creatorId;
  446. switch (true)
  447. { //作答记录
  448. case bool when $"{_opt}".Equals("AnswerRecordAll", StringComparison.OrdinalIgnoreCase):
  449. try
  450. { // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  451. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  452. // if (!request.TryGetProperty("typeUsers", out JsonElement _typeUsers)) return BadRequest();
  453. if (!request.TryGetProperty("listIds", out JsonElement _listIds)) return BadRequest();
  454. List<string> listIds = _listIds.ToJsonString().ToObject<List<string>>();
  455. List<TypeUser> typeUsers = new List<TypeUser>();
  456. (List<RMember> tmdinfos, List<RGroupList> classInfo) = await GroupListService.GetStutmdidListids(_coreAPIHttpService,client, _dingDing, listIds, homework.school);
  457. var addStudentsCls = tmdinfos.FindAll(x => x.type == 2);
  458. var addTmdidsCls = tmdinfos.FindAll(x => x.type == 1);
  459. if ($"{_targetType}".Equals("research", StringComparison.OrdinalIgnoreCase) || $"{_targetType}".Equals("yxtrain", StringComparison.OrdinalIgnoreCase))
  460. {
  461. if (tmdinfos.IsNotEmpty())
  462. {
  463. tmdinfos.ForEach(x => {
  464. var clases = classInfo.Where(y => y.members.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. }
  469. else {
  470. if (addTmdidsCls.IsNotEmpty())
  471. {
  472. addTmdidsCls.ForEach(x => {
  473. var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
  474. typeUsers.Add(new TypeUser() { userid = x.id, userType = "tmdid", username = x.name, classes = clases.Select(x => new TypeUserClass { id = x.id, name = x.name }).ToList() });
  475. });
  476. }
  477. if (addStudentsCls.IsNotEmpty())
  478. {
  479. addStudentsCls.ForEach(x => {
  480. var clases = classInfo.Where(y => y.members.Select(z => z.id).Contains(x.id)).ToList();
  481. 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() });
  482. });
  483. }
  484. }
  485. List<dynamic> rscs = new List<dynamic>();
  486. string debateCode = "";
  487. string debateTbname = "";
  488. if (homework.scope.Equals("school"))
  489. {
  490. debateTbname = "School";
  491. debateCode = $"Debate-{homework.school}";
  492. }
  493. else
  494. {
  495. debateTbname = "Teacher";
  496. debateCode = $"Debate-{homework.creatorId}";
  497. }
  498. List<Debate> debates = new List<Debate>();
  499. string sql = $"select value(c) from c where c.comid='{_id}'";
  500. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, debateTbname).GetItemQueryIterator<Debate>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(debateCode) }))
  501. {
  502. debates.Add(item);
  503. }
  504. List<HomeworkUser> users = new List<HomeworkUser>();
  505. foreach (var typeuser in typeUsers) {
  506. var us = users.Find(x => x.userid.Equals(typeuser.userid));
  507. if (us != null) { continue; }
  508. HomeworkUser user = new HomeworkUser() { userid = typeuser.userid, userSchool = typeuser.userSchool, userType = typeuser.userType, username = typeuser.username, classes = typeuser.classes };
  509. string partition = $"HomeworkRecord-{typeuser.userid}";
  510. if (typeuser.userType.Equals("student"))
  511. {
  512. partition = $"HomeworkRecord-{typeuser.userSchool}-{typeuser.userid}";
  513. }
  514. else
  515. {
  516. partition = $"HomeworkRecord-{typeuser.userid}";
  517. }
  518. HomeworkRecord record = null;
  519. try
  520. {
  521. record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(partition));
  522. double star = -1;
  523. List<double> stars = record.comments.Select(x => x.star).ToList();
  524. if (stars.IsNotEmpty())
  525. {
  526. star = stars.Sum() / stars.Count;
  527. }
  528. user.submit = true;
  529. user.star = star;
  530. user.score = record.score;
  531. user.submitTime = record.time;
  532. user.content = record.content;
  533. // user.username = typeuser.username;
  534. var teacherComment = record.comments.Where(x => x.identity.Equals("teacher") && record.teacher.Equals(userid)).FirstOrDefault();
  535. if (teacherComment != null)
  536. {
  537. user.teacherStar = teacherComment.star;
  538. List<string> replies = new List<string>();
  539. teacherComment.replyIds.ForEach(x => {
  540. var reply = debates.SelectMany(x => x.replies).ToList().Find(r => r.id.Equals(x));
  541. if (reply != null)
  542. {
  543. replies.Add(reply.comment);
  544. }
  545. });
  546. user.replies = replies;
  547. }
  548. }
  549. catch (CosmosException ex)
  550. {
  551. user.submit = false;
  552. record = null;
  553. }
  554. users.Add(user);
  555. }
  556. return Ok(new { users });
  557. }
  558. catch (CosmosException ex)
  559. {
  560. return Ok(new { error = 404 });
  561. }
  562. //作答记录
  563. case bool when $"{_opt}".Equals("AnswerRecord", StringComparison.OrdinalIgnoreCase):
  564. try
  565. { // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  566. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  567. if (!request.TryGetProperty("userid", out JsonElement _userid)) return BadRequest();
  568. if (!request.TryGetProperty("userType", out JsonElement _userType)) return BadRequest();
  569. string partition = $"HomeworkRecord-{_userid}";
  570. if ($"{_userType}".Equals("student"))
  571. {
  572. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  573. partition = $"HomeworkRecord-{_userSchool}-{_userid}";
  574. }
  575. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(partition));
  576. return Ok(new { record });
  577. }
  578. catch (CosmosException ex) {
  579. return Ok(new { error = 404 });
  580. }
  581. //提交答案
  582. case bool when $"{_opt}".Equals("SubmitAnswer", StringComparison.OrdinalIgnoreCase):
  583. if (!request.TryGetProperty("content", out JsonElement _content)) return BadRequest();
  584. request.TryGetProperty("answer", out JsonElement _answer);
  585. string partitionKey = $"HomeworkRecord-{userid}";
  586. if ($"{_scope}".Equals(Constant.ScopeStudent))
  587. {
  588. partitionKey = $"HomeworkRecord-{school}-{userid}";
  589. }
  590. List<Attachment> content = _content.ToObject<List<Attachment>>();
  591. int taskStatus = -1;
  592. byte msgid = 0;
  593. if (content != null)
  594. {
  595. bool falge = true;
  596. if (homework.leaderSubmit == 1 && content.Exists(x => x.prime == true))
  597. {
  598. List<RGroupList> yxtrain = await GroupListService.GetGroupListMemberByType(_coreAPIHttpService,client, "yxtrain", new List<string> { "school" }, $"{school}", _dingDing);
  599. var members = yxtrain.SelectMany(x => x.members).ToList();
  600. var leader = members.Find(x => x.tag!=null && x.id.Equals(userid) && x.tag.Equals("leader"));
  601. if (leader != null && !string.IsNullOrEmpty(leader.groupName))
  602. {
  603. falge = false;
  604. var our = members.ToList().FindAll(x =>x.groupName!=null && x.groupName.Equals(leader.groupName));
  605. foreach (var one in our) {
  606. string pk = $"HomeworkRecord-{one.id}";
  607. try
  608. {
  609. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(pk));
  610. record.content = content;
  611. record.answer = $"{_answer}";
  612. record.submitCount += 1;
  613. record.time = now;
  614. await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<HomeworkRecord>(record, $"{_id}", new PartitionKey(pk));
  615. taskStatus = 1;
  616. msgid = 1;
  617. }
  618. catch (CosmosException ex)
  619. {
  620. if (ex.Status == 404)
  621. {
  622. HomeworkRecord record = new HomeworkRecord
  623. {
  624. teacher = $"{teacher}",
  625. school = school,
  626. id = $"{_id}",
  627. code = pk,
  628. content = content,
  629. answer = $"{_answer}",
  630. pk = "HomeworkRecord",
  631. ttl = -1,
  632. time = now,
  633. submitCount = 1,
  634. comid = Guid.NewGuid().ToString()
  635. };
  636. record = await client.GetContainer(Constant.TEAMModelOS, tbname).CreateItemAsync<HomeworkRecord>(record, new PartitionKey(pk));
  637. taskStatus = 1;
  638. msgid = 1;
  639. }
  640. }
  641. //TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO 写入方便教师查看的作答记录
  642. try
  643. {
  644. StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<StuActivity>($"{_id}", new PartitionKey($"Activity-{one.id}"));
  645. activity.taskStatus = taskStatus;
  646. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<StuActivity>(activity, $"{_id}", new PartitionKey($"Activity-{one.id}"));
  647. }
  648. catch (CosmosException ex)
  649. {
  650. }
  651. await StatisticsService.SendServiceBus( ($"{standard}", new List<string> { $"{one.id}" }, $"{school}", new List<string>() { StatisticsService.OfflineRecord },0) , _configuration, _serviceBus, client);
  652. }
  653. }
  654. }
  655. if (falge) {
  656. try
  657. {
  658. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(partitionKey));
  659. record.content = content;
  660. record.answer = $"{_answer}";
  661. record.submitCount += 1;
  662. record.time = now;
  663. await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<HomeworkRecord>(record, $"{_id}", new PartitionKey(partitionKey));
  664. taskStatus = 1;
  665. msgid = 1;
  666. }
  667. catch (CosmosException ex)
  668. {
  669. if (ex.Status == 404)
  670. {
  671. HomeworkRecord record = new HomeworkRecord
  672. {
  673. teacher = $"{teacher}",
  674. school = school,
  675. id = $"{_id}",
  676. code = partitionKey,
  677. content = content,
  678. answer = $"{_answer}",
  679. pk = "HomeworkRecord",
  680. ttl = -1,
  681. time = now,
  682. submitCount = 1,
  683. comid = Guid.NewGuid().ToString()
  684. };
  685. record = await client.GetContainer(Constant.TEAMModelOS, tbname).CreateItemAsync<HomeworkRecord>(record, new PartitionKey(partitionKey));
  686. taskStatus = 1;
  687. msgid = 1;
  688. }
  689. }
  690. //TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO 写入方便教师查看的作答记录
  691. try
  692. {
  693. if ($"{_scope}".Equals(Constant.ScopeStudent))
  694. {
  695. StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>($"{_id}", new PartitionKey($"Activity-{school}-{userid}"));
  696. activity.taskStatus = taskStatus;
  697. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, $"{_id}", new PartitionKey($"Activity-{school}-{userid}"));
  698. }
  699. if ($"{_scope}".Equals(Constant.ScopeTmdUser))
  700. {
  701. StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReadItemAsync<StuActivity>($"{_id}", new PartitionKey($"Activity-{userid}"));
  702. activity.taskStatus = taskStatus;
  703. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Student").ReplaceItemAsync<StuActivity>(activity, $"{_id}", new PartitionKey($"Activity-{userid}"));
  704. }
  705. if ($"{_scope}".Equals(Constant.ScopeTeacher))
  706. {
  707. StuActivity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<StuActivity>($"{_id}", new PartitionKey($"Activity-{userid}"));
  708. activity.taskStatus = taskStatus;
  709. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<StuActivity>(activity, $"{_id}", new PartitionKey($"Activity-{userid}"));
  710. }
  711. }
  712. catch (CosmosException ex)
  713. {
  714. taskStatus = -1;
  715. }
  716. if (content.Exists(x => x.prime == true))
  717. {
  718. await StatisticsService.SendServiceBus( ($"{standard}", new List<string> { $"{userid}" }, $"{school}", new List<string>() { StatisticsService.OfflineRecord }, 0 ), _configuration, _serviceBus, client);
  719. }
  720. }
  721. return Ok(new { msgid, taskStatus });
  722. }
  723. else {
  724. return Ok(new { msgid, taskStatus ,error =400});
  725. }
  726. //评论
  727. case bool when $"{_opt}".Equals("ReadAllComment", StringComparison.OrdinalIgnoreCase):
  728. // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  729. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  730. try
  731. {
  732. if (!request.TryGetProperty("userid", out JsonElement _userid)) return BadRequest();
  733. if (!request.TryGetProperty("userType", out JsonElement __userType)) return BadRequest();
  734. string _partition = $"HomeworkRecord-{_userid}";
  735. string userSchool = school;
  736. if ($"{__userType}".Equals("student"))
  737. {
  738. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  739. userSchool = $"{_userSchool}";
  740. _partition = $"HomeworkRecord-{_userSchool}-{_userid}";
  741. }
  742. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(_partition));
  743. string debateCode = "";
  744. string debateTbname = "";
  745. if (homework.scope.Equals("school"))
  746. {
  747. debateTbname = "School";
  748. debateCode = $"Debate-{homework.school}";
  749. }
  750. else
  751. {
  752. debateTbname = "Teacher";
  753. debateCode = $"Debate-{homework.creatorId}";
  754. }
  755. Debate debate = null;
  756. try
  757. {
  758. debate = await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReadItemAsync<Debate>($"{record.comid}", new PartitionKey(debateCode));
  759. } catch (CosmosException ex) {
  760. debate = null;
  761. }
  762. double star = -1;
  763. List<double> stars = record.comments.FindAll(y => y.identity.Equals("student")).Select(x => x.star).ToList();
  764. if (stars.IsNotEmpty()) {
  765. star = stars.Sum() / stars.Count;
  766. }
  767. List<dynamic> comments = new List<dynamic>();
  768. if (debate != null) {
  769. record.comments.ForEach(y => {
  770. List<dynamic> replies = new List<dynamic>();
  771. y.replyIds.ForEach(x => {
  772. var reply = debate.replies.Find(r => r.id.Equals(x));
  773. if (reply != null)
  774. {
  775. replies.Add(new { reply.comment ,reply.time} );
  776. }
  777. });
  778. comments.Add(new
  779. {
  780. identity = y.identity,
  781. star = y.star,
  782. replies = replies,
  783. userid = y.userid,
  784. username = y.username,
  785. userType = y.userType,
  786. userSchool = userSchool
  787. });
  788. });
  789. }
  790. return Ok(new { star, comments, record });
  791. }
  792. catch (CosmosException ex) {
  793. return Ok(new { error = 404 });
  794. }
  795. case bool when $"{_opt}".Equals("CommentAndStar", StringComparison.OrdinalIgnoreCase):
  796. try
  797. {
  798. // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  799. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  800. if (!request.TryGetProperty("userid", out JsonElement __userid)) return BadRequest();
  801. if (!request.TryGetProperty("userName", out JsonElement __userName)) return BadRequest();
  802. if (!request.TryGetProperty("userType", out JsonElement __userType)) return BadRequest();
  803. if (!request.TryGetProperty("identity", out JsonElement __identity)) return BadRequest();
  804. string userSchool = school;
  805. string _partition = $"HomeworkRecord-{__userid}";
  806. if ($"{__userType}".Equals("student"))
  807. {
  808. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  809. userSchool = $"{_userSchool}";
  810. _partition = $"HomeworkRecord-{_userSchool}-{__userid}";
  811. }
  812. if (!request.TryGetProperty("comment", out JsonElement _comment)) return BadRequest();
  813. if (!request.TryGetProperty("star", out JsonElement _star)) return BadRequest();
  814. double star = -1;
  815. double.TryParse($"{_star}",out star);
  816. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(_partition));
  817. ///话题对象,id为学生的作答记录的comid ,根据scope确定, code 为Debate-{schoolId},作业活动所在的学校编码|Debate-{teacherId},作业活动所在的教师编码
  818. string debateCode = "";
  819. string debateTbname = "";
  820. if (homework.scope.Equals("school"))
  821. {
  822. debateTbname = "School";
  823. debateCode = $"Debate-{homework.school}";
  824. }
  825. else {
  826. debateTbname = "Teacher";
  827. debateCode = $"Debate-{homework.creatorId}";
  828. }
  829. string userType = $"{_scope}".Equals("student") ? "student" : "tmdid";
  830. string replyId = Guid.NewGuid().ToString();
  831. DebateReply debateReply = new DebateReply
  832. {
  833. atUserType = $"{__userType}",
  834. userType = userType,
  835. id = replyId,
  836. pid = $"{record.comid}",
  837. tmdid = userid,
  838. tmdname = name,
  839. school= $"{userSchool}",
  840. comment = $"{_comment}",
  841. atTmdid = $"{__userid}",
  842. atTmdname = $"{__userName}" ,
  843. time = now
  844. };
  845. Debate debate = null;
  846. try
  847. {
  848. debate = await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReadItemAsync<Debate>($"{record.comid}", new PartitionKey(debateCode));
  849. debate.replies.Add(debateReply);
  850. await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReplaceItemAsync<Debate>(debate,$"{record.comid}", new PartitionKey(debateCode));
  851. } catch (CosmosException ex) {
  852. debate = new Debate
  853. {
  854. userType = $"{__userType}",
  855. comid = $"{homework.id}",
  856. code = debateCode,
  857. id = $"{record.comid}",
  858. tmdid = $"{__userid}",
  859. tmdname = $"{__userName}",
  860. title = $"{__userName}-{homework.name}",
  861. time = now,
  862. comment = "",
  863. school =homework.school,
  864. replies = new List<DebateReply>() { debateReply },
  865. source = "homework",
  866. openType = 0,
  867. ttl = -1,
  868. pk = "Debate"
  869. };
  870. await client.GetContainer(Constant.TEAMModelOS, debateTbname).CreateItemAsync<Debate>(debate, new PartitionKey(debateCode));
  871. }
  872. string identity = $"{__identity}";
  873. if (string.IsNullOrEmpty(identity))
  874. {
  875. identity = "student";
  876. }
  877. HomeworkComment homeworkComment = record.comments.Find(x => x.userid.Equals(userid));
  878. if (homeworkComment != null)
  879. {
  880. homeworkComment.star = star;
  881. // homeworkComment.replyIds.Add(replyId);
  882. homeworkComment.replyIds = new List<string> { replyId };
  883. }
  884. else
  885. {
  886. homeworkComment = new HomeworkComment
  887. {
  888. star= star,
  889. identity = identity,
  890. userType = $"{_scope}".Equals("student") ? "student" : "tmdid",
  891. userid = userid,
  892. username = name,
  893. school = school,
  894. replyIds = new List<string> { replyId }
  895. };
  896. record.comments.Add(homeworkComment);
  897. }
  898. record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<HomeworkRecord>(record,$"{_id}", new PartitionKey(_partition));
  899. return Ok(new { star, userid, username=name, identity, userType, userSchool, replies = new List<string>() { $"{_comment}" } });
  900. }
  901. catch (CosmosException ex)
  902. {
  903. return Ok(new { error = 404 });
  904. }
  905. catch (Exception ex) {
  906. return BadRequest(new { error = 400 });
  907. }
  908. //打分
  909. case bool when $"{_opt}".Equals("MarkScore", StringComparison.OrdinalIgnoreCase):
  910. try
  911. {
  912. // userType 为student 时,userid 为校内账号,且userSchool 需要有学校编码。
  913. //userType 为tmdid 时,userid 为醍摩豆账号,且userSchool 可以为空。
  914. if (!request.TryGetProperty("userid", out JsonElement __userid)) return BadRequest();
  915. if (!request.TryGetProperty("userName", out JsonElement __userName)) return BadRequest();
  916. if (!request.TryGetProperty("userType", out JsonElement __userType)) return BadRequest();
  917. if (!request.TryGetProperty("identity", out JsonElement __identity)) return BadRequest();
  918. string userSchool = school;
  919. string _partition = $"HomeworkRecord-{__userid}";
  920. if ($"{__userType}".Equals("student"))
  921. {
  922. request.TryGetProperty("userSchool", out JsonElement _userSchool);
  923. userSchool = $"{_userSchool}";
  924. _partition = $"HomeworkRecord-{_userSchool}-{__userid}";
  925. }
  926. if (!request.TryGetProperty("comment", out JsonElement _comment)) return BadRequest();
  927. if (!request.TryGetProperty("star", out JsonElement _star)) return BadRequest();
  928. double star = -1;
  929. double.TryParse($"{_star}", out star);
  930. HomeworkRecord record = await client.GetContainer(Constant.TEAMModelOS, tbname).ReadItemAsync<HomeworkRecord>($"{_id}", new PartitionKey(_partition));
  931. ///话题对象,id为学生的作答记录的comid ,根据scope确定, code 为Debate-{schoolId},作业活动所在的学校编码|Debate-{teacherId},作业活动所在的教师编码
  932. string debateCode = "";
  933. string debateTbname = "";
  934. if (homework.scope.Equals("school"))
  935. {
  936. debateTbname = "School";
  937. debateCode = $"Debate-{homework.school}";
  938. }
  939. else
  940. {
  941. debateTbname = "Teacher";
  942. debateCode = $"Debate-{homework.creatorId}";
  943. }
  944. string userType = $"{_scope}".Equals("student") ? "student" : "tmdid";
  945. string replyId = Guid.NewGuid().ToString();
  946. DebateReply debateReply = new DebateReply
  947. {
  948. atUserType = $"{__userType}",
  949. userType = userType,
  950. id = replyId,
  951. pid = $"{record.comid}",
  952. tmdid = userid,
  953. tmdname = name,
  954. school = $"{userSchool}",
  955. comment = $"{_comment}",
  956. atTmdid = $"{__userid}",
  957. atTmdname = $"{__userName}",
  958. time = now
  959. };
  960. Debate debate = null;
  961. try
  962. {
  963. debate = await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReadItemAsync<Debate>($"{record.comid}", new PartitionKey(debateCode));
  964. debate.replies.Add(debateReply);
  965. await client.GetContainer(Constant.TEAMModelOS, debateTbname).ReplaceItemAsync<Debate>(debate, $"{record.comid}", new PartitionKey(debateCode));
  966. }
  967. catch (CosmosException ex)
  968. {
  969. debate = new Debate
  970. {
  971. userType = $"{__userType}",
  972. comid = $"{homework.id}",
  973. code = debateCode,
  974. id = $"{record.comid}",
  975. tmdid = $"{__userid}",
  976. tmdname = $"{__userName}",
  977. title = $"{__userName}-{homework.name}",
  978. time = now,
  979. comment = "",
  980. school = homework.school,
  981. replies = new List<DebateReply>() { debateReply },
  982. source = "homework",
  983. openType = 0,
  984. ttl = -1,
  985. pk = "Debate"
  986. };
  987. await client.GetContainer(Constant.TEAMModelOS, debateTbname).CreateItemAsync<Debate>(debate, new PartitionKey(debateCode));
  988. }
  989. string identity = $"{__identity}";
  990. if (string.IsNullOrEmpty(identity))
  991. {
  992. identity = "teacher";
  993. }
  994. HomeworkComment homeworkComment = record.comments.Find(x => x.userid.Equals(userid));
  995. if (homeworkComment != null)
  996. {
  997. homeworkComment.star = star;
  998. homeworkComment.replyIds=new List<string> { replyId };
  999. }
  1000. else
  1001. {
  1002. homeworkComment = new HomeworkComment
  1003. {
  1004. star = star,
  1005. identity = identity,
  1006. userType = $"{_scope}".Equals("student") ? "student" : "tmdid",
  1007. userid = userid,
  1008. username = name,
  1009. school = school,
  1010. replyIds = new List<string> { replyId }
  1011. };
  1012. record.comments.Add(homeworkComment);
  1013. }
  1014. if (!request.TryGetProperty("score", out JsonElement _score)) return BadRequest();
  1015. record.score = double.Parse($"{_score}");
  1016. await client.GetContainer(Constant.TEAMModelOS, tbname).ReplaceItemAsync<HomeworkRecord>(record, $"{_id}", new PartitionKey(_partition));
  1017. return Ok(new { status = true });
  1018. }
  1019. catch (CosmosException ex)
  1020. {
  1021. return Ok(new { error = 404 });
  1022. }
  1023. catch (Exception ex)
  1024. {
  1025. return BadRequest(new { error = 400 });
  1026. }
  1027. }
  1028. }
  1029. catch (CosmosException ex)
  1030. {
  1031. }
  1032. return Ok();
  1033. }
  1034. public class HomeworkReply
  1035. {
  1036. /// <summary>
  1037. /// 角色类型 成员 student 学校 teacher
  1038. /// </summary>
  1039. public string roleType { get; set; }
  1040. /// <summary>
  1041. /// 某人对你这个能力点的学习评价的的评语记录的Id集合。
  1042. /// </summary>
  1043. public string reply { get; set; }
  1044. }
  1045. }
  1046. }