diff --git a/Learn.Archives.API/Controllers/ExamClassInfoController.cs b/Learn.Archives.API/Controllers/ExamClassInfoController.cs index 3758d59..4d1136d 100644 --- a/Learn.Archives.API/Controllers/ExamClassInfoController.cs +++ b/Learn.Archives.API/Controllers/ExamClassInfoController.cs @@ -7,11 +7,13 @@ using Learn.Archives.Core.Model.Dto; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using MiniExcelLibs; +using System.Buffers.Text; using System.Diagnostics; using System.Security.Claims; using UserCenter.Model; using UserCenter.Model.Common; using UserCenter.Model.Enum; +using static System.Net.Mime.MediaTypeNames; namespace Learn.Archives.API.Controllers { @@ -89,14 +91,13 @@ namespace Learn.Archives.API.Controllers .ToArrayAsync(); var oldUidHash = oldUidAr.ToHashSet(); var db = schoolService.Context; - SqlSugarExpand.SetDbAop(db); foreach (var schoolArr in dataList.GroupBy(s => s.School)) { var school = await schoolService.GetFirstAsync(s => s.Name == schoolArr.Key); if (school == null) Oh.ModelError($"导入失败:学校 [{schoolArr.Key}] 未找到!"); var gradeInfo = GradeHelper.GetStudentGradeBaseByGrade(schoolArr.First().Grade); if (gradeInfo == null) Oh.ModelError($"导入失败:学校 [{schoolArr.Key}] 年级[{schoolArr.First().Grade}]不符合规范!"); - if(exam.Level != GradeHelper.GetGrade(gradeInfo.GradeLevel,gradeInfo.GradeYear).ToEnum()) + if(exam.GradeLevel != gradeInfo.GradeLevel || exam.GradeYear != gradeInfo.GradeYear) Oh.ModelError($"导入失败:导入年级[{schoolArr.First().Grade}] 与 考试年级不匹配!"); //学校下的所属班级 var classArr = await db.Queryable().Where(c => c.SchoolId == school.Id && @@ -165,9 +166,46 @@ namespace Learn.Archives.API.Controllers }; }).ToList(); insertUserInfo.AddRange(userList); - insertUserInfo = insertUserInfo.Where(s => s != null).ToList(); - foreach (var classUserArr in insertUserInfo.GroupBy(s => s.ClassId)) + }; + + if (errorExcelInfo.Count != 0) + return File(errorExcelInfo.ExportExcel(), "application/ms-excel", $"错误考试信息{DateTime.Now.ToString("MMddHHmm")}.xlsx"); + + //写入数据库 + await examUserInfoService.AsInsertable(insertUserInfo).ExecuteCommandAsync(); + + await CalculatingTestResults(exam,examUserInfoService,schoolService); + + return Ok(); + } + + /// + /// 计算考试成绩 + /// + /// + /// + /// + /// + [NonAction] + public static async Task CalculatingTestResults(Exam exam, Repository eUService, Repository sService) + { + var userInfoArr = await eUService.AsQueryable() + .Where(s => s.ExamId == exam.Id) + .ToArrayAsync(); + + var insertTotalClassInfo = new List(); + var db = sService.Context; + foreach (var schoolArr in userInfoArr.GroupBy(s => s.SchoolId)) + { + + var insertClassInfo = new List(); + var school = await sService.GetFirstAsync(s => s.Id == schoolArr.Key); + var classArr = await db.Queryable().Where(c => c.SchoolId == school.Id && + c.GradeLevel == exam.GradeLevel && + c.GraduationYear == exam.GradeYear && !c.DeleteState).ToArrayAsync(); + + foreach (var classUserArr in userInfoArr.GroupBy(s => s.ClassId)) { var classInfo = classArr.First(s => s.Id == classUserArr.Key); var eCInfo = new ExamClassInfo() @@ -182,9 +220,7 @@ namespace Learn.Archives.API.Controllers GradeYear = classInfo.GraduationYear, PeopleCount = classUserArr.Count(), MinScore = int.MaxValue, - EntryPersonId = userInfo.Id, BaseSchoolScore = exam.BaseSchoolScore, - EntryPerson = userInfo.Name, TestPaperType = exam.TestPaperType, Type = exam.Type, Average1 = exam.BaseSchoolScore, @@ -195,12 +231,12 @@ namespace Learn.Archives.API.Controllers { var v = eUserInfo.AssignScore; //上线人数 - if (v>=exam.ScoreLine) - eCInfo.OnLineCount ++; + if (v >= exam.ScoreLine) + eCInfo.OnLineCount++; //最大小分 if (v < eCInfo.MinScore) eCInfo.MinScore = v; - else if(v > eCInfo.MaxScore) + else if (v > eCInfo.MaxScore) eCInfo.MaxScore = v; avgTotal += v;//追加得分 } @@ -208,23 +244,14 @@ namespace Learn.Archives.API.Controllers eCInfo.Average = avgTotal / eCInfo.PeopleCount; //计算上线率 eCInfo.OnLineRate = (decimal)eCInfo.OnLineCount / (decimal)eCInfo.PeopleCount; - //不计算 直接Excel导入 - ////处理学生班级排名 - //var i = 0; - //foreach (var item in classUserArr.OrderByDescending(s => s.AssignScore) - // .GroupBy(s => s.AssignScore)) - //{ - // foreach (var u in item) - // u.AssignRanking =++ i; - //} } - }; - + insertTotalClassInfo.AddRange(insertClassInfo); + } { //计算年级上线率排名 var i = 0; - foreach (var item in insertClassInfo.OrderByDescending(s => s.OnLineRate) + foreach (var item in insertTotalClassInfo.OrderByDescending(s => s.OnLineRate) .GroupBy(s => s.OnLineRate)) { foreach (var u in item) @@ -233,33 +260,28 @@ namespace Learn.Archives.API.Controllers //计算年级平均分排名 i = 0; - foreach (var item in insertClassInfo.OrderByDescending(s => s.Average) + foreach (var item in insertTotalClassInfo.OrderByDescending(s => s.Average) .GroupBy(s => s.Average)) { foreach (var u in item) u.AverageRank = ++i; } } - if (errorExcelInfo.Count != 0) - return File(errorExcelInfo.ExportExcel(), "application/ms-excel", $"错误考试信息{DateTime.Now.ToString("MMddHHmm")}.xlsx"); - //写入数据库 - var baseDB = baseService.Context; + var baseDB = eUService.Context; baseDB.Ado.BeginTran(); try { - await baseDB.Insertable(insertUserInfo).ExecuteCommandAsync(); - await baseDB.Insertable(insertClassInfo).ExecuteCommandAsync(); + await baseDB.Deleteable().Where(s=>s.ExamId==exam.Id).ExecuteCommandAsync(); + await baseDB.Insertable(insertTotalClassInfo).ExecuteCommandAsync(); baseDB.Ado.CommitTran(); - } catch (Exception ex) { - baseDB.Ado.RollbackTran(); + baseDB.Ado.RollbackTran(); Oh.ModelError($"导入失败:写入数据时候出现了异常 [{ex.Message}] !"); } - return Ok(); } /// diff --git a/Learn.Archives.API/Controllers/ExamController.cs b/Learn.Archives.API/Controllers/ExamController.cs index fa86d17..1b8d7d8 100644 --- a/Learn.Archives.API/Controllers/ExamController.cs +++ b/Learn.Archives.API/Controllers/ExamController.cs @@ -3,11 +3,13 @@ using Learn.Archives.API.Controllers.Dto; using Learn.Archives.API.Expand; using Learn.Archives.Core.Common; using Learn.Archives.Core.Model; +using Learn.Archives.Core.Model.Dto; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Diagnostics; using System.Security.Claims; using UserCenter.Model; +using UserCenter.Model.Common; namespace Learn.Archives.API.Controllers { @@ -17,17 +19,59 @@ namespace Learn.Archives.API.Controllers public class ExamController : BackController { readonly Repository baseService; + readonly Repository schoolService; readonly Repository examClassInfoService; readonly Repository examUserInfoService; readonly LiveUserInfo userInfo; - public ExamController(Repository baseService, LiveUserInfo userInfo, Repository examClassInfoService, Repository examUserInfoService) : base(baseService) + public ExamController(Repository baseService, LiveUserInfo userInfo, + Repository examClassInfoService, Repository examUserInfoService, + Repository schoolService) : base(baseService) { this.baseService = baseService; this.userInfo = userInfo; this.examClassInfoService = examClassInfoService; this.examUserInfoService = examUserInfoService; + this.schoolService = schoolService; } + public override Task PageList([FromBody] QueryRequestBase model) + { + var c = model.Conditions.FirstOrDefault(s => s.FieldName == "Grade"); + if (c != null) + { + var gInfo = GradeHelper.GetStudentGradeBaseByGrade(c.FieldValue); + if (gInfo != null) + { + model.Conditions = model.Conditions.Where(s => s != c).ToList(); + model.Conditions.Add(new SqlSugar.ConditionalModel() + { + FieldName = "GradeLevel", + FieldValue = gInfo.GradeLevel, + }); + model.Conditions.Add(new SqlSugar.ConditionalModel() + { + FieldName = "GradeYear", + FieldValue = gInfo.GradeYear.ToString(), + CSharpTypeName = "int" + }); + } + } + return base.PageList(model); + } + public override async Task Edit([FromBody] Exam model) + { + + if (!string.IsNullOrEmpty(model._grade)) + { + var g = GradeHelper.GetStudentGradeBaseByGrade(model._grade); + model.GradeLevel = g.GradeLevel; + model.GradeYear = g.GradeYear; + } + var res =await base.Edit(model); + if (res) + await ExamClassInfoController.CalculatingTestResults(model, examUserInfoService, schoolService); + return res ; + } public override async Task Del([FromBody] params long[] ids) { if (ids.Length > 1) diff --git a/Learn.Archives.API/Controllers/SchoolBusinessController.cs b/Learn.Archives.API/Controllers/SchoolBusinessController.cs index d043afb..dc4ea6c 100644 --- a/Learn.Archives.API/Controllers/SchoolBusinessController.cs +++ b/Learn.Archives.API/Controllers/SchoolBusinessController.cs @@ -165,6 +165,12 @@ namespace Learn.Archives.API.Controllers var adminArr = await adminService.AsQueryable() .Where(s => adminNameArr.Contains(s.Name)) .Select(s => s.Name).ToArrayAsync(); + if (adminArr == null || adminArr.Length!= adminNameArr.Length) + { + imp.Error = $"赴校人员未能完全识别成功"; + errorExcelInfo.Add(imp); + continue; + } var qStr = new Dictionary() { {FeedbackQuestionTypeEnum.学校领导班子,(imp.Q学校领导班子,imp.P学校领导班子) }, @@ -255,8 +261,6 @@ namespace Learn.Archives.API.Controllers }; business.SolutionEnd = business.SolutionRecord.EndRecordTime != null; insertInfo.Add(business); - - }; if (errorExcelInfo.Count != 0) return File(errorExcelInfo.ExportExcel(), "application/ms-excel" @@ -292,7 +296,15 @@ namespace Learn.Archives.API.Controllers //todo完善数据转换 - var resultList = new List() { new SchoolBusinessImport() { } }; + var resultList = new List() { new SchoolBusinessImport() + { + School="必填 与系统对应", + Grade="必填 : 初一/高一/初2025", + IsDiscussion="是/否", + IsClassMeeting="是/否", + Remark="备注", + Users="必填: 例 用户1,用户2 与系统中用户名称对应" + } }; return File(resultList.ExportExcel(), "application/ms-excel", "导入赴校信息模板.xlsx"); } diff --git a/Learn.Archives.Core/Model/Exam.cs b/Learn.Archives.Core/Model/Exam.cs index 8aa2725..58f9fbb 100644 --- a/Learn.Archives.Core/Model/Exam.cs +++ b/Learn.Archives.Core/Model/Exam.cs @@ -5,6 +5,7 @@ using System.ComponentModel.DataAnnotations; using System.Net; using System.Text.Json; using UserCenter.Model; +using UserCenter.Model.Common; using UserCenter.Model.Enum; using UserCenter.Model.Interface; @@ -24,8 +25,27 @@ namespace Learn.Archives.Core.Model /// /// 年级 /// - [SugarColumn(Length = 12)] - public GradeEnum Level { get; set; } + [SugarColumn(Length = 2)] + public string? GradeLevel { get; set; } + /// + /// 毕业届 + /// + [SugarColumn(Length = 2)] + public int GradeYear { get; set; } + + /// + /// dto 处理的grade + /// + public string? _grade; + /// + /// 年级 + /// + [SugarColumn(IsIgnore = true)] + public string Grade + { + get => GradeHelper.GetGrade(GradeLevel, GradeYear); + set => _grade = value; + } /// /// 试卷类型 /// diff --git a/Learn.Archives.Core/Model/ExamClassInfo.cs b/Learn.Archives.Core/Model/ExamClassInfo.cs index 1f2a9bf..4223d4c 100644 --- a/Learn.Archives.Core/Model/ExamClassInfo.cs +++ b/Learn.Archives.Core/Model/ExamClassInfo.cs @@ -61,6 +61,7 @@ namespace Learn.Archives.Core.Model [SugarColumn(IsIgnore = true)] public string Grade => GradeHelper.GetGrade(GradeLevel, GradeYear); + /// /// 年级 /// @@ -119,15 +120,6 @@ namespace Learn.Archives.Core.Model public decimal BaseSchoolScore { get; set; } - /// - /// 录入人Id - /// - public long EntryPersonId { get; set; } - /// - /// 录入人名称 - /// - public string EntryPerson { get; set; } = string.Empty; - /// /// 创建时间 ///