ClassRoomController.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. using Microsoft.AspNetCore.Mvc;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using TEAMModelOS.Models;
  7. using TEAMModelOS.SDK.Context.Exception;
  8. using TEAMModelOS.SDK;
  9. using TEAMModelOS.SDK.DI;
  10. using TEAMModelOS.SDK.Helper.Common.ValidateHelper;
  11. using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  12. using System.Linq;
  13. using System.Text.Json;
  14. using TEAMModelOS.Models.SchoolInfo;
  15. using TEAMModelOS.Models.StudentInfo;
  16. using System.IdentityModel.Tokens.Jwt;
  17. using TEAMModelOS.SDK.Extension;
  18. using Azure.Cosmos;
  19. using Microsoft.AspNetCore.Http;
  20. using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
  21. using TEAMModelOS.Models.TeacherInfo;
  22. namespace TEAMModelOS.Controllers
  23. {
  24. [ProducesResponseType(StatusCodes.Status200OK)]
  25. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  26. //[Authorize(Roles = "IES5")]
  27. [Route("school/classroom")]
  28. [ApiController]
  29. public class ClassroomController : ControllerBase
  30. {
  31. public readonly AzureCosmosFactory _azureCosmos;
  32. public ClassroomController(AzureCosmosFactory azureCosmos) {
  33. _azureCosmos = azureCosmos;
  34. }
  35. [ProducesDefaultResponseType]
  36. //[AuthToken(Roles = "Teacher")]
  37. [HttpPost("upsert")]
  38. public async ValueTask<IActionResult> Upsert(JsonElement requert)
  39. {
  40. //ResponseBuilder builder = ResponseBuilder.custom();
  41. //List<Student> students = null;
  42. Classroom classroom;
  43. if (!requert.TryGetProperty("classroom", out JsonElement room)) return BadRequest();
  44. if (!requert.TryGetProperty("option", out JsonElement option)) return BadRequest();
  45. if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  46. classroom = room.ToObject<Classroom>();
  47. var client = _azureCosmos.GetCosmosClient();
  48. classroom.ttl = -1;
  49. classroom.pk = typeof(Classroom).Name;
  50. classroom.code = "Class-" + school_code.ToString();
  51. //students = await _azureCosmos.FindByDict<Student>(new Dictionary<string, object>() { { "classroomCode", classroom.id } });
  52. if (option.ToString().Equals("insert"))
  53. {
  54. if (classroom.scope.Equals("private"))
  55. {
  56. var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(classroom.id, new PartitionKey($"Class-{school_code}"));
  57. if (response.Status == 200)
  58. {
  59. //classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync(requert, new PartitionKey($"Classroom-{classroom.code}"));
  60. return Ok(new { error = ResponseCode.DATA_EXIST, V = "班级编码已经存在!" });
  61. }
  62. else
  63. {
  64. //string code = classroom.code;
  65. //classroom.code = "Class-" + school_code;
  66. classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").CreateItemAsync(classroom, new PartitionKey($"Class-{school_code}"));
  67. }
  68. }
  69. else {
  70. var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(classroom.id, new PartitionKey($"Class-{school_code}"));
  71. if (response.Status == 200)
  72. {
  73. //classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync(requert, new PartitionKey($"Classroom-{classroom.code}"));
  74. return Ok(new { error = ResponseCode.DATA_EXIST, V = "班级编码已经存在!" });
  75. }
  76. else
  77. {
  78. //string code = classroom.code;
  79. //classroom.code = "Class-" + school_code;
  80. classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(classroom, new PartitionKey($"Class-{school_code}"));
  81. }
  82. }
  83. }
  84. else {
  85. List<StudentSimple> studentSimples = new List<StudentSimple>();
  86. StringBuilder sql = new StringBuilder();
  87. sql.Append("select A0.id,A0.name,A0.no from c join A0 in c.students ");
  88. Dictionary<string, object> dict = new Dictionary<string, object>();
  89. dict.Add("scope", classroom.scope);
  90. dict.Add("id", classroom.id);
  91. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  92. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
  93. {
  94. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  95. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  96. {
  97. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  98. {
  99. studentSimples.Add(obj.ToObject<StudentSimple>());
  100. }
  101. }
  102. }
  103. classroom.students = studentSimples;
  104. if (classroom.scope.Equals("private"))
  105. {
  106. classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(classroom,classroom.id, new PartitionKey($"Class-{school_code}"));
  107. }
  108. else {
  109. List<TeacherCourse> course = new List<TeacherCourse>();
  110. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select value(c) from c join A0 in c.classes where A0.id = '{classroom.id}'"))
  111. {
  112. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  113. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  114. {
  115. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  116. {
  117. course.Add(obj.ToObject<TeacherCourse>());
  118. }
  119. }
  120. }
  121. for (int i = 0;i< course.Count;i++) {
  122. bool flag = false;
  123. for (int j = 0;j<course[i].classes.Count;j++) {
  124. if (!course[i].classes[j].name.Equals(classroom.name)) {
  125. flag = true;
  126. course[i].classes[j].name = classroom.name;
  127. break;
  128. }
  129. }
  130. if (flag) {
  131. await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(course[i], course[i].id, new PartitionKey($"{course[i].code}"));
  132. }
  133. }
  134. //string code = classroom.code.Substring(classroom.pk.Length + 1);
  135. var sresponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(classroom.id, new PartitionKey($"CourseManagement-{school_code}"));
  136. if (sresponse.Status == 200)
  137. {
  138. using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
  139. CourseManagement classroom1 = json.ToObject<CourseManagement>();
  140. if (!classroom1.name.Equals(classroom.name))
  141. {
  142. classroom1.name = classroom.name;
  143. classroom1.teacher.name = classroom.teacher.name;
  144. await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(classroom1, classroom1.id, new PartitionKey($"{classroom1.code}"));
  145. }
  146. }
  147. classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync(classroom, classroom.id, new PartitionKey($"Class-{school_code}"));
  148. }
  149. }
  150. //强制关联原生班级的id
  151. /*List<ClassStudent> classroomStudents = await _azureCosmos.FindByDict<ClassStudent>(new Dictionary<string, object> { { "id", classroom.id } });
  152. if (classroomStudents.IsNotEmpty())
  153. {
  154. if (students.IsNotEmpty())
  155. {
  156. List<ClassStudent> newClassStudents = new List<ClassStudent>();
  157. students.ForEach(x =>
  158. {
  159. if (!classroomStudents.Select(m => m.code).Contains(x.studentId))
  160. {
  161. newClassStudents.Add(new ClassStudent { code = x.studentId, id = classroom.id });
  162. }
  163. });
  164. await _azureCosmos.SaveOrUpdateAll<ClassStudent>(newClassStudents);
  165. }
  166. }*/
  167. return Ok(new { classroom });
  168. }
  169. [ProducesDefaultResponseType]
  170. //[AuthToken(Roles = "Teacher")]
  171. [HttpPost("upsert-group")]
  172. public async ValueTask<IActionResult> UpsertGroup(JsonElement requert)
  173. {
  174. try {
  175. Classroom classroom = new Classroom();
  176. if (!requert.TryGetProperty("classroom", out JsonElement room)) return BadRequest();
  177. //if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
  178. classroom = room.ToObject<Classroom>();
  179. var client = _azureCosmos.GetCosmosClient();
  180. var sresponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(classroom.id, new PartitionKey($"{classroom.code}"));
  181. if (sresponse.Status == 200)
  182. {
  183. using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
  184. Classroom classroom1 = json.ToObject<Classroom>();
  185. classroom1.ttl = -1;
  186. classroom1.students = classroom.students;
  187. var response = await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(classroom1, classroom1.id, new PartitionKey($"{classroom.code}"));
  188. }
  189. return Ok(new { classroom });
  190. } catch (Exception ex) {
  191. return BadRequest();
  192. }
  193. }
  194. [ProducesDefaultResponseType]
  195. //[AuthToken(Roles = "Teacher")]
  196. [HttpPost("find")]
  197. public async Task<IActionResult> Find(JsonElement requert)
  198. {
  199. //ResponseBuilder builder = ResponseBuilder.custom();
  200. if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  201. var client = _azureCosmos.GetCosmosClient();
  202. List<object> classrooms = new List<object>();
  203. StringBuilder sql = new StringBuilder();
  204. sql.Append("select c.id,c.point,c.name,c.teacher,c.periodId,c.gradeId,c.sn,c.style,c.scope,c.type,c.code,c.openType,c.x,c.y,ARRAY_LENGTH(c.students) AS studCount from c ");
  205. Dictionary<string, object> dict = new Dictionary<string, object>();
  206. var emobj = requert.EnumerateObject();
  207. while (emobj.MoveNext())
  208. {
  209. dict[emobj.Current.Name] = emobj.Current.Value;
  210. }
  211. //处理code
  212. if (dict.TryGetValue("school_code", out object _))
  213. {
  214. dict.Remove("school_code");
  215. }
  216. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  217. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
  218. {
  219. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  220. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  221. {
  222. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  223. {
  224. classrooms.Add(obj.ToObject<object>());
  225. }
  226. }
  227. }
  228. return Ok(new { classrooms });
  229. /*List<Classroom> sc = await _azureCosmos.FindByDict<Classroom>(request);
  230. return builder.Data(sc).build();*/
  231. }
  232. [ProducesDefaultResponseType]
  233. //[AuthToken(Roles = "Teacher")]
  234. [HttpPost("find-students")]
  235. public async Task<IActionResult> FindStudent(JsonElement requert)
  236. {
  237. //ResponseBuilder builder = ResponseBuilder.custom();
  238. if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  239. var client = _azureCosmos.GetCosmosClient();
  240. List<object> classrooms = new List<object>();
  241. StringBuilder sql = new StringBuilder();
  242. sql.Append("select c.name,c.id,c.students,c.code from c ");
  243. Dictionary<string, object> dict = new Dictionary<string, object>();
  244. var emobj = requert.EnumerateObject();
  245. while (emobj.MoveNext())
  246. {
  247. dict[emobj.Current.Name] = emobj.Current.Value;
  248. }
  249. //处理code
  250. if (dict.TryGetValue("school_code", out object _))
  251. {
  252. dict.Remove("school_code");
  253. }
  254. AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
  255. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
  256. {
  257. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  258. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  259. {
  260. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  261. {
  262. classrooms.Add(obj.ToObject<object>());
  263. }
  264. }
  265. }
  266. return Ok(new { classrooms });
  267. /*List<Classroom> sc = await _azureCosmos.FindByDict<Classroom>(request);
  268. return builder.Data(sc).build();*/
  269. }
  270. [ProducesDefaultResponseType]
  271. //[AuthToken(Roles = "Teacher")]
  272. [HttpPost("delete")]
  273. public async Task<IActionResult> Delete(JsonElement request)
  274. {
  275. if (!request.TryGetProperty("school_code", out JsonElement code)) return BadRequest();
  276. if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
  277. if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
  278. try
  279. {
  280. //string school_code = code.ToString().Substring(6);
  281. string school_code = code.ToString();
  282. Classroom classroom = new Classroom();
  283. var client = _azureCosmos.GetCosmosClient();
  284. if (scope.ToString().Equals("school"))
  285. {
  286. List<TeacherCourse> classes = new List<TeacherCourse>();
  287. classroom = await client.GetContainer("TEAMModelOS", "School").DeleteItemAsync<Classroom>(id.ToString(), new PartitionKey($"Class-{school_code}"));
  288. await client.GetContainer("TEAMModelOS", "School").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"CourseManagement-{school_code}"));
  289. await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select value(c) from c join A0 in c.classes where A0.id = '{id}'"))
  290. {
  291. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  292. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  293. {
  294. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  295. {
  296. classes.Add(obj.ToObject<TeacherCourse>());
  297. }
  298. }
  299. }
  300. for (int i = 0; i < classes.Count; i++)
  301. {
  302. bool flag = false;
  303. for (int j = 0; j < classes[i].classes.Count; j++)
  304. {
  305. if (classes[i].classes[j].id.Equals(id.ToString()))
  306. {
  307. classes[i].classes.Remove(classes[i].classes[j]);
  308. flag = true;
  309. }
  310. }
  311. if (flag)
  312. {
  313. await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(classes[i], classes[i].id, new PartitionKey($"{classes[i].code}"));
  314. }
  315. }
  316. }
  317. else
  318. {
  319. classroom = await client.GetContainer("TEAMModelOS", "Teacher").DeleteItemAsync<Classroom>(id.ToString(), new PartitionKey($"Class-{school_code}"));
  320. }
  321. return Ok(new { classroom });
  322. }
  323. catch (Exception ex)
  324. {
  325. return BadRequest();
  326. }
  327. //ResponseBuilder builder = ResponseBuilder.custom();
  328. /*List<IdPk> idPks = new List<IdPk>();
  329. if (request.TryGetProperty("id", out JsonElement id))
  330. {
  331. List<Classroom> sc = await _azureCosmos.FindByDict<Classroom>(request);
  332. if (sc.IsNotEmpty())
  333. {
  334. await _azureCosmos.DeleteAll<ClassStudent>(new Dictionary<string, object> { { "id", sc.Select(x => x.code).ToArray() } });
  335. idPks = await _azureCosmos.DeleteAll<Classroom>(sc);
  336. //builder.Data(idPks);
  337. }
  338. }
  339. else
  340. {
  341. return Ok(new { erro = ResponseCode.PARAMS_ERROR, V = "参数未定义!" });
  342. }
  343. return Ok(new { idPks });*/
  344. /*List<VoteRecord> sc = await _azureCosmos.FindByDict<VoteRecord>(request);
  345. await _azureCosmos.DeleteAll<VoteRecord>(sc);
  346. return Ok();*/
  347. //await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync("", new PartitionKey($"Class-{code}"));
  348. }
  349. }
  350. }