|
@@ -5,6 +5,12 @@ using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.Options;
|
|
using Microsoft.Extensions.Options;
|
|
|
|
+using OfficeOpenXml;
|
|
|
|
+using StackExchange.Redis;
|
|
|
|
+using System;
|
|
|
|
+using System.Collections.Generic;
|
|
|
|
+using System.ComponentModel;
|
|
|
|
+using System.Linq;
|
|
using System.Text.Json;
|
|
using System.Text.Json;
|
|
using System.Threading.Tasks;
|
|
using System.Threading.Tasks;
|
|
using TEAMModelOS.Filter;
|
|
using TEAMModelOS.Filter;
|
|
@@ -12,6 +18,7 @@ using TEAMModelOS.Models;
|
|
using TEAMModelOS.SDK;
|
|
using TEAMModelOS.SDK;
|
|
using TEAMModelOS.SDK.DI;
|
|
using TEAMModelOS.SDK.DI;
|
|
using TEAMModelOS.SDK.Extension;
|
|
using TEAMModelOS.SDK.Extension;
|
|
|
|
+using TEAMModelOS.SDK.Models;
|
|
using TEAMModelOS.SDK.Models.Cosmos.School;
|
|
using TEAMModelOS.SDK.Models.Cosmos.School;
|
|
|
|
|
|
namespace TEAMModelOS.Controllers
|
|
namespace TEAMModelOS.Controllers
|
|
@@ -52,27 +59,246 @@ namespace TEAMModelOS.Controllers
|
|
_httpTrigger = httpTrigger;
|
|
_httpTrigger = httpTrigger;
|
|
}
|
|
}
|
|
|
|
|
|
- [ProducesDefaultResponseType]
|
|
|
|
- [AuthToken(Roles = "teacher,admin")]
|
|
|
|
- [HttpPost("import-check")]
|
|
|
|
-
|
|
|
|
|
|
+ // [AuthToken(Roles = "teacher,admin")]
|
|
|
|
+ [HttpPost("read-excel")]
|
|
|
|
+ //[Authorize(Roles = "IES")]
|
|
|
|
+ //[AuthToken(Roles = "teacher,admin,business")]
|
|
|
|
+ [RequestSizeLimit(102_400_000_00)] //最大10000m左右
|
|
|
|
+ public async Task<IActionResult> ReadExcel([FromForm] IFormFile file) {
|
|
|
|
+ // var (id, _, _, school) = HttpContext.GetAuthTokenInfo();
|
|
|
|
+ ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
|
|
|
|
+ using (ExcelPackage package = new ExcelPackage(file.OpenReadStream()))
|
|
|
|
+ {
|
|
|
|
+ ExcelWorksheets sheet = package.Workbook.Worksheets;
|
|
|
|
+ List<string> baseTitle = new List<string>();
|
|
|
|
+ List<string> baseData = new List<string>();
|
|
|
|
+ List<string> itemTitle = new List<string>();
|
|
|
|
+ List<List<string>> itemDatas = new List<List<string>>();
|
|
|
|
+ Dictionary<string, string> baseInfo = new Dictionary<string, string>();
|
|
|
|
+ List<Dictionary<string, string>> itemInfo = new List<Dictionary<string, string>>();
|
|
|
|
+ HashSet<string> subjects = new HashSet<string>();
|
|
|
|
+ //读取Exam_
|
|
|
|
+ var exam_sheet = sheet.Where(z => z.Name.StartsWith("Exam_")).FirstOrDefault();
|
|
|
|
+ if (exam_sheet!=null )
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ var rows = exam_sheet.Dimension.Rows;
|
|
|
|
+ var columns = exam_sheet.Dimension.Columns;
|
|
|
|
+ for (int r = 1; r < rows; r++) {
|
|
|
|
+ List<string> itemData = null;
|
|
|
|
+ if (r >= 4) {
|
|
|
|
+ itemData= new List<string>();
|
|
|
|
+ }
|
|
|
|
+ for (int c = 1; c < columns; c++) {
|
|
|
|
+ var value = exam_sheet.GetValue(r, c);
|
|
|
|
+ if (r == 1)
|
|
|
|
+ {
|
|
|
|
+ if (!string.IsNullOrWhiteSpace($"{value}"))
|
|
|
|
+ {
|
|
|
|
+ baseTitle.Add($"{value}");
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (r == 2)
|
|
|
|
+ {
|
|
|
|
+ if (c > baseTitle.Count)
|
|
|
|
+ {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ baseData.Add($"{value}");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (r == 3)
|
|
|
|
+ {
|
|
|
|
+ if (!string.IsNullOrWhiteSpace($"{value}"))
|
|
|
|
+ {
|
|
|
|
+ itemTitle.Add($"{value}");
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ if (c > itemTitle.Count)
|
|
|
|
+ {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ itemData.Add($"{value}");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (itemData != null) {
|
|
|
|
+ itemDatas.Add(itemData);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < baseTitle.Count; i++)
|
|
|
|
+ {
|
|
|
|
+ baseInfo.Add(baseTitle[i], baseData[i]);
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < itemDatas.Count; i++)
|
|
|
|
+ {
|
|
|
|
+ Dictionary<string, string> item = new Dictionary<string, string>();
|
|
|
|
+ for (int j = 0; j < itemTitle.Count; j++)
|
|
|
|
+ {
|
|
|
|
+ item.Add(itemTitle[j], itemDatas[i][j]);
|
|
|
|
+ }
|
|
|
|
+ itemInfo.Add(item);
|
|
|
|
+ subjects.Add(itemDatas[i][0]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ List<Dictionary<string, object>> students = new List<Dictionary<string, object>>();
|
|
|
|
+ if (subjects.Count > 0) {
|
|
|
|
+ foreach (var subject in subjects) {
|
|
|
|
+ List<string> titles = new List<string>();
|
|
|
|
+ List<string> datas = new List<string>();
|
|
|
|
+ var subject_sheet = sheet.Where(z => z.Name.StartsWith($"Sub_{subject}")).FirstOrDefault();
|
|
|
|
+ if (subject_sheet != null)
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ var rows = subject_sheet.Dimension.Rows;
|
|
|
|
+ var columns = subject_sheet.Dimension.Columns;
|
|
|
|
+ for (int r = 1; r < rows; r++)
|
|
|
|
+ {
|
|
|
|
+ for (int c = 1; c < columns; c++)
|
|
|
|
+ {
|
|
|
|
+ var value = subject_sheet.GetValue(r, c);
|
|
|
|
+ if (r == 1)
|
|
|
|
+ {
|
|
|
|
+ if (!string.IsNullOrWhiteSpace($"{value}"))
|
|
|
|
+ {
|
|
|
|
+ titles.Add($"{value}");
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ if (c > titles.Count)
|
|
|
|
+ {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ datas.Add($"{value}");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < datas.Count; i++)
|
|
|
|
+ {
|
|
|
|
+ Dictionary<string, object> item = new Dictionary<string, object>();
|
|
|
|
+ List<KeyValuePair<int, int>> _index_order = new List<KeyValuePair<int, int>>();
|
|
|
|
+ for (int j = 0; j < titles.Count; j++)
|
|
|
|
+ {
|
|
|
|
+ if (int.TryParse(titles[j], out int index))
|
|
|
|
+ {
|
|
|
|
+ _index_order.Add(new KeyValuePair<int, int>(index , j));
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ item.Add(titles[j], datas[i]);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ var orders = _index_order.OrderBy(x => x.Key).Select(x => x.Value).ToList();
|
|
|
|
+ List<double> scores = new List<double>();
|
|
|
|
+ for (int j = 0; j < orders.Count; j++)
|
|
|
|
+ {
|
|
|
|
+ double score = 0;
|
|
|
|
+ double.TryParse(datas[j], out score);
|
|
|
|
+ scores.Add(score);
|
|
|
|
+ }
|
|
|
|
+ item.Add("scores", scores);
|
|
|
|
+ students.Add(item);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return Ok(new { baseTitle, baseData, itemTitle, itemDatas, subjects, baseInfo, itemInfo, students });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ [ProducesDefaultResponseType]
|
|
|
|
+ // [AuthToken(Roles = "teacher,admin")]
|
|
|
|
+ [HttpPost("import-check")]
|
|
public async Task<IActionResult> ImportCheck(JsonElement json) {
|
|
public async Task<IActionResult> ImportCheck(JsonElement json) {
|
|
|
|
|
|
var importExam = json.ToObject<ImportExam>();
|
|
var importExam = json.ToObject<ImportExam>();
|
|
-
|
|
|
|
var validData= importExam.Valid();
|
|
var validData= importExam.Valid();
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+ if (!validData.isVaild) {
|
|
|
|
+ return Ok(new { code = 400, error = validData.errors.SelectMany(z => z.Value).ToList() });
|
|
|
|
+ }
|
|
|
|
+ List<string> error = new List<string>();
|
|
|
|
+ List<string> warn = new List<string>();
|
|
string sql = $"select value c from c where c.name ='{importExam.name}'";
|
|
string sql = $"select value c from c where c.name ='{importExam.name}'";
|
|
var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<ExamImport>(sql,$"ExamImport-{importExam.school}",pageSize:1);
|
|
var result = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).GetList<ExamImport>(sql,$"ExamImport-{importExam.school}",pageSize:1);
|
|
ExamImport examImport = null;
|
|
ExamImport examImport = null;
|
|
- if (string.IsNullOrEmpty(result.continuationToken)) {
|
|
|
|
-
|
|
|
|
|
|
+ if (string.IsNullOrEmpty(result.continuationToken)) {
|
|
|
|
+ warn.Add("name_duplicate");//评测名称重复
|
|
}
|
|
}
|
|
if (result.list.IsNotEmpty()) {
|
|
if (result.list.IsNotEmpty()) {
|
|
examImport = result.list[0];
|
|
examImport = result.list[0];
|
|
|
|
+ warn.Add("name_update");//同名评测数据更新
|
|
|
|
+ }
|
|
|
|
+ if (examImport == null) {
|
|
|
|
+ examImport= new ExamImport { name=importExam.name,type=importExam.type,school=importExam.school};
|
|
|
|
+ if (DateTimeOffset.TryParse(importExam.time, out DateTimeOffset dateTime))
|
|
|
|
+ {
|
|
|
|
+ examImport.time = dateTime.ToUnixTimeMilliseconds();
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ error.Add("time_format");// 时间格式错误
|
|
|
|
+ return Ok(new { code = 400, error });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ School schoolBase = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.School).ReadItemAsync<School>(importExam.school, new Azure.Cosmos.PartitionKey("Base"));
|
|
|
|
+ Period period = schoolBase.period.Find(x => x.id.Equals(importExam.periodId));
|
|
|
|
+ if (period != null) {
|
|
|
|
+ foreach (var item in importExam.subjects)
|
|
|
|
+ {
|
|
|
|
+ var subject = period.subjects.Find(z => z.name.Equals(item.subject ));
|
|
|
|
+ if (subject != null)
|
|
|
|
+ {
|
|
|
|
+ // 学号确定的学生
|
|
|
|
+ var ids = item.students.Where(z => !string.IsNullOrWhiteSpace(z.id)).Select(x=>x.id);
|
|
|
|
+ //没有学号 ,且姓名和班级信息不全的
|
|
|
|
+ var studentInvalid = item.students.Where(z => string.IsNullOrWhiteSpace(z.id) && (string.IsNullOrWhiteSpace(z.name)||string.IsNullOrWhiteSpace(z.classId)));
|
|
|
|
+ if(studentInvalid.Any())
|
|
|
|
+ {
|
|
|
|
+ error.Add("student_invalid ");// 学生信息不全
|
|
|
|
+ return Ok(new { code = 400, error, studentInvalid });
|
|
|
|
+ }
|
|
|
|
+ var classesStu = item.students.Where(z => !string.IsNullOrWhiteSpace(z.classId) && string.IsNullOrWhiteSpace(z.id) ).Select(x => x.id);
|
|
|
|
+ List<string>classNames = new List<string>();
|
|
|
|
+ foreach(var clazz in classesStu)
|
|
|
|
+ {
|
|
|
|
+ var cls = clazz.Split("-");
|
|
|
|
+ if (cls.Length == 2 && int.TryParse(cls[0], out int year) && year>2000 && int.TryParse(cls[1], out int no) && no>0)
|
|
|
|
+ {
|
|
|
|
+ string sqlClazz = $"select value c from c where c.year={year} and c.no ='{cls[1]}' and ";
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ classNames.Add(clazz);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ error.Add("subject_invalid");// 科目不存在
|
|
|
|
+ return Ok(new { code = 400, error });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return Ok();
|
|
return Ok();
|
|
}
|
|
}
|