Compare commits

...

6 Commits

Author SHA1 Message Date
hy 36520ab5ec Merge pull request 'staging' (#49) from staging into master
Reviewed-on: #49
2025-12-04 18:37:26 +08:00
hy 613e5edb32 Merge pull request '新增 无法识别的考试成绩 提示错误' (#48) from dev into staging
Reviewed-on: #48
2025-12-04 18:35:20 +08:00
小肥羊 8d3cca7151 新增 无法识别的考试成绩 提示错误
优化 计算考试成绩时 出现了无效的学校会忽略
2025-12-04 18:34:51 +08:00
hy 8a9838c541 Merge pull request 'dev' (#47) from dev into staging
Reviewed-on: #47
2025-12-04 17:57:32 +08:00
小肥羊 04572bca1d 优化 考试成绩导入时不校验得分类型
优化 所有请求操作都记录日志
2025-12-04 17:56:47 +08:00
小肥羊 59fb668b98 优化 导入学生信息的excel转换方式 2025-12-02 10:01:52 +08:00
4 changed files with 50 additions and 40 deletions

View File

@ -65,61 +65,61 @@ namespace Learn.Archives.API.Controllers.Dto
/// 语文 /// 语文
/// </summary> /// </summary>
[ExcelColumnName("语文")] [ExcelColumnName("语文")]
public decimal { get; set; } public string { get; set; }
/// <summary> /// <summary>
/// 数学 /// 数学
/// </summary> /// </summary>
[ExcelColumnName("数学")] [ExcelColumnName("数学")]
public decimal { get; set; } public string { get; set; }
/// <summary> /// <summary>
/// 英语 /// 英语
/// </summary> /// </summary>
[ExcelColumnName("英语")] [ExcelColumnName("英语")]
public decimal { get; set; } public string { get; set; }
/// <summary> /// <summary>
/// 物理 /// 物理
/// </summary> /// </summary>
[ExcelColumnName("物理")] [ExcelColumnName("物理")]
public decimal { get; set; } public string { get; set; }
/// <summary> /// <summary>
/// 化学 /// 化学
/// </summary> /// </summary>
[ExcelColumnName("化学")] [ExcelColumnName("化学")]
public decimal { get; set; } public string { get; set; }
/// <summary> /// <summary>
/// 生物 /// 生物
/// </summary> /// </summary>
[ExcelColumnName("生物")] [ExcelColumnName("生物")]
public decimal { get; set; } public string { get; set; }
/// <summary> /// <summary>
/// 政治 /// 政治
/// </summary> /// </summary>
[ExcelColumnName("政治")] [ExcelColumnName("政治")]
public decimal { get; set; } public string { get; set; }
/// <summary> /// <summary>
/// 历史 /// 历史
/// </summary> /// </summary>
[ExcelColumnName("历史")] [ExcelColumnName("历史")]
public decimal { get; set; } public string { get; set; }
/// <summary> /// <summary>
/// 地理 /// 地理
/// </summary> /// </summary>
[ExcelColumnName("地理")] [ExcelColumnName("地理")]
public decimal { get; set; } public string { get; set; }
/// <summary> /// <summary>
/// 赋分后总分 /// 赋分后总分
/// </summary> /// </summary>
[ExcelColumnName("赋分后总分")] [ExcelColumnName("赋分后总分")]
public decimal { get; set; } public string { get; set; }
/// <summary> /// <summary>
/// 总分资源校排名 /// 总分资源校排名

View File

@ -116,6 +116,12 @@ namespace Learn.Archives.API.Controllers
} }
var grade = GradeHelper.GetStudentGradeBaseByGrade(s.Grade); var grade = GradeHelper.GetStudentGradeBaseByGrade(s.Grade);
var sub = ImportExamInfoSubjectDic(s); var sub = ImportExamInfoSubjectDic(s);
if(sub is null)
{
s.Error = "遇到了无法处理成绩值! 请检查本行的成绩";
errorExcelInfo.Add(s);
return null;
}
var name = s.Class + s.Student; var name = s.Class + s.Student;
if (!userDic.ContainsKey(name)) if (!userDic.ContainsKey(name))
{ {
@ -130,6 +136,9 @@ namespace Learn.Archives.API.Controllers
errorExcelInfo.Add(s); errorExcelInfo.Add(s);
return null; return null;
} }
var assignScore = decimal.TryParse(s..Trim(), out decimal ass)
? ass
: 0m;
return new ExamUserInfo() return new ExamUserInfo()
{ {
ExamId = exam.Id, ExamId = exam.Id,
@ -143,7 +152,7 @@ namespace Learn.Archives.API.Controllers
SchoolId = classInfo.SchoolId, SchoolId = classInfo.SchoolId,
Type = exam.Type, Type = exam.Type,
SubjectDic = sub, SubjectDic = sub,
AssignScore = s., AssignScore = assignScore,
AssignRanking = s., AssignRanking = s.,
}; };
}).ToList(); }).ToList();
@ -172,20 +181,20 @@ namespace Learn.Archives.API.Controllers
{ {
List<ImportExamInfo> resultList = new List<ImportExamInfo>() { new ImportExamInfo() List<ImportExamInfo> resultList = new List<ImportExamInfo>() { new ImportExamInfo()
{ {
School="例子学校[导入时候请删除]", School="例子学校[导入时候请删除本行]",
Class="测试班级", Class="测试班级",
Grade="高2028", Grade="高2028",
Student="学生姓名", Student="学生姓名",
=80.5m, = "得分 例: 80.5",
=80.5m, = "得分 例: 80.5",
=80m, = "得分 例: 80.5",
= 80m, = "得分 例: 80.5",
= 80m, = "得分 例: 80.5",
= 80m, = "得分 例: 80.5",
= 80m, = "得分 例: 80.5",
= 80m, = "得分 例: 80.5",
= 80.5m, = "得分 例: 80.5",
=721.5m ="赋分后总分",
} }; } };
return File(resultList.ExportExcel(), "application/ms-excel", return File(resultList.ExportExcel(), "application/ms-excel",
$"导入成绩模板{DateTime.Now.ToString("MMddHHmm")}.xlsx"); $"导入成绩模板{DateTime.Now.ToString("MMddHHmm")}.xlsx");
@ -287,7 +296,7 @@ namespace Learn.Archives.API.Controllers
[NonAction] [NonAction]
private Dictionary<SubjectEnum, decimal>? ImportExamInfoSubjectDic(ImportExamInfo info) private Dictionary<SubjectEnum, decimal>? ImportExamInfoSubjectDic(ImportExamInfo info)
{ {
return new Dictionary<SubjectEnum, decimal>() var c = new Dictionary<SubjectEnum, string>()
{ {
{ SubjectEnum., info.}, { SubjectEnum., info.},
{ SubjectEnum., info.}, { SubjectEnum., info.},
@ -299,6 +308,17 @@ namespace Learn.Archives.API.Controllers
{ SubjectEnum., info.}, { SubjectEnum., info.},
{ SubjectEnum., info.}, { SubjectEnum., info.},
}; };
var res = new Dictionary<SubjectEnum, decimal>();
foreach (var item in c)
{
if (string.IsNullOrWhiteSpace(item.Value))
res.Add(item.Key, 0m);
else if (decimal.TryParse(item.Value.Trim(), out decimal r))
res.Add(item.Key, r);
else
return null;
}
return res;
} }
[NonAction] [NonAction]
private static decimal? SubjectScore(ExamUserInfo info, SubjectEnum? s) private static decimal? SubjectScore(ExamUserInfo info, SubjectEnum? s)
@ -336,8 +356,9 @@ namespace Learn.Archives.API.Controllers
var db = sService.Context; var db = sService.Context;
foreach (var schoolArr in userInfoArr.GroupBy(s => s.SchoolId)) foreach (var schoolArr in userInfoArr.GroupBy(s => s.SchoolId))
{ {
var school = await sService.GetFirstAsync(s => s.Id == schoolArr.Key); var school = await sService.GetFirstAsync(s => s.Id == schoolArr.Key);
if(school is null)
continue;
var classArr = await db.Queryable<Classes>() var classArr = await db.Queryable<Classes>()
.Where(c => c.SchoolId == school.Id && .Where(c => c.SchoolId == school.Id &&
c.GradeLevel == exam.GradeLevel && c.GradeLevel == exam.GradeLevel &&

View File

@ -261,19 +261,8 @@ namespace Learn.Archives.API.Controllers
[HttpLogEnable] [HttpLogEnable]
public async Task<IActionResult> Import(IFormFile? file) public async Task<IActionResult> Import(IFormFile? file)
{ {
var dataList = await _httpContextAccessor.ParsingExcelAsync<StudentInfoImportError>();
var fl = file != null ? file : _httpContextAccessor.HttpContext?.Request.Form.Files[0]; dataList = dataList.Where(s => !string.IsNullOrEmpty(s.School)).ToArray();
if (fl == null) Oh.ModelError("传入无效的数据");
if (!Path.GetExtension(fl.FileName).Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
Oh.ModelError("请选择导入文件为.xlsx的后缀名!");
//分析excel
IEnumerable<StudentInfoImportError> dataList;
using var stream = new MemoryStream();
{
await fl.CopyToAsync(stream);
dataList = stream.Query<StudentInfoImportError>()
.Where(s => !string.IsNullOrEmpty(s.School));
}
if (dataList == null || dataList.Count() == 0) if (dataList == null || dataList.Count() == 0)
Oh.ModelError("导入失败:无有效数据"); Oh.ModelError("导入失败:无有效数据");
var insertInfo = new List<Student>(); var insertInfo = new List<Student>();

View File

@ -152,8 +152,8 @@ namespace Learn.Archives.API.Expand
{ {
//特殊处理ResultIgnore不进行返回结果包装原样输出 //特殊处理ResultIgnore不进行返回结果包装原样输出
var endpoint = context.GetEndpoint(); var endpoint = context.GetEndpoint();
// 直接返回原始结果,不封装 // 所有数据不允许删除
if (endpoint?.Metadata.GetMetadata<HttpLogEnable>() == null&& e is null) return; //if (endpoint?.Metadata.GetMetadata<HttpLogEnable>() == null&& e is null) return;
string request = null; string request = null;
var logId = Yitter.IdGenerator.YitIdHelper.NextId(); var logId = Yitter.IdGenerator.YitIdHelper.NextId();
@ -204,7 +204,7 @@ namespace Learn.Archives.API.Expand
Url = context.Request.Path + context.Request.QueryString, Url = context.Request.Path + context.Request.QueryString,
Method = context.Request.Method, Method = context.Request.Method,
Request = request, Request = request,
IP = $"{userInfo.Scope} {context.Connection?.RemoteIpAddress?.ToString()}", IP = $"{userInfo.Scope} {userInfo.Name} {context.Connection?.RemoteIpAddress?.ToString()}",
ResponseCode = result?.Code ?? -1, ResponseCode = result?.Code ?? -1,
Response = (result != null ? JsonSerializer.Serialize(result) : null) , Response = (result != null ? JsonSerializer.Serialize(result) : null) ,
Authorization = context.Request.Headers.ContainsKey("Authorization") Authorization = context.Request.Headers.ContainsKey("Authorization")