SchoolController.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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 TEAMModelOS.SDK.Helper.Common.CollectionHelper;
  10. using TEAMModelOS.SDK.Context.Exception;
  11. using System.Text.Json;
  12. using TEAMModelOS.SDK.Models;
  13. using TEAMModelOS.SDK.Extension;
  14. using Azure.Cosmos;
  15. using Microsoft.AspNetCore.Http;
  16. using Microsoft.Extensions.Options;
  17. using System.IO;
  18. using System.Dynamic;
  19. namespace TEAMModelOS.Controllers
  20. {
  21. [ProducesResponseType(StatusCodes.Status200OK)]
  22. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  23. //[Authorize(Roles = "IES5")]
  24. [Route("school/init")]
  25. [ApiController]
  26. public class SchoolController : ControllerBase
  27. {
  28. public AzureCosmosFactory _azureCosmos;
  29. private readonly DingDing _dingDing;
  30. private readonly Option _option;
  31. public SchoolController(AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option)
  32. {
  33. _azureCosmos = azureCosmos;
  34. _dingDing = dingDing;
  35. _option = option?.Value;
  36. }
  37. /// <summary>
  38. /// 保存或更新学校
  39. /// </summary>
  40. /// <param name="request"></param>
  41. /// <returns></returns>
  42. [ProducesDefaultResponseType]
  43. //[AuthToken(Roles = "admin")]
  44. [HttpPost("upsert")]
  45. public async Task<IActionResult> Upsert(School requert)
  46. {
  47. var (_, _, _, school) = HttpContext.GetAuthTokenInfo();
  48. try
  49. {
  50. School schoolInfo = new School();
  51. var client = _azureCosmos.GetCosmosClient();
  52. var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(requert.id, new PartitionKey($"Base"));
  53. if (response.Status == 200)
  54. {
  55. schoolInfo = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").UpsertItemAsync(requert, new PartitionKey($"Base"));
  56. }
  57. else
  58. {
  59. requert.code = "Base";
  60. schoolInfo = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(requert, new PartitionKey($"Base"));
  61. }
  62. return Ok(new { schoolInfo });
  63. }
  64. catch (Exception ex)
  65. {
  66. await _dingDing.SendBotMsg($"CoreAPI2,{_option.Location},school/upsert()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
  67. return BadRequest();
  68. }
  69. /*ResponseBuilder builder = ResponseBuilder.custom();
  70. if (string.IsNullOrEmpty(request.id))
  71. {
  72. List<School> schools = await _azureCosmos.FindByDict<School>(new Dictionary<string, object> { { "id", request.schoolCode } });
  73. if (schools.IsNotEmpty())
  74. {
  75. //return builder.Error(ResponseCode.DATA_EXIST, "学校已存在!").build();
  76. return Ok(new { V = "学校已经存在!" });
  77. }
  78. request.code = "Base";
  79. //request.id = request.schoolCode;
  80. }
  81. else {
  82. *//*if (request.id.Equals(request.schoolCode))
  83. {*//*
  84. School datas = await _azureCosmos.SaveOrUpdate<School>(request);
  85. return Ok(new{ datas});
  86. *//*}
  87. else
  88. {
  89. //return builder.Error(ResponseCode.PARAMS_ERROR, "id,schoolCode必须相同!").build();
  90. return Ok(new { V = "id,schoolCode必须相同!" });
  91. }*/
  92. /*List<School> schools = await _azureCosmos.FindByDict<School>(new Dictionary<string, object> { { "id", request.id } });
  93. if (schools.IsEmpty())
  94. {
  95. return builder.Error(ResponseCode.PARAMS_ERROR, "id不存在,不能更新").build();
  96. }*//*
  97. }
  98. return Ok();*/
  99. }
  100. /// <summary>
  101. /// 查找学校
  102. /// </summary>
  103. /// <param name="request"></param>
  104. /// <returns></returns>
  105. [ProducesDefaultResponseType]
  106. //[AuthToken(Roles = "teacher")]
  107. [HttpPost("find")]
  108. public async Task<IActionResult> Find(JsonElement requert)
  109. {
  110. if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  111. var client = _azureCosmos.GetCosmosClient();
  112. List<School> schools = new List<School>();
  113. var query = $"select c.id,c.pk,c.code, c.name,c.region,c.province,c.city,c.timeZone,c.picture,c.size,c.period,c.campuses from c where c.id ='{school_code}'";
  114. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  115. {
  116. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  117. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  118. {
  119. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  120. {
  121. schools.Add(obj.ToObject<School>());
  122. }
  123. }
  124. }
  125. return Ok(new { schools });
  126. /* ResponseBuilder builder = ResponseBuilder.custom();
  127. if (request.TryGetProperty("code", out JsonElement code) &&! string.IsNullOrEmpty(code.ToString()))
  128. {
  129. List<School> sc = await _azureCosmos.FindByDict<School>(request);
  130. return builder.Data(sc).build();
  131. }
  132. else {
  133. return builder.Data(null).build();
  134. }*/
  135. }
  136. /// <summary>
  137. /// 取得所有學校(只取基本資料)
  138. /// </summary>
  139. /// <param name="request"></param>
  140. /// <returns></returns>
  141. [ProducesDefaultResponseType]
  142. [HttpPost("get-all-school-base")]
  143. public async Task<IActionResult> GetAllSchoolBaesInfo(JsonElement request)
  144. {
  145. var client = _azureCosmos.GetCosmosClient();
  146. List<object> schools = new List<object>();
  147. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"SELECT c.id, c.code, c.name, c.region, c.province, c.city, c.address, c.picture FROM c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
  148. {
  149. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  150. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  151. {
  152. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  153. {
  154. schools.Add(obj.ToObject<object>());
  155. }
  156. }
  157. }
  158. return Ok(new { schools });
  159. }
  160. /// <summary>
  161. /// 取得某學校基本資料
  162. /// </summary>
  163. /// <param name="request"></param>
  164. /// <returns></returns>
  165. [ProducesDefaultResponseType]
  166. [HttpPost("get-school-base")]
  167. public async Task<IActionResult> GetSchoolBaesInfo(JsonElement request)
  168. {
  169. if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
  170. var client = _azureCosmos.GetCosmosClient();
  171. //取得學校學制、年級、教室
  172. List<object> classes = new List<object>();
  173. await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"SELECT c.id, c.name, c.gradeId FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
  174. {
  175. var jsonc = await JsonDocument.ParseAsync(item.ContentStream);
  176. foreach (var classeinfo in jsonc.RootElement.GetProperty("Documents").EnumerateArray())
  177. {
  178. dynamic classExtobj = new ExpandoObject();
  179. classExtobj.id = classeinfo.GetProperty("id");
  180. classExtobj.name = classeinfo.GetProperty("name");
  181. classExtobj.gradeId = classeinfo.GetProperty("gradeId");
  182. classes.Add(classExtobj);
  183. }
  184. }
  185. List<object> periods = new List<object>();
  186. List<object> grades = new List<object>();
  187. var responsesch = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(school_code.ToString(), new PartitionKey($"Base"));
  188. if (responsesch.Status == 200)
  189. {
  190. var jsons = await JsonDocument.ParseAsync(responsesch.ContentStream);
  191. if (jsons.RootElement.TryGetProperty("period", out JsonElement periodJobj))
  192. {
  193. foreach (var periodinfo in periodJobj.EnumerateArray())
  194. {
  195. dynamic periodExtobj = new ExpandoObject();
  196. periodExtobj.id = periodinfo.GetProperty("id");
  197. periodExtobj.name = periodinfo.GetProperty("name");
  198. periods.Add(periodExtobj);
  199. if (periodinfo.TryGetProperty("grades", out JsonElement gradesJobj))
  200. {
  201. foreach (var gradeinfo in gradesJobj.EnumerateArray())
  202. {
  203. dynamic gradeExtobj = new ExpandoObject();
  204. gradeExtobj.id = gradeinfo.GetProperty("id");
  205. gradeExtobj.name = gradeinfo.GetProperty("name");
  206. gradeExtobj.periodId = periodinfo.GetProperty("id");
  207. grades.Add(gradeExtobj);
  208. }
  209. }
  210. }
  211. }
  212. }
  213. return Ok(new { periods, grades, classes });
  214. }
  215. }
  216. }