BatchSchoolController.cs 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197
  1. using Azure.Cosmos;
  2. using HTEXLib.COMM.Helpers;
  3. using Microsoft.AspNetCore.Http;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.Extensions.Options;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Dynamic;
  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.SDK.DI;
  15. using TEAMModelOS.SDK.Extension;
  16. using TEAMModelOS.SDK.Models;
  17. using TEAMModelOS.SDK.Models.Cosmos.BI;
  18. using Microsoft.AspNetCore.Hosting; //引用读取文件
  19. using TEAMModelOS.SDK.Models.Service;
  20. using System.IO;
  21. using System.Net.Http;
  22. using Microsoft.Extensions.Configuration;
  23. using System.Net.Http.Json;
  24. using System.Net;
  25. using TEAMModeBI.Filter;
  26. namespace TEAMModeBI.Controllers.BISchool
  27. {
  28. [Route("batchschool")]
  29. [ApiController]
  30. public class BatchSchoolController : ControllerBase
  31. {
  32. private readonly AzureCosmosFactory _azureCosmos;
  33. private readonly DingDing _dingDing;
  34. private readonly Option _option;
  35. private readonly AzureStorageFactory _azureStorage;
  36. private readonly IWebHostEnvironment _environment; //读取文件
  37. private readonly IHttpClientFactory _http;
  38. //读取配置信息
  39. private readonly IConfiguration _configuration;
  40. public readonly string mobel = "学校";
  41. public BatchSchoolController(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, IOptionsSnapshot<Option> option, IWebHostEnvironment hostingEnvironment, IConfiguration configuration, IHttpClientFactory http)
  42. {
  43. _azureCosmos = azureCosmos;
  44. _dingDing = dingDing;
  45. _azureStorage = azureStorage;
  46. _option = option?.Value;
  47. _environment = hostingEnvironment;
  48. _configuration = configuration;
  49. _http = http;
  50. }
  51. /// <summary>
  52. /// 获取BI权限列表
  53. /// </summary>
  54. /// <returns></returns>
  55. [ProducesDefaultResponseType]
  56. [HttpPost("get-teacher-authoritybilist")]
  57. public async Task<IActionResult> GetAuthorityBIList()
  58. {
  59. Dictionary<string, object> dic = new Dictionary<string, object> { { "PartitionKey", "authority-bi" } };
  60. List<Authority> authorityBIList = await _azureStorage.FindListByDict<Authority>(dic);
  61. return Ok(new { authorityBIList });
  62. }
  63. /// <summary>
  64. /// 通过教师的id和学校的code查询权限
  65. /// </summary>
  66. /// <param name="jsonElement"></param>
  67. /// <returns></returns>
  68. [ProducesDefaultResponseType]
  69. [HttpPost("get-teacherroles")]
  70. public async Task<IActionResult> GetTeacherRoles(JsonElement jsonElement)
  71. {
  72. try
  73. {
  74. if (!jsonElement.TryGetProperty("id", out JsonElement id)) return Ok(new { state = 1, message = "参数错误!" });
  75. if (!jsonElement.TryGetProperty("schoolcode", out JsonElement schoolcode)) return Ok(new { state = 1, message = "参数错误!" });
  76. var client = _azureCosmos.GetCosmosClient();
  77. string sqltxt = $"select * from c where c.id='{id}'";
  78. List<string> roles = new List<string>();//角色列表
  79. List<string> permissions = new List<string>();//权限列表
  80. var schoolRoles = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{id}", new PartitionKey($"Teacher-{schoolcode}"));
  81. if (schoolRoles.Status == 200)
  82. {
  83. using var json = await JsonDocument.ParseAsync(schoolRoles.ContentStream);
  84. if (json.RootElement.TryGetProperty("roles", out JsonElement _roles) && _roles.ValueKind != JsonValueKind.Null)
  85. {
  86. foreach (var obj in _roles.EnumerateArray())
  87. {
  88. roles.Add(obj.GetString());
  89. }
  90. }
  91. if (json.RootElement.TryGetProperty("permissions", out JsonElement _permissions) && _permissions.ValueKind != JsonValueKind.Null)
  92. {
  93. foreach (var obj in _permissions.EnumerateArray())
  94. {
  95. permissions.Add(obj.GetString());
  96. }
  97. }
  98. }
  99. return Ok(new { state = 200, roles = roles, permissions = permissions });
  100. }
  101. catch (Exception ex)
  102. {
  103. await _dingDing.SendBotMsg($"BI,{_option.Location}, /batchschool/get-teacherroles \n{ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  104. return BadRequest();
  105. }
  106. }
  107. /// <summary>
  108. /// 依据传输的数据更新和删除权限
  109. /// </summary>
  110. /// <param name="jsonElement"></param>
  111. /// <returns></returns>
  112. [ProducesDefaultResponseType]
  113. [AuthToken(Roles = "assist")]
  114. [HttpPost("upd-permissions")]
  115. public async Task<IActionResult> SetSchoolPermissions(JsonElement jsonElement)
  116. {
  117. try
  118. {
  119. if (!jsonElement.TryGetProperty("ids", out JsonElement ids)) return Ok(new { state = 1, message = "ids参数错误!" });
  120. if (!jsonElement.TryGetProperty("school_code", out JsonElement school_code)) return Ok(new { state = 1, message = "school_code参数错误!" });
  121. if (!jsonElement.TryGetProperty("mode", out JsonElement mode)) return Ok(new { state = 1, message = "mode参数错误!" }); //del删除权限 up更新权限
  122. if (!jsonElement.TryGetProperty("paramPower", out JsonElement paramPower)) return Ok(new { state = 1, message = "paramPower参数错误!" });
  123. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest();
  124. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest();
  125. List<Exist> havepower = new List<Exist>(); //已存在的
  126. var client = _azureCosmos.GetCosmosClient();
  127. StringBuilder stringBuilder = new StringBuilder($"{_tmdName}【{_tmdId}】账户操作:");
  128. //更新权限
  129. foreach (var id in ids.EnumerateArray())
  130. {
  131. SchoolTeacher st = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolTeacher>($"{id}", new PartitionKey($"Teacher-{school_code}"));
  132. if (mode.GetString().Equals("del"))
  133. {
  134. stringBuilder.Append($"{st.name}【{st.id}】的权限,删除权限有:");
  135. foreach (var pm in paramPower.EnumerateArray())
  136. {
  137. var bools = st.permissions.Find(x => x.Equals($"{pm}"));
  138. if (!string.IsNullOrEmpty($"{bools}"))
  139. {
  140. st.permissions.RemoveAll(x => x.Equals($"{bools}"));
  141. stringBuilder.Append(pm);
  142. }
  143. }
  144. }
  145. else if (mode.GetString().Equals("up"))
  146. {
  147. stringBuilder.Append($"{st.name}【{st.id}】的权限,更新权限有:");
  148. var stes = st.roles.Find(x => x.Equals("assistant"));
  149. if (string.IsNullOrEmpty($"{stes}"))
  150. {
  151. st.roles.Add("assistant");
  152. }
  153. foreach (var pm in paramPower.EnumerateArray())
  154. {
  155. var bools = st.permissions.Find(x => x.Equals($"{pm}"));
  156. if (!string.IsNullOrEmpty($"{bools}"))
  157. {
  158. havepower.Add(new Exist { ID = id.GetString(), name = bools });
  159. }
  160. else
  161. {
  162. st.permissions.Add(pm.GetString());
  163. stringBuilder.Append(pm);
  164. }
  165. }
  166. if (havepower.Count > 0)
  167. {
  168. stringBuilder.Append($";已存在的权限:{havepower}");
  169. }
  170. }
  171. else { return Ok(new { state = 1, message = "mode参数错误!" }); }
  172. await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<SchoolTeacher>(st, id.GetString(), new PartitionKey($"Teacher-{school_code}"));
  173. }
  174. //保存操作记录
  175. await _azureStorage.SaveLog("school-update", stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
  176. return Ok(new { state = 200, havepower = havepower });
  177. }
  178. catch (Exception ex)
  179. {
  180. await _dingDing.SendBotMsg($"BI,{_option.Location}, /batchschool/upd-permissions \n{ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  181. return BadRequest();
  182. }
  183. }
  184. /// <summary>
  185. /// 批量创校
  186. /// </summary>
  187. /// <param name="school"></param>
  188. /// <returns></returns>
  189. [ProducesDefaultResponseType]
  190. [AuthToken(Roles = "assist")]
  191. [HttpPost("batch-school")]
  192. public async Task<IActionResult> BatchCreateSchool(FoundSchools foundSchools)
  193. {
  194. try
  195. {
  196. List<BISchool> schools = new List<BISchool>();
  197. StringBuilder stringBuilder = new StringBuilder($"{foundSchools.tmdName}【{foundSchools.tmdId}】使用批量创校功能:");
  198. if (foundSchools.biSchools.Count > 0)
  199. {
  200. var cosmosClient = _azureCosmos.GetCosmosClient();
  201. foreach (BISchool bischool in foundSchools.biSchools)
  202. {
  203. string tempTmdId = null;
  204. HttpClient httpClient = _http.CreateClient();
  205. string url = _configuration.GetValue<string>("HaBookAuth:CoreId:userinfo");
  206. List<string> mobile = new List<string>() { bischool.admin };
  207. HttpResponseMessage responseMessage = await httpClient.PostAsJsonAsync(url, mobile);
  208. if (responseMessage.StatusCode == HttpStatusCode.OK)
  209. {
  210. string temp = responseMessage.Content.ReadAsStringAsync().Result;
  211. List<JsonElement> json_id = temp.ToObject<List<JsonElement>>();
  212. foreach (var item in json_id)
  213. {
  214. tempTmdId = item.GetProperty("id").ToString();
  215. }
  216. }
  217. string tmdId = !string.IsNullOrEmpty(tempTmdId) ? tempTmdId : bischool.admin;
  218. CreateSchoolInfo createSchoolInfo = new CreateSchoolInfo()
  219. {
  220. province = bischool.province,
  221. id = "",
  222. name = bischool.name,
  223. city = bischool.city,
  224. aname = "",
  225. createCount = 0,
  226. };
  227. //生成学校ID
  228. bool tempStaus = true;
  229. do
  230. {
  231. createSchoolInfo = await SchoolCode.GenerateSchoolCode(createSchoolInfo, _dingDing, _environment);
  232. var schoolStatu = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{createSchoolInfo.id}", new PartitionKey($"Base"));
  233. if (schoolStatu.Status != 200) tempStaus = false;
  234. else createSchoolInfo.createCount = createSchoolInfo.createCount >= 3 ? createSchoolInfo.createCount = 3 : createSchoolInfo.createCount += 1;
  235. } while (tempStaus);
  236. if (createSchoolInfo.id != null)
  237. {
  238. string campusId = Guid.NewGuid().ToString();
  239. School upSchool = new School
  240. {
  241. id = createSchoolInfo.id,
  242. name = bischool.name,
  243. size = bischool.size,
  244. code = "Base",
  245. campuses = new List<Campus> { new Campus { name = bischool.name, id = campusId } },
  246. region = bischool.region,
  247. province = bischool.province,
  248. city = bischool.city,
  249. dist = bischool.dist,
  250. address = bischool.address,
  251. picture = "https://teammodelstorage.blob.core.chinacloudapi.cn/0-public/school/bbf54fb3-3fc8-43ae-a358-107281c174cc.png",
  252. timeZone = new TEAMModelOS.SDK.Models.TimeZone { label = "(UTC+08:00) 北京,重庆,香港特别行政区,乌鲁木齐", value = "+08:00" },
  253. type = 1,
  254. pk = "School",
  255. ttl = -1,
  256. schoolCode = createSchoolInfo.id,
  257. period = PresetSchoolPeriod(bischool.period,foundSchools.lang,campusId)
  258. };
  259. stringBuilder.Append($"创建学校:{upSchool.name}【{upSchool.id}】");
  260. //创建学校
  261. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<School>(upSchool, new PartitionKey(upSchool.code));
  262. Teacher teacher = null;
  263. try
  264. {
  265. //查询该教师是否存在
  266. teacher = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>($"{tmdId}", new PartitionKey("Base"));
  267. }
  268. catch
  269. {
  270. }
  271. if (teacher != null)
  272. {
  273. //教师存在,在该教师信息中添加要管理的学校信息
  274. teacher.schools.Add(new Teacher.TeacherSchool { schoolId = createSchoolInfo.id, name = bischool.name, status = "join", time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() });
  275. //await cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacher, tmdId, new PartitionKey("Base"));
  276. SchoolTeacher schoolTeacher = new SchoolTeacher
  277. {
  278. id = tmdId,
  279. code = $"Teacher-{createSchoolInfo.id}",
  280. roles = new List<string> { "admin", "teacher" },
  281. job = "管理员",
  282. name = teacher.name,
  283. picture = teacher.picture,
  284. status = "join",
  285. createTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
  286. pk = "Teacher",
  287. ttl = -1
  288. };
  289. stringBuilder.Append($"教师信息:{schoolTeacher.name}【{schoolTeacher.id}】,教师权限:{string.Join(",", schoolTeacher.roles)}");
  290. await cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacher, teacher.id, new PartitionKey(teacher.code));
  291. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<SchoolTeacher>(schoolTeacher, new PartitionKey(schoolTeacher.code));
  292. }
  293. else
  294. {
  295. //不存在 新建教师和新建要管理的学校信息
  296. Teacher addteacher = new Teacher
  297. {
  298. id = tmdId,
  299. pk = "Base",
  300. code = "Base",
  301. name = $"{bischool.name}-管理员"?.ToString(),
  302. picture = "",
  303. //创建账号并第一次登录IES5则默认赠送1G
  304. size = 1,
  305. defaultSchool = createSchoolInfo.id,
  306. schools = new List<Teacher.TeacherSchool>() { new Teacher.TeacherSchool { schoolId = createSchoolInfo.id, name = bischool.name, status = "join", time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() } }
  307. };
  308. stringBuilder.Append($"没有该教师信息创建的教师信息:{addteacher.name}【{addteacher.id}】");
  309. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").CreateItemAsync<Teacher>(addteacher, new PartitionKey("Base"));
  310. SchoolTeacher schoolTeacher = new SchoolTeacher
  311. {
  312. id = tmdId,
  313. code = $"Teacher-{createSchoolInfo.id}",
  314. roles = new List<string> { "admin", "teacher" },
  315. job = "管理员",
  316. name = $"{tmdId}-管理员",
  317. picture = "",
  318. status = "join",
  319. createTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
  320. pk = "Teacher",
  321. ttl = -1
  322. };
  323. stringBuilder.Append($"教师权限:{string.Join(",", schoolTeacher.roles)}");
  324. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<SchoolTeacher>(schoolTeacher, new PartitionKey(schoolTeacher.code));
  325. }
  326. }
  327. }
  328. }
  329. else return Ok(new { state = 1, message = "创校信息为空" });
  330. //保存操作记录
  331. await _azureStorage.SaveLog("school-batchAdd", stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
  332. if (schools.Count > 0)
  333. return Ok(new { state = 201, message = "已有部分学校批量创建成功;学校编号已经重复!请检查学校编号!", schools = schools });
  334. else
  335. return Ok(new { state = 200, message = "批量创校已全部完成" });
  336. }
  337. catch (Exception ex)
  338. {
  339. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/batch-school \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  340. return BadRequest();
  341. }
  342. }
  343. /// <summary>
  344. /// 依据学校编号查询学校信息;若是没有传学校编号,则查询所有学校信息
  345. /// </summary>
  346. /// <param name="jsonElement"></param>
  347. /// <returns></returns>
  348. [ProducesDefaultResponseType]
  349. [HttpPost("get-schoolsinfo")]
  350. public async Task<IActionResult> GetSchoolsInfo(JsonElement jsonElement)
  351. {
  352. try
  353. {
  354. jsonElement.TryGetProperty("schoolCode", out JsonElement _schoolCode);
  355. var cosmosClient = _azureCosmos.GetCosmosClient();
  356. List<School> schools = new List<School>();
  357. List<SchoolAssist> schoolAssists = new List<SchoolAssist>();
  358. StringBuilder stringBuilder = new StringBuilder("select value(c) from c");
  359. if (!string.IsNullOrEmpty($"{_schoolCode}"))
  360. {
  361. stringBuilder.Append($" where c.id='{_schoolCode}'");
  362. }
  363. await foreach (var itemSchool in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: stringBuilder.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  364. {
  365. SchoolAssist schoolAssist = new SchoolAssist();
  366. schoolAssist.id = itemSchool.id;
  367. schoolAssist.code = itemSchool.code;
  368. schoolAssist.pk = itemSchool.pk;
  369. schoolAssist.ttl = itemSchool.ttl;
  370. schoolAssist.schoolCode = itemSchool.schoolCode;
  371. schoolAssist.name = itemSchool.name;
  372. schoolAssist.period = itemSchool.period;
  373. schoolAssist.campuses = itemSchool.campuses;
  374. schoolAssist.region = itemSchool.region;
  375. schoolAssist.province = itemSchool.province;
  376. schoolAssist.city = itemSchool.city;
  377. schoolAssist.dist = itemSchool.dist;
  378. schoolAssist.areaId = itemSchool.areaId;
  379. schoolAssist.size = itemSchool.size;
  380. schoolAssist.address = itemSchool.address;
  381. schoolAssist.picture = itemSchool.picture;
  382. schoolAssist.timeZone = itemSchool.timeZone;
  383. schoolAssist.type = itemSchool.type;
  384. schoolAssist.standard = itemSchool.standard;
  385. schoolAssist.hpappraise = itemSchool.hpappraise;
  386. schoolAssist.standard = itemSchool.standard;
  387. schoolAssist.areaId = itemSchool.areaId;
  388. List<Assist> assists = new List<Assist>();
  389. //查询学校的顾问
  390. string managerSql = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId, c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, 'assist', true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.code = 'Teacher-{itemSchool.id}'";
  391. var cosmosClent = _azureCosmos.GetCosmosClient();
  392. await foreach (var item in cosmosClent.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
  393. {
  394. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  395. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  396. {
  397. Assist assist = new Assist
  398. {
  399. tmdId = obj.GetProperty("id").GetString(),
  400. tmdName = obj.GetProperty("name").GetString()
  401. };
  402. assists.Add(assist);
  403. }
  404. }
  405. schoolAssist.assists = assists;
  406. schoolAssists.Add(schoolAssist);
  407. }
  408. return Ok(new { state = 200, schoolAssists });
  409. }
  410. catch (Exception ex)
  411. {
  412. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/get-schoolsinfo \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  413. return BadRequest();
  414. }
  415. }
  416. /// <summary>
  417. /// 取得学校所有顾问列表
  418. /// </summary>
  419. /// <returns></returns>
  420. [ProducesDefaultResponseType]
  421. [HttpPost("get-schoolassist")]
  422. public async Task<IActionResult> GetSchoolAssist(JsonElement jsonElement)
  423. {
  424. try
  425. {
  426. string schoolId = (jsonElement.TryGetProperty("schoolId", out JsonElement _schoolId)) ? _schoolId.GetString() : string.Empty;
  427. Dictionary<string, List<Dictionary<string, string>>> haveSchoolManger = new Dictionary<string, List<Dictionary<string, string>>>();
  428. string managerWhereOption = (!string.IsNullOrWhiteSpace(schoolId)) ? $" AND c.code = 'Teacher-{schoolId}'" : string.Empty;
  429. //查询学校的顾问
  430. string managerSql = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId, c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, 'assist', true) AND c.pk = 'Teacher' AND c.status = 'join'{managerWhereOption}";
  431. var cosmosClent = _azureCosmos.GetCosmosClient();
  432. await foreach (var item in cosmosClent.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
  433. {
  434. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  435. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  436. {
  437. string id = obj.GetProperty("id").GetString(); //管理员ID
  438. string name = obj.GetProperty("name").GetString(); //管理员姓名
  439. string tempSchoolId = obj.GetProperty("schoolId").GetString(); //学校ID
  440. Dictionary<string, string> managerDic = new Dictionary<string, string>();
  441. managerDic.Add("id", id);
  442. managerDic.Add("name", name);
  443. if (haveSchoolManger.ContainsKey(tempSchoolId))
  444. {
  445. haveSchoolManger[tempSchoolId].Add(managerDic);
  446. }
  447. else
  448. {
  449. List<Dictionary<string, string>> managerList = new List<Dictionary<string, string>>();
  450. managerList.Add(managerDic);
  451. haveSchoolManger.Add(tempSchoolId, managerList);
  452. }
  453. }
  454. }
  455. //管理模组学校
  456. List<string> baseModuleSchoos = new List<string>();
  457. string baseWhereOption = (!string.IsNullOrEmpty(schoolId)) ? $" and c.id='{schoolId}'" : string.Empty;
  458. await foreach (var item in cosmosClent.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"select c.id from c join serviceProduct in c.service.product where serviceProduct.prodCode = 'IPDYZYLC' {baseWhereOption}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Product") }))
  459. {
  460. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  461. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  462. {
  463. string tempSchoolId = obj.GetProperty("id").GetString(); //学校ID
  464. baseModuleSchoos.Add(tempSchoolId);
  465. }
  466. }
  467. //学校信息
  468. List<object> schools = new List<object>();
  469. string schoolWhereOption = (!string.IsNullOrEmpty(schoolId)) ? $" where c.id='{schoolId}'" : string.Empty;
  470. await foreach (var item in cosmosClent.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: $"select c.id,c.name,c.period,c.schoolCode,c.region,c.province,c.city,c.picture from c {schoolWhereOption}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  471. {
  472. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  473. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  474. {
  475. dynamic schoolExpando = new ExpandoObject();
  476. schoolExpando.id = obj.GetProperty("id").GetString();
  477. schoolExpando.name = obj.GetProperty("name").GetString();
  478. //schoolExpando.period = obj.GetProperty("period");
  479. schoolExpando.schoolCode = obj.GetProperty("schoolCode").GetString();
  480. schoolExpando.region = obj.GetProperty("region").GetString();
  481. schoolExpando.province = obj.GetProperty("province").GetString();
  482. schoolExpando.city = obj.GetProperty("city").GetString();
  483. schoolExpando.picture = obj.GetProperty("picture").GetString();
  484. if (haveSchoolManger.ContainsKey(schoolExpando.id))
  485. {
  486. schoolExpando.hasMarger = true;
  487. schoolExpando.managers = haveSchoolManger[schoolExpando.id];
  488. }
  489. else
  490. {
  491. schoolExpando.hasMarger = false;
  492. schoolExpando.managers = new List<object>();
  493. }
  494. schoolExpando.hasBaseModule = (baseModuleSchoos.Contains(schoolExpando.id)) ? true : false;
  495. schools.Add(schoolExpando);
  496. }
  497. }
  498. return Ok(new { state = 200, schools });
  499. }
  500. catch (Exception ex)
  501. {
  502. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/get-schools \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  503. return BadRequest();
  504. }
  505. }
  506. /// <summary>
  507. /// 修改学校信息和顾问信息
  508. /// </summary>
  509. /// <param name="jsonElement"></param>
  510. /// <returns></returns>
  511. [ProducesDefaultResponseType]
  512. [AuthToken(Roles = "assist")]
  513. [HttpPost("upd-schoolassist")]
  514. public async Task<IActionResult> UpdSchoolAssist(JsonElement jsonElement)
  515. {
  516. try
  517. {
  518. if (!jsonElement.TryGetProperty("schoolId", out JsonElement _schoolId)) return BadRequest();
  519. if (!jsonElement.TryGetProperty("period", out JsonElement period)) return BadRequest();
  520. if (!jsonElement.TryGetProperty("picture", out JsonElement picture)) return BadRequest();
  521. if (!jsonElement.TryGetProperty("size", out JsonElement size)) return BadRequest();
  522. if (!jsonElement.TryGetProperty("assistId", out JsonElement _assistId)) return BadRequest();
  523. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest();
  524. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest();
  525. List<string> assistId = _assistId.ToObject<List<string>>();
  526. List<string> periodS = period.ToObject<List<string>>();
  527. SchoolAssist schoolAssist = new();
  528. Dictionary<string, List<Dictionary<string, string>>> haveSchoolManger = new Dictionary<string, List<Dictionary<string, string>>>();
  529. //操作记录
  530. string blobOrTable = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
  531. var cosmosClient = _azureCosmos.GetCosmosClient();
  532. School tempShool = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_schoolId}", new PartitionKey("Base"));
  533. if (tempShool != null)
  534. {
  535. List<Period> periods = new List<Period>();
  536. string campusId = Guid.NewGuid().ToString();
  537. periodS.ForEach(x =>
  538. {
  539. periods.Add(new Period { id = Guid.NewGuid().ToString(), name = x.ToString(), campusId = campusId });
  540. });
  541. tempShool.period = periods;
  542. tempShool.size = !string.IsNullOrEmpty($"{size}") ? int.Parse($"{size}") : tempShool.size;
  543. tempShool.picture = $"{picture}";
  544. //修改学校
  545. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(tempShool, tempShool.id, new PartitionKey("Base"));
  546. if (assistId.Count > 0)
  547. {
  548. foreach (var itemTeacher in assistId)
  549. {
  550. Teacher tempTeacher = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>($"{itemTeacher}", new PartitionKey("Base"));
  551. if (tempTeacher != null)
  552. {
  553. var haveTeacher = tempTeacher.schools.Find(x => x.schoolId.Equals($"{_schoolId}"));
  554. if (haveTeacher != null)
  555. {
  556. //查询该教师是否存在该校
  557. SchoolTeacher schoolTeacher = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolTeacher>($"{itemTeacher}", new PartitionKey($"Teacher-{tempShool.id}"));
  558. if (schoolTeacher != null)
  559. {
  560. if (!schoolTeacher.roles.Contains("assist"))
  561. {
  562. schoolTeacher.roles.Add("assist");
  563. //添加顾问权限
  564. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<SchoolTeacher>(schoolTeacher, schoolTeacher.id, new PartitionKey($"Teacher-{tempShool.id}"));
  565. }
  566. }
  567. else
  568. {
  569. SchoolTeacher addSchoolTeacher = new SchoolTeacher
  570. {
  571. id = itemTeacher,
  572. code = $"Teacher-{tempShool.id}",
  573. pk = "Teacher",
  574. status = "join",
  575. roles = new List<string>() { "assist" },
  576. name = tempTeacher.name,
  577. job = $"{tempShool.name}-顾问",
  578. size = 0,
  579. createTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
  580. };
  581. //添加学校顾问
  582. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<SchoolTeacher>(schoolTeacher, new PartitionKey($"Teacher-{tempShool.id}"));
  583. }
  584. }
  585. else
  586. {
  587. Teacher.TeacherSchool teacherSchool = new Teacher.TeacherSchool
  588. {
  589. schoolId = tempShool.id,
  590. name = tempShool.name,
  591. status = "join",
  592. time = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
  593. picture = tempShool.picture,
  594. areaId = tempShool.areaId
  595. };
  596. tempTeacher.schools.Add(teacherSchool);
  597. //给醍摩豆顾问添加学校
  598. await cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(tempTeacher, tempTeacher.id, new PartitionKey($"Base"));
  599. //不存在则在原来的基础上添加顾问角色
  600. SchoolTeacher addSchoolTeacher = new SchoolTeacher
  601. {
  602. id = itemTeacher,
  603. code = $"Teacher-{tempShool.id}",
  604. pk = "Teacher",
  605. status = "join",
  606. roles = new List<string>() { "assist" },
  607. name = tempTeacher.name,
  608. job = $"{tempShool.name}-顾问",
  609. size = 0,
  610. createTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
  611. };
  612. //添加学校学校顾问
  613. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<SchoolTeacher>(addSchoolTeacher, new PartitionKey($"Teacher-{tempShool.id}"));
  614. }
  615. }
  616. }
  617. }
  618. schoolAssist.id = tempShool.id;
  619. schoolAssist.code = tempShool.code;
  620. schoolAssist.pk = tempShool.pk;
  621. schoolAssist.ttl = tempShool.ttl;
  622. schoolAssist.schoolCode = tempShool.schoolCode;
  623. schoolAssist.name = tempShool.name;
  624. schoolAssist.period = tempShool.period;
  625. schoolAssist.campuses = tempShool.campuses;
  626. schoolAssist.region = tempShool.region;
  627. schoolAssist.province = tempShool.province;
  628. schoolAssist.city = tempShool.city;
  629. schoolAssist.dist = tempShool.dist;
  630. schoolAssist.areaId = tempShool.areaId;
  631. schoolAssist.size = tempShool.size;
  632. schoolAssist.address = tempShool.address;
  633. schoolAssist.picture = tempShool.picture;
  634. schoolAssist.timeZone = tempShool.timeZone;
  635. schoolAssist.type = tempShool.type;
  636. schoolAssist.standard = tempShool.standard;
  637. schoolAssist.hpappraise = tempShool.hpappraise;
  638. List<Assist> assists = new List<Assist>();
  639. //查询学校的顾问
  640. string managerSql = $"SELECT DISTINCT REPLACE(c.code, 'Teacher-', '') AS schoolId, c.id, c.name FROM c WHERE ARRAY_CONTAINS(c.roles, 'assist', true) AND c.pk = 'Teacher' AND c.status = 'join' AND c.code = 'Teacher-{tempShool.id}'";
  641. var cosmosClent = _azureCosmos.GetCosmosClient();
  642. await foreach (var item in cosmosClent.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
  643. {
  644. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  645. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  646. {
  647. Assist assist = new Assist
  648. {
  649. tmdId = obj.GetProperty("id").GetString(),
  650. tmdName = obj.GetProperty("name").GetString()
  651. };
  652. assists.Add(assist);
  653. }
  654. }
  655. schoolAssist.assists = assists;
  656. }
  657. //保存操作记录
  658. await _azureStorage.SaveLog("TeacherRoles-update", $"{_tmdName}【{_tmdId}】修改学校功能,修改的学校:{_schoolId},{string.Join("|", periodS.ToArray())},{picture},{size},{string.Join("|", assistId.ToArray())}", _dingDing, httpContext: HttpContext);
  659. return Ok(new { state = 200, schoolAssist });
  660. }
  661. catch (Exception ex)
  662. {
  663. await _dingDing.SendBotMsg($"BI, {_option.Location} /batchschool/upd-schoolassist \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  664. return BadRequest();
  665. }
  666. }
  667. /// <summary>
  668. /// 增加学段
  669. /// </summary>
  670. /// <returns></returns>
  671. [ProducesDefaultResponseType]
  672. [AuthToken(Roles = "assist")]
  673. [HttpPost("upd-schoolperiod")]
  674. public async Task<IActionResult> UpdSchoolPeriod(JsonElement jsonElement)
  675. {
  676. try
  677. {
  678. if (!jsonElement.TryGetProperty("schooId", out JsonElement _schoolCode)) return BadRequest(); //学校编号
  679. jsonElement.TryGetProperty("campusId", out JsonElement _campusId); //校区ID 新增时
  680. jsonElement.TryGetProperty("campusName", out JsonElement _campusName); //校区 新增时
  681. if (!jsonElement.TryGetProperty("periodName", out JsonElement _periodName)) return BadRequest(); //新增学段名称
  682. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest(); //醍摩豆账户
  683. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest(); //醍摩豆账号名称
  684. StringBuilder stringBuilder = new StringBuilder($"{_tmdId}【{_tmdName}】新增学校的学段,");
  685. School school = new();
  686. var cosmosClient = _azureCosmos.GetCosmosClient();
  687. try
  688. {
  689. school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_schoolCode}", new PartitionKey("Base"));
  690. }
  691. catch (Exception) { }
  692. if (school != null)
  693. {
  694. if (!string.IsNullOrEmpty($"{_campusId}"))
  695. {
  696. school.period.Add(new Period { id = Guid.NewGuid().ToString(), name = $"{_periodName}", campusId = $"{_campusId}" });
  697. stringBuilder.Append($"在原有校区中添加学段:学段ID:{_campusId}学段名称:{_periodName}");
  698. }
  699. else
  700. {
  701. string campusId = Guid.NewGuid().ToString();
  702. school.period.Add(new Period { id = Guid.NewGuid().ToString(), name = $"{_periodName}", campusId = campusId });
  703. school.campuses.Add(new Campus { id = campusId, name = $"{_campusName}" });
  704. stringBuilder.Append($"新建校区中在添加学段:学段ID:{_campusId}学段名称:{_periodName}");
  705. }
  706. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
  707. //保存操作记录
  708. await _azureStorage.SaveLog("schoolperiod-add", stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
  709. return Ok(new { state = 200, school });
  710. }
  711. else return Ok(new { state = 400, school });
  712. }
  713. catch (Exception ex)
  714. {
  715. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/upd-schoolperiod \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  716. return BadRequest();
  717. }
  718. }
  719. /// <summary>
  720. /// 修改学校学段信息
  721. /// </summary>
  722. /// <param name="jsonElement"></param>
  723. /// <returns></returns>
  724. [ProducesDefaultResponseType]
  725. [AuthToken(Roles = "assist")]
  726. [HttpPost("set-schoolperiod")]
  727. public async Task<IActionResult> SetSchoolPeriod(JsonElement jsonElement)
  728. {
  729. try
  730. {
  731. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest(); //醍摩豆账户
  732. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest(); //醍摩豆账号名称
  733. if (!jsonElement.TryGetProperty("schooId", out JsonElement _schoolCode)) return BadRequest(); //学校编号
  734. if (!jsonElement.TryGetProperty("setId", out JsonElement _setId)) return BadRequest(); //修改学段的ID
  735. if (!jsonElement.TryGetProperty("setName", out JsonElement _setName)) return BadRequest(); //修改学段的名称
  736. var cosmosClient = _azureCosmos.GetCosmosClient();
  737. School school = new();
  738. try
  739. {
  740. school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_schoolCode}", new PartitionKey("Base"));
  741. }
  742. catch (Exception) { }
  743. if (school != null)
  744. {
  745. school.period.Find(x => x.id.Equals($"{_setId}")).name = $"{_setName}";
  746. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
  747. //保存操作记录
  748. await _azureStorage.SaveLog("schoolperiod-update", $"{_tmdId}【{_tmdName}】修改学校学段信息,修改ID和名称:{_setId}{_setName}", _dingDing, httpContext: HttpContext);
  749. return Ok(new { state = 200, school });
  750. }
  751. else return Ok(new { state = 400, school });
  752. }
  753. catch (Exception ex)
  754. {
  755. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/set-schoolperiod \n {ex.Message}{ex.StackTrace} ", GroupNames.成都开发測試群組);
  756. return BadRequest();
  757. }
  758. }
  759. /// <summary>
  760. /// 删除学校学段
  761. /// </summary>
  762. /// <param name="jsonElement"></param>
  763. /// <returns></returns>
  764. [ProducesDefaultResponseType]
  765. [AuthToken(Roles = "assist")]
  766. [HttpPost("del-schoolperiod")]
  767. public async Task<IActionResult> DelSchoolPeriod(JsonElement jsonElement)
  768. {
  769. try
  770. {
  771. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest(); //醍摩豆账户
  772. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest(); //醍摩豆账号名称
  773. if (!jsonElement.TryGetProperty("schooId", out JsonElement _schoolCode)) return BadRequest(); //学校编号
  774. if (!jsonElement.TryGetProperty("delId", out JsonElement _delId)) return BadRequest(); //删除学段的ID
  775. var cosmosClient = _azureCosmos.GetCosmosClient();
  776. School school = new();
  777. try
  778. {
  779. school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_schoolCode}", new PartitionKey("Base"));
  780. }
  781. catch (Exception) { }
  782. if (school != null)
  783. {
  784. school.period.Remove(school.period.Find(x => x.id.Equals($"{_delId}")));
  785. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
  786. //保存操作记录
  787. await _azureStorage.SaveLog("ability-update", $"{_tmdId}【{_tmdName}】删除学校的学段", _dingDing, httpContext: HttpContext);
  788. return Ok(new { state = 200, school });
  789. }
  790. else return Ok(new { state = 400, school });
  791. }
  792. catch (Exception ex)
  793. {
  794. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/del-schoolperiod \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  795. return BadRequest();
  796. }
  797. }
  798. /// <summary>
  799. /// 增加、修改、删除学段信息
  800. /// </summary>
  801. /// <param name="jsonElement"></param>
  802. /// <returns></returns>
  803. [ProducesDefaultResponseType]
  804. [AuthToken(Roles = "assist")]
  805. [HttpPost("set-schoolperiodinfo")]
  806. public async Task<IActionResult> SetSchoolPeriodInfo(JsonElement jsonElement)
  807. {
  808. try
  809. {
  810. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest(); //醍摩豆账户
  811. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest(); //醍摩豆账号名称
  812. if (!jsonElement.TryGetProperty("schooId", out JsonElement _schoolCode)) return BadRequest(); //学校编号
  813. if (!jsonElement.TryGetProperty("mode", out JsonElement _mode)) return BadRequest(); //执行方式 upd 新增学段 set 修改学段 del删除学段
  814. jsonElement.TryGetProperty("campusId", out JsonElement _campusId); //校区ID 新增学段
  815. jsonElement.TryGetProperty("campusName", out JsonElement _campusName); //校区 新增学段
  816. jsonElement.TryGetProperty("periodName", out JsonElement _periodName); //新增学段名称
  817. jsonElement.TryGetProperty("setId", out JsonElement _setId); //修改学段的ID
  818. jsonElement.TryGetProperty("setName", out JsonElement _setName); //修改学段的名称
  819. jsonElement.TryGetProperty("delId", out JsonElement _delId); //删除学段的ID
  820. StringBuilder stringBuilder = new StringBuilder($"{_tmdId}【{_tmdName}】");
  821. string tempType = null;
  822. var cosmosClient = _azureCosmos.GetCosmosClient();
  823. School school = new();
  824. try
  825. {
  826. school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_schoolCode}", new PartitionKey("Base"));
  827. }
  828. catch (Exception) { }
  829. if (school != null)
  830. {
  831. switch ($"{_mode}")
  832. {
  833. //新增学段
  834. case "upd":
  835. if (string.IsNullOrEmpty($"{_periodName}")) return Ok(new { state = 1 });
  836. if (!string.IsNullOrEmpty($"{_campusId}"))
  837. {
  838. school.period.Add(new Period { id = Guid.NewGuid().ToString(), name = $"{_periodName}", campusId = $"{_campusId}" });
  839. stringBuilder.Append($"新增学校学段,在原有校区中添加学段:学段ID:{_campusId}学段名称:{_periodName}");
  840. }
  841. else
  842. {
  843. string campusId = Guid.NewGuid().ToString();
  844. school.period.Add(new Period { id = Guid.NewGuid().ToString(), name = $"{_periodName}", campusId = campusId });
  845. school.campuses.Add(new Campus { id = campusId, name = $"{_campusName}" });
  846. stringBuilder.Append($"新增学校学段,新建校区中在添加学段:学段ID:{_campusId}学段名称:{_periodName}");
  847. }
  848. tempType = "schoolperiod-add";
  849. break;
  850. //修改学段
  851. case "set":
  852. school.period.Find(x => x.id.Equals($"{_setId}")).name = $"{_setName}";
  853. stringBuilder.Append($"修改学校学段,修改ID和名称:{_setId}{_setName}");
  854. tempType = "schoolperiod-set";
  855. break;
  856. //删除学段
  857. case "del":
  858. school.period.Remove(school.period.Find(x => x.id.Equals($"{_delId}")));
  859. stringBuilder.Append($"删除学校的学段,删除学段ID和名称:{_delId}");
  860. tempType = "schoolperiod-del";
  861. break;
  862. default:
  863. return Ok(new { state = 1, message = "mode参数错误" });
  864. }
  865. //保存操作记录
  866. await _azureStorage.SaveLog(tempType?.ToString(), stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
  867. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
  868. return Ok(new { state = 200, school });
  869. }
  870. else return Ok(new { state = 400, school });
  871. }
  872. catch (Exception ex)
  873. {
  874. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/set-schoolperiodinfo \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  875. return BadRequest();
  876. }
  877. }
  878. /// <summary>
  879. /// 查询区域的学校
  880. /// </summary>
  881. /// <param name="jsonElement"></param>
  882. /// <returns></returns>
  883. [ProducesDefaultResponseType]
  884. [HttpPost("get-schooldist")]
  885. public async Task<IActionResult> GetSchoolDist(JsonElement jsonElement)
  886. {
  887. try
  888. {
  889. if (!jsonElement.TryGetProperty("dist", out JsonElement _dist)) return BadRequest();
  890. var cosmosClient = _azureCosmos.GetCosmosClient();
  891. string sqltxt = $"SELECT * FROM c where c.dist='{_dist}'";
  892. List<School> schools = new List<School>();
  893. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: sqltxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  894. {
  895. schools.Add(item);
  896. }
  897. return Ok(new { state = 200, schools });
  898. }
  899. catch (Exception ex)
  900. {
  901. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/get-schooldist \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  902. return BadRequest();
  903. }
  904. }
  905. #region 预设学校基础信息 多语言
  906. /// <summary>
  907. /// 预设学校基础信息 多语言
  908. /// </summary>
  909. /// <param name="period"></param>
  910. /// <param name="Language"></param>
  911. /// <param name="campusId"></param>
  912. /// <returns></returns>
  913. public List<Period> PresetSchoolPeriod(List<string> period, string Language, string campusId)
  914. {
  915. var builder = $"{_environment.ContentRootPath}/JsonFile/Preset/LangSchoolConfig.json";
  916. StreamReader streamReader = new StreamReader(new FileStream(builder, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.UTF8);
  917. StringBuilder stringBuilder = new StringBuilder();
  918. string text;
  919. while ((text = streamReader.ReadLine()) != null)
  920. {
  921. stringBuilder.Append(text.ToString());
  922. }
  923. streamReader.Close();
  924. string input = stringBuilder.ToString();
  925. List<SchoolConfig> schoolConfigs = input.ToObject<List<SchoolConfig>>();
  926. SchoolConfig schoolConfig = schoolConfigs.Find(x => x.Lang.Contains($"{Language}"));
  927. if (schoolConfig == null)
  928. {
  929. if (Language.Contains("en"))
  930. schoolConfig = schoolConfigs.Find(x => x.Lang.Contains("en-US"));
  931. else
  932. schoolConfig = schoolConfigs.Find(x => x.Lang.Contains("zh-CN"));
  933. }
  934. List<Period> periods = new List<Period>();
  935. period.ForEach(x =>
  936. {
  937. periods.Add(new Period
  938. {
  939. id = Guid.NewGuid().ToString(),
  940. name = x,
  941. campusId = campusId,
  942. semesters = new List<Semester>() { new Semester { name = schoolConfig.semester[0].term, start = schoolConfig.semester[0].start, month = schoolConfig.semester[0].month, day = schoolConfig.semester[0].day, id = Guid.NewGuid().ToString() },
  943. new Semester { name = schoolConfig.semester[1].term, start = schoolConfig.semester[1].start, month = schoolConfig.semester[1].month, day = schoolConfig.semester[1].day, id = Guid.NewGuid().ToString() } },
  944. subjects = new List<Subject>() {
  945. new Subject { id=Guid.NewGuid().ToString(),name=schoolConfig.PresetSubject[0].name,type=schoolConfig.PresetSubject[0].type },
  946. new Subject { id=Guid.NewGuid().ToString(),name=schoolConfig.PresetSubject[1].name,type=schoolConfig.PresetSubject[1].type },
  947. new Subject { id=Guid.NewGuid().ToString(),name=schoolConfig.PresetSubject[2].name,type=schoolConfig.PresetSubject[2].type }
  948. },
  949. grades = schoolConfig.grades,
  950. analysis = new Analysis()
  951. {
  952. type = new List<ExamSimple>() { new ExamSimple { id = Guid.NewGuid().ToString(), name = schoolConfig.PresetExam[0].type[0].name },
  953. new ExamSimple { id = Guid.NewGuid().ToString(), name = schoolConfig.PresetExam[0].type[1].name },
  954. new ExamSimple { id = Guid.NewGuid().ToString(), name = schoolConfig.PresetExam[0].type[2].name },
  955. new ExamSimple { id = Guid.NewGuid().ToString(), name = schoolConfig.PresetExam[0].type[3].name } },
  956. income = schoolConfig.PresetExam[0].income,
  957. eugenics = schoolConfig.PresetExam[0].eugenics,
  958. touch = schoolConfig.PresetExam[0].touch
  959. }
  960. });
  961. });
  962. return periods;
  963. }
  964. public record SchoolConfig
  965. {
  966. public string Lang { get; set; }
  967. public List<semester> semester { get; set; }
  968. public List<string> grades { get; set; }
  969. public List<PresetSubject> PresetSubject { get; set; }
  970. public List<PresetExam> PresetExam { get; set; }
  971. }
  972. public record semester
  973. {
  974. public string id { get; set; } = Guid.NewGuid().ToString();
  975. public string term { get; set; }
  976. public int start { get; set; }
  977. public int month { get; set; }
  978. public int day { get; set; }
  979. }
  980. public record PresetSubject
  981. {
  982. public string id { get; set; } = Guid.NewGuid().ToString();
  983. public string name { get; set; }
  984. public int type { get; set; }
  985. }
  986. public record PresetExam
  987. {
  988. public List<StudyType> type { get; set; }
  989. public int income { get; set; }
  990. public int eugenics { get; set; }
  991. public int touch { get; set; }
  992. }
  993. public record StudyType
  994. {
  995. public string id { get; set; } = Guid.NewGuid().ToString();
  996. public string name { get; set; }
  997. }
  998. #endregion
  999. public class SchoolAssist : School
  1000. {
  1001. public List<Assist> assists { get; set; }
  1002. }
  1003. public class Assist
  1004. {
  1005. public string tmdId { get; set; }
  1006. public string tmdName { get; set; }
  1007. }
  1008. /// <summary>
  1009. /// 创建多个学校实体
  1010. /// </summary>
  1011. public record FoundSchools()
  1012. {
  1013. /// <summary>
  1014. ///醍摩豆账户ID
  1015. /// </summary>
  1016. public string tmdId { get; set; }
  1017. /// <summary>
  1018. /// 醍摩豆账户名称
  1019. /// </summary>
  1020. public string tmdName { get; set; }
  1021. /// <summary>
  1022. /// 语系
  1023. /// </summary>
  1024. public string lang { get; set; }
  1025. /// <summary>
  1026. /// 批量创校的数据结构
  1027. /// </summary>
  1028. public List<BISchool> biSchools { get; set; } = new List<BISchool>();
  1029. }
  1030. /// <summary>
  1031. /// 批量创校的数据结构
  1032. /// </summary>
  1033. public record BISchool()
  1034. {
  1035. /// <summary>
  1036. /// 学校名称
  1037. /// </summary>
  1038. public string name { get; set; }
  1039. /// <summary>
  1040. /// 学校管理员
  1041. /// </summary>
  1042. public string admin { get; set; }
  1043. /// <summary>
  1044. /// 学校的学段
  1045. /// </summary>
  1046. public List<string> period { get; set; }
  1047. /// <summary>
  1048. /// 学校空间大小
  1049. /// </summary>
  1050. public int size { get; set; }
  1051. /// <summary>
  1052. /// 地区
  1053. /// </summary>
  1054. public string region { get; set; }
  1055. /// <summary>
  1056. /// 省份
  1057. /// </summary>
  1058. public string province { get; set; }
  1059. /// <summary>
  1060. /// 城市
  1061. /// </summary>
  1062. public string city { get; set; }
  1063. /// <summary>
  1064. /// 县,区,郡
  1065. /// </summary>
  1066. public string dist { get; set; }
  1067. /// <summary>
  1068. /// 学校详细地址
  1069. /// </summary>
  1070. public string address { get; set; }
  1071. }
  1072. public record Exist()
  1073. {
  1074. public string ID { get; set; }
  1075. public string name { get; set; }
  1076. }
  1077. }
  1078. }