ClassAnalysisController.cs 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  1. using Azure.Cosmos;
  2. using DocumentFormat.OpenXml.Bibliography;
  3. using DocumentFormat.OpenXml.Drawing.Charts;
  4. using DocumentFormat.OpenXml.Spreadsheet;
  5. using MathNet.Numerics.LinearAlgebra.Double;
  6. using Microsoft.AspNetCore.Authorization;
  7. using Microsoft.AspNetCore.Http;
  8. using Microsoft.AspNetCore.Mvc;
  9. using Microsoft.Extensions.Configuration;
  10. using Microsoft.Extensions.Options;
  11. using OpenXmlPowerTools;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Text.Json;
  17. using System.Threading.Tasks;
  18. using TEAMModelOS.Filter;
  19. using TEAMModelOS.Models;
  20. using TEAMModelOS.SDK;
  21. using TEAMModelOS.SDK.DI;
  22. using TEAMModelOS.SDK.Extension;
  23. using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
  24. using TEAMModelOS.SDK.Models;
  25. using TEAMModelOS.SDK.Models.Cosmos.Common;
  26. namespace TEAMModelOS.Controllers.Analysis
  27. {
  28. [ProducesResponseType(StatusCodes.Status200OK)]
  29. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  30. [Route("class/analysis")]
  31. [ApiController]
  32. public class ClassAnalysisController : ControllerBase
  33. {
  34. private readonly AzureCosmosFactory _azureCosmos;
  35. private readonly SnowflakeId _snowflakeId;
  36. private readonly AzureServiceBusFactory _serviceBus;
  37. private readonly DingDing _dingDing;
  38. private readonly Option _option;
  39. private readonly AzureStorageFactory _azureStorage;
  40. private readonly CoreAPIHttpService _coreAPIHttpService;
  41. public ClassAnalysisController(CoreAPIHttpService coreAPIHttpService, AzureCosmosFactory azureCosmos, AzureServiceBusFactory serviceBus, SnowflakeId snowflakeId, DingDing dingDing,
  42. IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage)
  43. {
  44. _azureCosmos = azureCosmos;
  45. _serviceBus = serviceBus;
  46. _snowflakeId = snowflakeId;
  47. _dingDing = dingDing;
  48. _option = option?.Value;
  49. _azureStorage = azureStorage;
  50. _coreAPIHttpService = coreAPIHttpService;
  51. }
  52. /// <param name="request"></param>
  53. /// <returns></returns>
  54. [ProducesDefaultResponseType]
  55. [Authorize(Roles = "IES")]
  56. [AuthToken(Roles = "teacher,admin")]
  57. [HttpPost("analysis-recod")]
  58. public async Task<IActionResult> analysisRecod(JsonElement request)
  59. {
  60. try
  61. {
  62. //区级Id
  63. //if (!request.TryGetProperty("time", out JsonElement time)) return BadRequest();
  64. if (!request.TryGetProperty("stime", out JsonElement stime)) return BadRequest();
  65. if (!request.TryGetProperty("etime", out JsonElement etime)) return BadRequest();
  66. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  67. if (!request.TryGetProperty("periodId", out JsonElement pId)) return BadRequest();
  68. long st = stime.GetInt64();
  69. long et = etime.GetInt64();
  70. //获取当前学期所有的课程记录
  71. List<LessonRecord> records = new List<LessonRecord>();
  72. var client = _azureCosmos.GetCosmosClient();
  73. var queryClass = $"select value(c) from c where c.periodId = '{pId}'";
  74. string tId = string.Empty;
  75. if (request.TryGetProperty("tmdId", out JsonElement tmdId))
  76. {
  77. queryClass = $"select value(c) from c where c.tmdid = '{tmdId}'";
  78. tId = tmdId.GetString();
  79. }
  80. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonRecord>(queryText: queryClass, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord-{code}") }))
  81. {
  82. records.Add(item);
  83. }
  84. if (records.Count > 0)
  85. {
  86. var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(code.GetString(), new PartitionKey($"Base"));
  87. School sc = new School();
  88. if (response.Status == 200)
  89. {
  90. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  91. sc = json.ToObject<School>();
  92. }
  93. List<(string name, double count)> rc = await getRecordCount(client, records, st, et, code.GetString(), tId, pId.GetString());
  94. List<(int week, List<double> count)> tpc = await getTPCount(client, records, st, et, code.GetString(), tId, pId.GetString());
  95. List<(string name, int count)> groups = getGroupCount(records, st, et);
  96. List<(string name, int count)> grades = getGradeCount(records, st, et);
  97. List<(string name, int count)> types = getTypeCount(records, st, et);
  98. List<double> exams = await getExamTypeCount(client, st, et, code.GetString());
  99. var subs = records.GroupBy(x => x.subjectId).Select(y => new { key = y.Key, count = y.ToList().Count }).ToList();
  100. List<string> groupIds = new List<string>();
  101. List<(string name, int count)> groc = new List<(string name, int count)>();
  102. foreach (var item in groups)
  103. {
  104. List<GroupListGrp> grps = await GroupListService.GetMemberInGroupList(_coreAPIHttpService, client, _dingDing, item.name, 1, code.GetString(), new List<string> { "research" });
  105. //groupIds.Add(item.name);
  106. //List<(string name, int count)> groc = new List<(string name, int count)>();
  107. foreach (var grp in grps)
  108. {
  109. groc.Add((grp.name, item.count));
  110. }
  111. }
  112. //var gyc = groc.GroupBy(x => x.name).Select(y => new {name = y.Key, count = y.Sum(c => c.count) });
  113. //var gs = sc.period.Where(s => s.id == pId.GetString()).Select(x => x.grades);
  114. //(List<RMember> tchList, List<RGroupList> classLists) = await GroupListService.GetStutmdidListids(_coreAPIHttpService, client, _dingDing, groupIds, code.GetString(), null);
  115. var total = rc.Select(x => new { x.name, value = x.count });
  116. var trend = tpc.Select(x => new { name = x.week, value = x.count });
  117. var classify_group = groc.GroupBy(x => x.name).Select(y => new { name = y.Key, value = y.Sum(c => c.count) });
  118. var classify = grades.Select(x => new { x.name, value = x.count });
  119. var classify_type = types.Select(x => new { x.name, value = x.count });
  120. var classify_sub = subs.Select(x => new { name = x.key, value = x.count });
  121. double teachCount = records.Where(r => r.tmdid != null).Where((x, i) => records.FindIndex(z => z.tmdid == x.tmdid) == i).ToList().Count;
  122. double taskCount = records.Select(c => c.collateTaskCount).Sum();
  123. double workCount = records.Select(c => c.collateCount).Sum();
  124. double examQuizCount = records.Select(c => c.examQuizCount).Sum();
  125. double interactCount = records.Select(c => c.clientInteractionCount).Sum();
  126. //学校基本信息
  127. School scInfo = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{code}", partitionKey: new PartitionKey("Base"));
  128. var perMore = scInfo.period.Where(c => c.id.Equals(pId.GetString())).FirstOrDefault().grades;
  129. var interaction = records.Where(c => c.startTime >= stime.GetInt64() && c.startTime <= etime.GetInt64() && c.grade.Any()).GroupBy(k => int.Parse(k.grade?[0])).Select(x => new
  130. {
  131. x.Key,
  132. name = perMore[x.Key],
  133. count = x.Sum(t => t.learningCategory.interaction)
  134. });
  135. var cooperation = records.Where(c => c.startTime >= stime.GetInt64() && c.startTime <= etime.GetInt64() && c.grade.Any()).GroupBy(k => int.Parse(k.grade?[0])).Select(x => new
  136. {
  137. x.Key,
  138. name = perMore[x.Key],
  139. count = x.Sum(t => t.learningCategory.cooperation)
  140. });
  141. var task = records.Where(c => c.startTime >= stime.GetInt64() && c.startTime <= etime.GetInt64() && c.grade.Any()).GroupBy(k => int.Parse(k.grade?[0])).Select(x => new
  142. {
  143. x.Key,
  144. name = perMore[x.Key],
  145. count = x.Sum(t => t.learningCategory.task)
  146. });
  147. var exam = records.Where(c => c.startTime >= stime.GetInt64() && c.startTime <= etime.GetInt64() && c.grade.Any()).GroupBy(k => int.Parse(k.grade?[0])).Select(x => new
  148. {
  149. x.Key,
  150. name = perMore[x.Key],
  151. count = x.Sum(t => t.learningCategory.exam)
  152. });
  153. var diffential = records.Where(c => c.startTime >= stime.GetInt64() && c.startTime <= etime.GetInt64() && c.grade.Any()).GroupBy(k => int.Parse(k.grade?[0])).Select(x => new
  154. {
  155. x.Key,
  156. name = perMore[x.Key],
  157. count = x.Sum(t => t.learningCategory.diffential)
  158. });
  159. List<(string name, int? cICount, int? pCount, int? cTCount, int? eCount,int? diffCount)> tcount = new();
  160. List<(string name, int? count)> gdCount = new();
  161. perMore.ForEach(x =>
  162. {
  163. var cICount = interaction.Where(c => c.name.Equals(x, StringComparison.OrdinalIgnoreCase)).FirstOrDefault()?.count;
  164. var pCount = cooperation.Where(c => c.name.Equals(x, StringComparison.OrdinalIgnoreCase)).FirstOrDefault()?.count;
  165. var cTCount = task.Where(c => c.name.Equals(x, StringComparison.OrdinalIgnoreCase)).FirstOrDefault()?.count;
  166. var eCount = exam.Where(c => c.name.Equals(x, StringComparison.OrdinalIgnoreCase)).FirstOrDefault()?.count;
  167. var diffCount = diffential.Where(c => c.name.Equals(x, StringComparison.OrdinalIgnoreCase)).FirstOrDefault()?.count;
  168. var gradeCount = grades.Where(c => perMore[int.Parse(c.name)].Equals(x, StringComparison.OrdinalIgnoreCase)).FirstOrDefault().count;
  169. tcount.Add((x, cICount, pCount, cTCount, eCount, diffCount));
  170. gdCount.Add((x, gradeCount));
  171. });
  172. var teachingCount = tcount.Select(x => new
  173. {
  174. x.name,
  175. interaction = x.cICount == null ? 0 : x.cICount,
  176. cooperation = x.pCount == null ? 0 : x.pCount,
  177. task = x.cTCount == null ? 0 : x.cTCount,
  178. exam = x.eCount == null ? 0 : x.eCount,
  179. diffential = x.diffCount == null ? 0 : x.eCount
  180. });
  181. var classify_grade = gdCount.Select(x => new
  182. {
  183. x.name,
  184. value = x.count
  185. });
  186. return Ok(new { total, trend, classify_group, classify_grade, classify_type, classify_sub, teachCount, taskCount, workCount, examQuizCount, interactCount, exams, teachingCount });
  187. }
  188. else
  189. {
  190. return Ok(new { code = 404, msg = "暂无课程记录" });
  191. }
  192. }
  193. catch (Exception e)
  194. {
  195. await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/analysis-recod()\n{e.Message}\n{e.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
  196. return BadRequest();
  197. }
  198. }
  199. /// <param name="request"></param>
  200. /// <returns></returns>
  201. [ProducesDefaultResponseType]
  202. [Authorize(Roles = "IES")]
  203. [AuthToken(Roles = "teacher,admin")]
  204. [HttpPost("analysis-recod-teacher")]
  205. public async Task<IActionResult> analysisRecordTeacher(JsonElement request)
  206. {
  207. try
  208. {
  209. //区级Id
  210. //if (!request.TryGetProperty("time", out JsonElement time)) return BadRequest();
  211. if (!request.TryGetProperty("stime", out JsonElement stime)) return BadRequest();
  212. if (!request.TryGetProperty("etime", out JsonElement etime)) return BadRequest();
  213. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  214. //if (!request.TryGetProperty("periodId", out JsonElement pId)) return BadRequest();
  215. long st = 0;
  216. long et = 0;
  217. try
  218. {
  219. stime.TryGetInt64(out st);
  220. etime.TryGetInt64(out et);
  221. }
  222. catch (Exception e)
  223. {
  224. //await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/analysisRecordTeacher()\n{e.Message}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
  225. }
  226. /*if (null != stime.GetString() && null != etime.GetString()) {
  227. st = stime.GetInt64();
  228. et = etime.GetInt64();
  229. }*/
  230. //获取当前学期所有的课程记录
  231. List<LessonRecord> records = new List<LessonRecord>();
  232. var client = _azureCosmos.GetCosmosClient();
  233. var queryClass = $"select value(c) from c ";
  234. string tId = string.Empty;
  235. if (request.TryGetProperty("tmdId", out JsonElement tmdId))
  236. {
  237. queryClass = $"select value(c) from c where c.tmdid = '{tmdId}'";
  238. tId = tmdId.GetString();
  239. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<LessonRecord>(queryText: queryClass, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord") }))
  240. {
  241. records.Add(item);
  242. }
  243. }
  244. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonRecord>(queryText: queryClass, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord-{code}") }))
  245. {
  246. records.Add(item);
  247. }
  248. if (records.Count > 0)
  249. {
  250. List<(string name, double count)> rc = await getRecordCount(client, records, st, et, code.GetString(), tId, "");
  251. List<(int week, List<double> count)> tpc = await getTPCount(client, records, st, et, code.GetString(), tId, "");
  252. var total = rc.Select(x => new { x.name, value = x.count });
  253. var trend = tpc.Select(x => new { name = x.week, value = x.count });
  254. var max = records.Select(x => x.tScore).Max();
  255. return Ok(new { total, trend, max });
  256. }
  257. else
  258. {
  259. return Ok(new { code = 404, msg = "暂无课程记录" });
  260. }
  261. }
  262. catch (Exception e)
  263. {
  264. await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/analysisRecordTeacher()\n{e.Message}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
  265. return BadRequest();
  266. }
  267. }
  268. [ProducesDefaultResponseType]
  269. [Authorize(Roles = "IES")]
  270. [AuthToken(Roles = "teacher,admin")]
  271. [HttpPost("analysis-record-count")]
  272. public async Task<IActionResult> analysisRecordCount(JsonElement request)
  273. {
  274. try
  275. {
  276. if (!request.TryGetProperty("stime", out JsonElement stime)) return BadRequest();
  277. if (!request.TryGetProperty("etime", out JsonElement etime)) return BadRequest();
  278. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  279. if (!request.TryGetProperty("periodId", out JsonElement pId)) return BadRequest();
  280. //获取当前学期所有的课程记录
  281. List<LessonRecord> records = new();
  282. var client = _azureCosmos.GetCosmosClient();
  283. var queryClass = $"select value(c) from c where c.periodId = '{pId}' and (c.status<>404 or IS_DEFINED(c.status) = false) and c.expire <= 0 and array_length(c.groupIds)>0 ";
  284. string tId = string.Empty;
  285. if (request.TryGetProperty("tmdId", out JsonElement tmdId))
  286. {
  287. queryClass = $"select value(c) from c where c.tmdid = '{tmdId}' and c.periodId = '{pId}' and (c.status<>404 or IS_DEFINED(c.status) = false) and c.expire <= 0 and array_length(c.groupIds)>0 ";
  288. tId = tmdId.GetString();
  289. }
  290. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonRecord>(queryText: queryClass, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord-{code}") }))
  291. {
  292. records.Add(item);
  293. }
  294. //班级信息
  295. List<string> classes = await getStudentsAsync(pId.GetString(), client, "Class", "School");
  296. if (records.Count > 0)
  297. {
  298. var sTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  299. var time = DateTimeOffset.UtcNow.ToString("yyyy-MM-dd");
  300. var today = DateTimeHelper.FromUnixTimestamp(sTime);
  301. DateTime startWeek = today.AddDays(1 - Convert.ToInt32(today.DayOfWeek.ToString("d")));
  302. DateTime startMonth = today.AddDays(1 - today.Day); //本月月初
  303. var wt = DateTimeHelper.ToUnixTimestamp(startWeek);
  304. var mt = DateTimeHelper.ToUnixTimestamp(startMonth);
  305. var wwt = DateTimeOffset.FromUnixTimeMilliseconds(wt).ToString("yyyy-MM-dd");
  306. var mmt = DateTimeOffset.FromUnixTimeMilliseconds(mt).ToString("yyyy-MM-dd");
  307. string sst = string.Format("{0}{1}{2}", time, " ", "00:00:00");
  308. string wst = string.Format("{0}{1}{2}", wwt, " ", "00:00:00");
  309. string mst = string.Format("{0}{1}{2}", mmt, " ", "00:00:00");
  310. string est = string.Format("{0}{1}{2}", time, " ", "23:59:59");
  311. var tt = DateTimeOffset.Parse(sst).ToUnixTimeMilliseconds();
  312. var weekstime = DateTimeOffset.Parse(wst).ToUnixTimeMilliseconds();
  313. var monthstime = DateTimeOffset.Parse(mst).ToUnixTimeMilliseconds();
  314. var endtime = DateTimeOffset.Parse(est).ToUnixTimeMilliseconds();
  315. var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(code.GetString(), new PartitionKey($"Base"));
  316. School sc = new School();
  317. if (response.Status == 200)
  318. {
  319. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  320. sc = json.ToObject<School>();
  321. }
  322. List<(string time, double count)> counts = new()
  323. {
  324. ("total", records.Count),
  325. ("today", records.Where(c => c.startTime >= tt && c.startTime <= endtime).ToList().Count),
  326. ("week", records.Where(c => c.startTime >= weekstime && c.startTime <= endtime).ToList().Count),
  327. ("month", records.Where(c => c.startTime >= monthstime && c.startTime <= endtime).ToList().Count),
  328. ("semester", records.Where(c => c.startTime >= stime.GetInt64() && c.startTime <= etime.GetInt64()).ToList().Count)
  329. };
  330. var total = counts.Select(x => new
  331. {
  332. name = x.time,
  333. value = x.count
  334. });
  335. var tp = records.Where(c => c.tLevel == 2 && c.pLevel == 2).ToList().Count;
  336. return Ok(new { total, tp, classCount = classes?.Count });
  337. }
  338. else
  339. {
  340. return Ok(new { total = new List<string>(), tp = 0, classCount = classes?.Count });
  341. }
  342. }
  343. catch (Exception e)
  344. {
  345. await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/analysis-record-count()\n{e.Message}\n{e.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
  346. return BadRequest();
  347. }
  348. }
  349. private List<(string name, int count)> getGroupCount(List<LessonRecord> records, long stime, long etime)
  350. {
  351. List<string> groupIds = new();
  352. List<(string name, int count)> grCount = new();
  353. var subs = records.Where(r => r.startTime >= stime && r.startTime <= etime).GroupBy(x => x.tmdid).Select(y => new { key = y.Key, count = y.ToList().Count }).ToList();
  354. /*foreach (var groupId in groupIds)
  355. {
  356. var c = records.Where(r => r.groupIds.Contains(groupId)).Count();
  357. grCount.Add((groupId, c));
  358. }*/
  359. foreach (var gr in subs)
  360. {
  361. grCount.Add((gr.key, gr.count));
  362. }
  363. return grCount;
  364. }
  365. private List<(string name, int count)> getGradeCount(List<LessonRecord> records, long stime, long etime)
  366. {
  367. List<string> grades = new();
  368. List<(string name, int count)> gCount = new();
  369. foreach (var record in records)
  370. {
  371. foreach (string gId in record.grade)
  372. {
  373. if (!grades.Contains(gId) && int.Parse(gId) >= 0)
  374. {
  375. grades.Add(gId);
  376. }
  377. }
  378. }
  379. foreach (var gId in grades)
  380. {
  381. var c = records.Where(r => r.grade.Contains(gId) && r.startTime >= stime && r.startTime <= etime).Count();
  382. gCount.Add((gId, c));
  383. }
  384. return gCount;
  385. }
  386. private List<(string name, int count)> getTypeCount(List<LessonRecord> records, long stime, long etime)
  387. {
  388. List<string> tags = new();
  389. List<(string name, int count)> tyCount = new();
  390. foreach (var record in records)
  391. {
  392. foreach (string tag in record.category)
  393. {
  394. if (!tags.Contains(tag))
  395. {
  396. tags.Add(tag);
  397. }
  398. }
  399. }
  400. foreach (var tag in tags)
  401. {
  402. var c = records.Where(r => r.category.Contains(tag) && r.startTime >= stime && r.startTime <= etime).Count();
  403. tyCount.Add((tag, c));
  404. }
  405. return tyCount;
  406. }
  407. //课列趋势图
  408. private async Task<List<(int week, List<double> count)>> getTPCount(CosmosClient client, List<LessonRecord> records, long stime, long etime, string code, string tId, string periodId)
  409. {
  410. try
  411. {
  412. List<(int week, List<double>)> wks = new();
  413. var syear = DateTimeOffset.FromUnixTimeMilliseconds(stime).Year;
  414. //var eyear = DateTimeOffset.FromUnixTimeMilliseconds(etime).Year;
  415. var sday = DateTimeOffset.FromUnixTimeMilliseconds(stime).DayOfYear;
  416. //var eday = DateTimeOffset.FromUnixTimeMilliseconds(etime).DayOfYear;
  417. int dayOfweek = (int)DateTimeOffset.FromUnixTimeMilliseconds(stime).DayOfWeek;
  418. var tyear = DateTimeOffset.UtcNow.Year;
  419. //求开学年多少天
  420. int tdays = DateTimeHelper.getDays(syear);
  421. //如果跨年 求今年多少天
  422. //int pydays = DateTimeHelper.getDays(eyear);
  423. (List<LessonCount> scount, List<LessonCount> tcount) = await getCount(client, records, syear, tyear, code, tId, periodId);
  424. List<List<double>> begin = new();
  425. List<List<double>> t = new();
  426. List<List<double>> p = new();
  427. List<List<double>> pt = new();
  428. if (scount.Count > 0)
  429. {
  430. foreach (LessonCount lesson in scount)
  431. {
  432. begin.Add(lesson.beginCount);
  433. t.Add(lesson.tCount);
  434. p.Add(lesson.pCount);
  435. pt.Add(lesson.ptCount);
  436. }
  437. var bmatrix = DenseMatrix.OfColumns(begin);
  438. var tmatrix = DenseMatrix.OfColumns(t);
  439. var pmatrix = DenseMatrix.OfColumns(p);
  440. var ptmatrix = DenseMatrix.OfColumns(pt);
  441. //开学第一周周内开课
  442. if (dayOfweek == 0)
  443. {
  444. dayOfweek = 7;
  445. }
  446. //补齐第一周
  447. //var fd = dayOfweek - 1;
  448. //本周有多少天
  449. var dd = 7 - dayOfweek + 1;
  450. int startdays = tdays - sday + dayOfweek;
  451. //有几周
  452. int sweeks = startdays / 7;
  453. //余几天
  454. int rweeks = startdays % 7;
  455. if (sweeks > 0)
  456. {
  457. for (int i = 1; i <= sweeks; i++)
  458. {
  459. if (i == 1)
  460. {
  461. var bsum = bmatrix.SubMatrix(sday - 1, dd, 0, bmatrix.ColumnCount).ColumnSums().Sum();
  462. var tsum = tmatrix.SubMatrix(sday - 1, dd, 0, tmatrix.ColumnCount).ColumnSums().Sum();
  463. var psum = pmatrix.SubMatrix(sday - 1, dd, 0, pmatrix.ColumnCount).ColumnSums().Sum();
  464. var ptsum = ptmatrix.SubMatrix(sday - 1, dd, 0, ptmatrix.ColumnCount).ColumnSums().Sum();
  465. sday += dd;
  466. wks.Add((i, new List<double>() { bsum, tsum, psum, ptsum }));
  467. }
  468. else
  469. {
  470. var bsum = bmatrix.SubMatrix(sday - 1, 7, 0, bmatrix.ColumnCount).ColumnSums().Sum();
  471. var tsum = tmatrix.SubMatrix(sday - 1, 7, 0, tmatrix.ColumnCount).ColumnSums().Sum();
  472. var psum = pmatrix.SubMatrix(sday - 1, 7, 0, pmatrix.ColumnCount).ColumnSums().Sum();
  473. var ptsum = ptmatrix.SubMatrix(sday - 1, 7, 0, ptmatrix.ColumnCount).ColumnSums().Sum();
  474. sday += 7;
  475. wks.Add((i, new List<double>() { bsum, tsum, psum, ptsum }));
  476. }
  477. }
  478. }
  479. if (rweeks > 0)
  480. {
  481. var bsum = bmatrix.SubMatrix(tdays - rweeks - 1, rweeks + 1, 0, bmatrix.ColumnCount).ColumnSums().Sum();
  482. var tsum = tmatrix.SubMatrix(tdays - rweeks - 1, rweeks + 1, 0, tmatrix.ColumnCount).ColumnSums().Sum();
  483. var psum = pmatrix.SubMatrix(tdays - rweeks - 1, rweeks + 1, 0, pmatrix.ColumnCount).ColumnSums().Sum();
  484. var ptsum = ptmatrix.SubMatrix(tdays - rweeks - 1, rweeks + 1, 0, ptmatrix.ColumnCount).ColumnSums().Sum();
  485. if (tyear > syear)
  486. {
  487. var eday = DateTimeOffset.UtcNow.DayOfYear;
  488. int pydays = DateTimeHelper.getDays(tyear);
  489. List<List<double>> e_begin = new();
  490. List<List<double>> e_t = new();
  491. List<List<double>> e_p = new();
  492. List<List<double>> e_pt = new();
  493. if (tcount.Count > 0)
  494. {
  495. foreach (LessonCount lesson in tcount)
  496. {
  497. e_begin.Add(lesson.beginCount);
  498. e_t.Add(lesson.tCount);
  499. e_p.Add(lesson.pCount);
  500. e_pt.Add(lesson.ptCount);
  501. }
  502. var tbmatrix = DenseMatrix.OfColumns(e_begin);
  503. var ttmatrix = DenseMatrix.OfColumns(e_t);
  504. var tpmatrix = DenseMatrix.OfColumns(e_p);
  505. var tptmatrix = DenseMatrix.OfColumns(e_pt);
  506. int day = 7 - rweeks;
  507. //补齐新年第一周
  508. int start = eday - day;
  509. int eweeks = start / 7;
  510. int erweeks = start % 7;
  511. var tbsum = tbmatrix.SubMatrix(0, day, 0, tbmatrix.ColumnCount).ColumnSums().Sum();
  512. var ttsum = ttmatrix.SubMatrix(0, day, 0, ttmatrix.ColumnCount).ColumnSums().Sum();
  513. var tpsum = tpmatrix.SubMatrix(0, day, 0, tpmatrix.ColumnCount).ColumnSums().Sum();
  514. var tptsum = tptmatrix.SubMatrix(0, day, 0, tptmatrix.ColumnCount).ColumnSums().Sum();
  515. wks.Add((sweeks + 1, new List<double>() { bsum + tbsum, tsum + ttsum, psum + tpsum, ptsum + tptsum }));
  516. if (eweeks > 0)
  517. {
  518. for (int i = 1; i <= eweeks; i++)
  519. {
  520. var newbsum = tbmatrix.SubMatrix(day, 7, 0, tbmatrix.ColumnCount).ColumnSums().Sum();
  521. var newtsum = ttmatrix.SubMatrix(day, 7, 0, ttmatrix.ColumnCount).ColumnSums().Sum();
  522. var newpsum = tpmatrix.SubMatrix(day, 7, 0, tpmatrix.ColumnCount).ColumnSums().Sum();
  523. var newptsum = tptmatrix.SubMatrix(day, 7, 0, tptmatrix.ColumnCount).ColumnSums().Sum();
  524. day += 7;
  525. wks.Add((sweeks += 1, new List<double>() { newbsum, newtsum, newpsum, newptsum }));
  526. }
  527. }
  528. if (erweeks > 0)
  529. {
  530. var newbsum = tbmatrix.SubMatrix(eday - day - 1, erweeks, 0, tbmatrix.ColumnCount).ColumnSums().Sum();
  531. var newtsum = ttmatrix.SubMatrix(eday - day - 1, erweeks, 0, ttmatrix.ColumnCount).ColumnSums().Sum();
  532. var newpsum = tpmatrix.SubMatrix(eday - day - 1, erweeks, 0, tpmatrix.ColumnCount).ColumnSums().Sum();
  533. var newptsum = tptmatrix.SubMatrix(eday - day - 1, erweeks, 0, tptmatrix.ColumnCount).ColumnSums().Sum();
  534. wks.Add((sweeks + 1, new List<double>() { newbsum, newtsum, newpsum, newptsum }));
  535. }
  536. }
  537. }
  538. else
  539. {
  540. wks.Add((sweeks + 1, new List<double>() { bsum, tsum, psum, ptsum }));
  541. }
  542. }
  543. }
  544. return wks;
  545. }
  546. catch (Exception e)
  547. {
  548. await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/getTPCount()\n{e.Message}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
  549. return null;
  550. }
  551. }
  552. private async Task<(List<LessonCount> sc, List<LessonCount> tc)> getCount(CosmosClient client, List<LessonRecord> records, int syear, int tyear, string code, string tId, string periodId)
  553. {
  554. List<LessonCount> scount = new();
  555. List<LessonCount> tcount = new();
  556. var queryClass = $"select value(c) from c ";
  557. List<string> perId = records.Select(r => r.periodId).Distinct().ToList();
  558. if (!string.IsNullOrEmpty(tId))
  559. {
  560. queryClass = $"select value(c) from c where c.id = '{tId}'";
  561. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<LessonCount>(
  562. queryText: queryClass,
  563. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{syear}") }))
  564. {
  565. scount.Add(item);
  566. }
  567. foreach (string pId in perId)
  568. {
  569. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonCount>(
  570. queryText: queryClass,
  571. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{code}-{syear}-{pId}") }))
  572. {
  573. scount.Add(item);
  574. }
  575. }
  576. }
  577. else
  578. {
  579. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonCount>(
  580. queryText: queryClass,
  581. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{code}-{syear}-{periodId}") }))
  582. {
  583. scount.Add(item);
  584. }
  585. }
  586. if (scount.Count == 0)
  587. {
  588. int days = DateTimeHelper.getDays(syear);
  589. foreach (LessonRecord record in records)
  590. {
  591. string tbname = string.Empty;
  592. string rcode = string.Empty;
  593. if (record.scope != null && record.scope.Equals("school"))
  594. {
  595. rcode = $"LessonCount-{record.school}-{syear}-{record.periodId}";
  596. tbname = "School";
  597. }
  598. else
  599. {
  600. rcode = $"LessonCount-{syear}";
  601. tbname = "Teacher";
  602. }
  603. LessonCount count = new LessonCount
  604. {
  605. id = record.tmdid,
  606. code = rcode,
  607. ttl = -1
  608. };
  609. double[] da = new double[days];
  610. List<double> list = new(da);
  611. List<double> listT = new(da);
  612. List<double> listP = new(da);
  613. List<double> listPT = new(da);
  614. count.beginCount.AddRange(list);
  615. count.tCount.AddRange(listT);
  616. count.pCount.AddRange(listP);
  617. count.ptCount.AddRange(listPT);
  618. await client.GetContainer("TEAMModelOS", tbname).UpsertItemAsync(count, new PartitionKey(rcode));
  619. scount.Add(count);
  620. }
  621. }
  622. if (tyear > syear)
  623. {
  624. if (!string.IsNullOrEmpty(tId))
  625. {
  626. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<LessonCount>(
  627. queryText: queryClass,
  628. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{tyear}") }))
  629. {
  630. tcount.Add(item);
  631. }
  632. foreach (string pId in perId)
  633. {
  634. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonCount>(
  635. queryText: queryClass,
  636. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{code}-{tyear}-{pId}") }))
  637. {
  638. scount.Add(item);
  639. }
  640. }
  641. }
  642. else
  643. {
  644. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<LessonCount>(
  645. queryText: queryClass,
  646. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonCount-{code}-{tyear}-{periodId}") }))
  647. {
  648. tcount.Add(item);
  649. }
  650. }
  651. }
  652. return (scount, tcount);
  653. }
  654. private async Task<List<(string time, double count)>> getRecordCount(CosmosClient client, List<LessonRecord> records, long stime, long etime, string code, string tId, string periodId)
  655. {
  656. List<(string time, double count)> counts = new();
  657. counts.Add(("total", records.Where(c => c.startTime >= stime && c.startTime <= etime).ToList().Count));
  658. var syear = DateTimeOffset.FromUnixTimeMilliseconds(stime).Year;
  659. //var eyear = DateTimeOffset.FromUnixTimeMilliseconds(etime).Year;
  660. var tyear = DateTimeOffset.UtcNow.Year;
  661. var tday = DateTimeOffset.UtcNow.DayOfYear;
  662. //求今年多少天
  663. int tdays = DateTimeHelper.getDays(tyear);
  664. //如果跨年 求前年多少天
  665. int pydays = DateTimeHelper.getDays(syear);
  666. (List<LessonCount> scount, List<LessonCount> tcount) = await getCount(client, records, syear, tyear, code, tId, periodId);
  667. DenseMatrix dense = null;
  668. //var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(syear.ToString(), new PartitionKey($"ClassCount-" + code));
  669. if (tyear > syear)
  670. {
  671. if (tcount.Count > 0)
  672. {
  673. List<List<double>> be = new();
  674. foreach (var item in tcount)
  675. {
  676. be.Add(item.beginCount);
  677. }
  678. dense = DenseMatrix.OfColumns(be);
  679. }
  680. }
  681. if (scount.Count > 0)
  682. {
  683. List<List<double>> begin = new List<List<double>>();
  684. foreach (LessonCount lesson in scount)
  685. {
  686. begin.Add(lesson.beginCount);
  687. }
  688. var matrix = DenseMatrix.OfColumns(begin);
  689. //求本周
  690. int sday = (int)DateTimeOffset.UtcNow.DayOfWeek;
  691. //本月
  692. var tmonth = DateTimeOffset.UtcNow.Day;
  693. //求本学期
  694. var sdays = DateTimeOffset.FromUnixTimeMilliseconds(stime).DayOfYear;
  695. if (tyear > syear)
  696. {
  697. //今日
  698. double tcounts = dense.Row(tday - 1).Sum();
  699. counts.Add(("today", tcounts));
  700. if (sday == 0)
  701. {
  702. sday = 7;
  703. }
  704. if (tday - sday < 0)
  705. {
  706. //var tmatrix = DenseMatrix.OfColumns(scount.beginCount);
  707. //新的一年不超过7天的值
  708. double tsum = 0;
  709. if (null != dense)
  710. {
  711. tsum = dense.SubMatrix(tday, tday, 0, dense.ColumnCount).ColumnSums().Sum();
  712. }
  713. //前一年余下的值
  714. var pysum = matrix.SubMatrix(pydays - (sday - tday) - 1, sday - tday + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
  715. counts.Add(("week", tsum + pysum));
  716. }
  717. else
  718. {
  719. var subDay = dense.SubMatrix(tday - sday - 1, sday + 1, 0, dense.ColumnCount).ColumnSums().Sum();
  720. counts.Add(("week", subDay));
  721. }
  722. var subMonth = dense.SubMatrix(tday - tmonth - 1, tmonth + 1, 0, dense.ColumnCount).ColumnSums().Sum();
  723. counts.Add(("month", subMonth));
  724. //var tmatrix = DenseMatrix.OfColumns(scount.beginCount);
  725. //跨年后开始到本学期结束
  726. double endMonth = 0;
  727. if (null != dense)
  728. {
  729. endMonth = dense.SubMatrix(0, tday, 0, dense.ColumnCount).ColumnSums().Sum();
  730. }
  731. var startMonth = matrix.SubMatrix(sdays - 1, pydays - sdays, 0, matrix.ColumnCount).ColumnSums().Sum();
  732. counts.Add(("semester", endMonth + startMonth));
  733. }
  734. else
  735. {
  736. //今日
  737. double tcounts = matrix.Row(tday - 1).Sum();
  738. counts.Add(("today", tcounts));
  739. var subDay = matrix.SubMatrix(tday - sday - 1, sday + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
  740. counts.Add(("week", subDay));
  741. var subMonth = matrix.SubMatrix(tday - tmonth - 1, tmonth + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
  742. counts.Add(("month", subMonth));
  743. var allMonth = matrix.SubMatrix(sdays - 1, tday - sdays + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
  744. counts.Add(("semester", allMonth));
  745. }
  746. //求本学期
  747. //var sdays = DateTimeOffset.FromUnixTimeMilliseconds(stime).DayOfYear;
  748. //var edays = DateTimeOffset.FromUnixTimeMilliseconds(etime).DayOfYear;
  749. /* //本月
  750. var tmonth = DateTimeOffset.UtcNow.Day;
  751. var subMonth = matrix.SubMatrix(tmonth - 1, tmonth + 1, 0, matrix.ColumnCount).ColumnSums().Sum();
  752. counts.Add(("month", subMonth));*/
  753. //求今年
  754. var subYear = matrix.SubMatrix(0, tdays, 0, matrix.ColumnCount).ColumnSums().Sum();
  755. }
  756. return counts;
  757. }
  758. //取得该学校当前学期所有评测活动进行分类计算
  759. private async Task<List<double>> getExamTypeCount(CosmosClient client, long stime, long etime, string code)
  760. {
  761. List<double> counts = new List<double>();
  762. try
  763. {
  764. List<(string id, string source, string scope)> ps = new List<(string id, string source, string scope)>();
  765. var queryClass = $"select c.id,c.source,c.scope from c where c.school = '{code}' and c.pk = 'Exam' and c.startTime >= {stime} and c.endTime <= {etime}";
  766. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: queryClass))
  767. {
  768. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  769. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  770. {
  771. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  772. while (accounts.MoveNext())
  773. {
  774. JsonElement account = accounts.Current;
  775. ps.Add((account.GetProperty("id").GetString(), account.GetProperty("source").GetString(), account.GetProperty("scope").GetString()));
  776. }
  777. break;
  778. }
  779. }
  780. var sc_online = ps.Where(x => !string.IsNullOrEmpty(x.source) && x.source.Equals("0") && !string.IsNullOrEmpty(x.scope) && x.scope.Equals("school")).ToList().Count;
  781. var p_online = ps.Where(x => !string.IsNullOrEmpty(x.source) && x.source.Equals("0") && !string.IsNullOrEmpty(x.scope) && x.scope.Equals("private")).ToList().Count;
  782. var sc_class = ps.Where(x => !string.IsNullOrEmpty(x.source) && x.source.Equals("1") && !string.IsNullOrEmpty(x.scope) && x.scope.Equals("school")).ToList().Count;
  783. var p_class = ps.Where(x => !string.IsNullOrEmpty(x.source) && x.source.Equals("1") && !string.IsNullOrEmpty(x.scope) && x.scope.Equals("private")).ToList().Count;
  784. var sc_mark = ps.Where(x => !string.IsNullOrEmpty(x.source) && x.source.Equals("2") && !string.IsNullOrEmpty(x.scope) && x.scope.Equals("school")).ToList().Count;
  785. var p_mark = ps.Where(x => !string.IsNullOrEmpty(x.source) && x.source.Equals("2") && !string.IsNullOrEmpty(x.scope) && x.scope.Equals("private")).ToList().Count;
  786. counts.Add(sc_online);
  787. counts.Add(sc_class);
  788. counts.Add(sc_mark);
  789. counts.Add(p_online);
  790. counts.Add(p_class);
  791. counts.Add(p_mark);
  792. return counts;
  793. }
  794. catch (Exception e)
  795. {
  796. return counts;
  797. }
  798. }
  799. [ProducesDefaultResponseType]
  800. [Authorize(Roles = "IES")]
  801. [AuthToken(Roles = "teacher,admin")]
  802. [HttpPost("settle-recod")]
  803. public async Task<IActionResult> settleRecod(JsonElement request)
  804. {
  805. //if (!request.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
  806. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  807. if (!request.TryGetProperty("periodId", out JsonElement periodId)) return BadRequest();
  808. if (!request.TryGetProperty("stime", out JsonElement stime)) return BadRequest();
  809. if (!request.TryGetProperty("etime", out JsonElement etime)) return BadRequest();
  810. try
  811. {
  812. var client = _azureCosmos.GetCosmosClient();
  813. List<LessonRecord> records = new();
  814. StringBuilder sql = new($"select c.periodId,c.tmdid,c.collateTaskCount,c.collateCount,c.clientInteractionCount,c.examQuizCount,c.scpoe from c where c.periodId = '{periodId}'");
  815. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(
  816. queryText: sql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"LessonRecord-{code}") }))
  817. {
  818. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  819. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  820. {
  821. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  822. {
  823. records.Add(obj.ToObject<LessonRecord>());
  824. }
  825. }
  826. }
  827. if (records.Count > 0)
  828. {
  829. double total = records.Count;
  830. double teachCount = records.Where(r => r.tmdid != null).Where((x, i) => records.FindIndex(z => z.tmdid == x.tmdid) == i).ToList().Count;
  831. double taskCount = records.Select(c => c.collateTaskCount).Sum();
  832. double workCount = records.Select(c => c.collateCount).Sum();
  833. double examQuizCount = records.Select(c => c.examQuizCount).Sum();
  834. double interactCount = records.Select(c => c.clientInteractionCount).Sum();
  835. List<(string name, double count)> rc = await getRecordCount(client, records, stime.GetInt64(), etime.GetInt64(), code.GetString(), "", periodId.GetString());
  836. double semester = rc.Where(r => r.name.Equals("semester")).FirstOrDefault().count;
  837. return Ok(new { total, teachCount, taskCount, workCount, examQuizCount, interactCount, semester });
  838. }
  839. else
  840. {
  841. return Ok(new { total = 0, teachCount = 0, taskCount = 0, workCount = 0, examQuizCount = 0, interactCount = 0, semester = 0 });
  842. }
  843. }
  844. catch (Exception ex)
  845. {
  846. await _dingDing.SendBotMsg($"OS,{_option.Location},class/analysis/settle-recod()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
  847. return Ok(new { code = 404, msg = ex.Message });
  848. }
  849. }
  850. private async Task<List<string>> getStudentsAsync(string pId, CosmosClient client, string pk, string source)
  851. {
  852. try
  853. {
  854. List<string> sIds = new();
  855. await foreach (var item in client.GetContainer("TEAMModelOS", source).GetItemQueryStreamIterator(queryText: $"select c.id from c where c.pk = '{pk}' and c.periodId = '{pId}'"))
  856. {
  857. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  858. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  859. {
  860. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  861. while (accounts.MoveNext())
  862. {
  863. JsonElement account = accounts.Current;
  864. sIds.Add(account.GetProperty("id").GetString());
  865. }
  866. }
  867. }
  868. return sIds;
  869. }
  870. catch (Exception e)
  871. {
  872. await _dingDing.SendBotMsg($"OS,{_option.Location},area/get-students()\n{e.Message}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
  873. return new List<string>();
  874. }
  875. }
  876. }
  877. }