ActivityController.cs 104 KB

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