SchoolController.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  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;
  8. using TEAMModelOS.SDK.DI;
  9. using System.Text.Json;
  10. using TEAMModelOS.SDK.Models;
  11. using TEAMModelOS.SDK.Extension;
  12. using Azure.Cosmos;
  13. using Microsoft.AspNetCore.Http;
  14. using Microsoft.Extensions.Options;
  15. using System.IO;
  16. using System.Dynamic;
  17. using System.Net.Http;
  18. using System.Net;
  19. using Newtonsoft.Json;
  20. using System.Linq;
  21. using StackExchange.Redis;
  22. using static TEAMModelOS.SDK.Models.Teacher;
  23. using Microsoft.Extensions.Configuration;
  24. using TEAMModelOS.Filter;
  25. using Microsoft.AspNetCore.Authorization;
  26. using HTEXLib.COMM.Helpers;
  27. using TEAMModelOS.SDK.Models.Service;
  28. namespace TEAMModelAPI.Controllers
  29. {
  30. [ProducesResponseType(StatusCodes.Status200OK)]
  31. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  32. [ApiController]
  33. [Route("school")]
  34. public class SchoolController : ControllerBase
  35. {
  36. public AzureCosmosFactory _azureCosmos;
  37. private readonly AzureStorageFactory _azureStorage;
  38. private readonly AzureRedisFactory _azureRedis;
  39. private readonly DingDing _dingDing;
  40. private readonly Option _option;
  41. private readonly IConfiguration _configuration;
  42. private readonly CoreAPIHttpService _coreAPIHttpService;
  43. public SchoolController(CoreAPIHttpService coreAPIHttpService, AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, DingDing dingDing, IOptionsSnapshot<Option> option, IConfiguration configuration)
  44. {
  45. _azureCosmos = azureCosmos;
  46. _azureStorage = azureStorage;
  47. _azureRedis = azureRedis;
  48. _dingDing = dingDing;
  49. _option = option?.Value;
  50. _configuration = configuration;
  51. _coreAPIHttpService=coreAPIHttpService;
  52. }
  53. /// <summary>
  54. /// 学校基础信息
  55. /// </summary>
  56. /// <param name="request"></param>
  57. /// <returns></returns>
  58. [ProducesDefaultResponseType]
  59. [HttpGet("get-school-info")]
  60. [ApiToken(Auth = "101",Name = "学校基础信息", RW = "R", Limit =false)]
  61. public async Task<IActionResult> GetSchoolInfo()
  62. {
  63. var (id, school) = HttpContext.GetApiTokenInfo();
  64. School data = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(school, new PartitionKey("Base"));
  65. List<dynamic> period = new List<dynamic>();
  66. data.period.ForEach(x => { period.Add(new { x.subjects ,x.grades,x.name,x.id,x.campusId,x.semesters}); });
  67. return Ok(new {
  68. id = data.id, name = data.name, data.areaId, type = data.type,
  69. data.region, data.province, data.city, data.dist,
  70. campuses=data.campuses,
  71. period
  72. });
  73. }
  74. /// <summary>
  75. /// 获取学校教师列表
  76. /// </summary>
  77. /// <param name="request"></param>
  78. /// <returns></returns>
  79. [ProducesDefaultResponseType]
  80. [HttpGet("get-teacher-list")]
  81. [ApiToken(Auth = "102", Name = "学校教师列表", RW = "R", Limit = false)]
  82. public async Task<IActionResult> GetTeacherList()
  83. {
  84. var (id, school) = HttpContext.GetApiTokenInfo();
  85. List<dynamic> teachers= new List<dynamic>();
  86. string sql = $"select c.id,c.name ,c.picture,c.job ,c.subjectIds,c.roles from c where c.status='join' ";
  87. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<dynamic>
  88. (queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Teacher-{school}") })) {
  89. teachers.Add(item);
  90. }
  91. return Ok(new
  92. {
  93. teachers
  94. });
  95. }
  96. /// <summary>
  97. /// 获取学校教师信息
  98. /// </summary>
  99. /// <returns></returns>
  100. [ProducesDefaultResponseType]
  101. [HttpPost("get-teacher-info")]
  102. [ApiToken(Auth = "103", Name = "学校教师信息", RW = "R", Limit = false)]
  103. public async Task<IActionResult> GetTeacherInfo(JsonElement json )
  104. {
  105. json.TryGetProperty("tmdid", out JsonElement _tmdid);
  106. var (id, school) = HttpContext.GetApiTokenInfo();
  107. Azure.Response responseSchoolTch =await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School")
  108. .ReadItemStreamAsync($"{_tmdid}", new PartitionKey($"Teacher-{school}"));
  109. Azure.Response responseTch = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher")
  110. .ReadItemStreamAsync($"{_tmdid}", new PartitionKey($"Base"));
  111. Teacher teacher = null;
  112. if (responseTch.Status == 200)
  113. {
  114. teacher = JsonDocument.Parse(responseTch.Content).RootElement.Deserialize<Teacher>();
  115. }
  116. else
  117. {
  118. return Ok(new { error = 3, msg = "账号未创建!" });
  119. }
  120. if (responseSchoolTch.Status == 200 && teacher!= null )
  121. {
  122. SchoolTeacher schoolTeacher= JsonDocument.Parse(responseSchoolTch.Content).RootElement.Deserialize<SchoolTeacher>();
  123. if (schoolTeacher.status.Equals("join"))
  124. {
  125. return Ok(new {teacher.id,teacher.name,teacher.picture,schoolTeacher.job,schoolTeacher.status,schoolTeacher.roles,schoolTeacher.subjectIds, school=teacher.schools?.Find(x=>x.schoolId.Equals(school)) } );
  126. }
  127. else
  128. {
  129. return Ok(new { error = 2, msg = "教师未加入学校!" });
  130. }
  131. }
  132. else {
  133. return Ok(new { error = 1, msg = "教师未就职该学校!" });
  134. }
  135. }
  136. /*
  137. "periodId":"学段(选填)"
  138. */
  139. /// <summary>
  140. /// 获取学校的行政班,教学班,教研组,研修名单
  141. /// </summary>
  142. /// <param name="request"></param>
  143. /// <returns></returns>
  144. [ProducesDefaultResponseType]
  145. [HttpPost("get-group-list")]
  146. [ApiToken(Auth = "104", Name = "学校教师列表", RW = "R", Limit = false)]
  147. public async Task<IActionResult> GetGroupList(JsonElement json)
  148. {
  149. var client = _azureCosmos.GetCosmosClient();
  150. var (id, school) = HttpContext.GetApiTokenInfo();
  151. json.TryGetProperty("periodId", out JsonElement periodId);
  152. List<GroupListGrp> groupLists = new List<GroupListGrp>();
  153. //包含,学校的行政班,教学班
  154. json.TryGetProperty("type", out JsonElement _type);
  155. List<string> types = null;
  156. if (_type.ValueKind.Equals(JsonValueKind.Array))
  157. {
  158. types = _type.ToObject<List<string>>();
  159. }
  160. else if (_type.ValueKind.Equals(JsonValueKind.String))
  161. {
  162. types = new List<string> { $"{types}" };
  163. }
  164. if (types.IsEmpty() || types.Contains("class"))
  165. {
  166. StringBuilder classsql = new StringBuilder($"SELECT c.id,c.name,c.periodId ,c.year FROM c ");
  167. if (!string.IsNullOrEmpty($"{periodId}"))
  168. {
  169. classsql.Append($" where c.periodId='{periodId}' ");
  170. }
  171. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<ClassInfo>(queryText: classsql.ToString(),
  172. requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school}") }))
  173. {
  174. HashSet<string> groupNames = new HashSet<string>();
  175. string gpsql = $"SELECT distinct c.groupId,c.groupName FROM c where c.classId='{item.id}'and c.groupName <>null";
  176. await foreach (var gp in client.GetContainer(Constant.TEAMModelOS, "Student").GetItemQueryIterator<Student>(queryText: gpsql,
  177. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Base-{school}") }))
  178. {
  179. groupNames.Add(gp.groupName);
  180. }
  181. ///行政班(学生搜寻classId动态返回)class
  182. GroupListGrp group = new GroupListGrp
  183. {
  184. id = item.id,
  185. code = $"GroupList-{school}",
  186. name = item.name,
  187. periodId = item.periodId,
  188. scope = "school",
  189. school = $"{school}",
  190. type = "class",
  191. year = item.year,
  192. groupName = groupNames
  193. };
  194. groupLists.Add(group);
  195. }
  196. }
  197. if (types.IsEmpty() || types.Contains("teach"))
  198. {
  199. //教学班
  200. StringBuilder teachsql = new StringBuilder($" SELECT distinct value(c) FROM c where c.type='teach'");
  201. if (!string.IsNullOrEmpty($"{periodId}"))
  202. {
  203. teachsql.Append($" and c.periodId='{periodId}'");
  204. }
  205. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").
  206. GetItemQueryIterator<GroupList>(queryText: teachsql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{school}") }))
  207. {
  208. HashSet<string> groupName = item.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
  209. groupLists.Add(new GroupListGrp(item, groupName));
  210. }
  211. }
  212. if (types.IsEmpty() || types.Contains("research"))
  213. {
  214. //教研组
  215. StringBuilder researchsql = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='research'");
  216. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").
  217. GetItemQueryIterator<GroupList>(queryText: researchsql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{school}") }))
  218. {
  219. HashSet<string> groupName = item.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
  220. groupLists.Add(new GroupListGrp(item, groupName));
  221. }
  222. }
  223. if (types.IsEmpty() || types.Contains("yxtrain"))
  224. {
  225. //研修名单
  226. StringBuilder yxtrainsql = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='yxtrain'");
  227. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").
  228. GetItemQueryIterator<GroupList>(queryText: yxtrainsql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"GroupList-{school}") }))
  229. {
  230. HashSet<string> groupName = item.members.Where(x => !string.IsNullOrEmpty(x.groupName)).Select(y => y.groupName).ToHashSet();
  231. groupLists.Add(new GroupListGrp(item, groupName));
  232. }
  233. }
  234. return Ok(new
  235. {
  236. groupLists=groupLists.Select(x=>new { x.id,x.type,x.name,x.periodId,x.school,x.scope,x.year})
  237. });
  238. }
  239. [ProducesDefaultResponseType]
  240. [HttpPost("get-group-members")]
  241. [ApiToken(Auth = "105", Name = "获取名单详细信息和成员信息", RW = "R", Limit = false)]
  242. public async Task<IActionResult> GetGroupMembers(JsonElement json)
  243. {
  244. var client = _azureCosmos.GetCosmosClient();
  245. if (!json.TryGetProperty("ids", out JsonElement ids)) return BadRequest();
  246. var (id, school) = HttpContext.GetApiTokenInfo();
  247. List<string> listids = ids.ToObject<List<string>>();
  248. (List<RMember> members, List<RGroupList> groups) = await GroupListService.GetStutmdidListids(_coreAPIHttpService, client, _dingDing, listids, $"{school}");
  249. return Ok(new { groups = groups.Select(x => new { x.name, x.no, x.periodId, x.school, x.type, x.year, x.tcount, x.scount, x.leader, x.members, x.id }), members });
  250. }
  251. [ProducesDefaultResponseType]
  252. [HttpPost("get-course-list")]
  253. [ApiToken(Auth = "106", Name = "获取课程列表信息",RW ="R", Limit = false)]
  254. public async Task<IActionResult> GetCourseList(JsonElement json) {
  255. var client = _azureCosmos.GetCosmosClient();
  256. var (id, school) = HttpContext.GetApiTokenInfo();
  257. json.TryGetProperty("periodId", out JsonElement periodId);
  258. json.TryGetProperty("subjectId", out JsonElement subjectId);
  259. StringBuilder sql = new StringBuilder($"SELECT c.id,c.name,c.subject,c.period,c.scope,c.no,c.school FROM c where 1=1 ");
  260. if (!string.IsNullOrWhiteSpace($"{periodId}")) {
  261. sql.Append($" and c.period.id='{periodId}'");
  262. }
  263. if (!string.IsNullOrWhiteSpace($"{subjectId}"))
  264. {
  265. sql.Append($" and c.subject.id='{subjectId}'");
  266. }
  267. List<dynamic> courses = new List<dynamic>();
  268. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").
  269. GetItemQueryIterator<dynamic>(queryText: sql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{school}") }))
  270. {
  271. courses.Add(item);
  272. }
  273. return Ok(new { courses });
  274. }
  275. [ProducesDefaultResponseType]
  276. [HttpPost("get-course-info")]
  277. [ApiToken(Auth = "107", Name = "课程详细信息", RW = "R", Limit = false)]
  278. public async Task<IActionResult> GetCourseInfo(JsonElement json)
  279. {
  280. var (id, school) = HttpContext.GetApiTokenInfo();
  281. json.TryGetProperty("courseId", out JsonElement courseId);
  282. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School")
  283. .ReadItemStreamAsync($"{courseId}", new PartitionKey($"Course-{school}"));
  284. if (response.Status == 200)
  285. {
  286. JsonDocument document= JsonDocument.Parse(response.Content);
  287. Course course= document.RootElement.Deserialize<Course>();
  288. return Ok(new { course.name,course.id, course.subject, course .period, course .scope, course.school, course .no, course .desc, course.schedule});
  289. }
  290. else {
  291. return Ok(new { error=1,msg="课程不存在!"});
  292. }
  293. }
  294. /// <summary>
  295. /// 获取物理教室列表
  296. /// </summary>
  297. /// <param name="json"></param>
  298. /// <returns></returns>
  299. [ProducesDefaultResponseType]
  300. [HttpPost("get-room-list")]
  301. [ApiToken(Auth = "108", Name = "获取物理教室列表", RW = "R", Limit = false)]
  302. public async Task<IActionResult> GetRoomList(JsonElement json)
  303. {
  304. var client = _azureCosmos.GetCosmosClient();
  305. var (id, school) = HttpContext.GetApiTokenInfo();
  306. StringBuilder sql = new StringBuilder($"select value(c) from c where 1=1 ");
  307. json.TryGetProperty("openType", out JsonElement openType);
  308. if (!string.IsNullOrWhiteSpace($"{openType}"))
  309. {
  310. sql.Append($" and c.openType='{openType}'");
  311. }
  312. List<Room> rooms = new List<Room>();
  313. await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Room>(queryText: sql.ToString(),
  314. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Room-{school}") }))
  315. {
  316. rooms.Add(item);
  317. }
  318. return Ok(new { rooms =rooms.Select(x=>new {x.id,x.name,x.x,x.y, x.openType,x.style,x.area,x.address,school=school}) });
  319. }
  320. /// <summary>
  321. /// 获取物理教室详细信息
  322. /// </summary>
  323. /// <param name="json"></param>
  324. /// <returns></returns>
  325. [ProducesDefaultResponseType]
  326. [HttpPost("get-room-info")]
  327. [ApiToken(Auth = "109", Name = "获取物理教室详细信息", RW = "R", Limit = false)]
  328. public async Task<IActionResult> GetRoomInfo(JsonElement json)
  329. {
  330. var (id, school) = HttpContext.GetApiTokenInfo();
  331. if (!json.TryGetProperty("roomId", out JsonElement roomId)) return BadRequest();
  332. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School")
  333. .ReadItemStreamAsync($"{roomId}", new PartitionKey($"Room-{school}"));
  334. if (response.Status == 200)
  335. {
  336. JsonDocument document = JsonDocument.Parse(response.Content);
  337. Room room = document.RootElement.Deserialize<Room>();
  338. return Ok(new { room.id, room.name, room.x, room.y, room.openType, room.style, room.area,room.address, school = school });
  339. }
  340. else
  341. {
  342. return Ok(new { error = 1, msg = "教室不存在!" });
  343. }
  344. }
  345. /// <summary>
  346. /// 获取试卷和评测的条件信息
  347. /// </summary>
  348. /// <param name="request"></param>
  349. /// <returns></returns>
  350. [ProducesDefaultResponseType]
  351. [HttpPost("get-paper-exam-condition")]
  352. [ApiToken(Auth = "110", Name = "试卷和评测的条件信息", RW = "R", Limit = false)]
  353. public async Task<IActionResult> GetPaperExamCondition(JsonElement json)
  354. {
  355. json.TryGetProperty("periodId", out JsonElement _periodId);
  356. var (id, school) = HttpContext.GetApiTokenInfo();
  357. School data = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(school, new PartitionKey("Base"));
  358. var exmaType = new { type = new List<string> { "regular", "simulation", "normal" } };//regula ,正规考, simulation 模拟靠考,normal 普通考
  359. var exmaMode = new { type = new List<string> { "0", "1", "2" } };//0 线上评测, 1 课中评测 ,2 阅卷评测
  360. var period = data.period.Find(x => x.id.Equals($"{_periodId}"));
  361. if (period != null)
  362. {
  363. return Ok(new { period.subjects, period.analysis, period.grades, exmaType, exmaMode });
  364. }
  365. else
  366. {
  367. return Ok(new { error = 1, msg = "学段不存在!" });
  368. }
  369. }
  370. }
  371. }