CourseController.cs 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  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. await _azureCosmos.DeleteAll(courses);
  233. //List<IdPk> idPk = await _azureCosmos.DeleteAll<Course>(request);
  234. //await client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"Class-{code}"));
  235. StringBuilder sqlM = new StringBuilder();
  236. sqlM.Append("select value(c) from c ");
  237. Dictionary<string, object> dict_management = new Dictionary<string, object>();
  238. //处理ID
  239. if (request.ids.IsNotEmpty())
  240. {
  241. dict_management.Add("courses[*].course.id", request.ids.ToArray());
  242. }
  243. List <CourseManagement> managements = new List<CourseManagement>();
  244. AzureCosmosQuery cosmosDbQuery_1 = SQLHelper.GetSQL(dict_management, sqlM);
  245. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery_1.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{school_code}") }))
  246. {
  247. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  248. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  249. {
  250. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  251. {
  252. managements.Add(obj.ToObject<CourseManagement>());
  253. }
  254. }
  255. }
  256. for (int i = 0; i < managements.Count; i++)
  257. {
  258. bool flag = false;
  259. for (int k = 0; k < request.ids.Count; k++)
  260. {
  261. for (int j = 0; j < managements[i].courses.Count; j++)
  262. {
  263. if (managements[i].courses[j].course.id.Equals(request.ids[k].ToString()))
  264. {
  265. managements[i].courses.Remove(managements[i].courses[j]);
  266. flag = true;
  267. }
  268. }
  269. }
  270. if (flag)
  271. {
  272. await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(managements[i], managements[i].id, new PartitionKey($"{managements[i].code}"));
  273. }
  274. }
  275. //IdPk idPk= await _azureCosmos.DeleteAsync<Course>(request);
  276. return Ok(new { ids = request.ids });
  277. }
  278. catch (Exception ex)
  279. {
  280. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},course/delete()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  281. return BadRequest();
  282. }
  283. //ResponseBuilder builder = ResponseBuilder.custom();
  284. //return builder.Data(idPk).build();
  285. //return Ok(new { idPk });
  286. }
  287. /// <summary>
  288. /// 更新保存排课管理
  289. /// </summary>
  290. /// <param name="request"></param>
  291. /// <returns></returns>
  292. [ProducesDefaultResponseType]
  293. //[AuthToken(Roles = "Teacher")]
  294. [HttpPost("upsert-management")]
  295. public async Task<IActionResult> upsertCourseManagement(CourseManagement requert)
  296. {
  297. try
  298. {
  299. CourseManagement course = new CourseManagement();
  300. //course = room.ToObject<CourseManagement>();
  301. var client = _azureCosmos.GetCosmosClient();
  302. string code = requert.code;
  303. requert.code = "CourseManagement-" + requert.code;
  304. /* if (requert.scope.Equals) {
  305. }*/
  306. var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(requert.id, new PartitionKey($"CourseManagement-{code}"));
  307. if (response.Status == 200)
  308. {
  309. /* using var json = await JsonDocument.ParseAsync(response.ContentStream);
  310. CourseManagement courseManagement = json.ToObject<CourseManagement>();
  311. courseManagement.courses = requert.courses;*/
  312. //return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  313. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync(requert,requert.id, new PartitionKey($"CourseManagement-{code}"));
  314. }
  315. else
  316. {
  317. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(requert, new PartitionKey($"CourseManagement-{code}"));
  318. }
  319. return Ok(new { course });
  320. }
  321. catch (Exception ex)
  322. {
  323. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},management/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  324. return BadRequest();
  325. }
  326. }
  327. /// <summary>
  328. /// 查询排课管理
  329. /// </summary>
  330. /// <param name="request"></param>
  331. /// <returns></returns>
  332. [ProducesDefaultResponseType]
  333. //[AuthToken(Roles = "Teacher")]
  334. [HttpPost("find-management")]
  335. public async Task<IActionResult> FindManagement(JsonElement requert)
  336. {
  337. //if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  338. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  339. var client = _azureCosmos.GetCosmosClient();
  340. List<object> courses = new List<object>();
  341. StringBuilder sql = new StringBuilder();
  342. sql.Append("select c.code,c.id,c.name,c.courses,c.scope,c.teacher from c ");
  343. Dictionary<string, object> dict = new Dictionary<string, object>();
  344. var emobj = requert.EnumerateObject();
  345. while (emobj.MoveNext())
  346. {
  347. dict[emobj.Current.Name] = emobj.Current.Value;
  348. }
  349. //处理code
  350. if (dict.TryGetValue("code", out object _))
  351. {
  352. dict.Remove("code");
  353. }
  354. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  355. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  356. {
  357. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  358. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  359. {
  360. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  361. {
  362. courses.Add(obj.ToObject<object>());
  363. }
  364. }
  365. }
  366. /* List<object> courses = new List<object>();
  367. var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(id.ToString(), new PartitionKey($"CourseManagement-{code}"));
  368. if (response.Status == 200)
  369. {
  370. using var json = await JsonDocument.ParseAsync(response.ContentStream);
  371. foreach (var obj in json.RootElement.GetProperty("courseSimples").EnumerateArray())
  372. {
  373. courses.Add(obj.ToObject<object>());
  374. }
  375. *//*if (json.RootElement.TryGetProperty("courseSimples", out JsonElement value))
  376. {
  377. courses = (List<object>)value.ToObject<object>();
  378. }*//*
  379. }
  380. else {
  381. return Ok(new { error = ResponseCode.UNDEFINED, V = "数据未找到!" });
  382. }*/
  383. return Ok(new { courses });
  384. /* var query = $"select c.code,c.id,c.name,c.period,c.subject,c.teachers from c";
  385. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school_code.GetString()}") }))
  386. {
  387. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  388. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  389. {
  390. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  391. {
  392. courses.Add(obj.ToObject<object>());
  393. }
  394. }
  395. }*/
  396. //return Ok(new { courses, courses.Count });
  397. /* List<Course> data = new List<Course>();
  398. if (StringHelper.getKeyCount(request) > 0) {
  399. data = await _azureCosmos.FindByDict<Course>(request);
  400. }
  401. return builder.Data(data).Extend(new Dictionary<string, object> { { "count", data.Count } }).build();*/
  402. }
  403. [ProducesDefaultResponseType]
  404. //[AuthToken(Roles = "Teacher")]
  405. [HttpPost("find-course")]
  406. public async Task<IActionResult> FindCourse(JsonElement requert)
  407. {
  408. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  409. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  410. var client = _azureCosmos.GetCosmosClient();
  411. List<object> courses = new List<object>();
  412. 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}' ";
  413. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  414. {
  415. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  416. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  417. {
  418. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  419. {
  420. courses.Add(obj.ToObject<object>());
  421. }
  422. }
  423. }
  424. return Ok(new { courses });
  425. }
  426. [ProducesDefaultResponseType]
  427. //[AuthToken(Roles = "Teacher")]
  428. [HttpPost("upsert-notice")]
  429. public async Task<IActionResult> upsertNotice(JsonElement requert)
  430. {
  431. if (!requert.TryGetProperty("courseId", out JsonElement courseId)) return BadRequest();
  432. if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  433. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  434. if (!requert.TryGetProperty("notice", out JsonElement notice)) return BadRequest();
  435. if (!requert.TryGetProperty("A1", out JsonElement teacherInfo)) return BadRequest();
  436. Teachers teachers = teacherInfo.ToObject<Teachers>();
  437. var client = _azureCosmos.GetCosmosClient();
  438. List<CourseManagement> courseManagements = new List<CourseManagement>();
  439. /*var sresponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(id.ToString(), new PartitionKey($"{code}"));
  440. if (sresponse.Status == 200)
  441. {
  442. using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
  443. CourseManagement course = json.ToObject<CourseManagement>();
  444. for (int i =0; i < course.courses.Count;i++) {
  445. if (course.courses[i].course.id.Equals(courseId.ToString())) {
  446. course.courses[i].course.notice = notice.ToString();
  447. await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(course, course.id, new PartitionKey($"{course.code}"));
  448. break;
  449. }
  450. }
  451. }*/
  452. StringBuilder sql = new StringBuilder();
  453. sql.Append("select value(c) from c");
  454. Dictionary<string, object> dict = new Dictionary<string, object>();
  455. //dict.Add("id", id);
  456. dict.Add("courses[*].course.id", courseId);
  457. dict.Add("courses[*].teachers[*].id", teachers.id);
  458. //dict.Add("id", classroom.id);
  459. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  460. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  461. {
  462. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  463. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  464. {
  465. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  466. {
  467. courseManagements.Add(obj.ToObject<CourseManagement>());
  468. }
  469. }
  470. }
  471. for (int i = 0; i < courseManagements.Count; i++)
  472. {
  473. for (int j = 0;j < courseManagements[i].courses.Count;j++) {
  474. if (courseManagements[i].courses[j].course.id.Equals(courseId.ToString()))
  475. {
  476. courseManagements[i].courses[j].course.notice = notice.ToString();
  477. await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(courseManagements[i], courseManagements[i].id, new PartitionKey($"{courseManagements[i].code}"));
  478. break;
  479. }
  480. }
  481. }
  482. return Ok(new { id });
  483. }
  484. internal class valitime {
  485. public string code { get; set; }
  486. public string courseId { get; set; }
  487. public string classroomCode { get; set; }
  488. public string time { get; set; }
  489. public string day { get; set; }
  490. public string notice { get; set; }
  491. public CourseTime courseTime { get; set; }
  492. /// <summary>
  493. /// 学生分组
  494. /// </summary>
  495. public List<GroupStudent> groups { get; set; }
  496. /// <summary>
  497. /// 助教
  498. /// </summary>
  499. public List<Assistant> assistant { get; set; }
  500. /// <summary>
  501. /// 学期代码
  502. /// </summary>
  503. public string semesterCode { get; set; }
  504. }
  505. // TODO 前端没在用
  506. /// <summary>
  507. /// 教师更新副属信息,助教,分组等。
  508. /// </summary>
  509. /// <param name="request"></param>
  510. /// <returns></returns>
  511. //[ProducesDefaultResponseType]
  512. ////[AuthToken(Roles = "Teacher")]
  513. //[HttpPost("upsert-plan")]
  514. //public async Task<BaseResponse> UpsertPlan(CoursePlan request) {
  515. // ResponseBuilder builder = ResponseBuilder.custom();
  516. // CoursePlan datas = await _azureCosmos.FindByIdPk<CoursePlan>(request.id,request.code);
  517. // if (datas!=null) {
  518. // request.semesterCode = datas.semesterCode;
  519. // request.classes.ForEach(x => {
  520. // datas.classes.ForEach(m => {
  521. // if (m.classroomCode == x.classroomCode) {
  522. // x.courseTimes = m.courseTimes;
  523. // } });
  524. // });
  525. // await _azureCosmos.Update(request);
  526. // }
  527. // return builder.Data(request).build();
  528. //}
  529. [ProducesDefaultResponseType]
  530. //[AuthToken(Roles = "Teacher")]
  531. [HttpPost("upsert-teacher-course")]
  532. public async Task<IActionResult> upsertCourse(JsonElement requert)
  533. {
  534. try
  535. {
  536. TeacherCourse course = new TeacherCourse();
  537. if (!requert.TryGetProperty("course", out JsonElement room)) return BadRequest();
  538. if (!requert.TryGetProperty("option", out JsonElement option)) return BadRequest();
  539. course = room.ToObject<TeacherCourse>();
  540. var client = _azureCosmos.GetCosmosClient();
  541. course.pk = typeof(Course).Name;
  542. string code = course.code;
  543. course.code = typeof(Course).Name + "-" + course.code;
  544. if (option.ToString().Equals("insert"))
  545. {
  546. var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(course.id, new PartitionKey($"Course-{code}"));
  547. if (response.Status == 200)
  548. {
  549. return Ok(new { error = ResponseCode.DATA_EXIST, V = "课程编码已经存在!" });
  550. }
  551. else
  552. {
  553. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(course, new PartitionKey($"Course-{code}"));
  554. }
  555. }
  556. else
  557. {
  558. if (course.classes.Count > 0) {
  559. foreach (ClassSimple classSimple in course.classes) {
  560. if (classSimple.scope.Equals("private",StringComparison.OrdinalIgnoreCase)) {
  561. Class cla = new Class();
  562. cla.id = classSimple.id;
  563. cla.code = cla.pk + "-" + code;
  564. cla.name = classSimple.name;
  565. cla.scope = classSimple.scope;
  566. cla.teacher.id = classSimple.teacher.id;
  567. cla.teacher.name = classSimple.teacher.name;
  568. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").UpsertItemAsync(cla, new PartitionKey($"Class-{code}"));
  569. }
  570. }
  571. }
  572. course = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(course,course.id, new PartitionKey($"Course-{code}"));
  573. }
  574. return Ok(new { course });
  575. }
  576. catch (Exception ex)
  577. {
  578. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},teacherCourse/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  579. return BadRequest();
  580. }
  581. }
  582. [ProducesDefaultResponseType]
  583. //[AuthToken(Roles = "Teacher")]
  584. [HttpPost("find-teacher-course")]
  585. public async Task<IActionResult> FindTeacherCourse(JsonElement requert)
  586. {
  587. if (!requert.TryGetProperty("id", out JsonElement id)) return BadRequest();
  588. //if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  589. var client = _azureCosmos.GetCosmosClient();
  590. List<object> courses = new List<object>();
  591. var query = $"select c.code,c.id,c.name,c.subjectId,c.periodId,c.scope,c.notice,c.classes from c ";
  592. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  593. {
  594. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  595. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  596. {
  597. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  598. {
  599. courses.Add(obj.ToObject<object>());
  600. }
  601. }
  602. }
  603. return Ok(new { courses });
  604. }
  605. /// <summary>
  606. /// 查询执教助教的课程班级
  607. /// </summary>
  608. /// <param name="request"></param>
  609. /// <returns></returns>
  610. [ProducesDefaultResponseType]
  611. //[AuthToken(Roles = "Teacher")]
  612. [HttpPost("find-teach-class")]
  613. public async Task<IActionResult> FindPlanClass(JsonElement request)
  614. {
  615. ResponseBuilder builder = ResponseBuilder.custom();
  616. HashSet<string> data = new HashSet<string>();
  617. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  618. if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
  619. var client = _azureCosmos.GetCosmosClient();
  620. List<Student> courses = new List<Student>();
  621. var query = $"select A0.id,A0.name,A0.scope from c join A0 in c.classes";
  622. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
  623. {
  624. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  625. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  626. {
  627. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  628. {
  629. courses.Add(obj.ToObject<Student>());
  630. }
  631. }
  632. }
  633. //List<object> coursesBySchool = new List<object>();
  634. 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}' ";
  635. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: queryBySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
  636. {
  637. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  638. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  639. {
  640. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  641. {
  642. courses.Add(obj.ToObject<Student>());
  643. }
  644. }
  645. }
  646. courses = courses.Distinct(new ListDistinct()).ToList();
  647. //courses = courses.Distinct().ToList();
  648. return Ok(new { courses ,courses.Count});
  649. //request.TryGetProperty("assistant[*]", out JsonElement element);
  650. /*List<dynamic> room = new List<dynamic>();
  651. var prop = new List<string> { "classes" };
  652. if (request.TryGetProperty("code", out JsonElement code))
  653. {
  654. var teachers = await _azureCosmos.FindByDict<CoursePlan>(new Dictionary<string, object> { { "code", code.ToString() } }, prop);
  655. if (teachers.IsNotEmpty()) {
  656. teachers.Select(x => x.classes).ToList().ForEach(x => { x.ForEach(y => { data.Add(y.classroomCode); }); });
  657. }
  658. }
  659. if (request.TryGetProperty("assistant[*]", out JsonElement element)) {
  660. var assistant = await _azureCosmos.FindByDict<CoursePlan>(new Dictionary<string, object> { { "assistant[*]", element.ToString() } }, prop);
  661. if (assistant.IsNotEmpty()) {
  662. assistant.Select(x => x.classes).ToList().ForEach(x => { x.ForEach(y => { data.Add(y.classroomCode); }); });
  663. }
  664. }
  665. if (data.Count > 0) {
  666. var classRoom= await _azureCosmos.FindByDict<Classroom>(new Dictionary<string, object> { { "id",data.ToArray() } } );
  667. if (classRoom.IsNotEmpty()) {
  668. classRoom.ForEach(x => {
  669. room.Add(x);
  670. });
  671. }
  672. }*/
  673. //return builder.Data(room).Extend(new Dictionary<string, object> { { "count", room.Count } }).build();
  674. }
  675. // TODO 前端没在用
  676. /// <summary>
  677. /// 删除课程安排
  678. /// </summary>
  679. /// <param name="request"></param>
  680. /// <returns></returns>
  681. //[ProducesDefaultResponseType]
  682. ////[AuthToken(Roles = "Teacher")]
  683. //[HttpPost("delete-time")]
  684. //public async Task<BaseResponse> DeletePlan(JsonElement request)
  685. //{
  686. // ResponseBuilder builder = ResponseBuilder.custom();
  687. // if (request.TryGetProperty("id",out JsonElement id) && request.TryGetProperty("code",out JsonElement code) && request.TryGetProperty("classroomCode",out JsonElement classroomCode)
  688. // && request.TryGetProperty("time",out JsonElement time) && request.TryGetProperty("day",out JsonElement day)) {
  689. // CoursePlan coursePlan = await _azureCosmos.FindByIdPk<CoursePlan>(id.ToString(), code.ToString());
  690. // List<CourseTime> courseTimes = new List<CourseTime>();
  691. // coursePlan.classes.ForEach(x=> {
  692. // if (x.classroomCode == classroomCode.ToString()) {
  693. // x.courseTimes.ForEach(y => {
  694. // if (y.time == time.ToString() && y.day == day.ToString())
  695. // {
  696. // courseTimes.Add(y);
  697. // }
  698. // });
  699. // }
  700. // });
  701. // coursePlan.classes.ForEach(x => { if (x.classroomCode == classroomCode.ToString()) {
  702. // courseTimes.ForEach(y => { x.courseTimes.Remove(y); });
  703. // } });
  704. // await _azureCosmos.Update(coursePlan);
  705. // return builder.Data(coursePlan).build();
  706. // }
  707. // return builder.Data(null).build();
  708. //}
  709. public class Student
  710. {
  711. public string id { get; set; }
  712. public string name { get; set; }
  713. public string scope { get; set; }
  714. }
  715. public class ListDistinct : IEqualityComparer<Student>
  716. {
  717. public bool Equals(Student s1, Student s2)
  718. {
  719. return (s1.id == s2.id);
  720. }
  721. public int GetHashCode(Student s)
  722. {
  723. return s==null?0:s.ToString().GetHashCode();
  724. }
  725. }
  726. }
  727. public class BatchOption {
  728. public List<string> ids { get; set; }
  729. public string code { get; set; }
  730. }
  731. }