CourseController.cs 73 KB

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