ScDataPushController.cs 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383
  1. 
  2. using Microsoft.AspNetCore.Mvc;
  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;
  10. using TEAMModelOS.SDK.Models;
  11. using Microsoft.AspNetCore.Http;
  12. using TEAMModelOS.SDK.Extension;
  13. using Azure.Cosmos;
  14. using System.Text;
  15. using Microsoft.Extensions.Options;
  16. using Microsoft.Extensions.Configuration;
  17. using HTEXLib.COMM.Helpers;
  18. using System.Threading;
  19. using Microsoft.Azure.Cosmos.Table;
  20. using DinkToPdf;
  21. using DinkToPdf.Contracts;
  22. using System.IO;
  23. using Microsoft.AspNetCore.Authorization;
  24. using TEAMModelOS.Filter;
  25. using System.Net.Http;
  26. namespace TEAMModelOS.Controllers
  27. {
  28. [ProducesResponseType(StatusCodes.Status200OK)]
  29. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  30. [ApiController]
  31. [Route("data-push")]
  32. public class ScDataPushController : ControllerBase
  33. {
  34. #region
  35. public readonly string tdhtml = @"
  36. <tr>
  37. <td>{{type}}</td>
  38. <td>{{teacherName}}</td>
  39. <td>{{tmdid}}</td>
  40. <td>{{pxid}}</td>
  41. <td>{{tid}}</td>
  42. <td>{{comPassed}}</td>
  43. <td>{{comPassedTime}}</td>
  44. </tr>
  45. ";
  46. string html = @"
  47. <!DOCTYPE html>
  48. <html>
  49. <head>
  50. <meta charset=""UTF-8"">
  51. <meta http-equiv=""X-UA-Compatible"" content=""IE=edge"">
  52. <meta name=""viewport"" content=""width=device-width, initial-scale=1.0"">
  53. <title>{{projectItemTitle}}推送报告</title>
  54. <style>
  55. body {
  56. font-family: 'fangsong';
  57. display: flex;
  58. flex-direction: column;
  59. align-items: center;
  60. }
  61. .tch-table,
  62. .details-table {
  63. width: 100%;
  64. }
  65. .tch-table table {
  66. width: 100%;
  67. margin: 15px 0;
  68. border: 0;
  69. }
  70. .tch-table th {
  71. background-color: #c5c5c5;
  72. color: #222222;
  73. /* width:33%; */
  74. }
  75. .tch-table,
  76. .tch-table th,
  77. .tch-table td {
  78. font-size: 0.95em;
  79. text-align: center;
  80. padding: 4px;
  81. border-collapse: collapse;
  82. font-weight: bolder;
  83. }
  84. .tch-table th,
  85. .tch-table td {
  86. border-bottom: 1px solid #918b8c;
  87. border-width: 1px 0 1px 0;
  88. }
  89. .tch-table tr {
  90. border: 1px solid #ffffff;
  91. height: 3.2em;
  92. }
  93. .title {
  94. font-weight: bold;
  95. align-self: flex-start;
  96. margin: 30px 5px;
  97. }
  98. .title::before {
  99. content: '';
  100. width: 10px;
  101. height: 10px;
  102. background: #3a3a3a;
  103. display: inline-block;
  104. margin-right: 10px;
  105. }
  106. </style>
  107. </head>
  108. <body>
  109. <h1 style=""text-align:center;font-weight: bold;"">{{projectItemTitle}}推送报告</h1>
  110. <h3 style=""text-align:center;font-weight: bold;"">{{schoolName}}</h3>
  111. <p class=""title"">推送概况</p>
  112. <table class=""tch-table"" id=""tchTable"">
  113. <tr>
  114. <th style=""width:20%;"">学校名称</th>
  115. <th style=""width:20%;"">参训人数</th>
  116. <th style=""width:20%;"">优秀人数</th>
  117. <th style=""width:20%;"">合格人数</th>
  118. <th style=""width:20%;"">异常人数</th>
  119. </tr>
  120. <tr>
  121. <td>{{schoolName}}</td>
  122. <td>{{joinCount}}</td>
  123. <td>{{yxCount}}</td>
  124. <td>{{hgCount}}</td>
  125. <td>{{ycCount}}</td>
  126. </tr>
  127. </table>
  128. <p class=""title"">异常名单</p>
  129. <table class=""tch-table"" id=""acTable"">
  130. <tr>
  131. <th style=""width:10%;"">类型</th>
  132. <th style=""width:10%;"">姓名</th>
  133. <th style=""width:10%;"">id</th>
  134. <th style=""width:10%;"">省平台培训ID</th>
  135. <th style=""width:10%;"">省平台培训教师ID</th>
  136. <th style=""width:10%;"">状态</th>
  137. <th style=""width:20%;"">推送时间</th>
  138. </tr>
  139. {{eachData}}
  140. </table>
  141. </body>
  142. </html>
  143. ";
  144. #endregion
  145. private readonly AzureCosmosFactory _azureCosmos;
  146. private readonly AzureStorageFactory _azureStorage;
  147. private readonly IConverter _converter;
  148. public readonly string type = "scsyxpt";
  149. public readonly IHttpClientFactory _httpClient;
  150. public IConfiguration _configuration { get; set; }
  151. public ScDataPushController(IHttpClientFactory httpClient,IConverter converter, AzureCosmosFactory azureCosmos, AzureStorageFactory azureStorage, IConfiguration configuration)
  152. {
  153. _azureCosmos = azureCosmos;
  154. _azureStorage = azureStorage;
  155. _converter = converter;
  156. _configuration = configuration;
  157. _httpClient = httpClient;
  158. }
  159. [ProducesDefaultResponseType]
  160. [HttpPost("push-leave")]
  161. public async Task<IActionResult> PushLeave(JsonElement json) {
  162. var client = _azureCosmos.GetCosmosClient();
  163. JsonElement areaIdJson = json.GetProperty("areaId");
  164. // JsonElement school = json.GetProperty("school");
  165. Dictionary<string, Dictionary<string, object>> pushDatas = new Dictionary<string, Dictionary<string, object>>();
  166. List<string> pushTeachers = json.GetProperty("leaveTeacher").ToObject<List<string>>();
  167. List<string> pushPxids = json.GetProperty("pushPxids").ToObject<List<string>>();
  168. AreaSetting areaSetting = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<AreaSetting>($"{areaIdJson}", new PartitionKey("AreaSetting"));
  169. ScAccessConfig config = areaSetting.accessConfig.ToObject<ScAccessConfig>();
  170. Dictionary<string, dynamic> checkDatas = new Dictionary<string, dynamic>();
  171. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  172. List<ScTeacher> scTeachers = new List<ScTeacher>();
  173. List<string> Codes = new List<string>();
  174. if (pushTeachers.IsNotEmpty())
  175. {
  176. pushTeachers.ForEach(tch => {
  177. Codes.Add($" tmdid {QueryComparisons.Equal} '{tch}' ");
  178. });
  179. }
  180. if (pushPxids.IsNotEmpty())
  181. {
  182. pushPxids.ForEach(pxid => {
  183. Codes.Add($"RowKey {QueryComparisons.Equal} '{pxid}' ");
  184. });
  185. }
  186. string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'ScTeacher' and areaId {QueryComparisons.Equal} '{areaIdJson}' and ( {string.Join(" or ", Codes)} ) ";
  187. var result = await table.ExecuteQuerySegmentedAsync(new TableQuery<ScTeacher>().Where(tbqurey), null);
  188. scTeachers = result.Results;
  189. var aaaa =pushTeachers.Except(scTeachers.Select(x => x.tmdid));
  190. HashSet<TeacherTrain> updatePush = new HashSet<TeacherTrain>();
  191. //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
  192. List<TeacherTrain> trains53112OK = new List<TeacherTrain>();
  193. Dictionary<string, object> parameterContent53112 = new Dictionary<string, object>();
  194. List<Dictionary<string, object>> list53112 = new List<Dictionary<string, object>>();
  195. parameterContent53112.Add("TrainComID", config.trainComID);
  196. parameterContent53112.Add("List", list53112);
  197. foreach (var t in scTeachers) {
  198. Dictionary<string, object> pushData = new Dictionary<string, object>();
  199. Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
  200. parameterMapData.Add("PXID", $"{t.PXID}");
  201. parameterMapData.Add("TID", $"{t.TID}");
  202. parameterMapData.Add("TeacherName", $"{t.TeacherName}");
  203. parameterMapData.Add("CourseHour", $"0");
  204. parameterMapData.Add("ResearchText","");
  205. /// <summary>
  206. ///省上标准 最终结果 0未认定,1合格,2优秀,3不合格,4其他
  207. ///系统标准 -2 其他 -1 未认定,0不合格,1合格,2优秀
  208. /// </summary>
  209. string ComPassed = "3";
  210. parameterMapData.Add("ComPassed", ComPassed);//0、未认定 1、合格 2、优秀 3、不合格 4、其他
  211. pushData.Add("success-UpdateTeacherListSituation", parameterMapData);
  212. list53112.Add(parameterMapData);
  213. if (!string.IsNullOrWhiteSpace(t.tmdid)) {
  214. TeacherTrain teacherTrain= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS,Constant.Teacher).ReadItemAsync<TeacherTrain>(t.tmdid,new PartitionKey($"TeacherTrain-{t.schoolCode}"));
  215. teacherTrain.pushes.Add("53112");
  216. teacherTrain.pushes.Add("53113");
  217. teacherTrain.pushes.Add("53117");
  218. teacherTrain.pushes.Add("53122");
  219. trains53112OK.Add(teacherTrain);
  220. }
  221. }
  222. ScsResult UpdateTeacherListSituation = null;
  223. if (list53112.IsNotEmpty())
  224. {
  225. UpdateTeacherListSituation = await ThirdApisService.Post(_httpClient,config.url, "UpdateTeacherListSituation", config.passKey, config.privateKey, parameterContent53112);
  226. UpdateTeacherListSituation.bizcode = "UpdateTeacherListSituation";
  227. UpdateTeacherListSituation.title = "5.3.1.12学员培训基本情况批量回写";
  228. if (UpdateTeacherListSituation.result) {
  229. foreach (var teacherTrain in trains53112OK)
  230. {
  231. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReplaceItemAsync(teacherTrain, teacherTrain.id, new PartitionKey(teacherTrain.code));
  232. }
  233. }
  234. }
  235. return Ok(new { UpdateTeacherListSituation, aaaa });
  236. }
  237. [ProducesDefaultResponseType]
  238. [HttpPost("push-check")]
  239. public async Task<IActionResult> PushCheck(JsonElement json) {
  240. var client = _azureCosmos.GetCosmosClient();
  241. JsonElement areaIdJson = json.GetProperty("areaId");
  242. // JsonElement school = json.GetProperty("school");
  243. JsonElement schoolsJson = json.GetProperty("schools");
  244. Dictionary<string, Dictionary<string, object>> pushDatas = new Dictionary<string, Dictionary<string, object>>();
  245. List<string> pushTeachers = json.GetProperty("pushTeachers").ToObject<List<string>>();
  246. AreaSetting areaSetting = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<AreaSetting>($"{areaIdJson}", new PartitionKey("AreaSetting"));
  247. ScAccessConfig config = areaSetting.accessConfig.ToObject<ScAccessConfig>();
  248. Dictionary<string, dynamic> checkDatas = new Dictionary<string, dynamic>();
  249. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  250. List<ScTeacher> scTeachers = new List<ScTeacher>();
  251. List<ScTeacherDiagnosis> scTeacherDiagnoses = new List<ScTeacherDiagnosis>();
  252. if (pushTeachers.IsNotEmpty())
  253. {
  254. List<string> Codes = new List<string>();
  255. pushTeachers.ForEach(tch => {
  256. Codes.Add($" tmdid {QueryComparisons.Equal} '{tch}' ");
  257. });
  258. string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'ScTeacher' and areaId {QueryComparisons.Equal} '{areaIdJson}' and ( {string.Join(" or ", Codes)} ) ";
  259. var result = await table.ExecuteQuerySegmentedAsync(new TableQuery<ScTeacher>().Where(tbqurey), null);
  260. scTeachers = result.Results;
  261. List<string> Pxids = new List<string>();
  262. scTeachers.ForEach(tch => {
  263. Pxids.Add($" RowKey {QueryComparisons.Equal} '{tch.PXID}' ");
  264. });
  265. string ditbqurey = $"PartitionKey {QueryComparisons.Equal} 'ScTeacherDiagnosis' and areaId {QueryComparisons.Equal} '{areaIdJson}' and ( {string.Join(" or ", Pxids)} ) ";
  266. var diresult = await table.ExecuteQuerySegmentedAsync(new TableQuery<ScTeacherDiagnosis>().Where(ditbqurey), null);
  267. scTeacherDiagnoses = diresult.Results;
  268. }
  269. else
  270. {
  271. scTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object> { { "PartitionKey", "ScTeacher" }, { "areaId", $"{areaIdJson}" } });
  272. scTeacherDiagnoses = await table.FindListByDict<ScTeacherDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScTeacherDiagnosis" }, { "areaId", $"{areaIdJson}" } });
  273. }
  274. var teammodelossas = _azureStorage.GetBlobContainerSAS99Year("teammodelos", Azure.Storage.Sas.BlobContainerSasPermissions.Read);
  275. List<PushFail> failse = new List<PushFail>();
  276. List<string> schools = schoolsJson.ToObject<List<string>>();
  277. foreach (var school in schools)
  278. {
  279. StringBuilder queryText = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='yxtrain'");
  280. List<GroupList> yxtrain = new List<GroupList>();
  281. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(queryText: queryText.ToString(),
  282. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList-{school}") }))
  283. {
  284. yxtrain.Add(item);
  285. }
  286. List<TeacherTrain> trains = new List<TeacherTrain>();
  287. var members = yxtrain.SelectMany(x => x.members).ToList();
  288. //指定推送一部分的教师
  289. if (pushTeachers.IsNotEmpty())
  290. {
  291. members = members.FindAll(x => pushTeachers.Contains(x.id));
  292. }
  293. if (members.IsNotEmpty())
  294. {
  295. queryText = new StringBuilder($"SELECT distinct value(c) FROM c where 1=1 " +
  296. $"and c.id in ({string.Join(",", members.Select(x => $"'{x.id}'"))}) ");
  297. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<TeacherTrain>(queryText: queryText.ToString(),
  298. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"TeacherTrain-{school}") }))
  299. {
  300. trains.Add(item);
  301. }
  302. }
  303. int pages = (trains.Count + 99) / 100; //pages = (total + max -1) / max;
  304. var schoolsas = _azureStorage.GetBlobContainerSAS99Year($"{school}", Azure.Storage.Sas.BlobContainerSasPermissions.Read);
  305. HashSet<TeacherTrain> updatePush = new HashSet<TeacherTrain>();
  306. for (int i = 0; i < pages; i++)
  307. {
  308. List<TeacherTrain> lists = trains.Skip((i) * 50).Take(50).ToList();
  309. //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
  310. List<TeacherTrain> trains53112OK = new List<TeacherTrain>();
  311. Dictionary<string, object> parameterContent53112 = new Dictionary<string, object>();
  312. List<Dictionary<string, object>> list53112 = new List<Dictionary<string, object>>();
  313. parameterContent53112.Add("TrainComID", config.trainComID);
  314. parameterContent53112.Add("List", list53112);
  315. //5.3.1.13学员能力点测评结果批量回写-UpdateTeacherListDiagnosis 300条限制
  316. List<TeacherTrain> trains53113OK = new List<TeacherTrain>();
  317. Dictionary<string, object> parameterContent53113 = new Dictionary<string, object>();
  318. List<Dictionary<string, object>> list53113 = new List<Dictionary<string, object>>();
  319. parameterContent53113.Add("TrainComID", config.trainComID);
  320. parameterContent53113.Add("List", list53113);
  321. //5.3.1.17学员课堂实录批量回写-UploadKTSLList 300条限制
  322. List<TeacherTrain> trains53117OK = new List<TeacherTrain>();
  323. Dictionary<string, object> parameterContent53117 = new Dictionary<string, object>();
  324. List<Dictionary<string, object>> list53117 = new List<Dictionary<string, object>>();
  325. parameterContent53117.Add("TrainComID", config.trainComID);
  326. parameterContent53117.Add("List", list53117);
  327. //5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写-UploadSBTARPDFListV2 100条限制
  328. List<TeacherTrain> trains53122OK = new List<TeacherTrain>();
  329. Dictionary<string, object> parameterContent53122 = new Dictionary<string, object>();
  330. List<Dictionary<string, object>> list53122 = new List<Dictionary<string, object>>();
  331. parameterContent53122.Add("TrainComID", config.trainComID);
  332. parameterContent53122.Add("List", list53122);
  333. //装载数据
  334. List<Task> tasks = new List<Task>();
  335. lists.ForEach(x =>
  336. {
  337. tasks.Add(CheckTeacher(x, scTeachers, scTeacherDiagnoses, $"{school}", schoolsas, list53112, list53113, list53117, list53122, teammodelossas, pushDatas, failse, updatePush));
  338. });
  339. await Task.WhenAll(tasks);
  340. //推送数据
  341. }
  342. pushDatas.Keys.ToList().ForEach(x => {
  343. if (pushDatas[x].Keys.Any())
  344. {
  345. Dictionary<string, dynamic> dict = new Dictionary<string, dynamic>();
  346. dict.Add($"tmdid", x);
  347. List<string> types = new List<string>();
  348. pushDatas[x].Keys.ToList().ForEach(y => {
  349. if (y.Contains("fail-"))
  350. {
  351. types.Add(y);
  352. }
  353. });
  354. dict.Add($"msg", pushDatas[x][pushDatas[x].Keys.First()]);
  355. dict.Add($"types", types);
  356. if (types.Any())
  357. {
  358. checkDatas[x] = dict;
  359. }
  360. }
  361. });
  362. }
  363. List<PushFail> fails = new List<PushFail>();
  364. failse.ForEach(x =>
  365. {
  366. if (x != null && !string.IsNullOrWhiteSpace(x.tmdid)) {
  367. var f = fails.FindAll(y => y.tmdid.Equals(x.tmdid));
  368. if (f.IsNotEmpty())
  369. {
  370. f.ForEach(ff => {
  371. ff.type = $"{ff.type},{x.type}";
  372. });
  373. }
  374. else
  375. {
  376. x.msgs.ForEach(msg =>
  377. {
  378. fails.Add(new PushFail { tmdid = x.tmdid, name = x.name, school = x.school, schoolname = x.schoolname, code = msg.code, msg = msg.value, type = x.type });
  379. });
  380. }
  381. }
  382. });
  383. return Ok(new { data = new { fails } });
  384. }
  385. [ProducesDefaultResponseType]
  386. [HttpPost("push-self")]
  387. [Authorize(Roles = "IES")]
  388. [AuthToken(Roles = "teacher,admin,student", Permissions = "knowledge-read,knowledge-upd")]
  389. public async Task<IActionResult> PushSelf(JsonElement json) {
  390. var (userid, _, _, school) = HttpContext.GetAuthTokenInfo();
  391. List<string> schools =new List<string> { school};
  392. List<string> pushTeachers = new List<string> { userid};
  393. School schoolData =await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  394. (List<ScsResult> results, List<PushFail> fails, List<Dictionary<string, object>> dicts) = await PushData(schoolData.areaId, schools, pushTeachers);
  395. (List<dynamic> ycd, List<dynamic> okd, List<TeacherSc> teachers, List<PushData> datas) = await CheckScPush(pushTeachers, schoolData.areaId, schools);
  396. return Ok(new { results, fails, dicts, ycd, okd, teachers, datas });
  397. }
  398. [ProducesDefaultResponseType]
  399. [HttpPost("push")]
  400. public async Task<IActionResult> Push(JsonElement json) {
  401. string areaIdJson = $"{json.GetProperty("areaId")}";
  402. List<string> schools = json.GetProperty("schools").ToObject<List<string>>();
  403. List<string> pushTeachers = json.GetProperty("pushTeachers").ToObject<List<string>>();
  404. (List<ScsResult> results, List<PushFail> fails, List<Dictionary<string, object>> dicts)= await PushData(areaIdJson, schools, pushTeachers);
  405. return Ok(new { data = new { results, fails, dicts } });
  406. }
  407. private async Task<(List<ScsResult> results, List<PushFail> fails, List<Dictionary<string, object>> dicts)> PushData(string areaIdJson, List<string> schools, List<string> pushTeachers) {
  408. var client = _azureCosmos.GetCosmosClient();
  409. Dictionary<string, Dictionary<string, object>> pushDatas = new Dictionary<string, Dictionary<string, object>>();
  410. List<Dictionary<string, object>> dicts = new List<Dictionary<string, object>>();
  411. List<ScsResult> results = new List<ScsResult>();
  412. AreaSetting areaSetting = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<AreaSetting>($"{areaIdJson}", new PartitionKey("AreaSetting"));
  413. ScAccessConfig config = areaSetting.accessConfig.ToObject<ScAccessConfig>();
  414. Dictionary<string, dynamic> checkDatas = new Dictionary<string, dynamic>();
  415. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  416. List<ScTeacher> scTeachers = new List<ScTeacher>();
  417. List<ScTeacherDiagnosis> scTeacherDiagnoses = new List<ScTeacherDiagnosis>();
  418. if (pushTeachers.IsNotEmpty())
  419. {
  420. List<string> Codes = new List<string>();
  421. pushTeachers.ForEach(tch => {
  422. Codes.Add($" tmdid {QueryComparisons.Equal} '{tch}' ");
  423. });
  424. StringBuilder queryText = new StringBuilder($"SELECT distinct value(c) FROM c where c.pk='TeacherTrain' and c.id in ({string.Join(",", pushTeachers.Select(z => $"'{z}'"))})");
  425. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetItemQueryIterator<TeacherTrain>(queryText: queryText.ToString(),
  426. requestOptions: new QueryRequestOptions() { }))
  427. {
  428. item.pushes = new HashSet<string>();
  429. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReplaceItemAsync(item, item.id, new PartitionKey(item.code));
  430. }
  431. string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'ScTeacher' and areaId {QueryComparisons.Equal} '{areaIdJson}' and ( {string.Join(" or ", Codes)} ) ";
  432. var result = await table.ExecuteQuerySegmentedAsync(new TableQuery<ScTeacher>().Where(tbqurey), null);
  433. scTeachers = result.Results;
  434. List<string> Pxids = new List<string>();
  435. scTeachers.ForEach(tch => {
  436. Pxids.Add($" RowKey {QueryComparisons.Equal} '{tch.PXID}' ");
  437. });
  438. string ditbqurey = $"PartitionKey {QueryComparisons.Equal} 'ScTeacherDiagnosis' and areaId {QueryComparisons.Equal} '{areaIdJson}' and ( {string.Join(" or ", Pxids)} ) ";
  439. var diresult = await table.ExecuteQuerySegmentedAsync(new TableQuery<ScTeacherDiagnosis>().Where(ditbqurey), null);
  440. scTeacherDiagnoses = diresult.Results;
  441. }
  442. else
  443. {
  444. scTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object> { { "PartitionKey", "ScTeacher" }, { "areaId", $"{areaIdJson}" } });
  445. scTeacherDiagnoses = await table.FindListByDict<ScTeacherDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScTeacherDiagnosis" }, { "areaId", $"{areaIdJson}" } });
  446. }
  447. var teammodelossas = _azureStorage.GetBlobContainerSAS99Year("teammodelos", Azure.Storage.Sas.BlobContainerSasPermissions.Read);
  448. List<PushFail> failse = new List<PushFail>();
  449. foreach (var school in schools)
  450. {
  451. StringBuilder queryText = new StringBuilder($"SELECT distinct value(c) FROM c where c.type='yxtrain'");
  452. List<GroupList> yxtrain = new List<GroupList>();
  453. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<GroupList>(queryText: queryText.ToString(),
  454. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"GroupList-{school}") }))
  455. {
  456. yxtrain.Add(item);
  457. }
  458. List<TeacherTrain> trains = new List<TeacherTrain>();
  459. var members = yxtrain.SelectMany(x => x.members).ToList();
  460. //指定推送一部分的教师
  461. if (pushTeachers.IsNotEmpty())
  462. {
  463. members = members.FindAll(x => pushTeachers.Contains(x.id));
  464. }
  465. if (members.IsNotEmpty())
  466. {
  467. queryText = new StringBuilder($"SELECT distinct value(c) FROM c where 1=1 " +
  468. $"and c.id in ({string.Join(",", members.Select(x => $"'{x.id}'"))}) ");
  469. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<TeacherTrain>(queryText: queryText.ToString(),
  470. requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"TeacherTrain-{school}") }))
  471. {
  472. trains.Add(item);
  473. }
  474. }
  475. int pages = (trains.Count + 49) / 50; //pages = (total + max -1) / max;
  476. var schoolsas = _azureStorage.GetBlobContainerSAS99Year($"{school}", Azure.Storage.Sas.BlobContainerSasPermissions.Read);
  477. HashSet<TeacherTrain> updatePush = new HashSet<TeacherTrain>();
  478. for (int i = 0; i < pages; i++)
  479. {
  480. List<TeacherTrain> lists = trains.Skip((i) * 50).Take(50).ToList();
  481. //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
  482. List<TeacherTrain> trains53112OK = new List<TeacherTrain>();
  483. ScsResult UpdateTeacherListSituation = null;
  484. Dictionary<string, object> parameterContent53112 = new Dictionary<string, object>();
  485. List<Dictionary<string, object>> list53112 = new List<Dictionary<string, object>>();
  486. parameterContent53112.Add("TrainComID", config.trainComID);
  487. parameterContent53112.Add("List", list53112);
  488. //5.3.1.13学员能力点测评结果批量回写-UpdateTeacherListDiagnosis 300条限制
  489. List<TeacherTrain> trains53113OK = new List<TeacherTrain>();
  490. ScsResult UpdateTeacherListDiagnosis = null;
  491. Dictionary<string, object> parameterContent53113 = new Dictionary<string, object>();
  492. List<Dictionary<string, object>> list53113 = new List<Dictionary<string, object>>();
  493. parameterContent53113.Add("TrainComID", config.trainComID);
  494. parameterContent53113.Add("List", list53113);
  495. //5.3.1.17学员课堂实录批量回写-UploadKTSLList 300条限制
  496. List<TeacherTrain> trains53117OK = new List<TeacherTrain>();
  497. ScsResult UploadKTSLList = null;
  498. Dictionary<string, object> parameterContent53117 = new Dictionary<string, object>();
  499. List<Dictionary<string, object>> list53117 = new List<Dictionary<string, object>>();
  500. parameterContent53117.Add("TrainComID", config.trainComID);
  501. parameterContent53117.Add("List", list53117);
  502. //5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写-UploadSBTARPDFListV2 100条限制
  503. List<TeacherTrain> trains53122OK = new List<TeacherTrain>();
  504. ScsResult UploadSBTARPDFListV2 = null;
  505. Dictionary<string, object> parameterContent53122 = new Dictionary<string, object>();
  506. List<Dictionary<string, object>> list53122 = new List<Dictionary<string, object>>();
  507. parameterContent53122.Add("TrainComID", config.trainComID);
  508. parameterContent53122.Add("List", list53122);
  509. //装载数据
  510. List<Task> tasks = new List<Task>();
  511. lists.ForEach(x =>
  512. {
  513. tasks.Add(CheckTeacher(x, scTeachers, scTeacherDiagnoses, $"{school}", schoolsas, list53112, list53113, list53117, list53122, teammodelossas, pushDatas, failse, updatePush));
  514. });
  515. await Task.WhenAll(tasks);
  516. //推送数据
  517. if (list53112.IsNotEmpty())
  518. {
  519. //Thread.Sleep(10 * 1000);
  520. dicts.Add(parameterContent53112);
  521. UpdateTeacherListSituation = await ThirdApisService.Post(_httpClient,config.url, "UpdateTeacherListSituation", config.passKey, config.privateKey, parameterContent53112);
  522. UpdateTeacherListSituation.bizcode = "UpdateTeacherListSituation";
  523. UpdateTeacherListSituation.title = "5.3.1.12学员培训基本情况批量回写";
  524. results.Add(UpdateTeacherListSituation);
  525. }
  526. if (list53113.IsNotEmpty())
  527. {
  528. //Thread.Sleep(10 * 1000);
  529. dicts.Add(parameterContent53113);
  530. UpdateTeacherListDiagnosis = await ThirdApisService.Post(_httpClient,config.url, "UpdateTeacherListDiagnosis", config.passKey, config.privateKey, parameterContent53113);
  531. UpdateTeacherListDiagnosis.bizcode = "UpdateTeacherListDiagnosis";
  532. UpdateTeacherListDiagnosis.title = "5.3.1.13学员能力点测评结果批量回写";
  533. results.Add(UpdateTeacherListDiagnosis);
  534. }
  535. if (list53117.IsNotEmpty())
  536. {
  537. //Thread.Sleep(10 * 1000 );
  538. dicts.Add(parameterContent53117);
  539. UploadKTSLList = await ThirdApisService.Post(_httpClient,config.url, "UploadKTSLList", config.passKey, config.privateKey, parameterContent53117);
  540. UploadKTSLList.bizcode = "UploadKTSLList";
  541. UploadKTSLList.title = "5.3.1.17学员课堂实录批量回写";
  542. results.Add(UploadKTSLList);
  543. }
  544. if (list53122.IsNotEmpty())
  545. {
  546. //Thread.Sleep(10 * 1000 );
  547. dicts.Add(parameterContent53122);
  548. UploadSBTARPDFListV2 = await ThirdApisService.Post(_httpClient,config.url, "UploadSBTARPDFListV2", config.passKey, config.privateKey, parameterContent53122);
  549. UploadSBTARPDFListV2.bizcode = "UploadSBTARPDFListV2";
  550. UploadSBTARPDFListV2.title = "5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写";
  551. results.Add(UploadSBTARPDFListV2);
  552. }
  553. }
  554. List<Task<ItemResponse<TeacherTrain>>> tas = new List<Task<ItemResponse<TeacherTrain>>>();
  555. updatePush.ToList().ForEach(x =>
  556. {
  557. tas.Add(client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReplaceItemAsync(x, x.id, new PartitionKey(x.code)));
  558. });
  559. await Task.WhenAll(tas);
  560. pushDatas.Keys.ToList().ForEach(x => {
  561. if (pushDatas[x].Keys.Any())
  562. {
  563. Dictionary<string, dynamic> dict = new Dictionary<string, dynamic>();
  564. dict.Add($"tmdid", x);
  565. List<string> types = new List<string>();
  566. pushDatas[x].Keys.ToList().ForEach(y => {
  567. if (y.Contains("fail-"))
  568. {
  569. types.Add(y);
  570. }
  571. });
  572. dict.Add($"msg", pushDatas[x][pushDatas[x].Keys.First()]);
  573. dict.Add($"types", types);
  574. if (types.Any())
  575. {
  576. checkDatas[x] = dict;
  577. }
  578. }
  579. });
  580. }
  581. List<PushFail> fails = new List<PushFail>();
  582. failse.ForEach(x =>
  583. {
  584. var f = fails.FindAll(y => y.tmdid.Equals(x.tmdid));
  585. if (f.IsNotEmpty())
  586. {
  587. f.ForEach(ff => {
  588. ff.type = $"{ff.type},{x.type}";
  589. });
  590. }
  591. else
  592. {
  593. x.msgs.ForEach(msg =>
  594. {
  595. fails.Add(new PushFail { tmdid = x.tmdid, name = x.name, school = x.school, schoolname = x.schoolname, code = msg.code, msg = msg.value, type = x.type });
  596. });
  597. }
  598. });
  599. return (results, fails, dicts);
  600. }
  601. private async Task CheckTeacher(TeacherTrain x, List<ScTeacher> scTeachers, List<ScTeacherDiagnosis> scTeacherDiagnoses, string school,(string uri ,string sas) schoolsas,
  602. List<Dictionary<string, object>> list53112, List<Dictionary<string, object>> list53113, List<Dictionary<string, object>> list53117, List<Dictionary<string, object>> list53122,
  603. (string uri, string sas ) teammodelossas, Dictionary<string, Dictionary<string, object>> pushDatas, List<PushFail> failse, HashSet<TeacherTrain> updatePush
  604. )
  605. {
  606. List<CodeValue> msgs = new List<CodeValue>();
  607. List<ScTeacher> teacher = scTeachers.FindAll(t => !string.IsNullOrWhiteSpace(t.tmdid) && t.tmdid.Equals(x.id));
  608. foreach (var t in teacher)
  609. {
  610. List<PushFail> fails = new List<PushFail>();
  611. Dictionary<string, object> pushData = new Dictionary<string, object>();
  612. string jsonTech = scTeacherDiagnoses.ToJsonString();
  613. ScTeacherDiagnosis diagnosis = scTeacherDiagnoses.Find(x => x.RowKey.Equals($"{t.PXID}"));
  614. ///检查是否全部已经上传
  615. bool pushAll = true;
  616. int t53112OK = 1, t53113OK=1, t53117OK=1 , t53122OK=1 ;
  617. List<CodeValue> msgs53112 = null;
  618. List<CodeValue> msgs53113 = null;
  619. List<CodeValue> msgs53117 = null;
  620. List<CodeValue> msgs53122 = null;
  621. List<OfflineRecord> allRightOfflineRecords = new List<OfflineRecord>();
  622. List<AbilitySub> allRightAbility = new List<AbilitySub>();
  623. List<AbilitySub> abilitySubs = new List<AbilitySub>();
  624. if (!x.pushes.Contains("53112")) {
  625. pushAll = false;
  626. (t53112OK, msgs53112) = ThirdService.check53112(x, msgs);
  627. }
  628. if (!x.pushes.Contains("53113")) {
  629. pushAll = false;
  630. (t53113OK, msgs53113, abilitySubs, allRightAbility) = await ThirdService.check53113(_azureCosmos, x, diagnosis, msgs, $"{school}", schoolsas.uri, schoolsas.sas, _azureStorage);
  631. }
  632. if (!x.pushes.Contains("53117"))
  633. {
  634. pushAll = false;
  635. (t53117OK, msgs53117) = await ThirdService.check53117(x, msgs, $"{school}", schoolsas.uri, schoolsas.sas, _azureStorage);
  636. }
  637. if (!x.pushes.Contains("53122"))
  638. {
  639. pushAll = false;
  640. (t53122OK, msgs53122, allRightOfflineRecords) = await ThirdService.check53122(x, msgs, $"{school}", schoolsas.uri, schoolsas.sas, _azureStorage);
  641. }
  642. if (pushAll== false && t53112OK == 1 && t53113OK == 1 && t53117OK == 1 && t53122OK == 1)
  643. {
  644. //5.3.1.12学员培训基本情况批量回写-UpdateTeacherListSituation
  645. if (t53112OK == 1)
  646. {
  647. Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
  648. parameterMapData.Add("PXID", $"{t.PXID}");
  649. parameterMapData.Add("TID", $"{t.TID}");
  650. parameterMapData.Add("TeacherName", $"{t.TeacherName}");
  651. parameterMapData.Add("CourseHour", $"{x.totalTime}");
  652. parameterMapData.Add("ResearchText", $"{x.summary}");
  653. /// <summary>
  654. ///省上标准 最终结果 0未认定,1合格,2优秀,3不合格,4其他
  655. ///系统标准 -2 其他 -1 未认定,0不合格,1合格,2优秀
  656. /// </summary>
  657. string ComPassed = "0";
  658. switch (x.finalScore)
  659. {
  660. case -2:
  661. ComPassed = "4";
  662. break;
  663. case -1:
  664. ComPassed = "0";
  665. break;
  666. case 0:
  667. ComPassed = "3";
  668. break;
  669. case 1:
  670. ComPassed = "1";
  671. break;
  672. case 2:
  673. ComPassed = "2";
  674. break;
  675. default:
  676. ComPassed = "4";
  677. break;
  678. }
  679. parameterMapData.Add("ComPassed", ComPassed);//0、未认定 1、合格 2、优秀 3、不合格 4、其他
  680. pushData.Add("success-UpdateTeacherListSituation", parameterMapData);
  681. x.pushes.Add("53112");
  682. updatePush.Add(x);
  683. list53112.Add(parameterMapData);
  684. }
  685. //5.3.1.13学员能力点测评结果批量回写-UpdateTeacherListDiagnosis
  686. if (t53113OK == 1)
  687. {
  688. List<Dictionary<string, object>> parameterMapDatas = new List<Dictionary<string, object>>();
  689. var uploadedAbility = abilitySubs.FindAll(ab => ab.uploads.Count > 0);
  690. x.currency.teacherAilities.ForEach(a =>
  691. {
  692. Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
  693. parameterMapData.Add("PXID", $"{t.PXID}");
  694. parameterMapData.Add("TID", $"{t.TID}");
  695. parameterMapData.Add("DiagnosisNum", $"{a.no}");
  696. List<Dictionary<string, object>> pfiles = new List<Dictionary<string, object>>();
  697. parameterMapData.Add("pfiles", pfiles);
  698. AbilitySub allRight = allRightAbility.Find(sub => sub.id.Equals(a.id));
  699. if (allRight != null)
  700. {
  701. allRight.uploads.ForEach(upload =>
  702. {
  703. upload.urls.ForEach(url =>
  704. {
  705. Dictionary<string, object> pfileMap = new Dictionary<string, object>();
  706. string fileext = url.url.Substring(url.url.LastIndexOf(".") > 0 ? url.url.LastIndexOf(".") + 1 : 0);
  707. pfileMap.Add("url", $"{url.url}?{schoolsas.sas}");
  708. pfileMap.Add("fileName", url.name.Length > 95 ? $"{url.name.Substring(0, 95)}.{fileext}" : url.name);
  709. pfileMap.Add("fileSize", $"{url.size}");
  710. pfileMap.Add("md5", url.hash);
  711. pfileMap.Add("fileType", fileext);
  712. pfiles.Add(pfileMap);
  713. });
  714. });
  715. }
  716. //0"未认定", 1"合格", 2"优秀", 3"不合格"
  717. //系统 -1 未认定,0 不合格,1 合格,2 优秀
  718. string zpscore = "0";
  719. switch (a.zpscore)
  720. {
  721. case -1:
  722. zpscore = "0";
  723. break;
  724. case 0:
  725. zpscore = "3";
  726. break;
  727. case 1:
  728. zpscore = "1";
  729. break;
  730. case 2:
  731. zpscore = "2";
  732. break;
  733. default:
  734. zpscore = "4";
  735. break;
  736. }
  737. string hpscore = "0";
  738. switch (a.hpscore)
  739. {
  740. case -1:
  741. //如果互评未认定,则优先以校评为准。
  742. hpscore = "0";
  743. if (a.xzscore == 1)
  744. {
  745. hpscore = "1";
  746. }
  747. else if (a.xzscore == 2)
  748. {
  749. hpscore = "2";
  750. }
  751. //如果互评未认定,且没有校评,则以自评为准
  752. if (a.zpscore == 1)
  753. {
  754. hpscore = "1";
  755. break;
  756. }
  757. else if (a.zpscore == 2)
  758. {
  759. hpscore = "2";
  760. break;
  761. }
  762. //如果都没有,则未认定
  763. break;
  764. case 0:
  765. hpscore = "3";
  766. break;
  767. case 1:
  768. hpscore = "1";
  769. break;
  770. case 2:
  771. hpscore = "2";
  772. break;
  773. default:
  774. hpscore = "4";
  775. break;
  776. }
  777. string xzpresult = "0";
  778. switch (a.xzscore)
  779. {
  780. case -1:
  781. //如果校评未认定,则优先以互评为准。
  782. xzpresult = "0";
  783. if (a.hpscore == 1)
  784. {
  785. xzpresult = "1";
  786. break;
  787. }
  788. else if (a.hpscore == 2)
  789. {
  790. xzpresult = "2";
  791. break;
  792. }
  793. //如果校评未认定,且没有互评,则以自评为准
  794. if (a.zpscore == 1)
  795. {
  796. xzpresult = "1";
  797. break;
  798. }
  799. else if (a.zpscore == 2)
  800. {
  801. xzpresult = "2";
  802. break;
  803. }
  804. //如果都没有,则未认定
  805. break;
  806. case 0:
  807. xzpresult = "3";
  808. break;
  809. case 1:
  810. xzpresult = "1";
  811. break;
  812. case 2:
  813. xzpresult = "2";
  814. break;
  815. default:
  816. xzpresult = "4";
  817. break;
  818. }
  819. ///上传了三个,且当前没有上传的能力点,标记为为学习状态。
  820. if (uploadedAbility.Count >= 3)
  821. {
  822. if (pfiles.Count == 0)
  823. {
  824. zpscore = "4";
  825. hpscore = "4";
  826. xzpresult = "4";
  827. }
  828. }
  829. parameterMapData.Add("zpresult", zpscore);
  830. parameterMapData.Add("hpresult", hpscore);
  831. parameterMapData.Add("xzpresult", xzpresult);
  832. list53113.Add(parameterMapData);
  833. parameterMapDatas.Add(parameterMapData);
  834. });
  835. x.pushes.Add("53113");
  836. updatePush.Add(x);
  837. pushData.Add("success-UpdateTeacherListDiagnosis", parameterMapDatas);
  838. }
  839. //5.3.1.17学员课堂实录批量回写-UploadKTSLList
  840. if (t53117OK == 1)
  841. {
  842. List<Dictionary<string, object>> parameterMapDatas = new List<Dictionary<string, object>>();
  843. x.teacherClasses.ForEach(clss =>
  844. {
  845. Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
  846. string fileext = clss.url.Substring(clss.url.LastIndexOf(".") > 0 ? clss.url.LastIndexOf(".") + 1 : 0);
  847. parameterMapData.Add("PXID", $"{t.PXID}");
  848. parameterMapData.Add("TID", $"{t.TID}");
  849. parameterMapData.Add("url", $"{clss.url}?{schoolsas.sas}");//添加访问授权
  850. parameterMapData.Add("url2", $"{clss.url}?{schoolsas.sas}");
  851. parameterMapData.Add("fileName", clss.name.Length > 95 ? $"{clss.name.Substring(0, 95)}.{fileext}" : clss.name);
  852. parameterMapData.Add("fileSize", $"{clss.size}");
  853. parameterMapData.Add("md5", clss.hash);
  854. parameterMapData.Add("fileType", fileext);
  855. list53117.Add(parameterMapData);
  856. parameterMapDatas.Add(parameterMapData);
  857. });
  858. x.pushes.Add("53117");
  859. updatePush.Add(x);
  860. pushData.Add("success-UploadKTSLList", parameterMapDatas);
  861. }
  862. //5.3.1.22学员校本教研PDF(每人可以返回多条)批量回写-UploadSBTARPDFListV2
  863. if (t53122OK == 1)
  864. {
  865. Dictionary<string, object> parameterMapData = new Dictionary<string, object>();
  866. parameterMapData.Add("PXID", $"{t.PXID}");
  867. parameterMapData.Add("TID", $"{t.TID}");
  868. List<Dictionary<string, object>> files = new List<Dictionary<string, object>>();
  869. allRightOfflineRecords.ForEach(record =>
  870. {
  871. if (!string.IsNullOrWhiteSpace(record.url))
  872. {
  873. Dictionary<string, object> fileMap = new Dictionary<string, object>();
  874. string fileext = record.url.Substring(record.url.LastIndexOf(".") > 0 ? record.url.LastIndexOf(".") + 1 : 0);
  875. fileMap.Add("url", $"{record.url}?{schoolsas.sas}");
  876. fileMap.Add("fileName", record.name.Length > 95 ? $"{record.name.Substring(0, 95)}.{fileext}" : record.name);
  877. fileMap.Add("fileSize", $"{record.size}");
  878. fileMap.Add("md5", record.hash);
  879. fileMap.Add("fileType", fileext);
  880. files.Add(fileMap);
  881. }
  882. });
  883. if (x.offlineReport != null)
  884. {
  885. Dictionary<string, object> fileMap = new Dictionary<string, object>();
  886. fileMap.Add("url", $"{x.offlineReport.blob}?{teammodelossas.sas}");
  887. fileMap.Add("fileName", x.offlineReport.name);
  888. fileMap.Add("fileSize", $"{x.offlineReport.size}");
  889. fileMap.Add("md5", x.offlineReport.hash);
  890. string fileext = x.offlineReport.extension;
  891. fileMap.Add("fileType", fileext);
  892. files.Add(fileMap);
  893. }
  894. parameterMapData.Add("files", files);
  895. list53122.Add(parameterMapData);
  896. x.pushes.Add("53122");
  897. updatePush.Add(x);
  898. pushData.Add("success-UploadSBTARPDFListV2", parameterMapData);
  899. }
  900. if (!pushAll)
  901. {
  902. if (pushData.Any()) {
  903. pushDatas.Add(t.tmdid, pushData);
  904. }
  905. }
  906. }
  907. else {
  908. if (t53112OK != 1) {
  909. pushData.Add("fail-UpdateTeacherListSituation", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53112, school = t.schoolCode, schoolname = t.SchoolName });
  910. fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53112 ,school= t.schoolCode,schoolname=t.SchoolName,type= "fail-UpdateTeacherListSituation" });
  911. }
  912. if (t53113OK != 1)
  913. {
  914. pushData.Add("fail-UpdateTeacherListDiagnosis", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53113, school = t.schoolCode, schoolname = t.SchoolName });
  915. fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53113, school = t.schoolCode, schoolname = t.SchoolName,type= "fail-UpdateTeacherListDiagnosis" });
  916. }
  917. if (t53117OK != 1) {
  918. pushData.Add("fail-UploadKTSLList", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53117, school = t.schoolCode, schoolname = t.SchoolName });
  919. fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53117, school = t.schoolCode, schoolname = t.SchoolName,type= "fail-UploadKTSLList" });
  920. }
  921. if (t53122OK != 1) {
  922. pushData.Add("fail-UploadSBTARPDFListV2", new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53122, school = t.schoolCode, schoolname = t.SchoolName });
  923. fails.Add(new PushFail { tmdid = t.tmdid, name = t.TeacherName, msgs = msgs53122, school = t.schoolCode, schoolname = t.SchoolName,type= "fail-UploadSBTARPDFListV2" });
  924. }
  925. if (pushData.Any())
  926. {
  927. pushDatas.Add(t.tmdid,pushData);
  928. failse.AddRange(fails);
  929. }
  930. }
  931. }
  932. }
  933. [ProducesDefaultResponseType]
  934. [HttpPost("fix-sc-teacher")]
  935. public async Task<IActionResult> FixScTeacher(JsonElement json) {
  936. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  937. JsonElement areaIdJson = json.GetProperty("areaId");
  938. List<ScTeacher> scTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object> { { "PartitionKey", "ScTeacher" }, { "areaId", $"{areaIdJson}" } });
  939. List<ScTeacherDiagnosis> scTeacherDiagnoses = await table.FindListByDict<ScTeacherDiagnosis>(new Dictionary<string, object> { { "PartitionKey", "ScTeacherDiagnosis" }, { "areaId", $"{areaIdJson}" } });
  940. var tmdids = scTeachers.Where(x=>!string.IsNullOrWhiteSpace(x.tmdid)).Select(x=>x.tmdid);
  941. string sql = $"select value c from c where c.id in ({string.Join(",", tmdids.Select(x=>$"'{x}'"))})";
  942. List<Teacher> teachers = new List<Teacher>();
  943. await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetItemQueryIterator<Teacher>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey("Base") })) {
  944. teachers.Add(item);
  945. }
  946. HashSet<ScTeacher> update = new HashSet<ScTeacher>();
  947. HashSet<ScTeacherDiagnosis> update_scTeacherDiagnoses = new HashSet<ScTeacherDiagnosis>();
  948. scTeachers.ForEach(x =>
  949. {
  950. if (!string.IsNullOrWhiteSpace(x.tmdid)) {
  951. var tech= teachers.Find(t => t.id.Equals(x.tmdid));
  952. if (tech != null && tech.schools.Any()) {
  953. var a = tech.schools.First();
  954. if (!x.schoolCode.Equals(a.schoolId)) {
  955. x.schoolCode = a.schoolId;
  956. update.Add(x);
  957. var dis = scTeacherDiagnoses.Find(t => t.RowKey.Equals(x.RowKey));
  958. dis.schoolCode = a.schoolId;
  959. update_scTeacherDiagnoses.Add(dis);
  960. }
  961. if (!x.SchoolName.Equals(a.name))
  962. {
  963. x.SchoolName = a.name;
  964. update.Add(x);
  965. }
  966. }
  967. }
  968. });
  969. if (update.Any()) {
  970. await table.UpdateAll(update.ToList());
  971. }
  972. if (update_scTeacherDiagnoses.Any())
  973. {
  974. await table.UpdateAll(update_scTeacherDiagnoses.ToList());
  975. }
  976. return Ok();
  977. }
  978. private async Task<List<PushData> > GetYxData(ScAccessConfig config , ScTeacher sc) {
  979. List<PushData> datas = new List<PushData>();
  980. Dictionary<string, object> parameterContent53123 = new Dictionary<string, object>();
  981. parameterContent53123.Add("TrainComID", config.trainComID);
  982. parameterContent53123.Add("ProjectID", config.p.Where(x=>x.status==1).First().pd);
  983. parameterContent53123.Add("ProjectItemID", config.p.Where(x => x.status == 1).First().pid);
  984. parameterContent53123.Add("PXID", $"{sc.PXID}");
  985. parameterContent53123.Add("TID", $"{sc.TID}");
  986. ScsResult GetDiagnosisResultByPXIDCommand = await ThirdApisService.Post(_httpClient,config.url, "GetDiagnosisResultByPXIDCommand", config.passKey, config.privateKey, parameterContent53123);
  987. if (GetDiagnosisResultByPXIDCommand.result)
  988. {
  989. PushData pushData = GetDiagnosisResultByPXIDCommand.content.ToObject<PushData>();
  990. PushData newPushData = new PushData();
  991. newPushData.teacherInfo = new TeacherSc(sc);
  992. newPushData.teacherInfo.PXXK = pushData.teacherInfo.PXXK;
  993. newPushData.teacherInfo.PXXD = pushData.teacherInfo.PXXD;
  994. newPushData.teacherInfo.ComPassed = pushData.teacherInfo.ComPassed;
  995. newPushData.teacherInfo.ComPassedTime = pushData.teacherInfo.ComPassedTime;
  996. newPushData.diagnosisInfo = pushData.diagnosisInfo;
  997. newPushData.files = pushData.files;
  998. datas.Add(newPushData);
  999. }
  1000. else {
  1001. PushData newPushData = new PushData();
  1002. newPushData.teacherInfo = new TeacherSc(sc);
  1003. datas.Add(newPushData);
  1004. }
  1005. return datas;
  1006. }
  1007. /// <summary>
  1008. /// 获取四川省已经上传的。
  1009. /// </summary>
  1010. /// <param name="json"></param>
  1011. /// <returns></returns>
  1012. [ProducesDefaultResponseType]
  1013. [HttpPost("get-sc-teacher-push")]
  1014. public async Task<IActionResult> ScCheck(JsonElement json)
  1015. {
  1016. List<string> pushTeachers = json.GetProperty("pushTeachers").ToObject<List<string>>();
  1017. string areaIdJson = $"{json.GetProperty("areaId")}";
  1018. List<string> schools = json.GetProperty("schools").ToObject<List<string>>();
  1019. var client = _azureCosmos.GetCosmosClient();
  1020. (List<dynamic> ycd, List<dynamic> okd, List<TeacherSc> teachers,List<PushData> datas)= await CheckScPush(pushTeachers, areaIdJson, schools);
  1021. return Ok(new { ycData = ycd, okData = okd , tmdid= teachers .Select(x=>x.tmdid), datas = datas });
  1022. }
  1023. private async Task<(List<dynamic> ycd ,List<dynamic> okd, List<TeacherSc> teachers, List<PushData> datas)> CheckScPush(List<string> pushTeachers,string areaIdJson,List<string> schools) {
  1024. Dictionary<string, Dictionary<string, object>> pushDatas = new Dictionary<string, Dictionary<string, object>>();
  1025. List<Dictionary<string, object>> dicts = new List<Dictionary<string, object>>();
  1026. List<ScsResult> results = new List<ScsResult>();
  1027. AreaSetting areaSetting = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<AreaSetting>($"{areaIdJson}", new PartitionKey("AreaSetting"));
  1028. ScAccessConfig config = areaSetting.accessConfig.ToObject<ScAccessConfig>();
  1029. Dictionary<string, dynamic> checkDatas = new Dictionary<string, dynamic>();
  1030. var table = _azureStorage.GetCloudTableClient().GetTableReference("ScYxpt");
  1031. List<ScTeacher> scTeachers = new List<ScTeacher>();
  1032. if (pushTeachers.IsNotEmpty())
  1033. {
  1034. List<string> Codes = new List<string>();
  1035. pushTeachers.ForEach(tch => {
  1036. Codes.Add($" tmdid {QueryComparisons.Equal} '{tch}' ");
  1037. });
  1038. string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'ScTeacher' and areaId {QueryComparisons.Equal} '{areaIdJson}' and ( {string.Join(" or ", Codes)} ) ";
  1039. var result = await table.ExecuteQuerySegmentedAsync(new TableQuery<ScTeacher>().Where(tbqurey), null);
  1040. scTeachers = result.Results;
  1041. }
  1042. else
  1043. {
  1044. if (schools.IsNotEmpty())
  1045. {
  1046. List<string> Codes = new List<string>();
  1047. schools.ForEach(school => {
  1048. Codes.Add($" schoolCode {QueryComparisons.Equal} '{school}' ");
  1049. });
  1050. string tbqurey = $"PartitionKey {QueryComparisons.Equal} 'ScTeacher' and areaId {QueryComparisons.Equal} '{areaIdJson}' and ( {string.Join(" or ", Codes)} ) ";
  1051. var result = await table.ExecuteQuerySegmentedAsync(new TableQuery<ScTeacher>().Where(tbqurey), null);
  1052. scTeachers = result.Results;
  1053. }
  1054. else
  1055. {
  1056. scTeachers = await table.FindListByDict<ScTeacher>(new Dictionary<string, object> { { "PartitionKey", "ScTeacher" }, { "areaId", $"{areaIdJson}" } });
  1057. }
  1058. }
  1059. List<PushData> ycData = new List<PushData>();
  1060. List<PushData> datas = new List<PushData>();
  1061. List<Task<List<PushData>>> tasks = new List<Task<List<PushData>>>();
  1062. scTeachers.ForEach(sc =>
  1063. {
  1064. tasks.Add(GetYxData(config, sc));
  1065. });
  1066. List<TeacherSc> teachers = new List<TeacherSc>();
  1067. var tsk = await tasks.TaskPage(100);
  1068. foreach (var a in tsk)
  1069. {
  1070. datas.AddRange(a);
  1071. }
  1072. datas.ForEach(x => {
  1073. bool has0result = false;
  1074. if (x.diagnosisInfo != null)
  1075. {
  1076. x.diagnosisInfo.ForEach(t =>
  1077. {
  1078. if (t.hpresult.Equals("0") || t.zpresult.Equals("0") || t.xzpresult.Equals("0"))
  1079. {
  1080. has0result = true;
  1081. }
  1082. });
  1083. }
  1084. else
  1085. {
  1086. has0result = true;
  1087. teachers.Add(x.teacherInfo);
  1088. }
  1089. if (has0result && x.teacherInfo.ComPassed != 3 && x.teacherInfo.ComPassed != 0)
  1090. {
  1091. teachers.Add(x.teacherInfo);
  1092. }
  1093. });
  1094. List<KeyValuePair<string, string>> htmls = new List<KeyValuePair<string, string>>();
  1095. var group = datas.GroupBy(x => x.teacherInfo.SchoolName);
  1096. List<dynamic> okd = new List<dynamic>();
  1097. foreach (var groupData in group)
  1098. {
  1099. int joinCount = groupData.ToList().Count();
  1100. //0、未认定 1、合格 2、优秀 3、不合格 4、其他
  1101. int yxCount = groupData.ToList().Where(x => x.teacherInfo.ComPassed == 2).Count();
  1102. int hgCount = groupData.ToList().Where(x => x.teacherInfo.ComPassed == 1).Count();
  1103. var yc = groupData.ToList().Where(x => x.teacherInfo.ComPassed != 2 && x.teacherInfo.ComPassed != 1);
  1104. int ycCount = yc.Count();
  1105. okd.Add(new { schoolName = groupData.Key, joinCount, yxCount, hgCount, ycCount });
  1106. if (yc.Any())
  1107. {
  1108. foreach (var bu in yc)
  1109. {
  1110. string ComPassed = "";
  1111. switch (bu.teacherInfo.ComPassed)
  1112. {
  1113. //0、未认定 1、合格 2、优秀 3、不合格 4、其他
  1114. case 0:
  1115. ComPassed = "未认定";
  1116. break;
  1117. case 1:
  1118. ComPassed = "合格";
  1119. break;
  1120. case 2:
  1121. ComPassed = "优秀";
  1122. break;
  1123. case 3:
  1124. ComPassed = "不合格";
  1125. break;
  1126. case 4:
  1127. ComPassed = "其他";
  1128. break;
  1129. default:
  1130. ComPassed = "其他";
  1131. break;
  1132. }
  1133. bu.teacherInfo.com = ComPassed;
  1134. }
  1135. ycData.AddRange(yc);
  1136. }
  1137. }
  1138. List<dynamic> ycd = new List<dynamic>();
  1139. ycData.ForEach(data => {
  1140. ycd.Add(new
  1141. {
  1142. data.teacherInfo.TeacherName,
  1143. data.teacherInfo.tmdid,
  1144. data.teacherInfo.SchoolName,
  1145. data.teacherInfo.schoolCode,
  1146. data.teacherInfo.com,
  1147. data.teacherInfo.ComPassed,
  1148. data.teacherInfo.ComPassedTime,
  1149. data.teacherInfo.PXID,
  1150. data.teacherInfo.TID,
  1151. });
  1152. });
  1153. if (datas.Any() && datas.Count == 1)
  1154. {
  1155. return (ycd, okd, teachers,datas);
  1156. }
  1157. else {
  1158. return (ycd, okd, teachers, new List<PushData>());
  1159. }
  1160. }
  1161. }
  1162. public class DiagnosisInfoItem
  1163. {
  1164. /// <summary>
  1165. /// 技术支持的学情分析
  1166. /// </summary>
  1167. public string diagnosisName { get; set; }
  1168. /// <summary>
  1169. ///
  1170. /// </summary>
  1171. public string xzpresult { get; set; }
  1172. /// <summary>
  1173. ///
  1174. /// </summary>
  1175. public string zpresult { get; set; }
  1176. /// <summary>
  1177. ///
  1178. /// </summary>
  1179. public string hpresult { get; set; }
  1180. /// <summary>
  1181. ///
  1182. /// </summary>
  1183. public int diagnosisID { get; set; }
  1184. /// <summary>
  1185. ///
  1186. /// </summary>
  1187. public string diagnosisNum { get; set; }
  1188. /// <summary>
  1189. ///
  1190. /// </summary>
  1191. public string uptime { get; set; }
  1192. }
  1193. public class TeacherSc:ScTeacher
  1194. {
  1195. public TeacherSc() {
  1196. }
  1197. public TeacherSc(ScTeacher teacher)
  1198. {
  1199. PXID = teacher.PXID;
  1200. TID = teacher.TID;
  1201. TeacherName = teacher.TeacherName;
  1202. SchoolID = teacher.SchoolID;
  1203. SchoolName = teacher.SchoolName;
  1204. ProjectID = teacher.ProjectID;
  1205. ProjectItemID = teacher.ProjectItemID;
  1206. ProjectTitle = teacher.ProjectTitle;
  1207. ProjectItemTitle = teacher.ProjectItemTitle;
  1208. CityID = teacher.CityID;
  1209. DistrictID = teacher.DistrictID;
  1210. CityName = teacher.CityName;
  1211. DisName = teacher.DisName;
  1212. Account = teacher.Account;
  1213. TeacherXK = teacher.TeacherXK;
  1214. TeacherXD = teacher.TeacherXD;
  1215. Mobile = teacher.Mobile;
  1216. Email = teacher.Email;
  1217. this.tmdid = teacher.tmdid;
  1218. this.areaId = teacher.areaId;
  1219. this.schoolCode = teacher.schoolCode;
  1220. this.status = teacher.status;
  1221. }
  1222. /// <summary>
  1223. ///
  1224. /// </summary>
  1225. public string PXXK { get; set; }
  1226. /// <summary>
  1227. ///
  1228. /// </summary>
  1229. public string PXXD { get; set; }
  1230. /// <summary>
  1231. ///
  1232. /// </summary>
  1233. public int ComPassed { get; set; }
  1234. public string com { get;set; }
  1235. /// <summary>
  1236. ///
  1237. /// </summary>
  1238. public string ComPassedTime { get; set; }
  1239. }
  1240. public class FilesItem
  1241. {
  1242. /// <summary>
  1243. /// 信息化教学案例展示
  1244. /// </summary>
  1245. public string fileName { get; set; }
  1246. /// <summary>
  1247. ///
  1248. /// </summary>
  1249. public int sourceType { get; set; }
  1250. /// <summary>
  1251. ///
  1252. /// </summary>
  1253. public string diagnosisNum { get; set; }
  1254. /// <summary>
  1255. ///
  1256. /// </summary>
  1257. // public int filesize { get; set; }
  1258. /// <summary>
  1259. /// https://teammodelos.blob.core.chinacloudapi.cn/cdqzmd/train/8eae8733-c4cd-40bd-8ada-6fe5e2573e30/1640923152/心得.pdf?sv=2021-04-10&st=2022-06-23T09%3A43%3A07Z&se=2121-05-30T09%3A58%3A07Z&sr=c&sp=r&sig=iFHJSQAHbgOc1I4trUVab%2B2UCV%2BrY%2Blge%2Fjb30yvqjM%3D
  1260. /// </summary>
  1261. public string url { get; set; }
  1262. /// <summary>
  1263. ///
  1264. /// </summary>
  1265. public string fileType { get; set; }
  1266. /// <summary>
  1267. ///
  1268. /// </summary>
  1269. public string md5 { get; set; }
  1270. }
  1271. public class PushData
  1272. {
  1273. /// <summary>
  1274. ///
  1275. /// </summary>
  1276. public List<DiagnosisInfoItem> diagnosisInfo { get; set; }
  1277. /// <summary>
  1278. ///
  1279. /// </summary>
  1280. public TeacherSc teacherInfo { get; set; }
  1281. /// <summary>
  1282. ///
  1283. /// </summary>
  1284. public List<FilesItem> files { get; set; }
  1285. }
  1286. }