ActivityController.cs 106 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631
  1. using Azure.Cosmos;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.Extensions.Options;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.Json;
  10. using System.Threading.Tasks;
  11. using TEAMModelOS.Models;
  12. using TEAMModelOS.SDK.Models;
  13. using TEAMModelOS.SDK.DI;
  14. using TEAMModelOS.SDK.Extension;
  15. using Azure;
  16. using Microsoft.Extensions.Configuration;
  17. using TEAMModelOS.Filter;
  18. using HTEXLib.COMM.Helpers;
  19. using TEAMModelOS.SDK;
  20. using StackExchange.Redis;
  21. using System.Text.RegularExpressions;
  22. using Microsoft.AspNetCore.Authorization;
  23. using OpenXmlPowerTools;
  24. using System.IdentityModel.Tokens.Jwt;
  25. using Microsoft.AspNetCore.Routing;
  26. using Pipelines.Sockets.Unofficial.Arenas;
  27. using Grpc.Core;
  28. using static TEAMModelOS.SDK.CoreAPIHttpService;
  29. using Top.Api;
  30. using System.Net;
  31. using TEAMModelOS.SDK.Models.Service;
  32. using DocumentFormat.OpenXml.Office2010.Excel;
  33. using TEAMModelOS.Services;
  34. using OfficeOpenXml.FormulaParsing.LexicalAnalysis;
  35. using Azure.Storage.Sas;
  36. using DocumentFormat.OpenXml.Bibliography;
  37. using System.Runtime.Intrinsics.X86;
  38. using Microsoft.IdentityModel.Tokens;
  39. using TEAMModelOS.SDK.Models.Dtos;
  40. using System.Net.Http;
  41. using Newtonsoft.Json.Linq;
  42. namespace TEAMModelOS.Controllers
  43. {
  44. [ProducesResponseType(StatusCodes.Status200OK)]
  45. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  46. [Route("activity")]
  47. [ApiController]
  48. public class ActivityController : ControllerBase
  49. {
  50. private AzureCosmosFactory _azureCosmos;
  51. private readonly DingDing _dingDing;
  52. private readonly CoreAPIHttpService _coreAPIHttpService;
  53. private readonly Option _option;
  54. private readonly AzureServiceBusFactory _serviceBus;
  55. private readonly AzureStorageFactory _azureStorage;
  56. private readonly AzureRedisFactory _azureRedis;
  57. private readonly HttpTrigger _httpTrigger;
  58. private readonly IPSearcher _searcher;
  59. public IConfiguration _configuration { get; set; }
  60. public ActivityController(AzureRedisFactory azureRedis, AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, CoreAPIHttpService coreAPIHttpService, AzureServiceBusFactory serviceBus, AzureStorageFactory azureStorage, IConfiguration configuration, HttpTrigger httpTrigger, IPSearcher searcher)
  61. {
  62. _azureCosmos = azureCosmos;
  63. _dingDing = dingDing;
  64. _option = option?.Value;
  65. _serviceBus = serviceBus;
  66. _configuration = configuration;
  67. _azureStorage = azureStorage;
  68. _azureRedis = azureRedis;
  69. _coreAPIHttpService = coreAPIHttpService;
  70. _httpTrigger=httpTrigger;
  71. _searcher=searcher;
  72. }
  73. /// <summary>
  74. /// 分站管理
  75. /// </summary>
  76. /// <param name="request"></param>
  77. /// <returns></returns>
  78. [ProducesDefaultResponseType]
  79. [AuthToken(Roles = "admin,area")]
  80. [HttpPost("website-manage")]
  81. #if !DEBUG
  82. [Authorize(Roles = "IES")]
  83. #endif
  84. public async Task<IActionResult> WebsiteManage(JsonElement request) {
  85. (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
  86. if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
  87. {
  88. switch (true)
  89. {
  90. case bool when $"{grant_type}".Equals("update", StringComparison.OrdinalIgnoreCase):
  91. {
  92. request.TryGetProperty("areaId", out JsonElement _areaId);
  93. if (!request.TryGetProperty("website", out JsonElement _website)) return BadRequest();
  94. ActivityWebsite website = _website.ToObject<ActivityWebsite>();
  95. Azure.Response teammodelResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(website.id, new PartitionKey("ActivityWebsite"));
  96. if (teammodelResponse.Status == 200)
  97. {
  98. ActivityWebsite activityWebsite = JsonDocument.Parse(teammodelResponse.Content).RootElement.ToObject<ActivityWebsite>();
  99. website.route=activityWebsite.route;
  100. website.pk=activityWebsite.pk;
  101. website.code=activityWebsite.code;
  102. website.scope=activityWebsite.scope;
  103. //不是醍摩豆学区的,不能修改是否有公开办活动权限
  104. if (!(string.IsNullOrWhiteSpace($"{_areaId}")&& _areaId.Equals("02944f32-f534-3397-ea56-e6f1fc6c3714"))) {
  105. website.allowPublic=activityWebsite.allowPublic;
  106. }
  107. }
  108. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website ,new PartitionKey("ActivityWebsite"));
  109. return Ok(new { website,code =200});
  110. }
  111. case bool when $"{grant_type}".Equals("list", StringComparison.OrdinalIgnoreCase):
  112. {
  113. List<ActivityWebsite> websites = new List<ActivityWebsite>();
  114. if (!request.TryGetProperty("websiteId", out JsonElement _websiteId)) return BadRequest();
  115. string websiteId = _websiteId.GetString();
  116. if (websiteId.Equals("02944f32-f534-3397-ea56-e6f1fc6c3714", StringComparison.OrdinalIgnoreCase) )
  117. {
  118. Azure.Response teammodelResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync("teammodel", new PartitionKey("ActivityWebsite"));
  119. if (teammodelResponse.Status == 200)
  120. {
  121. ActivityWebsite activityWebsite = JsonDocument.Parse(teammodelResponse.Content).RootElement.ToObject<ActivityWebsite>();
  122. websites.Add(activityWebsite);
  123. }
  124. else {
  125. ActivityWebsite website = new ActivityWebsite
  126. {
  127. id="teammodel",
  128. pk="ActivityWebsite",
  129. code="ActivityWebsite",
  130. route="teammodel",
  131. scope="public",
  132. allowPublic=1,
  133. };
  134. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website, new PartitionKey(website.code));
  135. websites.Add(website);
  136. }
  137. //返回其他区的。
  138. string sqlArea = "select value c from c ";
  139. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<Area>(sqlArea, "Base-Area");
  140. if (result.list.IsNotEmpty()) {
  141. string sqlWebsite = $"select value c from c where c.id in ({string.Join(",", result.list.Select(z => $"'{z.id}'"))})";
  142. var resultWebsite = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsite>(sqlWebsite, "ActivityWebsite");
  143. foreach (var item in result.list) {
  144. var website = resultWebsite.list.Find(z => z.id.Equals(item.id));
  145. if (website!=null)
  146. {
  147. if (!string.IsNullOrWhiteSpace(item.shortCode))
  148. {
  149. bool change = false;
  150. if (string.IsNullOrWhiteSpace(website.route))
  151. {
  152. website.route=item.shortCode;
  153. change = true;
  154. }
  155. else
  156. {
  157. if (!website.route.Equals(item.shortCode))
  158. {
  159. website.route=item.shortCode;
  160. change = true;
  161. }
  162. }
  163. if (change)
  164. {
  165. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website, new PartitionKey(website.code));
  166. }
  167. }
  168. }
  169. else {
  170. website= new ActivityWebsite
  171. {
  172. id= item.id,
  173. code="ActivityWebsite",
  174. pk="ActivityWebsite",
  175. route=item.shortCode,
  176. scope="area",
  177. allowPublic=0,
  178. };
  179. }
  180. websites.Add(website);
  181. }
  182. }
  183. }
  184. else{
  185. Azure.Response activityWebsiteResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(websiteId, new PartitionKey("ActivityWebsite"));
  186. if (activityWebsiteResponse.Status == 200)
  187. {
  188. ActivityWebsite activityWebsite = JsonDocument.Parse(activityWebsiteResponse.Content).RootElement.ToObject<ActivityWebsite>();
  189. Area area = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<Area>(websiteId, new PartitionKey("Base-Area"));
  190. if (!string.IsNullOrWhiteSpace(area.shortCode) )
  191. {
  192. bool change = false;
  193. if (string.IsNullOrWhiteSpace(activityWebsite.route))
  194. {
  195. activityWebsite.route=area.shortCode;
  196. change = true;
  197. }
  198. else {
  199. if (!activityWebsite.route.Equals(area.shortCode))
  200. {
  201. activityWebsite.route=area.shortCode;
  202. change = true;
  203. }
  204. }
  205. if (change) {
  206. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(activityWebsite, new PartitionKey(activityWebsite.code));
  207. }
  208. }
  209. websites.Add(activityWebsite);
  210. }
  211. else
  212. {
  213. string route = string.Empty;
  214. string scope = string.Empty;
  215. Azure.Response responseArea = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(websiteId, new PartitionKey("Base-Area"));
  216. if (responseArea.Status==200)
  217. {
  218. Area area = JsonDocument.Parse(responseArea.Content).RootElement.ToObject<Area>();
  219. if (!string.IsNullOrWhiteSpace(area.shortCode))
  220. {
  221. route=area.shortCode;
  222. }
  223. scope="area";
  224. }
  225. if (!string.IsNullOrWhiteSpace(scope)) {
  226. Azure.Response responseSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(websiteId, new PartitionKey("Base"));
  227. if (responseSchool.Status==200)
  228. {
  229. scope="school";
  230. route = websiteId;
  231. }
  232. }
  233. if (!string.IsNullOrWhiteSpace(scope)) {
  234. if (!string.IsNullOrWhiteSpace(route))
  235. {
  236. ActivityWebsite website = new ActivityWebsite
  237. {
  238. id=websiteId,
  239. pk="ActivityWebsite",
  240. code="ActivityWebsite",
  241. route=route,
  242. scope=scope,
  243. allowPublic=0
  244. };
  245. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website, new PartitionKey(website.code));
  246. websites.Add(website);
  247. }
  248. else
  249. {
  250. ActivityWebsite website = new ActivityWebsite
  251. {
  252. id=websiteId,
  253. pk="ActivityWebsite",
  254. code="ActivityWebsite",
  255. route=route,
  256. scope=scope,
  257. allowPublic=0
  258. };
  259. websites.Add(website);
  260. }
  261. }
  262. }
  263. }
  264. return Ok(new { code = 200, websites });
  265. }
  266. }
  267. }
  268. return Ok();
  269. }
  270. /// <summary>
  271. /// 添加活动参与对象,学校,教师
  272. /// </summary>
  273. /// <param name="request"></param>
  274. /// <returns></returns>
  275. [ProducesDefaultResponseType]
  276. [AuthToken(Roles = "admin,area")]
  277. [HttpPost("invite-target")]
  278. #if !DEBUG
  279. [Authorize(Roles = "IES")]
  280. #endif
  281. public async Task<IActionResult> InviteTarget(JsonElement request)
  282. {
  283. (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
  284. if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
  285. switch (true)
  286. {
  287. case bool when $"{grant_type}".Equals("schools", StringComparison.OrdinalIgnoreCase):
  288. {
  289. if (!request.TryGetProperty("scope", out JsonElement _scope)) return BadRequest();
  290. if (!request.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
  291. string sql = string.Empty;
  292. int allowPublic = 0;
  293. if (_scope.GetString().Equals("public", StringComparison.OrdinalIgnoreCase))
  294. {
  295. if (_areaId.GetString().Equals("02944f32-f534-3397-ea56-e6f1fc6c3714"))
  296. {
  297. allowPublic=1;
  298. }
  299. else
  300. {
  301. Azure.Response activityWebsiteResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(_areaId.GetString(), new PartitionKey("ActivityWebsite"));
  302. if (activityWebsiteResponse.Status==200)
  303. {
  304. ActivityWebsite website = JsonDocument.Parse(activityWebsiteResponse.Content).RootElement.ToObject<ActivityWebsite>();
  305. allowPublic=website.allowPublic;
  306. }
  307. }
  308. }
  309. if (allowPublic==1)
  310. {
  311. sql = "select c.id,c.name ,c.picture,c.region,c.province,c.city,c.areaId from c where c.code='Base' ";
  312. }
  313. else
  314. {
  315. sql = $"select c.id,c.name ,c.picture,c.region,c.province,c.city,c.areaId from c where c.code='Base' and c.areaId='{_areaId}' ";
  316. }
  317. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<School>(sql, "Base");
  318. var sc = result.list.FindAll(z => !string.IsNullOrWhiteSpace(z.areaId));
  319. List<dynamic> schools = new List<dynamic>();
  320. if (sc.IsNotEmpty()) {
  321. string areaSql = $"select value c from c where c.id in ({string.Join(",", sc.Select(z => $"'{z.areaId}'").ToHashSet())})";
  322. var areaResult = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<Area>(areaSql, "Base-Area");
  323. if (areaResult.list.IsNotEmpty()) {
  324. foreach (var item in result.list) {
  325. if (!string.IsNullOrWhiteSpace(item.areaId))
  326. {
  327. var area = areaResult.list.Find(z => z.id.Equals(item.areaId));
  328. schools.Add(new { item.id, item.name, item.picture, item.region, item.province, item.city, item.areaId, areaName = area?.name });
  329. }
  330. else {
  331. schools.Add(new { item.id, item.name, item.picture, item.region, item.province, item.city, item.areaId, areaName = string.Empty });
  332. }
  333. }
  334. }
  335. }
  336. return Ok(new { code = 200, schools });
  337. }
  338. case bool when $"{grant_type}".Equals("teachers", StringComparison.OrdinalIgnoreCase):
  339. {
  340. if (!string.IsNullOrWhiteSpace(school)) {
  341. School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  342. string sql = $"select c.id,c.name ,c.picture from c where c.code='Teacher-{school}' ";
  343. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<SchoolTeacher>(sql, $"Teacher-{school}");
  344. return Ok(new { code = 200, teachers = result.list.Select(z => new { z.id, z.name, z.picture, school, schooName = schoolbase.name }) });
  345. }
  346. break;
  347. }
  348. }
  349. return Ok(new { code = 400 });
  350. }
  351. /// <summary>
  352. /// 管理
  353. /// </summary>
  354. /// <param name="request"></param>
  355. /// <returns></returns>
  356. [ProducesDefaultResponseType]
  357. [AuthToken(Roles = "teacher,admin,area")]
  358. [HttpPost("manage")]
  359. [Authorize(Roles = "IES")]
  360. public async Task<IActionResult> Manage(JsonElement request)
  361. {
  362. try
  363. {
  364. (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
  365. if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
  366. var client = _azureCosmos.GetCosmosClient();
  367. switch (true)
  368. {
  369. //创建活动
  370. case bool when $"{grant_type}".Equals("create", StringComparison.OrdinalIgnoreCase):
  371. {
  372. if (!request.TryGetProperty("Activity", out JsonElement _activity)) return Ok(new { code = 1, msg = "活动信息参数错误" });
  373. Activity activity = _activity.ToObject<Activity>();
  374. activity.id=!string.IsNullOrWhiteSpace(activity.id) ? activity.id : Guid.NewGuid().ToString();
  375. activity.code="Activity";
  376. activity.pk="Activity";
  377. //如果是区级活动,enroll报名制,则学校的确认状态默认为1 。
  378. //if (activity.scope.Equals("area", StringComparison.OrdinalIgnoreCase) && activity.joinMode.Equals("enroll", StringComparison.OrdinalIgnoreCase))
  379. //{
  380. // activity.schools.ForEach(z => z.status=1);
  381. //}
  382. ActivityWebsite website = null;
  383. {
  384. string websiteId = activity.owner;
  385. string route = string.Empty;
  386. if (activity.owner.Equals("02944f32-f534-3397-ea56-e6f1fc6c3714", StringComparison.OrdinalIgnoreCase) && activity.scope.Equals("public", StringComparison.OrdinalIgnoreCase)) {
  387. websiteId="teammodel";
  388. route="teammodel";
  389. }
  390. Azure.Response activityWebsiteResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(websiteId, new PartitionKey("ActivityWebsite"));
  391. if (activityWebsiteResponse.Status!=200)
  392. {
  393. if (activity.scope.Equals("area", StringComparison.OrdinalIgnoreCase))
  394. {
  395. Area area = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<Area>(activity.owner, new PartitionKey("Base-Area"));
  396. if (!string.IsNullOrWhiteSpace(area.shortCode))
  397. {
  398. route=area.shortCode;
  399. }
  400. }
  401. if (activity.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
  402. {
  403. route=activity.owner;
  404. }
  405. if (!string.IsNullOrWhiteSpace(route))
  406. {
  407. website = new ActivityWebsite
  408. {
  409. id=websiteId,
  410. pk="ActivityWebsite",
  411. code="ActivityWebsite",
  412. route=route,
  413. scope=activity.scope,
  414. };
  415. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website, new PartitionKey(website.code));
  416. }
  417. }
  418. else {
  419. website =JsonDocument.Parse(activityWebsiteResponse.Content).RootElement.ToObject<ActivityWebsite>();
  420. }
  421. }
  422. //醍摩豆智慧学区
  423. if (activity.scope.Equals("public", StringComparison.OrdinalIgnoreCase))
  424. {
  425. if (website.allowPublic==0)
  426. {
  427. return Ok(new { code = 2, msg = "暂无创建公开活动权限!" });
  428. }
  429. }
  430. Contest contest = null;
  431. ValidResult validResult = activity.Valid();
  432. if (validResult.isVaild)
  433. {
  434. activity.creatorId=tmdid;
  435. activity.createTime= DateTimeOffset.Now.ToUnixTimeMilliseconds();
  436. activity.year=DateTimeOffset.Now.Year;
  437. foreach (var module in activity.modules) {
  438. switch (true)
  439. {
  440. //赛课
  441. case bool when module.Equals("Contest"):
  442. {
  443. if (!request.TryGetProperty("Contest", out JsonElement _contest))
  444. {
  445. return Ok(new { code = 3, msg = "赛课信息参数错误" });
  446. }
  447. contest = _contest.ToObject<Contest>();
  448. if (contest!=null) {
  449. contest.id=activity.id;
  450. contest.code="Contest";
  451. contest.pk="Contest";
  452. ValidResult validResultContest = contest.Valid();
  453. if (validResultContest.isVaild)
  454. {
  455. if (contest.modules.Contains("review")) {
  456. if (!request.TryGetProperty("reviewConfig", out JsonElement _reviewConfig))
  457. {
  458. return Ok(new { code = 4, msg = "评审未配置" });
  459. }
  460. if (contest.review== null) {
  461. return Ok(new { code = 4, msg = "评审未配置" });
  462. }
  463. ReviewRuleTree ruleTree = _reviewConfig.ToObject<ReviewRuleTree>();
  464. var reviewRule = await ActivityService.UpsertReviewRule(ruleTree, activity, _azureCosmos);
  465. contest.review.ruleId = reviewRule.id;
  466. contest.review.ruleName = reviewRule.name;
  467. }
  468. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).UpsertItemAsync(contest, new PartitionKey(contest.code));
  469. }
  470. else {
  471. return Ok(validResult);
  472. }
  473. }
  474. break;
  475. }
  476. //培训
  477. case bool when module.Equals("Training"):
  478. {
  479. break;
  480. }
  481. //教研
  482. case bool when module.Equals("Research"):
  483. {
  484. break;
  485. }
  486. }
  487. }
  488. //保存活动基础信息
  489. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).UpsertItemAsync(activity, new PartitionKey(activity.code));
  490. return Ok(new { activity, contest, code = 200 });
  491. }
  492. else
  493. {
  494. return Ok(validResult);
  495. }
  496. }
  497. //删除活动
  498. case bool when $"{grant_type}".Equals("delete", StringComparison.OrdinalIgnoreCase):
  499. {
  500. if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
  501. if (!request.TryGetProperty("owner", out JsonElement _owner)) return BadRequest();
  502. if (!request.TryGetProperty("scope", out JsonElement _scope)) return BadRequest();
  503. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Activity"));
  504. if (response.Status==200)
  505. {
  506. Activity activity = JsonDocument.Parse(response.Content).RootElement.ToObject<Activity>();
  507. if (_scope.GetString().Equals("school") && _owner.GetString().Equals(school))
  508. {
  509. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).DeleteItemStreamAsync(activity.id, new PartitionKey("Activity"));
  510. return Ok(new { code = 201, activity }); //删除成功
  511. }
  512. else {
  513. if ((_scope.GetString().Equals("area") || _scope.GetString().Equals("public")) && !_owner.GetString().Equals(school))
  514. {
  515. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).DeleteItemStreamAsync(activity.id, new PartitionKey("Activity"));
  516. return Ok(new { code = 201, activity });//删除成功
  517. }
  518. }
  519. return Ok(new { code = 200, activity });//未删除掉
  520. }
  521. else
  522. {
  523. return Ok(new { code = 1, msg = "活动不存在" });
  524. }
  525. }
  526. //区级活动列表
  527. case bool when $"{grant_type}".Equals("list-area", StringComparison.OrdinalIgnoreCase):
  528. {
  529. if (!request.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
  530. string yearSql = $" and c.year={DateTimeOffset.Now.Year}";
  531. if (request.TryGetProperty("year", out JsonElement _year)) {
  532. yearSql = $" and c.year={_year}";
  533. }
  534. string sql = $"select value c from c where c.owner='{_areaId}' {yearSql} ";
  535. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sql, "Activity");
  536. result.list.ForEach(z => {
  537. var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(z.owner, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
  538. z.sas=blob_sas;
  539. });
  540. return Ok(new { activities = result.list.OrderByDescending(z => z.stime) });
  541. }
  542. //校级活动列表
  543. case bool when $"{grant_type}".Equals("list-school", StringComparison.OrdinalIgnoreCase):
  544. {
  545. if (!string.IsNullOrWhiteSpace(school)) {
  546. School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  547. List<Activity> activities = new List<Activity>();
  548. string yearSql = $" and c.year={DateTimeOffset.Now.Year}";
  549. if (request.TryGetProperty("year", out JsonElement _year))
  550. {
  551. yearSql = $" and c.year={_year}";
  552. }
  553. //获取开放的
  554. {
  555. //完全开放 所有的学校
  556. string sqlOpen = $"select value c from c where c.scope='public' {yearSql} and (c.publish=1 or c.publish=2 ) and( ARRAY_LENGTH(c.invitedSchools)=0 or IS_DEFINED(c.invitedSchools) = false ) ";
  557. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  558. activities.AddRange(resultOpen.list);
  559. //部分学校
  560. string sqlSchool = $"select value c from c join s in c.invitedSchools where c.scope='public' {yearSql} and (c.publish=1 or c.publish=2 ) and s.id='{school}' ";
  561. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  562. resultSchool.list.ForEach(z => {
  563. var confirmedSchool = z.confirmedSchools.Find(z => z.id.Equals(school));
  564. if (confirmedSchool==null)
  565. {
  566. z.confirmedSchools.Add(new ActivityConfirmedSchool
  567. {
  568. id=schoolbase.id,
  569. name=schoolbase.name,
  570. picture=schoolbase.picture,
  571. status=0
  572. });
  573. }
  574. });
  575. activities.AddRange(resultSchool.list);
  576. }
  577. //获取区级下放的
  578. {
  579. if (!string.IsNullOrWhiteSpace(schoolbase.areaId)) {
  580. //区级所有学校
  581. string sqlOpen = $"select value c from c where c.scope='area'{yearSql} and (c.publish=1 or c.publish=2 ) and c.owner='{schoolbase.areaId}' and( ARRAY_LENGTH(c.invitedSchools)=0 or IS_DEFINED(c.invitedSchools) = false) ";
  582. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  583. resultOpen.list.ForEach(z => {
  584. var confirmedSchool = z.confirmedSchools.Find(z => z.id.Equals(school));
  585. if (confirmedSchool==null)
  586. {
  587. z.confirmedSchools.Add(new ActivityConfirmedSchool
  588. {
  589. id=schoolbase.id,
  590. name=schoolbase.name,
  591. picture=schoolbase.picture,
  592. status=0
  593. });
  594. }
  595. });
  596. activities.AddRange(resultOpen.list);
  597. //区级部分学校
  598. string sqlSchool = $"select value c from c join s in c.invitedSchools where c.scope='area'{yearSql} and (c.publish=1 or c.publish=2 ) and c.owner='{schoolbase.areaId}' and s.id='{school}' ";
  599. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  600. resultSchool.list.ForEach(z => {
  601. var confirmedSchool = z.confirmedSchools.Find(z => z.id.Equals(school));
  602. if (confirmedSchool==null)
  603. {
  604. z.confirmedSchools.Add(new ActivityConfirmedSchool
  605. {
  606. id=schoolbase.id,
  607. name=schoolbase.name,
  608. picture=schoolbase.picture,
  609. status=0
  610. });
  611. }
  612. });
  613. activities.AddRange(resultSchool.list);
  614. }
  615. }
  616. //获取学校自己的
  617. {
  618. string sqlSchool = $"select value c from c where c.scope='school'{yearSql} and c.owner='{school}' ";
  619. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  620. activities.AddRange(resultSchool.list);
  621. }
  622. activities.ForEach(z => {
  623. var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(z.owner, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
  624. z.sas=blob_sas;
  625. });
  626. return Ok(new { activities = activities.OrderByDescending(z => z.stime) });
  627. }
  628. break;
  629. }
  630. //教师活动列表
  631. case bool when $"{grant_type}".Equals("list-teacher", StringComparison.OrdinalIgnoreCase):
  632. {
  633. List<TeacherActivityDto> activities = await TeacherActivityList(request, tmdid);
  634. return Ok(new { activities = activities.OrderByDescending(z => z.stime) });
  635. }
  636. //读取优课评选模块及评审规则
  637. case bool when $"{grant_type}".Equals("read-contest", StringComparison.OrdinalIgnoreCase):
  638. {
  639. Contest contest = null;
  640. ReviewRuleTree reviewRule = null;
  641. if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
  642. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Contest"));
  643. if (response.Status==200) {
  644. contest= JsonDocument.Parse(response.Content).RootElement.ToObject<Contest>();
  645. if (contest.modules.Contains("review")) {
  646. Azure.Response reviewRuleResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("ReviewRule-disposable"));
  647. if (reviewRuleResponse.Status==200) {
  648. ReviewRule reviewRuleDB = JsonDocument.Parse(reviewRuleResponse.Content).RootElement.ToObject<ReviewRule>();
  649. var tree = ActivityService.ListToTree(reviewRuleDB.configs);
  650. reviewRule=new ReviewRuleTree
  651. {
  652. id=reviewRuleDB.id,
  653. name= reviewRuleDB.name,
  654. owner= reviewRuleDB.owner,
  655. sourceName= reviewRuleDB.sourceName,
  656. trees=tree,
  657. desc=reviewRuleDB.desc
  658. };
  659. }
  660. }
  661. }
  662. return Ok(new { code = 200, contest, reviewRule });
  663. }
  664. //获取评审的模板列表
  665. case bool when $"{grant_type}".Equals("rule-list", StringComparison.OrdinalIgnoreCase):
  666. {
  667. if (!request.TryGetProperty("owner", out JsonElement _owner)) return BadRequest();
  668. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ReviewRule>($"select value c from c where c.owner='{_owner}'", "ReviewRule-template");
  669. List<ReviewRuleTree> reviewRules = new List<ReviewRuleTree>();
  670. foreach (var item in result.list)
  671. {
  672. var tree = ActivityService.ListToTree(item.configs);
  673. ReviewRuleTree reviewRule = new ReviewRuleTree
  674. { id=item.id,
  675. desc=item.desc,
  676. name= item.name,
  677. owner= item.owner,
  678. sourceName= item.sourceName,
  679. trees=tree,
  680. upsertAsTemplate=1
  681. };
  682. reviewRules.Add(reviewRule);
  683. }
  684. return Ok(new { reviewRules });
  685. }
  686. //编辑当前活动评审规则
  687. case bool when $"{grant_type}".Equals("rule-update", StringComparison.OrdinalIgnoreCase):
  688. {
  689. if (!request.TryGetProperty("reviewConfig", out JsonElement _reviewConfig))
  690. {
  691. return Ok(new { code = 4, msg = "评审未配置" });
  692. }
  693. ReviewRuleTree ruleTree = _reviewConfig.ToObject<ReviewRuleTree>();
  694. if (!string.IsNullOrWhiteSpace(ruleTree.id))
  695. {
  696. Activity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemAsync<Activity>(ruleTree.id, new PartitionKey("Activity"));
  697. var reviewRuleDB = await ActivityService.UpsertReviewRule(ruleTree, activity, _azureCosmos);
  698. var tree = ActivityService.ListToTree(reviewRuleDB.configs);
  699. var reviewRule = new ReviewRuleTree
  700. {
  701. id=reviewRuleDB.id,
  702. name= reviewRuleDB.name,
  703. owner= reviewRuleDB.owner,
  704. sourceName= reviewRuleDB.sourceName,
  705. trees=tree,
  706. desc=reviewRuleDB.desc
  707. };
  708. return Ok(new { reviewRule });
  709. }
  710. else {
  711. return Ok(new { code = 5, msg = "规则不存在" });
  712. }
  713. }
  714. //删除评审规则模板
  715. case bool when $"{grant_type}".Equals("rule-delete", StringComparison.OrdinalIgnoreCase):
  716. {
  717. if (!request.TryGetProperty("ruleId", out JsonElement _ruleId))
  718. {
  719. return BadRequest();
  720. }
  721. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).DeleteItemStreamAsync(_ruleId.GetString(), new PartitionKey("ReviewRule-template"));
  722. return Ok(new { code = 200 });
  723. }
  724. //学校确认参加本次活动
  725. case bool when $"{grant_type}".Equals("school-confirm", StringComparison.OrdinalIgnoreCase):
  726. {
  727. if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
  728. if (!request.TryGetProperty("confirm", out JsonElement _confirm)) return BadRequest();
  729. if (!string.IsNullOrWhiteSpace(school)) {
  730. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Activity"));
  731. if (response.Status==200)
  732. {
  733. Activity activity = JsonDocument.Parse(response.Content).RootElement.ToObject<Activity>();
  734. if (_confirm.GetInt32()==1 ||_confirm.GetInt32()==0)
  735. {
  736. var invitedSchool = activity.invitedSchools.Find(z => z.id.Equals(school));
  737. if (invitedSchool!=null) {
  738. var confirmedSchool = activity.confirmedSchools.Find(z => z.id.Equals(school));
  739. if (confirmedSchool!=null)
  740. {
  741. confirmedSchool.status=_confirm.GetInt32();
  742. }
  743. else {
  744. School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  745. activity.confirmedSchools= new List<ActivityConfirmedSchool>() { new ActivityConfirmedSchool { id=school, status=_confirm.GetInt32(), name=schoolbase.name, picture= schoolbase.picture } };
  746. }
  747. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).UpsertItemAsync(activity, new PartitionKey("Activity"));
  748. return Ok(new { code = 200, activity });
  749. }
  750. else
  751. {
  752. return Ok(new { code = 1, msg = "该学校未被邀请!" });
  753. }
  754. }
  755. else
  756. {
  757. return Ok(new { code = 2, msg = "活动发布状态错误!" });
  758. }
  759. }
  760. }
  761. break;
  762. }
  763. //发布或取消发布活动
  764. case bool when $"{grant_type}".Equals("update-publish", StringComparison.OrdinalIgnoreCase):
  765. {
  766. if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
  767. if (!request.TryGetProperty("publish", out JsonElement _publish)) return BadRequest();
  768. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Activity"));
  769. if (response.Status==200)
  770. {
  771. Activity activity = JsonDocument.Parse(response.Content).RootElement.ToObject<Activity>();
  772. if (_publish.GetInt32()==1 ||_publish.GetInt32()==0)
  773. {
  774. activity.publish=_publish.GetInt32();
  775. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).UpsertItemAsync(activity, new PartitionKey("Activity"));
  776. return Ok(new { code = 200, activity });
  777. }
  778. else {
  779. return Ok(new { code = 2, msg = "活动发布状态错误!" });
  780. }
  781. }
  782. else {
  783. return Ok(new { code = 1, msg = "活动不存在" });
  784. }
  785. }
  786. //邀请教师参加本次活动或移除教师参加活动
  787. case bool when $"{grant_type}".Equals("invite-remove-teachers", StringComparison.OrdinalIgnoreCase):
  788. {
  789. if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
  790. request.TryGetProperty("invite", out JsonElement _invite);
  791. request.TryGetProperty("remove", out JsonElement _remove);
  792. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Activity"));
  793. if (response.Status==200)
  794. {
  795. Activity activity = JsonDocument.Parse(response.Content).RootElement.ToObject<Activity>();
  796. if (activity.joinMode.Equals("invite"))
  797. {
  798. var confirmedSchool = activity.confirmedSchools.Find(z => z.id.Equals(school) && z.status==1);
  799. if (confirmedSchool!= null || activity.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
  800. {
  801. List<InviteTeachers> inviteTeachersInvalid = new List<InviteTeachers>();
  802. List<InviteTeachers> removeTeachersInvalid = new List<InviteTeachers>();
  803. ActivityTeacher activityTeacher = null;
  804. Azure.Response activityTeacherResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(activity.id, new PartitionKey("ActivityTeacher"));
  805. if (activityTeacherResponse.Status==200)
  806. {
  807. activityTeacher = JsonDocument.Parse(activityTeacherResponse.Content).RootElement.ToObject<ActivityTeacher>();
  808. }
  809. if (activityTeacher==null) {
  810. activityTeacher= new ActivityTeacher() { id= activity.id, code="ActivityTeacher", pk="ActivityTeacher" };
  811. }
  812. if (_invite.ValueKind.Equals(JsonValueKind.Array)) {
  813. List<InviteTeachers> inviteTeachers = _invite.ToObject<List<InviteTeachers>>();
  814. foreach (var invite in inviteTeachers) {
  815. if (string.IsNullOrWhiteSpace(invite.school) || !invite.school.Equals(school)) {
  816. inviteTeachersInvalid.Add(invite);
  817. continue;
  818. }
  819. var inviteTeacher = activityTeacher.inviteTeachers.Find(z => z.id.Equals(invite.id));
  820. if (inviteTeacher==null)
  821. {
  822. activityTeacher.inviteTeachers.Add(invite);
  823. }
  824. else {
  825. inviteTeacher=invite;
  826. }
  827. }
  828. }
  829. if (_remove.ValueKind.Equals(JsonValueKind.Array)) {
  830. List<InviteTeachers> removeTeachers = _remove.ToObject<List<InviteTeachers>>();
  831. foreach (var remove in removeTeachers)
  832. {
  833. if (string.IsNullOrWhiteSpace(remove.school) || !remove.school.Equals(school))
  834. {
  835. removeTeachersInvalid.Add(remove);
  836. continue;
  837. }
  838. activityTeacher.inviteTeachers.RemoveAll(z => remove.id.Equals(z.id));
  839. }
  840. }
  841. var teachers = activityTeacher.inviteTeachers.FindAll(z => z.school.Equals(school));
  842. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(activityTeacher, new PartitionKey("ActivityTeacher"));
  843. return Ok(new { inviteTeachers = teachers, inviteTeachersInvalid, removeTeachersInvalid });
  844. }
  845. else
  846. {
  847. return Ok(new { code = 2, msg = "学校未确认,暂不能邀请教师" });
  848. }
  849. }
  850. else {
  851. return Ok(new { code = 3, msg = "活动不是邀请制。" });
  852. }
  853. }
  854. else
  855. {
  856. return Ok(new { code = 1, msg = "活动不存在" });
  857. }
  858. }
  859. //获取邀请的教师列表
  860. case bool when $"{grant_type}".Equals("invited-teachers", StringComparison.OrdinalIgnoreCase):
  861. {
  862. string owner = string.Empty;
  863. if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
  864. request.TryGetProperty("activityOwner", out JsonElement _activityOwner);
  865. if (string.IsNullOrWhiteSpace($"{_activityOwner}"))
  866. {
  867. if (!string.IsNullOrWhiteSpace(school))
  868. {
  869. owner=school;
  870. }
  871. }
  872. else {
  873. owner=$"{_activityOwner}";
  874. }
  875. Activity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemAsync<Activity>(_activityId.GetString(), new PartitionKey("Activity"));
  876. int isAll = 0;
  877. if (!string.IsNullOrWhiteSpace(owner)) {
  878. if (activity.owner.Equals(owner)) {
  879. isAll = 1;
  880. }
  881. }
  882. List<InviteTeachers> inviteTeachers = new List<InviteTeachers>();
  883. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("ActivityTeacher"));
  884. if (response.Status==200) {
  885. ActivityTeacher activityTeacher = JsonDocument.Parse(response.Content).RootElement.ToObject<ActivityTeacher>();
  886. if (isAll==1)
  887. {
  888. if (activityTeacher.inviteTeachers.IsNotEmpty()) {
  889. inviteTeachers.AddRange(activityTeacher.inviteTeachers);
  890. }
  891. }
  892. else
  893. {
  894. if (!string.IsNullOrWhiteSpace(school))
  895. {
  896. var teachers = activityTeacher.inviteTeachers.FindAll(z => !string.IsNullOrWhiteSpace(z.school) && z.school.Equals(school));
  897. if (teachers.IsNotEmpty()) {
  898. inviteTeachers.AddRange(teachers);
  899. }
  900. }
  901. }
  902. }
  903. return Ok(new { inviteTeachers });
  904. }
  905. //导入评审专家
  906. case bool when $"{grant_type}".Equals("add-remove-experts", StringComparison.OrdinalIgnoreCase):
  907. {
  908. if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
  909. List<Expert> upsert_experts = new List<Expert>();
  910. List<Expert> remove_experts = new List<Expert>();
  911. if (request.TryGetProperty("upsert_experts", out JsonElement _upsert_experts) && _upsert_experts.ValueKind.Equals(JsonValueKind.Array)) {
  912. upsert_experts = _upsert_experts.ToObject<List<Expert>>();
  913. }
  914. if (request.TryGetProperty("remove_experts", out JsonElement _remove_experts) && _remove_experts.ValueKind.Equals(JsonValueKind.Array))
  915. {
  916. remove_experts = _remove_experts.ToObject<List<Expert>>();
  917. }
  918. ActivityExpert activityExpert = null;
  919. if (upsert_experts.IsNotEmpty()) {
  920. var tmdids = upsert_experts.Where(x => !string.IsNullOrWhiteSpace(x.tmdid)).Select(z => z.tmdid);
  921. var phones = upsert_experts.Where(x => !string.IsNullOrWhiteSpace(x.mobile)).Select(z => z.mobile);
  922. var emails = upsert_experts.Where(x => !string.IsNullOrWhiteSpace(x.email)).Select(z => z.email);
  923. List<string> keys = new List<string>();
  924. if (tmdids.Any())
  925. {
  926. keys.AddRange(tmdids);
  927. }
  928. if (phones.Any())
  929. {
  930. keys.AddRange(phones);
  931. }
  932. if (emails.Any())
  933. {
  934. keys.AddRange(emails);
  935. }
  936. upsert_experts.ForEach(x => { x.status = 0; x.iname = x.name; x.name = null; });
  937. List<CoreUser> coreUsers = new List<CoreUser>();
  938. if (keys.Any())
  939. {
  940. try
  941. {
  942. var content = new StringContent(keys.ToJsonString(), Encoding.UTF8, "application/json");
  943. string json = await _coreAPIHttpService.GetUserInfos(content);
  944. if (!string.IsNullOrWhiteSpace(json))
  945. {
  946. coreUsers = json.ToObject<List<CoreUser>>();
  947. }
  948. }
  949. catch (Exception ex)
  950. {
  951. await _dingDing.SendBotMsg($"{_option.Location},导入名单时,查验key信息错误{ex.Message}\n{ex.StackTrace}\n\n{keys.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
  952. }
  953. }
  954. if (coreUsers.IsNotEmpty())
  955. {
  956. foreach (var t in upsert_experts)
  957. {
  958. if (!string.IsNullOrWhiteSpace(t.tmdid))
  959. {
  960. CoreUser coreUser = coreUsers.Find(x => x.id.Equals(t.tmdid));
  961. if (coreUser != null)
  962. {
  963. t.id = coreUser.id;
  964. t.name = coreUser.name;
  965. t.picture = coreUser.picture;
  966. t.tmdid = coreUser.id;
  967. if (!string.IsNullOrWhiteSpace(coreUser.mobile))
  968. {
  969. t.mobile = coreUser.mobile;
  970. }
  971. if (!string.IsNullOrWhiteSpace(coreUser.mail))
  972. {
  973. t.email = coreUser.mail;
  974. }
  975. }
  976. }
  977. if (string.IsNullOrWhiteSpace(t.id))
  978. {
  979. if (!string.IsNullOrWhiteSpace(t.mobile))
  980. {
  981. CoreUser coreUser = coreUsers.Find(x => !string.IsNullOrWhiteSpace(x.mobile) && x.mobile.Equals(t.mobile));
  982. if (coreUser != null)
  983. {
  984. t.id = coreUser.id;
  985. t.name = coreUser.name;
  986. t.picture = coreUser.picture;
  987. t.tmdid = coreUser.id;
  988. if (!string.IsNullOrWhiteSpace(coreUser.mobile))
  989. {
  990. t.mobile = coreUser.mobile;
  991. }
  992. if (!string.IsNullOrWhiteSpace(coreUser.mail))
  993. {
  994. t.email = coreUser.mail;
  995. }
  996. }
  997. }
  998. }
  999. if (string.IsNullOrWhiteSpace(t.id))
  1000. {
  1001. if (!string.IsNullOrWhiteSpace(t.email))
  1002. {
  1003. CoreUser coreUser = coreUsers.Find(x => !string.IsNullOrWhiteSpace(x.mail) && x.mail.Equals(t.email));
  1004. if (coreUser != null)
  1005. {
  1006. t.id = coreUser.id;
  1007. t.name = coreUser.name;
  1008. t.picture = coreUser.picture;
  1009. t.tmdid = coreUser.id;
  1010. if (!string.IsNullOrWhiteSpace(coreUser.mobile))
  1011. {
  1012. t.mobile = coreUser.mobile;
  1013. }
  1014. if (!string.IsNullOrWhiteSpace(coreUser.mail))
  1015. {
  1016. t.email = coreUser.mail;
  1017. }
  1018. }
  1019. }
  1020. }
  1021. }
  1022. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync($"{_activityId}", new PartitionKey("ActivityExpert"));
  1023. if (response.Status == 200)
  1024. {
  1025. activityExpert = JsonDocument.Parse(response.Content).RootElement.Deserialize<ActivityExpert>();
  1026. upsert_experts.ForEach(x =>
  1027. {
  1028. Expert tch = null;
  1029. if (string.IsNullOrWhiteSpace(x.id))
  1030. {
  1031. tch = activityExpert.experts.Find(t => !string.IsNullOrWhiteSpace(t.iname) && t.iname.Equals(x.iname));
  1032. }
  1033. else
  1034. {
  1035. tch = activityExpert.experts.Find(t => !string.IsNullOrWhiteSpace(x.id) && !string.IsNullOrWhiteSpace(t.id) && t.id.Equals(x.id));
  1036. }
  1037. if (tch != null)
  1038. {
  1039. tch.status = x.status;
  1040. tch.name = x.name;
  1041. tch.iname = x.iname;
  1042. tch.picture = x.picture;
  1043. tch.mobile = x.mobile;
  1044. tch.tmdid = x.tmdid;
  1045. tch.email = x.email;
  1046. tch.id = x.id;
  1047. tch.school = x.school;
  1048. //直接替换更新
  1049. tch.modules=x.modules;
  1050. tch.subjects=x.subjects;
  1051. // x.modules.ForEach(y => {
  1052. // if (!tch.modules.Contains(y))
  1053. // {
  1054. // tch.modules.Add(y);
  1055. // }
  1056. // });
  1057. // x.subjects.ForEach(r => {
  1058. // if (!string.IsNullOrWhiteSpace(r.subject) && !string.IsNullOrWhiteSpace(r.period))
  1059. // {
  1060. // var sub = tch.subjects.Find(x => !string.IsNullOrWhiteSpace(x.subject) && !string.IsNullOrWhiteSpace(x.period) && x.subject.Equals(r.subject) && x.period.Equals(r.period));
  1061. // if (sub == null)
  1062. // {
  1063. // tch.subjects.Add(r);
  1064. // }
  1065. // }
  1066. // if (!string.IsNullOrWhiteSpace(r.subject) && string.IsNullOrWhiteSpace(r.period))
  1067. // {
  1068. // var sub = tch.subjects.Find(a => !string.IsNullOrWhiteSpace(a.subject) && string.IsNullOrWhiteSpace(a.period) && a.subject.Equals(r.subject));
  1069. // if (sub == null)
  1070. // {
  1071. // tch.subjects.Add(r);
  1072. // }
  1073. // }
  1074. // });
  1075. }
  1076. else
  1077. {
  1078. activityExpert.experts.Add(new Expert
  1079. {
  1080. status = x.status,
  1081. name = x.name,
  1082. iname = x.iname,
  1083. picture = x.picture,
  1084. mobile = x.mobile,
  1085. tmdid = x.tmdid,
  1086. email = x.email,
  1087. id = x.id,
  1088. title = x.title,
  1089. subjects = x.subjects,
  1090. modules = x.modules,
  1091. school=x.school,
  1092. });
  1093. }
  1094. });
  1095. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
  1096. }
  1097. else
  1098. {
  1099. activityExpert = new ActivityExpert { id = $"{_activityId}", code = "ActivityExpert", pk = "ActivityExpert", experts = upsert_experts };
  1100. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
  1101. }
  1102. }
  1103. else
  1104. {
  1105. activityExpert = new ActivityExpert { id = $"{_activityId}", code = "ActivityExpert", pk = "ActivityExpert", experts = upsert_experts };
  1106. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
  1107. }
  1108. if (remove_experts.IsNotEmpty()) {
  1109. if (activityExpert == null)
  1110. {
  1111. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync($"{_activityId}", new PartitionKey("ActivityExpert"));
  1112. if (response.Status == 200) {
  1113. activityExpert = JsonDocument.Parse(response.Content).RootElement.Deserialize<ActivityExpert>();
  1114. }
  1115. }
  1116. if (activityExpert!=null) {
  1117. remove_experts.ForEach(z => {
  1118. if (!string.IsNullOrWhiteSpace(z.id))
  1119. {
  1120. activityExpert.experts.RemoveAll(x => !string.IsNullOrWhiteSpace(x.id) && x.id.Equals(z.id));
  1121. }
  1122. else {
  1123. if (!string.IsNullOrWhiteSpace(z.mobile)) {
  1124. activityExpert.experts.RemoveAll(x => !string.IsNullOrWhiteSpace(x.mobile) && x.mobile.Equals(z.mobile));
  1125. }
  1126. if (!string.IsNullOrWhiteSpace(z.email))
  1127. {
  1128. activityExpert.experts.RemoveAll(x => !string.IsNullOrWhiteSpace(x.email) && x.email.Equals(z.email));
  1129. }
  1130. if (!string.IsNullOrWhiteSpace(z.tmdid))
  1131. {
  1132. activityExpert.experts.RemoveAll(x => !string.IsNullOrWhiteSpace(x.tmdid) && x.tmdid.Equals(z.tmdid));
  1133. }
  1134. }
  1135. });
  1136. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
  1137. }
  1138. }
  1139. }
  1140. return Ok(new { activityExpert,code=200 });
  1141. }
  1142. //评审专家列表
  1143. case bool when $"{grant_type}".Equals("list-experts", StringComparison.OrdinalIgnoreCase):
  1144. {
  1145. if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
  1146. ActivityExpert activityExpert = null;
  1147. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync($"{_activityId}", new PartitionKey("ActivityExpert"));
  1148. if (response.Status == 200) {
  1149. bool change = false;
  1150. activityExpert = JsonDocument.Parse(response.Content).RootElement.Deserialize<ActivityExpert>();
  1151. var experts = activityExpert.experts.FindAll(z => string.IsNullOrWhiteSpace(z.id));
  1152. var tmdids = experts.Where(x => !string.IsNullOrWhiteSpace(x.tmdid)).Select(z => z.tmdid);
  1153. var phones = experts.Where(x => !string.IsNullOrWhiteSpace(x.mobile)).Select(z => z.mobile);
  1154. var emails = experts.Where(x => !string.IsNullOrWhiteSpace(x.email)).Select(z => z.email);
  1155. List<string> keys = new List<string>();
  1156. if (tmdids.Any())
  1157. {
  1158. keys.AddRange(tmdids);
  1159. }
  1160. if (phones.Any())
  1161. {
  1162. keys.AddRange(phones);
  1163. }
  1164. if (emails.Any())
  1165. {
  1166. keys.AddRange(emails);
  1167. }
  1168. List<CoreUser> coreUsers = new List<CoreUser>();
  1169. if (keys.Any())
  1170. {
  1171. try
  1172. {
  1173. var content = new StringContent(keys.ToJsonString(), Encoding.UTF8, "application/json");
  1174. string json = await _coreAPIHttpService.GetUserInfos(content);
  1175. if (!string.IsNullOrWhiteSpace(json))
  1176. {
  1177. coreUsers = json.ToObject<List<CoreUser>>();
  1178. }
  1179. }
  1180. catch (Exception ex)
  1181. {
  1182. await _dingDing.SendBotMsg($"{_option.Location},导入名单时,查验key信息错误{ex.Message}\n{ex.StackTrace}\n\n{keys.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
  1183. }
  1184. }
  1185. if (coreUsers.IsNotEmpty())
  1186. {
  1187. foreach (var t in experts)
  1188. {
  1189. if (!string.IsNullOrWhiteSpace(t.tmdid))
  1190. {
  1191. CoreUser coreUser = coreUsers.Find(x => x.id.Equals(t.tmdid));
  1192. if (coreUser != null)
  1193. {
  1194. change=true;
  1195. t.id = coreUser.id;
  1196. t.name = coreUser.name;
  1197. t.picture = coreUser.picture;
  1198. t.tmdid = coreUser.id;
  1199. if (!string.IsNullOrWhiteSpace(coreUser.mobile))
  1200. {
  1201. t.mobile = coreUser.mobile;
  1202. }
  1203. if (!string.IsNullOrWhiteSpace(coreUser.mail))
  1204. {
  1205. t.email = coreUser.mail;
  1206. }
  1207. }
  1208. }
  1209. if (string.IsNullOrWhiteSpace(t.id))
  1210. {
  1211. if (!string.IsNullOrWhiteSpace(t.mobile))
  1212. {
  1213. CoreUser coreUser = coreUsers.Find(x => !string.IsNullOrWhiteSpace(x.mobile) && x.mobile.Equals(t.mobile));
  1214. if (coreUser != null)
  1215. {
  1216. change=true;
  1217. t.id = coreUser.id;
  1218. t.name = coreUser.name;
  1219. t.picture = coreUser.picture;
  1220. t.tmdid = coreUser.id;
  1221. if (!string.IsNullOrWhiteSpace(coreUser.mobile))
  1222. {
  1223. t.mobile = coreUser.mobile;
  1224. }
  1225. if (!string.IsNullOrWhiteSpace(coreUser.mail))
  1226. {
  1227. t.email = coreUser.mail;
  1228. }
  1229. }
  1230. }
  1231. }
  1232. if (string.IsNullOrWhiteSpace(t.id))
  1233. {
  1234. if (!string.IsNullOrWhiteSpace(t.email))
  1235. {
  1236. CoreUser coreUser = coreUsers.Find(x => !string.IsNullOrWhiteSpace(x.mail) && x.mail.Equals(t.email));
  1237. if (coreUser != null)
  1238. {
  1239. change=true;
  1240. t.id = coreUser.id;
  1241. t.name = coreUser.name;
  1242. t.picture = coreUser.picture;
  1243. t.tmdid = coreUser.id;
  1244. if (!string.IsNullOrWhiteSpace(coreUser.mobile))
  1245. {
  1246. t.mobile = coreUser.mobile;
  1247. }
  1248. if (!string.IsNullOrWhiteSpace(coreUser.mail))
  1249. {
  1250. t.email = coreUser.mail;
  1251. }
  1252. }
  1253. }
  1254. }
  1255. }
  1256. }
  1257. if (change) {
  1258. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
  1259. }
  1260. }
  1261. return Ok(new { activityExpert, code = 200 });
  1262. }
  1263. }
  1264. } catch (Exception ex)
  1265. {
  1266. await _dingDing.SendBotMsg($"{ex.Message}\n{ex.StackTrace}",GroupNames.成都开发測試群組);
  1267. return Ok(new {code=500, msg =ex.Message });
  1268. }
  1269. return Ok();
  1270. }
  1271. private async Task<List<TeacherActivityDto>> TeacherActivityList(JsonElement request, string tmdid)
  1272. {
  1273. List<TeacherActivityDto> activities = new List<TeacherActivityDto>();
  1274. HashSet<string> inviteActivityIds = new HashSet<string>();
  1275. string yearSql = $" and c.year={DateTimeOffset.Now.Year}";
  1276. if (request.TryGetProperty("year", out JsonElement _year))
  1277. {
  1278. yearSql = $" and c.year={_year}";
  1279. }
  1280. //先获取邀请制的
  1281. string sqlInvite = $"select value c from c join t in c.inviteTeachers where t.id='{tmdid}'";
  1282. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityTeacher>(sqlInvite, "ActivityTeacher");
  1283. inviteActivityIds= result.list.Select(z => z.id).ToHashSet();
  1284. if (inviteActivityIds.Count>0)
  1285. {
  1286. string sqlActivity = $"select value c from c where c.id in ({string.Join(",", inviteActivityIds.Select(z => $"'{z}'"))}) {yearSql} ";
  1287. var resultActivity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlInvite, "Activity");
  1288. if (resultActivity.list.IsNotEmpty())
  1289. {
  1290. activities.AddRange(resultActivity.list);
  1291. }
  1292. }
  1293. Teacher teacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<Teacher>(tmdid, new PartitionKey("Base"));
  1294. string schoolOwnerIn = string.Empty;
  1295. string schoolIdIn = string.Empty;
  1296. if (teacher.schools.IsNotEmpty())
  1297. {
  1298. schoolIdIn = $"and i.id in ({string.Join(",", teacher.schools.Select(z => $"'{z.schoolId}'"))})";
  1299. schoolOwnerIn= $"and c.owner in ({string.Join(",", teacher.schools.Select(z => $"'{z.schoolId}'"))})";
  1300. }
  1301. //获取开放的
  1302. {
  1303. //完全开放 所有的学校
  1304. string sqlOpen = $"select value c from c where c.scope='public' and (c.publish=1 or c.publish=2 ) and( ARRAY_LENGTH(c.invitedSchools)=0 or IS_DEFINED(c.invitedSchools) = false ) {yearSql} ";
  1305. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlOpen, "Activity");
  1306. activities.AddRange(resultOpen.list);
  1307. if (!string.IsNullOrWhiteSpace(schoolIdIn))
  1308. { //部分学校
  1309. string sqlSchool = $"select value c from c join i in c.confirmedSchools where c.scope='public' and c.joinMode='enroll' and (c.publish=1 or c.publish=2 ) and i.status=1 {yearSql} {schoolIdIn} ";
  1310. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlSchool, "Activity");
  1311. activities.AddRange(resultSchool.list);
  1312. }
  1313. }
  1314. string areaOwnerIn = string.Empty;
  1315. var hasAreaSchools = teacher.schools.FindAll(z => !string.IsNullOrWhiteSpace(z.areaId));
  1316. if (hasAreaSchools.IsNotEmpty())
  1317. {
  1318. areaOwnerIn = $"and c.owner in ({string.Join(",", hasAreaSchools.Select(z => $"'{z.areaId}'"))})";
  1319. schoolIdIn = $"and i.id in ({string.Join(",", hasAreaSchools.Select(z => $"'{z.schoolId}'"))})";
  1320. }
  1321. //获取所有区级的
  1322. if (!string.IsNullOrWhiteSpace(areaOwnerIn) && !string.IsNullOrEmpty(schoolIdIn))
  1323. {
  1324. string sqlOpen = $"select value c from c join i in c.confirmedSchools where c.scope='area' and c.joinMode='enroll' and (c.publish=1 or c.publish=2 ) and i.status=1 {yearSql} {areaOwnerIn} {schoolIdIn} ";
  1325. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlOpen, "Activity");
  1326. activities.AddRange(resultOpen.list);
  1327. }
  1328. //获取所有学校的
  1329. if (!string.IsNullOrWhiteSpace(schoolOwnerIn))
  1330. {
  1331. string sqlSchool = $"select value c from c where c.scope='school' and c.joinMode='enroll' and (c.publish=1 or c.publish=2 ) {yearSql} {schoolOwnerIn} ";
  1332. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<TeacherActivityDto>(sqlSchool, "Activity");
  1333. activities.AddRange(resultSchool.list);
  1334. }
  1335. activities.ForEach(z =>
  1336. {
  1337. var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(z.owner, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
  1338. z.sas=blob_sas;
  1339. });
  1340. return activities;
  1341. }
  1342. /// <summary>
  1343. /// portal站的
  1344. /// </summary>
  1345. /// <param name="request"></param>
  1346. /// <returns></returns>
  1347. [ProducesDefaultResponseType]
  1348. [HttpPost("login-portal")]
  1349. public async Task<IActionResult> LoginPortal(JsonElement request) {
  1350. string tmdid = null;
  1351. if (!request.TryGetProperty("route", out JsonElement _route)) return BadRequest();
  1352. request.TryGetProperty("ticket", out JsonElement _ticket);
  1353. request.TryGetProperty("token", out JsonElement _token);
  1354. TeacherInfo teacherInfo = null;
  1355. object name= null, picture =null;
  1356. string head_lang = "";
  1357. (string ip, string region) = await LoginService.LoginIp(HttpContext, _searcher);
  1358. if (!string.IsNullOrWhiteSpace($"{_ticket}")) {
  1359. var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
  1360. (HttpStatusCode statusCode, CoreAPIToken token) = await _coreAPIHttpService.GetCoreAPIoAuth2Token(
  1361. new Dictionary<string, object> { { "client_id", clientID }, { "grant_type", "authorization_code" }, { "code", _ticket.GetString() } }, _option.Location, _configuration, _dingDing);
  1362. if (statusCode.Equals(HttpStatusCode.OK))
  1363. {
  1364. var jwt = new JwtSecurityToken(token.id_token);
  1365. tmdid = jwt.Payload.Sub;
  1366. if (HttpContext.Request.Headers.TryGetValue("lang", out var _lang))
  1367. {
  1368. head_lang = $"{_lang}";
  1369. }
  1370. jwt.Payload.TryGetValue("name", out name);
  1371. jwt.Payload.TryGetValue("picture", out picture);
  1372. jwt.Payload.TryGetValue("lang", out object _jwtlang);
  1373. head_lang = !string.IsNullOrWhiteSpace($"{_jwtlang}") ? $"{_jwtlang}" : head_lang;
  1374. }
  1375. }
  1376. if (tmdid == null )
  1377. {
  1378. if (!string.IsNullOrWhiteSpace($"{_token}"))
  1379. {
  1380. var jwt = new JwtSecurityToken(_token.GetString());
  1381. if (JwtAuthExtension.ValidateAuthTokenRefresh(_token.GetString(), _option.JwtSecretKey))
  1382. {
  1383. tmdid = jwt.Payload.Sub;
  1384. if (HttpContext.Request.Headers.TryGetValue("lang", out var _lang))
  1385. {
  1386. head_lang = $"{_lang}";
  1387. }
  1388. jwt.Payload.TryGetValue("name", out name);
  1389. jwt.Payload.TryGetValue("picture", out picture);
  1390. jwt.Payload.TryGetValue("lang", out object _jwtlang);
  1391. head_lang = !string.IsNullOrWhiteSpace($"{_jwtlang}") ? $"{_jwtlang}" : head_lang;
  1392. }
  1393. else { return Ok(new { code = 2, msg = "Token验证失败" }); }
  1394. }
  1395. else { return Ok(new { code = 3, msg = "凭证验证失败" }); }
  1396. }
  1397. teacherInfo = await TeacherService.TeacherInfoLite(_azureCosmos, $"{name}", $"{picture}", tmdid, _azureStorage, _option, _azureRedis, ip, _httpTrigger, head_lang);
  1398. string sql = $"select value c from c where c.route='{_route}'";
  1399. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsite>(sql, "ActivityWebsite");
  1400. ActivityWebsite website = null;
  1401. if (result.list.Count>1)
  1402. {
  1403. return Ok(new { code = 1, msg = "路由匹配多个区校" });
  1404. }
  1405. else
  1406. {
  1407. if (result.list.Count==1)
  1408. {
  1409. website= result.list[0];
  1410. }
  1411. }
  1412. List<string > roles= new List<string>() { "teacher" };
  1413. CoreUser coreUser = await _coreAPIHttpService.GetUserInfo(new Dictionary<string, string> { { "key", teacherInfo.teacher.id } }, _option.Location, _configuration);
  1414. string sqlExpert = $"select value c from c join e in c.experts where e.id='{teacherInfo.teacher.id}'";
  1415. if (!string.IsNullOrWhiteSpace(coreUser.mobile)) {
  1416. sqlExpert=$" {sqlExpert } or e.mobile='{coreUser.mobile}' ";
  1417. }
  1418. var resultActivityExpert = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityExpert>(sqlExpert, "ActivityExpert",pageSize:1);
  1419. if (resultActivityExpert.list.IsNotEmpty()) {
  1420. roles.Add("expert");
  1421. }
  1422. var payload = new JwtPayload {
  1423. { JwtRegisteredClaimNames.Iss, _option.HostName }, //發行者
  1424. { JwtRegisteredClaimNames.Sub, teacherInfo.teacher.id }, // 用戶ID
  1425. { JwtRegisteredClaimNames.Exp,DateTimeOffset.UtcNow.AddHours(2).ToUnixTimeSeconds()}, // 到期的時間,必須為數字
  1426. { "name",name}, // 用戶的顯示名稱
  1427. { "picture",picture}, // 用戶頭像
  1428. { "roles", roles.ToArray()}, // 登入者的角色,角色類型 (Admin、Teacher、Student)
  1429. { JwtRegisteredClaimNames.Website,website?.route},
  1430. };
  1431. var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_option.JwtSecretKey));
  1432. var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);
  1433. var header = new JwtHeader(signingCredentials);
  1434. var secToken = new JwtSecurityToken(header, payload);
  1435. // 產出所需要的 JWT securityToken 物件,並取得序列化後的 Token 結果(字串格式)
  1436. var tokenHandler = new JwtSecurityTokenHandler();
  1437. var serializeToken = tokenHandler.WriteToken(secToken);
  1438. var core_clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
  1439. var core_clientSecret = _configuration.GetValue<string>("HaBookAuth:CoreService:clientSecret");
  1440. string location= _option.Location;
  1441. if (location.Contains("China"))
  1442. {
  1443. location = "China";
  1444. }
  1445. else if (location.Contains("Global"))
  1446. {
  1447. location = "Global";
  1448. }
  1449. var access_token = await CoreTokenExtensions.CreateAccessToken(core_clientID, core_clientSecret, location);
  1450. return Ok(new { auth_token = new { access_token= access_token .AccessToken, token_type= access_token.TokenType, expires_in= access_token.ExpiresOn}, code =200,token =serializeToken, schools= teacherInfo.teacher.schools.Where(z=>z.status.Equals("join"))});
  1451. }
  1452. /// <summary>
  1453. ///
  1454. /// </summary>
  1455. /// <param name="request"></param>
  1456. /// <returns></returns>
  1457. [ProducesDefaultResponseType]
  1458. [HttpPost("get-website")]
  1459. public async Task<IActionResult> GetWebsite(JsonElement request) {
  1460. if (!request.TryGetProperty("route", out JsonElement _route)) return BadRequest();
  1461. string sql = $"select value c from c where c.route='{_route}'";
  1462. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsite>(sql, "ActivityWebsite");
  1463. ActivityWebsite website = null;
  1464. if (result.list.Count>1)
  1465. {
  1466. return Ok(new { code = 1, msg = "路由匹配多个区校" });
  1467. }
  1468. else
  1469. {
  1470. if (result.list.Count==1)
  1471. {
  1472. website= result.list[0];
  1473. }
  1474. }
  1475. if (website!= null)
  1476. {
  1477. List<ActivityWebsite> websites = new List<ActivityWebsite>();
  1478. if (website.route.Equals("teammodel") )
  1479. {
  1480. string sqlAll = $"select value c from c where IS_DEFINED(c.route) = true and c.route<> null and c.route<>'' ";
  1481. var resultAll = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsite>(sqlAll, "ActivityWebsite");
  1482. websites=resultAll.list;
  1483. }
  1484. return Ok(new { code = 200, website ,websites });
  1485. }
  1486. else {
  1487. return Ok(new { code = 2, msg = "未匹配分站" }) ;
  1488. }
  1489. }
  1490. /// <summary>
  1491. /// 教师在赛课模块的操作
  1492. /// </summary>
  1493. /// <param name="request"></param>
  1494. /// <returns></returns>
  1495. [ProducesDefaultResponseType]
  1496. [HttpPost("teacher-contest")]
  1497. [AuthToken(Roles = "teacher")]
  1498. #if !DEBUG
  1499. [Authorize(Roles = "IES")]
  1500. #endif
  1501. public async Task<IActionResult> Teacher(JsonElement request) {
  1502. (string tmdid, _, _, _) = HttpContext.GetAuthTokenInfo();
  1503. if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
  1504. var client = _azureCosmos.GetCosmosClient();
  1505. switch (true)
  1506. {
  1507. //教师活动列表
  1508. case bool when $"{grant_type}".Equals("create", StringComparison.OrdinalIgnoreCase):
  1509. {
  1510. List<TeacherActivityDto> activities= await TeacherActivityList(request, tmdid);
  1511. break;
  1512. }
  1513. }
  1514. return Ok();
  1515. }
  1516. /// <summary>
  1517. /// portal站的
  1518. /// </summary>
  1519. /// <param name="request"></param>
  1520. /// <returns></returns>
  1521. [ProducesDefaultResponseType]
  1522. [HttpPost("list-portal")]
  1523. public async Task<IActionResult> ListPortal(JsonElement request) {
  1524. //var authtoken = HttpContext.GetXAuth("AuthToken");
  1525. //string userid = string.Empty;
  1526. //object schoolid = null;
  1527. //if (!string.IsNullOrWhiteSpace(authtoken)) {
  1528. // var jwt = new JwtSecurityToken(authtoken);
  1529. // //TODO 此驗證IdToken先簡單檢查,後面需向Core ID新API,驗證Token
  1530. // userid= jwt.Payload.Sub;
  1531. // jwt.Payload.TryGetValue("azp", out schoolid);
  1532. //}
  1533. if (!request.TryGetProperty("route", out JsonElement _route)) return BadRequest();
  1534. List<Activity> activities = new List<Activity>();
  1535. string sql = $"select value c from c where c.route='{_route}'";
  1536. var result= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsite>(sql, "ActivityWebsite");
  1537. ActivityWebsite website = null;
  1538. if (result.list.Count>1)
  1539. {
  1540. return Ok(new { code = 1, msg = "路由匹配多个区校" });
  1541. }
  1542. else {
  1543. if (result.list.Count==1) {
  1544. website= result.list[0];
  1545. }
  1546. }
  1547. if (website!=null)
  1548. {
  1549. if (website.scope.Equals("area"))
  1550. {
  1551. //区级所有学校
  1552. string sqlOpen = $"select value c from c where c.scope='area' and (c.publish=1 or c.publish=2 ) and c.owner='{website.id}' ";
  1553. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  1554. activities.AddRange(resultOpen.list);
  1555. }
  1556. if (website.scope.Equals("school"))
  1557. {
  1558. School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(website.id, new PartitionKey("Base"));
  1559. //区级下放的
  1560. if (!string.IsNullOrWhiteSpace(schoolbase.areaId))
  1561. {
  1562. //区级所有学校
  1563. string sqlOpen = $"select value c from c join s in c.confirmedSchools where c.scope='area' and (c.publish=1 or c.publish=2 ) and c.owner='{schoolbase.areaId}' and( ARRAY_LENGTH(c.invitedSchools)=0 or IS_DEFINED(c.invitedSchools) = false) and s.id='{schoolbase.id}' and s.status=1 ";
  1564. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  1565. activities.AddRange(resultOpen.list);
  1566. //区级部分学校
  1567. string sqlSchool = $"select value c from c join i in c.invitedSchools join s in c.confirmedSchools where c.scope='area'and (c.publish=1 or c.publish=2 ) and c.owner='{schoolbase.areaId}' and i.id='{schoolbase.id}' and s.id='{schoolbase.id}' and s.status=1 ";
  1568. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  1569. activities.AddRange(resultSchool.list);
  1570. }
  1571. {
  1572. ///学校自己的
  1573. string sqlSchool = $"select value c from c where c.scope='school' and (c.publish=1 or c.publish=2 ) and c.owner='{schoolbase.id}' ";
  1574. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  1575. activities.AddRange(resultSchool.list);
  1576. }
  1577. }
  1578. //获取开放的
  1579. {
  1580. //完全开放 所有的学校
  1581. string sqlOpen = $"select value c from c where c.scope='public' and (c.publish=1 or c.publish=2 ) ";
  1582. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  1583. activities.AddRange(resultOpen.list);
  1584. }
  1585. }
  1586. return Ok(new { activities, website });
  1587. }
  1588. }
  1589. }