Commit 97826a2a authored by liudong1993's avatar liudong1993

1

parent ada84f88
using EduSpider.Model.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VTX.FW.Config;
using VTX.FW.DB;
namespace EduSpider.Repository
{
/// <summary>
/// 考试仓储接口
/// </summary>
public interface IExamRepository : IDBRepository<RB_Exam>, IDependency
{
}
}
using EduSpider.Model.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VTX.FW.Config;
using VTX.FW.DB;
namespace EduSpider.Repository
{
/// <summary>
/// 考试题目仓储接口
/// </summary>
public interface IExam_QuestionsRepository : IDBRepository<RB_Exam_Questions>, IDependency
{
}
}
using EduSpider.Model.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VTX.FW.Config;
using VTX.FW.DB;
namespace EduSpider.Repository
{
/// <summary>
/// 考试得分仓储接口
/// </summary>
public interface IExam_ScoreRepository : IDBRepository<RB_Exam_Score>, IDependency
{
}
}
......@@ -14,5 +14,6 @@ namespace EduSpider.IRepository
/// <param name="students"></param>
/// <returns></returns>
public bool BatchSetStudent(List<RB_Student> students);
List<RB_Student> GetListForStuName(string stuNames);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VTX.FW.Config;
namespace EduSpider.IServices
{
/// <summary>
/// 考试服务层接口
/// </summary>
public interface IExamService : IDependency
{
string ImportExcelForStuExamScore(string path_server,int courseId, string examName, int userId);
}
}
......@@ -12,6 +12,6 @@ namespace EduSpider.IServices
/// </summary>
public interface ITeacherService : IDependency
{
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VTX.FW.Attr;
namespace EduSpider.Model.Entity
{
/// <summary>
/// 考试
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_Exam
{
/// <summary>
/// ExamId
/// </summary>
public int ExamId { get; set; }
/// <summary>
/// 考试名称
/// </summary>
public string ExamName { get; set; }
/// <summary>
/// 关联课程
/// </summary>
public int CourseId { get; set; }
/// <summary>
/// 删除状态
/// </summary>
public int Status { get; set; }
/// <summary>
/// 创建人
/// </summary>
public int CreateBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VTX.FW.Attr;
namespace EduSpider.Model.Entity
{
/// <summary>
/// 考试题目
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_Exam_Questions
{
/// <summary>
/// Id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 考试ID
/// </summary>
public int ExamId { get; set; }
/// <summary>
/// 题号
/// </summary>
public int Sort { get; set; }
/// <summary>
/// 难度
/// </summary>
public string Difficulty { get; set; }
/// <summary>
/// 知识点
/// </summary>
public string KnowledgePoint { get; set; }
/// <summary>
/// 归属模块
/// </summary>
public string Module { get; set; }
/// <summary>
/// 分数
/// </summary>
public decimal Score { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VTX.FW.Attr;
namespace EduSpider.Model.Entity
{
/// <summary>
/// 考试分数
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_Exam_Score
{
/// <summary>
/// Id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 考试ID
/// </summary>
public int ExamId { get; set; }
/// <summary>
/// 学生ID
/// </summary>
public int StuId { get; set; }
/// <summary>
/// 导入的姓名
/// </summary>
public string StuName { get; set; }
/// <summary>
/// 得分明细 json格式
/// </summary>
public string Content { get; set; }
/// <summary>
/// 总分
/// </summary>
public decimal TScore { get; set; }
/// <summary>
/// 排名
/// </summary>
public int Rank { get; set; }
/// <summary>
/// 百分比排名
/// </summary>
public decimal RankRate { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VTX.FW.Attr;
namespace EduSpider.Model.Entity
{
/// <summary>
/// 考试分数
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_Exam_Score2
{
/// <summary>
/// Id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 考试ID
/// </summary>
public int ExamId { get; set; }
/// <summary>
/// 学生ID
/// </summary>
public int StuId { get; set; }
/// <summary>
/// 题号
/// </summary>
public int Sort { get; set; }
/// <summary>
/// 分数
/// </summary>
public decimal Score { get; set; }
/// <summary>
/// 导入的姓名
/// </summary>
public string StuName { get; set; }
}
}
using EduSpider.Model.Entity;
using System;
using VTX.FW.Attr;
namespace EduSpider.Model.Extend
{
/// <summary>
/// 考试扩展
/// </summary>
public class RB_Exam_Extend : RB_Exam
{
}
}
using EduSpider.Model.Entity;
using System;
using VTX.FW.Attr;
namespace EduSpider.Model.Extend
{
/// <summary>
/// 考试题目扩展
/// </summary>
public class RB_Exam_Questions_Extend : RB_Exam_Questions
{
}
}
using EduSpider.Model.Entity;
using System;
using VTX.FW.Attr;
namespace EduSpider.Model.Extend
{
/// <summary>
/// 考试分数扩展
/// </summary>
public class RB_Exam_Score_Extend : RB_Exam_Score
{
}
}
using EduSpider.Model.Entity;
using EduSpider.Repository.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EduSpider.Repository
{
/// <summary>
/// 考试仓储层
/// </summary>
public class ExamRepository : BaseRepository<RB_Exam>, IExamRepository
{
}
}
using EduSpider.Model.Entity;
using EduSpider.Repository.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EduSpider.Repository
{
/// <summary>
/// 考试题目仓储层
/// </summary>
public class Exam_QuestionsRepository : BaseRepository<RB_Exam_Questions>, IExam_QuestionsRepository
{
}
}
using EduSpider.Model.Entity;
using EduSpider.Repository.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EduSpider.Repository
{
/// <summary>
/// 考试得分仓储层
/// </summary>
public class Exam_ScoreRepository : BaseRepository<RB_Exam_Score>, IExam_ScoreRepository
{
}
}
......@@ -2,6 +2,7 @@
using EduSpider.Model.Entity;
using EduSpider.Repository.Base;
using System.Collections.Generic;
using System.Linq;
namespace EduSpider.Repository
{
......@@ -13,5 +14,16 @@ namespace EduSpider.Repository
flag = base.BatchInsert(students, isReplace: true);
return flag;
}
/// <summary>
/// 获取学生列表 根据学生姓名
/// </summary>
/// <param name="stuNames"></param>
/// <returns></returns>
public List<RB_Student> GetListForStuName(string stuNames)
{
string sql = $"select StudId,StudentName from RB_Student where StudentName in({stuNames}) order by StudId desc";
return Get<RB_Student>(sql).ToList();
}
}
}

using EduSpider.IRepository;
using EduSpider.IServices;
using EduSpider.Repository;
using EduSpider.Utility.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VTX.FW.Attr;
using VTX.FW.Helper;
namespace EduSpider.Services
{
/// <summary>
/// 考试服务实现
/// </summary>
public class ExamService : IExamService
{
/// <summary>
/// 帐号仓储接口
/// </summary>
[Autowired]
private IAccountRepository accountRepository { get; set; }
/// <summary>
/// 考试
/// </summary>
[Autowired]
private IExamRepository examRepository { get; set; }
/// <summary>
/// 考试题目
/// </summary>
[Autowired]
private IExam_QuestionsRepository exam_QuestionsRepository { get; set; }
/// <summary>
/// 考试得分
/// </summary>
[Autowired]
private IExam_ScoreRepository exam_ScoreRepository { get; set; }
/// <summary>
/// 学生
/// </summary>
[Autowired]
private IStudentRepository studentRepository { get; set; }
/// <summary>
/// 导入考试成绩
/// </summary>
/// <param name="path_server"></param>
/// <param name="userId"></param>
/// <returns></returns>
public string ImportExcelForStuExamScore(string path_server,int courseId, string examName, int userId)
{
var umodel = accountRepository.GetAccountList(new Model.Extend.RB_Account_Extend() { Id = userId }).FirstOrDefault();
if (umodel == null || umodel.Status == Utility.Enum.DateStateEnum.Delete || umodel.AccountType != Utility.Enum.AccountTypeEnum.Teacher) { return "没有权限操作"; }
var EQlist = StuExamScoreHelper.GetStuExamScoreData(path_server, out List<StuScoreModel> StuList);
if (EQlist.Any())
{
var AvgList = StuList.Where(x => x.Name == "平均分").ToList();
StuList = StuList.Where(x => x.Name != "平均分" && !string.IsNullOrWhiteSpace(x.Name)).ToList();
//根据学生姓名 查询所有的学生账号
string StuNames = "'" + string.Join("','", StuList.Select(x => x.Name).Distinct()) + "'";
var sList = studentRepository.GetListForStuName(StuNames);
//插入考试
int ExamId = examRepository.Insert(new Model.Entity.RB_Exam()
{
ExamId = 0,
CourseId = courseId,
ExamName = examName,
CreateBy = userId,
CreateTime = DateTime.Now,
Status = 0
});
if (ExamId > 0) {
List<Model.Entity.RB_Exam_Questions> InsertEQ = new();
//开始插入题目
foreach (var item in EQlist)
{
InsertEQ.Add(new Model.Entity.RB_Exam_Questions()
{
Id = 0,
ExamId = ExamId,
Difficulty = item.Difficulty,
KnowledgePoint = item.KnowledgePoint,
Module = item.Module,
Score = item.Score,
Sort = item.Id
});
}
exam_QuestionsRepository.BatchInsert(InsertEQ);
List<Model.Entity.RB_Exam_Score> InsertScore = new();
foreach (var Name in StuList.Select(x => x.Name).Distinct()) {
var clist = StuList.Where(x => x.Name == Name).ToList();
var stuModel = sList.Where(x => x.StudentName == Name).FirstOrDefault();
InsertScore.Add(new Model.Entity.RB_Exam_Score()
{
Id = 0,
ExamId = ExamId,
StuId = stuModel?.StudId ?? 0,//匹配学生失败 可能要在后台给与提示, 重新导入
StuName = Name,
Content = JsonHelper.Serialize(clist.Where(x => x.Id > 0).Select(x => new
{
Sort = x.Id,
x.Score,
AvgScore = AvgList.Where(y => y.Id == x.Id).FirstOrDefault()?.Score ?? 0
})),
TScore = clist.Where(x => x.Id == -1).FirstOrDefault()?.Score ?? 0,
Rank = Convert.ToInt32(clist.Where(x => x.Id == -2).FirstOrDefault()?.Score ?? 0),
RankRate = clist.Where(x => x.Id == -3).FirstOrDefault()?.Score ?? 0,
});
}
//InsertScore = InsertScore.Where(x => x.StuId > 0).ToList();//暂时只插入匹配到学生的
exam_ScoreRepository.BatchInsert(InsertScore);
}
return "";
}
else
{
return "模板匹配失败";
}
}
/// <summary>
/// 取消备份
/// </summary>
/// <param name="path_server"></param>
/// <param name="courseId"></param>
/// <param name="examName"></param>
/// <param name="userId"></param>
/// <returns></returns>
public string ImportExcelForStuExamScore_V2(string path_server, int courseId, string examName, int userId)
{
var umodel = accountRepository.GetAccountList(new Model.Extend.RB_Account_Extend() { Id = userId }).FirstOrDefault();
if (umodel == null || umodel.Status == Utility.Enum.DateStateEnum.Delete || umodel.AccountType != Utility.Enum.AccountTypeEnum.Teacher) { return "没有权限操作"; }
var EQlist = StuExamScoreHelper.GetStuExamScoreData(path_server, out List<StuScoreModel> StuList);
if (EQlist.Any())
{
var AvgList = StuList.Where(x => x.Name == "平均分").ToList();
StuList = StuList.Where(x => x.Name != "平均分" && !string.IsNullOrWhiteSpace(x.Name)).ToList();
//根据学生姓名 查询所有的学生账号
string StuNames = "'" + string.Join("','", StuList.Select(x => x.Name).Distinct()) + "'";
var sList = studentRepository.GetListForStuName(StuNames);
//插入考试
int ExamId = examRepository.Insert(new Model.Entity.RB_Exam()
{
ExamId = 0,
CourseId = courseId,
ExamName = examName,
CreateBy = userId,
CreateTime = DateTime.Now,
Status = 0
});
if (ExamId > 0)
{
List<Model.Entity.RB_Exam_Questions> InsertEQ = new();
//开始插入题目
foreach (var item in EQlist)
{
InsertEQ.Add(new Model.Entity.RB_Exam_Questions()
{
Id = 0,
ExamId = ExamId,
Difficulty = item.Difficulty,
KnowledgePoint = item.KnowledgePoint,
Module = item.Module,
Score = item.Score,
Sort = item.Id
});
}
exam_QuestionsRepository.BatchInsert(InsertEQ);
List<Model.Entity.RB_Exam_Score> InsertScore = new();
//开始插入得分
foreach (var item in StuList)
{
var stuModel = sList.Where(x => x.StudentName == item.Name).FirstOrDefault();
InsertScore.Add(new Model.Entity.RB_Exam_Score()
{
Id = 0,
ExamId = ExamId,
//Sort = item.Id,
StuId = stuModel?.StudId ?? 0,//=0表示未匹配上 暂时=0处理
//Score = item.Score,
StuName = item.Name
});
}
exam_ScoreRepository.BatchInsert(InsertScore);
}
return "";
}
else
{
return "模板匹配失败";
}
}
}
}

using EduSpider.IServices;
using EduSpider.Utility.Data;
using System;
using System.Collections.Generic;
using System.Linq;
......@@ -13,6 +14,6 @@ namespace EduSpider.Services
/// </summary>
public class TeacherService : ITeacherService
{
}
}
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using System.Text.RegularExpressions;
using System.Linq;
namespace EduSpider.Utility.Data
{
/// <summary>
/// 学生成绩导入帮助类
/// </summary>
public class StuExamScoreHelper
{
/// <summary>
/// 根据Excel文件获取列表
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static List<ExamQuestionModel> GetStuExamScoreData(string filePath, out List<StuScoreModel> StuList)
{
StuList = new List<StuScoreModel>();
var dt = NPOIHelper.ImportExcelToDatatable(filePath, 0, 0, true);
List<ExamQuestionModel> EQList = new List<ExamQuestionModel>();
if (dt != null && dt.Rows.Count > 0)
{
//先抓取 题目列表
for (var i = 1; i < 1000; i++)
{
if (dt.Columns.Contains(i.ToString()))
{
EQList.Add(new ExamQuestionModel()
{
Id = i,
Difficulty = dt.Rows[0][i.ToString()].ToString(),
KnowledgePoint = dt.Rows[1][i.ToString()].ToString(),
Module = dt.Rows[2][i.ToString()].ToString(),
Score = Convert.ToDecimal(dt.Rows[3][i.ToString()].ToString())
});
}
else
{
break;
}
}
if (EQList.Any())
{
int totalCount = dt.Rows.Count;
//从第5行 开始 是学生
for (var i = 4; i < totalCount; i++)
{
foreach (var item in EQList)
{
//先装姓名
StuList.Add(new StuScoreModel()
{
Name = dt.Rows[i]["题号"].ToString().Trim(),
Id = item.Id,
Score = Convert.ToDecimal(dt.Rows[i][item.Id.ToString()].ToString())
});
}
if (i < totalCount - 1)
{
//总分 排名 百分比排名
StuList.Add(new StuScoreModel()
{
Name = dt.Rows[i]["题号"].ToString().Trim(),
Id = -1,
Score = Convert.ToDecimal(dt.Rows[i]["总分"].ToString())
});
StuList.Add(new StuScoreModel()
{
Name = dt.Rows[i]["题号"].ToString().Trim(),
Id = -2,
Score = Convert.ToDecimal(dt.Rows[i]["排名"].ToString())
});
StuList.Add(new StuScoreModel()
{
Name = dt.Rows[i]["题号"].ToString().Trim(),
Id = -3,
Score = Convert.ToDecimal(dt.Rows[i]["百分比排名"].ToString())
});
}
}
}
}
return EQList;
}
}
/// <summary>
/// 考题
/// </summary>
public class ExamQuestionModel {
/// <summary>
/// 题目编号
/// </summary>
public int Id { get; set; }
/// <summary>
/// 难度
/// </summary>
public string Difficulty { get; set; }
/// <summary>
/// 知识点
/// </summary>
public string KnowledgePoint{ get; set; }
/// <summary>
/// 归属模块
/// </summary>
public string Module { get; set; }
/// <summary>
/// 分数
/// </summary>
public decimal Score { get; set; }
}
/// <summary>
/// 学生成绩
/// </summary>
public class StuScoreModel {
/// <summary>
/// 学生姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 考题编号
/// </summary>
public int Id { get; set; }
/// <summary>
/// 得分
/// </summary>
public decimal Score { get; set; }
}
}
......@@ -8,6 +8,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="NPOI" Version="2.5.6" />
<PackageReference Include="VTX.FW" Version="1.1.0" />
</ItemGroup>
......
This diff is collapsed.
using EduSpider.IServices;
using EduSpider.WebApi.Controllers.Base;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using VTX.FW.Api;
using VTX.FW.Attr;
using VTX.FW.Helper;
using EduSpider.Utility;
using System.Threading;
using EduSpider.Model.Extend;
using System.Linq;
using JWT;
using System;
using System.Collections.Generic;
using JWT.Algorithms;
using JWT.Serializers;
using System.IO;
using Microsoft.AspNetCore.Cors;
namespace EduSpider.WebApi.Controllers
{
/// <summary>
/// 上传文件
/// </summary>
[EnableCors("AllowCors")]
[Route("api/[controller]/[action]")]
[ApiController]
public class UploadController : ControllerBase
{
/// <summary>
/// 考试
/// </summary>
[Autowired]
public IExamService examService { get; set; }
/// <summary>
/// 导入考试成绩
/// </summary>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public ApiResult UploadStuExamScore()
{
try
{
var files = Request.Form.Files;
if (files.Count == 0)
{
return new ApiResult { Code = (int)ResultCode.Fail, Message = "未选择文件", Data = "" };
}
var json = !string.IsNullOrEmpty(Request.Form["params"]) ? JObject.Parse(Request.Form["params"].ToString()) : null;
int UserId = Convert.ToInt32(json["Uid"] != null ? json["Uid"].ToString() : "0");
int CourseId = Convert.ToInt32(json["CourseId"] != null ? json["CourseId"].ToString() : "0");
string ExamName = json["ExamName"] != null ? json["ExamName"].ToString() : "";
string filename = files[0].FileName;
string fileExtention = System.IO.Path.GetExtension(files[0].FileName);
//验证文件格式
List<string> ExtList = new() {
".xls",
".xlsx"
};
if (!ExtList.Contains(fileExtention))
{
return new ApiResult { Code = (int)ResultCode.Fail, Message = "文件格式有误", Data = "" };
}
if (files[0].Length <= 0)
{
return new ApiResult { Code = (int)ResultCode.Fail, Message = "文件大小有误", Data = "" };
}
decimal fileMNum = files[0].Length / (1024 * 1024);
if (fileMNum > 10) { return ApiResult.Failed("文件不能超过10M"); }
string path = Guid.NewGuid().ToString() + fileExtention;
string basepath = AppContext.BaseDirectory;
string dateStr = DateTime.Now.ToString("yyyyMMdd");
string tempPath = basepath + "upfile\\temporary\\" + dateStr + "\\";
string path_server = tempPath + path;
string httpPath = "/upfile/temporary/" + dateStr + "/" + path;
if (!Directory.Exists(tempPath))
{
Directory.CreateDirectory(tempPath);
}
using (FileStream fstream = new(path_server, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
files[0].CopyTo(fstream);
}
#region 解析文档数据并保存
string rmsg = examService.ImportExcelForStuExamScore(path_server, CourseId, ExamName, UserId);
if (rmsg == "")
{
return ApiResult.Success();
}
else
{
return ApiResult.Failed(rmsg);
}
#endregion
}
catch (Exception ex)
{
LogHelper.WriteError("UploadStuExamScore", "", ex);
return ApiResult.Failed();
}
}
/// <summary>
/// 导入考试成绩
/// </summary>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public ApiResult UploadStuExamScore_Test()
{
try
{
string path_server = "C:/Users/Administrator/Desktop/TempFile/化学成绩查询表.xlsx";
#region 解析文档数据并保存
string rmsg = examService.ImportExcelForStuExamScore(path_server, 44977497, "测试一下化学", 11759328);
if (rmsg == "")
{
return ApiResult.Success();
}
else
{
return ApiResult.Failed(rmsg);
}
#endregion
}
catch (Exception ex)
{
LogHelper.WriteError("UploadStuExamScore", "", ex);
return ApiResult.Failed();
}
}
}
}
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