ActivityController.cs 124 KB

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