ScDataInitController.cs 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  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;
  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. using OpenXmlPowerTools;
  34. using System.Net.Http;
  35. namespace TEAMModelOS.Controllers.Third
  36. {
  37. /// <summary>
  38. ///
  39. /// </summary>
  40. ///
  41. [ProducesResponseType(StatusCodes.Status200OK)]
  42. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  43. //
  44. //[Route("")]
  45. [Route("sc-init")]
  46. [ApiController]
  47. public class ScDataInitController : ControllerBase
  48. {
  49. private readonly SnowflakeId _snowflakeId;
  50. private readonly AzureCosmosFactory _azureCosmos;
  51. private readonly DingDing _dingDing;
  52. private readonly Option _option;
  53. private readonly AzureStorageFactory _azureStorage;
  54. private readonly AzureServiceBusFactory _serviceBus;
  55. private readonly AzureRedisFactory _azureRedis;
  56. private readonly CoreAPIHttpService _coreAPIHttpService;
  57. public readonly string type = "scsyxpt";
  58. private readonly HttpTrigger _httpTrigger;
  59. private readonly IWebHostEnvironment _environment;
  60. private readonly IHttpClientFactory _httpClient;
  61. public IConfiguration _configuration { get; set; }
  62. public ScDataInitController(IHttpClientFactory httpClient, IWebHostEnvironment environment, AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId, DingDing dingDing, IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage,
  63. AzureRedisFactory azureRedis, AzureServiceBusFactory serviceBus, IConfiguration configuration, CoreAPIHttpService coreAPIHttpService, HttpTrigger httpTrigger)
  64. {
  65. _azureCosmos = azureCosmos;
  66. _snowflakeId = snowflakeId;
  67. _dingDing = dingDing;
  68. _option = option?.Value;
  69. _azureStorage = azureStorage;
  70. _serviceBus = serviceBus;
  71. _configuration = configuration;
  72. _azureRedis = azureRedis;
  73. _coreAPIHttpService = coreAPIHttpService;
  74. _httpTrigger = httpTrigger;
  75. _environment = environment;
  76. _httpClient = httpClient;
  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 { bizcode = Code, title = "5.3.1.1获取项目列表" };
  97. result = await ThirdApisService.Post(_httpClient.CreateClient(),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-unbind-teacher")]
  182. [AllowAnonymous]
  183. public async Task<IActionResult> getUnBindTeacher(JsonElement request) {
  184. if (!request.TryGetProperty("accessConfig", out JsonElement accessConfig)) return BadRequest();
  185. if (!request.TryGetProperty("city", out JsonElement city)) return BadRequest();
  186. if (!request.TryGetProperty("dist", out JsonElement dist)) return BadRequest();
  187. if (!request.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
  188. if (!request.TryGetProperty("standard", out JsonElement standard)) return BadRequest();
  189. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  190. var ScTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "areaId", $"{areaId}" } });
  191. var unbind = ScTeachers.Where(x => string.IsNullOrWhiteSpace(x.tmdid));
  192. return Ok(unbind);
  193. }
  194. /// <summary>
  195. /// 4. 同步增加批次的
  196. /// </summary>
  197. /// <param name="request"></param>
  198. /// <returns></returns>
  199. [ProducesDefaultResponseType]
  200. [HttpPost("get-scs-teacher-add")]
  201. [AllowAnonymous]
  202. public async Task<IActionResult> getScsTeacherAdd(JsonElement request) {
  203. if (!request.TryGetProperty("accessConfig", out JsonElement accessConfig)) return BadRequest();
  204. if (!request.TryGetProperty("city", out JsonElement city)) return BadRequest();
  205. if (!request.TryGetProperty("dist", out JsonElement dist)) return BadRequest();
  206. if (!request.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
  207. if (!request.TryGetProperty("standard", out JsonElement standard)) return BadRequest();
  208. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  209. var ScTeachers1249 = await table.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "ProjectItemID", 1249 } });
  210. //数据校验
  211. var jsondata = ScTeachers1249.Select(x => new { x.schoolCode, x.tmdid, x.PXID, x.TID, x.TeacherName, x.SchoolName, x.SchoolID, x.Account, x.areaId }).ToJsonString();
  212. //当前区已有的教师
  213. var ScTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "areaId", $"{areaId}" } });
  214. //当前区的学校
  215. var ScSchools = await table.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" }, { "areaId", $"{areaId}" } });
  216. Dictionary<string, object> dict = new Dictionary<string, object> { { "accessConfig", $"{accessConfig}" }, { "areaId", $"{areaId}" } };
  217. //获取当前期,所有区所有学校的教师
  218. //(int status, string json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetTeachersListByProject");
  219. (int status, string json) = await ScsStudyApisService.GetTeachersListByProject(_httpClient.CreateClient(), _dingDing, _azureStorage, $"{areaId}", $"{accessConfig}");
  220. //序列化
  221. List<ScTeacher> teachers = json.ToObject<List<ScTeacher>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  222. // 处理省平台后补的教师,教师的学校不在当前区的学校列表中。
  223. teachers.RemoveAll(x => !ScSchools.Select(z => z.schoolid).Contains(x.SchoolID));
  224. string json_teachers = teachers.ToJsonString();
  225. //拿到当前期的所有且是再当前区内的学校的培训id
  226. var a = teachers.Select(x => $"{x.PXID}").ToList();
  227. var s = ScTeachers.Select(z=>z.RowKey).ToList();
  228. //新增的pxid
  229. var addPxid = a.Except(s).ToList();
  230. //原来已经有的pdxid可能需要更新的,如果需要更新,则需要判断两次的TID是否相同,不相同则需要换绑tmdid,则需要把tmdid置空
  231. var updatePxid = a.Where(x=>s.Contains(x)).ToList();
  232. if (addPxid.Any())
  233. {
  234. List<ScTeacher> newTeachers = new List<ScTeacher>();
  235. var allScteacher = json.ToObject<List<ScTeacher>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  236. addPxid.ForEach(add =>
  237. {
  238. var newTeacher = allScteacher.Find(x => $"{x.PXID}".Equals(add));
  239. if (newTeacher != null)
  240. {
  241. var schoolInfo = ScSchools.Find(x => x.schoolid == newTeacher.SchoolID);
  242. if (schoolInfo != null)
  243. {
  244. newTeacher.status = 1;
  245. newTeacher.areaId = $"{areaId}";
  246. newTeacher.PartitionKey = "ScTeacher";
  247. newTeacher.tmdid = null;
  248. newTeacher.schoolCode = schoolInfo?.schoolCode;
  249. newTeacher.RowKey = $"{newTeacher.PXID}";
  250. newTeachers.Add(newTeacher);
  251. }
  252. }
  253. });
  254. await table.SaveOrUpdateAll(newTeachers);
  255. }
  256. if (updatePxid.Any()) {
  257. List<ScTeacher> updateTeachers = new List<ScTeacher>();
  258. var allScteacher = json.ToObject<List<ScTeacher>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  259. updatePxid.ForEach(update => {
  260. //数据库的教师
  261. var updateTeacherDB = ScTeachers.Find(x => $"{x.RowKey}".Equals(update));
  262. //省平台的教师
  263. var schoolInfo = ScSchools.Find(x => x.schoolid == updateTeacherDB.SchoolID);
  264. var scTeacher = allScteacher.Find(x => $"{x.PXID}".Equals(update));
  265. if (updateTeacherDB != null && scTeacher!=null) {
  266. if (updateTeacherDB.TID == scTeacher.TID)
  267. {
  268. //保持tmdid不变
  269. updateTeacherDB.TID = scTeacher.TID;
  270. }
  271. else {
  272. updateTeacherDB.tmdid = null;
  273. }
  274. updateTeacherDB.PXID = scTeacher.PXID;
  275. updateTeacherDB.TID = scTeacher.TID;
  276. updateTeacherDB.TeacherName = scTeacher.TeacherName;
  277. updateTeacherDB.status = 1;
  278. updateTeacherDB.SchoolID = scTeacher.SchoolID;
  279. updateTeacherDB.SchoolName = scTeacher.SchoolName;
  280. updateTeacherDB.ProjectID = scTeacher.ProjectID;
  281. updateTeacherDB.ProjectItemID = scTeacher.ProjectItemID;
  282. updateTeacherDB.ProjectItemTitle = scTeacher.ProjectItemTitle;
  283. updateTeacherDB.ProjectTitle = scTeacher.ProjectTitle;
  284. updateTeacherDB.CityID = scTeacher.CityID;
  285. updateTeacherDB.DistrictID = scTeacher.DistrictID;
  286. updateTeacherDB.CityName = scTeacher.CityName;
  287. updateTeacherDB.DisName = scTeacher.DisName;
  288. updateTeacherDB.Account = scTeacher.Account;
  289. updateTeacherDB.TeacherXK = scTeacher.TeacherXK;
  290. updateTeacherDB.TeacherXD = scTeacher.TeacherXD;
  291. updateTeacherDB.Mobile = scTeacher.Mobile;
  292. updateTeacherDB.Email = scTeacher.Email;
  293. updateTeacherDB.areaId = $"{areaId}";
  294. updateTeacherDB.PartitionKey = "ScTeacher";
  295. updateTeacherDB.schoolCode = schoolInfo?.schoolCode;
  296. updateTeachers.Add(updateTeacherDB);
  297. }
  298. });
  299. await table.SaveOrUpdateAll(updateTeachers);
  300. }
  301. return Ok();
  302. }
  303. /// <summary>
  304. /// 3. 处理 省平台最新的教师以及 反向更新没有绑定醍摩豆id 的账号。
  305. /// </summary>
  306. /// <param name="request"></param>
  307. /// <returns></returns>
  308. [ProducesDefaultResponseType]
  309. [HttpPost("get-scs-teacher")]
  310. [AllowAnonymous]
  311. public async Task<IActionResult> getScsTeacher(JsonElement request)
  312. {
  313. if (!request.TryGetProperty("accessConfig", out JsonElement accessConfig)) return BadRequest();
  314. if (!request.TryGetProperty("city", out JsonElement city)) return BadRequest();
  315. if (!request.TryGetProperty("dist", out JsonElement dist)) return BadRequest();
  316. if (!request.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
  317. if (!request.TryGetProperty("standard", out JsonElement standard)) return BadRequest();
  318. //数据校验
  319. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  320. var ScTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object>() { { "PartitionKey", "ScTeacher" }, { "areaId", $"{areaId}" } });
  321. var ScSchools = await table.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" }, { "areaId", $"{areaId}" } });
  322. Dictionary<string, object> dict = new Dictionary<string, object> { { "accessConfig", $"{accessConfig}" }, { "areaId", $"{areaId}" } };
  323. //(int status, string json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetTeachersListByProject");
  324. (int status, string json) = await ScsStudyApisService.GetTeachersListByProject(_httpClient.CreateClient(), _dingDing, _azureStorage, $"{areaId}", $"{accessConfig}");
  325. ///
  326. var teachers = json.ToObject<List<ScTeacher>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  327. // 处理省平台后补的教师,教师的学校不在当前区的学校列表中。
  328. teachers.RemoveAll(x => !ScSchools.Select(z => z.schoolid).Contains(x.SchoolID));
  329. string json_teachers = teachers.ToJsonString();
  330. var a = teachers.Select(x => $"{x.TID}").ToList();
  331. string json_a=a.ToJsonString();
  332. var s = ScTeachers.Where(z=>!string.IsNullOrWhiteSpace(z.tmdid)).Select(y => $"{ y.TID}").ToList();
  333. //未保存在数据库的。
  334. var asin = a.Except(s).ToList();
  335. string json_asin = asin.ToJsonString();
  336. var aa = a.Except(asin);
  337. //if (aa.Any())
  338. //{
  339. // List<ScTeacher> newTeachers = new List<ScTeacher>();
  340. // var allScteacher = json.ToObject<List<ScTeacher>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  341. // aa.ToList().ForEach(a =>
  342. // {
  343. // var newTeacher = allScteacher.Find(x => $"{x.TID}".Equals(a));
  344. // if (newTeacher != null)
  345. // {
  346. // var schoolInfo = ScSchools.Find(x => x.schoolid == newTeacher.SchoolID);
  347. // if (schoolInfo != null)
  348. // {
  349. // newTeacher.status = 1;
  350. // newTeacher.areaId = $"{areaId}";
  351. // newTeacher.PartitionKey = "ScTeacher";
  352. // newTeacher.tmdid = null;
  353. // newTeacher.schoolCode = schoolInfo?.schoolCode;
  354. // newTeacher.RowKey = $"{newTeacher.PXID}";
  355. // newTeachers.Add(newTeacher);
  356. // }
  357. // }
  358. // });
  359. // await table.SaveOrUpdateAll(newTeachers);
  360. //}
  361. #region 省平台获取到最新的教师,并添加到Table中。
  362. var adds = teachers.FindAll(x => asin.Contains($"{x.TID}"));
  363. var addTeachers = ScTeachers.FindAll(x => adds.Select(y => $"{ y.PXID}").Contains($"{x.RowKey}"));
  364. if (addTeachers.IsNotEmpty())
  365. {
  366. //省平台教师替换的。
  367. addTeachers.ForEach(x =>
  368. {
  369. var tt = teachers.Find(z => x.RowKey.Equals($"{z.PXID}"));
  370. var school = ScSchools.Find(s => s.schoolid == x.SchoolID);
  371. if (school != null)
  372. {
  373. if (tt != null)
  374. {
  375. x.status = 1;
  376. x.TID = tt.TID;
  377. x.TeacherName = tt.TeacherName;
  378. x.SchoolID = tt.SchoolID;
  379. x.SchoolName = tt.SchoolName;
  380. x.ProjectID = tt.ProjectID;
  381. x.ProjectItemID = tt.ProjectItemID;
  382. x.ProjectItemTitle = tt.ProjectItemTitle;
  383. x.ProjectTitle = tt.ProjectTitle;
  384. x.CityID = tt.CityID;
  385. x.DistrictID = tt.DistrictID;
  386. x.CityName = tt.CityName;
  387. x.DisName = tt.DisName;
  388. x.Account = tt.Account;
  389. x.TeacherXK = tt.TeacherXK;
  390. x.TeacherXD = tt.TeacherXD;
  391. x.Mobile = x.Mobile;
  392. x.Email = tt.Email;
  393. x.areaId = $"{areaId}";
  394. x.PartitionKey = "ScTeacher";
  395. x.tmdid = null;
  396. x.schoolCode = school?.schoolCode;
  397. }
  398. }
  399. else {
  400. }
  401. });
  402. addTeachers = await table.SaveOrUpdateAll(addTeachers);
  403. }
  404. else
  405. {
  406. //省平台更新的
  407. foreach (var x in adds)
  408. {
  409. x.RowKey = $"{x.PXID}";
  410. x.status = 1;
  411. x.areaId = $"{areaId}";
  412. x.PartitionKey = "ScTeacher";
  413. var school = ScSchools.Find(s => s.schoolid == x.SchoolID);
  414. x.schoolCode = school?.schoolCode;
  415. }
  416. addTeachers = await table.SaveOrUpdateAll(adds);
  417. }
  418. if (ScTeachers.Count == teachers.Count)
  419. {
  420. foreach (var x in ScTeachers)
  421. {
  422. var tt = teachers.Find(z => x.RowKey.Equals($"{z.PXID}"));
  423. if (tt != null)
  424. {
  425. x.status = 1;
  426. x.TID = tt.TID;
  427. x.TeacherName = tt.TeacherName;
  428. x.SchoolID = tt.SchoolID;
  429. x.SchoolName = tt.SchoolName;
  430. x.ProjectID = tt.ProjectID;
  431. x.ProjectItemID = tt.ProjectItemID;
  432. x.ProjectItemTitle = tt.ProjectItemTitle;
  433. x.ProjectTitle = tt.ProjectTitle;
  434. x.CityID = tt.CityID;
  435. x.DistrictID = tt.DistrictID;
  436. x.CityName = tt.CityName;
  437. x.DisName = tt.DisName;
  438. x.Account = tt.Account;
  439. x.TeacherXK = tt.TeacherXK;
  440. x.TeacherXD = tt.TeacherXD;
  441. x.Mobile = x.Mobile;
  442. x.Email = tt.Email;
  443. x.areaId = $"{areaId}";
  444. x.PartitionKey = "ScTeacher";
  445. x.tmdid = null;
  446. var school = ScSchools.Find(s => s.schoolid == x.SchoolID);
  447. x.schoolCode = school?.schoolCode;
  448. }
  449. }
  450. addTeachers = await table.SaveOrUpdateAll(ScTeachers);
  451. }
  452. #endregion 省平台获取到最新的教师,并添加到Table中。
  453. //反向去补全四川省平台 Table中没有绑定tmdid的账号
  454. var unbindtmdid = ScTeachers.FindAll(x => string.IsNullOrEmpty(x.tmdid));
  455. var tids = unbindtmdid.Select(x => $"{x.TID}").ToHashSet();
  456. if (tids.Count() > 0)
  457. {
  458. List<DbBind> binds = new List<DbBind>();
  459. 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}'"))})";
  460. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<DbBind>
  461. (queryText: sql, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
  462. {
  463. binds.Add(item);
  464. }
  465. if (binds.IsNotEmpty())
  466. {
  467. List<ScTeacher> update = new();
  468. binds.ForEach(x =>
  469. {
  470. var exs = unbindtmdid.FindAll(z => $"{z.TID}".Equals(x.userid));
  471. if (exs.IsNotEmpty())
  472. {
  473. exs.ForEach(y =>
  474. {
  475. y.tmdid = x.id;
  476. });
  477. update.AddRange(exs);
  478. }
  479. });
  480. var group = update.GroupBy(x => x.RowKey).Select(z => new { z.Key, list = z.ToList() });
  481. List<ScTeacher> scTeachers = new();
  482. group.ToList().ForEach(x =>
  483. {
  484. if (x.list.Count() == 1)
  485. {
  486. scTeachers.Add(x.list[0]);
  487. }
  488. else if (x.list.Count > 1)
  489. {
  490. scTeachers.Add(x.list[0]);
  491. }
  492. });
  493. scTeachers = await table.SaveOrUpdateAll(scTeachers);
  494. }
  495. }
  496. //反向更新教师绑定的省平台的SchoolID(int)和schoolCode(string)
  497. ScTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object> { { "PartitionKey", "ScTeacher" }, { "areaId", $"{areaId}" } });
  498. var scSchools = await table.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" }, { "areaId", $"{areaId}" } });
  499. List<ScTeacher> updateTch = new List<ScTeacher>();
  500. ScTeachers.FindAll(y => string.IsNullOrWhiteSpace(y.schoolCode)).ForEach(x =>
  501. {
  502. var scSchool = scSchools.Find(s => s.schoolid == x.SchoolID);
  503. x.schoolCode = scSchool?.schoolCode;
  504. updateTch.Add(x);
  505. });
  506. if (updateTch.IsNotEmpty())
  507. {
  508. // await table.SaveOrUpdateAll(updateTch);
  509. }
  510. return Ok(new { addTeachers, update = updateTch.Select(x => new { x.areaId, x.PXID, x.TID, x.TeacherName, x.tmdid, x.SchoolName, x.DisName }), ScTeachers });
  511. }
  512. /// <summary>
  513. ///1. 检查学校是否有同名的
  514. /// </summary>
  515. /// <param name="request"></param>
  516. /// <returns></returns>
  517. [ProducesDefaultResponseType]
  518. [HttpPost("get-sc-school")]
  519. [AllowAnonymous]
  520. public async Task<IActionResult> GetScSchool(JsonElement request)
  521. {
  522. if (!request.TryGetProperty("accessConfig", out JsonElement accessConfig)) return BadRequest();
  523. if (!request.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
  524. if (!request.TryGetProperty("city", out JsonElement city)) return BadRequest();
  525. if (!request.TryGetProperty("dist", out JsonElement dist)) return BadRequest();
  526. List<ScSchool> schools = null;
  527. List<ScSchool> matchSchools = null;
  528. int status = -1; string json = null;
  529. Dictionary<string, object> dict = new Dictionary<string, object> { { "accessConfig", $"{accessConfig}" }, { "areaId", $"{areaId}" } };
  530. List<School> ignore = new List<School>();
  531. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: $"select value(c) from c where c.areaId='{areaId}'",
  532. requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") }))
  533. {
  534. ignore.Add(item);
  535. }
  536. //(status, json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetSchoolList");
  537. (status, json) = await ScsStudyApisService.GetSchoolList(_httpClient.CreateClient(), _dingDing, _azureStorage, $"{areaId}", $"{accessConfig}");
  538. if (status == 200)
  539. {
  540. schools = json.ToObject<List<ScSchool>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  541. if (ignore.IsNotEmpty())
  542. {
  543. matchSchools = schools.FindAll(x => ignore.Select(y => y.name).Contains(x.schoolname));
  544. if (matchSchools.IsNotEmpty())
  545. {
  546. if (matchSchools.Count != ignore.Count)
  547. {
  548. var matched = matchSchools.Select(x => x.schoolname);
  549. var unmatch = ignore.Select(y => y.name).Except(matched);
  550. List<string> scschoolUnmatch = schools.Select(y => y.schoolname).Except(matched).ToList();
  551. if (scschoolUnmatch.IsNotEmpty())
  552. {
  553. return Ok(new { matched, unmatch, scschoolUnmatch });
  554. }
  555. }
  556. else
  557. {
  558. matchSchools.ForEach(x =>
  559. {
  560. var exschool = ignore.Find(y => y.name.Equals(x.schoolname));
  561. if (exschool != null)
  562. {
  563. x.schoolCode = exschool.id;
  564. x.areaId = $"{areaId}";
  565. x.city = $"{city}";
  566. x.dist = $"{dist}";
  567. }
  568. });
  569. }
  570. }
  571. else
  572. {
  573. return Ok(new { unmatch = ignore, schools = schools.Select(x => new { x.schoolname, x.schoolCode, x.schoolid }) });
  574. }
  575. }
  576. }
  577. return Ok(new { schools = schools.Select(x => new { x.schoolname, x.schoolCode, x.schoolid }) });
  578. }
  579. /// <summary>
  580. /// 2. 处理 省平台最新的教师以及 反向更新没有绑定醍摩豆id 的账号。
  581. /// </summary>
  582. /// <param name="request"></param>
  583. /// <returns></returns>
  584. [ProducesDefaultResponseType]
  585. [HttpPost("get-project-school")]
  586. [AllowAnonymous]
  587. public async Task<IActionResult> GetProjectSchool(JsonElement request)
  588. {
  589. if (!request.TryGetProperty("accessConfig", out JsonElement accessConfig)) return BadRequest();
  590. if (!request.TryGetProperty("city", out JsonElement city)) return BadRequest();
  591. if (!request.TryGetProperty("dist", out JsonElement dist)) return BadRequest();
  592. if (!request.TryGetProperty("areaId", out JsonElement areaId)) return BadRequest();
  593. if (!request.TryGetProperty("standard", out JsonElement standard)) return BadRequest();
  594. List<School> ignore = new List<School>();
  595. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<School>(queryText: $"select value(c) from c where c.areaId='{areaId}'",
  596. requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") }))
  597. {
  598. ignore.Add(item);
  599. }
  600. Dictionary<string, object> dict = new Dictionary<string, object> { { "accessConfig", $"{accessConfig}" }, { "areaId", $"{areaId}" } };
  601. int status = -1; string json = null;
  602. //5.3.1.1获取项目列表
  603. //(status, json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetProjectInfoByTrainComID");
  604. //新的方式 5.3.1.1获取项目列表
  605. (status, json) = await ScsStudyApisService.GetProjectInfoByTrainComID(_httpClient.CreateClient(), _dingDing, _azureStorage, $"{areaId}", $"{accessConfig}");
  606. List<ScProject> projects = null;
  607. List<ScSchool> saveschools = null;
  608. List<ScSchool> schools = null;
  609. List<ScSchool> matchSchools = null;
  610. List<ScSchool> tbschools = null;
  611. if (status == 200)
  612. {
  613. projects = json.ToObject<List<ScProject>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  614. }
  615. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  616. // 5.3.1.18根据机构ID、项目ID、子项目ID返回学校列表
  617. //(status, json) = await _httpTrigger.RequestHttpTrigger(dict, _option.Location, "GetSchoolList");
  618. (status, json) = await ScsStudyApisService.GetSchoolList(_httpClient.CreateClient(), _dingDing, _azureStorage, $"{areaId}", $"{accessConfig}");
  619. if (status == 200)
  620. {
  621. schools = json.ToObject<List<ScSchool>>(new JsonSerializerOptions { PropertyNameCaseInsensitive = false });
  622. if (ignore.IsNotEmpty())
  623. {
  624. matchSchools = schools.FindAll(x => ignore.Select(y => y.name).Contains(x.schoolname));
  625. if (matchSchools.IsNotEmpty())
  626. {
  627. if (matchSchools.Count != ignore.Count)
  628. {
  629. var matched = matchSchools.Select(x => x.schoolname);
  630. var unmatch = ignore.Select(y => y.name).Except(matched);
  631. List<string> scschoolUnmatch = schools.Select(y => y.schoolname).Except(matched).ToList();
  632. if (scschoolUnmatch.IsNotEmpty())
  633. {
  634. return Ok(new { matched, unmatch, scschoolUnmatch });
  635. }
  636. }
  637. else
  638. {
  639. matchSchools.ForEach(x =>
  640. {
  641. var exschool = ignore.Find(y => y.name.Equals(x.schoolname));
  642. if (exschool != null)
  643. {
  644. x.schoolCode = exschool.id;
  645. x.areaId = $"{areaId}";
  646. x.city = $"{city}";
  647. x.dist = $"{dist}";
  648. }
  649. });
  650. }
  651. }
  652. else
  653. {
  654. return Ok(new { unmatch = ignore, schools = schools.Select(x => new { x.schoolname, x.schoolCode, x.schoolid }) });
  655. }
  656. }
  657. //数据校验,拉取所有学校的
  658. tbschools = await table.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", "ScSchool" }, { "areaId", $"{areaId}" } });
  659. if (tbschools.IsNotEmpty())
  660. {
  661. var a = tbschools.Select(y => $"{y.RowKey}").ToList();
  662. //不存在的schoolid 才会进行新增操作,如果schoolid已经有。就不再操作
  663. saveschools = schools.Where(x => !a.Exists(z => z.Equals($"{x.schoolid}"))).ToList();
  664. List<SchoolData> schoolDatas = new();
  665. saveschools.ForEach(x =>
  666. {
  667. x.RowKey = $"{x.schoolid}";
  668. x.PartitionKey = "ScSchool";
  669. x.areaId = $"{areaId}";
  670. x.city = $"{city}";
  671. x.dist = $"{dist}";
  672. var a = ignore.Find(z => z.name.Equals(x.schoolname));
  673. if (a != null)
  674. {
  675. x.schoolCode = a.id;
  676. }
  677. else
  678. {
  679. if (string.IsNullOrEmpty(x.schoolCode))
  680. {
  681. schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
  682. }
  683. }
  684. });
  685. schoolDatas = await GenerateSchoolCode(schoolDatas, _dingDing, _environment);
  686. saveschools.ForEach(x =>
  687. {
  688. var schoolData = schoolDatas.Find(y => y.uid.Equals($"{x.schoolid}"));
  689. if (schoolData != null && !string.IsNullOrEmpty(schoolData.id))
  690. {
  691. x.schoolCode = schoolData.id;
  692. x.areaId = $"{areaId}";
  693. x.city = $"{city}";
  694. x.dist = $"{dist}";
  695. }
  696. });
  697. //同时移除没有生成的schoolCode的
  698. saveschools.RemoveAll(x => string.IsNullOrEmpty(x.schoolCode));
  699. saveschools.RemoveAll(x => tbschools.FindAll(z => !string.IsNullOrEmpty(z.schoolCode)).Exists(y => y.schoolCode.Equals(x.schoolCode)));
  700. saveschools = await table.SaveAll(saveschools);
  701. }
  702. else
  703. {
  704. List<SchoolData> schoolDatas = new List<SchoolData>();
  705. schools.ForEach(x =>
  706. {
  707. x.RowKey = $"{x.schoolid}";
  708. x.PartitionKey = "ScSchool";
  709. x.areaId = $"{areaId}";
  710. x.city = $"{city}";
  711. x.dist = $"{dist}";
  712. var a = ignore.Find(z => z.name.Equals(x.schoolname));
  713. if (a != null)
  714. {
  715. x.schoolCode = a.id;
  716. }
  717. else
  718. {
  719. if (string.IsNullOrEmpty(x.schoolCode))
  720. {
  721. schoolDatas.Add(new SchoolData { uid = $"{x.schoolid}", province = "四川省", city = $"{city}", name = x.schoolname });
  722. }
  723. }
  724. });
  725. schoolDatas = await SchoolService.GenerateSchoolCode(schoolDatas, _dingDing, _environment);
  726. schools.ForEach(x =>
  727. {
  728. var schoolData = schoolDatas.Find(y => y.uid.Equals($"{x.schoolid}"));
  729. if (schoolData != null && !string.IsNullOrEmpty(schoolData.id))
  730. {
  731. x.schoolCode = schoolData.id;
  732. x.areaId = $"{areaId}";
  733. x.city = $"{city}";
  734. x.dist = $"{dist}";
  735. }
  736. });
  737. schools.RemoveAll(x => string.IsNullOrEmpty(x.schoolCode));
  738. saveschools = await table.SaveOrUpdateAll(schools);
  739. }
  740. }
  741. List<string> unsave = new List<string>();
  742. if (saveschools.IsNotEmpty())
  743. {
  744. var ex = schools.Select(x => $"{x.schoolid}").Except(saveschools.Select(y => y.RowKey));
  745. if (ex.Count() > 0)
  746. {
  747. unsave.AddRange(ex);
  748. }
  749. }
  750. if (tbschools.IsNotEmpty())
  751. {
  752. var ex = schools.Select(x => $"{x.schoolid}").Except(tbschools.Select(y => y.RowKey));
  753. if (ex.Count() > 0)
  754. {
  755. unsave.AddRange(ex);
  756. }
  757. }
  758. var areaschools = await table.FindListByDict<ScSchool>(new Dictionary<string, object>() { { "PartitionKey", $"ScSchool" }, { "areaId", $"{areaId}" } });
  759. List<School> cosbdschools = new List<School>();
  760. 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") }))
  761. {
  762. cosbdschools.Add(item);
  763. }
  764. var tbs = areaschools.FindAll(x => areaschools.Select(z => z.schoolCode).Except(cosbdschools.Select(x => x.id)).Contains(x.schoolCode));
  765. List<CSchool> cSchools = new List<CSchool>();
  766. foreach (var sch in tbs)
  767. {
  768. cSchools.Add(new CSchool
  769. {
  770. id = sch.schoolCode,
  771. name = sch.schoolname,
  772. // admin = "1530606136",
  773. period = new List<string>() { sch.schooltypename },
  774. size = 1024,
  775. });
  776. }
  777. var client = _azureCosmos.GetCosmosClient();
  778. List<School> schoolsfailed = new List<School>();
  779. List<School> schoolsScucess = new List<School>();
  780. List<string> failedmsg = new List<string>();
  781. foreach (var sc in cSchools)
  782. {
  783. List<Period> periods = new List<Period>();
  784. string campusId = Guid.NewGuid().ToString();
  785. sc.period.ForEach(x =>
  786. {
  787. periods.Add(new Period { id = Guid.NewGuid().ToString(), name = x, campusId = campusId,
  788. semesterCount = 2,
  789. gradeCount = 1,
  790. grades=new List<string> { "一年级"},
  791. subjectCount=1,
  792. subjects=new List<Subject> { new Subject {name="预设学科" ,id= Guid.NewGuid().ToString()} },
  793. semesters = new List<Semester>
  794. {
  795. new Semester { name = "上学期", start = 1, month = 9, day = 1, id = Guid.NewGuid().ToString() },
  796. new Semester { name = "下学期", start = 0, month = 3, day = 1, id = Guid.NewGuid().ToString() }
  797. },
  798. }) ;
  799. });
  800. School school = new School
  801. {
  802. id = sc.id,
  803. name = sc.name,
  804. size = sc.size,
  805. code = "Base",
  806. campuses = new List<Campus> { new Campus { name = sc.name, id = campusId } },
  807. region = "中国",
  808. province = "四川省",
  809. city = $"{city}",
  810. timeZone = new SDK.Models.TimeZone { label = "(UTC+08:00) 北京,重庆,香港特别行政区,乌鲁木齐", value = "+08:00" },
  811. type = 1,
  812. pk = "School",
  813. ttl = -1,
  814. schoolCode = sc.id,
  815. dist = $"{dist}",
  816. period = periods,
  817. areaId = $"{areaId}",
  818. standard = $"{standard}"
  819. };
  820. try
  821. {
  822. await client.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<School>(school, new PartitionKey(school.code));
  823. schoolsScucess.Add(school);
  824. }
  825. catch (CosmosException ex)
  826. {
  827. failedmsg.Add($"{school.ToJsonString()}\n \n{ex.Status}{ex.Message }\n ");
  828. schoolsfailed.Add(school);
  829. }
  830. catch (Exception ex)
  831. {
  832. failedmsg.Add($"{school.ToJsonString()}\n{ex.Message }\n ");
  833. schoolsfailed.Add(school);
  834. }
  835. }
  836. return Ok(new
  837. {
  838. projects,
  839. msg = $"Table中已经有:{tbschools.Count}个学校,省平台获取到:" +
  840. $"{schools?.Count}个学校,本次保存有:{saveschools?.Count},没有被保存的学校:" +
  841. $"{unsave?.Count},创建失败的学校有:{schoolsfailed.Count()}," +
  842. $"创建成功的的学校有:{schoolsScucess.Count()}",
  843. schoolsfailed,
  844. failedmsg,
  845. schoolsScucess,
  846. tbsch = tbschools.Select(x => new { x.schoolname, x.schoolCode }),
  847. });
  848. }
  849. }
  850. }