CourseController.cs 69 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262
  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 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-{code}") }))
  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-{code}") }))
  552. {
  553. courseList.Add(item);
  554. }
  555. }
  556. if (!$"{scope}".Equals("school")) {
  557. var stulist =courseList.SelectMany(x => x.schedule).Select(z => z.stulist).Where(y => !string.IsNullOrWhiteSpace(y));
  558. }
  559. foreach (Course course in courseList)
  560. {
  561. dynamic courseExtobj = new ExpandoObject();
  562. courseExtobj.id = course.id;
  563. courseExtobj.name = course.name;
  564. courseExtobj.id = course.id;
  565. courseExtobj.subject = course.subject;
  566. courseExtobj.desc = course.desc;
  567. courseExtobj.period = course.period;
  568. courseExtobj.scope = course.scope;
  569. courseExtobj.no = course.no;
  570. courseExtobj.code = course.code;
  571. List<object> scheList = new List<object>();
  572. foreach (Schedule schedule in course.schedule)
  573. {
  574. dynamic scheduleExtobj = new ExpandoObject();
  575. scheduleExtobj.classId = schedule.classId;
  576. scheduleExtobj.teacherId = schedule.teacherId;
  577. if (!string.IsNullOrEmpty(schedule.teacherId))
  578. {
  579. var response = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemStreamAsync(schedule.teacherId, new PartitionKey("Base"));
  580. if (response.Status == 200)
  581. {
  582. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  583. Teacher teacher = json.ToObject<Teacher>();
  584. scheduleExtobj.teacherName = teacher.name;
  585. }
  586. }
  587. scheduleExtobj.stulist = schedule.stulist;
  588. scheduleExtobj.time = schedule.time;
  589. scheduleExtobj.room = schedule.room;
  590. scheList.Add(scheduleExtobj);
  591. }
  592. courseExtobj.schedule = scheList;
  593. courses.Add(courseExtobj);
  594. }
  595. return Ok(new { courses, courses.Count });
  596. }
  597. catch (Exception ex)
  598. {
  599. await _dingDing.SendBotMsg($"IES,{_option.Location},course/find-summary()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
  600. return BadRequest();
  601. }
  602. /* List<Course> data = new List<Course>();
  603. if (StringHelper.getKeyCount(request) > 0) {
  604. data = await _azureCosmos.FindByDict<Course>(request);
  605. }
  606. return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  607. }
  608. /// <summary>
  609. /// 删除课程
  610. /// </summary>
  611. /// <param name="request"></param>
  612. /// <returns></returns>
  613. [ProducesDefaultResponseType]
  614. //[AuthToken(Roles = "teacher")]
  615. [HttpPost("delete")]
  616. [Authorize(Roles = "IES")]
  617. public async Task<IActionResult> Delete(JsonElement request)
  618. {
  619. try
  620. {
  621. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  622. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  623. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  624. //string school_code = code.ToString().Substring(typeof(Course).Name.Length + 1);
  625. var client = _azureCosmos.GetCosmosClient();
  626. if (scope.ToString().Equals("school"))
  627. {
  628. Course course = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<Course>(id.ToString(), new PartitionKey($"Course-{code}"));
  629. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = course.school, creatorId = course.creatorId };
  630. courseChange.delClass = course.schedule.Select(x => x.classId).ToList();
  631. courseChange.delList = course.schedule.Select(x => x.stulist).ToList();
  632. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  633. messageBlob.ApplicationProperties.Add("name", "Course");
  634. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  635. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  636. await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Course-{code}"));
  637. }
  638. else
  639. {
  640. Course course = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Course>(id.ToString(), new PartitionKey($"Course-{code}"));
  641. CourseChange courseChange = new CourseChange { id = course.id, code = course.code, name = course.name, scope = course.scope, school = course.school, creatorId = course.creatorId };
  642. courseChange.delClass = course.schedule.Select(x => x.classId).ToList();
  643. courseChange.delList = course.schedule.Select(x => x.stulist).ToList();
  644. var messageBlob = new ServiceBusMessage(courseChange.ToJsonString()); ;
  645. messageBlob.ApplicationProperties.Add("name", "Course");
  646. var ActiveTask = _configuration.GetValue<string>("Azure:ServiceBus:ActiveTask");
  647. await _serviceBus.GetServiceBusClient().SendMessageAsync(ActiveTask, messageBlob);
  648. await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Course-{code}"));
  649. }
  650. return Ok(new { id });
  651. }
  652. catch (Exception ex)
  653. {
  654. await _dingDing.SendBotMsg($"CN,{_option.Location},course/delete()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  655. return BadRequest();
  656. }
  657. }
  658. /// <summary>
  659. /// 删除课程
  660. /// </summary>
  661. /// <param name="request"></param>
  662. /// <returns></returns>
  663. [ProducesDefaultResponseType]
  664. //[AuthToken(Roles = "teacher")]
  665. [HttpPost("delete-all")]
  666. [Authorize(Roles = "IES")]
  667. public async Task<IActionResult> DeleteAll(BatchOption request)
  668. {
  669. try
  670. {
  671. /* if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  672. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();*/
  673. var client = _azureCosmos.GetCosmosClient();
  674. if (request == null) return BadRequest();
  675. string school_code = request.code;
  676. if (request.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
  677. {
  678. List<Response> res = await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemsStreamAsync(request.ids, $"Course-{school_code}");
  679. }
  680. else
  681. {
  682. List<Response> res = await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemsStreamAsync(request.ids, $"Course-{school_code}");
  683. }
  684. return Ok(new { ids = request.ids });
  685. }
  686. catch (Exception ex)
  687. {
  688. await _dingDing.SendBotMsg($"CN,{_option.Location},course/delete()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  689. return BadRequest();
  690. }
  691. }
  692. /// <summary>
  693. /// 更新保存排课管理
  694. /// </summary>
  695. /// <param name="request"></param>
  696. /// <returns></returns>
  697. //[ProducesDefaultResponseType]
  698. ////[AuthToken(Roles = "Teacher")]
  699. //[HttpPost("upsert-management")]
  700. //public async Task<IActionResult> upsertCourseManagement(CourseManagement requert)
  701. //{
  702. // try
  703. // {
  704. // CourseManagement course = new CourseManagement();
  705. // //course = room.ToObject<CourseManagement>();
  706. // var client = _azureCosmos.GetCosmosClient();
  707. // string code = requert.code;
  708. // requert.code = "CourseManagement-" + requert.code;
  709. // /* if (requert.scope.Equals) {
  710. // }*/
  711. // var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(requert.id, new PartitionKey($"CourseManagement-{code}"));
  712. // if (response.Status == 200)
  713. // {
  714. // course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(requert, requert.id, new PartitionKey($"CourseManagement-{code}"));
  715. // }
  716. // else
  717. // {
  718. // course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync(requert, new PartitionKey($"CourseManagement-{code}"));
  719. // }
  720. // return Ok(new { course });
  721. // }
  722. // catch (Exception ex)
  723. // {
  724. // await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},management/upsert()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  725. // return BadRequest();
  726. // }
  727. //}
  728. /// <summary>
  729. /// 查询排课管理
  730. /// </summary>
  731. /// <param name="request"></param>
  732. /// <returns></returns>
  733. //[ProducesDefaultResponseType]
  734. ////[AuthToken(Roles = "Teacher")]
  735. //[HttpPost("find-management")]
  736. //public async Task<IActionResult> FindManagement(JsonElement requert)
  737. //{
  738. // //if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  739. // if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  740. // var client = _azureCosmos.GetCosmosClient();
  741. // List<object> courses = new List<object>();
  742. // StringBuilder sql = new StringBuilder();
  743. // sql.Append("select c.code,c.id,c.name,c.courses,c.scope,c.teacher from c ");
  744. // Dictionary<string, object> dict = new Dictionary<string, object>();
  745. // var emobj = requert.EnumerateObject();
  746. // while (emobj.MoveNext())
  747. // {
  748. // dict[emobj.Current.Name] = emobj.Current.Value;
  749. // }
  750. // //处理code
  751. // if (dict.TryGetValue("code", out object _))
  752. // {
  753. // dict.Remove("code");
  754. // }
  755. // AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  756. // await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  757. // {
  758. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  759. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  760. // {
  761. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  762. // {
  763. // courses.Add(obj.ToObject<object>());
  764. // }
  765. // }
  766. // }
  767. // return Ok(new { courses });
  768. //}
  769. //[ProducesDefaultResponseType]
  770. ////[AuthToken(Roles = "Teacher")]
  771. //[HttpPost("find-course")]
  772. //public async Task<IActionResult> FindCourse(JsonElement requert)
  773. //{
  774. // if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  775. // if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  776. // var client = _azureCosmos.GetCosmosClient();
  777. // List<object> courses = new List<object>();
  778. // 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}' ";
  779. // await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  780. // {
  781. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  782. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  783. // {
  784. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  785. // {
  786. // courses.Add(obj.ToObject<object>());
  787. // }
  788. // }
  789. // }
  790. // return Ok(new { courses });
  791. //}
  792. [ProducesDefaultResponseType]
  793. //[AuthToken(Roles = "teacher")]
  794. [HttpPost("find-course-by-room")]
  795. [Authorize(Roles = "IES")]
  796. public async Task<IActionResult> FindCourseByRoom(JsonElement requert)
  797. {
  798. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  799. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  800. if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  801. var client = _azureCosmos.GetCosmosClient();
  802. HashSet<Course> courseList = new HashSet<Course>();
  803. List<object> courses = new List<object>();
  804. //var query = $"select c.code,c.id,c.name from c join A0 in c.schedule where A0.classId = '{id}'";
  805. //此处存在不同老师在同一间教室上相同的课程
  806. if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
  807. {
  808. var query = $"select distinct value(c) from c join A0 in c.schedule where A0.room = '{id}'";
  809. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  810. {
  811. courseList.Add(item);
  812. }
  813. }
  814. else
  815. {
  816. var query = $"select distinct value(c) from c join A0 in c.schedule where A0.room = '{id}'";
  817. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  818. {
  819. courseList.Add(item);
  820. }
  821. }
  822. HashSet<string> teacherIds = new HashSet<string>();
  823. foreach (Course course in courseList)
  824. {
  825. foreach (Schedule schedule in course.schedule)
  826. {
  827. teacherIds.Add(schedule.teacherId);
  828. }
  829. }
  830. List<(string id, string name)> teachers = new List<(string id, string name)>();
  831. if (teacherIds.Count > 0)
  832. {
  833. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(
  834. 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") }))
  835. {
  836. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  837. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  838. {
  839. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  840. while (accounts.MoveNext())
  841. {
  842. JsonElement account = accounts.Current;
  843. teachers.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
  844. }
  845. }
  846. }
  847. }
  848. foreach (Course course in courseList)
  849. {
  850. dynamic courseExtobj = new ExpandoObject();
  851. courseExtobj.id = course.id;
  852. courseExtobj.name = course.name;
  853. courseExtobj.subject = course.subject;
  854. courseExtobj.desc = course.desc;
  855. courseExtobj.period = course.period;
  856. courseExtobj.scope = course.scope;
  857. courseExtobj.no = course.no;
  858. courseExtobj.code = course.code;
  859. courseExtobj.pk = course.pk;
  860. List<object> scheList = new List<object>();
  861. foreach (Schedule schedule in course.schedule)
  862. {
  863. dynamic scheduleExtobj = new ExpandoObject();
  864. scheduleExtobj.classId = schedule.classId;
  865. scheduleExtobj.teacherId = schedule.teacherId;
  866. if (!string.IsNullOrEmpty(schedule.teacherId))
  867. {
  868. scheduleExtobj.teacherName = teachers.FirstOrDefault(c => c.id == schedule.teacherId).name;
  869. }
  870. scheduleExtobj.stulist = schedule.stulist;
  871. scheduleExtobj.time = schedule.time;
  872. scheduleExtobj.room = schedule.room;
  873. scheList.Add(scheduleExtobj);
  874. }
  875. courseExtobj.schedule = scheList;
  876. courses.Add(courseExtobj);
  877. }
  878. return Ok(new { courses });
  879. }
  880. //[ProducesDefaultResponseType]
  881. ////[AuthToken(Roles = "Teacher")]
  882. //[HttpPost("upsert-notice")]
  883. //public async Task<IActionResult> upsertNotice(JsonElement requert)
  884. //{
  885. // if (!requert.TryGetProperty("courseId", out JsonElement courseId)) return BadRequest();
  886. // if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  887. // if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  888. // if (!requert.TryGetProperty("notice", out JsonElement notice)) return BadRequest();
  889. // if (!requert.TryGetProperty("A1", out JsonElement teacherInfo)) return BadRequest();
  890. // Teachers teachers = teacherInfo.ToObject<Teachers>();
  891. // var client = _azureCosmos.GetCosmosClient();
  892. // List<CourseManagement> courseManagements = new List<CourseManagement>();
  893. // StringBuilder sql = new StringBuilder();
  894. // sql.Append("select value(c) from c");
  895. // Dictionary<string, object> dict = new Dictionary<string, object>();
  896. // //dict.Add("id", id);
  897. // dict.Add("courses[*].course.id", courseId);
  898. // dict.Add("courses[*].teachers[*].id", teachers.id);
  899. // //dict.Add("id", classroom.id);
  900. // AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  901. // await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  902. // {
  903. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  904. // if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  905. // {
  906. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  907. // {
  908. // courseManagements.Add(obj.ToObject<CourseManagement>());
  909. // }
  910. // }
  911. // }
  912. // for (int i = 0; i < courseManagements.Count; i++)
  913. // {
  914. // for (int j = 0; j < courseManagements[i].courses.Count; j++)
  915. // {
  916. // if (courseManagements[i].courses[j].course.id.Equals(courseId.ToString()))
  917. // {
  918. // courseManagements[i].courses[j].course.notice = notice.ToString();
  919. // await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(courseManagements[i], courseManagements[i].id, new PartitionKey($"{courseManagements[i].code}"));
  920. // break;
  921. // }
  922. // }
  923. // }
  924. // return Ok(new { id });
  925. //}
  926. [ProducesDefaultResponseType]
  927. //[AuthToken(Roles = "teacher")]
  928. [HttpPost("upsert-teacher-course")]
  929. [Authorize(Roles = "IES")]
  930. public async Task<IActionResult> upsertCourse(JsonElement requert)
  931. {
  932. try
  933. {
  934. TeacherCourse course = new TeacherCourse();
  935. if (!requert.TryGetProperty("course", out JsonElement room)) return BadRequest();
  936. if (!requert.TryGetProperty("option", out JsonElement option)) return BadRequest();
  937. course = room.ToObject<TeacherCourse>();
  938. var client = _azureCosmos.GetCosmosClient();
  939. course.pk = typeof(Course).Name;
  940. string code = course.code;
  941. course.code = typeof(Course).Name + "-" + course.code;
  942. if (option.ToString().Equals("insert"))
  943. {
  944. var response = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemStreamAsync(course.id, new PartitionKey($"Course-{code}"));
  945. if (response.Status == 200)
  946. {
  947. return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  948. }
  949. else
  950. {
  951. course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").CreateItemAsync(course, new PartitionKey($"Course-{code}"));
  952. }
  953. }
  954. else
  955. {
  956. if (course.classes.Count > 0)
  957. {
  958. //TODO 教师创建的个人的校本班级待处理冗余数据
  959. foreach (ClassSimple classSimple in course.classes)
  960. {
  961. if (classSimple.scope.Equals("private", StringComparison.OrdinalIgnoreCase))
  962. {
  963. Class cla = new Class();
  964. cla.id = classSimple.id;
  965. cla.code = cla.pk + "-" + code;
  966. cla.name = classSimple.name;
  967. //cla.scope = classSimple.scope;
  968. cla.teacher.id = classSimple.teacher.id;
  969. cla.teacher.name = classSimple.teacher.name;
  970. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(cla, new PartitionKey($"Class-{code}"));
  971. }
  972. else
  973. {
  974. var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(classSimple.id, new PartitionKey($"Class-{classSimple.code}"));
  975. if (response.Status == 200)
  976. {
  977. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  978. Class cla = json.ToObject<Class>();
  979. Class newCla = new Class();
  980. newCla.id = cla.id;
  981. newCla.code = cla.pk + "-" + code;
  982. newCla.name = classSimple.name;
  983. // newCla.scope = classSimple.scope;
  984. /*foreach (StudentSimple student in cla.students)
  985. {
  986. StudentSimple studentSimple = new StudentSimple();
  987. studentSimple.id = student.id;
  988. studentSimple.name = student.name;
  989. studentSimple.no = student.no;
  990. newCla.students.Add(studentSimple);
  991. }*/
  992. newCla.teacher.id = classSimple.teacher.id;
  993. newCla.teacher.name = classSimple.teacher.name;
  994. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(newCla, new PartitionKey($"Class-{code}"));
  995. classSimple.code = code;
  996. }
  997. else
  998. {
  999. Class cla = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Class>(classSimple.id, new PartitionKey($"Class-{classSimple.code}"));
  1000. Class newCla = new Class();
  1001. newCla.id = cla.id;
  1002. newCla.code = cla.pk + "-" + code;
  1003. newCla.name = classSimple.name;
  1004. //newCla.scope = classSimple.scope;
  1005. //newCla.students = cla.students;
  1006. newCla.teacher.id = classSimple.teacher.id;
  1007. newCla.teacher.name = classSimple.teacher.name;
  1008. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync(newCla, new PartitionKey($"Class-{code}"));
  1009. }
  1010. }
  1011. }
  1012. }
  1013. course = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(course, course.id, new PartitionKey($"Course-{code}"));
  1014. }
  1015. return Ok(new { course });
  1016. }
  1017. catch (Exception ex)
  1018. {
  1019. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},teacherCourse/upsert()\n{ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  1020. return BadRequest();
  1021. }
  1022. }
  1023. [ProducesDefaultResponseType]
  1024. //[AuthToken(Roles = "teacher")]
  1025. [HttpPost("find-teacher-course")]
  1026. [Authorize(Roles = "IES")]
  1027. public async Task<IActionResult> FindTeacherCourse(JsonElement requert)
  1028. {
  1029. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  1030. //if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  1031. var client = _azureCosmos.GetCosmosClient();
  1032. List<object> courses = new List<object>();
  1033. var query = $"select c.code,c.id,c.name,c.subjectId,c.periodId,c.scope,c.notice,c.classes from c ";
  1034. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  1035. {
  1036. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1037. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1038. {
  1039. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  1040. {
  1041. courses.Add(obj.ToObject<object>());
  1042. }
  1043. }
  1044. }
  1045. return Ok(new { courses });
  1046. }
  1047. /// <summary>
  1048. /// 查询执教助教的课程班级
  1049. /// </summary>
  1050. /// <param name="request"></param>
  1051. /// <returns></returns>
  1052. [ProducesDefaultResponseType]
  1053. //[AuthToken(Roles = "teacher")]
  1054. [HttpPost("find-teach-class")]
  1055. [Authorize(Roles = "IES")]
  1056. public async Task<IActionResult> FindPlanClass(JsonElement request)
  1057. {
  1058. HashSet<string> data = new HashSet<string>();
  1059. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  1060. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  1061. var client = _azureCosmos.GetCosmosClient();
  1062. //List<object> courses = new List<object>();
  1063. List<string> classIds = new List<string>();
  1064. List<(string id, string scope)> listClassInfo = new List<(string id, string scope)>();
  1065. var query = $"select distinct c.scope,A0.stulist id from c join A0 in c.schedule where A0.teacherId = '{id}'";
  1066. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  1067. {
  1068. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1069. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1070. {
  1071. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1072. while (accounts.MoveNext())
  1073. {
  1074. JsonElement account = accounts.Current;
  1075. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1076. {
  1077. continue;
  1078. }
  1079. classIds.Add(account.GetProperty("id").GetString());
  1080. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1081. }
  1082. }
  1083. }
  1084. var querySchool = $"select distinct c.scope,A0.classId id from c join A0 in c.schedule where A0.teacherId = '{id}'";
  1085. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryStreamIterator(queryText: querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  1086. {
  1087. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1088. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1089. {
  1090. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1091. while (accounts.MoveNext())
  1092. {
  1093. JsonElement account = accounts.Current;
  1094. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1095. {
  1096. continue;
  1097. }
  1098. classIds.Add(account.GetProperty("id").GetString());
  1099. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1100. }
  1101. }
  1102. }
  1103. //List<object> coursesBySchool = new List<object>();
  1104. //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}' ";
  1105. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  1106. {
  1107. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1108. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1109. {
  1110. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1111. while (accounts.MoveNext())
  1112. {
  1113. JsonElement account = accounts.Current;
  1114. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1115. {
  1116. continue;
  1117. }
  1118. classIds.Add(account.GetProperty("id").GetString());
  1119. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1120. }
  1121. }
  1122. }
  1123. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
  1124. {
  1125. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1126. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1127. {
  1128. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1129. while (accounts.MoveNext())
  1130. {
  1131. JsonElement account = accounts.Current;
  1132. if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
  1133. {
  1134. continue;
  1135. }
  1136. classIds.Add(account.GetProperty("id").GetString());
  1137. listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
  1138. }
  1139. }
  1140. }
  1141. List<(string id, string name)> listClassList = new List<(string id, string name)>();
  1142. if (classIds.Count > 0)
  1143. {
  1144. //List<(string id, string name)> listClassList = new List<(string id, string name)>();
  1145. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(
  1146. 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}") }))
  1147. {
  1148. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  1149. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  1150. {
  1151. var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
  1152. while (accounts.MoveNext())
  1153. {
  1154. JsonElement account = accounts.Current;
  1155. listClassList.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
  1156. }
  1157. }
  1158. }
  1159. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(
  1160. 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}") }))
  1161. {
  1162. listClassList.Add((item.id, item.name));
  1163. }
  1164. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<GroupList>(
  1165. 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") }))
  1166. {
  1167. listClassList.Add((item.id, item.name));
  1168. }
  1169. }
  1170. var courses = listClassInfo.Select(o =>
  1171. new
  1172. {
  1173. o.id,
  1174. o.scope,
  1175. name = listClassList.FirstOrDefault(c => c.id == o.id).name,
  1176. }
  1177. );
  1178. return Ok(new { courses });
  1179. }
  1180. public class Student
  1181. {
  1182. public string id { get; set; }
  1183. public string name { get; set; }
  1184. public string scope { get; set; }
  1185. }
  1186. public class ListDistinct : IEqualityComparer<Student>
  1187. {
  1188. public bool Equals(Student s1, Student s2)
  1189. {
  1190. return (s1.id == s2.id);
  1191. }
  1192. public int GetHashCode(Student s)
  1193. {
  1194. return s == null ? 0 : s.ToString().GetHashCode();
  1195. }
  1196. }
  1197. }
  1198. public class BatchOption
  1199. {
  1200. public List<string> ids { get; set; }
  1201. public string code { get; set; }
  1202. public string scope { get; set; }
  1203. }
  1204. }