CourseController.cs 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  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. namespace TEAMModelOS.Controllers
  23. {
  24. [ProducesResponseType(StatusCodes.Status200OK)]
  25. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  26. //[Authorize(Roles = "IES5")]
  27. [Route("school/course")]
  28. [ApiController]
  29. public class CourseController : ControllerBase
  30. {
  31. private AzureCosmosFactory _azureCosmos;
  32. private readonly DingDing _dingDing;
  33. private readonly Option _option;
  34. public CourseController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option)
  35. {
  36. _azureCosmos = azureCosmos;
  37. _dingDing = dingDing;
  38. _option = option?.Value;
  39. }
  40. /// <summary>
  41. /// 更新保存课程
  42. /// </summary>
  43. /// <param name="request"></param>
  44. /// <returns></returns>
  45. [ProducesDefaultResponseType]
  46. //[AuthToken(Roles = "Teacher")]
  47. [HttpPost("upsert")]
  48. public async Task<IActionResult> upsert(JsonElement requert)
  49. {
  50. try {
  51. /*//ResponseBuilder builder = ResponseBuilder.custom();
  52. if (!string.IsNullOrEmpty(requert.id))
  53. {
  54. List<int> count = await _azureCosmos.FindCountByDict<Course>(new Dictionary<string, object> { { "courseCode", requert.courseCode }, { "code", requert.code } });
  55. if (count.IsNotEmpty() && count[0] > 0)
  56. {
  57. // return builder.Error(ResponseCode.DATA_EXIST, "课程编码已经存在!").build();
  58. }
  59. requert.id = requert.code.Replace("#", "") + "-" + requert.courseCode;
  60. }
  61. Course response = await _azureCosmos.SaveOrUpdate<Course>(requert);
  62. return Ok(new { requert });*/
  63. Course course = new Course();
  64. if (!requert.TryGetProperty("course", out JsonElement room)) return BadRequest();
  65. if (!requert.TryGetProperty("option", out JsonElement option)) return BadRequest();
  66. course = room.ToObject<Course>();
  67. var client = _azureCosmos.GetCosmosClient();
  68. course.pk = typeof(Course).Name;
  69. string code = course.code;
  70. course.code = typeof(Course).Name + "-" + course.code;
  71. if (option.ToString().Equals("insert"))
  72. {
  73. var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(course.id, new PartitionKey($"Course-{code}"));
  74. if (response.Status == 200)
  75. {
  76. return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  77. }
  78. else
  79. {
  80. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(course, new PartitionKey($"Course-{code}"));
  81. }
  82. }
  83. else
  84. {
  85. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync(course, new PartitionKey($"Course-{code}"));
  86. }
  87. return Ok(new { course });
  88. }
  89. catch (Exception ex) {
  90. await _dingDing.SendBotMsg($"OS,{_option.Location},course/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  91. return BadRequest();
  92. }
  93. }
  94. /// <summary>
  95. /// 查询课程
  96. /// </summary>
  97. /// <param name="request"></param>
  98. /// <returns></returns>
  99. [ProducesDefaultResponseType]
  100. //[AuthToken(Roles = "Teacher")]
  101. [HttpPost("find")]
  102. public async Task<IActionResult> Find(JsonElement requert)
  103. {
  104. //ResponseBuilder builder = ResponseBuilder.custom();
  105. //if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
  106. if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  107. //var jwt = new JwtSecurityToken(id_token.GetString());
  108. //if (!jwt.Payload.Iss.Equals("account.teammodel", StringComparison.Ordinal)) return BadRequest();
  109. //var id = jwt.Payload.Sub;
  110. //var id = "TBLCOURSE700";
  111. try {
  112. var client = _azureCosmos.GetCosmosClient();
  113. List<object> courses = new List<object>();
  114. var query = $"select c.code,c.id,c.name,c.period,c.subject,c.teachers from c";
  115. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code.GetString()}") }))
  116. {
  117. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  118. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  119. {
  120. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  121. {
  122. courses.Add(obj.ToObject<object>());
  123. }
  124. }
  125. }
  126. return Ok(new { courses, courses.Count });
  127. } catch (Exception ex) {
  128. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},course/find()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  129. return BadRequest();
  130. }
  131. /* List<Course> data = new List<Course>();
  132. if (StringHelper.getKeyCount(request) > 0) {
  133. data = await _azureCosmos.FindByDict<Course>(request);
  134. }
  135. return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  136. }
  137. /// <summary>
  138. /// 删除课程
  139. /// </summary>
  140. /// <param name="request"></param>
  141. /// <returns></returns>
  142. [ProducesDefaultResponseType]
  143. //[AuthToken(Roles = "Teacher")]
  144. [HttpPost("delete")]
  145. public async Task<IActionResult> Delete(JsonElement request)
  146. {
  147. try {
  148. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  149. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  150. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  151. //string school_code = code.ToString().Substring(typeof(Course).Name.Length + 1);
  152. var client = _azureCosmos.GetCosmosClient();
  153. if (scope.ToString().Equals("school")){
  154. List<CourseManagement> managements = new List<CourseManagement>();
  155. 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}") }))
  156. {
  157. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  158. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  159. {
  160. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  161. {
  162. managements.Add(obj.ToObject<CourseManagement>());
  163. }
  164. }
  165. }
  166. for (int i = 0; i < managements.Count; i++)
  167. {
  168. bool flag = false;
  169. for (int j = 0; j < managements[i].courses.Count; j++)
  170. {
  171. if (!managements[i].courses[j].course.id.Equals(id.ToString()))
  172. {
  173. flag = true;
  174. managements[i].courses.Remove(managements[i].courses[j]);
  175. break;
  176. }
  177. }
  178. if (flag)
  179. {
  180. await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(managements[i], managements[i].id, new PartitionKey($"{managements[i].code}"));
  181. }
  182. }
  183. } else {
  184. await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Course-{code}"));
  185. }
  186. //IdPk idPk= await _azureCosmos.DeleteAsync<Course>(request);
  187. return Ok(new { id });
  188. }
  189. catch (Exception ex)
  190. {
  191. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},course/delete()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  192. return BadRequest();
  193. }
  194. }
  195. /// <summary>
  196. /// 删除课程
  197. /// </summary>
  198. /// <param name="request"></param>
  199. /// <returns></returns>
  200. [ProducesDefaultResponseType]
  201. //[AuthToken(Roles = "Teacher")]
  202. [HttpPost("delete-all")]
  203. public async Task<IActionResult> DeleteAll(BatchOption request)
  204. {
  205. try
  206. {
  207. /*if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  208. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();*/
  209. var client = _azureCosmos.GetCosmosClient();
  210. if (request == null) return BadRequest();
  211. StringBuilder sql = new StringBuilder();
  212. sql.Append("select value(c) from c ");
  213. Dictionary<string, object> dict = new Dictionary<string, object>();
  214. //处理id
  215. if (request.ids.IsNotEmpty()) {
  216. dict.Add("id", request.ids.ToArray());
  217. }
  218. string school_code = request.code;
  219. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  220. List<Course> courses = new List<Course>();
  221. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code}") }))
  222. {
  223. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  224. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  225. {
  226. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  227. {
  228. courses.Add(obj.ToObject<Course>());
  229. }
  230. }
  231. }
  232. // TODO JJ调整批量删除
  233. //await _azureCosmos.DeleteAll(courses);
  234. //List<IdPk> idPk = await _azureCosmos.DeleteAll<Course>(request);
  235. //await client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Class-{code}"));
  236. StringBuilder sqlM = new StringBuilder();
  237. sqlM.Append("select value(c) from c ");
  238. Dictionary<string, object> dict_management = new Dictionary<string, object>();
  239. //处理ID
  240. if (request.ids.IsNotEmpty())
  241. {
  242. dict_management.Add("courses[*].course.id", request.ids.ToArray());
  243. }
  244. List <CourseManagement> managements = new List<CourseManagement>();
  245. AzureCosmosQuery cosmosDbQuery_1 = SQLHelper.GetSQL(dict_management, sqlM);
  246. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery_1.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{school_code}") }))
  247. {
  248. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  249. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  250. {
  251. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  252. {
  253. managements.Add(obj.ToObject<CourseManagement>());
  254. }
  255. }
  256. }
  257. for (int i = 0; i < managements.Count; i++)
  258. {
  259. bool flag = false;
  260. for (int k = 0; k < request.ids.Count; k++)
  261. {
  262. for (int j = 0; j < managements[i].courses.Count; j++)
  263. {
  264. if (managements[i].courses[j].course.id.Equals(request.ids[k].ToString()))
  265. {
  266. managements[i].courses.Remove(managements[i].courses[j]);
  267. flag = true;
  268. }
  269. }
  270. }
  271. if (flag)
  272. {
  273. await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(managements[i], managements[i].id, new PartitionKey($"{managements[i].code}"));
  274. }
  275. }
  276. //IdPk idPk= await _azureCosmos.DeleteAsync<Course>(request);
  277. return Ok(new { ids = request.ids });
  278. }
  279. catch (Exception ex)
  280. {
  281. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},course/delete()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  282. return BadRequest();
  283. }
  284. //ResponseBuilder builder = ResponseBuilder.custom();
  285. //return builder.Data(idPk).build();
  286. //return Ok(new { idPk });
  287. }
  288. /// <summary>
  289. /// 更新保存排课管理
  290. /// </summary>
  291. /// <param name="request"></param>
  292. /// <returns></returns>
  293. [ProducesDefaultResponseType]
  294. //[AuthToken(Roles = "Teacher")]
  295. [HttpPost("upsert-management")]
  296. public async Task<IActionResult> upsertCourseManagement(CourseManagement requert)
  297. {
  298. try
  299. {
  300. CourseManagement course = new CourseManagement();
  301. //course = room.ToObject<CourseManagement>();
  302. var client = _azureCosmos.GetCosmosClient();
  303. string code = requert.code;
  304. requert.code = "CourseManagement-" + requert.code;
  305. /* if (requert.scope.Equals) {
  306. }*/
  307. var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(requert.id, new PartitionKey($"CourseManagement-{code}"));
  308. if (response.Status == 200)
  309. {
  310. /* using var json = await JsonDocument.ParseAsync(response.ContentStream);
  311. CourseManagement courseManagement = json.ToObject<CourseManagement>();
  312. courseManagement.courses = requert.courses;*/
  313. //return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  314. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync(requert,requert.id, new PartitionKey($"CourseManagement-{code}"));
  315. }
  316. else
  317. {
  318. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(requert, new PartitionKey($"CourseManagement-{code}"));
  319. }
  320. return Ok(new { course });
  321. }
  322. catch (Exception ex)
  323. {
  324. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},management/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  325. return BadRequest();
  326. }
  327. }
  328. /// <summary>
  329. /// 查询排课管理
  330. /// </summary>
  331. /// <param name="request"></param>
  332. /// <returns></returns>
  333. [ProducesDefaultResponseType]
  334. //[AuthToken(Roles = "Teacher")]
  335. [HttpPost("find-management")]
  336. public async Task<IActionResult> FindManagement(JsonElement requert)
  337. {
  338. //if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  339. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  340. var client = _azureCosmos.GetCosmosClient();
  341. List<object> courses = new List<object>();
  342. StringBuilder sql = new StringBuilder();
  343. sql.Append("select c.code,c.id,c.name,c.courses,c.scope,c.teacher from c ");
  344. Dictionary<string, object> dict = new Dictionary<string, object>();
  345. var emobj = requert.EnumerateObject();
  346. while (emobj.MoveNext())
  347. {
  348. dict[emobj.Current.Name] = emobj.Current.Value;
  349. }
  350. //处理code
  351. if (dict.TryGetValue("code", out object _))
  352. {
  353. dict.Remove("code");
  354. }
  355. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  356. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  357. {
  358. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  359. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  360. {
  361. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  362. {
  363. courses.Add(obj.ToObject<object>());
  364. }
  365. }
  366. }
  367. /* List<object> courses = new List<object>();
  368. var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(id.ToString(), new PartitionKey($"CourseManagement-{code}"));
  369. if (response.Status == 200)
  370. {
  371. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  372. foreach (var obj in json.RootElement.GetProperty("courseSimples").EnumerateArray())
  373. {
  374. courses.Add(obj.ToObject<object>());
  375. }
  376. *//*if (json.RootElement.TryGetProperty("courseSimples", out JsonElement value))
  377. {
  378. courses = (List<object>)value.ToObject<object>();
  379. }*//*
  380. }
  381. else {
  382. return Ok(new { error = ResponseCode.UNDEFINED, V = "数据未找到!" });
  383. }*/
  384. return Ok(new { courses });
  385. /* var query = $"select c.code,c.id,c.name,c.period,c.subject,c.teachers from c";
  386. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code.GetString()}") }))
  387. {
  388. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  389. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  390. {
  391. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  392. {
  393. courses.Add(obj.ToObject<object>());
  394. }
  395. }
  396. }*/
  397. //return Ok(new { courses, courses.Count });
  398. /* List<Course> data = new List<Course>();
  399. if (StringHelper.getKeyCount(request) > 0) {
  400. data = await _azureCosmos.FindByDict<Course>(request);
  401. }
  402. return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  403. }
  404. [ProducesDefaultResponseType]
  405. //[AuthToken(Roles = "Teacher")]
  406. [HttpPost("find-course")]
  407. public async Task<IActionResult> FindCourse(JsonElement requert)
  408. {
  409. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  410. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  411. var client = _azureCosmos.GetCosmosClient();
  412. List<object> courses = new List<object>();
  413. 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}' ";
  414. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  415. {
  416. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  417. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  418. {
  419. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  420. {
  421. courses.Add(obj.ToObject<object>());
  422. }
  423. }
  424. }
  425. return Ok(new { courses });
  426. }
  427. [ProducesDefaultResponseType]
  428. //[AuthToken(Roles = "Teacher")]
  429. [HttpPost("upsert-notice")]
  430. public async Task<IActionResult> upsertNotice(JsonElement requert)
  431. {
  432. if (!requert.TryGetProperty("courseId", out JsonElement courseId)) return BadRequest();
  433. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  434. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  435. if (!requert.TryGetProperty("notice", out JsonElement notice)) return BadRequest();
  436. if (!requert.TryGetProperty("A1", out JsonElement teacherInfo)) return BadRequest();
  437. Teachers teachers = teacherInfo.ToObject<Teachers>();
  438. var client = _azureCosmos.GetCosmosClient();
  439. List<CourseManagement> courseManagements = new List<CourseManagement>();
  440. /*var sresponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(id.ToString(), new PartitionKey($"{code}"));
  441. if (sresponse.Status == 200)
  442. {
  443. using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
  444. CourseManagement course = json.ToObject<CourseManagement>();
  445. for (int i =0; i < course.courses.Count;i++) {
  446. if (course.courses[i].course.id.Equals(courseId.ToString())) {
  447. course.courses[i].course.notice = notice.ToString();
  448. await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(course, course.id, new PartitionKey($"{course.code}"));
  449. break;
  450. }
  451. }
  452. }*/
  453. StringBuilder sql = new StringBuilder();
  454. sql.Append("select value(c) from c");
  455. Dictionary<string, object> dict = new Dictionary<string, object>();
  456. //dict.Add("id", id);
  457. dict.Add("courses[*].course.id", courseId);
  458. dict.Add("courses[*].teachers[*].id", teachers.id);
  459. //dict.Add("id", classroom.id);
  460. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  461. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  462. {
  463. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  464. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  465. {
  466. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  467. {
  468. courseManagements.Add(obj.ToObject<CourseManagement>());
  469. }
  470. }
  471. }
  472. for (int i = 0; i < courseManagements.Count; i++)
  473. {
  474. for (int j = 0;j < courseManagements[i].courses.Count;j++) {
  475. if (courseManagements[i].courses[j].course.id.Equals(courseId.ToString()))
  476. {
  477. courseManagements[i].courses[j].course.notice = notice.ToString();
  478. await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(courseManagements[i], courseManagements[i].id, new PartitionKey($"{courseManagements[i].code}"));
  479. break;
  480. }
  481. }
  482. }
  483. return Ok(new { id });
  484. }
  485. internal class valitime {
  486. public string code { get; set; }
  487. public string courseId { get; set; }
  488. public string classroomCode { get; set; }
  489. public string time { get; set; }
  490. public string day { get; set; }
  491. public string notice { get; set; }
  492. public CourseTime courseTime { get; set; }
  493. /// <summary>
  494. /// 学生分组
  495. /// </summary>
  496. public List<GroupStudent> groups { get; set; }
  497. /// <summary>
  498. /// 助教
  499. /// </summary>
  500. public List<Assistant> assistant { get; set; }
  501. /// <summary>
  502. /// 学期代码
  503. /// </summary>
  504. public string semesterCode { get; set; }
  505. }
  506. // TODO 前端没在用
  507. /// <summary>
  508. /// 教师更新副属信息,助教,分组等。
  509. /// </summary>
  510. /// <param name="request"></param>
  511. /// <returns></returns>
  512. //[ProducesDefaultResponseType]
  513. ////[AuthToken(Roles = "Teacher")]
  514. //[HttpPost("upsert-plan")]
  515. //public async Task<BaseResponse> UpsertPlan(CoursePlan request) {
  516. // ResponseBuilder builder = ResponseBuilder.custom();
  517. // CoursePlan datas = await _azureCosmos.FindByIdPk<CoursePlan>(request.id,request.code);
  518. // if (datas!=null) {
  519. // request.semesterCode = datas.semesterCode;
  520. // request.classes.ForEach(x => {
  521. // datas.classes.ForEach(m => {
  522. // if (m.classroomCode == x.classroomCode) {
  523. // x.courseTimes = m.courseTimes;
  524. // } });
  525. // });
  526. // await _azureCosmos.Update(request);
  527. // }
  528. // return builder.Data(request).build();
  529. //}
  530. [ProducesDefaultResponseType]
  531. //[AuthToken(Roles = "Teacher")]
  532. [HttpPost("upsert-teacher-course")]
  533. public async Task<IActionResult> upsertCourse(JsonElement requert)
  534. {
  535. try
  536. {
  537. TeacherCourse course = new TeacherCourse();
  538. if (!requert.TryGetProperty("course", out JsonElement room)) return BadRequest();
  539. if (!requert.TryGetProperty("option", out JsonElement option)) return BadRequest();
  540. course = room.ToObject<TeacherCourse>();
  541. var client = _azureCosmos.GetCosmosClient();
  542. course.pk = typeof(Course).Name;
  543. string code = course.code;
  544. course.code = typeof(Course).Name + "-" + course.code;
  545. if (option.ToString().Equals("insert"))
  546. {
  547. var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(course.id, new PartitionKey($"Course-{code}"));
  548. if (response.Status == 200)
  549. {
  550. return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  551. }
  552. else
  553. {
  554. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(course, new PartitionKey($"Course-{code}"));
  555. }
  556. }
  557. else
  558. {
  559. if (course.classes.Count > 0) {
  560. foreach (ClassSimple classSimple in course.classes) {
  561. if (classSimple.scope.Equals("private",StringComparison.OrdinalIgnoreCase)) {
  562. Class cla = new Class();
  563. cla.id = classSimple.id;
  564. cla.code = cla.pk + "-" + code;
  565. cla.name = classSimple.name;
  566. cla.scope = classSimple.scope;
  567. cla.teacher.id = classSimple.teacher.id;
  568. cla.teacher.name = classSimple.teacher.name;
  569. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(cla, new PartitionKey($"Class-{code}"));
  570. }
  571. }
  572. }
  573. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(course,course.id, new PartitionKey($"Course-{code}"));
  574. }
  575. return Ok(new { course });
  576. }
  577. catch (Exception ex)
  578. {
  579. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},teacherCourse/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  580. return BadRequest();
  581. }
  582. }
  583. [ProducesDefaultResponseType]
  584. //[AuthToken(Roles = "Teacher")]
  585. [HttpPost("find-teacher-course")]
  586. public async Task<IActionResult> FindTeacherCourse(JsonElement requert)
  587. {
  588. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  589. //if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  590. var client = _azureCosmos.GetCosmosClient();
  591. List<object> courses = new List<object>();
  592. var query = $"select c.code,c.id,c.name,c.subjectId,c.periodId,c.scope,c.notice,c.classes from c ";
  593. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  594. {
  595. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  596. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  597. {
  598. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  599. {
  600. courses.Add(obj.ToObject<object>());
  601. }
  602. }
  603. }
  604. return Ok(new { courses });
  605. }
  606. /// <summary>
  607. /// 查询执教助教的课程班级
  608. /// </summary>
  609. /// <param name="request"></param>
  610. /// <returns></returns>
  611. [ProducesDefaultResponseType]
  612. //[AuthToken(Roles = "Teacher")]
  613. [HttpPost("find-teach-class")]
  614. public async Task<IActionResult> FindPlanClass(JsonElement request)
  615. {
  616. ResponseBuilder builder = ResponseBuilder.custom();
  617. HashSet<string> data = new HashSet<string>();
  618. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  619. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  620. var client = _azureCosmos.GetCosmosClient();
  621. List<Student> courses = new List<Student>();
  622. var query = $"select A0.id,A0.name,A0.scope from c join A0 in c.classes";
  623. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  624. {
  625. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  626. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  627. {
  628. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  629. {
  630. courses.Add(obj.ToObject<Student>());
  631. }
  632. }
  633. }
  634. //List<object> coursesBySchool = new List<object>();
  635. 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}' ";
  636. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: queryBySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  637. {
  638. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  639. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  640. {
  641. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  642. {
  643. courses.Add(obj.ToObject<Student>());
  644. }
  645. }
  646. }
  647. courses = courses.Distinct(new ListDistinct()).ToList();
  648. //courses = courses.Distinct().ToList();
  649. return Ok(new { courses ,courses.Count});
  650. //request.TryGetProperty("assistant[*]", out JsonElement element);
  651. /*List<dynamic> room = new List<dynamic>();
  652. var prop = new List<string> { "classes" };
  653. if (request.TryGetProperty("code", out JsonElement code))
  654. {
  655. var teachers = await _azureCosmos.FindByDict<CoursePlan>(new Dictionary<string, object> { { "code", code.ToString() } }, prop);
  656. if (teachers.IsNotEmpty()) {
  657. teachers.Select(x => x.classes).ToList().ForEach(x => { x.ForEach(y => { data.Add(y.classroomCode); }); });
  658. }
  659. }
  660. if (request.TryGetProperty("assistant[*]", out JsonElement element)) {
  661. var assistant = await _azureCosmos.FindByDict<CoursePlan>(new Dictionary<string, object> { { "assistant[*]", element.ToString() } }, prop);
  662. if (assistant.IsNotEmpty()) {
  663. assistant.Select(x => x.classes).ToList().ForEach(x => { x.ForEach(y => { data.Add(y.classroomCode); }); });
  664. }
  665. }
  666. if (data.Count > 0) {
  667. var classRoom= await _azureCosmos.FindByDict<Classroom>(new Dictionary<string, object> { { "id",data.ToArray() } } );
  668. if (classRoom.IsNotEmpty()) {
  669. classRoom.ForEach(x => {
  670. room.Add(x);
  671. });
  672. }
  673. }*/
  674. //return builder.Data(room).Extend(new Dictionary<string, object> { { "count", room.Count } }).build();
  675. }
  676. // TODO 前端没在用
  677. /// <summary>
  678. /// 删除课程安排
  679. /// </summary>
  680. /// <param name="request"></param>
  681. /// <returns></returns>
  682. //[ProducesDefaultResponseType]
  683. ////[AuthToken(Roles = "Teacher")]
  684. //[HttpPost("delete-time")]
  685. //public async Task<BaseResponse> DeletePlan(JsonElement request)
  686. //{
  687. // ResponseBuilder builder = ResponseBuilder.custom();
  688. // if (request.TryGetProperty("id",out JsonElement id) && request.TryGetProperty("code",out JsonElement code) && request.TryGetProperty("classroomCode",out JsonElement classroomCode)
  689. // && request.TryGetProperty("time",out JsonElement time) && request.TryGetProperty("day",out JsonElement day)) {
  690. // CoursePlan coursePlan = await _azureCosmos.FindByIdPk<CoursePlan>(id.ToString(), code.ToString());
  691. // List<CourseTime> courseTimes = new List<CourseTime>();
  692. // coursePlan.classes.ForEach(x=> {
  693. // if (x.classroomCode == classroomCode.ToString()) {
  694. // x.courseTimes.ForEach(y => {
  695. // if (y.time == time.ToString() && y.day == day.ToString())
  696. // {
  697. // courseTimes.Add(y);
  698. // }
  699. // });
  700. // }
  701. // });
  702. // coursePlan.classes.ForEach(x => { if (x.classroomCode == classroomCode.ToString()) {
  703. // courseTimes.ForEach(y => { x.courseTimes.Remove(y); });
  704. // } });
  705. // await _azureCosmos.Update(coursePlan);
  706. // return builder.Data(coursePlan).build();
  707. // }
  708. // return builder.Data(null).build();
  709. //}
  710. public class Student
  711. {
  712. public string id { get; set; }
  713. public string name { get; set; }
  714. public string scope { get; set; }
  715. }
  716. public class ListDistinct : IEqualityComparer<Student>
  717. {
  718. public bool Equals(Student s1, Student s2)
  719. {
  720. return (s1.id == s2.id);
  721. }
  722. public int GetHashCode(Student s)
  723. {
  724. return s==null?0:s.ToString().GetHashCode();
  725. }
  726. }
  727. }
  728. public class BatchOption {
  729. public List<string> ids { get; set; }
  730. public string code { get; set; }
  731. }
  732. }