ScsStudyApisService.cs 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054
  1. using Azure.Cosmos;
  2. using HTEXLib.COMM.Helpers;
  3. using HTEXLib.Helpers.ShapeHelpers;
  4. using Microsoft.Extensions.Configuration;
  5. using Microsoft.Extensions.DependencyInjection;
  6. using Microsoft.Extensions.Options;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Net;
  12. using System.Net.Http;
  13. using System.Text;
  14. using System.Text.Json;
  15. using System.Threading.Tasks;
  16. using TEAMModelOS.SDK.Extension;
  17. using TEAMModelOS.SDK.Models;
  18. using TEAMModelOS.SDK.Models.Dtos;
  19. namespace TEAMModelOS.SDK.DI
  20. {
  21. public class ScsStudyApisService
  22. {
  23. private readonly AzureCosmosFactory _azureCosmos;
  24. private readonly DingDing _dingDing;
  25. private readonly AzureStorageFactory _azureStorage;
  26. private readonly AzureRedisFactory _azureRedis;
  27. public static string Code { get; set; }
  28. public static Dictionary<string, object> parameterMap = null;
  29. //private readonly IWebHostEnvironment _environment;
  30. public bool check = true;
  31. private SnowflakeId _snowflakeId;
  32. private readonly IHttpClientFactory _httpClient;
  33. //private readonly IConfiguration _configuration;
  34. // private readonly DI.DingDing _dingDing;
  35. //public readonly Option _option;
  36. public ScsStudyApisService(AzureCosmosFactory azureCosmos, DingDing dingDing, AzureStorageFactory azureStorage, AzureRedisFactory azureRedis, IHttpClientFactory httpClient, SnowflakeId snowflakeId)
  37. {
  38. _azureCosmos = azureCosmos;
  39. _dingDing = dingDing;
  40. _azureStorage = azureStorage;
  41. _azureRedis = azureRedis;
  42. _httpClient = httpClient;
  43. //_environment = environment;
  44. _snowflakeId = snowflakeId;
  45. //_option = option?.Value;
  46. //_configuration = configuration;
  47. //_dingDing = dingDing;
  48. }
  49. /// <summary>
  50. /// 5.3.1.1获取项目列表
  51. /// </summary>
  52. /// <param name="areaId"></param>
  53. /// <param name="_accessConfig"></param>
  54. /// <returns></returns>
  55. public async Task<(int state,string json)> GetProjectInfoByTrainComIDV2(string areaId, string accessConfig)
  56. {
  57. List<ScProject> projects = new();
  58. //var response = req.CreateResponse(HttpStatusCode.OK);
  59. //List<ScProject> projects = new List<ScProject>();
  60. //string data = await new StreamReader(req.Body).ReadToEndAsync();
  61. //JsonElement accessConfig = data.ToObject<JsonElement>().GetProperty("accessConfig");
  62. //ScAccessConfig config = $"{accessConfig}".ToObject<ScAccessConfig>();
  63. //string areaId = null;
  64. //if (data.ToObject<JsonElement>().TryGetProperty("areaId", out JsonElement _areaId))
  65. //{
  66. // areaId = $"{_areaId}";
  67. //}
  68. ScAccessConfig config = accessConfig.ToObject<JsonElement>().ToObject<ScAccessConfig>();
  69. Code = "GetProjectInfoByTrainComID";
  70. parameterMap = new Dictionary<string, object>();
  71. parameterMap.Add("TrainComID", config.trainComID);
  72. ScsResult result = new() { bizcode = Code, title = "5.3.1.1获取项目列表" };
  73. try
  74. {
  75. result = await ThirdApisService.Post(_httpClient,config.url, Code, config.passKey, config.privateKey, parameterMap);
  76. if (result.result)
  77. {
  78. projects = result.content.ToObject<List<ScProject>>();
  79. }
  80. //await response.WriteAsJsonAsync(new { data = projects.ToJsonString() });
  81. return (200, projects.ToJsonString());
  82. }
  83. catch (Exception ex)
  84. {
  85. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IES5.ScApisService:GetProjectInfoByTrainComID\n{ex.Message}\n{ex.StackTrace}\n{result.ToJsonString()}\n{areaId}\n{accessConfig} \n", GroupNames.醍摩豆服務運維群組);
  86. //await response.WriteAsJsonAsync(new { data = projects.ToJsonString() });
  87. return (500, projects.ToJsonString());
  88. }
  89. }
  90. /// <summary>
  91. /// 5.3.1.1获取项目列表
  92. /// </summary>
  93. /// <param name="areaId"></param>
  94. /// <param name="_accessConfig"></param>
  95. /// <returns></returns>
  96. public async Task<(int state, string json)> GetProjectInfoByTrainComID(string areaId, string accessConfig)
  97. {
  98. List<ScProject> projects = new();
  99. ScAccessConfig config = accessConfig.ToObject<JsonElement>().ToObject<ScAccessConfig>();
  100. Code = "GetProjectInfoByTrainComID";
  101. parameterMap = new Dictionary<string, object>();
  102. parameterMap.Add("TrainComID", config.trainComID);
  103. ScsResult result = new() { bizcode = Code, title = "5.3.1.1获取项目列表" };
  104. try
  105. {
  106. result = await ThirdApisService.Post(_httpClient,config.url, Code, config.passKey, config.privateKey, parameterMap);
  107. if (result.result)
  108. {
  109. projects = result.content.ToObject<List<ScProject>>();
  110. }
  111. else
  112. {
  113. }
  114. //await response.WriteAsJsonAsync(new { data = projects.ToJsonString() });
  115. return (200, projects.ToJsonString());
  116. }
  117. catch (Exception ex)
  118. {
  119. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IES5.ScApisService:GetProjectInfoByTrainComID\n{ex.Message}\n{ex.StackTrace}\n{result.ToJsonString()}\n{areaId}\n{accessConfig}\n", GroupNames.醍摩豆服務運維群組);
  120. //await response.WriteAsJsonAsync(new { data = projects.ToJsonString() });
  121. return (500, projects.ToJsonString());
  122. }
  123. }
  124. /// <summary>
  125. /// 5.3.1.18根据机构ID、项目ID、子项目ID返回学校列表
  126. /// </summary>
  127. /// <param name="areaId"></param>
  128. /// <param name="_accessConfig"></param>
  129. /// <returns></returns>
  130. public async Task<(int state, string json)> GetSchoolList(string areaId, string accessConfig)
  131. {
  132. List<ScSchool> scSchools = new();
  133. ScAccessConfig config = accessConfig.ToObject<JsonElement>().ToObject<ScAccessConfig>();
  134. Code = "GetSchoolList";
  135. parameterMap = new Dictionary<string, object>();
  136. parameterMap.Add("TrainComID", config.trainComID);
  137. List<ScsResult> results = new();
  138. try
  139. {
  140. if (config.p.IsNotEmpty())
  141. {
  142. foreach (var ps in config.p)
  143. {
  144. if (ps.status == 1)
  145. {
  146. parameterMap["ProjectID"] = ps.pd;
  147. parameterMap["ProjectItemID"] = ps.pid;
  148. ScsResult result = new ScsResult { bizcode = Code, title = " 5.3.1.18根据机构ID、项目ID、子项目ID返回学校列表" };
  149. result = await ThirdApisService.Post(_httpClient,config.url, Code, config.passKey, config.privateKey, parameterMap);
  150. if (result.result)
  151. {
  152. List<ScSchool> schools = result.content.ToObject<List<ScSchool>>();
  153. if (schools.IsNotEmpty())
  154. {
  155. //schools.ForEach(x => { x.ProjectID = int.Parse(ps.pd); x.ProjectItemID = int.Parse(ps.pid); });
  156. scSchools.AddRange(schools);
  157. }
  158. }
  159. results.Add(result);
  160. }
  161. }
  162. }
  163. //await response.WriteAsJsonAsync(new { data = scSchools.ToJsonString() });
  164. return (200, scSchools.ToJsonString());
  165. }
  166. catch (Exception ex)
  167. {
  168. ScsProject project = null;
  169. var ps = config.p.FindAll(z => z.status == 1);
  170. if (ps.IsNotEmpty())
  171. {
  172. project = ps[0];
  173. }
  174. if (project != null)
  175. {
  176. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  177. scSchools = await table.FindListByDict<ScSchool>(new Dictionary<string, object> { { "PartitionKey", "ScSchool" }, { "ProjectID", int.Parse(project.pd) }, { "ProjectItemID", int.Parse(project.pid) } });
  178. if (scSchools.IsNotEmpty())
  179. {
  180. return (200, scSchools.ToJsonString());
  181. }
  182. else
  183. {
  184. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IES5.ScApisService:GetSchoolList\n{ex.Message}\n{ex.StackTrace}\n{results.ToJsonString()}\n{areaId}\n{accessConfig}\n", GroupNames.醍摩豆服務運維群組);
  185. return (500, scSchools.ToJsonString());
  186. }
  187. }
  188. else
  189. {
  190. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IES5.ScApisService:GetSchoolList\n{ex.Message}\n{ex.StackTrace}\n{results.ToJsonString()}\n{areaId}\n{accessConfig}\n", GroupNames.醍摩豆服務運維群組);
  191. return (500, scSchools.ToJsonString());
  192. }
  193. }
  194. }
  195. /// <summary>
  196. /// 5.3.1.2获取学员名单
  197. /// </summary>
  198. /// <param name="areaId"></param>
  199. /// <param name="accessConfig"></param>
  200. /// <returns></returns>
  201. public async Task<(int state, string json)> GetTeachersListByProject(string areaId, string accessConfig)
  202. {
  203. List<ScTeacher> scTeachers = new();
  204. ScAccessConfig config = accessConfig.ToObject<JsonElement>().ToObject<ScAccessConfig>();
  205. Code = "GetTeachersListByProject";
  206. parameterMap = new Dictionary<string, object>();
  207. parameterMap.Add("TrainComID", config.trainComID);
  208. List<ScsResult> results = new List<ScsResult>();
  209. try
  210. {
  211. if (config.p.IsNotEmpty())
  212. {
  213. foreach (var ps in config.p)
  214. {
  215. if (ps.status == 1)
  216. {
  217. parameterMap["ProjectID"] = ps.pd;
  218. parameterMap["ProjectItemID"] = ps.pid;
  219. ScsResult result = new ScsResult { bizcode = Code, title = "5.3.1.2获取学员名单" };
  220. result = await ThirdApisService.Post(_httpClient,config.url, Code, config.passKey, config.privateKey, parameterMap);
  221. if (result.result)
  222. {
  223. List<ScTeacher> teachers = result.content.ToObject<List<ScTeacher>>();
  224. if (teachers.IsNotEmpty())
  225. {
  226. scTeachers.AddRange(teachers);
  227. }
  228. }
  229. results.Add(result);
  230. }
  231. }
  232. }
  233. return (200, scTeachers.ToJsonString());
  234. }
  235. catch (Exception ex)
  236. {
  237. ScsProject project = null;
  238. var ps = config.p.FindAll(z => z.status == 1);
  239. if (ps .IsNotEmpty())
  240. {
  241. project = ps[0];
  242. }
  243. if (project != null)
  244. {
  245. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  246. scTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object> { { "PartitionKey", "ScTeacher" }, { "ProjectID", int.Parse(project.pd) }, { "ProjectItemID", int.Parse(project.pid) } });
  247. if (scTeachers.IsNotEmpty())
  248. {
  249. return (200, scTeachers.ToJsonString());
  250. }
  251. else
  252. {
  253. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IES5.ScApisService:GetTeachersListByProject\n{ex.Message}\n{ex.StackTrace}\n{results.ToJsonString()}\n", GroupNames.醍摩豆服務運維群組);
  254. return (500, scTeachers.ToJsonString());
  255. }
  256. }
  257. else
  258. {
  259. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IES5.ScApisService:GetTeachersListByProject\n{ex.Message}\n{ex.StackTrace}\n{results.ToJsonString()}\n", GroupNames.醍摩豆服務運維群組);
  260. return (500, scTeachers.ToJsonString());
  261. }
  262. }
  263. }
  264. /// <summary>
  265. /// 5.3.1.20获取学校设置的可选能力点
  266. /// </summary>
  267. /// <param name="areaId"></param>
  268. /// <param name="accessConfig"></param>
  269. /// <param name="schoolCode"></param>
  270. /// <returns></returns>
  271. public async Task<(int state, string json)> GetSchoolDiagnosis(string areaId, string accessConfig, string schoolCode)
  272. {
  273. List<ScsProjectDiagnosis> projects = new();
  274. ScAccessConfig config = accessConfig.ToObject<JsonElement>().ToObject<ScAccessConfig>();
  275. Code = "GetSchoolDiagnosis";
  276. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  277. parameterMap = new Dictionary<string, object>();
  278. parameterMap.Add("TrainComID", config.trainComID);
  279. List<ScsResult> results = new List<ScsResult>();
  280. try
  281. {
  282. if (config.p.IsNotEmpty())
  283. {
  284. foreach (var ps in config.p)
  285. {
  286. if (ps.status == 1)
  287. {
  288. parameterMap["ProjectID"] = ps.pd;
  289. parameterMap["ProjectItemID"] = ps.pid;
  290. parameterMap["SchoolID"] = $"{schoolCode}";
  291. parameterMap["School"] = $"{schoolCode}";
  292. ScsResult result = new ScsResult { bizcode = Code, title = " 5.3.1.20获取学校设置的可选能力点" };
  293. result = await ThirdApisService.Post(_httpClient,config.url, Code, config.passKey, config.privateKey, parameterMap);
  294. if (result.result)
  295. {
  296. List<ScPDiagnosis> diagnoses = result.content.ToObject<List<ScPDiagnosis>>();
  297. if (diagnoses.IsNotEmpty())
  298. {
  299. projects.Add(new ScsProjectDiagnosis { project = ps, diagnoses = diagnoses, });
  300. await table.SaveOrUpdate<ScProjectDiagnosis>(new ScProjectDiagnosis
  301. {
  302. schoolCode = $"{schoolCode}",
  303. areaId = areaId,
  304. ProjectID = int.Parse(ps.pd),
  305. ProjectItemID = int.Parse(ps.pid),
  306. RowKey = $"{ps.pid}-{schoolCode}",
  307. PartitionKey = "ScSchoolDiagnosis",
  308. abilityNos = diagnoses.ToJsonString()
  309. });
  310. }
  311. }
  312. else
  313. {
  314. List<ScProjectDiagnosis> teacherDiagnoses = await table.FindListByDict<ScProjectDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScSchoolDiagnosis" }, { "RowKey", $"{ps.pid}-{schoolCode}" } });
  315. if (teacherDiagnoses.IsNotEmpty())
  316. {
  317. projects.Add(new ScsProjectDiagnosis { project = ps, diagnoses = teacherDiagnoses[0].abilityNos.ToObject<List<ScPDiagnosis>>() });
  318. }
  319. }
  320. results.Add(result);
  321. }
  322. }
  323. }
  324. //await response.WriteAsJsonAsync(new { data = projects.ToJsonString() });
  325. return (200,projects.ToJsonString());
  326. }
  327. catch (Exception ex)
  328. {
  329. //await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IES5.ScApisService:GetSchoolDiagnosis\n{ex.Message}\n{ex.StackTrace}\n{results.ToJsonString()}\n{data}", GroupNames.醍摩豆服務運維群組);
  330. if (config.p.IsNotEmpty())
  331. {
  332. foreach (var ps in config.p)
  333. {
  334. List<ScProjectDiagnosis> teacherDiagnoses = await table.FindListByDict<ScProjectDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScSchoolDiagnosis" }, { "RowKey", $"{ps.pid}-{schoolCode}" } });
  335. if (teacherDiagnoses.IsNotEmpty())
  336. {
  337. projects.Add(new ScsProjectDiagnosis { project = ps, diagnoses = teacherDiagnoses[0].abilityNos.ToObject<List<ScPDiagnosis>>() });
  338. }
  339. }
  340. }
  341. //await response.WriteAsJsonAsync(new { data = projects.ToJsonString() });
  342. return (200,projects.ToJsonString());
  343. }
  344. }
  345. /// <summary>
  346. /// 5.3.1.19获取项目设置的可选能力点
  347. /// </summary>
  348. /// <param name="areaId"></param>
  349. /// <param name="accessConfig"></param>
  350. /// <returns></returns>
  351. public async Task<(int state, string json)> GetProjectDiagnosis(string areaId, string accessConfig)
  352. {
  353. List<ScsProjectDiagnosis> projects = new();
  354. ScAccessConfig config = accessConfig.ToObject<JsonElement>().ToObject<ScAccessConfig>();
  355. Code = "GetProjectDiagnosis";
  356. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  357. parameterMap = new Dictionary<string, object>();
  358. parameterMap.Add("TrainComID", config.trainComID);
  359. List<ScsResult> results = new();
  360. try
  361. {
  362. if (config.p.IsNotEmpty())
  363. {
  364. foreach (var ps in config.p)
  365. {
  366. if (ps.status == 1)
  367. {
  368. parameterMap["ProjectID"] = ps.pd;
  369. parameterMap["ProjectItemID"] = ps.pid;
  370. ScsResult result = new ScsResult { bizcode = Code, title = "5.3.1.19获取项目设置的可选能力点" };
  371. result = await ThirdApisService.Post(_httpClient,config.url, Code, config.passKey, config.privateKey, parameterMap);
  372. if (result.result)
  373. {
  374. List<ScPDiagnosis> diagnoses = result.content.ToObject<List<ScPDiagnosis>>();
  375. if (diagnoses.IsNotEmpty())
  376. {
  377. projects.Add(new ScsProjectDiagnosis { project = ps, diagnoses = diagnoses });
  378. await table.SaveOrUpdate<ScProjectDiagnosis>(new ScProjectDiagnosis { areaId = areaId, RowKey = $"{ps.pid}", PartitionKey = "ScProjectDiagnosis", abilityNos = diagnoses.ToJsonString() });
  379. }
  380. }
  381. else
  382. {
  383. List<ScProjectDiagnosis> teacherDiagnoses = await table.FindListByDict<ScProjectDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScProjectDiagnosis" }, { "RowKey", $"{ps.pid}" } });
  384. if (teacherDiagnoses.IsNotEmpty())
  385. {
  386. projects.Add(new ScsProjectDiagnosis { project = ps, diagnoses = teacherDiagnoses[0].abilityNos.ToObject<List<ScPDiagnosis>>() });
  387. }
  388. }
  389. results.Add(result);
  390. }
  391. }
  392. }
  393. //await response.WriteAsJsonAsync(new { data = projects.ToJsonString() });
  394. return (200, projects.ToJsonString());
  395. }
  396. catch (Exception ex)
  397. {
  398. if (config.p.IsNotEmpty())
  399. {
  400. foreach (var ps in config.p)
  401. {
  402. //await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IES5.ScApisService:GetProjectDiagnosis\n{ex.Message}\n{ex.StackTrace}\n{results.ToJsonString()}\n{data}", GroupNames.醍摩豆服務運維群組);
  403. List<ScProjectDiagnosis> teacherDiagnoses = await table.FindListByDict<ScProjectDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScProjectDiagnosis" }, { "RowKey", $"{ps.pid}" } });
  404. if (teacherDiagnoses.IsNotEmpty())
  405. {
  406. projects.Add(new ScsProjectDiagnosis { project = ps, diagnoses = teacherDiagnoses[0].abilityNos.ToObject<List<ScPDiagnosis>>() });
  407. }
  408. }
  409. }
  410. //await response.WriteAsJsonAsync(new { data = projects.ToJsonString() });
  411. return (200, projects.ToJsonString());
  412. }
  413. }
  414. /// <summary>
  415. /// 5.3.1.3通过项目编号获取学员测评能力项V2
  416. /// </summary>
  417. /// <param name="areaId"></param>
  418. /// <param name="accessConfig"></param>
  419. /// <param name="pxid"></param>
  420. /// <param name="schoolCode"></param>
  421. /// <returns></returns>
  422. public async Task<(int state, string json)> GetDiagnosisListByProject_V2(string areaId, string accessConfig, string pxid, string schoolCode)
  423. {
  424. List<string> abilityNos = new();
  425. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  426. ScAccessConfig config = accessConfig.ToObject<JsonElement>().ToObject<ScAccessConfig>();
  427. Code = "GetDiagnosisListByProject_V2";
  428. parameterMap = new Dictionary<string, object>();
  429. parameterMap.Add("TrainComID", config.trainComID);
  430. parameterMap.Add("PXID", pxid);
  431. ScsResult result = new() { bizcode = Code, title = "5.3.1.3通过项目编号获取学员测评能力项V2" };
  432. try
  433. {
  434. result = await ThirdApisService.Post(_httpClient,config.url, Code, config.passKey, config.privateKey, parameterMap);
  435. if (result.result)
  436. {
  437. List<ScDiagnosis> diagnoses = result.content.ToObject<List<ScDiagnosis>>();
  438. if (diagnoses != null)
  439. {
  440. abilityNos = diagnoses.Select(x => x.DiagnosisDicNum).ToList();
  441. }
  442. if (abilityNos.IsNotEmpty())
  443. {
  444. await table.SaveOrUpdate<ScTeacherDiagnosis>(new ScTeacherDiagnosis { areaId = areaId, schoolCode = $"{schoolCode}", RowKey = $"{pxid}", PartitionKey = "ScTeacherDiagnosis", abilityNos = abilityNos.ToJsonString() });
  445. }
  446. }
  447. else
  448. {
  449. List<ScTeacherDiagnosis> teacherDiagnoses = await table.FindListByDict<ScTeacherDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScTeacherDiagnosis" }, { "RowKey", $"{pxid}" } });
  450. if (teacherDiagnoses.IsNotEmpty())
  451. {
  452. abilityNos = teacherDiagnoses[0].abilityNos.ToObject<List<string>>();
  453. }
  454. }
  455. //await response.WriteAsJsonAsync(new { data = abilityNos.ToJsonString() });
  456. return (200, abilityNos.ToJsonString());
  457. }
  458. catch (Exception ex)
  459. {
  460. //await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IES5.ScApisService:getDiagnosisListByProject_V2\n{ex.Message}\n{ex.StackTrace}\n{result.ToJsonString()}\n{data}", GroupNames.醍摩豆服務運維群組);
  461. List<ScTeacherDiagnosis> teacherDiagnoses = await table.FindListByDict<ScTeacherDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScTeacherDiagnosis" }, { "RowKey", $"{pxid}" } });
  462. if (teacherDiagnoses.IsNotEmpty())
  463. {
  464. abilityNos = teacherDiagnoses[0].abilityNos.ToObject<List<string>>();
  465. }
  466. //await response.WriteAsJsonAsync(new { data = abilityNos.ToJsonString() });
  467. return (200, abilityNos.ToJsonString());
  468. }
  469. }
  470. /// <summary>
  471. /// 5.3.1.11获取跳转学员信息,用于sso单点,后端验证。
  472. /// </summary>
  473. /// <param name="areaId"></param>
  474. /// <param name="accessConfig"></param>
  475. /// <param name="pxid"></param>
  476. /// <param name="tid"></param>
  477. /// <returns></returns>
  478. public async Task<(int state, string json)> GetSingleTeacherByProject(string areaId, string accessConfig, string pxid, string tid )
  479. {
  480. string teacher = null;
  481. ScAccessConfig config = accessConfig.ToObject<JsonElement>().ToObject<ScAccessConfig>();
  482. Code = "GetSingleTeacherByProject";
  483. parameterMap = new Dictionary<string, object>();
  484. parameterMap.Add("TrainComID", config.trainComID);
  485. parameterMap.Add("Pxid", $"{pxid}");
  486. parameterMap.Add("Tid", $"{tid}");
  487. ScsResult result = new ScsResult { bizcode = Code, title = "5.3.1.11获取跳转学员信息,用于sso单点,后端验证。" };
  488. try
  489. {
  490. ///{“result”:true,”reason”:null,”content”:”{“PXID”:””,”TID”:””,”TeacherName”:””,”ProjectTitle”:””,”ProjectItemTitle”:””,”CityName”:””,
  491. ///”DisName”:””,”SchoolName”:””,”Sex”:””,”PXXK”:””,”PXXD”:””,”TeacherXK”:””,”TeacherXD”:””,”Email”:””}”,”pagecount”:1}
  492. result = await ThirdApisService.Post(_httpClient,config.url, Code, config.passKey, config.privateKey, parameterMap);
  493. if (result.result)
  494. {
  495. teacher = result.content;
  496. }
  497. //await response.WriteAsJsonAsync(new { data = teacher });
  498. return (200, teacher);
  499. }
  500. catch (Exception ex)
  501. {
  502. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  503. List<ScTeacher> teachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object> { { "PartitionKey", "ScTeacher" }, { "RowKey", $"{pxid}" } });
  504. if (teachers.IsNotEmpty())
  505. {
  506. teacher = teachers[0].ToJsonString();
  507. return (200, teacher);
  508. }
  509. else {
  510. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")},IES5.ScApisService:GetSingleTeacherByProject\n{ex.Message}\n{ex.StackTrace}\n{result.ToJsonString()}\n", GroupNames.醍摩豆服務運維群組);
  511. return (500, teacher);
  512. }
  513. //await response.WriteAsJsonAsync(new { data = teacher });
  514. }
  515. }
  516. /// <summary>
  517. /// 数据推送接口
  518. /// </summary>
  519. /// <param name="areaId"></param>
  520. /// <param name="accessConfig"></param>
  521. /// <param name="school"></param>
  522. /// <param name="pushTeachers"></param>
  523. /// <returns></returns>
  524. public async Task<(int state, string json)> SchoolDataPush(string accessConfig, string school, List<string> pushTeachers)
  525. {
  526. dynamic dynamic = null;
  527. ScAccessConfig config = accessConfig.ToObject<JsonElement>().ToObject<ScAccessConfig>();
  528. StringBuilder queryText = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='yxtrain'");
  529. List<GroupList> yxtrain = new List<GroupList>();
  530. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(queryText: queryText.ToString(),
  531. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList-{school}") }))
  532. {
  533. yxtrain.Add(item);
  534. }
  535. List<TeacherTrain> trains = new List<TeacherTrain>();
  536. var members = yxtrain.SelectMany(x => x.members).ToList();
  537. //指定推送一部分的教师
  538. if (pushTeachers.IsNotEmpty())
  539. {
  540. members = members.FindAll(x => pushTeachers.Contains(x.id));
  541. }
  542. if (members.IsNotEmpty())
  543. {
  544. queryText = new StringBuilder($"SELECT distinct value(c) FROM c where 1=1 and c.id in ({string.Join(",", members.Select(x => $"'{x.id}'"))}) ");
  545. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<TeacherTrain>(queryText: queryText.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"TeacherTrain-{school}") }))
  546. {
  547. trains.Add(item);
  548. }
  549. }
  550. //string sql = $" SELECT value(c) FROM c join a in c.binds where ARRAY_LENGTH(c.binds)>0 and a.type='{config.config}' ";
  551. //List<Teacher> teachers = new List<Teacher>();
  552. //await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Teacher>(queryText: sql,
  553. // requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base") }))
  554. //{
  555. // teachers.Add(item);
  556. //}
  557. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  558. List<ScTeacher> scTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object> { { "PartitionKey", "ScTeacher" }, { "schoolCode", $"{school}" } });
  559. List<ScTeacherDiagnosis> scTeacherDiagnoses = await table.FindListByDict<ScTeacherDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScTeacherDiagnosis" }, { "schoolCode", $"{school}" } });
  560. List<KeyValuePair<TeacherTrain, string>> trainsNO = new List<KeyValuePair<TeacherTrain, string>>();
  561. List<ScsResult> results = new List<ScsResult>();
  562. Dictionary<string, Dictionary<string, object>> pushDatas = new Dictionary<string, Dictionary<string, object>>();
  563. int pages = (trains.Count + 19) / 20; //pages = (total + max -1) / max;
  564. for (int i = 0; i < pages; i++)
  565. {
  566. List<TeacherTrain> lists = trains.Skip((i) * 20).Take(20).ToList();
  567. //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
  568. List<TeacherTrain> trains53112OK = new List<TeacherTrain>();
  569. ScsResult UpdateTeacherListSituation = null;
  570. Dictionary<string, object> parameterContent53112 = new Dictionary<string, object>();
  571. List<Dictionary<string, object>> list53112 = new List<Dictionary<string, object>>();
  572. parameterContent53112.Add("TrainComID", config.trainComID);
  573. parameterContent53112.Add("List", list53112);
  574. //5.3.1.13学员能力点测评结果批量回写-UpdateTeacherListDiagnosis 300条限制
  575. List<TeacherTrain> trains53113OK = new List<TeacherTrain>();
  576. ScsResult UpdateTeacherListDiagnosis = null;
  577. Dictionary<string, object> parameterContent53113 = new Dictionary<string, object>();
  578. List<Dictionary<string, object>> list53113 = new List<Dictionary<string, object>>();
  579. parameterContent53113.Add("TrainComID", config.trainComID);
  580. parameterContent53113.Add("List", list53113);
  581. //5.3.1.17学员课堂实录批量回写-UploadKTSLList 300条限制
  582. List<TeacherTrain> trains53117OK = new List<TeacherTrain>();
  583. ScsResult UploadKTSLList = null;
  584. Dictionary<string, object> parameterContent53117 = new Dictionary<string, object>();
  585. List<Dictionary<string, object>> list53117 = new List<Dictionary<string, object>>();
  586. parameterContent53117.Add("TrainComID", config.trainComID);
  587. parameterContent53117.Add("List", list53117);
  588. //5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写-UploadSBTARPDFListV2 100条限制
  589. List<TeacherTrain> trains53122OK = new List<TeacherTrain>();
  590. ScsResult UploadSBTARPDFListV2 = null;
  591. Dictionary<string, object> parameterContent53122 = new Dictionary<string, object>();
  592. List<Dictionary<string, object>> list53122 = new List<Dictionary<string, object>>();
  593. parameterContent53122.Add("TrainComID", config.trainComID);
  594. parameterContent53122.Add("List", list53122);
  595. //装载数据
  596. foreach (var x in lists)
  597. {
  598. List<CodeValue> msgs = new List<CodeValue>();
  599. List<ScTeacher> teacher = scTeachers.FindAll(t => !string.IsNullOrWhiteSpace(t.tmdid) && t.tmdid.Equals(x.id));
  600. foreach (var t in teacher)
  601. {
  602. List<PushFail> fails = new List<PushFail>();
  603. Dictionary<string, object> pushData = new Dictionary<string, object>();
  604. string json = scTeacherDiagnoses.ToJsonString();
  605. ScTeacherDiagnosis diagnosis = scTeacherDiagnoses.Find(x => x.RowKey.Equals($"{t.PXID}"));
  606. (int t53112OK, List<CodeValue> msgs53112) = check53112(x, msgs);
  607. (int t53113OK, List<CodeValue> msgs53113, List<AbilitySub> abilitySubs) = await check53113(x, diagnosis, msgs);
  608. (int t53117OK, List<CodeValue> msgs53117) = check53117(x, msgs);
  609. (int t53122OK, List<CodeValue> msgs53122) = check53122(x, msgs);
  610. //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
  611. if (t53112OK == 1)
  612. {
  613. Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
  614. parameterMapData.Add("PXID", $"{t.PXID}");
  615. parameterMapData.Add("TID", $"{t.TID}");
  616. parameterMapData.Add("TeacherName", $"{t.TeacherName}");
  617. parameterMapData.Add("CourseHour", $"{x.totalTime}");
  618. parameterMapData.Add("ResearchText", $"{x.summary}");
  619. /// <summary>
  620. ///省上标准 最终结果 0未认定,1合格,2优秀,3不合格,4其他
  621. ///系统标准 -2 其他 -1 未认定,0不合格,1合格,2优秀
  622. /// </summary>
  623. string ComPassed = "0";
  624. switch (x.finalScore)
  625. {
  626. case -2:
  627. ComPassed = "4";
  628. break;
  629. case -1:
  630. ComPassed = "0";
  631. break;
  632. case 0:
  633. ComPassed = "3";
  634. break;
  635. case 1:
  636. ComPassed = "1";
  637. break;
  638. case 2:
  639. ComPassed = "2";
  640. break;
  641. default:
  642. ComPassed = "4";
  643. break;
  644. }
  645. parameterMapData.Add("ComPassed", ComPassed);//0、未认定 1、合格 2、优秀 3、不合格 4、其他
  646. pushData.Add("success-UpdateTeacherListSituation", parameterMapData);
  647. list53112.Add(parameterMapData);
  648. }
  649. else
  650. {
  651. pushData.Add("fail-UpdateTeacherListSituation", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53112 });
  652. fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53112 });
  653. }
  654. //5.3.1.13学员能力点测评结果批量回写-UpdateTeacherListDiagnosis
  655. if (t53113OK == 1)
  656. {
  657. List<Dictionary<string, object>> parameterMapDatas = new List<Dictionary<string, object>>();
  658. x.currency.teacherAilities.ForEach(a => {
  659. Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
  660. parameterMapData.Add("PXID", $"{t.PXID}");
  661. parameterMapData.Add("TID", $"{t.TID}");
  662. parameterMapData.Add("DiagnosisNum", $"{a.no}");
  663. //0"未认定", 1"合格", 2"优秀", 3"不合格"
  664. //系统 -1 未认定,0 不合格,1 合格,2 优秀
  665. string zpscore = "0";
  666. switch (a.zpscore)
  667. {
  668. case -1:
  669. zpscore = "0";
  670. break;
  671. case 0:
  672. zpscore = "3";
  673. break;
  674. case 1:
  675. zpscore = "1";
  676. break;
  677. case 2:
  678. zpscore = "2";
  679. break;
  680. default:
  681. zpscore = "0";
  682. break;
  683. }
  684. string hpscore = "0";
  685. switch (a.hpscore)
  686. {
  687. case -1:
  688. hpscore = "0";
  689. break;
  690. case 0:
  691. hpscore = "3";
  692. break;
  693. case 1:
  694. hpscore = "1";
  695. break;
  696. case 2:
  697. hpscore = "2";
  698. break;
  699. default:
  700. hpscore = "0";
  701. break;
  702. }
  703. string xzpresult = "0";
  704. switch (a.xzscore)
  705. {
  706. case -1:
  707. xzpresult = "0";
  708. break;
  709. case 0:
  710. xzpresult = "3";
  711. break;
  712. case 1:
  713. xzpresult = "1";
  714. break;
  715. case 2:
  716. xzpresult = "2";
  717. break;
  718. default:
  719. xzpresult = "0";
  720. break;
  721. }
  722. parameterMapData.Add("zpresult", zpscore);
  723. parameterMapData.Add("hpresult", hpscore);
  724. parameterMapData.Add("xzpresult", xzpresult);
  725. List<Dictionary<string, object>> pfiles = new List<Dictionary<string, object>>();
  726. parameterMapData.Add("pfiles", pfiles);
  727. AbilitySub abilitySub = abilitySubs.Find(sub => sub.id.Equals(a.id));
  728. if (abilitySub != null)
  729. {
  730. abilitySub.uploads.ForEach(upload => {
  731. upload.urls.ForEach(url => {
  732. Dictionary<string, object> pfileMap = new Dictionary<string, object>();
  733. pfileMap.Add("url", url.url);
  734. pfileMap.Add("fileName", url.name);
  735. pfileMap.Add("fileSize", url.size);
  736. pfileMap.Add("md5", url.hash);
  737. string fileext = url.url.Substring(url.url.LastIndexOf(".") > 0 ? url.url.LastIndexOf(".") + 1 : 0);
  738. pfileMap.Add("fileType", fileext);
  739. pfiles.Add(pfileMap);
  740. });
  741. });
  742. }
  743. list53113.Add(parameterMapData);
  744. parameterMapDatas.Add(parameterMapData);
  745. });
  746. pushData.Add("success-UpdateTeacherListDiagnosis", parameterMapDatas);
  747. }
  748. else
  749. {
  750. pushData.Add("fail-UpdateTeacherListDiagnosis", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53113 });
  751. fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53113 });
  752. }
  753. //5.3.1.17学员课堂实录批量回写-UploadKTSLList
  754. if (t53117OK == 1)
  755. {
  756. List<Dictionary<string, object>> parameterMapDatas = new List<Dictionary<string, object>>();
  757. x.teacherClasses.ForEach(clss =>
  758. {
  759. Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
  760. parameterMapData.Add("PXID", $"{t.PXID}");
  761. parameterMapData.Add("TID", $"{t.TID}");
  762. parameterMapData.Add("url", clss.url);//添加访问授权
  763. parameterMapData.Add("url2", clss.url);
  764. parameterMapData.Add("fileName", clss.name);
  765. parameterMapData.Add("fileSize", clss.size);
  766. parameterMapData.Add("md5", clss.hash);
  767. string fileext = clss.url.Substring(clss.url.LastIndexOf(".") > 0 ? clss.url.LastIndexOf(".") + 1 : 0);
  768. parameterMapData.Add("fileType", fileext);
  769. list53117.Add(parameterMapData);
  770. parameterMapDatas.Add(parameterMapData);
  771. });
  772. pushData.Add("success-UploadKTSLList", parameterMapDatas);
  773. }
  774. else
  775. {
  776. pushData.Add("fail-UploadKTSLList", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53117 });
  777. fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53117 });
  778. }
  779. //5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写-UploadSBTARPDFListV2
  780. if (t53122OK == 1)
  781. {
  782. Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
  783. parameterMapData.Add("PXID", $"{t.PXID}");
  784. parameterMapData.Add("TID", $"{t.TID}");
  785. List<Dictionary<string, object>> files = new List<Dictionary<string, object>>();
  786. x.offlineRecords.ForEach(record => {
  787. if (!string.IsNullOrWhiteSpace(record.url))
  788. {
  789. Dictionary<string, object> fileMap = new Dictionary<string, object>();
  790. fileMap.Add("url", record.url);
  791. fileMap.Add("fileName", record.name);
  792. fileMap.Add("fileSize", record.size);
  793. fileMap.Add("md5", record.hash);
  794. string fileext = record.url.Substring(record.url.LastIndexOf(".") > 0 ? record.url.LastIndexOf(".") + 1 : 0);
  795. fileMap.Add("fileType", fileext);
  796. files.Add(fileMap);
  797. }
  798. });
  799. parameterMapData.Add("files", files);
  800. list53122.Add(parameterMapData);
  801. pushData.Add("success-UploadSBTARPDFListV2", parameterMapData);
  802. }
  803. else
  804. {
  805. pushData.Add("fail-UploadSBTARPDFListV2", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53122 });
  806. fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53122 });
  807. }
  808. pushDatas.Add(t.tmdid, pushData);
  809. }
  810. }
  811. //推送数据
  812. UpdateTeacherListSituation = await ThirdApisService.Post(_httpClient,config.url, "UpdateTeacherListSituation", config.passKey, config.privateKey, parameterContent53112);
  813. UpdateTeacherListSituation.bizcode = "UpdateTeacherListSituation";
  814. UpdateTeacherListSituation.title = "5.3.1.12学员培训基本情况批量回写";
  815. UpdateTeacherListDiagnosis = await ThirdApisService.Post(_httpClient,config.url, "UpdateTeacherListDiagnosis", config.passKey, config.privateKey, parameterContent53113);
  816. UpdateTeacherListDiagnosis.bizcode = "UpdateTeacherListDiagnosis";
  817. UpdateTeacherListDiagnosis.title = "5.3.1.13学员能力点测评结果批量回写";
  818. UploadKTSLList = await ThirdApisService.Post(_httpClient,config.url, "UploadKTSLList", config.passKey, config.privateKey, parameterContent53117);
  819. UploadKTSLList.bizcode = "UploadKTSLList";
  820. UploadKTSLList.title = "5.3.1.17学员课堂实录批量回写";
  821. UploadSBTARPDFListV2 = await ThirdApisService.Post(_httpClient,config.url, "UploadSBTARPDFListV2", config.passKey, config.privateKey, parameterContent53122);
  822. UploadSBTARPDFListV2.bizcode = "UploadSBTARPDFListV2";
  823. UploadSBTARPDFListV2.title = "5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写";
  824. results.Add(UpdateTeacherListSituation);
  825. results.Add(UpdateTeacherListDiagnosis);
  826. results.Add(UploadKTSLList);
  827. results.Add(UploadSBTARPDFListV2);
  828. }
  829. //await response.WriteAsJsonAsync(new { data = new { results, pushDatas } });
  830. dynamic = new { results, pushDatas };
  831. return (200, dynamic.ToJsonString());
  832. }
  833. //5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写-UploadSBTARPDFListV2
  834. public (int t53122OK, List<CodeValue> msgs) check53122(TeacherTrain teacherTrain, List<CodeValue> msgs)
  835. {
  836. int t53122OK = 1;
  837. if (teacherTrain.offlineRecords.Count <= 0)
  838. {
  839. msgs.Add(new CodeValue("offlineRecord-count", $"文件个数为0"));
  840. }
  841. var hasUrl = teacherTrain.offlineRecords.Where(x => !string.IsNullOrWhiteSpace(x.url) && x.size > 0);
  842. if (!hasUrl.Any())
  843. {
  844. msgs.Add(new CodeValue("offlineRecord-url", $"需要上传的校本研修作业至少有一个。"));
  845. }
  846. //不需要检查每一个校本研修的文件记录。
  847. //teacherTrain.offlineRecords.ForEach(x => {
  848. // if (string.IsNullOrEmpty(x.url)) {
  849. // msgs.Add(new CodeValue("offlineRecord-url", $"链接为空"));
  850. // }
  851. // if (x.size<=0)
  852. // {
  853. // msgs.Add(new CodeValue("offlineRecord-size", $"文件大小"));
  854. // }
  855. //});
  856. return (t53122OK, msgs);
  857. }
  858. //5.3.1.17学员课堂实录批量回写-UploadKTSLList
  859. public (int t53117OK, List<CodeValue> msgs) check53117(TeacherTrain teacherTrain, List<CodeValue> msgs)
  860. {
  861. //校验 基本情况是否满足
  862. int t53117OK = 1;
  863. if (teacherTrain.classTime <= 0)
  864. {
  865. msgs.Add(new CodeValue("classTime", $"未获得学时:{teacherTrain.classTime}"));
  866. t53117OK = 0;
  867. }
  868. if (teacherTrain.teacherClasses.Count() <= 0)
  869. {
  870. msgs.Add(new CodeValue("teacherClasses", $"未上传课堂实录:{teacherTrain.teacherClasses.Count()}个视频"));
  871. t53117OK = 0;
  872. }
  873. teacherTrain.teacherClasses.ForEach(x => {
  874. if (string.IsNullOrWhiteSpace(x.url))
  875. {
  876. t53117OK = 0;
  877. msgs.Add(new CodeValue("teacherClasses", $"课堂实录链接无效"));
  878. }
  879. });
  880. return (t53117OK, msgs);
  881. }
  882. //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
  883. public (int t53112OK, List<CodeValue> msgs) check53112(TeacherTrain teacherTrain, List<CodeValue> msgs)
  884. {
  885. //校验 基本情况是否满足
  886. int t53112OK = 1;
  887. if (teacherTrain.finalScore < 0)
  888. {
  889. //总体认定结果0、未认定 1、合格 2、优秀 3、不合格 4、其他
  890. msgs.Add(new CodeValue("finalScore", $"最终评定结果参数:{teacherTrain.finalScore}"));
  891. t53112OK = 0;
  892. }
  893. //if (string.IsNullOrEmpty(teacherTrain.summary) || teacherTrain.summary.Length > 300)
  894. //{
  895. // string msg = string.IsNullOrEmpty(teacherTrain.summary) ? "未填写" : teacherTrain.summary.Length > 300 ? "字数超过300." : "";
  896. // msgs.Add(new CodeValue("summary", $"教师培训总结:{msg}"));
  897. // t53112OK = 0;
  898. //}
  899. if (!string.IsNullOrEmpty(teacherTrain.summary) && teacherTrain.summary.Length > 300)
  900. {
  901. //string msg = string.IsNullOrEmpty(teacherTrain.summary) ? "未填写" : teacherTrain.summary.Length > 300 ? "字数超过300." : "";
  902. msgs.Add(new CodeValue("summary", $"教师培训总结:字数超过300."));
  903. t53112OK = 0;
  904. }
  905. if (teacherTrain.totalTime <= 0)
  906. {
  907. msgs.Add(new CodeValue("totalTime", $"未获得学时:{teacherTrain.totalTime}"));
  908. t53112OK = 0;
  909. }
  910. return (t53112OK, msgs);
  911. }
  912. //5.3.1.13学员能力点测评结果批量回写-UpdateTeacherListDiagnosis
  913. public async Task<(int t53113OK, List<CodeValue> msgs, List<AbilitySub> abilitySubs)> check53113(TeacherTrain teacherTrain, ScTeacherDiagnosis diagnosis, List<CodeValue> msgs)
  914. {
  915. //校验 基本情况是否满足
  916. int t53113OK = 1;
  917. List<AbilitySub> abilitySubs = new List<AbilitySub>();
  918. if (teacherTrain.currency.videoTime < 0)
  919. {
  920. msgs.Add(new CodeValue("videoTime", $"视频学习时长:{teacherTrain.currency.videoTime}"));
  921. t53113OK = 0;
  922. }
  923. if (teacherTrain.currency.submitTime < 0)
  924. {
  925. msgs.Add(new CodeValue("submitTime", $"认证材料学习:{teacherTrain.currency.submitTime}"));
  926. t53113OK = 0;
  927. }
  928. if (teacherTrain.currency.teacherAilities.Count <= 0)
  929. {
  930. msgs.Add(new CodeValue("teacherAilities", $"已学习能力点:0"));
  931. t53113OK = 0;
  932. }
  933. if (diagnosis != null)
  934. {
  935. if (!string.IsNullOrWhiteSpace(diagnosis.abilityNos))
  936. {
  937. List<string> nos = diagnosis.abilityNos.ToObject<List<string>>();
  938. if (nos.Count > 0 && teacherTrain.currency.teacherAilities.Count > 0)
  939. {
  940. var notin = nos.Except(teacherTrain.currency.teacherAilities.Select(x => x.no).Where(z => !string.IsNullOrWhiteSpace(z)));
  941. if (notin.Any())
  942. {
  943. msgs.Add(new CodeValue("diagnosisNos", $"省平台勾选的能力点编号为学习完成:省平台:{string.Join(",", nos.OrderBy(x => x))}" + $" ,已学习:{string.Join(",", teacherTrain.currency.teacherAilities.Select(x => x.no).OrderBy(x => x))} "));
  944. t53113OK = 0;
  945. }
  946. else
  947. {
  948. string insql = "";
  949. if (teacherTrain.currency.teacherAilities.IsNotEmpty())
  950. {
  951. var abilites = teacherTrain.currency.teacherAilities.Where(c => !string.IsNullOrWhiteSpace(c.no) && nos.Contains(c.no));
  952. insql = $" where c.id in ({string.Join(",", abilites.Select(o => $"'{o.id}'"))})";
  953. }
  954. //认证材料
  955. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher")
  956. .GetItemQueryIterator<AbilitySub>(queryText: $"select value(c) from c {insql}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"AbilitySub-{teacherTrain.school}-{teacherTrain.id}") }))
  957. {
  958. abilitySubs.Add(item);
  959. }
  960. teacherTrain.currency.teacherAilities.ForEach(x => {
  961. var abilitySub = abilitySubs.Find(z => z.id.Equals(x.id));
  962. if (abilitySub == null || !abilitySub.uploads.Any())
  963. {
  964. t53113OK = 0;
  965. msgs.Add(new CodeValue("uploads", $"未上传认证材料:{x.no},{x.name}"));
  966. }
  967. if (x.zpscore <= 0)
  968. {
  969. t53113OK = 0;
  970. msgs.Add(new CodeValue("zpscore", $"认证材料,没有完成自评:{x.no},{x.name},{x.zpscore}"));
  971. }
  972. if (x.hpscore <= 0)
  973. {
  974. t53113OK = 0;
  975. msgs.Add(new CodeValue("hpscore", $"认证材料,没有完成互评:{x.no},{x.name},{x.hpscore}"));
  976. }
  977. if (x.xzscore <= 0)
  978. {
  979. t53113OK = 0;
  980. msgs.Add(new CodeValue("xzscore", $"认证材料,没有完成小组评:{x.no},{x.name},{x.xzscore}"));
  981. }
  982. });
  983. if (t53113OK != 1)
  984. {
  985. msgs.Add(new CodeValue("diagnosisNos", $"省平台勾选的能力点编号为学习完成:省平台:{string.Join(",", nos.OrderBy(x => x))}" + $" ,已学习:{string.Join(",", teacherTrain.currency.teacherAilities.Select(x => x.no).OrderBy(x => x))} "));
  986. }
  987. }
  988. }
  989. else
  990. {
  991. msgs.Add(new CodeValue("teacherAilities", $"未同步省平台挑选的能力点"));
  992. t53113OK = 0;
  993. }
  994. }
  995. else
  996. {
  997. msgs.Add(new CodeValue("teacherAilities", $"未同步省平台挑选的能力点"));
  998. t53113OK = 0;
  999. }
  1000. }
  1001. else
  1002. {
  1003. msgs.Add(new CodeValue("teacherAilities", $"未同步省平台挑选的能力点"));
  1004. t53113OK = 0;
  1005. }
  1006. return (t53113OK, msgs, abilitySubs);
  1007. }
  1008. }
  1009. }