CourseController.cs 85 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603
  1. using Azure.Cosmos;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.Extensions.Options;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.IdentityModel.Tokens.Jwt;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Text.Json;
  12. using System.Threading.Tasks;
  13. using TEAMModelOS.Models;
  14. using TEAMModelOS.Models.Dto;
  15. using TEAMModelOS.SDK.Models;
  16. using TEAMModelOS.SDK;
  17. using TEAMModelOS.SDK.DI;
  18. using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
  19. using TEAMModelOS.SDK.Extension;
  20. using TEAMModelOS.SDK;
  21. using TEAMModelOS.SDK.Helper.Common.StringHelper;
  22. using System.Dynamic;
  23. using Azure;
  24. using TEAMModelOS.SDK.Models.Cosmos.Common;
  25. using Azure.Messaging.ServiceBus;
  26. using Microsoft.Extensions.Configuration;
  27. using TEAMModelOS.Filter;
  28. namespace TEAMModelOS.Controllers
  29. {
  30. [ProducesResponseType(StatusCodes.Status200OK)]
  31. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  32. //[Authorize(Roles = "IES5")]
  33. [Route("school/course")]
  34. [ApiController]
  35. public class CourseController : ControllerBase
  36. {
  37. private AzureCosmosFactory _azureCosmos;
  38. private readonly DingDing _dingDing;
  39. private readonly Option _option;
  40. private readonly AzureServiceBusFactory _serviceBus;
  41. public IConfiguration _configuration { get; set; }
  42. public CourseController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, AzureServiceBusFactory serviceBus, IConfiguration configuration)
  43. {
  44. _azureCosmos = azureCosmos;
  45. _dingDing = dingDing;
  46. _option = option?.Value;
  47. _serviceBus = serviceBus;
  48. _configuration = configuration;
  49. }
  50. /// <summary>
  51. /// 更新保存课程
  52. /// </summary>
  53. /// <param name="request"></param>
  54. /// <returns></returns>
  55. [ProducesDefaultResponseType]
  56. //[AuthToken(Roles = "Teacher")]
  57. [HttpPost("upsert")]
  58. public async Task<IActionResult> upsert(JsonElement requert)
  59. {
  60. try
  61. {
  62. Course course = new Course();
  63. if (!requert.TryGetProperty("course", out JsonElement _course)) return BadRequest();
  64. if (!requert.TryGetProperty("option", out JsonElement option)) return BadRequest();
  65. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  66. course = _course.ToObject<Course>();
  67. var client = _azureCosmos.GetCosmosClient();
  68. course.pk = typeof(Course).Name;
  69. string code = course.code;
  70. course.code = typeof(Course).Name + "-" + course.code;
  71. if (option.ToString().Equals("insert"))
  72. {
  73. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  74. {
  75. var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(course.id, new PartitionKey($"Course-{code}"));
  76. if (response.Status == 200)
  77. {
  78. return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  79. }
  80. else
  81. {
  82. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = course.school, creatorId = course.creatorId };
  83. courseChange.addClass = course.schedule.Select(x => x.classId).ToList();
  84. courseChange.addList = course.schedule.Select(x => x.stulist).ToList();
  85. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(course, new PartitionKey($"Course-{code}"));
  86. }
  87. }
  88. else
  89. {
  90. var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(course.id, new PartitionKey($"Course-{code}"));
  91. if (response.Status == 200)
  92. {
  93. return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  94. }
  95. else
  96. {
  97. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = course.school, creatorId = course.creatorId };
  98. courseChange.addClass = course.schedule.Select(x => x.classId).ToList();
  99. courseChange.addList = course.schedule.Select(x => x.stulist).ToList();
  100. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  101. messageBlob.ApplicationProperties.Add("name", "Course");
  102. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  103. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  104. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(course, new PartitionKey($"Course-{code}"));
  105. }
  106. }
  107. }
  108. else
  109. {
  110. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  111. {
  112. Course odlCourse = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReadItemAsync<Course>(course.id, new PartitionKey($"Course-{code}"));
  113. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = code };
  114. var oldCls = odlCourse.schedule.Select(x => x.classId).ToList();
  115. var oldLst = odlCourse.schedule.Select(x => x.stulist).ToList();
  116. var newCls = course.schedule.Select(x => x.classId).ToList();
  117. var newLst = course.schedule.Select(x => x.stulist).ToList();
  118. List<string> addCls = new List<string>();
  119. List<string> addLst = new List<string>();
  120. List<string> delCls = new List<string>();
  121. List<string> delLst = new List<string>();
  122. oldCls.ForEach(x =>
  123. {
  124. if (!newCls.Contains(x))
  125. {
  126. delCls.Add(x);
  127. }
  128. });
  129. newCls.ForEach(x =>
  130. {
  131. if (!oldCls.Contains(x))
  132. {
  133. addCls.Add(x);
  134. }
  135. });
  136. oldLst.ForEach(x =>
  137. {
  138. if (!newLst.Contains(x))
  139. {
  140. delLst.Add(x);
  141. }
  142. });
  143. newLst.ForEach(x =>
  144. {
  145. if (!oldLst.Contains(x))
  146. {
  147. addLst.Add(x);
  148. }
  149. });
  150. courseChange.addClass = addCls;
  151. courseChange.addList = addLst;
  152. courseChange.delClass = delCls;
  153. courseChange.delList = delLst;
  154. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync(course, course.id, new PartitionKey($"Course-{code}"));
  155. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  156. messageBlob.ApplicationProperties.Add("name", "Course");
  157. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  158. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  159. }
  160. else
  161. {
  162. Course odlCourse = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Course>(course.id, new PartitionKey($"Course-{code}"));
  163. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, creatorId = code };
  164. var oldCls = odlCourse.schedule.Select(x => x.classId).ToList();
  165. var oldLst = odlCourse.schedule.Select(x => x.stulist).ToList();
  166. var newCls = course.schedule.Select(x => x.classId).ToList();
  167. var newLst = course.schedule.Select(x => x.stulist).ToList();
  168. List<string> addCls = new List<string>();
  169. List<string> addLst = new List<string>();
  170. List<string> delCls = new List<string>();
  171. List<string> delLst = new List<string>();
  172. oldCls.ForEach(x =>
  173. {
  174. if (!newCls.Contains(x))
  175. {
  176. delCls.Add(x);
  177. }
  178. });
  179. newCls.ForEach(x =>
  180. {
  181. if (!oldCls.Contains(x))
  182. {
  183. addCls.Add(x);
  184. }
  185. });
  186. oldLst.ForEach(x =>
  187. {
  188. if (!newLst.Contains(x))
  189. {
  190. delLst.Add(x);
  191. }
  192. });
  193. newLst.ForEach(x =>
  194. {
  195. if (!oldLst.Contains(x))
  196. {
  197. addLst.Add(x);
  198. }
  199. });
  200. courseChange.addClass = addCls;
  201. courseChange.addList = addLst;
  202. courseChange.delClass = delCls;
  203. courseChange.delList = delLst;
  204. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(course, course.id, new PartitionKey($"Course-{code}"));
  205. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  206. messageBlob.ApplicationProperties.Add("name", "Course");
  207. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  208. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  209. }
  210. }
  211. return Ok(new { course });
  212. }
  213. catch (Exception ex)
  214. {
  215. await _dingDing.SendBotMsg($"OS,{_option.Location},course/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  216. return BadRequest();
  217. }
  218. }
  219. /*
  220. {
  221. "stuListNo": "1124582",
  222. "studentId": "19990005",//tmdId/studentId 只能是其中一个有值
  223. "tmdId":"1538614518",
  224. }
  225. */
  226. /// <summary>
  227. /// 根据邀请码加入名单
  228. /// </summary>
  229. /// <param name="json"></param>
  230. /// <returns></returns>
  231. [ProducesDefaultResponseType]
  232. [AuthToken(Roles = "admin,teacher,student")]
  233. [HttpPost("get-list-by-no")]
  234. public async Task<IActionResult> GetListByNo(JsonElement json) {
  235. try {
  236. if (!json.TryGetProperty("stuListNo", out JsonElement _stuListNo)) return BadRequest();
  237. var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
  238. var client = _azureCosmos.GetCosmosClient();
  239. var queryNo = $"SELECT * FROM c where c.no ='{_stuListNo}'";
  240. StuList stuList = null;
  241. json.TryGetProperty("studentId", out JsonElement _studentId);
  242. json.TryGetProperty("tmdId", out JsonElement _tmdId);
  243. if (!string.IsNullOrEmpty(school))
  244. {
  245. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: queryNo,
  246. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"StuList-{school}") }))
  247. {
  248. using var jsonNo = await JsonDocument.ParseAsync(item.ContentStream);
  249. if (jsonNo.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  250. {
  251. var stuDoc = jsonNo.RootElement.GetProperty("Documents").EnumerateArray();
  252. while (stuDoc.MoveNext())
  253. {
  254. JsonElement data = stuDoc.Current;
  255. stuList = data.ToObject<StuList>();
  256. if (stuList != null)
  257. {
  258. (int status, StuList stuLis) = JoinList(stuList, $"{_studentId}", $"{_tmdId}", school);
  259. stuLis=await upsertList(stuList, "school");
  260. return Ok(new { status, stuLis });
  261. }
  262. }
  263. }
  264. }
  265. }
  266. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: queryNo,
  267. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"StuList") }))
  268. {
  269. using var jsonNo = await JsonDocument.ParseAsync(item.ContentStream);
  270. if (jsonNo.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  271. {
  272. var stuDoc = jsonNo.RootElement.GetProperty("Documents").EnumerateArray();
  273. while (stuDoc.MoveNext())
  274. {
  275. JsonElement data = stuDoc.Current;
  276. stuList = data.ToObject<StuList>();
  277. if (stuList != null)
  278. {
  279. (int status, StuList stuLis) = JoinList(stuList, $"{_studentId}", $"{_tmdId}", school);
  280. stuLis = await upsertList(stuList, "private");
  281. return Ok(new { status, stuLis });
  282. }
  283. }
  284. }
  285. }
  286. return Ok(new { status= - 1 });
  287. } catch (Exception ex) {
  288. await _dingDing.SendBotMsg($"OS,{_option.Location},course/get-list-by-no()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  289. return BadRequest();
  290. }
  291. }
  292. public (int status, StuList stuList) JoinList(StuList stuList, string _studentId,string _tmdId,string school)
  293. {
  294. int status = -1;
  295. if (string.IsNullOrEmpty($"{_studentId}") && string.IsNullOrEmpty($"{_tmdId}"))
  296. {
  297. //加入学生或醍摩豆ID为空
  298. status=1;
  299. }
  300. else
  301. {
  302. if (!string.IsNullOrEmpty($"{_studentId}") && !string.IsNullOrEmpty(school))
  303. {
  304. string _stuid = $"{_studentId}";
  305. var student = stuList.students.Find(x => x.id == _stuid);
  306. if (student != null)
  307. {
  308. //重复加入
  309. status= 2 ;
  310. }
  311. else
  312. {
  313. status = 0;
  314. stuList.students.Add(new Students { id = _stuid, code = $"Base-{school}" });
  315. }
  316. }
  317. if (!string.IsNullOrEmpty($"{_tmdId}"))
  318. {
  319. string tmdid = $"{_tmdId}";
  320. var tmd = stuList.tmids.Find(x => x == tmdid);
  321. if (!string.IsNullOrEmpty(tmd))
  322. {
  323. //重复加入
  324. status = 2;
  325. }
  326. else
  327. {
  328. status = 0;
  329. stuList.tmids.Add(tmdid);
  330. }
  331. }
  332. }
  333. return (status,stuList);
  334. }
  335. //处理通用名单
  336. [ProducesDefaultResponseType]
  337. [AuthToken(Roles = "teacher,admin")]
  338. [HttpPost("upsert-list")]
  339. public async Task<IActionResult> upsertList(JsonElement json)
  340. {
  341. try
  342. {
  343. var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
  344. StuList stuList = new StuList();
  345. if (!json.TryGetProperty("stuList", out JsonElement student)) return BadRequest();
  346. if (!json.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  347. stuList = student.ToObject<StuList>();
  348. stuList.creatorId = userid;
  349. stuList.school = school;
  350. stuList = await upsertList(stuList, $"{scope}");
  351. return Ok(new { stuList });
  352. }
  353. catch (Exception ex)
  354. {
  355. await _dingDing.SendBotMsg($"OS,{_option.Location},course/upsert-list()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  356. return BadRequest();
  357. }
  358. }
  359. private async Task<StuList> upsertList(StuList stuList, string scope)
  360. {
  361. try
  362. {
  363. var client = _azureCosmos.GetCosmosClient();
  364. string originCode = stuList.code;
  365. //todo 需要校验是否重复
  366. if (string.IsNullOrEmpty(stuList.no))
  367. {
  368. stuList.no = $"{Utils.CreatSaltString(6, "0123456789")}";
  369. string table = $"{scope}" != "school" ? "Teacher" : "School";
  370. for (int i = 0; i < 10; i++)
  371. {
  372. var queryNo = $"SELECT c.no FROM c where c.no ='{stuList.no}'";
  373. List<string> noStus = new();
  374. await foreach (var item in client.GetContainer("TEAMModelOS", $"{table}").GetItemQueryStreamIterator(queryText: queryNo,
  375. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"{stuList.code}") }))
  376. {
  377. using var jsonNo = await JsonDocument.ParseAsync(item.ContentStream);
  378. if (jsonNo.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  379. {
  380. var accounts = jsonNo.RootElement.GetProperty("Documents").EnumerateArray();
  381. while (accounts.MoveNext())
  382. {
  383. JsonElement account = accounts.Current;
  384. noStus.Add(account.GetProperty("no").GetString());
  385. }
  386. }
  387. }
  388. if (noStus.Count == 0)
  389. {
  390. break;
  391. }
  392. else
  393. {
  394. if (i == 9)
  395. {
  396. string msg = $"OS,{_option.Location},school/course/upsert-list()\n 编号生成异常,重复生成次数超过10次";
  397. await _dingDing.SendBotMsg(msg, GroupNames.醍摩豆服務運維群組);
  398. throw new Exception(msg);
  399. }
  400. else
  401. {
  402. stuList.no = $"{Utils.CreatSaltString(6, "0123456789")}";
  403. }
  404. }
  405. }
  406. }
  407. //stuList.no = channelnum;
  408. stuList.code = stuList.pk + "-" + stuList.code;
  409. //stuList.owner = originCode;
  410. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  411. {
  412. stuList.scope = "school";
  413. StuListChange change = new StuListChange()
  414. {
  415. listid= stuList.id,
  416. scope = $"{scope}",
  417. originCode = originCode,
  418. school=stuList.school,
  419. creatorId=stuList.creatorId
  420. };
  421. var query = $"SELECT distinct value(c) FROM c where c.id='{stuList.id}'";
  422. List<StuList> odlStus = new List<StuList>();
  423. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<StuList>(queryText: query,
  424. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"StuList-{originCode}") }))
  425. {
  426. odlStus.Add(item);
  427. }
  428. if (odlStus.Count > 0)
  429. {
  430. if (stuList.students.IsNotEmpty())
  431. {
  432. if (odlStus[0].students.IsNotEmpty())
  433. {
  434. StuList oldStu = odlStus[0];
  435. foreach (var stu in stuList.students)
  436. {
  437. bool flag = false;
  438. //判断新增名单成员不在已经存在的名单
  439. foreach (var old in oldStu.students)
  440. {
  441. if (old.id == stu.id && old.code == stu.code)
  442. {
  443. flag = true;
  444. }
  445. }
  446. if (flag == false)
  447. {
  448. change.stujoin.Add(stu);
  449. }
  450. }
  451. }
  452. }
  453. if (stuList.tmids.IsNotEmpty())
  454. {
  455. if (odlStus[0].tmids.IsNotEmpty())
  456. {
  457. StuList oldStu = odlStus[0];
  458. foreach (var tmdid in stuList.tmids)
  459. {
  460. bool flag = false;
  461. //判断新增名单成员不在已经存在的名单
  462. foreach (var old in oldStu.tmids)
  463. {
  464. if (old == tmdid)
  465. {
  466. flag = true;
  467. }
  468. }
  469. if (flag == false)
  470. {
  471. change.tmdjoin.Add(tmdid);
  472. }
  473. }
  474. }
  475. }
  476. if (change.tmdjoin.Count != 0 || change.tmdhleave.Count != 0 || change.stujoin.Count != 0 || change.stuleave.Count != 0)
  477. {
  478. var messageChange = new ServiceBusMessage(change.ToJsonString());
  479. messageChange.ApplicationProperties.Add("name", "StuList");
  480. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  481. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageChange);
  482. }
  483. }
  484. stuList = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync(stuList, new PartitionKey($"StuList-{originCode}"));
  485. }
  486. else
  487. {
  488. stuList.scope = "private";
  489. StuListChange change = new StuListChange()
  490. {
  491. listid= stuList.id,
  492. scope = $"{scope}",
  493. originCode = originCode,
  494. school = stuList.school,
  495. creatorId = stuList.creatorId
  496. };
  497. var query = $"SELECT distinct value(c) FROM c where c.id='{stuList.id}'";
  498. List<StuList> odlStus = new List<StuList>();
  499. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<StuList>(queryText: query,
  500. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"StuList") }))
  501. {
  502. odlStus.Add(item);
  503. }
  504. if (odlStus.Count > 0)
  505. {
  506. if (stuList.students.IsNotEmpty())
  507. {
  508. if (odlStus[0].students.IsNotEmpty())
  509. {
  510. StuList oldStu = odlStus[0];
  511. foreach (var stu in stuList.students)
  512. {
  513. bool flag = false;
  514. //判断新增名单成员不在已经存在的名单
  515. foreach (var old in oldStu.students)
  516. {
  517. if (old.id == stu.id && old.code == stu.code)
  518. {
  519. flag = true;
  520. }
  521. }
  522. if (flag == false)
  523. {
  524. change.stujoin.Add(stu);
  525. }
  526. }
  527. }
  528. }
  529. if (stuList.tmids.IsNotEmpty())
  530. {
  531. if (odlStus[0].tmids.IsNotEmpty())
  532. {
  533. StuList oldStu = odlStus[0];
  534. foreach (var tmdid in stuList.tmids)
  535. {
  536. bool flag = false;
  537. //判断新增名单成员不在已经存在的名单
  538. foreach (var old in oldStu.tmids)
  539. {
  540. if (old == tmdid)
  541. {
  542. flag = true;
  543. }
  544. }
  545. if (flag == false)
  546. {
  547. change.tmdjoin.Add(tmdid);
  548. }
  549. }
  550. }
  551. }
  552. if (change.tmdjoin.Count != 0 || change.tmdhleave.Count != 0 || change.stujoin.Count != 0 || change.stuleave.Count != 0) {
  553. var messageChange = new ServiceBusMessage(change.ToJsonString());
  554. messageChange.ApplicationProperties.Add("name", "StuList");
  555. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  556. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageChange);
  557. }
  558. }
  559. stuList.code = "StuList";
  560. stuList = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(stuList, new PartitionKey($"StuList"));
  561. }
  562. return stuList;
  563. }
  564. catch (Exception ex)
  565. {
  566. string msg = $"OS,{_option.Location},course/upsert-list()\n{ex.Message}";
  567. await _dingDing.SendBotMsg(msg, GroupNames.醍摩豆服務運維群組);
  568. throw new Exception(msg, ex);
  569. }
  570. }
  571. //查询名单
  572. [ProducesDefaultResponseType]
  573. //[AuthToken(Roles = "Teacher")]
  574. [HttpPost("find-list")]
  575. public async Task<IActionResult> FindList(JsonElement requert)
  576. {
  577. try
  578. {
  579. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  580. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  581. var client = _azureCosmos.GetCosmosClient();
  582. List<object> stuList = new List<object>();
  583. //List<int> stuCount = new List<int>();
  584. var query = $"select c.id,c.name,c.students,c.tmids from c";
  585. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  586. {
  587. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList-{code}") }))
  588. {
  589. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  590. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  591. {
  592. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  593. {
  594. List<Students> stu = obj.GetProperty("students").ToObject<List<Students>>();
  595. stuList.Add(obj.ToObject<object>());
  596. //stuList.Add(stu.Count);
  597. //stuCount.Add(stu.Count);
  598. }
  599. }
  600. }
  601. }
  602. else
  603. {
  604. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList") }))
  605. {
  606. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  607. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  608. {
  609. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  610. {
  611. List<Students> stu = obj.GetProperty("students").ToObject<List<Students>>();
  612. stuList.Add(obj.ToObject<object>());
  613. //stuList.Add(stu.Count);
  614. //stuCount.Add(stu.Count);
  615. }
  616. }
  617. }
  618. }
  619. return Ok(new { stuList });
  620. }
  621. catch (Exception ex)
  622. {
  623. await _dingDing.SendBotMsg($"OS,{_option.Location},course/find-list()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  624. return BadRequest();
  625. }
  626. }
  627. //查询名单
  628. [ProducesDefaultResponseType]
  629. //[AuthToken(Roles = "Teacher")]
  630. [HttpPost("get-summary-list")]
  631. public async Task<IActionResult> getSummary(JsonElement requert)
  632. {
  633. try
  634. {
  635. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  636. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  637. if (!requert.TryGetProperty("ids", out JsonElement classId)) return BadRequest();
  638. var client = _azureCosmos.GetCosmosClient();
  639. List<object> stuList = new List<object>();
  640. //List<int> stuCount = new List<int>();
  641. List<string> ids = new List<string>();
  642. ids = classId.ToObject<List<string>>();
  643. var query = $"select c.id,c.name,c.students,c.tmids,c.no from c where c.id in ({string.Join(",", ids.Select(o => $"'{o}'"))})";
  644. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  645. {
  646. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList-{code}") }))
  647. {
  648. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  649. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  650. {
  651. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  652. {
  653. //List<Students> stu = obj.GetProperty("students").ToObject<List<Students>>();
  654. stuList.Add(obj.ToObject<object>());
  655. //stuList.Add(stu.Count);
  656. //stuCount.Add(stu.Count);
  657. }
  658. }
  659. }
  660. }
  661. else
  662. {
  663. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList") }))
  664. {
  665. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  666. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  667. {
  668. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  669. {
  670. //List<Students> stu = obj.GetProperty("students").ToObject<List<Students>>();
  671. stuList.Add(obj.ToObject<object>());
  672. //stuList.Add(stu.Count);
  673. //stuCount.Add(stu.Count);
  674. }
  675. }
  676. }
  677. }
  678. return Ok(new { stuList });
  679. }
  680. catch (Exception ex)
  681. {
  682. await _dingDing.SendBotMsg($"OS,{_option.Location},course/get-summary-list()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  683. return BadRequest();
  684. }
  685. }
  686. //查询名单
  687. [ProducesDefaultResponseType]
  688. //[AuthToken(Roles = "Teacher")]
  689. [HttpPost("delete-list")]
  690. public async Task<IActionResult> deleteList(JsonElement requert)
  691. {
  692. try
  693. {
  694. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  695. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  696. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  697. var client = _azureCosmos.GetCosmosClient();
  698. //var query = $"select c.id,c.name,c.students,c.tmids from c where c.id in ({string.Join(",", ids.Select(o => $"'{o}'"))})";
  699. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  700. {
  701. /*List<string> classIds = new List<string>();
  702. var query = $"select c.id from c join A0 in c.schedule where A0.teacherId = '{id}'";
  703. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  704. {
  705. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  706. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  707. {
  708. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  709. while (accounts.MoveNext())
  710. {
  711. JsonElement account = accounts.Current;
  712. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  713. {
  714. continue;
  715. }
  716. classIds.Add(account.GetProperty("id").GetString());
  717. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  718. }
  719. }
  720. }*/
  721. await client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"StuList-{code}"));
  722. }
  723. else
  724. {
  725. await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"StuLis"));
  726. /*await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList") }))
  727. {
  728. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  729. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  730. {
  731. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  732. {
  733. List<Students> stu = obj.GetProperty("students").ToObject<List<Students>>();
  734. stuList.Add(obj.ToObject<object>());
  735. //stuList.Add(stu.Count);
  736. //stuCount.Add(stu.Count);
  737. }
  738. }
  739. }*/
  740. }
  741. return Ok(new { id });
  742. }
  743. catch (Exception ex)
  744. {
  745. await _dingDing.SendBotMsg($"OS,{_option.Location},course/delete-list()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  746. return BadRequest();
  747. }
  748. }
  749. /// <summary>
  750. /// 查询课程
  751. /// </summary>
  752. /// <param name="request"></param>
  753. /// <returns></returns>
  754. [ProducesDefaultResponseType]
  755. //[AuthToken(Roles = "Teacher")]
  756. [HttpPost("find")]
  757. public async Task<IActionResult> Find(JsonElement requert)
  758. {
  759. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  760. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  761. try
  762. {
  763. var client = _azureCosmos.GetCosmosClient();
  764. List<object> courses = new List<object>();
  765. /*string continuationToken = string.Empty;
  766. string token = default;
  767. //是否需要进行分页查询,默认不分页
  768. //bool iscontinuation = false;
  769. if (requert.TryGetProperty("token", out JsonElement token_1))
  770. {
  771. token = token_1.GetString();
  772. //iscontinuation = true;
  773. };
  774. //默认不指定返回大小
  775. int? topcout = null;
  776. if (requert.TryGetProperty("count", out JsonElement jcount))
  777. {
  778. if (!jcount.ValueKind.Equals(JsonValueKind.Undefined) && !jcount.ValueKind.Equals(JsonValueKind.Null) && jcount.TryGetInt32(out int data))
  779. {
  780. topcout = data;
  781. }
  782. }*/
  783. var query = $"select c.code,c.id,c.no,c.name,c.period,c.subject,c.scope from c";
  784. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  785. {
  786. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code.GetString()}") }))
  787. {
  788. //continuationToken = item.GetContinuationToken();
  789. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  790. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  791. {
  792. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  793. {
  794. courses.Add(obj.ToObject<object>());
  795. }
  796. }
  797. //break;
  798. }
  799. }
  800. else
  801. {
  802. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code.GetString()}") }))
  803. {
  804. //continuationToken = item.GetContinuationToken();
  805. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  806. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  807. {
  808. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  809. {
  810. courses.Add(obj.ToObject<object>());
  811. }
  812. }
  813. //break;
  814. }
  815. if (requert.TryGetProperty("schoolId", out JsonElement schoolId))
  816. {
  817. var querySchool = $"select distinct c.code,c.id,c.no,c.name,c.period,c.subject,c.scope from c join A0 in c.schedule where A0.teacherId = '{code}'";
  818. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{schoolId.GetString()}") }))
  819. {
  820. //continuationToken = item.GetContinuationToken();
  821. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  822. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  823. {
  824. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  825. {
  826. courses.Add(obj.ToObject<object>());
  827. }
  828. }
  829. //break;
  830. }
  831. };
  832. }
  833. return Ok(new { courses, courses.Count });
  834. }
  835. catch (Exception ex)
  836. {
  837. await _dingDing.SendBotMsg($"OS,{_option.Location},course/find()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  838. return BadRequest();
  839. }
  840. /* List<Course> data = new List<Course>();
  841. if (StringHelper.getKeyCount(request) > 0) {
  842. data = await _azureCosmos.FindByDict<Course>(request);
  843. }
  844. return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  845. }
  846. /// <summary>
  847. /// 查询课程详情
  848. /// </summary>
  849. /// <param name="request"></param>
  850. /// <returns></returns>
  851. [ProducesDefaultResponseType]
  852. //[AuthToken(Roles = "Teacher")]
  853. [HttpPost("find-summary")]
  854. public async Task<IActionResult> FindSummary(JsonElement requert)
  855. {
  856. if (!requert.TryGetProperty("code", out JsonElement school_code)) return BadRequest();
  857. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  858. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  859. try
  860. {
  861. var client = _azureCosmos.GetCosmosClient();
  862. List<object> courses = new List<object>();
  863. List<Course> courseList = new List<Course>();
  864. var query = $"select value(c) from c where c.id = '{id}'";
  865. //List<(string id, string code, string name)> listCourse = new List<(string id, string code, string name)>();
  866. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  867. {
  868. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code.GetString()}") }))
  869. {
  870. courseList.Add(item);
  871. }
  872. }
  873. else
  874. {
  875. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code.GetString()}") }))
  876. {
  877. courseList.Add(item);
  878. }
  879. }
  880. foreach (Course course in courseList)
  881. {
  882. dynamic courseExtobj = new ExpandoObject();
  883. courseExtobj.id = course.id;
  884. courseExtobj.name = course.name;
  885. courseExtobj.id = course.id;
  886. courseExtobj.subject = course.subject;
  887. courseExtobj.period = course.period;
  888. courseExtobj.scope = course.scope;
  889. courseExtobj.no = course.no;
  890. courseExtobj.code = course.code;
  891. List<object> scheList = new List<object>();
  892. foreach (Schedule schedule in course.schedule)
  893. {
  894. dynamic scheduleExtobj = new ExpandoObject();
  895. scheduleExtobj.classId = schedule.classId;
  896. scheduleExtobj.teacherId = schedule.teacherId;
  897. if (!string.IsNullOrEmpty(schedule.teacherId))
  898. {
  899. var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(schedule.teacherId, new PartitionKey("Base"));
  900. if (response.Status == 200)
  901. {
  902. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  903. Teacher teacher = json.ToObject<Teacher>();
  904. scheduleExtobj.teacherName = teacher.name;
  905. }
  906. }
  907. scheduleExtobj.stulist = schedule.stulist;
  908. scheduleExtobj.time = schedule.time;
  909. scheduleExtobj.notice = schedule.notice;
  910. scheduleExtobj.room = schedule.room;
  911. scheList.Add(scheduleExtobj);
  912. }
  913. courseExtobj.schedule = scheList;
  914. courses.Add(courseExtobj);
  915. }
  916. return Ok(new { courses, courses.Count });
  917. }
  918. catch (Exception ex)
  919. {
  920. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},course/find-summary()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  921. return BadRequest();
  922. }
  923. /* List<Course> data = new List<Course>();
  924. if (StringHelper.getKeyCount(request) > 0) {
  925. data = await _azureCosmos.FindByDict<Course>(request);
  926. }
  927. return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  928. }
  929. /// <summary>
  930. /// 删除课程
  931. /// </summary>
  932. /// <param name="request"></param>
  933. /// <returns></returns>
  934. [ProducesDefaultResponseType]
  935. //[AuthToken(Roles = "Teacher")]
  936. [HttpPost("delete")]
  937. public async Task<IActionResult> Delete(JsonElement request)
  938. {
  939. try
  940. {
  941. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  942. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  943. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  944. //string school_code = code.ToString().Substring(typeof(Course).Name.Length + 1);
  945. var client = _azureCosmos.GetCosmosClient();
  946. if (scope.ToString().Equals("school"))
  947. {
  948. Course course = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<Course>(id.ToString(), new PartitionKey($"Course-{code}"));
  949. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = course.school, creatorId = course.creatorId };
  950. courseChange.delClass = course.schedule.Select(x => x.classId).ToList();
  951. courseChange.delList = course.schedule.Select(x => x.stulist).ToList();
  952. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  953. messageBlob.ApplicationProperties.Add("name", "Course");
  954. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  955. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  956. await client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Course-{code}"));
  957. }
  958. else
  959. {
  960. Course course = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Course>(id.ToString(), new PartitionKey($"Course-{code}"));
  961. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = course.school, creatorId = course.creatorId };
  962. courseChange.delClass = course.schedule.Select(x => x.classId).ToList();
  963. courseChange.delList = course.schedule.Select(x => x.stulist).ToList();
  964. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  965. messageBlob.ApplicationProperties.Add("name", "Course");
  966. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  967. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  968. await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Course-{code}"));
  969. }
  970. return Ok(new { id });
  971. }
  972. catch (Exception ex)
  973. {
  974. await _dingDing.SendBotMsg($"CN,{_option.Location},course/delete()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  975. return BadRequest();
  976. }
  977. }
  978. /// <summary>
  979. /// 删除课程
  980. /// </summary>
  981. /// <param name="request"></param>
  982. /// <returns></returns>
  983. [ProducesDefaultResponseType]
  984. //[AuthToken(Roles = "Teacher")]
  985. [HttpPost("delete-all")]
  986. public async Task<IActionResult> DeleteAll(BatchOption request)
  987. {
  988. try
  989. {
  990. /* if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  991. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();*/
  992. var client = _azureCosmos.GetCosmosClient();
  993. if (request == null) return BadRequest();
  994. string school_code = request.code;
  995. if (request.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
  996. {
  997. List<Response> res = await client.GetContainer("TEAMModelOS", "School").DeleteItemsStreamAsync(request.ids, $"Course-{school_code}");
  998. }
  999. else
  1000. {
  1001. List<Response> res = await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemsStreamAsync(request.ids, $"Course-{school_code}");
  1002. }
  1003. return Ok(new { ids = request.ids });
  1004. }
  1005. catch (Exception ex)
  1006. {
  1007. await _dingDing.SendBotMsg($"CN,{_option.Location},course/delete()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  1008. return BadRequest();
  1009. }
  1010. }
  1011. /// <summary>
  1012. /// 更新保存排课管理
  1013. /// </summary>
  1014. /// <param name="request"></param>
  1015. /// <returns></returns>
  1016. //[ProducesDefaultResponseType]
  1017. ////[AuthToken(Roles = "Teacher")]
  1018. //[HttpPost("upsert-management")]
  1019. //public async Task<IActionResult> upsertCourseManagement(CourseManagement requert)
  1020. //{
  1021. // try
  1022. // {
  1023. // CourseManagement course = new CourseManagement();
  1024. // //course = room.ToObject<CourseManagement>();
  1025. // var client = _azureCosmos.GetCosmosClient();
  1026. // string code = requert.code;
  1027. // requert.code = "CourseManagement-" + requert.code;
  1028. // /* if (requert.scope.Equals) {
  1029. // }*/
  1030. // var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(requert.id, new PartitionKey($"CourseManagement-{code}"));
  1031. // if (response.Status == 200)
  1032. // {
  1033. // course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync(requert, requert.id, new PartitionKey($"CourseManagement-{code}"));
  1034. // }
  1035. // else
  1036. // {
  1037. // course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(requert, new PartitionKey($"CourseManagement-{code}"));
  1038. // }
  1039. // return Ok(new { course });
  1040. // }
  1041. // catch (Exception ex)
  1042. // {
  1043. // await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},management/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  1044. // return BadRequest();
  1045. // }
  1046. //}
  1047. /// <summary>
  1048. /// 查询排课管理
  1049. /// </summary>
  1050. /// <param name="request"></param>
  1051. /// <returns></returns>
  1052. //[ProducesDefaultResponseType]
  1053. ////[AuthToken(Roles = "Teacher")]
  1054. //[HttpPost("find-management")]
  1055. //public async Task<IActionResult> FindManagement(JsonElement requert)
  1056. //{
  1057. // //if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  1058. // if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  1059. // var client = _azureCosmos.GetCosmosClient();
  1060. // List<object> courses = new List<object>();
  1061. // StringBuilder sql = new StringBuilder();
  1062. // sql.Append("select c.code,c.id,c.name,c.courses,c.scope,c.teacher from c ");
  1063. // Dictionary<string, object> dict = new Dictionary<string, object>();
  1064. // var emobj = requert.EnumerateObject();
  1065. // while (emobj.MoveNext())
  1066. // {
  1067. // dict[emobj.Current.Name] = emobj.Current.Value;
  1068. // }
  1069. // //处理code
  1070. // if (dict.TryGetValue("code", out object _))
  1071. // {
  1072. // dict.Remove("code");
  1073. // }
  1074. // AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  1075. // await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  1076. // {
  1077. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1078. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1079. // {
  1080. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  1081. // {
  1082. // courses.Add(obj.ToObject<object>());
  1083. // }
  1084. // }
  1085. // }
  1086. // return Ok(new { courses });
  1087. //}
  1088. //[ProducesDefaultResponseType]
  1089. ////[AuthToken(Roles = "Teacher")]
  1090. //[HttpPost("find-course")]
  1091. //public async Task<IActionResult> FindCourse(JsonElement requert)
  1092. //{
  1093. // if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  1094. // if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  1095. // var client = _azureCosmos.GetCosmosClient();
  1096. // List<object> courses = new List<object>();
  1097. // var query = $"select c.code,c.id,c.name,A0.course.id courseId,A0.course.name courseName ,A0.course.notice notice ,A1,c.scope,c.teacher from c join A0 in c.courses join A1 in A0.teachers where A1.id = '{id}' ";
  1098. // await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  1099. // {
  1100. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1101. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1102. // {
  1103. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  1104. // {
  1105. // courses.Add(obj.ToObject<object>());
  1106. // }
  1107. // }
  1108. // }
  1109. // return Ok(new { courses });
  1110. //}
  1111. [ProducesDefaultResponseType]
  1112. //[AuthToken(Roles = "Teacher")]
  1113. [HttpPost("find-course-by-room")]
  1114. public async Task<IActionResult> FindCourseByRoom(JsonElement requert)
  1115. {
  1116. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  1117. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  1118. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  1119. var client = _azureCosmos.GetCosmosClient();
  1120. HashSet<Course> courseList = new HashSet<Course>();
  1121. List<object> courses = new List<object>();
  1122. //var query = $"select c.code,c.id,c.name from c join A0 in c.schedule where A0.classId = '{id}'";
  1123. //此处存在不同老师在同一间教室上相同的课程
  1124. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  1125. {
  1126. var query = $"select distinct value(c) from c join A0 in c.schedule where A0.room = '{id}'";
  1127. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  1128. {
  1129. courseList.Add(item);
  1130. }
  1131. }
  1132. else
  1133. {
  1134. var query = $"select distinct value(c) from c join A0 in c.schedule where A0.room = '{id}'";
  1135. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  1136. {
  1137. courseList.Add(item);
  1138. }
  1139. }
  1140. HashSet<string> teacherIds = new HashSet<string>();
  1141. foreach (Course course in courseList)
  1142. {
  1143. foreach (Schedule schedule in course.schedule)
  1144. {
  1145. teacherIds.Add(schedule.teacherId);
  1146. }
  1147. }
  1148. List<(string id, string name)> teachers = new List<(string id, string name)>();
  1149. if (teacherIds.Count > 0)
  1150. {
  1151. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(
  1152. queryText: $"select c.id,c.name from c where c.id in ({ string.Join(",", teacherIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  1153. {
  1154. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1155. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1156. {
  1157. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1158. while (accounts.MoveNext())
  1159. {
  1160. JsonElement account = accounts.Current;
  1161. teachers.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
  1162. }
  1163. }
  1164. }
  1165. }
  1166. foreach (Course course in courseList)
  1167. {
  1168. dynamic courseExtobj = new ExpandoObject();
  1169. courseExtobj.id = course.id;
  1170. courseExtobj.name = course.name;
  1171. courseExtobj.subject = course.subject;
  1172. courseExtobj.period = course.period;
  1173. courseExtobj.scope = course.scope;
  1174. courseExtobj.no = course.no;
  1175. courseExtobj.code = course.code;
  1176. courseExtobj.pk = course.pk;
  1177. List<object> scheList = new List<object>();
  1178. foreach (Schedule schedule in course.schedule)
  1179. {
  1180. dynamic scheduleExtobj = new ExpandoObject();
  1181. scheduleExtobj.classId = schedule.classId;
  1182. scheduleExtobj.teacherId = schedule.teacherId;
  1183. if (!string.IsNullOrEmpty(schedule.teacherId))
  1184. {
  1185. scheduleExtobj.teacherName = teachers.FirstOrDefault(c => c.id == schedule.teacherId).name;
  1186. }
  1187. scheduleExtobj.stulist = schedule.stulist;
  1188. scheduleExtobj.time = schedule.time;
  1189. scheduleExtobj.notice = schedule.notice;
  1190. scheduleExtobj.room = schedule.room;
  1191. scheList.Add(scheduleExtobj);
  1192. }
  1193. courseExtobj.schedule = scheList;
  1194. courses.Add(courseExtobj);
  1195. }
  1196. return Ok(new { courses });
  1197. }
  1198. //[ProducesDefaultResponseType]
  1199. ////[AuthToken(Roles = "Teacher")]
  1200. //[HttpPost("upsert-notice")]
  1201. //public async Task<IActionResult> upsertNotice(JsonElement requert)
  1202. //{
  1203. // if (!requert.TryGetProperty("courseId", out JsonElement courseId)) return BadRequest();
  1204. // if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  1205. // if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  1206. // if (!requert.TryGetProperty("notice", out JsonElement notice)) return BadRequest();
  1207. // if (!requert.TryGetProperty("A1", out JsonElement teacherInfo)) return BadRequest();
  1208. // Teachers teachers = teacherInfo.ToObject<Teachers>();
  1209. // var client = _azureCosmos.GetCosmosClient();
  1210. // List<CourseManagement> courseManagements = new List<CourseManagement>();
  1211. // StringBuilder sql = new StringBuilder();
  1212. // sql.Append("select value(c) from c");
  1213. // Dictionary<string, object> dict = new Dictionary<string, object>();
  1214. // //dict.Add("id", id);
  1215. // dict.Add("courses[*].course.id", courseId);
  1216. // dict.Add("courses[*].teachers[*].id", teachers.id);
  1217. // //dict.Add("id", classroom.id);
  1218. // AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  1219. // await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  1220. // {
  1221. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1222. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1223. // {
  1224. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  1225. // {
  1226. // courseManagements.Add(obj.ToObject<CourseManagement>());
  1227. // }
  1228. // }
  1229. // }
  1230. // for (int i = 0; i < courseManagements.Count; i++)
  1231. // {
  1232. // for (int j = 0; j < courseManagements[i].courses.Count; j++)
  1233. // {
  1234. // if (courseManagements[i].courses[j].course.id.Equals(courseId.ToString()))
  1235. // {
  1236. // courseManagements[i].courses[j].course.notice = notice.ToString();
  1237. // await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(courseManagements[i], courseManagements[i].id, new PartitionKey($"{courseManagements[i].code}"));
  1238. // break;
  1239. // }
  1240. // }
  1241. // }
  1242. // return Ok(new { id });
  1243. //}
  1244. [ProducesDefaultResponseType]
  1245. //[AuthToken(Roles = "Teacher")]
  1246. [HttpPost("upsert-teacher-course")]
  1247. public async Task<IActionResult> upsertCourse(JsonElement requert)
  1248. {
  1249. try
  1250. {
  1251. TeacherCourse course = new TeacherCourse();
  1252. if (!requert.TryGetProperty("course", out JsonElement room)) return BadRequest();
  1253. if (!requert.TryGetProperty("option", out JsonElement option)) return BadRequest();
  1254. course = room.ToObject<TeacherCourse>();
  1255. var client = _azureCosmos.GetCosmosClient();
  1256. course.pk = typeof(Course).Name;
  1257. string code = course.code;
  1258. course.code = typeof(Course).Name + "-" + course.code;
  1259. if (option.ToString().Equals("insert"))
  1260. {
  1261. var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(course.id, new PartitionKey($"Course-{code}"));
  1262. if (response.Status == 200)
  1263. {
  1264. return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  1265. }
  1266. else
  1267. {
  1268. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(course, new PartitionKey($"Course-{code}"));
  1269. }
  1270. }
  1271. else
  1272. {
  1273. if (course.classes.Count > 0)
  1274. {
  1275. //TODO 教师创建的个人的校本班级待处理冗余数据
  1276. foreach (ClassSimple classSimple in course.classes)
  1277. {
  1278. if (classSimple.scope.Equals("private", StringComparison.OrdinalIgnoreCase))
  1279. {
  1280. Class cla = new Class();
  1281. cla.id = classSimple.id;
  1282. cla.code = cla.pk + "-" + code;
  1283. cla.name = classSimple.name;
  1284. //cla.scope = classSimple.scope;
  1285. cla.teacher.id = classSimple.teacher.id;
  1286. cla.teacher.name = classSimple.teacher.name;
  1287. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(cla, new PartitionKey($"Class-{code}"));
  1288. }
  1289. else
  1290. {
  1291. var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(classSimple.id, new PartitionKey($"Class-{classSimple.code}"));
  1292. if (response.Status == 200)
  1293. {
  1294. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  1295. Class cla = json.ToObject<Class>();
  1296. Class newCla = new Class();
  1297. newCla.id = cla.id;
  1298. newCla.code = cla.pk + "-" + code;
  1299. newCla.name = classSimple.name;
  1300. // newCla.scope = classSimple.scope;
  1301. /*foreach (StudentSimple student in cla.students)
  1302. {
  1303. StudentSimple studentSimple = new StudentSimple();
  1304. studentSimple.id = student.id;
  1305. studentSimple.name = student.name;
  1306. studentSimple.no = student.no;
  1307. newCla.students.Add(studentSimple);
  1308. }*/
  1309. newCla.teacher.id = classSimple.teacher.id;
  1310. newCla.teacher.name = classSimple.teacher.name;
  1311. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(newCla, new PartitionKey($"Class-{code}"));
  1312. classSimple.code = code;
  1313. }
  1314. else
  1315. {
  1316. Class cla = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Class>(classSimple.id, new PartitionKey($"Class-{classSimple.code}"));
  1317. Class newCla = new Class();
  1318. newCla.id = cla.id;
  1319. newCla.code = cla.pk + "-" + code;
  1320. newCla.name = classSimple.name;
  1321. //newCla.scope = classSimple.scope;
  1322. //newCla.students = cla.students;
  1323. newCla.teacher.id = classSimple.teacher.id;
  1324. newCla.teacher.name = classSimple.teacher.name;
  1325. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(newCla, new PartitionKey($"Class-{code}"));
  1326. }
  1327. }
  1328. }
  1329. }
  1330. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(course, course.id, new PartitionKey($"Course-{code}"));
  1331. }
  1332. return Ok(new { course });
  1333. }
  1334. catch (Exception ex)
  1335. {
  1336. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},teacherCourse/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  1337. return BadRequest();
  1338. }
  1339. }
  1340. [ProducesDefaultResponseType]
  1341. //[AuthToken(Roles = "Teacher")]
  1342. [HttpPost("find-teacher-course")]
  1343. public async Task<IActionResult> FindTeacherCourse(JsonElement requert)
  1344. {
  1345. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  1346. //if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  1347. var client = _azureCosmos.GetCosmosClient();
  1348. List<object> courses = new List<object>();
  1349. var query = $"select c.code,c.id,c.name,c.subjectId,c.periodId,c.scope,c.notice,c.classes from c ";
  1350. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  1351. {
  1352. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1353. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1354. {
  1355. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  1356. {
  1357. courses.Add(obj.ToObject<object>());
  1358. }
  1359. }
  1360. }
  1361. return Ok(new { courses });
  1362. }
  1363. /// <summary>
  1364. /// 查询执教助教的课程班级
  1365. /// </summary>
  1366. /// <param name="request"></param>
  1367. /// <returns></returns>
  1368. [ProducesDefaultResponseType]
  1369. //[AuthToken(Roles = "Teacher")]
  1370. [HttpPost("find-teach-class")]
  1371. public async Task<IActionResult> FindPlanClass(JsonElement request)
  1372. {
  1373. HashSet<string> data = new HashSet<string>();
  1374. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  1375. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  1376. var client = _azureCosmos.GetCosmosClient();
  1377. //List<object> courses = new List<object>();
  1378. List<string> classIds = new List<string>();
  1379. List<(string id, string scope)> listClassInfo = new List<(string id, string scope)>();
  1380. var query = $"select distinct c.scope,A0.stulist id from c join A0 in c.schedule where A0.teacherId = '{id}'";
  1381. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  1382. {
  1383. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1384. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1385. {
  1386. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1387. while (accounts.MoveNext())
  1388. {
  1389. JsonElement account = accounts.Current;
  1390. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1391. {
  1392. continue;
  1393. }
  1394. classIds.Add(account.GetProperty("id").GetString());
  1395. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1396. }
  1397. }
  1398. }
  1399. var querySchool = $"select distinct c.scope,A0.classId id from c join A0 in c.schedule where A0.teacherId = '{id}'";
  1400. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  1401. {
  1402. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1403. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1404. {
  1405. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1406. while (accounts.MoveNext())
  1407. {
  1408. JsonElement account = accounts.Current;
  1409. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1410. {
  1411. continue;
  1412. }
  1413. classIds.Add(account.GetProperty("id").GetString());
  1414. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1415. }
  1416. }
  1417. }
  1418. //List<object> coursesBySchool = new List<object>();
  1419. //var queryBySchool = $"select distinct c.id,c.name,c.scope from c join A0 in c.courses join A1 in A0.teachers where A1.id = '{id}' ";
  1420. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  1421. {
  1422. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1423. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1424. {
  1425. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1426. while (accounts.MoveNext())
  1427. {
  1428. JsonElement account = accounts.Current;
  1429. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1430. {
  1431. continue;
  1432. }
  1433. classIds.Add(account.GetProperty("id").GetString());
  1434. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1435. }
  1436. }
  1437. }
  1438. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  1439. {
  1440. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1441. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1442. {
  1443. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1444. while (accounts.MoveNext())
  1445. {
  1446. JsonElement account = accounts.Current;
  1447. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1448. {
  1449. continue;
  1450. }
  1451. classIds.Add(account.GetProperty("id").GetString());
  1452. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1453. }
  1454. }
  1455. }
  1456. List<(string id, string name)> listClassList = new List<(string id, string name)>();
  1457. if (classIds.Count > 0)
  1458. {
  1459. //List<(string id, string name)> listClassList = new List<(string id, string name)>();
  1460. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(
  1461. queryText: $"select c.id,c.name from c where c.id in ({string.Join(",", classIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{code}") }))
  1462. {
  1463. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1464. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1465. {
  1466. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1467. while (accounts.MoveNext())
  1468. {
  1469. JsonElement account = accounts.Current;
  1470. listClassList.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
  1471. //stuIds.Add(account.GetProperty("id").GetString());
  1472. }
  1473. }
  1474. }
  1475. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(
  1476. queryText: $"select c.id,c.name from c where c.id in ({string.Join(",", classIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList-{code}") }))
  1477. {
  1478. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1479. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1480. {
  1481. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1482. while (accounts.MoveNext())
  1483. {
  1484. JsonElement account = accounts.Current;
  1485. listClassList.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
  1486. //stuIds.Add(account.GetProperty("id").GetString());
  1487. }
  1488. }
  1489. }
  1490. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(
  1491. queryText: $"select c.id,c.name from c where c.id in ({string.Join(",", classIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList") }))
  1492. {
  1493. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1494. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1495. {
  1496. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1497. while (accounts.MoveNext())
  1498. {
  1499. JsonElement account = accounts.Current;
  1500. listClassList.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
  1501. //stuIds.Add(account.GetProperty("id").GetString());
  1502. }
  1503. }
  1504. }
  1505. }
  1506. var courses = listClassInfo.Select(o =>
  1507. new
  1508. {
  1509. o.id,
  1510. o.scope,
  1511. name = listClassList.FirstOrDefault(c => c.id == o.id).name,
  1512. }
  1513. );
  1514. //courses.Add(grpBalance);
  1515. //courses = courses.Distinct().ToList();
  1516. return Ok(new { courses });
  1517. }
  1518. public class Student
  1519. {
  1520. public string id { get; set; }
  1521. public string name { get; set; }
  1522. public string scope { get; set; }
  1523. }
  1524. public class ListDistinct : IEqualityComparer<Student>
  1525. {
  1526. public bool Equals(Student s1, Student s2)
  1527. {
  1528. return (s1.id == s2.id);
  1529. }
  1530. public int GetHashCode(Student s)
  1531. {
  1532. return s == null ? 0 : s.ToString().GetHashCode();
  1533. }
  1534. }
  1535. }
  1536. public class BatchOption
  1537. {
  1538. public List<string> ids { get; set; }
  1539. public string code { get; set; }
  1540. public string scope { get; set; }
  1541. }
  1542. }