CourseController.cs 69 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258
  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.Helper.Common.StringHelper;
  21. using System.Dynamic;
  22. using Azure;
  23. using TEAMModelOS.SDK.Models.Cosmos.Common;
  24. using Azure.Messaging.ServiceBus;
  25. using Microsoft.Extensions.Configuration;
  26. using TEAMModelOS.Filter;
  27. using Azure.Storage.Blobs.Models;
  28. using HTEXLib.COMM.Helpers;
  29. using Microsoft.AspNetCore.Authorization;
  30. namespace TEAMModelOS.Controllers
  31. {
  32. [ProducesResponseType(StatusCodes.Status200OK)]
  33. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  34. [Route("school/course")]
  35. [ApiController]
  36. public class CourseController : ControllerBase
  37. {
  38. private AzureCosmosFactory _azureCosmos;
  39. private readonly DingDing _dingDing;
  40. private readonly Option _option;
  41. private readonly AzureServiceBusFactory _serviceBus;
  42. private readonly AzureStorageFactory _azureStorage;
  43. public IConfiguration _configuration { get; set; }
  44. public CourseController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, AzureServiceBusFactory serviceBus, AzureStorageFactory azureStorage, IConfiguration configuration)
  45. {
  46. _azureCosmos = azureCosmos;
  47. _dingDing = dingDing;
  48. _option = option?.Value;
  49. _serviceBus = serviceBus;
  50. _configuration = configuration;
  51. _azureStorage = azureStorage;
  52. }
  53. /// <summary>
  54. /// 更新保存课程
  55. /// </summary>
  56. /// <param name="request"></param>
  57. /// <returns></returns>
  58. [ProducesDefaultResponseType]
  59. [AuthToken(Roles = "teacher")]
  60. [HttpPost("upsert")]
  61. [Authorize(Roles = "IES")]
  62. public async Task<IActionResult> upsert(JsonElement requert)
  63. {
  64. try
  65. {
  66. (string id, _, _, string school) = HttpContext.GetAuthTokenInfo();
  67. Course course = new Course();
  68. if (!requert.TryGetProperty("course", out JsonElement _course)) return BadRequest();
  69. if (!requert.TryGetProperty("option", out JsonElement option)) return BadRequest();
  70. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  71. course = _course.ToObject<Course>();
  72. var client = _azureCosmos.GetCosmosClient();
  73. course.pk = typeof(Course).Name;
  74. if (course.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
  75. {
  76. course.school = school;
  77. course.creatorId = id;
  78. }
  79. else
  80. {
  81. course.creatorId = id;
  82. }
  83. string code = course.code;
  84. course.code = typeof(Course).Name + "-" + course.code;
  85. if (option.ToString().Equals("insert"))
  86. {
  87. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  88. {
  89. var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(course.id, new PartitionKey($"Course-{code}"));
  90. if (response.Status == 200)
  91. {
  92. return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  93. }
  94. else
  95. {
  96. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = course.school, creatorId = course.creatorId };
  97. courseChange.addClass = course.schedule.Select(x => x.classId).ToList();
  98. courseChange.addList = course.schedule.Select(x => x.stulist).ToList();
  99. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  100. messageBlob.ApplicationProperties.Add("name", "Course");
  101. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  102. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  103. course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync(course, new PartitionKey($"Course-{code}"));
  104. }
  105. }
  106. else
  107. {
  108. var response = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemStreamAsync(course.id, new PartitionKey($"Course-{code}"));
  109. if (response.Status == 200)
  110. {
  111. return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  112. }
  113. else
  114. {
  115. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = course.school, creatorId = course.creatorId };
  116. courseChange.addClass = course.schedule.Select(x => x.classId).ToList();
  117. courseChange.addList = course.schedule.Select(x => x.stulist).ToList();
  118. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  119. messageBlob.ApplicationProperties.Add("name", "Course");
  120. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  121. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  122. course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").CreateItemAsync(course, new PartitionKey($"Course-{code}"));
  123. }
  124. }
  125. }
  126. else
  127. {
  128. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  129. {
  130. Course odlCourse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<Course>(course.id, new PartitionKey($"Course-{code}"));
  131. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = code };
  132. var oldCls = odlCourse.schedule.Select(x => x.classId).ToList();
  133. var oldLst = odlCourse.schedule.Select(x => x.stulist).ToList();
  134. var newCls = course.schedule.Select(x => x.classId).ToList();
  135. var newLst = course.schedule.Select(x => x.stulist).ToList();
  136. List<string> addCls = new List<string>();
  137. List<string> addLst = new List<string>();
  138. List<string> delCls = new List<string>();
  139. List<string> delLst = new List<string>();
  140. oldCls.ForEach(x =>
  141. {
  142. if (!newCls.Contains(x))
  143. {
  144. delCls.Add(x);
  145. }
  146. });
  147. newCls.ForEach(x =>
  148. {
  149. if (!oldCls.Contains(x))
  150. {
  151. addCls.Add(x);
  152. }
  153. });
  154. oldLst.ForEach(x =>
  155. {
  156. if (!newLst.Contains(x))
  157. {
  158. delLst.Add(x);
  159. }
  160. });
  161. newLst.ForEach(x =>
  162. {
  163. if (!oldLst.Contains(x))
  164. {
  165. addLst.Add(x);
  166. }
  167. });
  168. courseChange.addClass = addCls;
  169. courseChange.addList = addLst;
  170. courseChange.delClass = delCls;
  171. courseChange.delList = delLst;
  172. course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(course, course.id, new PartitionKey($"Course-{code}"));
  173. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  174. messageBlob.ApplicationProperties.Add("name", "Course");
  175. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  176. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  177. }
  178. else
  179. {
  180. Course odlCourse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Course>(course.id, new PartitionKey($"Course-{code}"));
  181. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, creatorId = code };
  182. var oldCls = odlCourse.schedule.Select(x => x.classId).ToList();
  183. var oldLst = odlCourse.schedule.Select(x => x.stulist).ToList();
  184. var newCls = course.schedule.Select(x => x.classId).ToList();
  185. var newLst = course.schedule.Select(x => x.stulist).ToList();
  186. List<string> addCls = new List<string>();
  187. List<string> addLst = new List<string>();
  188. List<string> delCls = new List<string>();
  189. List<string> delLst = new List<string>();
  190. oldCls.ForEach(x =>
  191. {
  192. if (!newCls.Contains(x))
  193. {
  194. delCls.Add(x);
  195. }
  196. });
  197. newCls.ForEach(x =>
  198. {
  199. if (!oldCls.Contains(x))
  200. {
  201. addCls.Add(x);
  202. }
  203. });
  204. oldLst.ForEach(x =>
  205. {
  206. if (!newLst.Contains(x))
  207. {
  208. delLst.Add(x);
  209. }
  210. });
  211. newLst.ForEach(x =>
  212. {
  213. if (!oldLst.Contains(x))
  214. {
  215. addLst.Add(x);
  216. }
  217. });
  218. courseChange.addClass = addCls;
  219. courseChange.addList = addLst;
  220. courseChange.delClass = delCls;
  221. courseChange.delList = delLst;
  222. course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(course, course.id, new PartitionKey($"Course-{code}"));
  223. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  224. messageBlob.ApplicationProperties.Add("name", "Course");
  225. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  226. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  227. }
  228. }
  229. return Ok(new { course });
  230. }
  231. catch (Exception ex)
  232. {
  233. await _dingDing.SendBotMsg($"OS,{_option.Location},course/upsert()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
  234. return BadRequest();
  235. }
  236. }
  237. [ProducesDefaultResponseType]
  238. [HttpPost("check")]
  239. [Authorize(Roles = "IES")]
  240. public async Task<IActionResult> check(JsonElement json)
  241. {
  242. try
  243. {
  244. if (!json.TryGetProperty("tId", out JsonElement tId)) return BadRequest();
  245. if (!json.TryGetProperty("timeId", out JsonElement timeId)) return BadRequest();
  246. if (!json.TryGetProperty("code", out JsonElement code)) return BadRequest();
  247. if (!json.TryGetProperty("week", out JsonElement week)) return BadRequest();
  248. if (!json.TryGetProperty("cId", out JsonElement cId)) return BadRequest();
  249. var client = _azureCosmos.GetCosmosClient();
  250. var query = $"SELECT A0.room,A0.classId,A0.teacherId,A0.stulist,A0.time FROM c join A0 in c.schedule join A1 in A0.time where A0.teacherId = '{tId}'and A1.id = '{timeId}' and A1.week = '{week}' ";
  251. List<Schedule> teachers = new();
  252. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  253. {
  254. using var jsonCheck = await JsonDocument.ParseAsync(item.ContentStream);
  255. if (jsonCheck.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  256. {
  257. foreach (var obj in jsonCheck.RootElement.GetProperty("Documents").EnumerateArray())
  258. {
  259. teachers.Add(obj.ToObject<Schedule>());
  260. }
  261. }
  262. }
  263. if (teachers.Count > 0)
  264. {
  265. return Ok(new { msg = "该教师已有课程安排", code = 1 });
  266. }
  267. else
  268. {
  269. var queryClass = $"SELECT A0.room,A0.classId,A0.teacherId,A0.stulist,A0.time FROM c join A0 in c.schedule join A1 in A0.time where A1.id = '{timeId}' and A1.week = '{week}' and (A0.classId = '{cId}' or A0.stulist = '{cId}')";
  270. List<Schedule> courses = new();
  271. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: queryClass, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  272. {
  273. using var jsonCheck = await JsonDocument.ParseAsync(item.ContentStream);
  274. if (jsonCheck.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  275. {
  276. foreach (var obj in jsonCheck.RootElement.GetProperty("Documents").EnumerateArray())
  277. {
  278. courses.Add(obj.ToObject<Schedule>());
  279. }
  280. }
  281. }
  282. if (courses.Count > 0)
  283. {
  284. return Ok(new { msg = "该名单已有课程安排", code = 2 });
  285. }
  286. }
  287. return Ok(new { code = 0 });
  288. }
  289. catch (Exception ex)
  290. {
  291. await _dingDing.SendBotMsg($"OS,{_option.Location},course/check()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
  292. return BadRequest();
  293. }
  294. }
  295. /// <summary>
  296. /// 查询课程
  297. /// </summary>
  298. /// <param name="request"></param>
  299. /// <returns></returns>
  300. [ProducesDefaultResponseType]
  301. //[AuthToken(Roles = "teacher")]
  302. [HttpPost("find")]
  303. [Authorize(Roles = "IES")]
  304. public async Task<IActionResult> Find(JsonElement requert)
  305. {
  306. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  307. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  308. requert.TryGetProperty("period", out JsonElement _period) ;
  309. try
  310. {
  311. var client = _azureCosmos.GetCosmosClient();
  312. List<object> courses = new List<object>();
  313. /*string continuationToken = string.Empty;
  314. string token = default;
  315. //是否需要进行分页查询,默认不分页
  316. //bool iscontinuation = false;
  317. if (requert.TryGetProperty("token", out JsonElement token_1))
  318. {
  319. token = token_1.GetString();
  320. //iscontinuation = true;
  321. };
  322. //默认不指定返回大小
  323. int? topcout = null;
  324. if (requert.TryGetProperty("count", out JsonElement jcount))
  325. {
  326. if (!jcount.ValueKind.Equals(JsonValueKind.Undefined) && !jcount.ValueKind.Equals(JsonValueKind.Null) && jcount.TryGetInt32(out int data))
  327. {
  328. topcout = data;
  329. }
  330. }*/
  331. var query = $"select c.code,c.id,c.no,c.name,c.period,c.subject,c.scope from c";
  332. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  333. {
  334. string sql = query;
  335. if (!string.IsNullOrWhiteSpace($"{_period}")) {
  336. sql = $"{sql} where c.period.id ='{_period}'";
  337. }
  338. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: sql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code.GetString()}") }))
  339. {
  340. //continuationToken = item.GetContinuationToken();
  341. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  342. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  343. {
  344. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  345. {
  346. courses.Add(obj.ToObject<object>());
  347. }
  348. }
  349. //break;
  350. }
  351. }
  352. else
  353. {
  354. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code.GetString()}") }))
  355. {
  356. //continuationToken = item.GetContinuationToken();
  357. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  358. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  359. {
  360. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  361. {
  362. courses.Add(obj.ToObject<object>());
  363. }
  364. }
  365. //break;
  366. }
  367. if (requert.TryGetProperty("schoolId", out JsonElement schoolId))
  368. {
  369. 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}'";
  370. if (!string.IsNullOrWhiteSpace($"{_period}"))
  371. {
  372. querySchool = $"{querySchool} and c.period.id ='{_period}'";
  373. }
  374. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{schoolId.GetString()}") }))
  375. {
  376. //continuationToken = item.GetContinuationToken();
  377. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  378. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  379. {
  380. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  381. {
  382. courses.Add(obj.ToObject<object>());
  383. }
  384. }
  385. //break;
  386. }
  387. };
  388. }
  389. return Ok(new { courses, courses.Count });
  390. }
  391. catch (Exception ex)
  392. {
  393. await _dingDing.SendBotMsg($"OS,{_option.Location},course/find()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
  394. return BadRequest();
  395. }
  396. /* List<Course> data = new List<Course>();
  397. if (StringHelper.getKeyCount(request) > 0) {
  398. data = await _azureCosmos.FindByDict<Course>(request);
  399. }
  400. return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  401. }
  402. /// <summary>
  403. /// 查询课程
  404. /// </summary>
  405. /// <param name="request"></param>
  406. /// <returns></returns>
  407. [ProducesDefaultResponseType]
  408. //[AuthToken(Roles = "teacher")]
  409. [HttpPost("find-all-by-teacher")]
  410. [Authorize(Roles = "IES")]
  411. public async Task<IActionResult> FindByTeacher(JsonElement requert)
  412. {
  413. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  414. //if (!requert.TryGetProperty("tId", out JsonElement tId)) return BadRequest();
  415. //if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  416. try
  417. {
  418. var client = _azureCosmos.GetCosmosClient();
  419. List<object> courses = new List<object>();
  420. List<(string id, string name, string scope)> teacherCourse = new();
  421. List<(string id, string name, string scope)> tcCourse = new();
  422. List<(string id, string name, string scope, List<(string id, string name, string type)> stuName)> ps = new();
  423. var query = $"select c.id,c.name,c.scope from c";
  424. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code.GetString()}") }))
  425. {
  426. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  427. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  428. {
  429. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  430. while (accounts.MoveNext())
  431. {
  432. JsonElement account = accounts.Current;
  433. teacherCourse.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString(), account.GetProperty("scope").GetString()));
  434. }
  435. }
  436. }
  437. foreach ((string s, string n, string sc) in teacherCourse)
  438. {
  439. List<(string id, string name, string type)> sName = new();
  440. List<Schedule> schedules = new List<Schedule>();
  441. var querySc = $"SELECT A0.room,A0.classId,A0.teacherId,A0.stulist,A0.time FROM c join A0 in c.schedule where c.id = '{s}'";
  442. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Schedule>(queryText: querySc, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code.GetString()}") }))
  443. {
  444. schedules.Add(item);
  445. }
  446. if (schedules.Count > 0)
  447. {
  448. var queryInfo = $"select c.id ,c.name from c where c.id in ({string.Join(",", schedules.Select(o => $"'{o.stulist}'"))})";
  449. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<GroupList>(queryText: queryInfo, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList") }))
  450. {
  451. sName.Add((item.id, item.name, "stuList"));
  452. }
  453. }
  454. ps.Add((s, n, sc, sName));
  455. }
  456. if (requert.TryGetProperty("schoolId", out JsonElement schoolId))
  457. {
  458. var querySchool = $"select distinct c.code,c.id,c.no,c.name,c.scope from c join A0 in c.schedule where A0.teacherId = '{code}'";
  459. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{schoolId.GetString()}") }))
  460. {
  461. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  462. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  463. {
  464. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  465. while (accounts.MoveNext())
  466. {
  467. JsonElement account = accounts.Current;
  468. tcCourse.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString(), account.GetProperty("scope").GetString()));
  469. }
  470. }
  471. }
  472. foreach ((string s, string n, string sc) in tcCourse)
  473. {
  474. List<Schedule> schedules = new List<Schedule>();
  475. var querySc = $"SELECT A0.room,A0.classId,A0.teacherId,A0.stulist,A0.time FROM c join A0 in c.schedule where c.id = '{s}' and A0.teacherId = '{code}'";
  476. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Schedule>(queryText: querySc, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{schoolId.GetString()}") }))
  477. {
  478. schedules.Add(item);
  479. }
  480. List<(string id, string name, string type)> sName = new();
  481. if (schedules.Count > 0)
  482. {
  483. var queryInfo = $"select c.id ,c.name from c where c.id in ({string.Join(",", schedules.Select(o => $"'{o.stulist}'"))})";
  484. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(queryText: queryInfo, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{schoolId.GetString()}") }))
  485. {
  486. sName.Add((item.id, item.name, "stuList"));
  487. }
  488. var queryClass = $"select c.id ,c.name from c where c.id in ({string.Join(",", schedules.Select(o => $"'{o.classId}'"))})";
  489. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: queryClass, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{schoolId.GetString()}") }))
  490. {
  491. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  492. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  493. {
  494. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  495. while (accounts.MoveNext())
  496. {
  497. JsonElement account = accounts.Current;
  498. sName.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString(), "class"));
  499. }
  500. }
  501. }
  502. }
  503. ps.Add((s, n, sc, sName));
  504. }
  505. }
  506. var obj = ps.Select(p => new
  507. {
  508. p.id,
  509. p.name,
  510. p.scope,
  511. classes = p.stuName.Select(s => new { s.id, s.name, s.type })
  512. });
  513. return Ok(new { obj });
  514. }
  515. catch (Exception ex)
  516. {
  517. await _dingDing.SendBotMsg($"OS,{_option.Location},course/find-all-by-teacher()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
  518. return BadRequest();
  519. }
  520. }
  521. /// <summary>
  522. /// 查询课程详情
  523. /// </summary>
  524. /// <param name="request"></param>
  525. /// <returns></returns>
  526. [ProducesDefaultResponseType]
  527. //[AuthToken(Roles = "teacher")]
  528. [HttpPost("find-summary")]
  529. [Authorize(Roles = "IES")]
  530. public async Task<IActionResult> FindSummary(JsonElement requert)
  531. {
  532. if (!requert.TryGetProperty("code", out JsonElement school_code)) return BadRequest();
  533. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  534. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  535. try
  536. {
  537. var client = _azureCosmos.GetCosmosClient();
  538. List<object> courses = new List<object>();
  539. List<Course> courseList = new List<Course>();
  540. var query = $"select value(c) from c where c.id = '{id}'";
  541. //List<(string id, string code, string name)> listCourse = new List<(string id, string code, string name)>();
  542. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  543. {
  544. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code.GetString()}") }))
  545. {
  546. courseList.Add(item);
  547. }
  548. }
  549. else
  550. {
  551. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code.GetString()}") }))
  552. {
  553. courseList.Add(item);
  554. }
  555. }
  556. foreach (Course course in courseList)
  557. {
  558. dynamic courseExtobj = new ExpandoObject();
  559. courseExtobj.id = course.id;
  560. courseExtobj.name = course.name;
  561. courseExtobj.id = course.id;
  562. courseExtobj.subject = course.subject;
  563. courseExtobj.desc = course.desc;
  564. courseExtobj.period = course.period;
  565. courseExtobj.scope = course.scope;
  566. courseExtobj.no = course.no;
  567. courseExtobj.code = course.code;
  568. List<object> scheList = new List<object>();
  569. foreach (Schedule schedule in course.schedule)
  570. {
  571. dynamic scheduleExtobj = new ExpandoObject();
  572. scheduleExtobj.classId = schedule.classId;
  573. scheduleExtobj.teacherId = schedule.teacherId;
  574. if (!string.IsNullOrEmpty(schedule.teacherId))
  575. {
  576. var response = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemStreamAsync(schedule.teacherId, new PartitionKey("Base"));
  577. if (response.Status == 200)
  578. {
  579. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  580. Teacher teacher = json.ToObject<Teacher>();
  581. scheduleExtobj.teacherName = teacher.name;
  582. }
  583. }
  584. scheduleExtobj.stulist = schedule.stulist;
  585. scheduleExtobj.time = schedule.time;
  586. scheduleExtobj.room = schedule.room;
  587. scheList.Add(scheduleExtobj);
  588. }
  589. courseExtobj.schedule = scheList;
  590. courses.Add(courseExtobj);
  591. }
  592. return Ok(new { courses, courses.Count });
  593. }
  594. catch (Exception ex)
  595. {
  596. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},course/find-summary()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
  597. return BadRequest();
  598. }
  599. /* List<Course> data = new List<Course>();
  600. if (StringHelper.getKeyCount(request) > 0) {
  601. data = await _azureCosmos.FindByDict<Course>(request);
  602. }
  603. return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  604. }
  605. /// <summary>
  606. /// 删除课程
  607. /// </summary>
  608. /// <param name="request"></param>
  609. /// <returns></returns>
  610. [ProducesDefaultResponseType]
  611. //[AuthToken(Roles = "teacher")]
  612. [HttpPost("delete")]
  613. [Authorize(Roles = "IES")]
  614. public async Task<IActionResult> Delete(JsonElement request)
  615. {
  616. try
  617. {
  618. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  619. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  620. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  621. //string school_code = code.ToString().Substring(typeof(Course).Name.Length + 1);
  622. var client = _azureCosmos.GetCosmosClient();
  623. if (scope.ToString().Equals("school"))
  624. {
  625. Course course = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<Course>(id.ToString(), new PartitionKey($"Course-{code}"));
  626. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = course.school, creatorId = course.creatorId };
  627. courseChange.delClass = course.schedule.Select(x => x.classId).ToList();
  628. courseChange.delList = course.schedule.Select(x => x.stulist).ToList();
  629. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  630. messageBlob.ApplicationProperties.Add("name", "Course");
  631. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  632. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  633. await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Course-{code}"));
  634. }
  635. else
  636. {
  637. Course course = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Course>(id.ToString(), new PartitionKey($"Course-{code}"));
  638. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = course.school, creatorId = course.creatorId };
  639. courseChange.delClass = course.schedule.Select(x => x.classId).ToList();
  640. courseChange.delList = course.schedule.Select(x => x.stulist).ToList();
  641. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  642. messageBlob.ApplicationProperties.Add("name", "Course");
  643. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  644. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  645. await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Course-{code}"));
  646. }
  647. return Ok(new { id });
  648. }
  649. catch (Exception ex)
  650. {
  651. await _dingDing.SendBotMsg($"CN,{_option.Location},course/delete()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  652. return BadRequest();
  653. }
  654. }
  655. /// <summary>
  656. /// 删除课程
  657. /// </summary>
  658. /// <param name="request"></param>
  659. /// <returns></returns>
  660. [ProducesDefaultResponseType]
  661. //[AuthToken(Roles = "teacher")]
  662. [HttpPost("delete-all")]
  663. [Authorize(Roles = "IES")]
  664. public async Task<IActionResult> DeleteAll(BatchOption request)
  665. {
  666. try
  667. {
  668. /* if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  669. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();*/
  670. var client = _azureCosmos.GetCosmosClient();
  671. if (request == null) return BadRequest();
  672. string school_code = request.code;
  673. if (request.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
  674. {
  675. List<Response> res = await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemsStreamAsync(request.ids, $"Course-{school_code}");
  676. }
  677. else
  678. {
  679. List<Response> res = await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemsStreamAsync(request.ids, $"Course-{school_code}");
  680. }
  681. return Ok(new { ids = request.ids });
  682. }
  683. catch (Exception ex)
  684. {
  685. await _dingDing.SendBotMsg($"CN,{_option.Location},course/delete()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  686. return BadRequest();
  687. }
  688. }
  689. /// <summary>
  690. /// 更新保存排课管理
  691. /// </summary>
  692. /// <param name="request"></param>
  693. /// <returns></returns>
  694. //[ProducesDefaultResponseType]
  695. ////[AuthToken(Roles = "Teacher")]
  696. //[HttpPost("upsert-management")]
  697. //public async Task<IActionResult> upsertCourseManagement(CourseManagement requert)
  698. //{
  699. // try
  700. // {
  701. // CourseManagement course = new CourseManagement();
  702. // //course = room.ToObject<CourseManagement>();
  703. // var client = _azureCosmos.GetCosmosClient();
  704. // string code = requert.code;
  705. // requert.code = "CourseManagement-" + requert.code;
  706. // /* if (requert.scope.Equals) {
  707. // }*/
  708. // var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(requert.id, new PartitionKey($"CourseManagement-{code}"));
  709. // if (response.Status == 200)
  710. // {
  711. // course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(requert, requert.id, new PartitionKey($"CourseManagement-{code}"));
  712. // }
  713. // else
  714. // {
  715. // course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync(requert, new PartitionKey($"CourseManagement-{code}"));
  716. // }
  717. // return Ok(new { course });
  718. // }
  719. // catch (Exception ex)
  720. // {
  721. // await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},management/upsert()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  722. // return BadRequest();
  723. // }
  724. //}
  725. /// <summary>
  726. /// 查询排课管理
  727. /// </summary>
  728. /// <param name="request"></param>
  729. /// <returns></returns>
  730. //[ProducesDefaultResponseType]
  731. ////[AuthToken(Roles = "Teacher")]
  732. //[HttpPost("find-management")]
  733. //public async Task<IActionResult> FindManagement(JsonElement requert)
  734. //{
  735. // //if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  736. // if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  737. // var client = _azureCosmos.GetCosmosClient();
  738. // List<object> courses = new List<object>();
  739. // StringBuilder sql = new StringBuilder();
  740. // sql.Append("select c.code,c.id,c.name,c.courses,c.scope,c.teacher from c ");
  741. // Dictionary<string, object> dict = new Dictionary<string, object>();
  742. // var emobj = requert.EnumerateObject();
  743. // while (emobj.MoveNext())
  744. // {
  745. // dict[emobj.Current.Name] = emobj.Current.Value;
  746. // }
  747. // //处理code
  748. // if (dict.TryGetValue("code", out object _))
  749. // {
  750. // dict.Remove("code");
  751. // }
  752. // AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  753. // await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  754. // {
  755. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  756. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  757. // {
  758. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  759. // {
  760. // courses.Add(obj.ToObject<object>());
  761. // }
  762. // }
  763. // }
  764. // return Ok(new { courses });
  765. //}
  766. //[ProducesDefaultResponseType]
  767. ////[AuthToken(Roles = "Teacher")]
  768. //[HttpPost("find-course")]
  769. //public async Task<IActionResult> FindCourse(JsonElement requert)
  770. //{
  771. // if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  772. // if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  773. // var client = _azureCosmos.GetCosmosClient();
  774. // List<object> courses = new List<object>();
  775. // 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}' ";
  776. // await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  777. // {
  778. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  779. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  780. // {
  781. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  782. // {
  783. // courses.Add(obj.ToObject<object>());
  784. // }
  785. // }
  786. // }
  787. // return Ok(new { courses });
  788. //}
  789. [ProducesDefaultResponseType]
  790. //[AuthToken(Roles = "teacher")]
  791. [HttpPost("find-course-by-room")]
  792. [Authorize(Roles = "IES")]
  793. public async Task<IActionResult> FindCourseByRoom(JsonElement requert)
  794. {
  795. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  796. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  797. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  798. var client = _azureCosmos.GetCosmosClient();
  799. HashSet<Course> courseList = new HashSet<Course>();
  800. List<object> courses = new List<object>();
  801. //var query = $"select c.code,c.id,c.name from c join A0 in c.schedule where A0.classId = '{id}'";
  802. //此处存在不同老师在同一间教室上相同的课程
  803. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  804. {
  805. var query = $"select distinct value(c) from c join A0 in c.schedule where A0.room = '{id}'";
  806. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  807. {
  808. courseList.Add(item);
  809. }
  810. }
  811. else
  812. {
  813. var query = $"select distinct value(c) from c join A0 in c.schedule where A0.room = '{id}'";
  814. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  815. {
  816. courseList.Add(item);
  817. }
  818. }
  819. HashSet<string> teacherIds = new HashSet<string>();
  820. foreach (Course course in courseList)
  821. {
  822. foreach (Schedule schedule in course.schedule)
  823. {
  824. teacherIds.Add(schedule.teacherId);
  825. }
  826. }
  827. List<(string id, string name)> teachers = new List<(string id, string name)>();
  828. if (teacherIds.Count > 0)
  829. {
  830. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(
  831. 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") }))
  832. {
  833. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  834. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  835. {
  836. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  837. while (accounts.MoveNext())
  838. {
  839. JsonElement account = accounts.Current;
  840. teachers.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
  841. }
  842. }
  843. }
  844. }
  845. foreach (Course course in courseList)
  846. {
  847. dynamic courseExtobj = new ExpandoObject();
  848. courseExtobj.id = course.id;
  849. courseExtobj.name = course.name;
  850. courseExtobj.subject = course.subject;
  851. courseExtobj.desc = course.desc;
  852. courseExtobj.period = course.period;
  853. courseExtobj.scope = course.scope;
  854. courseExtobj.no = course.no;
  855. courseExtobj.code = course.code;
  856. courseExtobj.pk = course.pk;
  857. List<object> scheList = new List<object>();
  858. foreach (Schedule schedule in course.schedule)
  859. {
  860. dynamic scheduleExtobj = new ExpandoObject();
  861. scheduleExtobj.classId = schedule.classId;
  862. scheduleExtobj.teacherId = schedule.teacherId;
  863. if (!string.IsNullOrEmpty(schedule.teacherId))
  864. {
  865. scheduleExtobj.teacherName = teachers.FirstOrDefault(c => c.id == schedule.teacherId).name;
  866. }
  867. scheduleExtobj.stulist = schedule.stulist;
  868. scheduleExtobj.time = schedule.time;
  869. scheduleExtobj.room = schedule.room;
  870. scheList.Add(scheduleExtobj);
  871. }
  872. courseExtobj.schedule = scheList;
  873. courses.Add(courseExtobj);
  874. }
  875. return Ok(new { courses });
  876. }
  877. //[ProducesDefaultResponseType]
  878. ////[AuthToken(Roles = "Teacher")]
  879. //[HttpPost("upsert-notice")]
  880. //public async Task<IActionResult> upsertNotice(JsonElement requert)
  881. //{
  882. // if (!requert.TryGetProperty("courseId", out JsonElement courseId)) return BadRequest();
  883. // if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  884. // if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  885. // if (!requert.TryGetProperty("notice", out JsonElement notice)) return BadRequest();
  886. // if (!requert.TryGetProperty("A1", out JsonElement teacherInfo)) return BadRequest();
  887. // Teachers teachers = teacherInfo.ToObject<Teachers>();
  888. // var client = _azureCosmos.GetCosmosClient();
  889. // List<CourseManagement> courseManagements = new List<CourseManagement>();
  890. // StringBuilder sql = new StringBuilder();
  891. // sql.Append("select value(c) from c");
  892. // Dictionary<string, object> dict = new Dictionary<string, object>();
  893. // //dict.Add("id", id);
  894. // dict.Add("courses[*].course.id", courseId);
  895. // dict.Add("courses[*].teachers[*].id", teachers.id);
  896. // //dict.Add("id", classroom.id);
  897. // AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  898. // await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  899. // {
  900. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  901. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  902. // {
  903. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  904. // {
  905. // courseManagements.Add(obj.ToObject<CourseManagement>());
  906. // }
  907. // }
  908. // }
  909. // for (int i = 0; i < courseManagements.Count; i++)
  910. // {
  911. // for (int j = 0; j < courseManagements[i].courses.Count; j++)
  912. // {
  913. // if (courseManagements[i].courses[j].course.id.Equals(courseId.ToString()))
  914. // {
  915. // courseManagements[i].courses[j].course.notice = notice.ToString();
  916. // await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(courseManagements[i], courseManagements[i].id, new PartitionKey($"{courseManagements[i].code}"));
  917. // break;
  918. // }
  919. // }
  920. // }
  921. // return Ok(new { id });
  922. //}
  923. [ProducesDefaultResponseType]
  924. //[AuthToken(Roles = "teacher")]
  925. [HttpPost("upsert-teacher-course")]
  926. [Authorize(Roles = "IES")]
  927. public async Task<IActionResult> upsertCourse(JsonElement requert)
  928. {
  929. try
  930. {
  931. TeacherCourse course = new TeacherCourse();
  932. if (!requert.TryGetProperty("course", out JsonElement room)) return BadRequest();
  933. if (!requert.TryGetProperty("option", out JsonElement option)) return BadRequest();
  934. course = room.ToObject<TeacherCourse>();
  935. var client = _azureCosmos.GetCosmosClient();
  936. course.pk = typeof(Course).Name;
  937. string code = course.code;
  938. course.code = typeof(Course).Name + "-" + course.code;
  939. if (option.ToString().Equals("insert"))
  940. {
  941. var response = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemStreamAsync(course.id, new PartitionKey($"Course-{code}"));
  942. if (response.Status == 200)
  943. {
  944. return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  945. }
  946. else
  947. {
  948. course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").CreateItemAsync(course, new PartitionKey($"Course-{code}"));
  949. }
  950. }
  951. else
  952. {
  953. if (course.classes.Count > 0)
  954. {
  955. //TODO 教师创建的个人的校本班级待处理冗余数据
  956. foreach (ClassSimple classSimple in course.classes)
  957. {
  958. if (classSimple.scope.Equals("private", StringComparison.OrdinalIgnoreCase))
  959. {
  960. Class cla = new Class();
  961. cla.id = classSimple.id;
  962. cla.code = cla.pk + "-" + code;
  963. cla.name = classSimple.name;
  964. //cla.scope = classSimple.scope;
  965. cla.teacher.id = classSimple.teacher.id;
  966. cla.teacher.name = classSimple.teacher.name;
  967. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(cla, new PartitionKey($"Class-{code}"));
  968. }
  969. else
  970. {
  971. var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(classSimple.id, new PartitionKey($"Class-{classSimple.code}"));
  972. if (response.Status == 200)
  973. {
  974. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  975. Class cla = json.ToObject<Class>();
  976. Class newCla = new Class();
  977. newCla.id = cla.id;
  978. newCla.code = cla.pk + "-" + code;
  979. newCla.name = classSimple.name;
  980. // newCla.scope = classSimple.scope;
  981. /*foreach (StudentSimple student in cla.students)
  982. {
  983. StudentSimple studentSimple = new StudentSimple();
  984. studentSimple.id = student.id;
  985. studentSimple.name = student.name;
  986. studentSimple.no = student.no;
  987. newCla.students.Add(studentSimple);
  988. }*/
  989. newCla.teacher.id = classSimple.teacher.id;
  990. newCla.teacher.name = classSimple.teacher.name;
  991. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(newCla, new PartitionKey($"Class-{code}"));
  992. classSimple.code = code;
  993. }
  994. else
  995. {
  996. Class cla = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Class>(classSimple.id, new PartitionKey($"Class-{classSimple.code}"));
  997. Class newCla = new Class();
  998. newCla.id = cla.id;
  999. newCla.code = cla.pk + "-" + code;
  1000. newCla.name = classSimple.name;
  1001. //newCla.scope = classSimple.scope;
  1002. //newCla.students = cla.students;
  1003. newCla.teacher.id = classSimple.teacher.id;
  1004. newCla.teacher.name = classSimple.teacher.name;
  1005. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(newCla, new PartitionKey($"Class-{code}"));
  1006. }
  1007. }
  1008. }
  1009. }
  1010. course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(course, course.id, new PartitionKey($"Course-{code}"));
  1011. }
  1012. return Ok(new { course });
  1013. }
  1014. catch (Exception ex)
  1015. {
  1016. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},teacherCourse/upsert()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  1017. return BadRequest();
  1018. }
  1019. }
  1020. [ProducesDefaultResponseType]
  1021. //[AuthToken(Roles = "teacher")]
  1022. [HttpPost("find-teacher-course")]
  1023. [Authorize(Roles = "IES")]
  1024. public async Task<IActionResult> FindTeacherCourse(JsonElement requert)
  1025. {
  1026. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  1027. //if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  1028. var client = _azureCosmos.GetCosmosClient();
  1029. List<object> courses = new List<object>();
  1030. var query = $"select c.code,c.id,c.name,c.subjectId,c.periodId,c.scope,c.notice,c.classes from c ";
  1031. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  1032. {
  1033. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1034. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1035. {
  1036. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  1037. {
  1038. courses.Add(obj.ToObject<object>());
  1039. }
  1040. }
  1041. }
  1042. return Ok(new { courses });
  1043. }
  1044. /// <summary>
  1045. /// 查询执教助教的课程班级
  1046. /// </summary>
  1047. /// <param name="request"></param>
  1048. /// <returns></returns>
  1049. [ProducesDefaultResponseType]
  1050. //[AuthToken(Roles = "teacher")]
  1051. [HttpPost("find-teach-class")]
  1052. [Authorize(Roles = "IES")]
  1053. public async Task<IActionResult> FindPlanClass(JsonElement request)
  1054. {
  1055. HashSet<string> data = new HashSet<string>();
  1056. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  1057. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  1058. var client = _azureCosmos.GetCosmosClient();
  1059. //List<object> courses = new List<object>();
  1060. List<string> classIds = new List<string>();
  1061. List<(string id, string scope)> listClassInfo = new List<(string id, string scope)>();
  1062. var query = $"select distinct c.scope,A0.stulist id from c join A0 in c.schedule where A0.teacherId = '{id}'";
  1063. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  1064. {
  1065. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1066. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1067. {
  1068. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1069. while (accounts.MoveNext())
  1070. {
  1071. JsonElement account = accounts.Current;
  1072. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1073. {
  1074. continue;
  1075. }
  1076. classIds.Add(account.GetProperty("id").GetString());
  1077. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1078. }
  1079. }
  1080. }
  1081. var querySchool = $"select distinct c.scope,A0.classId id from c join A0 in c.schedule where A0.teacherId = '{id}'";
  1082. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  1083. {
  1084. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1085. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1086. {
  1087. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1088. while (accounts.MoveNext())
  1089. {
  1090. JsonElement account = accounts.Current;
  1091. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1092. {
  1093. continue;
  1094. }
  1095. classIds.Add(account.GetProperty("id").GetString());
  1096. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1097. }
  1098. }
  1099. }
  1100. //List<object> coursesBySchool = new List<object>();
  1101. //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}' ";
  1102. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  1103. {
  1104. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1105. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1106. {
  1107. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1108. while (accounts.MoveNext())
  1109. {
  1110. JsonElement account = accounts.Current;
  1111. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1112. {
  1113. continue;
  1114. }
  1115. classIds.Add(account.GetProperty("id").GetString());
  1116. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1117. }
  1118. }
  1119. }
  1120. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  1121. {
  1122. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1123. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1124. {
  1125. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1126. while (accounts.MoveNext())
  1127. {
  1128. JsonElement account = accounts.Current;
  1129. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1130. {
  1131. continue;
  1132. }
  1133. classIds.Add(account.GetProperty("id").GetString());
  1134. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1135. }
  1136. }
  1137. }
  1138. List<(string id, string name)> listClassList = new List<(string id, string name)>();
  1139. if (classIds.Count > 0)
  1140. {
  1141. //List<(string id, string name)> listClassList = new List<(string id, string name)>();
  1142. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(
  1143. 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}") }))
  1144. {
  1145. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1146. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1147. {
  1148. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1149. while (accounts.MoveNext())
  1150. {
  1151. JsonElement account = accounts.Current;
  1152. listClassList.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
  1153. }
  1154. }
  1155. }
  1156. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(
  1157. queryText: $"select c.id,c.name from c where c.id in ({string.Join(",", classIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{code}") }))
  1158. {
  1159. listClassList.Add((item.id, item.name));
  1160. }
  1161. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<GroupList>(
  1162. queryText: $"select c.id,c.name from c where c.id in ({string.Join(",", classIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList") }))
  1163. {
  1164. listClassList.Add((item.id, item.name));
  1165. }
  1166. }
  1167. var courses = listClassInfo.Select(o =>
  1168. new
  1169. {
  1170. o.id,
  1171. o.scope,
  1172. name = listClassList.FirstOrDefault(c => c.id == o.id).name,
  1173. }
  1174. );
  1175. return Ok(new { courses });
  1176. }
  1177. public class Student
  1178. {
  1179. public string id { get; set; }
  1180. public string name { get; set; }
  1181. public string scope { get; set; }
  1182. }
  1183. public class ListDistinct : IEqualityComparer<Student>
  1184. {
  1185. public bool Equals(Student s1, Student s2)
  1186. {
  1187. return (s1.id == s2.id);
  1188. }
  1189. public int GetHashCode(Student s)
  1190. {
  1191. return s == null ? 0 : s.ToString().GetHashCode();
  1192. }
  1193. }
  1194. }
  1195. public class BatchOption
  1196. {
  1197. public List<string> ids { get; set; }
  1198. public string code { get; set; }
  1199. public string scope { get; set; }
  1200. }
  1201. }