Commit 92a18ae3 authored by liudong1993's avatar liudong1993

1

parent 974644a5
...@@ -143,6 +143,11 @@ namespace EduSpider.Model.Extend ...@@ -143,6 +143,11 @@ namespace EduSpider.Model.Extend
/// </summary> /// </summary>
public int ExamScoreId { get; set; } public int ExamScoreId { get; set; }
/// <summary>
/// 考试类型
/// </summary>
public int ExamType { get; set; }
/// <summary> /// <summary>
/// 教师姓名 /// 教师姓名
/// </summary> /// </summary>
......
...@@ -42,6 +42,11 @@ namespace EduSpider.Model.Extend ...@@ -42,6 +42,11 @@ namespace EduSpider.Model.Extend
/// 一试排名 /// 一试排名
/// </summary> /// </summary>
public int ARank { get; set; } public int ARank { get; set; }
/// <summary>
/// 考试类型
/// </summary>
public int ExamType { get; set; }
} }
/// <summary> /// <summary>
......
...@@ -24,7 +24,7 @@ namespace EduSpider.Repository ...@@ -24,7 +24,7 @@ namespace EduSpider.Repository
{ {
StringBuilder builder = new(); StringBuilder builder = new();
builder.AppendFormat(@" builder.AppendFormat(@"
SELECT A.*,B.ExamName,B.CreateTime AS ExamCreateTime SELECT A.*,B.ExamName,B.CreateTime AS ExamCreateTime,B.Type as ExamType
FROM RB_Exam_Score AS A INNER JOIN rb_exam AS B ON A.ExamId=B.ExamId FROM RB_Exam_Score AS A INNER JOIN rb_exam AS B ON A.ExamId=B.ExamId
WHERE 1=1 and B.Status =0 WHERE 1=1 and B.Status =0
"); ");
......
...@@ -152,6 +152,7 @@ namespace EduSpider.Services ...@@ -152,6 +152,7 @@ namespace EduSpider.Services
ExamRankRate = item.RankRate, ExamRankRate = item.RankRate,
ExamId = item.ExamId, ExamId = item.ExamId,
ExamScoreId = item.Id, ExamScoreId = item.Id,
ExamType = item.ExamType
}); });
} }
} }
...@@ -188,6 +189,7 @@ namespace EduSpider.Services ...@@ -188,6 +189,7 @@ namespace EduSpider.Services
item.ExamRankRate, item.ExamRankRate,
item.ExamId, item.ExamId,
item.ExamScoreId, item.ExamScoreId,
item.ExamType
}; };
} }
//评语 //评语
......
...@@ -463,13 +463,15 @@ namespace EduSpider.Services ...@@ -463,13 +463,15 @@ namespace EduSpider.Services
public string SetExamStatAnalysis(int courseId, UserInfo userInfo) public string SetExamStatAnalysis(int courseId, UserInfo userInfo)
{ {
//获取所有分组考试 //获取所有分组考试
var examList = ExamRepository.GetExamList(new RB_Exam_Extend() { CourseId = courseId, CreateBy = userInfo.Id, Type = 2 }).OrderBy(x => x.ExamId).ToList(); var examList = ExamRepository.GetExamList(new RB_Exam_Extend() { CourseId = courseId, Type = 2 }).OrderBy(x => x.ExamId).ToList();
if (!examList.Any()) { return "未查询到分组考试信息,无法生成统计分析"; } if (!examList.Any()) { return "未查询到分组考试信息,无法生成统计分析"; }
//查询所有的 考试题 //查询所有的 考试题
string examIds = string.Join(",", examList.Select(x => x.ExamId)); string examIds = string.Join(",", examList.Select(x => x.ExamId));
var questList = Exam_QuestionsRepository.GetList(new RB_Exam_Questions_Extend() { ExamIds = examIds }); var questList = Exam_QuestionsRepository.GetList(new RB_Exam_Questions_Extend() { ExamIds = examIds });
//查询所有的 学生分数 //查询所有的 学生分数
var scoreList = Exam_ScoreRepository.GetList(new RB_Exam_Score_Extend() { ExamIds = examIds }); var scoreList = Exam_ScoreRepository.GetList(new RB_Exam_Score_Extend() { ExamIds = examIds });
scoreList = scoreList.Where(x => x.StuId > 0).ToList();
examList = examList.Where(y => scoreList.Select(x => x.ExamId).Contains(y.ExamId)).ToList();
foreach (var item in scoreList) { foreach (var item in scoreList) {
item.ScoreList = JsonHelper.Deserialize<List<ExamQScoreModel>>(item.Content); item.ScoreList = JsonHelper.Deserialize<List<ExamQScoreModel>>(item.Content);
foreach (var qitem in item.ScoreList) foreach (var qitem in item.ScoreList)
...@@ -500,204 +502,212 @@ namespace EduSpider.Services ...@@ -500,204 +502,212 @@ namespace EduSpider.Services
}); });
if (ExamId > 0) { if (ExamId > 0) {
List<int> StuIdList = scoreList.Select(x => x.StuId).Distinct().ToList(); try
int stuNum = StuIdList.Count(); {
List<int> StuIdList = scoreList.Select(x => x.StuId).Distinct().ToList();
int stuNum = StuIdList.Count();
#region 1-8题统计
List<ExamPartScoreModel> StuPScoreList = new List<ExamPartScoreModel>();// 1-8题得分列表
List<ExamPartScoreModel> TestScoreList = new List<ExamPartScoreModel>();//一试二试排名列表
List<ExamPartScoreModel> TRScoreList = new List<ExamPartScoreModel>();//总排名列表
//1-8题统计 先看1-8题 平均得分 x轴 考试次数, y轴 得分
int ExamNum = 1, MaxGroupNum = 1;
foreach (var item in examList) {
//先算平均得分
var esList = scoreList.Where(x => x.ExamId == item.ExamId).ToList();
decimal avgScore = Math.Round(esList.Sum(x => x.PartScore) / esList.Count(), 2, MidpointRounding.AwayFromZero);//1-8题 平均得分
//查看所有的分组
var groupList = questList.Where(x => x.ExamId == item.ExamId).Select(x => x.GroupName).Distinct();
int groupNum = 1;
foreach (var groupName in groupList)
{
//组装一试排名 二试排名
foreach (var qitem in esList)
{
qitem.AScore = qitem.ScoreList.Where(x => x.GroupName == groupName).Sum(x => x.Score);
qitem.ScoreList.Where(x => x.GroupName == groupName).ToList().ForEach(x =>
{
x.GroupNum = groupNum;
});
}
int Rank = 1;
esList.OrderByDescending(x => x.AScore).GroupBy(x => x.AScore).ToList().ForEach(x =>
{
x.ToList().ForEach(y =>
{
y.ARank = Rank;
});
Rank += x.Count();
});
#region 1-8题统计 foreach (var stuId in StuIdList)
List<ExamPartScoreModel> StuPScoreList = new List<ExamPartScoreModel>();// 1-8题得分列表 {
List<ExamPartScoreModel> TestScoreList = new List<ExamPartScoreModel>();//一试二试排名列表 //插入分组排名
List<ExamPartScoreModel> TRScoreList = new List<ExamPartScoreModel>();//总排名列表 TestScoreList.Add(new ExamPartScoreModel()
{
StuId = stuId,
Sort = ExamNum,
ExamName = item.ExamName,
GroupName = groupName,
Score = esList.Where(x => x.StuId == stuId).FirstOrDefault()?.ARank ?? 0,
GroupNum = groupNum
});
}
if (MaxGroupNum < groupNum) { MaxGroupNum = groupNum; }
questList.Where(x => x.ExamId == item.ExamId && x.GroupName == groupName).ToList().ForEach(x => x.GroupNum = groupNum);
groupNum++;
}
//1-8题统计 先看1-8题 平均得分 x轴 考试次数, y轴 得分
int ExamNum = 1, MaxGroupNum = 1;
foreach (var item in examList) {
//先算平均得分
var esList = scoreList.Where(x => x.ExamId == item.ExamId).ToList();
decimal avgScore = Math.Round(esList.Sum(x => x.PartScore) / esList.Count(), 2, MidpointRounding.AwayFromZero);//1-8题 平均得分
//查看所有的分组 //开始插入 遍历所有的 学生
var groupList = questList.Where(x => x.ExamId == item.ExamId).Select(x => x.GroupName).Distinct(); foreach (var stuId in StuIdList) {
int groupNum = 1; //插入1-8题
foreach (var groupName in groupList) StuPScoreList.Add(new ExamPartScoreModel()
{
//组装一试排名 二试排名
foreach (var qitem in esList)
{
qitem.AScore = qitem.ScoreList.Where(x => x.GroupName == groupName).Sum(x => x.Score);
qitem.ScoreList.Where(x => x.GroupName == groupName).ToList().ForEach(x =>
{ {
x.GroupNum = groupNum; StuId = stuId,
Sort = ExamNum,
AvgScore = avgScore,
ExamName = item.ExamName,
Score = esList.Where(x => x.StuId == stuId).FirstOrDefault()?.PartScore ?? 0
}); });
} //插入总排名
int Rank = 1; TRScoreList.Add(new ExamPartScoreModel()
esList.OrderByDescending(x => x.AScore).GroupBy(x => x.AScore).ToList().ForEach(x =>
{
x.ToList().ForEach(y =>
{
y.ARank = Rank;
});
Rank += x.Count();
});
foreach (var stuId in StuIdList)
{
//插入分组排名
TestScoreList.Add(new ExamPartScoreModel()
{ {
StuId = stuId, StuId = stuId,
Sort = ExamNum, Sort = ExamNum,
ExamName = item.ExamName, ExamName = item.ExamName,
GroupName = groupName, Score = esList.Where(x => x.StuId == stuId).FirstOrDefault()?.Rank ?? 0
Score = esList.Where(x => x.StuId == stuId).FirstOrDefault()?.ARank ?? 0,
GroupNum = groupNum
}); });
} }
if (MaxGroupNum < groupNum) { MaxGroupNum = groupNum; } ExamNum++;
questList.Where(x => x.ExamId == item.ExamId && x.GroupName == groupName).ToList().ForEach(x => x.GroupNum = groupNum);
groupNum++;
} }
#endregion
//开始插入 遍历所有的 学生 #region 模块分析
foreach (var stuId in StuIdList) { //分组版块分析表 x轴 知识点 , y轴 分数(总分 个人分 平均分) 如果有多次考试 知识点 重复的 就累计使用
//插入1-8题 List<ExamPartScoreModel> ModuleScoreList = new List<ExamPartScoreModel>();//考试版块分析列表
StuPScoreList.Add(new ExamPartScoreModel() var knowList = questList.Select(x => x.KnowledgePoint).Distinct();
{ foreach (var item in knowList) {
StuId = stuId,
Sort = ExamNum, //查询分组
AvgScore = avgScore, for (int groupN = 1; groupN <= MaxGroupNum; groupN++) {
ExamName = item.ExamName, decimal TotalScore = questList.Where(x => x.KnowledgePoint == item && x.GroupNum == groupN).Sum(x => x.Score);//知识点总分
Score = esList.Where(x => x.StuId == stuId).FirstOrDefault()?.PartScore ?? 0 if (TotalScore > 0)
});
//插入总排名
TRScoreList.Add(new ExamPartScoreModel()
{
StuId = stuId,
Sort = ExamNum,
ExamName = item.ExamName,
Score = esList.Where(x => x.StuId == stuId).FirstOrDefault()?.Rank ?? 0
});
}
ExamNum++;
}
#endregion
#region 模块分析
//分组版块分析表 x轴 知识点 , y轴 分数(总分 个人分 平均分) 如果有多次考试 知识点 重复的 就累计使用
List<ExamPartScoreModel> ModuleScoreList = new List<ExamPartScoreModel>();//考试版块分析列表
var knowList = questList.Select(x => x.KnowledgePoint).Distinct();
foreach (var item in knowList) {
//查询分组
for (int groupN = 1; groupN <= MaxGroupNum; groupN++) {
decimal TotalScore = questList.Where(x => x.KnowledgePoint == item && x.GroupNum == groupN).Sum(x => x.Score);//知识点总分
if (TotalScore > 0)
{
decimal AvgScore = Math.Round(scoreList.Sum(x => x.ScoreList.Where(y => y.KnowledgePoint == item && y.GroupNum == groupN).Sum(y => y.Score)) / stuNum, 2, MidpointRounding.AwayFromZero);//知识点平均得分
foreach (var stuId in StuIdList)
{ {
decimal Score = scoreList.Where(x => x.StuId == stuId).Sum(x => x.ScoreList.Where(y => y.KnowledgePoint == item && y.GroupNum == groupN).Sum(y => y.Score));//学生这些知识点的总得分 decimal AvgScore = Math.Round(scoreList.Sum(x => x.ScoreList.Where(y => y.KnowledgePoint == item && y.GroupNum == groupN).Sum(y => y.Score)) / stuNum, 2, MidpointRounding.AwayFromZero);//知识点平均得分
ModuleScoreList.Add(new ExamPartScoreModel() foreach (var stuId in StuIdList)
{ {
StuId = stuId, decimal Score = scoreList.Where(x => x.StuId == stuId).Sum(x => x.ScoreList.Where(y => y.KnowledgePoint == item && y.GroupNum == groupN).Sum(y => y.Score));//学生这些知识点的总得分
GroupNum = groupN, ModuleScoreList.Add(new ExamPartScoreModel()
ExamName = item, {
Score = Score, StuId = stuId,
TScore = TotalScore, GroupNum = groupN,
AvgScore = AvgScore ExamName = item,
}); Score = Score,
TScore = TotalScore,
AvgScore = AvgScore
});
}
} }
} }
} }
} #endregion
#endregion
#region 开始插入数据 #region 开始插入数据
int eNum = examList.Count();//考试数量 int eNum = examList.Count();//考试数量
List<RB_Exam_Score_Extend> TRankList = new List<RB_Exam_Score_Extend>();//统计排名 List<RB_Exam_Score_Extend> TRankList = new List<RB_Exam_Score_Extend>();//统计排名
foreach (var stuId in StuIdList) { foreach (var stuId in StuIdList) {
decimal TScore = Math.Round(scoreList.Where(x => x.StuId == stuId).Sum(x => x.TScore) / eNum, 2, MidpointRounding.AwayFromZero);// 平均几次考试 得到总分 decimal TScore = Math.Round(scoreList.Where(x => x.StuId == stuId).Sum(x => x.TScore) / eNum, 2, MidpointRounding.AwayFromZero);// 平均几次考试 得到总分
decimal ExamScore = Math.Round(scoreList.Where(x => x.StuId == stuId).Sum(x => x.ExamScore) / eNum, 2, MidpointRounding.AwayFromZero); decimal ExamScore = Math.Round(scoreList.Where(x => x.StuId == stuId).Sum(x => x.ExamScore) / eNum, 2, MidpointRounding.AwayFromZero);
TRankList.Add(new RB_Exam_Score_Extend() TRankList.Add(new RB_Exam_Score_Extend()
{ {
StuId = stuId, StuId = stuId,
TScore = TScore, TScore = TScore,
ExamScore = ExamScore ExamScore = ExamScore
}); });
} }
int TRank = 1; int TRank = 1;
TRankList.OrderByDescending(x => x.TScore).GroupBy(x => x.TScore).ToList().ForEach(x => TRankList.OrderByDescending(x => x.TScore).GroupBy(x => x.TScore).ToList().ForEach(x =>
{
x.ToList().ForEach(y =>
{ {
y.Rank = TRank; x.ToList().ForEach(y =>
y.RankRate = Math.Round(Convert.ToDecimal(stuNum - TRank + 1) / stuNum, 2, MidpointRounding.AwayFromZero); {
y.Rank = TRank;
y.RankRate = Math.Round(Convert.ToDecimal(stuNum - TRank + 1) / stuNum, 2, MidpointRounding.AwayFromZero);
});
TRank += x.Count();
}); });
TRank += x.Count();
});
//插入 //插入
foreach (var stuId in StuIdList) { foreach (var stuId in StuIdList) {
ExamStatModel statModel = new ExamStatModel() ExamStatModel statModel = new ExamStatModel()
{ {
PartScoreList = StuPScoreList.Where(x => x.StuId == stuId).ToList(), PartScoreList = StuPScoreList.Where(x => x.StuId == stuId).ToList(),
GroupScoreList = TestScoreList.Where(x => x.StuId == stuId).ToList(), GroupScoreList = TestScoreList.Where(x => x.StuId == stuId).ToList(),
TRankScoreList = TRScoreList.Where(x => x.StuId == stuId).ToList(), TRankScoreList = TRScoreList.Where(x => x.StuId == stuId).ToList(),
ModuleScoreList = ModuleScoreList.Where(x => x.StuId == stuId).ToList() ModuleScoreList = ModuleScoreList.Where(x => x.StuId == stuId).ToList()
}; };
var smodel = scoreList.Where(x => x.StuId == stuId).FirstOrDefault(); var smodel = scoreList.Where(x => x.StuId == stuId).FirstOrDefault();
var rmodel = TRankList.Where(x => x.StuId == stuId).FirstOrDefault(); var rmodel = TRankList.Where(x => x.StuId == stuId).FirstOrDefault();
Exam_ScoreRepository.Insert(new Model.Entity.RB_Exam_Score() Exam_ScoreRepository.Insert(new Model.Entity.RB_Exam_Score()
{
Id = 0,
StuId = stuId,
ExamId = ExamId,
StuUId = smodel.StuUId,
StuName = smodel.StuName,
Content = JsonHelper.Serialize(new
{ {
PartScoreList = statModel.PartScoreList.Select(x => new Id = 0,
{ StuId = stuId,
x.Sort, ExamId = ExamId,
x.ExamName, StuUId = smodel.StuUId,
x.AvgScore, StuName = smodel.StuName,
x.Score Content = JsonHelper.Serialize(new
}),
ModuleScoreList = statModel.ModuleScoreList.Select(y => new
{
y.GroupNum,
y.ExamName,
y.Score,
y.AvgScore,
y.TScore
}),
GroupScoreList = statModel.GroupScoreList.Select(y => new
{ {
y.GroupNum, PartScoreList = statModel.PartScoreList.Select(x => new
y.Sort, {
y.ExamName, x.Sort,
y.Score x.ExamName,
x.AvgScore,
x.Score
}),
ModuleScoreList = statModel.ModuleScoreList.Select(y => new
{
y.GroupNum,
y.ExamName,
y.Score,
y.AvgScore,
y.TScore
}),
GroupScoreList = statModel.GroupScoreList.Select(y => new
{
y.GroupNum,
y.Sort,
y.ExamName,
y.Score
}),
TRankScoreList = statModel.TRankScoreList.Select(x => new
{
x.Sort,
x.ExamName,
x.Score
})
}), }),
TRankScoreList = statModel.TRankScoreList.Select(x => new TScore = rmodel.TScore,
{ ExamScore = rmodel.ExamScore,
x.Sort, Rank = rmodel.Rank,
x.ExamName, RankRate = rmodel.RankRate
x.Score });
}) }
}), #endregion
TScore = rmodel.TScore, }
ExamScore = rmodel.ExamScore, catch (Exception ex)
Rank = rmodel.Rank, {
RankRate = rmodel.RankRate LogHelper.WriteError("SetExamStatAnalysis", "", ex);
}); return "出错了,请联系管理员";
} }
#endregion
} }
return ExamId > 0 ? "" : "出错了,请联系管理员"; return ExamId > 0 ? "" : "出错了,请联系管理员";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment