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