dev #16
|
|
@ -1,7 +1,15 @@
|
||||||
using MiniExcelLibs.Attributes;
|
using Learn.Archives.Core.Model;
|
||||||
|
using MiniExcelLibs.Attributes;
|
||||||
|
|
||||||
namespace Learn.Archives.API.Controllers.Dto
|
namespace Learn.Archives.API.Controllers.Dto
|
||||||
{
|
{
|
||||||
|
public class ExamClassTagReq : ExamClassTag
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 学科类型
|
||||||
|
/// </summary>
|
||||||
|
public string SubjectStr => SubjectId?.ToString() ?? "总分";
|
||||||
|
}
|
||||||
public class ImportExamDto
|
public class ImportExamDto
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -46,11 +54,6 @@ namespace Learn.Archives.API.Controllers.Dto
|
||||||
[ExcelColumnName("云校班级号")]
|
[ExcelColumnName("云校班级号")]
|
||||||
public string Class { get; set; }
|
public string Class { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[ExcelColumnName("班级类型")]
|
|
||||||
public string ClassType { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// 学生姓名
|
/// 学生姓名
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[ExcelColumnName("学生姓名")]
|
[ExcelColumnName("学生姓名")]
|
||||||
|
|
|
||||||
|
|
@ -27,13 +27,14 @@ namespace Learn.Archives.API.Controllers
|
||||||
readonly Repository<Exam> examService;
|
readonly Repository<Exam> examService;
|
||||||
readonly Repository<School> schoolService;
|
readonly Repository<School> schoolService;
|
||||||
readonly Repository<ExamTags> tagService;
|
readonly Repository<ExamTags> tagService;
|
||||||
|
readonly Repository<ExamClassTag> classTagService;
|
||||||
readonly Repository<ExamUserInfo> examUserInfoService;
|
readonly Repository<ExamUserInfo> examUserInfoService;
|
||||||
readonly LiveUserInfo userInfo;
|
readonly LiveUserInfo userInfo;
|
||||||
readonly IHttpContextAccessor accessor;
|
readonly IHttpContextAccessor accessor;
|
||||||
public ExamClassInfoController(Repository<ExamClassInfo> baseService, LiveUserInfo userInfo,
|
public ExamClassInfoController(Repository<ExamClassInfo> baseService, LiveUserInfo userInfo,
|
||||||
IHttpContextAccessor httpContext, Repository<ExamUserInfo> examUserInfoService,
|
IHttpContextAccessor httpContext, Repository<ExamUserInfo> examUserInfoService,
|
||||||
Repository<Exam> examService, Repository<School> schoolService,
|
Repository<Exam> examService, Repository<School> schoolService,
|
||||||
Repository<ExamTags> tagService) : base(baseService)
|
Repository<ExamTags> tagService, Repository<ExamClassTag> classTagService) : base(baseService)
|
||||||
{
|
{
|
||||||
this.baseService = baseService;
|
this.baseService = baseService;
|
||||||
this.userInfo = userInfo;
|
this.userInfo = userInfo;
|
||||||
|
|
@ -42,37 +43,9 @@ namespace Learn.Archives.API.Controllers
|
||||||
this.examService = examService;
|
this.examService = examService;
|
||||||
this.schoolService = schoolService;
|
this.schoolService = schoolService;
|
||||||
this.tagService = tagService;
|
this.tagService = tagService;
|
||||||
|
this.classTagService = classTagService;
|
||||||
}
|
}
|
||||||
|
|
||||||
[NonAction]
|
|
||||||
private Dictionary<SubjectEnum, decimal>? ImportExamInfoSubjectDic(ImportExamInfo info)
|
|
||||||
{
|
|
||||||
return new Dictionary<SubjectEnum, decimal>()
|
|
||||||
{
|
|
||||||
{ SubjectEnum.语文, info.语文},
|
|
||||||
{ SubjectEnum.数学, info.数学},
|
|
||||||
{ SubjectEnum.英语, info.英语},
|
|
||||||
{ SubjectEnum.物理, info.物理},
|
|
||||||
{ SubjectEnum.化学, info.化学},
|
|
||||||
{ SubjectEnum.生物, info.生物},
|
|
||||||
{ SubjectEnum.政治, info.政治},
|
|
||||||
{ SubjectEnum.历史, info.历史},
|
|
||||||
{ SubjectEnum.地理, info.地理},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
[NonAction]
|
|
||||||
private static decimal? SubjectScore(ExamUserInfo info,SubjectEnum? s)
|
|
||||||
{
|
|
||||||
switch (s)
|
|
||||||
{
|
|
||||||
case null:
|
|
||||||
return info.AssignScore;
|
|
||||||
default:
|
|
||||||
if (info?.SubjectDic is null)
|
|
||||||
return -999;
|
|
||||||
return info.SubjectDic.ContainsKey(s.Value)? info.SubjectDic?[s.Value] : -999 ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 导入考试信息
|
/// 导入考试信息
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -136,14 +109,14 @@ namespace Learn.Archives.API.Controllers
|
||||||
!p.DeleteState && !c.DeleteState && !u.DeleteState && !s.DeleteState)
|
!p.DeleteState && !c.DeleteState && !u.DeleteState && !s.DeleteState)
|
||||||
.Select((s, c, p, pr, u) => new
|
.Select((s, c, p, pr, u) => new
|
||||||
{
|
{
|
||||||
Name = c.Name + c.Type.ToString() + u.RealName,
|
Name = c.Name + u.RealName,
|
||||||
u.Id,
|
u.Id,
|
||||||
}).ToDictionaryAsync(s => s.Name, s => s.Id);
|
}).ToDictionaryAsync(s => s.Name, s => s.Id);
|
||||||
//处理学生成绩数据
|
//处理学生成绩数据
|
||||||
var userList = dataList.Select(s =>
|
var userList = dataList.Select(s =>
|
||||||
{
|
{
|
||||||
var classInfo = classArr
|
var classInfo = classArr
|
||||||
.FirstOrDefault(x => x.Name == s.Class && x.Type == s.ClassType.ToEnum<ClassTypeEnum>());
|
.FirstOrDefault(x => x.Name == s.Class );
|
||||||
if (classInfo == null)
|
if (classInfo == null)
|
||||||
{
|
{
|
||||||
s.Error = "未能匹配班级";
|
s.Error = "未能匹配班级";
|
||||||
|
|
@ -152,7 +125,7 @@ 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);
|
||||||
var name = s.Class + s.ClassType.ToEnum<ClassTypeEnum>().GetHashCode() + s.Student;
|
var name = s.Class + s.Student;
|
||||||
if (!userDic.ContainsKey(name))
|
if (!userDic.ContainsKey(name))
|
||||||
{
|
{
|
||||||
s.Error = "未能匹配到年级班级下对应的学生";
|
s.Error = "未能匹配到年级班级下对应的学生";
|
||||||
|
|
@ -198,151 +171,6 @@ namespace Learn.Archives.API.Controllers
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 计算考试成绩
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="exam"></param>
|
|
||||||
/// <param name="examUserInfoService"></param>
|
|
||||||
/// <param name="schoolService"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[NonAction]
|
|
||||||
public static async Task CalculatingTestResults(Exam exam, Repository<ExamUserInfo> eUService,
|
|
||||||
Repository<School> sService, Repository<ExamTags> tagService)
|
|
||||||
{
|
|
||||||
var userInfoArr = await eUService.AsQueryable()
|
|
||||||
.Where(s => s.ExamId == exam.Id)
|
|
||||||
.ToArrayAsync();
|
|
||||||
|
|
||||||
var insertTotalClassInfo = new List<ExamClassInfo>();
|
|
||||||
var insertTotalClassTag = new List<ExamClassTag>();
|
|
||||||
var eTagArr = await tagService.AsQueryable().Where(s => s.ExamId == exam.Id)
|
|
||||||
.ToArrayAsync();
|
|
||||||
var db = sService.Context;
|
|
||||||
foreach (var schoolArr in userInfoArr.GroupBy(s => s.SchoolId))
|
|
||||||
{
|
|
||||||
|
|
||||||
var insertClassInfo = new List<ExamClassInfo>();
|
|
||||||
var insertClassTag = new List<ExamClassTag>();
|
|
||||||
var school = await sService.GetFirstAsync(s => s.Id == schoolArr.Key);
|
|
||||||
var classArr = await db.Queryable<Classes>().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()
|
|
||||||
{
|
|
||||||
ExamId = exam.Id,
|
|
||||||
ExamName = exam.Name,
|
|
||||||
SchoolId = classInfo.SchoolId,
|
|
||||||
SchoolName = school.Name,
|
|
||||||
ClassId = classInfo.Id,
|
|
||||||
ClassName = classInfo.Name,
|
|
||||||
GradeLevel = classInfo.GradeLevel,
|
|
||||||
GradeYear = classInfo.GraduationYear,
|
|
||||||
PeopleCount = classUserArr.Count(),
|
|
||||||
MinScore = int.MaxValue,
|
|
||||||
MaxScore = -99,
|
|
||||||
BaseSchoolScore = exam.BaseSchoolScore,
|
|
||||||
TestPaperType = exam.TestPaperType,
|
|
||||||
Type = exam.Type,
|
|
||||||
Average1 = exam.BaseSchoolScore,
|
|
||||||
};
|
|
||||||
insertClassInfo.Add(eCInfo);
|
|
||||||
var avgTotal = 0m;
|
|
||||||
|
|
||||||
//todo 班级分段分析
|
|
||||||
var classTagDic = new Dictionary<long, ExamClassTag[]>();
|
|
||||||
foreach (var eUserInfo in classUserArr)
|
|
||||||
{
|
|
||||||
if (!classTagDic.TryGetValue(eUserInfo.ClassId, out ExamClassTag[]? classTagArr))
|
|
||||||
{
|
|
||||||
classTagArr = new ExamClassTag[10];
|
|
||||||
classTagDic.Add(eUserInfo.ClassId, classTagArr);
|
|
||||||
}
|
|
||||||
//上线人数
|
|
||||||
foreach (var item in eTagArr)
|
|
||||||
{
|
|
||||||
var subV = SubjectScore(eUserInfo, item.SubjectId);
|
|
||||||
//总分分段
|
|
||||||
if (subV >= item.MinScore && subV <= item.MaxScore)
|
|
||||||
{
|
|
||||||
var tag = classTagArr[(int)(item.SubjectId ?? 0)];
|
|
||||||
if (tag is null)
|
|
||||||
{
|
|
||||||
tag = new ExamClassTag()
|
|
||||||
{
|
|
||||||
MaxScore = item.MaxScore,
|
|
||||||
MinScore = item.MinScore,
|
|
||||||
ExamId =exam.Id,
|
|
||||||
ExamTagId = item.Id,
|
|
||||||
Name = item.TagName,
|
|
||||||
SubjectId = item.SubjectId
|
|
||||||
};
|
|
||||||
insertClassTag.Add(tag);
|
|
||||||
classTagArr[(int)(item.SubjectId ?? 0)]= tag;
|
|
||||||
}
|
|
||||||
classTagArr[(int)(item.SubjectId ?? 0)].OnLineCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
var v = eUserInfo.AssignScore;
|
|
||||||
//最大小分
|
|
||||||
if (v < eCInfo.MinScore)
|
|
||||||
eCInfo.MinScore = v;
|
|
||||||
if (v > eCInfo.MaxScore)
|
|
||||||
eCInfo.MaxScore = v;
|
|
||||||
avgTotal += v;//追加得分
|
|
||||||
}
|
|
||||||
//总分平均分
|
|
||||||
eCInfo.Average = avgTotal / eCInfo.PeopleCount;
|
|
||||||
//计算上线率
|
|
||||||
if(classTagDic.ContainsKey(eCInfo.ClassId))
|
|
||||||
foreach (var item in classTagDic[eCInfo.ClassId])
|
|
||||||
item.OnLineRate = (decimal)item.OnLineCount / (decimal)eCInfo.PeopleCount;
|
|
||||||
}
|
|
||||||
insertTotalClassInfo.AddRange(insertClassInfo);
|
|
||||||
insertTotalClassTag.AddRange(insertClassTag);
|
|
||||||
}
|
|
||||||
|
|
||||||
{ //计算班级上线率排名
|
|
||||||
foreach (var examTagArr in insertTotalClassTag.GroupBy(s => s.ExamTagId))
|
|
||||||
{
|
|
||||||
var i = 0;
|
|
||||||
foreach (var item in examTagArr.OrderByDescending(s => s.OnLineRate)
|
|
||||||
.GroupBy(s => s.OnLineRate))
|
|
||||||
{
|
|
||||||
foreach (var u in item)
|
|
||||||
u.OnLineRanking = ++i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//计算年级平均分排名
|
|
||||||
var i = 0;
|
|
||||||
foreach (var item in insertTotalClassInfo.OrderByDescending(s => s.Average)
|
|
||||||
.GroupBy(s => s.Average))
|
|
||||||
{
|
|
||||||
foreach (var u in item)
|
|
||||||
u.AverageRank = ++i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//写入数据库
|
|
||||||
var baseDB = eUService.Context;
|
|
||||||
baseDB.Ado.BeginTran();
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await baseDB.Deleteable<ExamClassInfo>().Where(s=>s.ExamId==exam.Id).ExecuteCommandAsync();
|
|
||||||
await baseDB.Insertable(insertTotalClassInfo).ExecuteCommandAsync();
|
|
||||||
baseDB.Ado.CommitTran();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
baseDB.Ado.RollbackTran();
|
|
||||||
Oh.ModelError($"导入失败:写入数据时候出现了异常 [{ex.Message}] !");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 下载导入成绩模板
|
/// 下载导入成绩模板
|
||||||
|
|
@ -355,7 +183,6 @@ namespace Learn.Archives.API.Controllers
|
||||||
{
|
{
|
||||||
School="例子学校[导入时候请删除]",
|
School="例子学校[导入时候请删除]",
|
||||||
Class="测试班级",
|
Class="测试班级",
|
||||||
ClassType="普通班级",
|
|
||||||
Grade="高2028",
|
Grade="高2028",
|
||||||
Student="学生姓名",
|
Student="学生姓名",
|
||||||
语文=80.5m,
|
语文=80.5m,
|
||||||
|
|
@ -418,5 +245,230 @@ namespace Learn.Archives.API.Controllers
|
||||||
}
|
}
|
||||||
return base.PageList(model);
|
return base.PageList(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重新计算考试成绩排名
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="examId">考试id</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<IActionResult> RecalculateExamRankings(long examId)
|
||||||
|
{
|
||||||
|
if (examId == 0)
|
||||||
|
Oh.ModelError("传入了异常参数");
|
||||||
|
var exam = examService.GetById(examId);
|
||||||
|
if (exam is null)
|
||||||
|
Oh.ModelError("无效的考试");
|
||||||
|
await CalculatingTestResults(exam, examUserInfoService, schoolService, tagService);
|
||||||
|
return Ok();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取班级考试分段排名
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="examId">考试id</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<IEnumerable<ExamClassTagReq>> ClassRanking(long examId,long classId)
|
||||||
|
{
|
||||||
|
if (examId == 0)
|
||||||
|
Oh.ModelError("传入异常参数");
|
||||||
|
if (! await examService.IsAnyAsync(s => s.Id == examId))
|
||||||
|
Oh.ModelError("无效的考试");
|
||||||
|
var arr = await classTagService.AsQueryable().Where(s => s.ExamId == examId && s.ClassId == classId)
|
||||||
|
.Select<ExamClassTagReq>()
|
||||||
|
.ToArrayAsync();
|
||||||
|
return arr.OrderBy(s => s.SubjectId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[NonAction]
|
||||||
|
private Dictionary<SubjectEnum, decimal>? ImportExamInfoSubjectDic(ImportExamInfo info)
|
||||||
|
{
|
||||||
|
return new Dictionary<SubjectEnum, decimal>()
|
||||||
|
{
|
||||||
|
{ SubjectEnum.语文, info.语文},
|
||||||
|
{ SubjectEnum.数学, info.数学},
|
||||||
|
{ SubjectEnum.英语, info.英语},
|
||||||
|
{ SubjectEnum.物理, info.物理},
|
||||||
|
{ SubjectEnum.化学, info.化学},
|
||||||
|
{ SubjectEnum.生物, info.生物},
|
||||||
|
{ SubjectEnum.政治, info.政治},
|
||||||
|
{ SubjectEnum.历史, info.历史},
|
||||||
|
{ SubjectEnum.地理, info.地理},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
[NonAction]
|
||||||
|
private static decimal? SubjectScore(ExamUserInfo info, SubjectEnum? s)
|
||||||
|
{
|
||||||
|
switch (s)
|
||||||
|
{
|
||||||
|
case null:
|
||||||
|
return info.AssignScore;
|
||||||
|
default:
|
||||||
|
if (info?.SubjectDic is null)
|
||||||
|
return -999;
|
||||||
|
return info.SubjectDic.ContainsKey(s.Value) ? info.SubjectDic?[s.Value] : -999;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算考试成绩
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="exam"></param>
|
||||||
|
/// <param name="examUserInfoService"></param>
|
||||||
|
/// <param name="schoolService"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[NonAction]
|
||||||
|
public static async Task CalculatingTestResults(Exam exam, Repository<ExamUserInfo> eUService,
|
||||||
|
Repository<School> sService, Repository<ExamTags> tagService)
|
||||||
|
{
|
||||||
|
var userInfoArr = await eUService.AsQueryable()
|
||||||
|
.Where(s => s.ExamId == exam.Id)
|
||||||
|
.ToArrayAsync();
|
||||||
|
|
||||||
|
var insertTotalClassInfo = new List<ExamClassInfo>();
|
||||||
|
var insertTotalClassTag = new List<ExamClassTag>();
|
||||||
|
var eTagArr = await tagService.AsQueryable().Where(s => s.ExamId == exam.Id)
|
||||||
|
.ToArrayAsync();
|
||||||
|
var db = sService.Context;
|
||||||
|
foreach (var schoolArr in userInfoArr.GroupBy(s => s.SchoolId))
|
||||||
|
{
|
||||||
|
|
||||||
|
var insertClassInfo = new List<ExamClassInfo>();
|
||||||
|
var insertClassTag = new List<ExamClassTag>();
|
||||||
|
var school = await sService.GetFirstAsync(s => s.Id == schoolArr.Key);
|
||||||
|
var classArr = await db.Queryable<Classes>().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()
|
||||||
|
{
|
||||||
|
ExamId = exam.Id,
|
||||||
|
ExamName = exam.Name,
|
||||||
|
SchoolId = classInfo.SchoolId,
|
||||||
|
SchoolName = school.Name,
|
||||||
|
ClassId = classInfo.Id,
|
||||||
|
ClassName = classInfo.Name,
|
||||||
|
GradeLevel = classInfo.GradeLevel,
|
||||||
|
GradeYear = classInfo.GraduationYear,
|
||||||
|
PeopleCount = classUserArr.Count(),
|
||||||
|
MinScore = int.MaxValue,
|
||||||
|
MaxScore = -99,
|
||||||
|
BaseSchoolScore = exam.BaseSchoolScore,
|
||||||
|
TestPaperType = exam.TestPaperType,
|
||||||
|
Type = exam.Type,
|
||||||
|
Average1 = exam.BaseSchoolScore,
|
||||||
|
};
|
||||||
|
insertClassInfo.Add(eCInfo);
|
||||||
|
var avgTotal = 0m;
|
||||||
|
|
||||||
|
//todo 班级分段分析
|
||||||
|
var classTagDic = new Dictionary<long, ExamClassTag[]>();
|
||||||
|
foreach (var eUserInfo in classUserArr)
|
||||||
|
{
|
||||||
|
if (!classTagDic.TryGetValue(eUserInfo.ClassId, out ExamClassTag[]? classTagArr))
|
||||||
|
{
|
||||||
|
classTagArr = new ExamClassTag[10];
|
||||||
|
classTagDic.Add(eUserInfo.ClassId, classTagArr);
|
||||||
|
}
|
||||||
|
//上线人数
|
||||||
|
foreach (var item in eTagArr)
|
||||||
|
{
|
||||||
|
var subV = SubjectScore(eUserInfo, item.SubjectId);
|
||||||
|
//总分分段
|
||||||
|
if (subV >= item.MinScore && subV <= item.MaxScore)
|
||||||
|
{
|
||||||
|
var tag = classTagArr[(int)(item.SubjectId ?? 0)];
|
||||||
|
if (tag is null)
|
||||||
|
{
|
||||||
|
tag = new ExamClassTag()
|
||||||
|
{
|
||||||
|
MaxScore = item.MaxScore,
|
||||||
|
MinScore = item.MinScore,
|
||||||
|
ClassId = classInfo.Id,
|
||||||
|
ExamId = exam.Id,
|
||||||
|
ExamTagId = item.Id,
|
||||||
|
Name = item.TagName,
|
||||||
|
SubjectId = item.SubjectId
|
||||||
|
};
|
||||||
|
insertClassTag.Add(tag);
|
||||||
|
classTagArr[(int)(item.SubjectId ?? 0)] = tag;
|
||||||
|
}
|
||||||
|
classTagArr[(int)(item.SubjectId ?? 0)].OnLineCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
var v = eUserInfo.AssignScore;
|
||||||
|
//最大小分
|
||||||
|
if (v < eCInfo.MinScore)
|
||||||
|
eCInfo.MinScore = v;
|
||||||
|
if (v > eCInfo.MaxScore)
|
||||||
|
eCInfo.MaxScore = v;
|
||||||
|
avgTotal += v;//追加得分
|
||||||
|
}
|
||||||
|
//总分平均分
|
||||||
|
eCInfo.Average = avgTotal / eCInfo.PeopleCount;
|
||||||
|
//计算上线率
|
||||||
|
if (classTagDic.ContainsKey(eCInfo.ClassId))
|
||||||
|
foreach (var item in classTagDic[eCInfo.ClassId])
|
||||||
|
if(item !=null) item.OnLineRate = (decimal)item.OnLineCount / (decimal)eCInfo.PeopleCount;
|
||||||
|
}
|
||||||
|
insertTotalClassInfo.AddRange(insertClassInfo);
|
||||||
|
insertTotalClassTag.AddRange(insertClassTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
//计算班级上线率排名
|
||||||
|
foreach (var examTagArr in insertTotalClassTag.GroupBy(s => s.ExamTagId))
|
||||||
|
{
|
||||||
|
i = 0;
|
||||||
|
foreach (var item in examTagArr.OrderByDescending(s => s.OnLineRate)
|
||||||
|
.GroupBy(s => s.OnLineRate))
|
||||||
|
{
|
||||||
|
foreach (var u in item)
|
||||||
|
u.OnLineRanking = ++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//计算年级平均分排名
|
||||||
|
i = 0;
|
||||||
|
foreach (var item in insertTotalClassInfo.OrderByDescending(s => s.Average)
|
||||||
|
.GroupBy(s => s.Average))
|
||||||
|
{
|
||||||
|
foreach (var u in item)
|
||||||
|
u.AverageRank = ++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//写入数据库
|
||||||
|
var baseDB = eUService.Context;
|
||||||
|
baseDB.Ado.BeginTran();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await baseDB.Deleteable<ExamClassInfo>().Where(s => s.ExamId == exam.Id).ExecuteCommandAsync();
|
||||||
|
await baseDB.Deleteable<ExamClassTag>().Where(s => s.ExamId == exam.Id).ExecuteCommandAsync();
|
||||||
|
await baseDB.Insertable(insertTotalClassInfo).ExecuteCommandAsync();
|
||||||
|
await baseDB.Insertable(insertTotalClassTag).ExecuteCommandAsync();
|
||||||
|
baseDB.Ado.CommitTran();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
baseDB.Ado.RollbackTran();
|
||||||
|
Oh.ModelError($"导入失败:写入数据时候出现了异常 [{ex.Message}] !");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -221,7 +221,6 @@ namespace Learn.Archives.API.Controllers
|
||||||
School = s.School,
|
School = s.School,
|
||||||
Grade = gStr,
|
Grade = gStr,
|
||||||
Class = s.Class,
|
Class = s.Class,
|
||||||
ClassType = s.ClassType??ClassTypeEnum.云校班.ToString(),
|
|
||||||
Phone = s.Phone,
|
Phone = s.Phone,
|
||||||
RealName = s.RealName,
|
RealName = s.RealName,
|
||||||
Stages = s.Grade.Contains("初") ? StudentStagesEnum.初中.ToString() : StudentStagesEnum.高中.ToString()
|
Stages = s.Grade.Contains("初") ? StudentStagesEnum.初中.ToString() : StudentStagesEnum.高中.ToString()
|
||||||
|
|
@ -302,7 +301,6 @@ namespace Learn.Archives.API.Controllers
|
||||||
School = s.School,
|
School = s.School,
|
||||||
Grade = gStr,
|
Grade = gStr,
|
||||||
Class = s.Class,
|
Class = s.Class,
|
||||||
ClassType = s.ClassType??ClassTypeEnum.云校班.ToString(),
|
|
||||||
ExamNo = s.Id.ToString(),
|
ExamNo = s.Id.ToString(),
|
||||||
Phone = s.Phone,
|
Phone = s.Phone,
|
||||||
RealName = s.RealName,
|
RealName = s.RealName,
|
||||||
|
|
@ -353,7 +351,6 @@ namespace Learn.Archives.API.Controllers
|
||||||
School = "必填:与系统匹配",
|
School = "必填:与系统匹配",
|
||||||
Grade = "必填:可选值\r\n[初一初二初三,高一高二高山]",
|
Grade = "必填:可选值\r\n[初一初二初三,高一高二高山]",
|
||||||
Class = "必填:与系统匹配\r\n格式:10班[数字+班]",
|
Class = "必填:与系统匹配\r\n格式:10班[数字+班]",
|
||||||
ClassType = "必填:可选值\r\n[云校班 海豚智学班 蓝鲸智库班 中职班 其他 雅思班 点阵笔班级 移动校园班级 智学班 ...]",
|
|
||||||
Status = "选填 可选值\r\n[就读,退出]",
|
Status = "选填 可选值\r\n[就读,退出]",
|
||||||
AmountRelief ="选填: 为0则视为 '未申请减免'",
|
AmountRelief ="选填: 为0则视为 '未申请减免'",
|
||||||
ReliefType ="选填: 建卡贫困户\r\n低保户\r\n教师子女 \r\n孤儿\r\n艺体生\r\n残疾学生\r\n领导特殊承诺减免\r\n领导同意的特殊贫困减免",
|
ReliefType ="选填: 建卡贫困户\r\n低保户\r\n教师子女 \r\n孤儿\r\n艺体生\r\n残疾学生\r\n领导特殊承诺减免\r\n领导同意的特殊贫困减免",
|
||||||
|
|
@ -385,7 +382,6 @@ namespace Learn.Archives.API.Controllers
|
||||||
School = "必填:与系统匹配",
|
School = "必填:与系统匹配",
|
||||||
Grade = "必填:可选值\r\n[初一初二初三,高一高二高山]",
|
Grade = "必填:可选值\r\n[初一初二初三,高一高二高山]",
|
||||||
Class = "必填:与系统匹配\r\n格式:10班[数字+班]\r\n任教类型是年级主任时不填",
|
Class = "必填:与系统匹配\r\n格式:10班[数字+班]\r\n任教类型是年级主任时不填",
|
||||||
ClassType = "必填:可选值\r\n[云校班 海豚智学班 蓝鲸智库班 中职班 其他 雅思班 点阵笔班级 移动校园班级 智学班 ...]\r\n任教类型是年级主任时不填",
|
|
||||||
Subject = "选填学科",
|
Subject = "选填学科",
|
||||||
ExamNo ="选填: 填写老师任职信息[不在授课架构中的职务]",
|
ExamNo ="选填: 填写老师任职信息[不在授课架构中的职务]",
|
||||||
}};
|
}};
|
||||||
|
|
|
||||||
|
|
@ -83,11 +83,6 @@ namespace Learn.Archives.Core.Model.Dto
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[ExcelColumn(Name = "班级", Width = 15)]
|
[ExcelColumn(Name = "班级", Width = 15)]
|
||||||
public string Class { get; set; }
|
public string Class { get; set; }
|
||||||
/// <summary>
|
|
||||||
/// 班级类型
|
|
||||||
/// </summary>
|
|
||||||
[ExcelColumn(Name = "班级类型", Width = 20)]
|
|
||||||
public string ClassType { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 科目
|
/// 科目
|
||||||
|
|
@ -161,11 +156,6 @@ namespace Learn.Archives.Core.Model.Dto
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[ExcelColumn(Name="班级", Width = 15)]
|
[ExcelColumn(Name="班级", Width = 15)]
|
||||||
public string Class { get; set; }
|
public string Class { get; set; }
|
||||||
/// <summary>
|
|
||||||
/// 班级
|
|
||||||
/// </summary>
|
|
||||||
[ExcelColumn(Name="班级类型", Width = 20)]
|
|
||||||
public string ClassType { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 减免金额
|
/// 减免金额
|
||||||
|
|
@ -295,11 +285,6 @@ namespace Learn.Archives.Core.Model.Dto
|
||||||
[ExcelColumn(Name="班级")]
|
[ExcelColumn(Name="班级")]
|
||||||
public string Class { get; set; }
|
public string Class { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 班级
|
|
||||||
/// </summary>
|
|
||||||
[ExcelColumn(Name="班级类型")]
|
|
||||||
public string ClassType { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// 科目
|
/// 科目
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[ExcelColumn(Name="科目")]
|
[ExcelColumn(Name="科目")]
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,11 @@ namespace Learn.Archives.Core.Model
|
||||||
[SugarColumn(Length = 20)]
|
[SugarColumn(Length = 20)]
|
||||||
public long ExamId { get; set; }
|
public long ExamId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 班级id
|
||||||
|
/// </summary>
|
||||||
|
public long ClassId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 考试标签id
|
/// 考试标签id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue