BatchSchoolController.cs 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231
  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. namespace TEAMModelBI.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 == 0 ? 100 : 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. areaId = bischool.areaId,
  257. schoolCode = createSchoolInfo.id,
  258. period = PresetSchoolPeriod(bischool.period, foundSchools.lang, campusId),
  259. scale = bischool.size >= 300 ? 500 : 0
  260. };
  261. stringBuilder.Append($"创建学校:{upSchool.name}【{upSchool.id}】");
  262. //创建学校
  263. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<School>(upSchool, new PartitionKey(upSchool.code));
  264. Teacher teacher = null;
  265. try
  266. {
  267. //查询该教师是否存在
  268. teacher = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>($"{tmdId}", new PartitionKey("Base"));
  269. }
  270. catch
  271. {
  272. }
  273. if (teacher != null)
  274. {
  275. //教师存在,在该教师信息中添加要管理的学校信息
  276. teacher.schools.Add(new Teacher.TeacherSchool {areaId=bischool.areaId, schoolId = createSchoolInfo.id, name = bischool.name, status = "join", time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() });
  277. //await cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacher, tmdId, new PartitionKey("Base"));
  278. SchoolTeacher schoolTeacher = new SchoolTeacher
  279. {
  280. id = tmdId,
  281. code = $"Teacher-{createSchoolInfo.id}",
  282. roles = new List<string> { "admin", "teacher" },
  283. job = "管理员",
  284. name = teacher.name,
  285. picture = teacher.picture,
  286. status = "join",
  287. createTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
  288. pk = "Teacher",
  289. ttl = -1
  290. };
  291. stringBuilder.Append($"教师信息:{schoolTeacher.name}【{schoolTeacher.id}】,教师权限:{string.Join(",", schoolTeacher.roles)}");
  292. await cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacher, teacher.id, new PartitionKey(teacher.code));
  293. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<SchoolTeacher>(schoolTeacher, new PartitionKey(schoolTeacher.code));
  294. }
  295. else
  296. {
  297. //不存在 新建教师和新建要管理的学校信息
  298. Teacher addteacher = new Teacher
  299. {
  300. id = tmdId,
  301. pk = "Base",
  302. code = "Base",
  303. name = $"{bischool.name}-管理员"?.ToString(),
  304. picture = "",
  305. //创建账号并第一次登录IES5则默认赠送1G
  306. size = 1,
  307. defaultSchool = createSchoolInfo.id,
  308. schools = new List<Teacher.TeacherSchool>() { new Teacher.TeacherSchool { schoolId = createSchoolInfo.id, name = bischool.name, status = "join", time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() } }
  309. };
  310. stringBuilder.Append($"没有该教师信息创建的教师信息:{addteacher.name}【{addteacher.id}】");
  311. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").CreateItemAsync<Teacher>(addteacher, new PartitionKey("Base"));
  312. SchoolTeacher schoolTeacher = new SchoolTeacher
  313. {
  314. id = tmdId,
  315. code = $"Teacher-{createSchoolInfo.id}",
  316. roles = new List<string> { "admin", "teacher" },
  317. job = "管理员",
  318. name = $"{tmdId}-管理员",
  319. picture = "",
  320. status = "join",
  321. createTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
  322. pk = "Teacher",
  323. ttl = -1
  324. };
  325. stringBuilder.Append($"教师权限:{string.Join(",", schoolTeacher.roles)}");
  326. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<SchoolTeacher>(schoolTeacher, new PartitionKey(schoolTeacher.code));
  327. }
  328. }
  329. }
  330. }
  331. else return Ok(new { state = 1, message = "创校信息为空" });
  332. //保存操作记录
  333. await _azureStorage.SaveLog("school-batchAdd", stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
  334. if (schools.Count > 0)
  335. return Ok(new { state = 201, message = "已有部分学校批量创建成功;学校编号已经重复!请检查学校编号!", schools = schools });
  336. else
  337. return Ok(new { state = 200, message = "批量创校已全部完成" });
  338. }
  339. catch (Exception ex)
  340. {
  341. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/batch-school \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  342. return BadRequest();
  343. }
  344. }
  345. /// <summary>
  346. /// 依据学校编号查询学校信息;若是没有传学校编号,则查询所有学校信息
  347. /// </summary>
  348. /// <param name="jsonElement"></param>
  349. /// <returns></returns>
  350. [ProducesDefaultResponseType]
  351. [HttpPost("get-schoolsinfo")]
  352. public async Task<IActionResult> GetSchoolsInfo(JsonElement jsonElement)
  353. {
  354. try
  355. {
  356. jsonElement.TryGetProperty("schoolCode", out JsonElement _schoolCode);
  357. var cosmosClient = _azureCosmos.GetCosmosClient();
  358. List<School> schools = new List<School>();
  359. List<SchoolAssist> schoolAssists = new List<SchoolAssist>();
  360. StringBuilder stringBuilder = new StringBuilder("select value(c) from c");
  361. if (!string.IsNullOrEmpty($"{_schoolCode}"))
  362. {
  363. stringBuilder.Append($" where c.id='{_schoolCode}'");
  364. }
  365. await foreach (var itemSchool in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: stringBuilder.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  366. {
  367. SchoolAssist schoolAssist = new SchoolAssist();
  368. schoolAssist.id = itemSchool.id;
  369. schoolAssist.code = itemSchool.code;
  370. schoolAssist.pk = itemSchool.pk;
  371. schoolAssist.ttl = itemSchool.ttl;
  372. schoolAssist.schoolCode = itemSchool.schoolCode;
  373. schoolAssist.name = itemSchool.name;
  374. schoolAssist.period = itemSchool.period;
  375. schoolAssist.campuses = itemSchool.campuses;
  376. schoolAssist.region = itemSchool.region;
  377. schoolAssist.province = itemSchool.province;
  378. schoolAssist.city = itemSchool.city;
  379. schoolAssist.dist = itemSchool.dist;
  380. schoolAssist.areaId = itemSchool.areaId;
  381. schoolAssist.size = itemSchool.size;
  382. schoolAssist.address = itemSchool.address;
  383. schoolAssist.picture = itemSchool.picture;
  384. schoolAssist.timeZone = itemSchool.timeZone;
  385. schoolAssist.type = itemSchool.type;
  386. schoolAssist.standard = itemSchool.standard;
  387. schoolAssist.hpappraise = itemSchool.hpappraise;
  388. schoolAssist.standard = itemSchool.standard;
  389. schoolAssist.areaId = itemSchool.areaId;
  390. List<Assist> assists = new List<Assist>();
  391. //查询学校的顾问
  392. 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}'";
  393. var cosmosClent = _azureCosmos.GetCosmosClient();
  394. await foreach (var item in cosmosClent.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
  395. {
  396. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  397. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  398. {
  399. Assist assist = new Assist
  400. {
  401. tmdId = obj.GetProperty("id").GetString(),
  402. tmdName = obj.GetProperty("name").GetString()
  403. };
  404. assists.Add(assist);
  405. }
  406. }
  407. schoolAssist.assists = assists;
  408. schoolAssists.Add(schoolAssist);
  409. }
  410. return Ok(new { state = 200, schoolAssists });
  411. }
  412. catch (Exception ex)
  413. {
  414. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/get-schoolsinfo \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  415. return BadRequest();
  416. }
  417. }
  418. /// <summary>
  419. /// 取得学校所有顾问列表
  420. /// </summary>
  421. /// <returns></returns>
  422. [ProducesDefaultResponseType]
  423. [HttpPost("get-schoolassist")]
  424. public async Task<IActionResult> GetSchoolAssist(JsonElement jsonElement)
  425. {
  426. try
  427. {
  428. string schoolId = (jsonElement.TryGetProperty("schoolId", out JsonElement _schoolId)) ? _schoolId.GetString() : string.Empty;
  429. Dictionary<string, List<Dictionary<string, string>>> haveSchoolManger = new Dictionary<string, List<Dictionary<string, string>>>();
  430. string managerWhereOption = (!string.IsNullOrWhiteSpace(schoolId)) ? $" AND c.code = 'Teacher-{schoolId}'" : string.Empty;
  431. //查询学校的顾问
  432. 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}";
  433. var cosmosClent = _azureCosmos.GetCosmosClient();
  434. await foreach (var item in cosmosClent.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
  435. {
  436. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  437. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  438. {
  439. string id = obj.GetProperty("id").GetString(); //管理员ID
  440. string name = obj.GetProperty("name").GetString(); //管理员姓名
  441. string tempSchoolId = obj.GetProperty("schoolId").GetString(); //学校ID
  442. Dictionary<string, string> managerDic = new Dictionary<string, string>();
  443. managerDic.Add("id", id);
  444. managerDic.Add("name", name);
  445. if (haveSchoolManger.ContainsKey(tempSchoolId))
  446. {
  447. haveSchoolManger[tempSchoolId].Add(managerDic);
  448. }
  449. else
  450. {
  451. List<Dictionary<string, string>> managerList = new List<Dictionary<string, string>>();
  452. managerList.Add(managerDic);
  453. haveSchoolManger.Add(tempSchoolId, managerList);
  454. }
  455. }
  456. }
  457. //管理模组学校
  458. List<string> baseModuleSchoos = new List<string>();
  459. string baseWhereOption = (!string.IsNullOrEmpty(schoolId)) ? $" and c.id='{schoolId}'" : string.Empty;
  460. 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") }))
  461. {
  462. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  463. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  464. {
  465. string tempSchoolId = obj.GetProperty("id").GetString(); //学校ID
  466. baseModuleSchoos.Add(tempSchoolId);
  467. }
  468. }
  469. //学校信息
  470. List<object> schools = new List<object>();
  471. string schoolWhereOption = (!string.IsNullOrEmpty(schoolId)) ? $" where c.id='{schoolId}'" : string.Empty;
  472. 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") }))
  473. {
  474. using var json = await JsonDocument.ParseAsync(item.ContentStream);
  475. foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  476. {
  477. dynamic schoolExpando = new ExpandoObject();
  478. schoolExpando.id = obj.GetProperty("id").GetString();
  479. schoolExpando.name = obj.GetProperty("name").GetString();
  480. //schoolExpando.period = obj.GetProperty("period");
  481. schoolExpando.schoolCode = obj.GetProperty("schoolCode").GetString();
  482. schoolExpando.region = obj.GetProperty("region").GetString();
  483. schoolExpando.province = obj.GetProperty("province").GetString();
  484. schoolExpando.city = obj.GetProperty("city").GetString();
  485. schoolExpando.picture = obj.GetProperty("picture").GetString();
  486. if (haveSchoolManger.ContainsKey(schoolExpando.id))
  487. {
  488. schoolExpando.hasMarger = true;
  489. schoolExpando.managers = haveSchoolManger[schoolExpando.id];
  490. }
  491. else
  492. {
  493. schoolExpando.hasMarger = false;
  494. schoolExpando.managers = new List<object>();
  495. }
  496. schoolExpando.hasBaseModule = (baseModuleSchoos.Contains(schoolExpando.id)) ? true : false;
  497. schools.Add(schoolExpando);
  498. }
  499. }
  500. return Ok(new { state = 200, schools });
  501. }
  502. catch (Exception ex)
  503. {
  504. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/get-schools \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  505. return BadRequest();
  506. }
  507. }
  508. /// <summary>
  509. /// 修改学校信息和顾问信息
  510. /// </summary>
  511. /// <param name="jsonElement"></param>
  512. /// <returns></returns>
  513. [ProducesDefaultResponseType]
  514. [AuthToken(Roles = "assist")]
  515. [HttpPost("upd-schoolassist")]
  516. public async Task<IActionResult> UpdSchoolAssist(JsonElement jsonElement)
  517. {
  518. try
  519. {
  520. if (!jsonElement.TryGetProperty("schoolId", out JsonElement _schoolId)) return BadRequest();
  521. if (!jsonElement.TryGetProperty("period", out JsonElement period)) return BadRequest();
  522. if (!jsonElement.TryGetProperty("picture", out JsonElement picture)) return BadRequest();
  523. if (!jsonElement.TryGetProperty("size", out JsonElement size)) return BadRequest();
  524. if (!jsonElement.TryGetProperty("scale", out JsonElement scale)) return BadRequest();
  525. if (!jsonElement.TryGetProperty("assistId", out JsonElement _assistId)) return BadRequest();
  526. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest();
  527. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest();
  528. List<string> assistId = _assistId.ToObject<List<string>>();
  529. List<string> periodS = period.ToObject<List<string>>();
  530. Dictionary<string, List<Dictionary<string, string>>> haveSchoolManger = new Dictionary<string, List<Dictionary<string, string>>>();
  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.scale = !string.IsNullOrEmpty($"{scale}") ? int.Parse($"{scale}") : tempShool.scale;
  544. tempShool.picture = $"{picture}";
  545. //修改学校
  546. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(tempShool, tempShool.id, new PartitionKey("Base"));
  547. string sqlTxt = $"SELECT value(c) From c WHERE ARRAY_CONTAINS(c.roles,'assist',true)";
  548. List<SchoolTeacher> schoolTeachers = new List<SchoolTeacher>();
  549. await foreach (var item in cosmosClient.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<SchoolTeacher>(queryText: sqlTxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Teacher-{tempShool.id}") }))
  550. {
  551. if (!assistId.Contains(item.id))
  552. {
  553. if (item.roles.Contains("assist"))
  554. {
  555. item.roles.Remove("assist");
  556. if (item.roles.Count > 0)
  557. {
  558. var tem = await cosmosClient.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<SchoolTeacher>(item, item.id, new PartitionKey(item.code));
  559. }
  560. else
  561. {
  562. var tems = await cosmosClient.GetContainer("TEAMModelOS", "School").DeleteItemAsync<SchoolTeacher>(item.id, new PartitionKey(item.code));
  563. }
  564. }
  565. }
  566. //bool temp = item.roles.Contains("assist");
  567. }
  568. if (assistId.Count > 0)
  569. {
  570. foreach (var itemTeacher in assistId)
  571. {
  572. Teacher tempTeacher = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>($"{itemTeacher}", new PartitionKey("Base"));
  573. if (tempTeacher != null)
  574. {
  575. var haveTeacher = tempTeacher.schools.Find(x => x.schoolId.Equals($"{_schoolId}"));
  576. if (haveTeacher != null)
  577. {
  578. //查询该教师是否存在该校
  579. SchoolTeacher schoolTeacher = null;
  580. try
  581. {
  582. schoolTeacher = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<SchoolTeacher>($"{itemTeacher}", new PartitionKey($"Teacher-{tempShool.id}"));
  583. }
  584. catch
  585. {
  586. }
  587. if (schoolTeacher != null)
  588. {
  589. if (!schoolTeacher.roles.Contains("assist"))
  590. {
  591. schoolTeacher.roles.Add("assist");
  592. //添加顾问权限
  593. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<SchoolTeacher>(schoolTeacher, schoolTeacher.id, new PartitionKey($"Teacher-{tempShool.id}"));
  594. }
  595. }
  596. else
  597. {
  598. SchoolTeacher addSchoolTeacher = new SchoolTeacher
  599. {
  600. id = itemTeacher,
  601. code = $"Teacher-{tempShool.id}",
  602. pk = "Teacher",
  603. status = "join",
  604. roles = new List<string>() { "assist" },
  605. name = tempTeacher.name,
  606. job = $"{tempShool.name}-顾问",
  607. size = 0,
  608. createTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
  609. };
  610. //添加学校顾问
  611. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<SchoolTeacher>(addSchoolTeacher, new PartitionKey($"Teacher-{tempShool.id}"));
  612. }
  613. }
  614. else
  615. {
  616. Teacher.TeacherSchool teacherSchool = new Teacher.TeacherSchool
  617. {
  618. schoolId = tempShool.id,
  619. name = tempShool.name,
  620. status = "join",
  621. time = DateTimeOffset.UtcNow.ToUnixTimeSeconds(),
  622. picture = tempShool.picture,
  623. areaId = tempShool.areaId
  624. };
  625. tempTeacher.schools.Add(teacherSchool);
  626. //给醍摩豆顾问添加学校
  627. await cosmosClient.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(tempTeacher, tempTeacher.id, new PartitionKey($"Base"));
  628. //不存在则在原来的基础上添加顾问角色
  629. SchoolTeacher addSchoolTeacher = new SchoolTeacher
  630. {
  631. id = itemTeacher,
  632. code = $"Teacher-{tempShool.id}",
  633. pk = "Teacher",
  634. status = "join",
  635. roles = new List<string>() { "assist" },
  636. name = tempTeacher.name,
  637. job = $"{tempShool.name}-顾问",
  638. size = 0,
  639. createTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
  640. };
  641. //添加学校学校顾问
  642. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<SchoolTeacher>(addSchoolTeacher, new PartitionKey($"Teacher-{tempShool.id}"));
  643. }
  644. }
  645. }
  646. }
  647. //SchoolAssist schoolAssist = new();
  648. //schoolAssist.id = tempShool.id;
  649. //schoolAssist.code = tempShool.code;
  650. //schoolAssist.pk = tempShool.pk;
  651. //schoolAssist.ttl = tempShool.ttl;
  652. //schoolAssist.schoolCode = tempShool.schoolCode;
  653. //schoolAssist.name = tempShool.name;
  654. //schoolAssist.period = tempShool.period;
  655. //schoolAssist.campuses = tempShool.campuses;
  656. //schoolAssist.region = tempShool.region;
  657. //schoolAssist.province = tempShool.province;
  658. //schoolAssist.city = tempShool.city;
  659. //schoolAssist.dist = tempShool.dist;
  660. //schoolAssist.areaId = tempShool.areaId;
  661. //schoolAssist.size = tempShool.size;
  662. //schoolAssist.address = tempShool.address;
  663. //schoolAssist.picture = tempShool.picture;
  664. //schoolAssist.timeZone = tempShool.timeZone;
  665. //schoolAssist.type = tempShool.type;
  666. //schoolAssist.standard = tempShool.standard;
  667. //schoolAssist.hpappraise = tempShool.hpappraise;
  668. //List<Assist> assists = new List<Assist>();
  669. ////查询学校的顾问
  670. //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}'";
  671. //var cosmosClent = _azureCosmos.GetCosmosClient();
  672. //await foreach (var item in cosmosClent.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: managerSql, requestOptions: new QueryRequestOptions() { }))
  673. //{
  674. // using var json = await JsonDocument.ParseAsync(item.ContentStream);
  675. // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
  676. // {
  677. // Assist assist = new Assist
  678. // {
  679. // tmdId = obj.GetProperty("id").GetString(),
  680. // tmdName = obj.GetProperty("name").GetString()
  681. // };
  682. // assists.Add(assist);
  683. // }
  684. //}
  685. //schoolAssist.assists = assists;
  686. }
  687. //保存操作记录
  688. await _azureStorage.SaveLog("TeacherRoles-update", $"{_tmdName}【{_tmdId}】修改学校功能,修改的学校:{_schoolId},{string.Join("|", periodS.ToArray())},{picture},{size},{string.Join("|", assistId.ToArray())}", _dingDing, httpContext: HttpContext);
  689. return Ok(new { state = 200 });
  690. }
  691. catch (Exception ex)
  692. {
  693. await _dingDing.SendBotMsg($"BI, {_option.Location} /batchschool/upd-schoolassist \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  694. return BadRequest();
  695. }
  696. }
  697. /// <summary>
  698. /// 增加学段
  699. /// </summary>
  700. /// <returns></returns>
  701. [ProducesDefaultResponseType]
  702. [AuthToken(Roles = "assist")]
  703. [HttpPost("upd-schoolperiod")]
  704. public async Task<IActionResult> UpdSchoolPeriod(JsonElement jsonElement)
  705. {
  706. try
  707. {
  708. if (!jsonElement.TryGetProperty("schooId", out JsonElement _schoolCode)) return BadRequest(); //学校编号
  709. jsonElement.TryGetProperty("campusId", out JsonElement _campusId); //校区ID 新增时
  710. jsonElement.TryGetProperty("campusName", out JsonElement _campusName); //校区 新增时
  711. if (!jsonElement.TryGetProperty("periodName", out JsonElement _periodName)) return BadRequest(); //新增学段名称
  712. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest(); //醍摩豆账户
  713. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest(); //醍摩豆账号名称
  714. StringBuilder stringBuilder = new StringBuilder($"{_tmdId}【{_tmdName}】新增学校的学段,");
  715. School school = new();
  716. var cosmosClient = _azureCosmos.GetCosmosClient();
  717. try
  718. {
  719. school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_schoolCode}", new PartitionKey("Base"));
  720. }
  721. catch (Exception) { }
  722. if (school != null)
  723. {
  724. if (!string.IsNullOrEmpty($"{_campusId}"))
  725. {
  726. school.period.Add(new Period { id = Guid.NewGuid().ToString(), name = $"{_periodName}", campusId = $"{_campusId}" });
  727. stringBuilder.Append($"在原有校区中添加学段:学段ID:{_campusId}学段名称:{_periodName}");
  728. }
  729. else
  730. {
  731. string campusId = Guid.NewGuid().ToString();
  732. school.period.Add(new Period { id = Guid.NewGuid().ToString(), name = $"{_periodName}", campusId = campusId });
  733. school.campuses.Add(new Campus { id = campusId, name = $"{_campusName}" });
  734. stringBuilder.Append($"新建校区中在添加学段:学段ID:{_campusId}学段名称:{_periodName}");
  735. }
  736. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
  737. //保存操作记录
  738. await _azureStorage.SaveLog("schoolperiod-add", stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
  739. return Ok(new { state = 200, school });
  740. }
  741. else return Ok(new { state = 400, school });
  742. }
  743. catch (Exception ex)
  744. {
  745. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/upd-schoolperiod \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  746. return BadRequest();
  747. }
  748. }
  749. /// <summary>
  750. /// 修改学校学段信息
  751. /// </summary>
  752. /// <param name="jsonElement"></param>
  753. /// <returns></returns>
  754. [ProducesDefaultResponseType]
  755. [AuthToken(Roles = "assist")]
  756. [HttpPost("set-schoolperiod")]
  757. public async Task<IActionResult> SetSchoolPeriod(JsonElement jsonElement)
  758. {
  759. try
  760. {
  761. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest(); //醍摩豆账户
  762. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest(); //醍摩豆账号名称
  763. if (!jsonElement.TryGetProperty("schooId", out JsonElement _schoolCode)) return BadRequest(); //学校编号
  764. if (!jsonElement.TryGetProperty("setId", out JsonElement _setId)) return BadRequest(); //修改学段的ID
  765. if (!jsonElement.TryGetProperty("setName", out JsonElement _setName)) return BadRequest(); //修改学段的名称
  766. var cosmosClient = _azureCosmos.GetCosmosClient();
  767. School school = new();
  768. try
  769. {
  770. school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_schoolCode}", new PartitionKey("Base"));
  771. }
  772. catch (Exception) { }
  773. if (school != null)
  774. {
  775. school.period.Find(x => x.id.Equals($"{_setId}")).name = $"{_setName}";
  776. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
  777. //保存操作记录
  778. await _azureStorage.SaveLog("schoolperiod-update", $"{_tmdId}【{_tmdName}】修改学校学段信息,修改ID和名称:{_setId}{_setName}", _dingDing, httpContext: HttpContext);
  779. return Ok(new { state = 200, school });
  780. }
  781. else return Ok(new { state = 400, school });
  782. }
  783. catch (Exception ex)
  784. {
  785. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/set-schoolperiod \n {ex.Message}{ex.StackTrace} ", GroupNames.成都开发測試群組);
  786. return BadRequest();
  787. }
  788. }
  789. /// <summary>
  790. /// 删除学校学段
  791. /// </summary>
  792. /// <param name="jsonElement"></param>
  793. /// <returns></returns>
  794. [ProducesDefaultResponseType]
  795. [AuthToken(Roles = "assist")]
  796. [HttpPost("del-schoolperiod")]
  797. public async Task<IActionResult> DelSchoolPeriod(JsonElement jsonElement)
  798. {
  799. try
  800. {
  801. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest(); //醍摩豆账户
  802. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest(); //醍摩豆账号名称
  803. if (!jsonElement.TryGetProperty("schooId", out JsonElement _schoolCode)) return BadRequest(); //学校编号
  804. if (!jsonElement.TryGetProperty("delId", out JsonElement _delId)) return BadRequest(); //删除学段的ID
  805. var cosmosClient = _azureCosmos.GetCosmosClient();
  806. School school = new();
  807. try
  808. {
  809. school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_schoolCode}", new PartitionKey("Base"));
  810. }
  811. catch (Exception) { }
  812. if (school != null)
  813. {
  814. school.period.Remove(school.period.Find(x => x.id.Equals($"{_delId}")));
  815. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
  816. //保存操作记录
  817. await _azureStorage.SaveLog("ability-update", $"{_tmdId}【{_tmdName}】删除学校的学段", _dingDing, httpContext: HttpContext);
  818. return Ok(new { state = 200, school });
  819. }
  820. else return Ok(new { state = 400, school });
  821. }
  822. catch (Exception ex)
  823. {
  824. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/del-schoolperiod \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  825. return BadRequest();
  826. }
  827. }
  828. /// <summary>
  829. /// 增加、修改、删除学段信息
  830. /// </summary>
  831. /// <param name="jsonElement"></param>
  832. /// <returns></returns>
  833. [ProducesDefaultResponseType]
  834. [AuthToken(Roles = "assist")]
  835. [HttpPost("set-schoolperiodinfo")]
  836. public async Task<IActionResult> SetSchoolPeriodInfo(JsonElement jsonElement)
  837. {
  838. try
  839. {
  840. if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest(); //醍摩豆账户
  841. if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest(); //醍摩豆账号名称
  842. if (!jsonElement.TryGetProperty("schooId", out JsonElement _schoolCode)) return BadRequest(); //学校编号
  843. if (!jsonElement.TryGetProperty("mode", out JsonElement _mode)) return BadRequest(); //执行方式 upd 新增学段 set 修改学段 del删除学段
  844. jsonElement.TryGetProperty("campusId", out JsonElement _campusId); //校区ID 新增学段
  845. jsonElement.TryGetProperty("campusName", out JsonElement _campusName); //校区 新增学段
  846. jsonElement.TryGetProperty("periodName", out JsonElement _periodName); //新增学段名称
  847. jsonElement.TryGetProperty("setId", out JsonElement _setId); //修改学段的ID
  848. jsonElement.TryGetProperty("setName", out JsonElement _setName); //修改学段的名称
  849. jsonElement.TryGetProperty("delId", out JsonElement _delId); //删除学段的ID
  850. StringBuilder stringBuilder = new StringBuilder($"{_tmdId}【{_tmdName}】");
  851. string tempType = null;
  852. var cosmosClient = _azureCosmos.GetCosmosClient();
  853. School school = new();
  854. try
  855. {
  856. school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{_schoolCode}", new PartitionKey("Base"));
  857. }
  858. catch (Exception) { }
  859. if (school != null)
  860. {
  861. switch ($"{_mode}")
  862. {
  863. //新增学段
  864. case "upd":
  865. if (string.IsNullOrEmpty($"{_periodName}")) return Ok(new { state = 1 });
  866. if (!string.IsNullOrEmpty($"{_campusId}"))
  867. {
  868. school.period.Add(new Period { id = Guid.NewGuid().ToString(), name = $"{_periodName}", campusId = $"{_campusId}" });
  869. stringBuilder.Append($"新增学校学段,在原有校区中添加学段:学段ID:{_campusId}学段名称:{_periodName}");
  870. }
  871. else
  872. {
  873. string campusId = Guid.NewGuid().ToString();
  874. school.period.Add(new Period { id = Guid.NewGuid().ToString(), name = $"{_periodName}", campusId = campusId });
  875. school.campuses.Add(new Campus { id = campusId, name = $"{_campusName}" });
  876. stringBuilder.Append($"新增学校学段,新建校区中在添加学段:学段ID:{_campusId}学段名称:{_periodName}");
  877. }
  878. tempType = "schoolperiod-add";
  879. break;
  880. //修改学段
  881. case "set":
  882. school.period.Find(x => x.id.Equals($"{_setId}")).name = $"{_setName}";
  883. stringBuilder.Append($"修改学校学段,修改ID和名称:{_setId}{_setName}");
  884. tempType = "schoolperiod-set";
  885. break;
  886. //删除学段
  887. case "del":
  888. school.period.Remove(school.period.Find(x => x.id.Equals($"{_delId}")));
  889. stringBuilder.Append($"删除学校的学段,删除学段ID和名称:{_delId}");
  890. tempType = "schoolperiod-del";
  891. break;
  892. default:
  893. return Ok(new { state = 1, message = "mode参数错误" });
  894. }
  895. //保存操作记录
  896. await _azureStorage.SaveLog(tempType?.ToString(), stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
  897. await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
  898. return Ok(new { state = 200, school });
  899. }
  900. else return Ok(new { state = 400, school });
  901. }
  902. catch (Exception ex)
  903. {
  904. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/set-schoolperiodinfo \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  905. return BadRequest();
  906. }
  907. }
  908. /// <summary>
  909. /// 查询区域的学校
  910. /// </summary>
  911. /// <param name="jsonElement"></param>
  912. /// <returns></returns>
  913. [ProducesDefaultResponseType]
  914. [HttpPost("get-schooldist")]
  915. public async Task<IActionResult> GetSchoolDist(JsonElement jsonElement)
  916. {
  917. try
  918. {
  919. if (!jsonElement.TryGetProperty("dist", out JsonElement _dist)) return BadRequest();
  920. var cosmosClient = _azureCosmos.GetCosmosClient();
  921. string sqltxt = $"SELECT * FROM c where c.dist='{_dist}'";
  922. List<School> schools = new List<School>();
  923. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: sqltxt, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
  924. {
  925. schools.Add(item);
  926. }
  927. return Ok(new { state = 200, schools });
  928. }
  929. catch (Exception ex)
  930. {
  931. await _dingDing.SendBotMsg($"BI,{_option.Location} /batchschool/get-schooldist \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
  932. return BadRequest();
  933. }
  934. }
  935. #region 预设学校基础信息 多语言
  936. /// <summary>
  937. /// 预设学校基础信息 多语言
  938. /// </summary>
  939. /// <param name="period"></param>
  940. /// <param name="Language"></param>
  941. /// <param name="campusId"></param>
  942. /// <returns></returns>
  943. public List<Period> PresetSchoolPeriod(List<string> period, string Language, string campusId)
  944. {
  945. var builder = $"{_environment.ContentRootPath}/JsonFile/Preset/LangSchoolConfig.json";
  946. StreamReader streamReader = new StreamReader(new FileStream(builder, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.UTF8);
  947. StringBuilder stringBuilder = new StringBuilder();
  948. string text;
  949. while ((text = streamReader.ReadLine()) != null)
  950. {
  951. stringBuilder.Append(text.ToString());
  952. }
  953. streamReader.Close();
  954. string input = stringBuilder.ToString();
  955. List<SchoolConfig> schoolConfigs = input.ToObject<List<SchoolConfig>>();
  956. SchoolConfig schoolConfig = schoolConfigs.Find(x => x.Lang.Contains($"{Language}"));
  957. if (schoolConfig == null)
  958. {
  959. if (Language.Contains("en"))
  960. schoolConfig = schoolConfigs.Find(x => x.Lang.Contains("en-US"));
  961. else
  962. schoolConfig = schoolConfigs.Find(x => x.Lang.Contains("zh-CN"));
  963. }
  964. List<Period> periods = new List<Period>();
  965. period.ForEach(x =>
  966. {
  967. periods.Add(new Period
  968. {
  969. id = Guid.NewGuid().ToString(),
  970. name = x,
  971. campusId = campusId,
  972. 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() },
  973. 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() } },
  974. subjects = new List<Subject>() {
  975. new Subject { id=Guid.NewGuid().ToString(),name=schoolConfig.PresetSubject[0].name,type=schoolConfig.PresetSubject[0].type },
  976. new Subject { id=Guid.NewGuid().ToString(),name=schoolConfig.PresetSubject[1].name,type=schoolConfig.PresetSubject[1].type },
  977. new Subject { id=Guid.NewGuid().ToString(),name=schoolConfig.PresetSubject[2].name,type=schoolConfig.PresetSubject[2].type }
  978. },
  979. grades = schoolConfig.grades,
  980. analysis = new Analysis()
  981. {
  982. type = new List<ExamSimple>() { new ExamSimple { id = Guid.NewGuid().ToString(), name = schoolConfig.PresetExam[0].type[0].name },
  983. new ExamSimple { id = Guid.NewGuid().ToString(), name = schoolConfig.PresetExam[0].type[1].name },
  984. new ExamSimple { id = Guid.NewGuid().ToString(), name = schoolConfig.PresetExam[0].type[2].name },
  985. new ExamSimple { id = Guid.NewGuid().ToString(), name = schoolConfig.PresetExam[0].type[3].name } },
  986. income = schoolConfig.PresetExam[0].income,
  987. eugenics = schoolConfig.PresetExam[0].eugenics,
  988. touch = schoolConfig.PresetExam[0].touch
  989. }
  990. });
  991. });
  992. return periods;
  993. }
  994. public record SchoolConfig
  995. {
  996. public string Lang { get; set; }
  997. public List<semester> semester { get; set; }
  998. public List<string> grades { get; set; }
  999. public List<PresetSubject> PresetSubject { get; set; }
  1000. public List<PresetExam> PresetExam { get; set; }
  1001. }
  1002. public record semester
  1003. {
  1004. public string id { get; set; } = Guid.NewGuid().ToString();
  1005. public string term { get; set; }
  1006. public int start { get; set; }
  1007. public int month { get; set; }
  1008. public int day { get; set; }
  1009. }
  1010. public record PresetSubject
  1011. {
  1012. public string id { get; set; } = Guid.NewGuid().ToString();
  1013. public string name { get; set; }
  1014. public int type { get; set; }
  1015. }
  1016. public record PresetExam
  1017. {
  1018. public List<StudyType> type { get; set; }
  1019. public int income { get; set; }
  1020. public int eugenics { get; set; }
  1021. public int touch { get; set; }
  1022. }
  1023. public record StudyType
  1024. {
  1025. public string id { get; set; } = Guid.NewGuid().ToString();
  1026. public string name { get; set; }
  1027. }
  1028. #endregion
  1029. public class SchoolAssist : School
  1030. {
  1031. public List<Assist> assists { get; set; }
  1032. }
  1033. public class Assist
  1034. {
  1035. public string tmdId { get; set; }
  1036. public string tmdName { get; set; }
  1037. }
  1038. /// <summary>
  1039. /// 创建多个学校实体
  1040. /// </summary>
  1041. public record FoundSchools()
  1042. {
  1043. /// <summary>
  1044. ///醍摩豆账户ID
  1045. /// </summary>
  1046. public string tmdId { get; set; }
  1047. /// <summary>
  1048. /// 醍摩豆账户名称
  1049. /// </summary>
  1050. public string tmdName { get; set; }
  1051. /// <summary>
  1052. /// 语系
  1053. /// </summary>
  1054. public string lang { get; set; }
  1055. /// <summary>
  1056. /// 批量创校的数据结构
  1057. /// </summary>
  1058. public List<BISchool> biSchools { get; set; } = new List<BISchool>();
  1059. }
  1060. /// <summary>
  1061. /// 批量创校的数据结构
  1062. /// </summary>
  1063. public record BISchool()
  1064. {
  1065. /// <summary>
  1066. /// 学校名称
  1067. /// </summary>
  1068. public string name { get; set; }
  1069. /// <summary>
  1070. /// 学校管理员
  1071. /// </summary>
  1072. public string admin { get; set; }
  1073. /// <summary>
  1074. /// 学校的学段
  1075. /// </summary>
  1076. public List<string> period { get; set; }
  1077. /// <summary>
  1078. /// 学校空间大小
  1079. /// </summary>
  1080. public int size { get; set; }
  1081. /// <summary>
  1082. /// 地区
  1083. /// </summary>
  1084. public string region { get; set; }
  1085. /// <summary>
  1086. /// 省份
  1087. /// </summary>
  1088. public string province { get; set; }
  1089. /// <summary>
  1090. /// 城市
  1091. /// </summary>
  1092. public string city { get; set; }
  1093. /// <summary>
  1094. /// 县,区,郡
  1095. /// </summary>
  1096. public string dist { get; set; }
  1097. /// <summary>
  1098. /// 学校详细地址
  1099. /// </summary>
  1100. public string address { get; set; }
  1101. public string areaId { get; set; }
  1102. }
  1103. public record Exist()
  1104. {
  1105. public string ID { get; set; }
  1106. public string name { get; set; }
  1107. }
  1108. }
  1109. }