BatchSchoolController.cs 61 KB

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