1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906 |
- using Azure.Cosmos;
- using Microsoft.AspNetCore.Http;
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.Extensions.Options;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.Models;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Extension;
- using Azure;
- using Microsoft.Extensions.Configuration;
- using TEAMModelOS.Filter;
- using HTEXLib.COMM.Helpers;
- using TEAMModelOS.SDK;
- using StackExchange.Redis;
- using System.Text.RegularExpressions;
- using Microsoft.AspNetCore.Authorization;
- using OpenXmlPowerTools;
- using System.IdentityModel.Tokens.Jwt;
- using Microsoft.AspNetCore.Routing;
- using Pipelines.Sockets.Unofficial.Arenas;
- using Grpc.Core;
- using static TEAMModelOS.SDK.CoreAPIHttpService;
- using Top.Api;
- using System.Net;
- using TEAMModelOS.SDK.Models.Service;
- using DocumentFormat.OpenXml.Office2010.Excel;
- using TEAMModelOS.Services;
- using OfficeOpenXml.FormulaParsing.LexicalAnalysis;
- using Azure.Storage.Sas;
- using DocumentFormat.OpenXml.Bibliography;
- using System.Runtime.Intrinsics.X86;
- using Microsoft.IdentityModel.Tokens;
- using TEAMModelOS.SDK.Models.Dtos;
- using System.Net.Http;
- using Newtonsoft.Json.Linq;
- using System.ComponentModel.DataAnnotations;
- namespace TEAMModelOS.Controllers
- {
- [ProducesResponseType(StatusCodes.Status200OK)]
- [ProducesResponseType(StatusCodes.Status400BadRequest)]
- [Route("activity")]
- [ApiController]
- public class ActivityController : ControllerBase
- {
- private AzureCosmosFactory _azureCosmos;
- private readonly DingDing _dingDing;
- private readonly CoreAPIHttpService _coreAPIHttpService;
- private readonly Option _option;
- private readonly AzureServiceBusFactory _serviceBus;
- private readonly AzureStorageFactory _azureStorage;
- private readonly AzureRedisFactory _azureRedis;
- private readonly HttpTrigger _httpTrigger;
- private readonly IPSearcher _searcher;
- public IConfiguration _configuration { get; set; }
- public ActivityController(AzureRedisFactory azureRedis, AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, CoreAPIHttpService coreAPIHttpService, AzureServiceBusFactory serviceBus, AzureStorageFactory azureStorage, IConfiguration configuration, HttpTrigger httpTrigger, IPSearcher searcher)
- {
- _azureCosmos = azureCosmos;
- _dingDing = dingDing;
- _option = option?.Value;
- _serviceBus = serviceBus;
- _configuration = configuration;
- _azureStorage = azureStorage;
- _azureRedis = azureRedis;
- _coreAPIHttpService = coreAPIHttpService;
- _httpTrigger=httpTrigger;
- _searcher=searcher;
- }
- /// <summary>
- /// 分站管理
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [AuthToken(Roles = "admin,area")]
- [HttpPost("website-manage")]
- #if !DEBUG
- [Authorize(Roles = "IES")]
- #endif
- public async Task<IActionResult> WebsiteManage(JsonElement request) {
- (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
- if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
- {
- switch (true)
- {
- case bool when $"{grant_type}".Equals("update", StringComparison.OrdinalIgnoreCase):
- {
- request.TryGetProperty("areaId", out JsonElement _areaId);
- if (!request.TryGetProperty("website", out JsonElement _website)) return BadRequest();
- ActivityWebsite website = _website.ToObject<ActivityWebsite>();
- Azure.Response teammodelResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(website.id, new PartitionKey("ActivityWebsite"));
- if (teammodelResponse.Status == 200)
- {
- ActivityWebsite activityWebsite = JsonDocument.Parse(teammodelResponse.Content).RootElement.ToObject<ActivityWebsite>();
- website.route=activityWebsite.route;
- website.pk=activityWebsite.pk;
- website.code=activityWebsite.code;
- website.scope=activityWebsite.scope;
- //不是醍摩豆学区的,不能修改是否有公开办活动权限
- if (!(string.IsNullOrWhiteSpace($"{_areaId}")&& _areaId.Equals("02944f32-f534-3397-ea56-e6f1fc6c3714"))) {
- website.allowPublic=activityWebsite.allowPublic;
- }
- }
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website ,new PartitionKey("ActivityWebsite"));
-
- return Ok(new { website,code =200});
- }
- case bool when $"{grant_type}".Equals("list", StringComparison.OrdinalIgnoreCase):
- {
- List<ActivityWebsite> websites = new List<ActivityWebsite>();
- if (!request.TryGetProperty("websiteId", out JsonElement _websiteId)) return BadRequest();
- string websiteId = _websiteId.GetString();
- if (websiteId.Equals("02944f32-f534-3397-ea56-e6f1fc6c3714", StringComparison.OrdinalIgnoreCase) )
- {
- Azure.Response teammodelResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync("teammodel", new PartitionKey("ActivityWebsite"));
- if (teammodelResponse.Status == 200)
- {
- ActivityWebsite activityWebsite = JsonDocument.Parse(teammodelResponse.Content).RootElement.ToObject<ActivityWebsite>();
- websites.Add(activityWebsite);
- }
- else {
- ActivityWebsite website = new ActivityWebsite
- {
- id="teammodel",
- pk="ActivityWebsite",
- code="ActivityWebsite",
- route="teammodel",
- scope="public",
- allowPublic=1,
- };
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website, new PartitionKey(website.code));
- websites.Add(website);
- }
- //返回其他区的。
- string sqlArea = "select value c from c ";
- var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<Area>(sqlArea, "Base-Area");
- if (result.list.IsNotEmpty()) {
- string sqlWebsite = $"select value c from c where c.id in ({string.Join(",", result.list.Select(z => $"'{z.id}'"))})";
- var resultWebsite = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsite>(sqlWebsite, "ActivityWebsite");
- foreach (var item in result.list) {
- var website = resultWebsite.list.Find(z => z.id.Equals(item.id));
- if (website!=null)
- {
- if (!string.IsNullOrWhiteSpace(item.shortCode))
- {
- bool change = false;
- if (string.IsNullOrWhiteSpace(website.route))
- {
- website.route=item.shortCode;
- change = true;
- }
- else
- {
- if (!website.route.Equals(item.shortCode))
- {
- website.route=item.shortCode;
- change = true;
- }
- }
- if (change)
- {
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website, new PartitionKey(website.code));
- }
- }
- }
- else {
- website= new ActivityWebsite
- {
- id= item.id,
- code="ActivityWebsite",
- pk="ActivityWebsite",
- route=item.shortCode,
- scope="area",
- allowPublic=0,
- };
- }
- websites.Add(website);
- }
- }
- }
- else{
- Azure.Response activityWebsiteResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(websiteId, new PartitionKey("ActivityWebsite"));
- if (activityWebsiteResponse.Status == 200)
- {
- ActivityWebsite activityWebsite = JsonDocument.Parse(activityWebsiteResponse.Content).RootElement.ToObject<ActivityWebsite>();
- Area area = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<Area>(websiteId, new PartitionKey("Base-Area"));
- if (!string.IsNullOrWhiteSpace(area.shortCode) )
- {
- bool change = false;
- if (string.IsNullOrWhiteSpace(activityWebsite.route))
- {
- activityWebsite.route=area.shortCode;
- change = true;
- }
- else {
- if (!activityWebsite.route.Equals(area.shortCode))
- {
- activityWebsite.route=area.shortCode;
- change = true;
- }
- }
- if (change) {
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(activityWebsite, new PartitionKey(activityWebsite.code));
- }
- }
- websites.Add(activityWebsite);
- }
- else
- {
- string route = string.Empty;
- string scope = string.Empty;
- Azure.Response responseArea = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(websiteId, new PartitionKey("Base-Area"));
- if (responseArea.Status==200)
- {
- Area area = JsonDocument.Parse(responseArea.Content).RootElement.ToObject<Area>();
- if (!string.IsNullOrWhiteSpace(area.shortCode))
- {
- route=area.shortCode;
- }
- scope="area";
- }
- if (!string.IsNullOrWhiteSpace(scope)) {
- Azure.Response responseSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemStreamAsync(websiteId, new PartitionKey("Base"));
- if (responseSchool.Status==200)
- {
- scope="school";
- route = websiteId;
- }
- }
- if (!string.IsNullOrWhiteSpace(scope)) {
- if (!string.IsNullOrWhiteSpace(route))
- {
- ActivityWebsite website = new ActivityWebsite
- {
- id=websiteId,
- pk="ActivityWebsite",
- code="ActivityWebsite",
- route=route,
- scope=scope,
- allowPublic=0
- };
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website, new PartitionKey(website.code));
- websites.Add(website);
- }
- else
- {
- ActivityWebsite website = new ActivityWebsite
- {
- id=websiteId,
- pk="ActivityWebsite",
- code="ActivityWebsite",
- route=route,
- scope=scope,
- allowPublic=0
- };
- websites.Add(website);
- }
- }
- }
- }
- return Ok(new { code = 200, websites });
- }
- }
- }
- return Ok();
- }
- /// <summary>
- /// 添加活动参与对象,学校,教师
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [AuthToken(Roles = "admin,area")]
- [HttpPost("invite-target")]
- #if !DEBUG
- [Authorize(Roles = "IES")]
- #endif
- public async Task<IActionResult> InviteTarget(JsonElement request)
- {
- (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
- if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
- switch (true)
- {
- case bool when $"{grant_type}".Equals("schools", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("scope", out JsonElement _scope)) return BadRequest();
- if (!request.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
- string sql = string.Empty;
- int allowPublic = 0;
- if (_scope.GetString().Equals("public", StringComparison.OrdinalIgnoreCase))
- {
- if (_areaId.GetString().Equals("02944f32-f534-3397-ea56-e6f1fc6c3714"))
- {
- allowPublic=1;
- }
- else
- {
- Azure.Response activityWebsiteResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(_areaId.GetString(), new PartitionKey("ActivityWebsite"));
- if (activityWebsiteResponse.Status==200)
- {
- ActivityWebsite website = JsonDocument.Parse(activityWebsiteResponse.Content).RootElement.ToObject<ActivityWebsite>();
- allowPublic=website.allowPublic;
- }
- }
- }
- if (allowPublic==1)
- {
- sql = "select c.id,c.name ,c.picture,c.region,c.province,c.city,c.areaId from c where c.code='Base' ";
- }
- else
- {
- 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}' ";
- }
- var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<School>(sql, "Base");
- var sc = result.list.FindAll(z => !string.IsNullOrWhiteSpace(z.areaId));
- List<dynamic> schools = new List<dynamic>();
- if (sc.IsNotEmpty()) {
- string areaSql = $"select value c from c where c.id in ({string.Join(",", sc.Select(z => $"'{z.areaId}'").ToHashSet())})";
- var areaResult = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<Area>(areaSql, "Base-Area");
- if (areaResult.list.IsNotEmpty()) {
-
- foreach (var item in result.list) {
- if (!string.IsNullOrWhiteSpace(item.areaId))
- {
- var area = areaResult.list.Find(z => z.id.Equals(item.areaId));
- schools.Add(new { item.id, item.name, item.picture, item.region, item.province, item.city, item.areaId, areaName = area?.name });
- }
- else {
- schools.Add(new { item.id, item.name, item.picture, item.region, item.province, item.city, item.areaId, areaName = string.Empty });
- }
- }
- }
- }
- return Ok(new { code = 200, schools });
- }
- case bool when $"{grant_type}".Equals("teachers", StringComparison.OrdinalIgnoreCase):
- {
- if (!string.IsNullOrWhiteSpace(school)) {
- School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
- string sql = $"select c.id,c.name ,c.picture from c where c.code='Teacher-{school}' ";
- var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<SchoolTeacher>(sql, $"Teacher-{school}");
- return Ok(new { code = 200, teachers = result.list.Select(z => new { z.id, z.name, z.picture, school, schooName = schoolbase.name }) });
- }
- break;
- }
- }
- return Ok(new { code = 400 });
- }
- /// <summary>
- /// 管理
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [AuthToken(Roles = "teacher,admin,area")]
- [HttpPost("manage")]
- #if !DEBUG
- [Authorize(Roles = "IES")]
- #endif
- public async Task<IActionResult> Manage(JsonElement request)
- {
- try
- {
- (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
- if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
- var client = _azureCosmos.GetCosmosClient();
- switch (true)
- {
- //创建活动
- case bool when $"{grant_type}".Equals("create", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("Activity", out JsonElement _activity)) return Ok(new { code = 1, msg = "活动信息参数错误" });
- Activity activity = _activity.ToObject<Activity>();
- activity.id=!string.IsNullOrWhiteSpace(activity.id) ? activity.id : Guid.NewGuid().ToString();
- activity.code="Activity";
- activity.pk="Activity";
- //如果是区级活动,enroll报名制,则学校的确认状态默认为1 。
- //if (activity.scope.Equals("area", StringComparison.OrdinalIgnoreCase) && activity.joinMode.Equals("enroll", StringComparison.OrdinalIgnoreCase))
- //{
- // activity.schools.ForEach(z => z.status=1);
- //}
- ActivityWebsite website = null;
- {
- string websiteId = activity.owner;
- string route = string.Empty;
- if (activity.owner.Equals("02944f32-f534-3397-ea56-e6f1fc6c3714", StringComparison.OrdinalIgnoreCase) && activity.scope.Equals("public", StringComparison.OrdinalIgnoreCase)) {
- websiteId="teammodel";
- route="teammodel";
- }
- Azure.Response activityWebsiteResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(websiteId, new PartitionKey("ActivityWebsite"));
- if (activityWebsiteResponse.Status!=200)
- {
- if (activity.scope.Equals("area", StringComparison.OrdinalIgnoreCase))
- {
- Area area = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<Area>(activity.owner, new PartitionKey("Base-Area"));
- if (!string.IsNullOrWhiteSpace(area.shortCode))
- {
- route=area.shortCode;
- }
- }
- if (activity.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
- {
- route=activity.owner;
- }
- if (!string.IsNullOrWhiteSpace(route))
- {
- website = new ActivityWebsite
- {
- id=websiteId,
- pk="ActivityWebsite",
- code="ActivityWebsite",
- route=route,
- scope=activity.scope,
- };
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website, new PartitionKey(website.code));
- }
- }
- else {
- website =JsonDocument.Parse(activityWebsiteResponse.Content).RootElement.ToObject<ActivityWebsite>();
- }
- }
- //醍摩豆智慧学区
- if (activity.scope.Equals("public", StringComparison.OrdinalIgnoreCase))
- {
- if (website.allowPublic==0)
- {
- return Ok(new { code = 2, msg = "暂无创建公开活动权限!" });
- }
- }
- Contest contest = null;
- ValidResult validResult = activity.Valid();
- if (validResult.isVaild)
- {
- activity.creatorId=tmdid;
- activity.createTime= DateTimeOffset.Now.ToUnixTimeMilliseconds();
- activity.year=DateTimeOffset.Now.Year;
- foreach (var module in activity.modules) {
- switch (true)
- {
- //赛课
- case bool when module.Equals("Contest"):
- {
- if (!request.TryGetProperty("Contest", out JsonElement _contest))
- {
- return Ok(new { code = 3, msg = "赛课信息参数错误" });
- }
- contest = _contest.ToObject<Contest>();
- if (contest!=null) {
- contest.id=activity.id;
- contest.code="Contest";
- contest.pk="Contest";
- ValidResult validResultContest = contest.Valid();
- if (validResultContest.isVaild)
- {
- if (contest.modules.Contains("review")) {
- if (!request.TryGetProperty("reviewConfig", out JsonElement _reviewConfig))
- {
- return Ok(new { code = 4, msg = "评审未配置" });
- }
- if (contest.review== null) {
- return Ok(new { code = 4, msg = "评审未配置" });
- }
- ReviewRuleTree ruleTree = _reviewConfig.ToObject<ReviewRuleTree>();
- var reviewRule = await ActivityService.UpsertReviewRule(ruleTree, activity, _azureCosmos);
- contest.review.ruleId = reviewRule.id;
- contest.review.ruleName = reviewRule.name;
- }
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).UpsertItemAsync(contest, new PartitionKey(contest.code));
- }
- else {
- return Ok(validResult);
- }
- }
- break;
- }
- //培训
- case bool when module.Equals("Training"):
- {
- break;
- }
- //教研
- case bool when module.Equals("Research"):
- {
- break;
- }
- }
- }
- //保存活动基础信息
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).UpsertItemAsync(activity, new PartitionKey(activity.code));
- return Ok(new { activity, contest, code = 200 });
- }
- else
- {
- return Ok(validResult);
- }
- }
- //删除活动
- case bool when $"{grant_type}".Equals("delete", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
- if (!request.TryGetProperty("owner", out JsonElement _owner)) return BadRequest();
- if (!request.TryGetProperty("scope", out JsonElement _scope)) return BadRequest();
- Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Activity"));
- if (response.Status==200)
- {
- Activity activity = JsonDocument.Parse(response.Content).RootElement.ToObject<Activity>();
- if (_scope.GetString().Equals("school") && _owner.GetString().Equals(school))
- {
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).DeleteItemStreamAsync(activity.id, new PartitionKey("Activity"));
- //删除模块,Contest, Training ,Research, ReviewRule规则(ReviewRule-disposable"; 存为活动)
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).DeleteItemStreamAsync(activity.id, new PartitionKey("Contest"));
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).DeleteItemStreamAsync(activity.id, new PartitionKey("Training"));
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).DeleteItemStreamAsync(activity.id, new PartitionKey("Research"));
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).DeleteItemStreamAsync(activity.id, new PartitionKey("ReviewRule-disposable"));
- //删除邀请教师 ActivityTeacher,
- var resultTeacher = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher)
- .GetList<IdCode>("select c.id ,c.code from c where c.pk='ActivityEnroll' and c.", $"ActivityTeacher-{activity.id}");
- if (resultTeacher.list.IsNotEmpty())
- {
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).DeleteItemsStreamAsync(resultTeacher.list.Select(z => z.id).ToList(), $"ActivityTeacher-{activity.id}");
- }
- //删除报名数据 ActivityEnroll
- var resultEnroll = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher)
- .GetList<IdCode>("select c.id ,c.code from c where c.pk='ActivityEnroll' and c.", $"ActivityEnroll-{activity.id}");
- if (resultEnroll.list.IsNotEmpty())
- {
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).DeleteItemsStreamAsync(resultEnroll.list.Select(z => z.id).ToList(), $"ActivityEnroll-{activity.id}");
- }
- //删除专家数据 ActivityExpert
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).DeleteItemStreamAsync(activity.id, new PartitionKey("ActivityExpert"));
- return Ok(new { code = 201, activity }); //删除成功
- }
- else {
- if ((_scope.GetString().Equals("area") || _scope.GetString().Equals("public")) && !_owner.GetString().Equals(school))
- {
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).DeleteItemStreamAsync(activity.id, new PartitionKey("Activity"));
-
- return Ok(new { code = 201, activity });//删除成功
- }
- }
- return Ok(new { code = 200, activity });//未删除掉
- }
- else
- {
- return Ok(new { code = 1, msg = "活动不存在" });
- }
- }
- //区级活动列表
- case bool when $"{grant_type}".Equals("list-area", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
- string yearSql = $" and c.year={DateTimeOffset.Now.Year}";
- if (request.TryGetProperty("year", out JsonElement _year)) {
- yearSql = $" and c.year={_year}";
- }
- string sql = $"select value c from c where c.owner='{_areaId}' {yearSql} ";
- var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityDto>(sql, "Activity");
- result.list.ForEach(z => {
- var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(z.owner, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
- z.sas=blob_sas;
- });
- return Ok(new { activities = result.list.OrderByDescending(z => z.stime) });
- }
- //校级活动列表
- case bool when $"{grant_type}".Equals("list-school", StringComparison.OrdinalIgnoreCase):
- {
- if (!string.IsNullOrWhiteSpace(school)) {
- School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
- List<ActivityDto> activities = new List<ActivityDto>();
- string yearSql = $" and c.year={DateTimeOffset.Now.Year}";
- if (request.TryGetProperty("year", out JsonElement _year))
- {
- yearSql = $" and c.year={_year}";
- }
- //获取开放的
- {
- //完全开放 所有的学校
- 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 ) ";
- var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityDto>(sqlOpen, "Activity");
- activities.AddRange(resultOpen.list);
- //部分学校
- 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}' ";
- var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityDto>(sqlSchool, "Activity");
- resultSchool.list.ForEach(z => {
- var confirmedSchool = z.confirmedSchools.Find(z => z.id.Equals(school));
- if (confirmedSchool==null)
- {
- z.confirmedSchools.Add(new ActivityConfirmedSchool
- {
- id=schoolbase.id,
- name=schoolbase.name,
- picture=schoolbase.picture,
- status=0
- });
- }
- });
- activities.AddRange(resultSchool.list);
- }
- //获取区级下放的
- {
- if (!string.IsNullOrWhiteSpace(schoolbase.areaId)) {
- //区级所有学校
- 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) ";
- var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityDto>(sqlOpen, "Activity");
- resultOpen.list.ForEach(z => {
- var confirmedSchool = z.confirmedSchools.Find(z => z.id.Equals(school));
- if (confirmedSchool==null)
- {
- z.confirmedSchools.Add(new ActivityConfirmedSchool
- {
- id=schoolbase.id,
- name=schoolbase.name,
- picture=schoolbase.picture,
- status=0
- });
- }
- });
- activities.AddRange(resultOpen.list);
- //区级部分学校
- 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}' ";
- var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityDto>(sqlSchool, "Activity");
- resultSchool.list.ForEach(z => {
- var confirmedSchool = z.confirmedSchools.Find(z => z.id.Equals(school));
- if (confirmedSchool==null)
- {
- z.confirmedSchools.Add(new ActivityConfirmedSchool
- {
- id=schoolbase.id,
- name=schoolbase.name,
- picture=schoolbase.picture,
- status=0
- });
- }
- });
- activities.AddRange(resultSchool.list);
- }
- }
- //获取学校自己的
- {
- string sqlSchool = $"select value c from c where c.scope='school'{yearSql} and c.owner='{school}' ";
- var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityDto>(sqlSchool, "Activity");
- activities.AddRange(resultSchool.list);
- }
- activities.ForEach(z => {
- var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(z.owner, BlobContainerSasPermissions.Read | BlobContainerSasPermissions.List);
- z.sas=blob_sas;
- });
- return Ok(new { activities = activities.OrderByDescending(z => z.stime) });
- }
- break;
- }
- //教师活动列表
- case bool when $"{grant_type}".Equals("list-teacher", StringComparison.OrdinalIgnoreCase):
- {
- List<TeacherActivityDto> activities = await ActivityService. TeacherActivityList( _azureCosmos,_azureStorage, request, tmdid);
- return Ok(new { activities = activities.OrderByDescending(z => z.stime) });
- }
- //读取优课评选模块及评审规则
- case bool when $"{grant_type}".Equals("read-contest", StringComparison.OrdinalIgnoreCase):
- {
- Contest contest = null;
- ReviewRuleTree reviewRule = null;
- if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
- Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Contest"));
- if (response.Status==200) {
- contest= JsonDocument.Parse(response.Content).RootElement.ToObject<Contest>();
- if (contest.modules.Contains("review")) {
- Azure.Response reviewRuleResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("ReviewRule-disposable"));
- if (reviewRuleResponse.Status==200) {
- ReviewRule reviewRuleDB = JsonDocument.Parse(reviewRuleResponse.Content).RootElement.ToObject<ReviewRule>();
- var tree = ActivityService.ListToTree(reviewRuleDB.configs);
- reviewRule=new ReviewRuleTree
- {
- id=reviewRuleDB.id,
- name= reviewRuleDB.name,
- owner= reviewRuleDB.owner,
- sourceName= reviewRuleDB.sourceName,
- trees=tree,
- desc=reviewRuleDB.desc
- };
- }
- }
- }
- return Ok(new { code = 200, contest, reviewRule });
- }
- //获取评审的模板列表
- case bool when $"{grant_type}".Equals("rule-list", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("owner", out JsonElement _owner)) return BadRequest();
- var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ReviewRule>($"select value c from c where c.owner='{_owner}'", "ReviewRule-template");
- List<ReviewRuleTree> reviewRules = new List<ReviewRuleTree>();
- foreach (var item in result.list)
- {
- var tree = ActivityService.ListToTree(item.configs);
- ReviewRuleTree reviewRule = new ReviewRuleTree
- { id=item.id,
- desc=item.desc,
- name= item.name,
- owner= item.owner,
- sourceName= item.sourceName,
- trees=tree,
- upsertAsTemplate=1
- };
- reviewRules.Add(reviewRule);
- }
- return Ok(new { reviewRules });
- }
- //编辑当前活动评审规则
- case bool when $"{grant_type}".Equals("rule-update", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("reviewConfig", out JsonElement _reviewConfig))
- {
- return Ok(new { code = 4, msg = "评审未配置" });
- }
- ReviewRuleTree ruleTree = _reviewConfig.ToObject<ReviewRuleTree>();
- if (!string.IsNullOrWhiteSpace(ruleTree.id))
- {
- Activity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemAsync<Activity>(ruleTree.id, new PartitionKey("Activity"));
- var reviewRuleDB = await ActivityService.UpsertReviewRule(ruleTree, activity, _azureCosmos);
- var tree = ActivityService.ListToTree(reviewRuleDB.configs);
- var reviewRule = new ReviewRuleTree
- {
- id=reviewRuleDB.id,
- name= reviewRuleDB.name,
- owner= reviewRuleDB.owner,
- sourceName= reviewRuleDB.sourceName,
- trees=tree,
- desc=reviewRuleDB.desc
- };
- return Ok(new { reviewRule });
- }
- else {
- return Ok(new { code = 5, msg = "规则不存在" });
- }
- }
- //删除评审规则模板
- case bool when $"{grant_type}".Equals("rule-delete", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("ruleId", out JsonElement _ruleId))
- {
- return BadRequest();
- }
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).DeleteItemStreamAsync(_ruleId.GetString(), new PartitionKey("ReviewRule-template"));
- return Ok(new { code = 200 });
- }
- //学校确认参加本次活动
- case bool when $"{grant_type}".Equals("school-confirm", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
- if (!request.TryGetProperty("confirm", out JsonElement _confirm)) return BadRequest();
- if (!string.IsNullOrWhiteSpace(school)) {
- Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Activity"));
- if (response.Status==200)
- {
- Activity activity = JsonDocument.Parse(response.Content).RootElement.ToObject<Activity>();
- if (_confirm.GetInt32()==1 ||_confirm.GetInt32()==0)
- {
- var invitedSchool = activity.invitedSchools.Find(z => z.id.Equals(school));
- if (invitedSchool!=null) {
- var confirmedSchool = activity.confirmedSchools.Find(z => z.id.Equals(school));
- if (confirmedSchool!=null)
- {
- confirmedSchool.status=_confirm.GetInt32();
- }
- else {
- School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
- activity.confirmedSchools= new List<ActivityConfirmedSchool>() { new ActivityConfirmedSchool { id=school, status=_confirm.GetInt32(), name=schoolbase.name, picture= schoolbase.picture } };
- }
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).UpsertItemAsync(activity, new PartitionKey("Activity"));
- return Ok(new { code = 200, activity });
- }
- else
- {
- return Ok(new { code = 1, msg = "该学校未被邀请!" });
- }
- }
- else
- {
- return Ok(new { code = 2, msg = "活动发布状态错误!" });
- }
- }
- }
- break;
- }
- //发布或取消发布活动
- case bool when $"{grant_type}".Equals("update-publish", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
- if (!request.TryGetProperty("publish", out JsonElement _publish)) return BadRequest();
- Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Activity"));
- if (response.Status==200)
- {
- Activity activity = JsonDocument.Parse(response.Content).RootElement.ToObject<Activity>();
- if (_publish.GetInt32()==1 ||_publish.GetInt32()==0)
- {
- activity.publish=_publish.GetInt32();
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).UpsertItemAsync(activity, new PartitionKey("Activity"));
- return Ok(new { code = 200, activity });
- }
- else {
- return Ok(new { code = 2, msg = "活动发布状态错误!" });
- }
- }
- else {
- return Ok(new { code = 1, msg = "活动不存在" });
- }
- }
- //邀请教师参加本次活动或移除教师参加活动
- case bool when $"{grant_type}".Equals("invite-remove-teachers", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
- request.TryGetProperty("invite", out JsonElement _invite);
- request.TryGetProperty("remove", out JsonElement _remove);
- Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Activity"));
- if (response.Status==200)
- {
- Activity activity = JsonDocument.Parse(response.Content).RootElement.ToObject<Activity>();
- if (activity.joinMode.Equals("invite"))
- {
- var confirmedSchool = activity.confirmedSchools.Find(z => z.id.Equals(school) && z.status==1);
- if (confirmedSchool!= null || activity.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
- {
- List<InviteTeachers> inviteTeachersInvalid = new List<InviteTeachers>();
- List<InviteTeachers> removeTeachersInvalid = new List<InviteTeachers>();
- ActivityTeacher activityTeacher = null;
- Azure.Response activityTeacherResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(school, new PartitionKey($"ActivityTeacher-{activity.id}"));
- if (activityTeacherResponse.Status==200)
- {
- activityTeacher = JsonDocument.Parse(activityTeacherResponse.Content).RootElement.ToObject<ActivityTeacher>();
- }
- if (activityTeacher==null) {
- activityTeacher= new ActivityTeacher() { id=school, code=$"ActivityTeacher-{_activityId}", pk="ActivityTeacher" };
- }
- if (_invite.ValueKind.Equals(JsonValueKind.Array)) {
- List<InviteTeachers> inviteTeachers = _invite.ToObject<List<InviteTeachers>>();
- foreach (var invite in inviteTeachers) {
- if (string.IsNullOrWhiteSpace(invite.school) || !invite.school.Equals(school)) {
- inviteTeachersInvalid.Add(invite);
- continue;
- }
- var inviteTeacher = activityTeacher.inviteTeachers.Find(z => z.id.Equals(invite.id));
- if (inviteTeacher==null)
- {
- activityTeacher.inviteTeachers.Add(invite);
- }
- else {
- inviteTeacher=invite;
- }
- }
- }
- if (_remove.ValueKind.Equals(JsonValueKind.Array)) {
- List<InviteTeachers> removeTeachers = _remove.ToObject<List<InviteTeachers>>();
- foreach (var remove in removeTeachers)
- {
- if (string.IsNullOrWhiteSpace(remove.school) || !remove.school.Equals(school))
- {
- removeTeachersInvalid.Add(remove);
- continue;
- }
- activityTeacher.inviteTeachers.RemoveAll(z => remove.id.Equals(z.id));
- }
- }
- var teachers = activityTeacher.inviteTeachers.FindAll(z => z.school.Equals(school));
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(activityTeacher, new PartitionKey($"ActivityTeacher-{_activityId}"));
- return Ok(new { inviteTeachers = teachers, inviteTeachersInvalid, removeTeachersInvalid });
- }
- else
- {
- return Ok(new { code = 2, msg = "学校未确认,暂不能邀请教师" });
- }
- }
- else {
- return Ok(new { code = 3, msg = "活动不是邀请制。" });
- }
- }
- else
- {
- return Ok(new { code = 1, msg = "活动不存在" });
- }
- }
- //获取邀请的教师列表
- case bool when $"{grant_type}".Equals("invited-teachers", StringComparison.OrdinalIgnoreCase)
- || $"{grant_type}".Equals("invited-and-enroll-teachers", StringComparison.OrdinalIgnoreCase):
- {
- string owner = string.Empty;
- if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
- request.TryGetProperty("activityOwner", out JsonElement _activityOwner);
- if (string.IsNullOrWhiteSpace($"{_activityOwner}"))
- {
- if (!string.IsNullOrWhiteSpace(school))
- {
- owner=school;
- }
- }
- else {
- owner=$"{_activityOwner}";
- }
- Activity activity = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemAsync<Activity>(_activityId.GetString(), new PartitionKey("Activity"));
- int isAll = 0;
- if (!string.IsNullOrWhiteSpace(owner)) {
- if (activity.owner.Equals(owner)) {
- isAll = 1;
- }
- }
- List<InviteTeachers> inviteTeachers = new List<InviteTeachers>();
- string activityTeacherSQL = $"select value c from c where c.pk='ActivityTeacher'";
- if (isAll!=1 && !string.IsNullOrWhiteSpace(school))
- {
- activityTeacherSQL=$"{activityTeacherSQL} and c.id='{school}'";
- }
- var activityTeacherResult= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityTeacher>(activityTeacherSQL, $"ActivityTeacher-{_activityId}");
- foreach (var activityTeacher in activityTeacherResult.list) {
- inviteTeachers.AddRange(activityTeacher.inviteTeachers);
- }
- if ($"{grant_type}".Equals("invited-and-enroll-teachers", StringComparison.OrdinalIgnoreCase))
- {
- string enrollSQL = $"select value c from c where c.activityId='{_activityId.GetString()}' ";
- //不是自己的,且学校不为空,则查询指定学校的,否则获取所有报名的数据
- if (isAll!=1 && !string.IsNullOrWhiteSpace(school))
- {
- enrollSQL=$"{enrollSQL} and c.schoolId='{school}'";
- }
- var enrollResult =await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityEnroll>(enrollSQL, $"ActivityEnroll-{_activityId}");
- List<InviteEnrollTeacherDto> inviteEnrollTeachers = new List<InviteEnrollTeacherDto>();
- Contest contest = null;
- Azure.Response contestResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Contest"));
- if (contestResponse.Status==200)
- {
- contest = JsonDocument.Parse(contestResponse.Content).RootElement.ToObject<Contest>();
- }
- long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- int uploadStatus = -1;
- int contestStatus = -1;
- if (contest?.sign!=null)
- {
- if (contest?.sign.stime>now)
- {
- contestStatus=-2;
- }
- else
- {
- contestStatus = 0;
- }
- }
- if (contest?.upload!=null)
- {
- if (contest?.upload.stime>now)
- {
- uploadStatus=-2;
- }
- else
- {
- uploadStatus=0;
- }
- }
- foreach (var inviteTeacher in inviteTeachers) {
- inviteEnrollTeachers.Add(new InviteEnrollTeacherDto
- {
- id= inviteTeacher.id,
- name= inviteTeacher.name,
- picture= inviteTeacher.picture,
- school= inviteTeacher.school,
- schoolName=inviteTeacher.schoolName,
- inviteStatus=inviteTeacher.status,
- contestStatus=contestStatus,
- uploadStatus=uploadStatus
- });
- }
- foreach (var activityEnroll in enrollResult.list)
- {
- var inviteEnrollTeacher = inviteEnrollTeachers.Find(z => z.id.Equals(activityEnroll.id) && !string.IsNullOrWhiteSpace(z.school) && !string.IsNullOrEmpty(activityEnroll.schoolId) && z.school.Equals(activityEnroll.schoolId));
- if (inviteEnrollTeacher==null)
- {
- inviteEnrollTeacher= new InviteEnrollTeacherDto
- {
- id= activityEnroll.id,
- name= activityEnroll.tmdName,
- picture= activityEnroll.tmdPicture,
- school= activityEnroll.schoolId,
- schoolName=activityEnroll.schoolName,
- contestStatus=contestStatus,
- uploadStatus=uploadStatus
- };
- inviteEnrollTeachers.Add(inviteEnrollTeacher);
- }
- if (activityEnroll.contest!= null)
- {
- inviteEnrollTeacher.contestStatus = 1;
- inviteEnrollTeacher.contestTime = activityEnroll.contest.enrollTime;
- inviteEnrollTeacher.contestType = activityEnroll.contest.type;
- }
- if (activityEnroll.upload!=null)
- {
- inviteEnrollTeacher.uploadId=activityEnroll.upload.uploadId;
- inviteEnrollTeacher.uploadType=activityEnroll.upload.type;
- inviteEnrollTeacher.uploadStatus=1;
- inviteEnrollTeacher.uploadTime= activityEnroll.upload.uploadTime;
- inviteEnrollTeacher.uploadScore=activityEnroll.upload.score;
- }
- }
- return Ok(new { inviteEnrollTeachers });
- }
- else
- {
- return Ok(new { inviteTeachers });
- }
- }
- //导入评审专家
- case bool when $"{grant_type}".Equals("add-remove-experts", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
- List<Expert> upsert_experts = new List<Expert>();
- List<Expert> remove_experts = new List<Expert>();
- if (request.TryGetProperty("upsert_experts", out JsonElement _upsert_experts) && _upsert_experts.ValueKind.Equals(JsonValueKind.Array)) {
- upsert_experts = _upsert_experts.ToObject<List<Expert>>();
- }
- if (request.TryGetProperty("remove_experts", out JsonElement _remove_experts) && _remove_experts.ValueKind.Equals(JsonValueKind.Array))
- {
- remove_experts = _remove_experts.ToObject<List<Expert>>();
- }
- ActivityExpert activityExpert = null;
- if (upsert_experts.IsNotEmpty()) {
- var tmdids = upsert_experts.Where(x => !string.IsNullOrWhiteSpace(x.tmdid)).Select(z => z.tmdid);
- var phones = upsert_experts.Where(x => !string.IsNullOrWhiteSpace(x.mobile)).Select(z => z.mobile);
- var emails = upsert_experts.Where(x => !string.IsNullOrWhiteSpace(x.email)).Select(z => z.email);
- List<string> keys = new List<string>();
- if (tmdids.Any())
- {
- keys.AddRange(tmdids);
- }
- if (phones.Any())
- {
- keys.AddRange(phones);
- }
- if (emails.Any())
- {
- keys.AddRange(emails);
- }
- upsert_experts.ForEach(x => { x.status = 0; x.iname = x.name; x.name = null; });
- List<CoreUser> coreUsers = new List<CoreUser>();
- if (keys.Any())
- {
- try
- {
- var content = new StringContent(keys.ToJsonString(), Encoding.UTF8, "application/json");
- string json = await _coreAPIHttpService.GetUserInfos(content);
- if (!string.IsNullOrWhiteSpace(json))
- {
- coreUsers = json.ToObject<List<CoreUser>>();
- }
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"{_option.Location},导入名单时,查验key信息错误{ex.Message}\n{ex.StackTrace}\n\n{keys.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
- }
- }
- if (coreUsers.IsNotEmpty())
- {
- foreach (var t in upsert_experts)
- {
- if (!string.IsNullOrWhiteSpace(t.tmdid))
- {
- CoreUser coreUser = coreUsers.Find(x => x.id.Equals(t.tmdid));
- if (coreUser != null)
- {
- t.id = coreUser.id;
- t.name = coreUser.name;
- t.picture = coreUser.picture;
- t.tmdid = coreUser.id;
- if (!string.IsNullOrWhiteSpace(coreUser.mobile))
- {
- t.mobile = coreUser.mobile;
- }
- if (!string.IsNullOrWhiteSpace(coreUser.mail))
- {
- t.email = coreUser.mail;
- }
- }
- }
- if (string.IsNullOrWhiteSpace(t.id))
- {
- if (!string.IsNullOrWhiteSpace(t.mobile))
- {
- CoreUser coreUser = coreUsers.Find(x => !string.IsNullOrWhiteSpace(x.mobile) && x.mobile.Equals(t.mobile));
- if (coreUser != null)
- {
- t.id = coreUser.id;
- t.name = coreUser.name;
- t.picture = coreUser.picture;
- t.tmdid = coreUser.id;
- if (!string.IsNullOrWhiteSpace(coreUser.mobile))
- {
- t.mobile = coreUser.mobile;
- }
- if (!string.IsNullOrWhiteSpace(coreUser.mail))
- {
- t.email = coreUser.mail;
- }
- }
- }
- }
- if (string.IsNullOrWhiteSpace(t.id))
- {
- if (!string.IsNullOrWhiteSpace(t.email))
- {
- CoreUser coreUser = coreUsers.Find(x => !string.IsNullOrWhiteSpace(x.mail) && x.mail.Equals(t.email));
- if (coreUser != null)
- {
- t.id = coreUser.id;
- t.name = coreUser.name;
- t.picture = coreUser.picture;
- t.tmdid = coreUser.id;
- if (!string.IsNullOrWhiteSpace(coreUser.mobile))
- {
- t.mobile = coreUser.mobile;
- }
- if (!string.IsNullOrWhiteSpace(coreUser.mail))
- {
- t.email = coreUser.mail;
- }
- }
- }
- }
- }
- Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync($"{_activityId}", new PartitionKey("ActivityExpert"));
- if (response.Status == 200)
- {
- activityExpert = JsonDocument.Parse(response.Content).RootElement.Deserialize<ActivityExpert>();
- upsert_experts.ForEach(x =>
- {
- Expert tch = null;
- if (string.IsNullOrWhiteSpace(x.id))
- {
- tch = activityExpert.experts.Find(t => !string.IsNullOrWhiteSpace(t.iname) && t.iname.Equals(x.iname));
- }
- else
- {
- tch = activityExpert.experts.Find(t => !string.IsNullOrWhiteSpace(x.id) && !string.IsNullOrWhiteSpace(t.id) && t.id.Equals(x.id));
- }
- if (tch != null)
- {
- tch.status = x.status;
- tch.name = x.name;
- tch.iname = x.iname;
- tch.picture = x.picture;
- tch.mobile = x.mobile;
- tch.tmdid = x.tmdid;
- tch.email = x.email;
- tch.id = x.id;
- tch.school = x.school;
- //直接替换更新
- tch.modules=x.modules;
- tch.subjects=x.subjects;
- // x.modules.ForEach(y => {
- // if (!tch.modules.Contains(y))
- // {
- // tch.modules.Add(y);
- // }
- // });
- // x.subjects.ForEach(r => {
- // if (!string.IsNullOrWhiteSpace(r.subject) && !string.IsNullOrWhiteSpace(r.period))
- // {
- // var sub = tch.subjects.Find(x => !string.IsNullOrWhiteSpace(x.subject) && !string.IsNullOrWhiteSpace(x.period) && x.subject.Equals(r.subject) && x.period.Equals(r.period));
- // if (sub == null)
- // {
- // tch.subjects.Add(r);
- // }
- // }
- // if (!string.IsNullOrWhiteSpace(r.subject) && string.IsNullOrWhiteSpace(r.period))
- // {
- // var sub = tch.subjects.Find(a => !string.IsNullOrWhiteSpace(a.subject) && string.IsNullOrWhiteSpace(a.period) && a.subject.Equals(r.subject));
- // if (sub == null)
- // {
- // tch.subjects.Add(r);
- // }
- // }
- // });
- }
- else
- {
- activityExpert.experts.Add(new Expert
- {
- status = x.status,
- name = x.name,
- iname = x.iname,
- picture = x.picture,
- mobile = x.mobile,
- tmdid = x.tmdid,
- email = x.email,
- id = x.id,
- title = x.title,
- subjects = x.subjects,
- modules = x.modules,
- school=x.school,
- });
- }
- });
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
- }
- else
- {
- activityExpert = new ActivityExpert { id = $"{_activityId}", code = "ActivityExpert", pk = "ActivityExpert", experts = upsert_experts };
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
- }
- }
- else
- {
- activityExpert = new ActivityExpert { id = $"{_activityId}", code = "ActivityExpert", pk = "ActivityExpert", experts = upsert_experts };
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
- }
- if (remove_experts.IsNotEmpty()) {
- if (activityExpert == null)
- {
- Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync($"{_activityId}", new PartitionKey("ActivityExpert"));
- if (response.Status == 200) {
- activityExpert = JsonDocument.Parse(response.Content).RootElement.Deserialize<ActivityExpert>();
- }
- }
- if (activityExpert!=null) {
- remove_experts.ForEach(z => {
- if (!string.IsNullOrWhiteSpace(z.id))
- {
- activityExpert.experts.RemoveAll(x => !string.IsNullOrWhiteSpace(x.id) && x.id.Equals(z.id));
- }
- else {
- if (!string.IsNullOrWhiteSpace(z.mobile)) {
- activityExpert.experts.RemoveAll(x => !string.IsNullOrWhiteSpace(x.mobile) && x.mobile.Equals(z.mobile));
- }
- if (!string.IsNullOrWhiteSpace(z.email))
- {
- activityExpert.experts.RemoveAll(x => !string.IsNullOrWhiteSpace(x.email) && x.email.Equals(z.email));
- }
- if (!string.IsNullOrWhiteSpace(z.tmdid))
- {
- activityExpert.experts.RemoveAll(x => !string.IsNullOrWhiteSpace(x.tmdid) && x.tmdid.Equals(z.tmdid));
- }
- }
- });
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
- }
- }
- }
- return Ok(new { activityExpert,code=200 });
- }
- //评审专家列表
- case bool when $"{grant_type}".Equals("list-experts", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
- ActivityExpert activityExpert = null;
- Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync($"{_activityId}", new PartitionKey("ActivityExpert"));
- if (response.Status == 200) {
- bool change = false;
- activityExpert = JsonDocument.Parse(response.Content).RootElement.Deserialize<ActivityExpert>();
- var experts = activityExpert.experts.FindAll(z => string.IsNullOrWhiteSpace(z.id));
- var tmdids = experts.Where(x => !string.IsNullOrWhiteSpace(x.tmdid)).Select(z => z.tmdid);
- var phones = experts.Where(x => !string.IsNullOrWhiteSpace(x.mobile)).Select(z => z.mobile);
- var emails = experts.Where(x => !string.IsNullOrWhiteSpace(x.email)).Select(z => z.email);
- List<string> keys = new List<string>();
- if (tmdids.Any())
- {
- keys.AddRange(tmdids);
- }
- if (phones.Any())
- {
- keys.AddRange(phones);
- }
- if (emails.Any())
- {
- keys.AddRange(emails);
- }
- List<CoreUser> coreUsers = new List<CoreUser>();
- if (keys.Any())
- {
- try
- {
- var content = new StringContent(keys.ToJsonString(), Encoding.UTF8, "application/json");
- string json = await _coreAPIHttpService.GetUserInfos(content);
- if (!string.IsNullOrWhiteSpace(json))
- {
- coreUsers = json.ToObject<List<CoreUser>>();
- }
- }
- catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"{_option.Location},导入名单时,查验key信息错误{ex.Message}\n{ex.StackTrace}\n\n{keys.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
- }
- }
- if (coreUsers.IsNotEmpty())
- {
- foreach (var t in experts)
- {
- if (!string.IsNullOrWhiteSpace(t.tmdid))
- {
- CoreUser coreUser = coreUsers.Find(x => x.id.Equals(t.tmdid));
- if (coreUser != null)
- {
- change=true;
- t.id = coreUser.id;
- t.name = coreUser.name;
- t.picture = coreUser.picture;
- t.tmdid = coreUser.id;
- if (!string.IsNullOrWhiteSpace(coreUser.mobile))
- {
- t.mobile = coreUser.mobile;
- }
- if (!string.IsNullOrWhiteSpace(coreUser.mail))
- {
- t.email = coreUser.mail;
- }
- }
- }
- if (string.IsNullOrWhiteSpace(t.id))
- {
- if (!string.IsNullOrWhiteSpace(t.mobile))
- {
- CoreUser coreUser = coreUsers.Find(x => !string.IsNullOrWhiteSpace(x.mobile) && x.mobile.Equals(t.mobile));
- if (coreUser != null)
- {
- change=true;
- t.id = coreUser.id;
- t.name = coreUser.name;
- t.picture = coreUser.picture;
- t.tmdid = coreUser.id;
- if (!string.IsNullOrWhiteSpace(coreUser.mobile))
- {
- t.mobile = coreUser.mobile;
- }
- if (!string.IsNullOrWhiteSpace(coreUser.mail))
- {
- t.email = coreUser.mail;
- }
- }
- }
- }
- if (string.IsNullOrWhiteSpace(t.id))
- {
- if (!string.IsNullOrWhiteSpace(t.email))
- {
- CoreUser coreUser = coreUsers.Find(x => !string.IsNullOrWhiteSpace(x.mail) && x.mail.Equals(t.email));
- if (coreUser != null)
- {
- change=true;
- t.id = coreUser.id;
- t.name = coreUser.name;
- t.picture = coreUser.picture;
- t.tmdid = coreUser.id;
- if (!string.IsNullOrWhiteSpace(coreUser.mobile))
- {
- t.mobile = coreUser.mobile;
- }
- if (!string.IsNullOrWhiteSpace(coreUser.mail))
- {
- t.email = coreUser.mail;
- }
- }
- }
- }
- }
- }
- if (change) {
- await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).UpsertItemAsync(activityExpert, new PartitionKey("ActivityExpert"));
- }
- }
- return Ok(new { activityExpert, code = 200 });
- }
- }
- } catch (Exception ex)
- {
- await _dingDing.SendBotMsg($"{ex.Message}\n{ex.StackTrace}",GroupNames.成都开发測試群組);
- return Ok(new {code=500, msg =ex.Message });
- }
- return Ok();
- }
- /// <summary>
- /// 教师的邀请和报名状态数据
- /// </summary>
- public class InviteEnrollTeacherDto {
- public string id { get; set; }
- public string name { get; set; }
- public string picture { get; set; }
- public string school { get; set; }
- public string schoolName { get; set; }
- /// <summary>
- ///-1表示非邀请制的默认状态, 0 未报名,1已报名,用于区级发布, publish=1,joinMode=invite,学校可以去进行邀请某一些教师。
- /// </summary>
- public int inviteStatus { get; set; } = -1;
- /// <summary>
- /// -1表示没有报名模块的默认状态,-2 表示时间未到
- /// </summary>
- public int contestStatus { get; set; } = -1;
- public long contestTime { get; set; }
- /// <summary>
- /// -1表示没有报名模块的默认状态,0个人,1 团队组
- /// </summary>
- public int contestType { get; set; } = -1;
- /// <summary>
- /// -1 表示没有上传模块的默认状态 0未上传,1已上传,-2 表示时间未到
- /// </summary>
- public int uploadStatus { get; set; } = -1;
- public long uploadTime { get; set; }
- /// <summary>
- /// 没有上传模块的默认状态,file文件 sokrates 苏格拉底
- /// </summary>
- public string uploadType { get; set; }
- /// <summary>
- /// 作品分数
- /// </summary>
- public double uploadScore { get; set; } = -1;
- /// <summary>
- ///作品id
- /// </summary>
- public string uploadId { get; set; }
- }
- /// <summary>
- /// portal站的
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [HttpPost("login-portal")]
- public async Task<IActionResult> LoginPortal(JsonElement request) {
- string tmdid = null;
- if (!request.TryGetProperty("route", out JsonElement _route)) return BadRequest();
- request.TryGetProperty("ticket", out JsonElement _ticket);
- request.TryGetProperty("token", out JsonElement _token);
- TeacherInfo teacherInfo = null;
- object name= null, picture =null;
- string head_lang = "";
- (string ip, string region) = await LoginService.LoginIp(HttpContext, _searcher);
- if (!string.IsNullOrWhiteSpace($"{_ticket}")) {
- var clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
- (HttpStatusCode statusCode, CoreAPIToken token) = await _coreAPIHttpService.GetCoreAPIoAuth2Token(
- new Dictionary<string, object> { { "client_id", clientID }, { "grant_type", "authorization_code" }, { "code", _ticket.GetString() } }, _option.Location, _configuration, _dingDing);
- if (statusCode.Equals(HttpStatusCode.OK))
- {
- var jwt = new JwtSecurityToken(token.id_token);
- tmdid = jwt.Payload.Sub;
-
- if (HttpContext.Request.Headers.TryGetValue("lang", out var _lang))
- {
- head_lang = $"{_lang}";
- }
- jwt.Payload.TryGetValue("name", out name);
- jwt.Payload.TryGetValue("picture", out picture);
- jwt.Payload.TryGetValue("lang", out object _jwtlang);
- head_lang = !string.IsNullOrWhiteSpace($"{_jwtlang}") ? $"{_jwtlang}" : head_lang;
- }
- }
-
- if (tmdid == null )
- {
- if (!string.IsNullOrWhiteSpace($"{_token}"))
- {
- var jwt = new JwtSecurityToken(_token.GetString());
- if (JwtAuthExtension.ValidateAuthTokenRefresh(_token.GetString(), _option.JwtSecretKey))
- {
- tmdid = jwt.Payload.Sub;
- if (HttpContext.Request.Headers.TryGetValue("lang", out var _lang))
- {
- head_lang = $"{_lang}";
- }
- jwt.Payload.TryGetValue("name", out name);
- jwt.Payload.TryGetValue("picture", out picture);
- jwt.Payload.TryGetValue("lang", out object _jwtlang);
- head_lang = !string.IsNullOrWhiteSpace($"{_jwtlang}") ? $"{_jwtlang}" : head_lang;
- }
- else { return Ok(new { code = 2, msg = "Token验证失败" }); }
- }
- else { return Ok(new { code = 3, msg = "凭证验证失败" }); }
- }
-
- teacherInfo = await TeacherService.TeacherInfoLite(_azureCosmos, $"{name}", $"{picture}", tmdid, _azureStorage, _option, _azureRedis, ip, _httpTrigger, head_lang);
- string sql = $"select value c from c where c.route='{_route}'";
- var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsite>(sql, "ActivityWebsite");
- ActivityWebsite website = null;
- if (result.list.Count>1)
- {
- return Ok(new { code = 1, msg = "路由匹配多个区校" });
- }
- else
- {
- if (result.list.Count==1)
- {
- website= result.list[0];
- }
- }
- List<string > roles= new List<string>() { "teacher" };
- CoreUser coreUser = await _coreAPIHttpService.GetUserInfo(new Dictionary<string, string> { { "key", teacherInfo.teacher.id } }, _option.Location, _configuration);
- string sqlExpert = $"select value c from c join e in c.experts where e.id='{teacherInfo.teacher.id}'";
- if (!string.IsNullOrWhiteSpace(coreUser.mobile)) {
- sqlExpert=$" {sqlExpert } or e.mobile='{coreUser.mobile}' ";
- }
- var resultActivityExpert = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<ActivityExpert>(sqlExpert, "ActivityExpert",pageSize:1);
- if (resultActivityExpert.list.IsNotEmpty()) {
- roles.Add("expert");
- }
- var payload = new JwtPayload {
- { JwtRegisteredClaimNames.Iss, _option.HostName }, //發行者
- { JwtRegisteredClaimNames.Sub, teacherInfo.teacher.id }, // 用戶ID
- { JwtRegisteredClaimNames.Exp,DateTimeOffset.UtcNow.AddHours(2).ToUnixTimeSeconds()}, // 到期的時間,必須為數字
- { "name",name}, // 用戶的顯示名稱
- { "picture",picture}, // 用戶頭像
- { "roles", roles.ToArray()}, // 登入者的角色,角色類型 (Admin、Teacher、Student)
- { JwtRegisteredClaimNames.Website,website?.route},
- };
- var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_option.JwtSecretKey));
- var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature);
- var header = new JwtHeader(signingCredentials);
- var secToken = new JwtSecurityToken(header, payload);
- // 產出所需要的 JWT securityToken 物件,並取得序列化後的 Token 結果(字串格式)
- var tokenHandler = new JwtSecurityTokenHandler();
- var serializeToken = tokenHandler.WriteToken(secToken);
- var core_clientID = _configuration.GetValue<string>("HaBookAuth:CoreService:clientID");
- var core_clientSecret = _configuration.GetValue<string>("HaBookAuth:CoreService:clientSecret");
- string location= _option.Location;
- if (location.Contains("China"))
- {
- location = "China";
- }
- else if (location.Contains("Global"))
- {
- location = "Global";
- }
- var access_token = await CoreTokenExtensions.CreateAccessToken(core_clientID, core_clientSecret, location);
- 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"))});
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [HttpPost("get-website")]
- public async Task<IActionResult> GetWebsite(JsonElement request) {
- if (!request.TryGetProperty("route", out JsonElement _route)) return BadRequest();
- string sql = $"select value c from c where c.route='{_route}'";
- var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsiteDto>(sql, "ActivityWebsite");
- ActivityWebsiteDto website = null;
- if (result.list.Count>1)
- {
- return Ok(new { code = 1, msg = "路由匹配多个区校" });
- }
- else
- {
- if (result.list.Count==1)
- {
- website= result.list[0];
- }
- }
- if (website!= null)
- {
- List<ActivityWebsiteDto> websites = new List<ActivityWebsiteDto>();
- if (website.route.Equals("teammodel") )
- {
- string sqlAll = $"select value c from c where IS_DEFINED(c.route) = true and c.route<> null and c.route<>'' ";
- var resultAll = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsiteDto>(sqlAll, "ActivityWebsite");
- websites=resultAll.list;
- }
- websites.ForEach(z => {
- string cnt = z.id;
- if (z.id.Equals("teammodel"))
- {
- cnt="02944f32-f534-3397-ea56-e6f1fc6c3714";
- }
- z.sas= _azureStorage.GetBlobContainerSAS(cnt ,BlobContainerSasPermissions.Read).sas;
- });
- string cnt = website.id;
- if (website.id.Equals("teammodel"))
- {
- cnt="02944f32-f534-3397-ea56-e6f1fc6c3714";
- }
- website.sas= _azureStorage.GetBlobContainerSAS(cnt, BlobContainerSasPermissions.Read).sas;
- return Ok(new { code = 200, website ,websites });
- }
- else {
- return Ok(new { code = 2, msg = "未匹配分站" }) ;
- }
- }
- /// <summary>
- /// 教师在赛课模块的操作
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [HttpPost("teacher-contest")]
- [AuthToken(Roles = "teacher")]
- #if !DEBUG
- [Authorize(Roles = "IES")]
- #endif
- public async Task<IActionResult> Teacher(JsonElement request) {
- (string tmdid, _, _, _) = HttpContext.GetAuthTokenInfo();
- if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
- if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
- var client = _azureCosmos.GetCosmosClient();
- Azure.Response response = await client.GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Activity"));
- if (response.Status==200)
- {
- int code = -1;
- Activity activity= JsonDocument.Parse(response.Content).RootElement.ToObject<Activity>();
- if (activity.publish==1) {
- switch (true)
- {
- //生成组队口令
- case bool when $"{grant_type}".Equals("gen-cipher", StringComparison.OrdinalIgnoreCase):
- {
- break;
- }
- //根据口令获取团队和队员信息
- case bool when $"{grant_type}".Equals("get-team-by-cipher", StringComparison.OrdinalIgnoreCase):
- {
- break;
- }
- //教师报名参加
- case bool when $"{grant_type}".Equals("sign-contest", StringComparison.OrdinalIgnoreCase):
- {
- if (!request.TryGetProperty("enrollData", out JsonElement _enrollData)) {
- return Ok(new { code = 0, msg = "报名信息未完善!" });
- };
- TeacherEnrollContestDto enrollData= _enrollData.ToObject<TeacherEnrollContestDto>();
- ActivityEnroll enroll = null;
- Azure.Response responseActivityEnroll = await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemStreamAsync(tmdid, new PartitionKey($"ActivityEnroll-{_activityId.GetString()}"));
- if (responseActivityEnroll.Status==200) {
- enroll= JsonDocument.Parse(responseActivityEnroll.Content).RootElement.ToObject<ActivityEnroll>();
- }
- //邀请制
- if (activity.joinMode.Equals("invite"))
- {
- Azure.Response responseActivityTeacher = await client.GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("ActivityTeacher"));
- if (responseActivityTeacher.Status==200)
- {
- ActivityTeacher activityTeacher = JsonDocument.Parse(responseActivityTeacher.Content).RootElement.ToObject<ActivityTeacher>();
- var exsit = activityTeacher.inviteTeachers.Exists(z => z.id.Equals(tmdid));
- if (!exsit)
- {
- code=1;
- return Ok(new { code, msg = "教师未被邀请!" });
- }
- else
- {
- code=200;
- }
- }
- else
- {
- code=1;
- return Ok(new { code, msg = "教师未被邀请" });
- }
- }
- //如果邀请制没有检查通过,则检查其他模式
- if (code!=200)
- {
- //如果是 活动主办方设置了 部分学校参加(包含区级以及公开,选择了学校的)
- if (activity.invitedSchools.IsNotEmpty() && activity.confirmedSchools.IsNotEmpty())
- {
- if (!string.IsNullOrWhiteSpace(enrollData.schoolId))
- {
- if (!activity.invitedSchools.Exists(z => z.id.Equals(enrollData.schoolId)))
- {
- return Ok(new { code = 3, msg = "学校未被邀请参与本次活动!" });
- }
- if (!activity.confirmedSchools.Exists(z => z.id.Equals(enrollData.schoolId) && z.status==1))
- {
- return Ok(new { code = 4, msg = "学校未确认参与本次活动!" });
- }
- code=200;
- }
- else
- {
- return Ok(new { code = 2, msg = "请以学校教师身份参加本次活动!" });
- }
- }
- //完全开放的
- else if (activity.scope.Equals("public") && activity.invitedSchools.IsEmpty())
- {
- code=200;
- }
- else if (activity.scope.Equals("school"))
- {
- if (!string.IsNullOrWhiteSpace(enrollData.schoolId))
- {
- if (activity.owner.Equals(enrollData.schoolId))
- {
- code=200;
- }
- else
- {
- return Ok(new { code = 5, msg = "不是本校的教师不能参加本次活动!" });
- }
- }
- else { return Ok(new { code = 2, msg = "请以学校教师身份参加本次活动!" }); }
- }
- else {
- await _dingDing.SendBotMsg($"{_option.Location},活动类型错误:{activity.id}", GroupNames.成都开发測試群組);
- return Ok(new { code = 6, msg = "活动类型错误!" });
- }
- }
- if (code==200)
- {
- ///检查被报名的活动是是否符合
- if (activity.publish==1 && activity.modules.Contains("Contest"))
- {
- Azure.Response responseContest = await client.GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Contest"));
- if (responseContest.Status==200)
- {
- Contest contest = JsonDocument.Parse(responseContest.Content).RootElement.ToObject<Contest>();
- if (contest.modules.Contains("sign") && contest.sign!=null)
- {
- long now = DateTimeOffset.Now.ToUnixTimeMilliseconds();
- //报名时间检查
- if (contest.sign.stime<=now && contest.sign.etime>=now)
- {
- code=200;
- }
- else {
- return Ok(new { code = 7, msg = "不在报名时间范围内!" });
- }
- //检查报名人数
- if (contest.sign.limit>0) {
- //报名人数,除去自己
- string countEnrollSQL = $"select value c.id from c where c.contest!=null and c.activityId='{_activityId.GetString()}' and c.id<>'{tmdid}' ";
- var countEnrollResult = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Teacher).GetList<string>(countEnrollSQL, $"ActivityEnroll-{_activityId.GetString()}");
- if (countEnrollResult.list.Count+1>contest.sign.limit)
- {
- return Ok(new { code = 8, msg = "已超过报名人数限制!" });
- }
- else { code=200; }
- }
- //检查团队组,检查口令
- if (contest.sign.type==1)
- {
- if (enrollData.type==1)
- {
- if (enrollData.leader==1)
- {
- //队长
- }
- else {
- //队员
- }
- }
- else {
- return Ok(new { code = 9, msg = "参加组别不一致!" });
- }
- }
- else {
- if (contest.sign.type== enrollData.type)
- {
- }
- else {
- return Ok(new { code = 9, msg = "参加组别不一致!" });
- }
- }
- }
- }
- }
- }
- break;
- }
- }
- }
- }
- return Ok();
- }
- class TeacherEnrollContestDto {
- //[Required(ErrorMessage = "Required")]
- //public string activityId { get; set; }
- [Required(ErrorMessage = "Required")]
- public string tmdid { get; set; }
- public string tmdName { get; set; }
- [Required(ErrorMessage = "Required")]
- public string schoolId { get; set; }
- public string schoolName { get; set; }
- public string tmdPicture { get; set; }
- public string schoolPicture { get; set; }
- public long enrollTime { get; set; }
- /// <summary>
- /// 参赛模式 0 个人,1 团队(是否允许跨校)
- /// </summary>
- [Required(ErrorMessage = "Required")]
- public int type { get; set; }
- public string cipher { get; set; }
- public int leader { get; set; }
- public string teamName { get; set; }
- /// <summary>
- /// 表单填报信息
- /// </summary>
- public List<EnrollInfo> enrollInfos { get; set; } = new List<EnrollInfo>();
- }
- /// <summary>
- /// portal站的
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [HttpPost("list-portal")]
- public async Task<IActionResult> ListPortal(JsonElement request) {
- //var authtoken = HttpContext.GetXAuth("AuthToken");
- //string userid = string.Empty;
- //object schoolid = null;
- //if (!string.IsNullOrWhiteSpace(authtoken)) {
- // var jwt = new JwtSecurityToken(authtoken);
- // //TODO 此驗證IdToken先簡單檢查,後面需向Core ID新API,驗證Token
- // userid= jwt.Payload.Sub;
- // jwt.Payload.TryGetValue("azp", out schoolid);
- //}
- if (!request.TryGetProperty("route", out JsonElement _route)) return BadRequest();
- List<ActivityDto> activities = new List<ActivityDto>();
- string sql = $"select value c from c where c.route='{_route}'";
- var result= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsite>(sql, "ActivityWebsite");
- ActivityWebsite website = null;
- if (result.list.Count>1)
- {
- return Ok(new { code = 1, msg = "路由匹配多个区校" });
- }
- else {
- if (result.list.Count==1) {
- website= result.list[0];
- }
- }
-
- if (website!=null)
- {
- if (website.scope.Equals("area"))
- {
- //区级所有学校
- string sqlOpen = $"select value c from c where c.scope='area' and (c.publish=1 or c.publish=2 ) and c.owner='{website.id}' ";
- var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityDto>(sqlOpen, "Activity");
- activities.AddRange(resultOpen.list);
- }
- if (website.scope.Equals("school"))
- {
- School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(website.id, new PartitionKey("Base"));
- //区级下放的
- if (!string.IsNullOrWhiteSpace(schoolbase.areaId))
- {
- //区级所有学校
- 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 ";
- var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityDto>(sqlOpen, "Activity");
- activities.AddRange(resultOpen.list);
- //区级部分学校
- 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 ";
- var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityDto>(sqlSchool, "Activity");
- activities.AddRange(resultSchool.list);
- }
- {
- ///学校自己的
- string sqlSchool = $"select value c from c where c.scope='school' and (c.publish=1 or c.publish=2 ) and c.owner='{schoolbase.id}' ";
- var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityDto>(sqlSchool, "Activity");
- activities.AddRange(resultSchool.list);
- }
- }
- //获取开放的
- {
- //完全开放 所有的学校
- string sqlOpen = $"select value c from c where c.scope='public' and (c.publish=1 or c.publish=2 ) ";
- var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<ActivityDto>(sqlOpen, "Activity");
- activities.AddRange(resultOpen.list);
- }
- }
- activities.ForEach(z =>
- {
- var (blob_uri, blob_sas) = _azureStorage.GetBlobContainerSAS(z.owner, BlobContainerSasPermissions.Read);
- z.sas=blob_sas;
- });
- return Ok(new { activities, website });
- }
- }
- }
|