123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443 |
- 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;
- 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;
- public IConfiguration _configuration { get; set; }
- public ActivityController(AzureRedisFactory azureRedis, AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, CoreAPIHttpService coreAPIHttpService, AzureServiceBusFactory serviceBus, AzureStorageFactory azureStorage, IConfiguration configuration)
- {
- _azureCosmos = azureCosmos;
- _dingDing = dingDing;
- _option = option?.Value;
- _serviceBus = serviceBus;
- _configuration = configuration;
- _azureStorage = azureStorage;
- _azureRedis = azureRedis;
- _coreAPIHttpService = coreAPIHttpService;
- }
- /// <summary>
- /// 添加活动参与对象,学校,教师
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- [AuthToken(Roles = "admin,area")]
- [HttpPost("invite-target")]
- [Authorize(Roles = "IES")]
- 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();
- string sql = string.Empty;
- if (_scope.GetString().Equals("public", StringComparison.OrdinalIgnoreCase))
- {
- sql = "select c.id,c.name ,c.picture,c.region,c.province,c.city,c.areaId from c where c.code='Base' ";
- }
- else {
- if (!request.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
- 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));
- 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>(sql, "Base-Area");
- if (areaResult.list.IsNotEmpty()) {
- List<dynamic> schools= new List<dynamic>();
- 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 = result.list.Select(z=>new { z.id,z.name,z.picture,z.region,z.province,z.city,z.areaId, areaName = string.Empty }) });
- }
- 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")]
- [Authorize(Roles = "IES")]
- 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 { error = ResponseCode._400ParamsError, 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);
- //}
- //醍摩豆智慧学区
- if (!activity.owner.Equals("02944f32-f534-3397-ea56-e6f1fc6c3714", StringComparison.OrdinalIgnoreCase) && activity.scope.Equals("public", StringComparison.OrdinalIgnoreCase))
- {
- return Ok(new { error = ResponseCode._400ParamsError, msg = "公开的活动只能由醍摩豆智慧学区发布!" });
- }
- 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 { error = ResponseCode._400ParamsError, msg = "赛课信息参数错误" });
- }
- Contest contest = _activity.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 { error = ResponseCode._400ParamsError, msg = "评审未配置" });
- }
- if (contest.review== null) {
- return Ok(new { error = ResponseCode._400ParamsError, 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));
- }
- else
- {
- return Ok(validResult);
- }
- break;
- }
- 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.scope='area' and c.owner='{_areaId}' {yearSql} ";
- //醍摩豆智慧学区
- if (_areaId.GetString().Equals("02944f32-f534-3397-ea56-e6f1fc6c3714", StringComparison.OrdinalIgnoreCase)) {
- sql = $"select value c from c where c.owner='{_areaId}' {yearSql } and ( c.scope='area' or c.scope='public' ) ";
- }
- var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sql, "Activity");
- 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<Activity> activities = new List<Activity>();
- 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<Activity>(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<Activity>(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<Activity>(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<Activity>(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<Activity>(sqlSchool, "Activity");
- activities.AddRange(resultSchool.list);
- }
- return Ok(new { activities = activities.OrderByDescending(z => z.stime) });
- }
- break;
- }
-
- case bool when $"{grant_type}".Equals("list-teacher", StringComparison.OrdinalIgnoreCase):
- {
- List<Activity> activities = new List<Activity>();
- string yearSql = $" and c.year={DateTimeOffset.Now.Year}";
- if (request.TryGetProperty("year", out JsonElement _year))
- {
- yearSql = $" and c.year={_year}";
- }
- if (!string.IsNullOrWhiteSpace(school)) {
- School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
- //获取区级下放的
- {
-
- if (!string.IsNullOrWhiteSpace(schoolbase.areaId))
- {
- //区级所有学校
- string sqlOpen = $"select value c from c join s in c.confirmedSchools 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) and s.id='{school}' and s.status=1 ";
- var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
- resultOpen.list.ForEach(z => {
- //处理是否是邀请制
- if (z.joinMode.Equals("invite"))
- {
- var inviteTeacher = z.inviteTeachers.Find(t => t.id.Equals(tmdid));
- if (inviteTeacher!=null) {
- activities.Add(z);
- }
- }
- else
- {
- activities.Add(z);
- }
- });
- //区级部分学校
- string sqlSchool = $"select value c from c join i in c.invitedSchools join s in c.confirmedSchools where c.scope='area'{yearSql} and (c.publish=1 or c.publish=2 ) and c.owner='{schoolbase.areaId}' and i.id='{school}' and s.id='{school}' and s.status=1 ";
- var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
- resultSchool.list.ForEach(z => {
- //处理是否是邀请制
- if (z.joinMode.Equals("invite"))
- {
- var inviteTeacher = z.inviteTeachers.Find(t => t.id.Equals(tmdid));
- if (inviteTeacher!=null)
- {
- activities.Add(z);
- }
- }
- else
- {
- activities.Add(z);
- }
- });
- }
- }
- //获取学校自己的
- {
- string sqlSchool = $"select value c from c where c.scope='school'{yearSql} and (c.publish=1 or c.publish=2 ) and c.owner='{school}' ";
- var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
- resultSchool.list.ForEach(z => {
- //处理是否是邀请制
- if (z.joinMode.Equals("invite"))
- {
- var inviteTeacher = z.inviteTeachers.Find(t => t.id.Equals(tmdid));
- if (inviteTeacher!=null)
- {
- activities.Add(z);
- }
- }
- else {
- activities.Add(z);
- }
- });
- }
- }
- //获取开放的
- {
- //完全开放 所有的学校
- 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<Activity>(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='public'{yearSql} and (c.publish=1 or c.publish=2 ) and i.id='{school}' and s.id='{school}' and s.status=1 ";
- var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
- resultSchool.list.ForEach(z => {
- //处理是否是邀请制
- if (z.joinMode.Equals("invite"))
- {
- var inviteTeacher = z.inviteTeachers.Find(t => t.id.Equals(tmdid));
- if (inviteTeacher!=null)
- {
- activities.Add(z);
- }
- }
- else
- {
- activities.Add(z);
- }
- });
- }
- break;
- }
- case bool when $"{grant_type}".Equals("list-portal", StringComparison.OrdinalIgnoreCase):
- {
- break;
- }
- }
- }catch (Exception ex)
- {
- }
- return Ok();
- }
- }
- }
|