SchoolController.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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.Linq;
  8. using System.Text.Json;
  9. using System.Threading.Tasks;
  10. using TEAMModeBI.Filter;
  11. using TEAMModelOS.Models;
  12. using TEAMModelOS.SDK.DI;
  13. using TEAMModelOS.SDK.Extension;
  14. using TEAMModelOS.SDK.Models;
  15. using TEAMModelOS.SDK.Models.Cosmos.BI;
  16. namespace TEAMModeBI.Controllers.BISchool
  17. {
  18. [Route("schoolcheck")]
  19. [ApiController]
  20. public class SchoolController : ControllerBase
  21. {
  22. private readonly AzureCosmosFactory _azureCosmos;
  23. private readonly DingDing _dingDing;
  24. private readonly Option _option;
  25. private readonly AzureStorageFactory _azureStorage;
  26. public SchoolController(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, IOptionsSnapshot<Option> option)
  27. {
  28. _azureCosmos = azureCosmos;
  29. _dingDing = dingDing;
  30. _azureStorage = azureStorage;
  31. _option = option?.Value;
  32. }
  33. /// <summary>
  34. /// 查询未加入区域的学校
  35. /// </summary>
  36. /// <returns></returns>
  37. [ProducesDefaultResponseType]
  38. [HttpPost("get-notarea")]
  39. public async Task<IActionResult> GetNotAreaSchool()
  40. {
  41. try
  42. {
  43. var cosmosClient = _azureCosmos.GetCosmosClient();
  44. string sqltxt = $"SELECT c.id,c.name,c.schoolCode,c.province,c.city,c.dist,c.picture,c.period FROM c WHERE c.standard=null";
  45. List<NotAreaSchool> notAreaSchools = new List<NotAreaSchool>();
  46. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: sqltxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  47. {
  48. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  49. if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
  50. {
  51. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  52. {
  53. //List<string> temp0 = obj.GetProperty("period").ToObject<List<Period>>().Select(x=>x.name).ToList();
  54. NotAreaSchool notAreaSchool = new NotAreaSchool()
  55. {
  56. id = obj.GetProperty("id").GetString(),
  57. name = obj.GetProperty("name").GetString(),
  58. schoolCode = obj.GetProperty("schoolCode").GetString(),
  59. picture = obj.GetProperty("picture").GetString(),
  60. period = obj.GetProperty("period").ToObject<List<Period>>().Select(x => x.name).ToList(),
  61. province = obj.GetProperty("province").GetString(),
  62. city = obj.GetProperty("city").GetString(),
  63. dist = obj.GetProperty("dist").GetString(),
  64. };
  65. notAreaSchools.Add(notAreaSchool);
  66. }
  67. }
  68. }
  69. return Ok(new { state = 200, notAreaSchools });
  70. }
  71. catch (Exception ex)
  72. {
  73. await _dingDing.SendBotMsg($"BI,{_option.Location} /schoolcheck/get-notarea \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  74. return BadRequest();
  75. }
  76. }
  77. /// <summary>
  78. /// 学校加入区
  79. /// </summary>
  80. /// <param name="jsonElement"></param>
  81. /// <returns></returns>
  82. [ProducesDefaultResponseType]
  83. [AuthToken(Roles = "assist")]
  84. [HttpPost("set-schooljoinarea")]
  85. public async Task<IActionResult> SetSchoolJoinArea(JsonElement jsonElement)
  86. {
  87. try
  88. {
  89. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest(); //醍摩豆账户
  90. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest(); //醍摩豆账号名称
  91. if (!jsonElement.TryGetProperty("standard", out JsonElement standard)) return BadRequest();
  92. if (!jsonElement.TryGetProperty("schoolCode", out JsonElement _schoolCode)) return BadRequest();
  93. if (!jsonElement.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
  94. List<string> schoolCodes = _schoolCode.ToObject<List<string>>();
  95. var cosmosCliet = _azureCosmos.GetCosmosClient();
  96. if (schoolCodes.Count > 0)
  97. {
  98. foreach (var tempCode in schoolCodes)
  99. {
  100. School school = await cosmosCliet.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(tempCode,new PartitionKey("Base"));
  101. if (school != null)
  102. {
  103. school.standard = $"{standard}";
  104. school.areaId = $"{_areaId}";
  105. await cosmosCliet.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey(school.code));
  106. }
  107. }
  108. }
  109. //保存操作记录
  110. await _azureStorage.SaveLog("school-join", $"{_tmdName}【{_tmdId}】操作学校加入区域功能,加入的区域:{standard},学校ID:{string.Join("|", schoolCodes.ToArray())}", _dingDing, httpContext: HttpContext);
  111. return Ok(new { state = 200 });
  112. }
  113. catch (Exception ex)
  114. {
  115. await _dingDing.SendBotMsg($"BI,{_option.Location} /schoolcheck/set-schooljoinarea \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  116. return BadRequest();
  117. }
  118. }
  119. /// <summary>
  120. /// 依据醍摩豆账户查询顾问管理学校的基础信息
  121. /// </summary>
  122. /// <param name="jsonElement"></param>
  123. /// <returns></returns>
  124. [HttpPost("get-assustschool")]
  125. public async Task<IActionResult> GetAssistSchool(JsonElement jsonElement)
  126. {
  127. if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmdId)) return BadRequest();
  128. List<string> schoolIds = new List<string>();
  129. List<object> schools = new List<object>();
  130. var cosmosClient = _azureCosmos.GetCosmosClient();
  131. string sqlTxt = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId FROM c WHERE c.pk = 'Teacher' AND c.status = 'join' AND ARRAY_CONTAINS(c.roles, 'assist', true) AND c.id='{tmdId}' ";
  132. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { }))
  133. {
  134. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  135. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  136. {
  137. schoolIds.Add(obj.GetProperty("schoolId").GetString());
  138. }
  139. }
  140. foreach (var item in schoolIds)
  141. {
  142. await foreach (var itemBase in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"select c.id,c.code,c.name,c.picture,c.region,c.province,c.city,c.dist from c where c.id='{item}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  143. {
  144. var json = await JsonDocument.ParseAsync(itemBase.ContentStream);
  145. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  146. {
  147. schools.Add(obj.ToObject<object>());
  148. }
  149. }
  150. }
  151. return Ok(new { state = 200, schools });
  152. }
  153. /// <summary>
  154. /// 依据学校编号查询学校信息
  155. /// </summary>
  156. /// <param name="jsonElement"></param>
  157. /// <returns></returns>
  158. [HttpPost("get-schoolid")]
  159. public async Task<IActionResult> GetSchoolId(JsonElement jsonElement)
  160. {
  161. try
  162. {
  163. if (!jsonElement.TryGetProperty("schoolId", out JsonElement schoolId)) return BadRequest();
  164. var cosmosClient = _azureCosmos.GetCosmosClient();
  165. School school = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>($"{schoolId}", new PartitionKey("Base"));
  166. return Ok(new { state = 200, school });
  167. }
  168. catch (Exception ex)
  169. {
  170. await _dingDing.SendBotMsg($"BI,{_option.Location} /schoolcheck/get-schoolid {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  171. return BadRequest();
  172. }
  173. }
  174. /// <summary>
  175. /// 修改学校信息
  176. /// </summary>
  177. /// <param name="school"></param>
  178. /// <returns></returns>
  179. [ProducesDefaultResponseType]
  180. [AuthToken(Roles = "assist")]
  181. [HttpPost("upd-school")]
  182. public async Task<IActionResult> UpdSchool(ReplaceSchool replaceSchool)
  183. {
  184. try
  185. {
  186. School schoolInfo = new School();
  187. var cosmosClient = _azureCosmos.GetCosmosClient();
  188. School tempShool = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(replaceSchool.school.id, new PartitionKey("Base"));
  189. if (tempShool != null)
  190. {
  191. List<Teacher> teachers = new List<Teacher>();
  192. string sqltxt = $"select distinct value(c) from c join a1 in c.schools where a1.schoolId='{replaceSchool.school.id}'";
  193. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Teacher>(queryText: sqltxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  194. {
  195. teachers.Add(item);
  196. }
  197. foreach (var item in teachers)
  198. {
  199. Teacher.TeacherSchool teacherSchool = item.schools.Find(x => x.schoolId.Equals(replaceSchool.school.id));
  200. if (teacherSchool != null)
  201. {
  202. teacherSchool.name = replaceSchool.school.name;
  203. teacherSchool.picture = replaceSchool.school.picture;
  204. teacherSchool.areaId = replaceSchool.school.areaId;
  205. }
  206. await cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(item, item.id, new PartitionKey("Base"));
  207. }
  208. schoolInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(replaceSchool.school, replaceSchool.school.id, new PartitionKey("Base"));
  209. //保存操作记录
  210. await _azureStorage.SaveLog("school-update", $"{replaceSchool.tmdName}【{replaceSchool.tmdId}】修改学校信息,学校和ID:{replaceSchool.school.name}【{replaceSchool.school.id}】", _dingDing, httpContext: HttpContext);
  211. return Ok(new { state = 200, schoolInfo });
  212. }
  213. else return Ok(new { state = 400, message = "请求错误!" });
  214. }
  215. catch (Exception ex)
  216. {
  217. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/upd-school \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  218. return BadRequest();
  219. }
  220. }
  221. /// <summary>
  222. /// 修改学校的结构
  223. /// </summary>
  224. public record ReplaceSchool()
  225. {
  226. /// <summary>
  227. /// 醍摩豆账户ID
  228. /// </summary>
  229. public string tmdId { get; set; }
  230. /// <summary>
  231. /// 醍摩豆账户名称
  232. /// </summary>
  233. public string tmdName { get; set; }
  234. /// <summary>
  235. /// 学校
  236. /// </summary>
  237. public School school { get; set; }
  238. }
  239. /// <summary>
  240. /// 未加入区域的学校
  241. /// </summary>
  242. public record NotAreaSchool
  243. {
  244. public string id { get; set; }
  245. public string name { get; set; }
  246. public string schoolCode { get; set; }
  247. public string picture { get; set; }
  248. public List<string> period { get; set; }
  249. public string province { get; set; }
  250. public string city { get; set; }
  251. public string dist { get; set; }
  252. }
  253. }
  254. }