CourseController.cs 45 KB

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