123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- using Microsoft.AspNetCore.Mvc;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TEAMModelOS.SDK;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Models;
- using TEAMModelOS.SDK.Helper.Common.StringHelper;
- using Microsoft.AspNetCore.Http;
- using System.IdentityModel.Tokens.Jwt;
- using Azure.Cosmos;
- using TEAMModelOS.SDK.Extension;
- using TEAMModelOS.SDK.DI;
- using System.Text;
- using Azure.Messaging.ServiceBus;
- using Microsoft.Extensions.Configuration;
- using Microsoft.AspNetCore.Authorization;
- using TEAMModelOS.Filter;
- using TEAMModelOS.SDK.Services;
- using DocumentFormat.OpenXml.Office2010.Excel;
- namespace TEAMModelOS.Controllers
- {
- [ProducesResponseType(StatusCodes.Status200OK)]
- [ProducesResponseType(StatusCodes.Status400BadRequest)]
-
- [Route("paper")]
- [ApiController]
- public class PaperController: ControllerBase
- {
- private readonly SnowflakeId _snowflakeId;
- private readonly AzureCosmosFactory _azureCosmos;
- private readonly AzureStorageFactory _azureStorage;
- private readonly AzureServiceBusFactory _serviceBus;
- private readonly DingDing _dingDing;
- private readonly AzureRedisFactory _azureRedis;
- public IConfiguration _configuration { get; set; }
- public PaperController(AzureRedisFactory azureRedis,AzureCosmosFactory azureCosmos, SnowflakeId snowflakeId,AzureStorageFactory azureStorage, AzureServiceBusFactory serviceBus, IConfiguration configuration, DingDing dingDing)
- {
- _azureCosmos = azureCosmos;
- _snowflakeId = snowflakeId;
- _azureStorage = azureStorage;
- _serviceBus = serviceBus;
- _configuration = configuration;
- _dingDing = dingDing;
- _azureRedis = azureRedis;
- }
- /// <summary>
- /// 删除
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "teacher")]
- [HttpPost("delete")]
- [AuthToken(Roles = "teacher,admin,student")]
- #if !DEBUG
- [Authorize(Roles = "IES")]
- #endif
- public async Task<IActionResult> Delete(JsonElement request)
- {
- if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
- if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
- if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
- //ResponseBuilder builder = ResponseBuilder.custom();
- Paper paper;
- var client = _azureCosmos.GetCosmosClient();
- //删除blob 相关资料
- await _azureStorage.GetBlobServiceClient().DeleteBlobs(_dingDing, code.ToString().Replace("Paper-",""), new List<string> { $"paper/{id}" });
- //通知删除信息
- await BlobService.RefreshBlobRoot(new BlobRefreshMessage { progress = "delete", root = $"paper", name = code.ToString().Replace("Paper-", "") }, _serviceBus, _configuration, _azureRedis);
- if (scope.ToString().Equals("school"))
- {
- paper = await client.GetContainer(Constant.TEAMModelOS, "School").DeleteItemAsync<Paper>(id.ToString(), new PartitionKey($"{code}"));
- }
- else {
- paper = await client.GetContainer(Constant.TEAMModelOS, "Teacher").DeleteItemAsync<Paper>(id.ToString(), new PartitionKey($"{code}"));
- }
- //IdPk items = await _azureCosmos.DeleteAsync<Paper>(request.id, request.pk);
- return Ok(new { paper });
- }
- /// <summary>
- /// 查询试卷摘要信息
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "teacher")]
- [HttpPost("find-summary")]
- [AuthToken(Roles = "teacher,admin,student")]
- #if !DEBUG
- [Authorize(Roles = "IES")]
- #endif
- public async Task<IActionResult> findSummary(JsonElement request)
- {
- //ResponseBuilder builder = ResponseBuilder.custom();
- if (!request.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
- if (!request.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
- var jwt = new JwtSecurityToken(id_token.GetString());
- var id = jwt.Payload.Sub;
- var client = _azureCosmos.GetCosmosClient();
- List<object> papers = new List<object>();
- var query = $"select c.id,c.subjectCode,c.code,c.periodCode,c.name,c.itemCount,c.level,c.pointItem,c.pointScore,c.score,c.gradeCode,c.createTime,c.sheet,c.sheetNo,c.tags ,c.mode ,c.itemSort from c where c.id = {id}";
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{school_code}") }))
- {
- using var json = await JsonDocument.ParseAsync(item.ContentStream);
- if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- {
- foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- {
- papers.Add(obj.ToObject<object>());
- }
- }
- }
- return Ok(new { papers });
- /* List<string> props = new List<string> {
- "subjectCode", "id", "code", "periodCode",
- "name","itemCount","level","pointItem","pointScore","score", "gradeCode"
- };
- if (StringHelper.getKeyCount(request) > 0)
- {
- return builder.Data(await _azureCosmos.FindByDict<Paper>(request, propertys: props)).build();
- }
- else {
- return builder.build();
- }*/
- }
- /// <summary>
- /// 查询试卷
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "teacher")]
- [HttpPost("find")]
- [AuthToken(Roles = "teacher,admin,student")]
- #if !DEBUG
- [Authorize(Roles = "IES")]
- #endif
- public async Task<IActionResult> Find(JsonElement request)
- {
- //ResponseBuilder builder = ResponseBuilder.custom();
- //if (!request.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
- if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
- if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
- var client = _azureCosmos.GetCosmosClient();
- StringBuilder sql = new StringBuilder();
- Dictionary<string, object> dict = new Dictionary<string, object>();
- var emobj = request.EnumerateObject();
- while (emobj.MoveNext())
- {
- dict[emobj.Current.Name] = emobj.Current.Value;
- }
- //处理code
- if (dict.TryGetValue("code", out object _))
- {
- dict.Remove("code");
- }
- List<Paper> papers = new List<Paper>();
-
- if (scope.ToString().Equals("school"))
- {
- sql.Append("select c.id,c.code,c.name,c.blob,c.periodId,c.gradeIds,c.subjectId,c.subjectName,c.score,c.useCount,c.scope,c.scoring,c.createTime,c.sheet ,c.mode ,c.sheetNo, c.tags,c.itemSort from c");
- AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<Paper>(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{code}") }))
- {
- papers.Add(item);
- //using var json = await JsonDocument.ParseAsync(item.ContentStream);
- //if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- //{
- // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- // {
- // papers.Add(obj.ToObject<object>());
- // }
- //}
- }
- }
- if (scope.ToString().Equals("private"))
- {
- sql.Append("select c.id,c.code,c.name,c.blob,c.subjectName,c.score,c.useCount,c.scope,c.scoring ,c.createTime ,c.sheet,c.sheetNo ,c.mode , c.tags, c.itemSort from c");
- AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Teacher").GetItemQueryIterator<Paper>(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Paper-{code}") }))
- {
- papers.Add(item);
- //using var json = await JsonDocument.ParseAsync(item.ContentStream);
- //if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
- //{
- // foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
- // {
- // papers.Add(obj.ToObject<object>());
- // }
- //}
- }
- }
- return Ok(new { papers });
- /*if (StringHelper.getKeyCount(request) > 0) {
- return builder.Data(await _azureCosmos.FindByDict<Paper>(request)).build();
- }
- else
- {
- return builder.build();
- }*/
- }
- /// <summary>
- /// 保存试卷
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "teacher")]
- [HttpPost("check-paper-name")]
- [AuthToken(Roles = "teacher,admin,student")]
- #if !DEBUG
- [Authorize(Roles = "IES")]
- #endif
- public async Task<IActionResult> CheckPaperName(JsonElement request) {
- var client = _azureCosmos.GetCosmosClient();
- if (!request.TryGetProperty("scope", out JsonElement _scope)) return BadRequest();
- if (!request.TryGetProperty("name", out JsonElement _name)) return BadRequest();
- if (!request.TryGetProperty("code", out JsonElement _code)) return BadRequest();
- string tbname = $"{_scope}".Equals("private") ? "Teacher" : "School";
- string sql = $"select * from c where c.name='{_name}' ";
- List<Paper> papers = new List<Paper>();
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, tbname).GetItemQueryIterator<Paper>(sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"Paper-{_code}") }))
- {
- papers.Add(item);
- }
- return Ok(new { papers });
- }
- /// <summary>
- /// 保存试卷
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "teacher")]
- [HttpPost("upsert")]
- [Authorize(Roles = "IES")]
- public async Task<IActionResult> Upsert(JsonElement request)
- {
- var client = _azureCosmos.GetCosmosClient();
- if (!request.TryGetProperty("paper", out JsonElement _paper)) return BadRequest();
- if (!request.TryGetProperty("option", out JsonElement option)) return BadRequest();
- Paper paper;
- paper = _paper.ToObject<Paper>();
- paper.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
- paper.size = await _azureStorage.GetBlobContainerClient(paper.code).GetBlobsSize($"paper/{paper.id}");
- await BlobService.RefreshBlobRoot(new BlobRefreshMessage { progress = "update", root = $"paper", name = $"{paper.code}".Replace("Paper-", "") }, _serviceBus, _configuration, _azureRedis);
- paper.code = "Paper-" + paper.code;
- if (option.ToString().Equals("insert"))
- {
- string tbname = paper.scope.Equals("private") ? "Teacher" : "School";
- string sql = $"select * from c where c.name='{paper.name}' ";
- List<Paper> papers = new List<Paper>();
- await foreach (var item in client.GetContainer(Constant.TEAMModelOS, tbname).GetItemQueryIterator<Paper>(sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey(paper.code) }))
- {
- papers.Add(item);
- }
- await client.GetContainer(Constant.TEAMModelOS, tbname).DeleteItemsStreamAsync(papers.Select(x => x.id).ToList(), paper.code);
- paper = await client.GetContainer(Constant.TEAMModelOS, tbname).UpsertItemAsync(paper, new PartitionKey($"{paper.code}"));
- }
- else
- {
- if (paper.scope.Equals("private"))
- {
- paper = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
- }
- else
- {
- paper = await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
- }
- }
- return Ok(new { paper });
- }
- /// <summary>
- /// 更新试卷的答题卡
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [ProducesDefaultResponseType]
- //[AuthToken(Roles = "teacher")]
- [HttpPost("upsert-sheet")]
- [AuthToken(Roles = "teacher,admin,student")]
- #if !DEBUG
- [Authorize(Roles = "IES")]
- #endif
- public async Task<IActionResult> UpsertSheet(JsonElement request)
- {
- try {
- var client = _azureCosmos.GetCosmosClient();
- if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
- if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
- if (!request.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
- if (!request.TryGetProperty("sheet", out JsonElement sheet)) return BadRequest();
- if ($"{scope}".Equals("school"))
- {
- Paper paper = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<Paper>($"{id}", new PartitionKey($"Paper-{code}"));
- paper.sheet = $"{sheet}";
- await client.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
- }
- else
- {
- Paper paper = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Paper>($"{id}", new PartitionKey($"Paper-{code}"));
- paper.sheet = $"{sheet}";
- await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync(paper, paper.id, new PartitionKey($"{paper.code}"));
- }
- return Ok(new { status = 200 });
- } catch (CosmosException ex)
- {
- if (ex.Status == 404)
- {
- return Ok(new { status = 404 });
- }
- else {
- return Ok(new { status = 500 });
- }
- }
- }
- }
- }
|