ActivityController.cs 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  1. using Azure.Cosmos;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.Extensions.Options;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Text.Json;
  10. using System.Threading.Tasks;
  11. using TEAMModelOS.Models;
  12. using TEAMModelOS.SDK.Models;
  13. using TEAMModelOS.SDK.DI;
  14. using TEAMModelOS.SDK.Extension;
  15. using Azure;
  16. using Microsoft.Extensions.Configuration;
  17. using TEAMModelOS.Filter;
  18. using HTEXLib.COMM.Helpers;
  19. using TEAMModelOS.SDK;
  20. using StackExchange.Redis;
  21. using System.Text.RegularExpressions;
  22. using Microsoft.AspNetCore.Authorization;
  23. using OpenXmlPowerTools;
  24. using System.IdentityModel.Tokens.Jwt;
  25. using Microsoft.AspNetCore.Routing;
  26. namespace TEAMModelOS.Controllers
  27. {
  28. [ProducesResponseType(StatusCodes.Status200OK)]
  29. [ProducesResponseType(StatusCodes.Status400BadRequest)]
  30. [Route("activity")]
  31. [ApiController]
  32. public class ActivityController : ControllerBase
  33. {
  34. private AzureCosmosFactory _azureCosmos;
  35. private readonly DingDing _dingDing;
  36. private readonly CoreAPIHttpService _coreAPIHttpService;
  37. private readonly Option _option;
  38. private readonly AzureServiceBusFactory _serviceBus;
  39. private readonly AzureStorageFactory _azureStorage;
  40. private readonly AzureRedisFactory _azureRedis;
  41. public IConfiguration _configuration { get; set; }
  42. public ActivityController(AzureRedisFactory azureRedis, AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, CoreAPIHttpService coreAPIHttpService, AzureServiceBusFactory serviceBus, AzureStorageFactory azureStorage, IConfiguration configuration)
  43. {
  44. _azureCosmos = azureCosmos;
  45. _dingDing = dingDing;
  46. _option = option?.Value;
  47. _serviceBus = serviceBus;
  48. _configuration = configuration;
  49. _azureStorage = azureStorage;
  50. _azureRedis = azureRedis;
  51. _coreAPIHttpService = coreAPIHttpService;
  52. }
  53. /// <summary>
  54. /// 路由管理
  55. /// </summary>
  56. /// <param name="request"></param>
  57. /// <returns></returns>
  58. [ProducesDefaultResponseType]
  59. [AuthToken(Roles = "admin,area")]
  60. [HttpPost("website-manage")]
  61. [Authorize(Roles = "IES")]
  62. public async Task<IActionResult> WebsiteManage(JsonElement request) {
  63. (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
  64. if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
  65. {
  66. switch (true)
  67. {
  68. case bool when $"{grant_type}".Equals("update", StringComparison.OrdinalIgnoreCase):
  69. {
  70. break;
  71. }
  72. case bool when $"{grant_type}".Equals("list", StringComparison.OrdinalIgnoreCase):
  73. {
  74. List<ActivityWebsite> websites = new List<ActivityWebsite>();
  75. if (!request.TryGetProperty("websiteId", out JsonElement _websiteId)) return BadRequest();
  76. if (!request.TryGetProperty("scope", out JsonElement _scope)) return BadRequest();
  77. string websiteId = _websiteId.GetString();
  78. if (websiteId.Equals("02944f32-f534-3397-ea56-e6f1fc6c3714", StringComparison.OrdinalIgnoreCase) )
  79. {
  80. Azure.Response teammodelResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync("teammodel", new PartitionKey("ActivityWebsite"));
  81. if (teammodelResponse.Status == 200)
  82. {
  83. ActivityWebsite activityWebsite = JsonDocument.Parse(teammodelResponse.Content).RootElement.ToObject<ActivityWebsite>();
  84. websites.Add(activityWebsite);
  85. }
  86. else {
  87. ActivityWebsite website = new ActivityWebsite
  88. {
  89. id="teammodel",
  90. pk="ActivityWebsite",
  91. code="ActivityWebsite",
  92. route="teammodel",
  93. scope="public",
  94. };
  95. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website, new PartitionKey(website.code));
  96. websites.Add(website);
  97. }
  98. }
  99. Azure.Response activityWebsiteResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(websiteId, new PartitionKey("ActivityWebsite"));
  100. if (activityWebsiteResponse.Status == 200)
  101. {
  102. ActivityWebsite activityWebsite = JsonDocument.Parse(activityWebsiteResponse.Content).RootElement.ToObject<ActivityWebsite>();
  103. websites.Add(activityWebsite);
  104. }
  105. else {
  106. string route = string.Empty;
  107. if (_scope.GetString().Equals("area", StringComparison.OrdinalIgnoreCase))
  108. {
  109. Area area = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<Area>(websiteId, new PartitionKey("Base-Area"));
  110. if (!string.IsNullOrWhiteSpace(area.shortCode))
  111. {
  112. route=area.shortCode;
  113. }
  114. }
  115. if (_scope.GetString().Equals("school", StringComparison.OrdinalIgnoreCase))
  116. {
  117. route=websiteId;
  118. }
  119. if (!string.IsNullOrWhiteSpace(route))
  120. {
  121. ActivityWebsite website = new ActivityWebsite
  122. {
  123. id=websiteId,
  124. pk="ActivityWebsite",
  125. code="ActivityWebsite",
  126. route=route,
  127. scope=_scope.GetString(),
  128. };
  129. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website, new PartitionKey(website.code));
  130. websites.Add(website);
  131. }
  132. else {
  133. return Ok(new { code = 1, msg = "区级简码未设置" });
  134. }
  135. return Ok(new { code = 200, websites });
  136. }
  137. break;
  138. }
  139. }
  140. }
  141. return Ok();
  142. }
  143. /// <summary>
  144. /// 添加活动参与对象,学校,教师
  145. /// </summary>
  146. /// <param name="request"></param>
  147. /// <returns></returns>
  148. [ProducesDefaultResponseType]
  149. [AuthToken(Roles = "admin,area")]
  150. [HttpPost("invite-target")]
  151. #if !DEBUG
  152. [Authorize(Roles = "IES")]
  153. #endif
  154. public async Task<IActionResult> InviteTarget(JsonElement request)
  155. {
  156. (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
  157. if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
  158. switch (true)
  159. {
  160. case bool when $"{grant_type}".Equals("schools", StringComparison.OrdinalIgnoreCase):
  161. {
  162. if (!request.TryGetProperty("scope", out JsonElement _scope)) return BadRequest();
  163. if (!request.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
  164. string sql = string.Empty;
  165. if (_scope.GetString().Equals("public", StringComparison.OrdinalIgnoreCase) && _areaId.GetString().Equals( "02944f32-f534-3397-ea56-e6f1fc6c3714"))
  166. {
  167. sql = "select c.id,c.name ,c.picture,c.region,c.province,c.city,c.areaId from c where c.code='Base' ";
  168. }
  169. else {
  170. 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}' ";
  171. }
  172. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<School>(sql, "Base");
  173. var sc = result.list.FindAll(z => !string.IsNullOrWhiteSpace(z.areaId));
  174. List<dynamic> schools = new List<dynamic>();
  175. if (sc.IsNotEmpty()) {
  176. string areaSql = $"select value c from c where c.id in ({string.Join(",", sc.Select(z => $"'{z.areaId}'").ToHashSet())})";
  177. var areaResult = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<Area>(areaSql, "Base-Area");
  178. if (areaResult.list.IsNotEmpty()) {
  179. foreach (var item in result.list) {
  180. if (!string.IsNullOrWhiteSpace(item.areaId))
  181. {
  182. var area = areaResult.list.Find(z => z.id.Equals(item.areaId));
  183. schools.Add(new { item.id, item.name, item.picture, item.region, item.province, item.city, item.areaId, areaName = area?.name });
  184. }
  185. else {
  186. schools.Add(new { item.id, item.name, item.picture, item.region, item.province, item.city, item.areaId, areaName = string.Empty });
  187. }
  188. }
  189. }
  190. }
  191. return Ok(new { code = 200, schools });
  192. }
  193. case bool when $"{grant_type}".Equals("teachers", StringComparison.OrdinalIgnoreCase):
  194. {
  195. if (!string.IsNullOrWhiteSpace(school)) {
  196. School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  197. string sql = $"select c.id,c.name ,c.picture from c where c.code='Teacher-{school}' ";
  198. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<SchoolTeacher>(sql, $"Teacher-{school}");
  199. return Ok(new { code = 200, teachers = result.list.Select(z => new { z.id, z.name, z.picture, school, schooName = schoolbase.name }) });
  200. }
  201. break;
  202. }
  203. }
  204. return Ok(new { code = 400 });
  205. }
  206. /// <summary>
  207. /// 管理
  208. /// </summary>
  209. /// <param name="request"></param>
  210. /// <returns></returns>
  211. [ProducesDefaultResponseType]
  212. [AuthToken(Roles = "teacher,admin,area")]
  213. [HttpPost("manage")]
  214. #if !DEBUG
  215. [Authorize(Roles = "IES")]
  216. #endif
  217. public async Task<IActionResult> Manage(JsonElement request)
  218. {
  219. try
  220. {
  221. (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
  222. if (!request.TryGetProperty("grant_type", out JsonElement grant_type)) return BadRequest();
  223. var client = _azureCosmos.GetCosmosClient();
  224. switch (true)
  225. {
  226. case bool when $"{grant_type}".Equals("create", StringComparison.OrdinalIgnoreCase):
  227. {
  228. if (!request.TryGetProperty("Activity", out JsonElement _activity)) return Ok(new { code = 1, msg = "活动信息参数错误" });
  229. Activity activity = _activity.ToObject<Activity>();
  230. activity.id=!string.IsNullOrWhiteSpace(activity.id) ? activity.id : Guid.NewGuid().ToString();
  231. activity.code="Activity";
  232. activity.pk="Activity";
  233. //如果是区级活动,enroll报名制,则学校的确认状态默认为1 。
  234. //if (activity.scope.Equals("area", StringComparison.OrdinalIgnoreCase) && activity.joinMode.Equals("enroll", StringComparison.OrdinalIgnoreCase))
  235. //{
  236. // activity.schools.ForEach(z => z.status=1);
  237. //}
  238. //醍摩豆智慧学区
  239. if (!activity.owner.Equals("02944f32-f534-3397-ea56-e6f1fc6c3714", StringComparison.OrdinalIgnoreCase) && activity.scope.Equals("public", StringComparison.OrdinalIgnoreCase))
  240. {
  241. return Ok(new { code = 2, msg = "公开的活动只能由醍摩豆智慧学区发布!" });
  242. }
  243. {
  244. string websiteId = activity.owner;
  245. string route = string.Empty;
  246. if (activity.owner.Equals("02944f32-f534-3397-ea56-e6f1fc6c3714", StringComparison.OrdinalIgnoreCase) && activity.scope.Equals("public", StringComparison.OrdinalIgnoreCase)) {
  247. websiteId="teammodel";
  248. route="teammodel";
  249. }
  250. Azure.Response activityWebsiteResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(websiteId, new PartitionKey("ActivityWebsite"));
  251. if (activityWebsiteResponse.Status!=200) {
  252. if (activity.scope.Equals("area", StringComparison.OrdinalIgnoreCase)) {
  253. Area area = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemAsync<Area>(activity.owner, new PartitionKey("Base-Area"));
  254. if (!string.IsNullOrWhiteSpace(area.shortCode)) {
  255. route=area.shortCode;
  256. }
  257. }
  258. if (activity.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
  259. {
  260. route=activity.owner;
  261. }
  262. if (!string.IsNullOrWhiteSpace(route))
  263. {
  264. ActivityWebsite website = new ActivityWebsite
  265. {
  266. id=websiteId,
  267. pk="ActivityWebsite",
  268. code="ActivityWebsite",
  269. route=route,
  270. scope=activity.scope,
  271. };
  272. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).UpsertItemAsync(website, new PartitionKey(website.code));
  273. }
  274. }
  275. }
  276. Contest contest = null;
  277. ValidResult validResult = activity.Valid();
  278. if (validResult.isVaild)
  279. {
  280. activity.creatorId=tmdid;
  281. activity.createTime= DateTimeOffset.Now.ToUnixTimeMilliseconds();
  282. activity.year=DateTimeOffset.Now.Year;
  283. foreach (var module in activity.modules) {
  284. switch (true)
  285. {
  286. //赛课
  287. case bool when module.Equals("Contest"):
  288. {
  289. if (!request.TryGetProperty("Contest", out JsonElement _contest))
  290. {
  291. return Ok(new { code =3, msg = "赛课信息参数错误" });
  292. }
  293. contest = _contest.ToObject<Contest>();
  294. if (contest!=null) {
  295. contest.id=activity.id;
  296. contest.code="Contest";
  297. contest.pk="Contest";
  298. ValidResult validResultContest = contest.Valid();
  299. if (validResultContest.isVaild)
  300. {
  301. if (contest.modules.Contains("review")) {
  302. if (!request.TryGetProperty("reviewConfig", out JsonElement _reviewConfig))
  303. {
  304. return Ok(new { code = 4, msg = "评审未配置" });
  305. }
  306. if (contest.review== null) {
  307. return Ok(new { code = 4, msg = "评审未配置" });
  308. }
  309. ReviewRuleTree ruleTree = _reviewConfig.ToObject<ReviewRuleTree>();
  310. var reviewRule = await ActivityService.UpsertReviewRule(ruleTree, activity, _azureCosmos);
  311. contest.review.ruleId = reviewRule.id;
  312. contest.review.ruleName = reviewRule.name;
  313. }
  314. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).UpsertItemAsync(contest, new PartitionKey(contest.code));
  315. }
  316. else {
  317. return Ok(validResult);
  318. }
  319. }
  320. break;
  321. }
  322. //培训
  323. case bool when module.Equals("Training"):
  324. {
  325. break;
  326. }
  327. //教研
  328. case bool when module.Equals("Research"):
  329. {
  330. break;
  331. }
  332. }
  333. }
  334. //保存活动基础信息
  335. await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).UpsertItemAsync(activity, new PartitionKey(activity.code));
  336. return Ok(new { activity, contest ,code=200});
  337. }
  338. else
  339. {
  340. return Ok(validResult);
  341. }
  342. break;
  343. }
  344. case bool when $"{grant_type}".Equals("list-area", StringComparison.OrdinalIgnoreCase):
  345. {
  346. if (!request.TryGetProperty("areaId", out JsonElement _areaId)) return BadRequest();
  347. string yearSql = $" and c.year={DateTimeOffset.Now.Year}";
  348. if (request.TryGetProperty("year", out JsonElement _year)) {
  349. yearSql = $" and c.year={_year}";
  350. }
  351. string sql = $"select value c from c where c.scope='area' and c.owner='{_areaId}' {yearSql} ";
  352. //醍摩豆智慧学区
  353. if (_areaId.GetString().Equals("02944f32-f534-3397-ea56-e6f1fc6c3714", StringComparison.OrdinalIgnoreCase)) {
  354. sql = $"select value c from c where c.owner='{_areaId}' {yearSql} and ( c.scope='area' or c.scope='public' ) ";
  355. }
  356. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sql, "Activity");
  357. return Ok(new { activities = result.list.OrderByDescending(z => z.stime) });
  358. }
  359. case bool when $"{grant_type}".Equals("list-school", StringComparison.OrdinalIgnoreCase):
  360. {
  361. if (!string.IsNullOrWhiteSpace(school)) {
  362. School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  363. List<Activity> activities = new List<Activity>();
  364. string yearSql = $" and c.year={DateTimeOffset.Now.Year}";
  365. if (request.TryGetProperty("year", out JsonElement _year))
  366. {
  367. yearSql = $" and c.year={_year}";
  368. }
  369. //获取开放的
  370. {
  371. //完全开放 所有的学校
  372. 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 ) ";
  373. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  374. activities.AddRange(resultOpen.list);
  375. //部分学校
  376. 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}' ";
  377. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  378. resultSchool.list.ForEach(z => {
  379. var confirmedSchool = z.confirmedSchools.Find(z => z.id.Equals(school));
  380. if (confirmedSchool==null)
  381. {
  382. z.confirmedSchools.Add(new ActivityConfirmedSchool
  383. {
  384. id=schoolbase.id,
  385. name=schoolbase.name,
  386. picture=schoolbase.picture,
  387. status=0
  388. });
  389. }
  390. });
  391. activities.AddRange(resultSchool.list);
  392. }
  393. //获取区级下放的
  394. {
  395. if (!string.IsNullOrWhiteSpace(schoolbase.areaId)) {
  396. //区级所有学校
  397. 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) ";
  398. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  399. resultOpen.list.ForEach(z => {
  400. var confirmedSchool = z.confirmedSchools.Find(z => z.id.Equals(school));
  401. if (confirmedSchool==null)
  402. {
  403. z.confirmedSchools.Add(new ActivityConfirmedSchool
  404. {
  405. id=schoolbase.id,
  406. name=schoolbase.name,
  407. picture=schoolbase.picture,
  408. status=0
  409. });
  410. }
  411. });
  412. activities.AddRange(resultOpen.list);
  413. //区级部分学校
  414. 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}' ";
  415. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  416. resultSchool.list.ForEach(z => {
  417. var confirmedSchool = z.confirmedSchools.Find(z => z.id.Equals(school));
  418. if (confirmedSchool==null)
  419. {
  420. z.confirmedSchools.Add(new ActivityConfirmedSchool
  421. {
  422. id=schoolbase.id,
  423. name=schoolbase.name,
  424. picture=schoolbase.picture,
  425. status=0
  426. });
  427. }
  428. });
  429. activities.AddRange(resultSchool.list);
  430. }
  431. }
  432. //获取学校自己的
  433. {
  434. string sqlSchool = $"select value c from c where c.scope='school'{yearSql} and c.owner='{school}' ";
  435. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  436. activities.AddRange(resultSchool.list);
  437. }
  438. return Ok(new { activities = activities.OrderByDescending(z => z.stime) });
  439. }
  440. break;
  441. }
  442. case bool when $"{grant_type}".Equals("list-teacher", StringComparison.OrdinalIgnoreCase):
  443. {
  444. List<Activity> activities = new List<Activity>();
  445. string yearSql = $" and c.year={DateTimeOffset.Now.Year}";
  446. if (request.TryGetProperty("year", out JsonElement _year))
  447. {
  448. yearSql = $" and c.year={_year}";
  449. }
  450. if (!string.IsNullOrWhiteSpace(school)) {
  451. School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(school, new PartitionKey("Base"));
  452. //获取区级下放的
  453. {
  454. if (!string.IsNullOrWhiteSpace(schoolbase.areaId))
  455. {
  456. //区级所有学校
  457. 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 ";
  458. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  459. resultOpen.list.ForEach(z => {
  460. //处理是否是邀请制
  461. if (z.joinMode.Equals("invite"))
  462. {
  463. var inviteTeacher = z.inviteTeachers.Find(t => t.id.Equals(tmdid));
  464. if (inviteTeacher!=null) {
  465. activities.Add(z);
  466. }
  467. }
  468. else
  469. {
  470. activities.Add(z);
  471. }
  472. });
  473. //区级部分学校
  474. 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 ";
  475. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  476. resultSchool.list.ForEach(z => {
  477. //处理是否是邀请制
  478. if (z.joinMode.Equals("invite"))
  479. {
  480. var inviteTeacher = z.inviteTeachers.Find(t => t.id.Equals(tmdid));
  481. if (inviteTeacher!=null)
  482. {
  483. activities.Add(z);
  484. }
  485. }
  486. else
  487. {
  488. activities.Add(z);
  489. }
  490. });
  491. }
  492. }
  493. //获取学校自己的
  494. {
  495. string sqlSchool = $"select value c from c where c.scope='school'{yearSql} and (c.publish=1 or c.publish=2 ) and c.owner='{school}' ";
  496. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  497. resultSchool.list.ForEach(z => {
  498. //处理是否是邀请制
  499. if (z.joinMode.Equals("invite"))
  500. {
  501. var inviteTeacher = z.inviteTeachers.Find(t => t.id.Equals(tmdid));
  502. if (inviteTeacher!=null)
  503. {
  504. activities.Add(z);
  505. }
  506. }
  507. else {
  508. activities.Add(z);
  509. }
  510. });
  511. }
  512. }
  513. //获取开放的
  514. {
  515. //完全开放 所有的学校
  516. 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 ) ";
  517. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  518. activities.AddRange(resultOpen.list);
  519. //部分学校
  520. 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 ";
  521. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  522. resultSchool.list.ForEach(z => {
  523. //处理是否是邀请制
  524. if (z.joinMode.Equals("invite"))
  525. {
  526. var inviteTeacher = z.inviteTeachers.Find(t => t.id.Equals(tmdid));
  527. if (inviteTeacher!=null)
  528. {
  529. activities.Add(z);
  530. }
  531. }
  532. else
  533. {
  534. activities.Add(z);
  535. }
  536. });
  537. }
  538. return Ok(new { activities = activities.OrderByDescending(z => z.stime) });
  539. }
  540. case bool when $"{grant_type}".Equals("read-contest", StringComparison.OrdinalIgnoreCase):
  541. {
  542. Contest contest = null;
  543. ReviewRuleTree reviewRule = null;
  544. if (!request.TryGetProperty("activityId", out JsonElement _activityId)) return BadRequest();
  545. Azure.Response response = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("Contest"));
  546. if (response.Status==200) {
  547. contest= JsonDocument.Parse(response.Content).RootElement.ToObject<Contest>() ;
  548. if (contest.modules.Contains("review")) {
  549. Azure.Response reviewRuleResponse = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).ReadItemStreamAsync(_activityId.GetString(), new PartitionKey("ReviewRule-disposable"));
  550. if (reviewRuleResponse.Status==200) {
  551. ReviewRule reviewRuleDB = JsonDocument.Parse(reviewRuleResponse.Content).RootElement.ToObject<ReviewRule>();
  552. var tree = ActivityService.ListToTree(reviewRuleDB.configs);
  553. reviewRule=new ReviewRuleTree
  554. {
  555. name= reviewRuleDB.name,
  556. owner= reviewRuleDB.owner,
  557. sourceName= reviewRuleDB.sourceName,
  558. trees=tree
  559. };
  560. }
  561. }
  562. }
  563. return Ok(new { code = 200, contest, reviewRule });
  564. }
  565. //获取评审的模板列表
  566. case bool when $"{grant_type}".Equals("rule-list", StringComparison.OrdinalIgnoreCase):
  567. {
  568. if (!request.TryGetProperty("owner", out JsonElement _owner)) return BadRequest();
  569. var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ReviewRule>($"select value c from c where c.owner='{_owner}'", "ReviewRule-template");
  570. List<ReviewRuleTree> reviewRules = new List<ReviewRuleTree>();
  571. foreach (var item in result.list)
  572. {
  573. var tree = ActivityService.ListToTree(item.configs);
  574. ReviewRuleTree reviewRule=new ReviewRuleTree
  575. {
  576. name= item.name,
  577. owner= item.owner,
  578. sourceName= item.sourceName,
  579. trees=tree,
  580. upsertAsTemplate=1
  581. };
  582. reviewRules.Add(reviewRule);
  583. }
  584. return Ok(new { reviewRules });
  585. }
  586. }
  587. } catch (Exception ex)
  588. {
  589. }
  590. return Ok();
  591. }
  592. /// <summary>
  593. /// portal站的
  594. /// </summary>
  595. /// <param name="request"></param>
  596. /// <returns></returns>
  597. [ProducesDefaultResponseType]
  598. [HttpPost("list-portal")]
  599. public async Task<IActionResult> ListPortal(JsonElement request) {
  600. //var authtoken = HttpContext.GetXAuth("AuthToken");
  601. //string userid = string.Empty;
  602. //object schoolid = null;
  603. //if (!string.IsNullOrWhiteSpace(authtoken)) {
  604. // var jwt = new JwtSecurityToken(authtoken);
  605. // //TODO 此驗證IdToken先簡單檢查,後面需向Core ID新API,驗證Token
  606. // userid= jwt.Payload.Sub;
  607. // jwt.Payload.TryGetValue("azp", out schoolid);
  608. //}
  609. if (!request.TryGetProperty("route", out JsonElement _route)) return BadRequest();
  610. List<Activity> activities = new List<Activity>();
  611. string sql = $"select value c from c where c.route='{_route}'";
  612. var result= await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Normal).GetList<ActivityWebsite>(sql, "ActivityWebsite");
  613. ActivityWebsite website = null;
  614. if (result.list.Count>1)
  615. {
  616. return Ok(new { code = 1, msg = "路由匹配多个区校" });
  617. }
  618. else {
  619. if (result.list.Count==1) {
  620. website= result.list[0];
  621. }
  622. }
  623. if (website!=null)
  624. {
  625. if (website.scope.Equals("area"))
  626. {
  627. //区级所有学校
  628. string sqlOpen = $"select value c from c where c.scope='area' and (c.publish=1 or c.publish=2 ) and c.owner='{website.id}' ";
  629. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  630. activities.AddRange(resultOpen.list);
  631. }
  632. if (website.scope.Equals("school"))
  633. {
  634. School schoolbase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(website.id, new PartitionKey("Base"));
  635. //区级下放的
  636. if (!string.IsNullOrWhiteSpace(schoolbase.areaId))
  637. {
  638. //区级所有学校
  639. 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 ";
  640. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  641. activities.AddRange(resultOpen.list);
  642. //区级部分学校
  643. 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 ";
  644. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  645. activities.AddRange(resultSchool.list);
  646. }
  647. {
  648. ///学校自己的
  649. string sqlSchool = $"select value c from c where c.scope='school' and (c.publish=1 or c.publish=2 ) and c.owner='{schoolbase.id}' ";
  650. var resultSchool = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlSchool, "Activity");
  651. activities.AddRange(resultSchool.list);
  652. }
  653. }
  654. //获取开放的
  655. {
  656. //完全开放 所有的学校
  657. string sqlOpen = $"select value c from c where c.scope='public' and (c.publish=1 or c.publish=2 ) ";
  658. var resultOpen = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Common).GetList<Activity>(sqlOpen, "Activity");
  659. activities.AddRange(resultOpen.list);
  660. }
  661. }
  662. return Ok(new { activities, website });
  663. }
  664. }
  665. }