ScDataInitController.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. using Microsoft.AspNetCore.Mvc;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using TEAMModelOS.Models;
  7. using TEAMModelOS.SDK.DI;
  8. using System.Text.Json;
  9. using TEAMModelOS.SDK.Models;
  10. using Microsoft.AspNetCore.Http;
  11. using TEAMModelOS.SDK.Extension;
  12. using Azure.Cosmos;
  13. using System.Text;
  14. using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
  15. using Microsoft.Extensions.Options;
  16. using Azure.Messaging.ServiceBus;
  17. using Microsoft.Extensions.Configuration;
  18. using HTEXLib.COMM.Helpers;
  19. using TEAMModelOS.SDK;
  20. using System.IdentityModel.Tokens.Jwt;
  21. using TEAMModelOS.Services;
  22. using TEAMModelOS.SDK.Models.Service;
  23. using System.IO;
  24. using System.Dynamic;
  25. using Microsoft.AspNetCore.Authorization;
  26. using Azure.Storage.Blobs.Models;
  27. using static TEAMModelOS.SDK.Models.Teacher;
  28. using System.Web;
  29. using static TEAMModelOS.Controllers.FixDataController;
  30. using static TEAMModelOS.SDK.SchoolService;
  31. using Microsoft.AspNetCore.Hosting;
  32. using static TEAMModelOS.Controllers.ScController;
  33. namespace TEAMModelOS.Controllers.Third
  34. {
  35. /// <summary>
  36. ///
  37. /// </summary>
  38. ///
  39. [ProducesResponseType(StatusCodes.Status200OK)]
  40. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  41. //
  42. //[Route("")]
  43. [Route("sc-init")]
  44. [ApiController]
  45. public class ScDataInitController : ControllerBase
  46. {
  47. private readonly SnowflakeId _snowflakeId;
  48. private readonly AzureCosmosFactory _azureCosmos;
  49. private readonly DingDing _dingDing;
  50. private readonly Option _option;
  51. private readonly AzureStorageFactory _azureStorage;
  52. private readonly AzureServiceBusFactory _serviceBus;
  53. private readonly AzureRedisFactory _azureRedis;
  54. private readonly CoreAPIHttpService _coreAPIHttpService;
  55. private readonly ThirdApisService _scsApisService;
  56. public readonly string type = "scsyxpt";
  57. private readonly HttpTrigger _httpTrigger;
  58. private readonly IWebHostEnvironment _environment;
  59. private readonly ThirdApisService _thirdApisService;
  60. public IConfiguration _configuration { get; set; }
  61. public ScDataInitController(ThirdApisService thirdApisService, IWebHostEnvironment environment, AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage,
  62. AzureRedisFactory azureRedis, AzureServiceBusFactory serviceBus, IConfiguration configuration, CoreAPIHttpService coreAPIHttpService, ThirdApisService scsApisService, HttpTrigger httpTrigger)
  63. {
  64. _azureCosmos = azureCosmos;
  65. _snowflakeId = snowflakeId;
  66. _dingDing = dingDing;
  67. _option = option?.Value;
  68. _azureStorage = azureStorage;
  69. _serviceBus = serviceBus;
  70. _configuration = configuration;
  71. _azureRedis = azureRedis;
  72. _coreAPIHttpService = coreAPIHttpService;
  73. _scsApisService = scsApisService;
  74. _httpTrigger = httpTrigger;
  75. _environment = environment;
  76. _thirdApisService = thirdApisService;
  77. }
  78. /// <summary>
  79. /// 0. 获取省平台相关的项目
  80. /// </summary>
  81. /// <param name="request"></param>
  82. /// <returns></returns>
  83. [ProducesDefaultResponseType]
  84. [HttpPost("get-scs-porject")]
  85. [AllowAnonymous]
  86. public async Task<IActionResult> GetScsPorject(JsonElement request)
  87. {
  88. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  89. List<ScComConfig> scComConfigs = await table.FindListByDict<ScComConfig>(new Dictionary<string, object> { { Constant.PartitionKey, "ScComConfig" } });
  90. string Code = "GetProjectInfoByTrainComID";
  91. List<ScProject> projectsSave = new List<ScProject>();
  92. foreach (var config in scComConfigs)
  93. {
  94. Dictionary<string, object> parameterMap = new Dictionary<string, object>();
  95. parameterMap.Add("TrainComID", config.trainComID);
  96. ScsResult result = new ScsResult { code = Code, title = "5.3.1.1获取项目列表" };
  97. result = await _thirdApisService.Post(config.url, Code, config.passKey, config.privateKey, parameterMap);
  98. List<ScProject> projects = result.content.ToObject<List<ScProject>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  99. List<ScProject> scProjects = await table.FindListByDict<ScProject>(new Dictionary<string, object> { { Constant.PartitionKey, "ScProject" }, { "trainComID", $"{config.trainComID}" } });
  100. foreach (var project in projects)
  101. {
  102. if (scProjects.IsNotEmpty())
  103. {
  104. ScProject scProject = scProjects.Find(x => x.ProjectItemID == project.ProjectItemID);
  105. if (scProject != null)
  106. {
  107. scProject.PartitionKey = "ScProject";
  108. scProject.trainComID = config.trainComID;
  109. scProject.passKey = config.passKey;
  110. scProject.privateKey = config.privateKey;
  111. scProject.RowKey = $"{project.ProjectItemID}";
  112. scProject.config = "scsyxpt";
  113. scProject.ProjectID = project.ProjectID;
  114. scProject.ProjectItemID = project.ProjectItemID;
  115. scProject.ProjectItemTitle = project.ProjectItemTitle;
  116. scProject.ProjectTitle = project.ProjectTitle;
  117. scProject.TCount = project.TCount;
  118. scProject.IsDiagnosis = project.IsDiagnosis;
  119. scProject.IsQuota = project.IsQuota;
  120. scProject.SchoolDiagnosisMinCount = project.SchoolDiagnosisMinCount;
  121. scProject.SchoolDiagnosisMinDimension = project.SchoolDiagnosisMinDimension;
  122. scProject.TeacherDiagnosisMinDimension = project.TeacherDiagnosisMinDimension;
  123. projectsSave.Add(scProject);
  124. }
  125. else
  126. {
  127. projectsSave.Add(new ScProject
  128. {
  129. PartitionKey = "ScProject",
  130. trainComID = config.trainComID,
  131. passKey = config.passKey,
  132. privateKey = config.privateKey,
  133. RowKey = $"{project.ProjectItemID}",
  134. config = "scsyxpt",
  135. ProjectID = project.ProjectID,
  136. ProjectItemID = project.ProjectItemID,
  137. ProjectItemTitle = project.ProjectItemTitle,
  138. ProjectTitle = project.ProjectTitle,
  139. TCount = project.TCount,
  140. IsDiagnosis = project.IsDiagnosis,
  141. IsQuota = project.IsQuota,
  142. SchoolDiagnosisMinCount = project.SchoolDiagnosisMinCount,
  143. SchoolDiagnosisMinDimension = project.SchoolDiagnosisMinDimension,
  144. TeacherDiagnosisMinDimension = project.TeacherDiagnosisMinDimension,
  145. });
  146. }
  147. }
  148. else
  149. {
  150. projectsSave.Add(new ScProject
  151. {
  152. PartitionKey = "ScProject",
  153. trainComID = config.trainComID,
  154. passKey = config.passKey,
  155. privateKey = config.privateKey,
  156. RowKey = $"{project.ProjectItemID}",
  157. config = "scsyxpt",
  158. ProjectID = project.ProjectID,
  159. ProjectItemID = project.ProjectItemID,
  160. ProjectItemTitle = project.ProjectItemTitle,
  161. ProjectTitle = project.ProjectTitle,
  162. TCount = project.TCount,
  163. IsDiagnosis = project.IsDiagnosis,
  164. IsQuota = project.IsQuota,
  165. SchoolDiagnosisMinCount = project.SchoolDiagnosisMinCount,
  166. SchoolDiagnosisMinDimension = project.SchoolDiagnosisMinDimension,
  167. TeacherDiagnosisMinDimension = project.TeacherDiagnosisMinDimension,
  168. });
  169. }
  170. }
  171. }
  172. await table.SaveOrUpdateAll(projectsSave);
  173. return Ok(new { projectsSave });
  174. }
  175. /// <summary>
  176. /// 3. 处理 省平台最新的教师以及 反向更新没有绑定醍摩豆id 的账号。
  177. /// </summary>
  178. /// <param name="request"></param>
  179. /// <returns></returns>
  180. [ProducesDefaultResponseType]
  181. [HttpPost("get-scs-teacher")]
  182. [AllowAnonymous]
  183. public async Task<IActionResult> getScsTeacher(JsonElement request)
  184. {
  185. if (!request.TryGetProperty("accessConfig", out JsonElement accessConfig)) return BadRequest();
  186. if (!request.TryGetProperty("city", out JsonElement city)) return BadRequest();
  187. if (!request.TryGetProperty("dist", out JsonElement dist)) return BadRequest();
  188. if (!request.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
  189. if (!request.TryGetProperty("standard", out JsonElement standard)) return BadRequest();
  190. //数据校验
  191. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  192. var ScTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "areaId", $"{areaId}" } });
  193. var ScSchools = await table.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" }, { "areaId", $"{areaId}" } });
  194. Dictionary<string, object> dict = new Dictionary<string, object> { { "accessConfig", $"{accessConfig}" }, { "areaId", $"{areaId}" } };
  195. (int status, string json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetTeachersListByProject");
  196. var teachers = json.ToObject<List<ScTeacher>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  197. //未保存在数据库的。
  198. var a = teachers.Select(x => $"{x.TID}").ToList();
  199. var s = ScTeachers.Select(y => $"{ y.TID}").ToList();
  200. var asin = a.Except(s).ToList();
  201. #region 省平台获取到最新的教师,并添加到Table中。
  202. var adds = teachers.FindAll(x => asin.Contains($"{x.TID}"));
  203. var addTeachers = ScTeachers.FindAll(x => adds.Select(y => $"{ y.PXID}").Contains($"{x.RowKey}"));
  204. if (addTeachers.IsNotEmpty())
  205. {
  206. //省平台更新的
  207. addTeachers.ForEach(x =>
  208. {
  209. var tt = teachers.Find(z => x.RowKey.Equals($"{z.PXID}"));
  210. if (tt != null)
  211. {
  212. x.status = 1;
  213. x.TID = tt.TID;
  214. x.TeacherName = tt.TeacherName;
  215. x.SchoolID = tt.SchoolID;
  216. x.SchoolName = tt.SchoolName;
  217. x.ProjectID = tt.ProjectID;
  218. x.ProjectItemID = tt.ProjectItemID;
  219. x.ProjectItemTitle = tt.ProjectItemTitle;
  220. x.ProjectTitle = tt.ProjectTitle;
  221. x.CityID = tt.CityID;
  222. x.DistrictID = tt.DistrictID;
  223. x.CityName = tt.CityName;
  224. x.DisName = tt.DisName;
  225. x.Account = tt.Account;
  226. x.TeacherXK = tt.TeacherXK;
  227. x.TeacherXD = tt.TeacherXD;
  228. x.Mobile = x.Mobile;
  229. x.Email = tt.Email;
  230. x.areaId = $"{areaId}";
  231. x.PartitionKey = "ScTeacher";
  232. x.tmdid = null;
  233. var school = ScSchools.Find(s => s.schoolid == x.SchoolID);
  234. x.schoolCode = school?.schoolCode;
  235. }
  236. });
  237. addTeachers = await table.SaveOrUpdateAll(addTeachers);
  238. }
  239. else
  240. {
  241. //省平台更新的
  242. foreach (var x in adds)
  243. {
  244. x.RowKey = $"{x.PXID}";
  245. x.status = 1;
  246. x.areaId = $"{areaId}";
  247. x.PartitionKey = "ScTeacher";
  248. var school = ScSchools.Find(s => s.schoolid == x.SchoolID);
  249. x.schoolCode = school?.schoolCode;
  250. }
  251. addTeachers = await table.SaveOrUpdateAll(adds);
  252. }
  253. if (ScTeachers.Count == teachers.Count)
  254. {
  255. foreach (var x in ScTeachers)
  256. {
  257. var tt = teachers.Find(z => x.RowKey.Equals($"{z.PXID}"));
  258. if (tt != null)
  259. {
  260. x.status = 1;
  261. x.TID = tt.TID;
  262. x.TeacherName = tt.TeacherName;
  263. x.SchoolID = tt.SchoolID;
  264. x.SchoolName = tt.SchoolName;
  265. x.ProjectID = tt.ProjectID;
  266. x.ProjectItemID = tt.ProjectItemID;
  267. x.ProjectItemTitle = tt.ProjectItemTitle;
  268. x.ProjectTitle = tt.ProjectTitle;
  269. x.CityID = tt.CityID;
  270. x.DistrictID = tt.DistrictID;
  271. x.CityName = tt.CityName;
  272. x.DisName = tt.DisName;
  273. x.Account = tt.Account;
  274. x.TeacherXK = tt.TeacherXK;
  275. x.TeacherXD = tt.TeacherXD;
  276. x.Mobile = x.Mobile;
  277. x.Email = tt.Email;
  278. x.areaId = $"{areaId}";
  279. x.PartitionKey = "ScTeacher";
  280. x.tmdid = null;
  281. var school = ScSchools.Find(s => s.schoolid == x.SchoolID);
  282. x.schoolCode = school?.schoolCode;
  283. }
  284. }
  285. addTeachers = await table.SaveOrUpdateAll(ScTeachers);
  286. }
  287. #endregion 省平台获取到最新的教师,并添加到Table中。
  288. //反向去补全四川省平台 Table中没有绑定tmdid的账号
  289. var unbindtmdid = ScTeachers.FindAll(x => string.IsNullOrEmpty(x.tmdid));
  290. var tids = unbindtmdid.Select(x => $"{x.TID}").ToHashSet();
  291. if (tids.Count() > 0)
  292. {
  293. List<DbBind> binds = new List<DbBind>();
  294. string sql = $"SELECT c.id,b.userid,b.data FROM c join b in c.binds where b.userid in ({string.Join(",", tids.Select(x => $"'{x}'"))})";
  295. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<DbBind>
  296. (queryText: sql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
  297. {
  298. binds.Add(item);
  299. }
  300. if (binds.IsNotEmpty())
  301. {
  302. List<ScTeacher> update = new();
  303. binds.ForEach(x =>
  304. {
  305. var exs = unbindtmdid.FindAll(z => $"{z.TID}".Equals(x.userid));
  306. if (exs.IsNotEmpty())
  307. {
  308. exs.ForEach(y =>
  309. {
  310. y.tmdid = x.id;
  311. });
  312. update.AddRange(exs);
  313. }
  314. });
  315. var group = update.GroupBy(x => x.RowKey).Select(z => new { z.Key, list = z.ToList() });
  316. List<ScTeacher> scTeachers = new();
  317. group.ToList().ForEach(x =>
  318. {
  319. if (x.list.Count() == 1)
  320. {
  321. scTeachers.Add(x.list[0]);
  322. }
  323. else if (x.list.Count > 1)
  324. {
  325. scTeachers.Add(x.list[0]);
  326. }
  327. });
  328. scTeachers = await table.SaveOrUpdateAll(scTeachers);
  329. }
  330. }
  331. //反向更新教师绑定的省平台的SchoolID(int)和schoolCode(string)
  332. ScTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object> { { "PartitionKey", "ScTeacher" }, { "areaId", $"{areaId}" } });
  333. var scSchools = await table.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" }, { "areaId", $"{areaId}" } });
  334. List<ScTeacher> updateTch = new List<ScTeacher>();
  335. ScTeachers.FindAll(y => string.IsNullOrWhiteSpace(y.schoolCode)).ForEach(x =>
  336. {
  337. var scSchool = scSchools.Find(s => s.schoolid == x.SchoolID);
  338. x.schoolCode = scSchool?.schoolCode;
  339. updateTch.Add(x);
  340. });
  341. if (updateTch.IsNotEmpty())
  342. {
  343. await table.SaveOrUpdateAll(updateTch);
  344. }
  345. return Ok(new { addTeachers, update = updateTch.Select(x => new { x.areaId, x.PXID, x.TID, x.TeacherName, x.tmdid, x.SchoolName, x.DisName }), ScTeachers });
  346. }
  347. /// <summary>
  348. ///1. 检查学校是否有同名的
  349. /// </summary>
  350. /// <param name="request"></param>
  351. /// <returns></returns>
  352. [ProducesDefaultResponseType]
  353. [HttpPost("get-sc-school")]
  354. [AllowAnonymous]
  355. public async Task<IActionResult> GetScSchool(JsonElement request)
  356. {
  357. if (!request.TryGetProperty("accessConfig", out JsonElement accessConfig)) return BadRequest();
  358. if (!request.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
  359. if (!request.TryGetProperty("city", out JsonElement city)) return BadRequest();
  360. if (!request.TryGetProperty("dist", out JsonElement dist)) return BadRequest();
  361. List<ScSchool> schools = null;
  362. List<ScSchool> matchSchools = null;
  363. int status = -1; string json = null;
  364. Dictionary<string, object> dict = new Dictionary<string, object> { { "accessConfig", $"{accessConfig}" }, { "areaId", $"{areaId}" } };
  365. List<School> ignore = new List<School>();
  366. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: $"select value(c) from c where c.areaId='{areaId}'",
  367. requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") }))
  368. {
  369. ignore.Add(item);
  370. }
  371. (status, json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetSchoolList");
  372. if (status == 200)
  373. {
  374. schools = json.ToObject<List<ScSchool>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  375. if (ignore.IsNotEmpty())
  376. {
  377. matchSchools = schools.FindAll(x => ignore.Select(y => y.name).Contains(x.schoolname));
  378. if (matchSchools.IsNotEmpty())
  379. {
  380. if (matchSchools.Count != ignore.Count)
  381. {
  382. var matched = matchSchools.Select(x => x.schoolname);
  383. var unmatch = ignore.Select(y => y.name).Except(matched);
  384. List<string> scschoolUnmatch = schools.Select(y => y.schoolname).Except(matched).ToList();
  385. if (scschoolUnmatch.IsNotEmpty())
  386. {
  387. return Ok(new { matched, unmatch, scschoolUnmatch });
  388. }
  389. }
  390. else
  391. {
  392. matchSchools.ForEach(x =>
  393. {
  394. var exschool = ignore.Find(y => y.name.Equals(x.schoolname));
  395. if (exschool != null)
  396. {
  397. x.schoolCode = exschool.id;
  398. x.areaId = $"{areaId}";
  399. x.city = $"{city}";
  400. x.dist = $"{dist}";
  401. }
  402. });
  403. }
  404. }
  405. else
  406. {
  407. return Ok(new { unmatch = ignore, schools = schools.Select(x => new { x.schoolname, x.schoolCode, x.schoolid, x.ProjectID, x.ProjectItemID }) });
  408. }
  409. }
  410. }
  411. return Ok(new { schools = schools.Select(x => new { x.schoolname, x.schoolCode, x.schoolid, x.ProjectID, x.ProjectItemID }) });
  412. }
  413. /// <summary>
  414. /// 2. 处理 省平台最新的教师以及 反向更新没有绑定醍摩豆id 的账号。
  415. /// </summary>
  416. /// <param name="request"></param>
  417. /// <returns></returns>
  418. [ProducesDefaultResponseType]
  419. [HttpPost("get-project-school")]
  420. [AllowAnonymous]
  421. public async Task<IActionResult> GetProjectSchool(JsonElement request)
  422. {
  423. if (!request.TryGetProperty("accessConfig", out JsonElement accessConfig)) return BadRequest();
  424. if (!request.TryGetProperty("city", out JsonElement city)) return BadRequest();
  425. if (!request.TryGetProperty("dist", out JsonElement dist)) return BadRequest();
  426. if (!request.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
  427. if (!request.TryGetProperty("standard", out JsonElement standard)) return BadRequest();
  428. List<School> ignore = new List<School>();
  429. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: $"select value(c) from c where c.areaId='{areaId}'",
  430. requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") }))
  431. {
  432. ignore.Add(item);
  433. }
  434. Dictionary<string, object> dict = new Dictionary<string, object> { { "accessConfig", $"{accessConfig}" }, { "areaId", $"{areaId}" } };
  435. int status = -1; string json = null;
  436. //5.3.1.1获取项目列表
  437. (status, json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetProjectInfoByTrainComID");
  438. List<ScProject> projects = null;
  439. List<ScSchool> saveschools = null;
  440. List<ScSchool> schools = null;
  441. List<ScSchool> matchSchools = null;
  442. List<ScSchool> tbschools = null;
  443. if (status == 200)
  444. {
  445. projects = json.ToObject<List<ScProject>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  446. }
  447. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  448. // 5.3.1.18根据机构ID、项目ID、子项目ID返回学校列表
  449. (status, json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetSchoolList");
  450. if (status == 200)
  451. {
  452. schools = json.ToObject<List<ScSchool>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  453. if (ignore.IsNotEmpty())
  454. {
  455. matchSchools = schools.FindAll(x => ignore.Select(y => y.name).Contains(x.schoolname));
  456. if (matchSchools.IsNotEmpty())
  457. {
  458. if (matchSchools.Count != ignore.Count)
  459. {
  460. var matched = matchSchools.Select(x => x.schoolname);
  461. var unmatch = ignore.Select(y => y.name).Except(matched);
  462. List<string> scschoolUnmatch = schools.Select(y => y.schoolname).Except(matched).ToList();
  463. if (scschoolUnmatch.IsNotEmpty())
  464. {
  465. return Ok(new { matched, unmatch, scschoolUnmatch });
  466. }
  467. }
  468. else
  469. {
  470. matchSchools.ForEach(x =>
  471. {
  472. var exschool = ignore.Find(y => y.name.Equals(x.schoolname));
  473. if (exschool != null)
  474. {
  475. x.schoolCode = exschool.id;
  476. x.areaId = $"{areaId}";
  477. x.city = $"{city}";
  478. x.dist = $"{dist}";
  479. }
  480. });
  481. }
  482. }
  483. else
  484. {
  485. return Ok(new { unmatch = ignore, schools = schools.Select(x => new { x.schoolname, x.schoolCode, x.schoolid, x.ProjectID, x.ProjectItemID }) });
  486. }
  487. }
  488. //数据校验
  489. tbschools = await table.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" }, { "areaId", $"{areaId}" } });
  490. if (tbschools.IsNotEmpty())
  491. {
  492. var a = tbschools.Select(y => $"{y.RowKey}").ToList();
  493. saveschools = schools.Where(x => !a.Exists(z => z.Equals($"{x.schoolid}"))).ToList();
  494. List<SchoolData> schoolDatas = new();
  495. saveschools.ForEach(x =>
  496. {
  497. x.RowKey = $"{x.schoolid}";
  498. x.PartitionKey = "ScSchool";
  499. x.areaId = $"{areaId}";
  500. x.city = $"{city}";
  501. x.dist = $"{dist}";
  502. var a = ignore.Find(z => z.name.Equals(x.schoolname));
  503. if (a != null)
  504. {
  505. x.schoolCode = a.id;
  506. }
  507. else
  508. {
  509. if (string.IsNullOrEmpty(x.schoolCode))
  510. {
  511. schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
  512. }
  513. }
  514. });
  515. schoolDatas = await GenerateSchoolCode(schoolDatas, _dingDing, _environment);
  516. saveschools.ForEach(x =>
  517. {
  518. var schoolData = schoolDatas.Find(y => y.uid.Equals($"{x.schoolid}"));
  519. if (schoolData != null && !string.IsNullOrEmpty(schoolData.id))
  520. {
  521. x.schoolCode = schoolData.id;
  522. x.areaId = $"{areaId}";
  523. x.city = $"{city}";
  524. x.dist = $"{dist}";
  525. }
  526. });
  527. saveschools.RemoveAll(x => string.IsNullOrEmpty(x.schoolCode));
  528. saveschools.RemoveAll(x => tbschools.FindAll(z => !string.IsNullOrEmpty(z.schoolCode)).Exists(y => y.schoolCode.Equals(x.schoolCode)));
  529. saveschools = await table.SaveAll(saveschools);
  530. }
  531. else
  532. {
  533. List<SchoolData> schoolDatas = new List<SchoolData>();
  534. schools.ForEach(x =>
  535. {
  536. x.RowKey = $"{x.schoolid}";
  537. x.PartitionKey = "ScSchool";
  538. x.areaId = $"{areaId}";
  539. x.city = $"{city}";
  540. x.dist = $"{dist}";
  541. var a = ignore.Find(z => z.name.Equals(x.schoolname));
  542. if (a != null)
  543. {
  544. x.schoolCode = a.id;
  545. }
  546. else
  547. {
  548. if (string.IsNullOrEmpty(x.schoolCode))
  549. {
  550. schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
  551. }
  552. }
  553. });
  554. schoolDatas = await SchoolService.GenerateSchoolCode(schoolDatas, _dingDing, _environment);
  555. schools.ForEach(x =>
  556. {
  557. var schoolData = schoolDatas.Find(y => y.uid.Equals($"{x.schoolid}"));
  558. if (schoolData != null && !string.IsNullOrEmpty(schoolData.id))
  559. {
  560. x.schoolCode = schoolData.id;
  561. x.areaId = $"{areaId}";
  562. x.city = $"{city}";
  563. x.dist = $"{dist}";
  564. }
  565. });
  566. schools.RemoveAll(x => string.IsNullOrEmpty(x.schoolCode));
  567. saveschools = await table.SaveOrUpdateAll(schools);
  568. }
  569. }
  570. List<string> unsave = new List<string>();
  571. if (saveschools.IsNotEmpty())
  572. {
  573. var ex = schools.Select(x => $"{x.schoolid}").Except(saveschools.Select(y => y.RowKey));
  574. if (ex.Count() > 0)
  575. {
  576. unsave.AddRange(ex);
  577. }
  578. }
  579. if (tbschools.IsNotEmpty())
  580. {
  581. var ex = schools.Select(x => $"{x.schoolid}").Except(tbschools.Select(y => y.RowKey));
  582. if (ex.Count() > 0)
  583. {
  584. unsave.AddRange(ex);
  585. }
  586. }
  587. var areaschools = await table.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", $"ScSchool" }, { "areaId", $"{areaId}" } });
  588. List<School> cosbdschools = new List<School>();
  589. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: $"select value(c) from c where c.areaId='{areaId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
  590. {
  591. cosbdschools.Add(item);
  592. }
  593. var tbs = areaschools.FindAll(x => areaschools.Select(z => z.schoolCode).Except(cosbdschools.Select(x => x.id)).Contains(x.schoolCode));
  594. List<CSchool> cSchools = new List<CSchool>();
  595. foreach (var sch in tbs)
  596. {
  597. cSchools.Add(new CSchool
  598. {
  599. id = sch.schoolCode,
  600. name = sch.schoolname,
  601. // admin = "1530606136",
  602. period = new List<string>() { sch.schooltypename },
  603. size = 1024,
  604. });
  605. }
  606. var client = _azureCosmos.GetCosmosClient();
  607. List<School> schoolsfailed = new List<School>();
  608. List<School> schoolsScucess = new List<School>();
  609. List<string> failedmsg = new List<string>();
  610. foreach (var sc in cSchools)
  611. {
  612. List<Period> periods = new List<Period>();
  613. string campusId = Guid.NewGuid().ToString();
  614. sc.period.ForEach(x =>
  615. {
  616. periods.Add(new Period { id = Guid.NewGuid().ToString(), name = x, campusId = campusId });
  617. });
  618. School school = new School
  619. {
  620. id = sc.id,
  621. name = sc.name,
  622. size = sc.size,
  623. code = "Base",
  624. campuses = new List<Campus> { new Campus { name = sc.name, id = campusId } },
  625. region = "中国",
  626. province = "四川省",
  627. city = $"{city}",
  628. timeZone = new SDK.Models.TimeZone { label = "(UTC+08:00) 北京,重庆,香港特别行政区,乌鲁木齐", value = "+08:00" },
  629. type = 1,
  630. pk = "School",
  631. ttl = -1,
  632. schoolCode = sc.id,
  633. dist = $"{dist}",
  634. period = periods,
  635. areaId = $"{areaId}",
  636. standard = $"{standard}"
  637. };
  638. try
  639. {
  640. await client.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<School>(school, new PartitionKey(school.code));
  641. schoolsScucess.Add(school);
  642. }
  643. catch (CosmosException ex)
  644. {
  645. failedmsg.Add($"{school.ToJsonString()}\n \n{ex.Status}{ex.Message }\n {ex.StackTrace}");
  646. schoolsfailed.Add(school);
  647. }
  648. catch (Exception ex)
  649. {
  650. failedmsg.Add($"{school.ToJsonString()}\n{ex.Message }\n {ex.StackTrace}");
  651. schoolsfailed.Add(school);
  652. }
  653. }
  654. return Ok(new
  655. {
  656. projects,
  657. msg = $"Table中已经有:{tbschools.Count}个学校,省平台获取到:" +
  658. $"{schools?.Count}个学校,本次保存有:{saveschools?.Count},没有被保存的学校:" +
  659. $"{unsave?.Count},创建失败的学校有:{schoolsfailed.Count()}," +
  660. $"创建成功的的学校有:{schoolsScucess.Count()}",
  661. schoolsfailed,
  662. failedmsg,
  663. schoolsScucess,
  664. tbsch = tbschools.Select(x => new { x.schoolname, x.schoolCode }),
  665. });
  666. }
  667. }
  668. }