完善 老师导入流程

This commit is contained in:
小肥羊 2025-08-24 17:17:09 +08:00
parent 6b310cb4d4
commit c9f9c22e6d
5 changed files with 208 additions and 25 deletions

View File

@ -224,7 +224,7 @@ namespace Learn.Archives.API.Controllers
} }
} }
if (errorExcelInfo.Count != 0) if (errorExcelInfo.Count != 0)
return File(errorExcelInfo.ExportExcel(), "application/ms-excel"); return File(errorExcelInfo.ExportExcel(), "application/ms-excel", $"错误考试信息{DateTime.Now.ToString("MMddHHmm")}.xlsx");
//写入数据库 //写入数据库
var baseDB = baseService.Context; var baseDB = baseService.Context;
@ -270,7 +270,8 @@ namespace Learn.Archives.API.Controllers
= 80.5m, = 80.5m,
=721.5m =721.5m
} }; } };
return File(resultList.ExportExcel(), "application/ms-excel"); return File(resultList.ExportExcel(), "application/ms-excel",
$"导入成绩模板{DateTime.Now.ToString("MMddHHmm")}.xlsx");
} }
/// <summary> /// <summary>

View File

@ -114,7 +114,6 @@ namespace Learn.Archives.API.Controllers
/// <summary> /// <summary>
/// 导入考试信息 /// 导入考试信息
/// </summary> /// </summary>
/// <param name="dto"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost, ResultIgnore] [HttpPost, ResultIgnore]
[HttpLogEnable] [HttpLogEnable]
@ -136,7 +135,6 @@ namespace Learn.Archives.API.Controllers
if (dataList == null || dataList.Count() == 0) if (dataList == null || dataList.Count() == 0)
Oh.ModelError("导入失败:无有效数据"); Oh.ModelError("导入失败:无有效数据");
//todo
//处理数据 //处理数据
var errorExcelInfo = new List<SchoolBusinessImportError>(); var errorExcelInfo = new List<SchoolBusinessImportError>();
var insertInfo = new List<SchoolBusiness>(); var insertInfo = new List<SchoolBusiness>();
@ -253,7 +251,8 @@ namespace Learn.Archives.API.Controllers
}; };
if (errorExcelInfo.Count != 0) if (errorExcelInfo.Count != 0)
return File(errorExcelInfo.ExportExcel(), "application/ms-excel"); return File(errorExcelInfo.ExportExcel(), "application/ms-excel"
, $"错误赴校信息{DateTime.Now.ToString("MMddHHmm")}.xlsx");
//写入数据库 //写入数据库
await baseService.InsertRangeAsync(insertInfo); await baseService.InsertRangeAsync(insertInfo);
@ -261,7 +260,7 @@ namespace Learn.Archives.API.Controllers
} }
/// <summary> /// <summary>
/// 下载导入成绩模板 /// 下载导入模板
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[HttpGet, ResultIgnore, AllowAnonymous] [HttpGet, ResultIgnore, AllowAnonymous]
@ -271,7 +270,23 @@ namespace Learn.Archives.API.Controllers
return File(resultList.ExportExcel(), "application/ms-excel", "导入赴校信息模板.xlsx"); return File(resultList.ExportExcel(), "application/ms-excel", "导入赴校信息模板.xlsx");
} }
/// <summary>
/// 下载导出模板
/// </summary>
/// <returns></returns>
[HttpGet, ResultIgnore, AllowAnonymous]
public async Task<IActionResult> ExportTemplate()
{
var qData = await baseService.AsQueryable()
.Where(s => true)
.ToArrayAsync();
//todo完善数据转换
var resultList = new List<SchoolBusinessImport>() { new SchoolBusinessImport() { } };
return File(resultList.ExportExcel(), "application/ms-excel", "导入赴校信息模板.xlsx");
}
} }
} }

View File

@ -14,6 +14,7 @@ using System.Security.Claims;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using UserCenter.Model; using UserCenter.Model;
using UserCenter.Model.Common; using UserCenter.Model.Common;
using UserCenter.Model.Enum;
namespace Learn.Archives.API.Controllers namespace Learn.Archives.API.Controllers
{ {
@ -108,11 +109,66 @@ namespace Learn.Archives.API.Controllers
/// <summary>
/// 导入老师信息
/// </summary>
/// <returns></returns>
[HttpPost, ResultIgnore]
[HttpLogEnable]
public async Task<IActionResult> ImportTeacher(IFormFile? file)
{
var fl = file != null ? file : _httpContextAccessor.HttpContext?.Request.Form.Files[0];
if (fl == null) Oh.ModelError("传入无效的数据");
if (!Path.GetExtension(fl.FileName).Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
Oh.ModelError("请选择导入文件为.xlsx的后缀名!");
//分析excel
IEnumerable<TeacherInfoImportError> dataList;
using var stream = new MemoryStream();
{
await fl.CopyToAsync(stream);
dataList = stream.Query<TeacherInfoImportError>()
.Where(s => !string.IsNullOrEmpty(s.School));
}
if (dataList == null || dataList.Count() == 0)
Oh.ModelError("导入失败:无有效数据");
var insertInfo = new List<Student>();
var userCenterImp = new List<UserExcelExportData>();
foreach (var s in dataList)
{
userCenterImp.Add(new UserExcelExportData()
{
UserType = s.UserType,
Account = s.Phone.ToString(),
Subject = s.Subject,
ExamNo = s.ExamNo,
School = s.School,
Grade = s.Grade,
Class = s.Class,
ClassType = s.ClassType,
Phone = s.Phone,
RealName = s.RealName,
Stages = s.Grade.Contains("初") ? StudentStagesEnum..ToString() : StudentStagesEnum..ToString()
});
}
//调用 用户中心 导入接口
var importRes = await _userCenterService.CallAPI_ImportJsonData(_httpContextAccessor.HttpContext, userCenterImp);
//处理数据
var errorExcelInfo = importRes.ErrorExcelExport.Select(s => s.Adapt<StudentInfoImportError>());
//如果有错误数据则返回excel
if (errorExcelInfo.Count() != 0)
return File(errorExcelInfo.ExportExcel(), "application/ms-excel", $"导入错误的老师{DateTime.Now.ToString("MMddHHmm")}.xlsx");
return Ok();
}
/// <summary> /// <summary>
/// 导入考试信息 /// 导入学生信息
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[HttpPost, ResultIgnore] [HttpPost, ResultIgnore]
@ -134,14 +190,13 @@ namespace Learn.Archives.API.Controllers
} }
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>();
var userCenterImp = new List<UserExcelExportData>(); var userCenterImp = new List<UserExcelExportData>();
foreach (var s in dataList) foreach (var s in dataList)
{ {
insertInfo.Add(new Student() insertInfo.Add(new Student()
{ {
AmountRelief = s.AmountRelief, AmountRelief = decimal.TryParse(s.AmountRelief,out decimal v)?v:0,
ExitTime = s.ExitTime, ExitTime = s.ExitTime,
Remark = s.Remark, Remark = s.Remark,
JoinTime = s.JoinTime, JoinTime = s.JoinTime,
@ -159,23 +214,28 @@ namespace Learn.Archives.API.Controllers
ExamNo = s.Id.ToString(), ExamNo = s.Id.ToString(),
Phone = s.Phone, Phone = s.Phone,
RealName = s.RealName, RealName = s.RealName,
Stages = s.Stages Stages = s.Grade.Contains("初")? StudentStagesEnum..ToString() : StudentStagesEnum..ToString()
}); });
} }
//调用 用户中心 导入接口 //调用 用户中心 导入接口
var importRes = await _userCenterService.CallAPI_ImportJsonData(_httpContextAccessor.HttpContext, userCenterImp); var importRes = await _userCenterService.CallAPI_ImportJsonData(_httpContextAccessor.HttpContext, userCenterImp);
var hUAccount = importRes.InsertUsers.Select(s => s.Account).ToHashSet(); var hUAccount = importRes.InsertUsers.ToDictionary(s=>s.Account,s=>s.Id);
//基于结果判断添加成功` //基于结果判断添加成功`
insertInfo = insertInfo.Where(s => hUAccount.Contains(s.Id.ToString())).ToList(); insertInfo = insertInfo
.Where(s => hUAccount.ContainsKey(s.UserCenterId.ToString())).Select(s =>
{
s.UserCenterId = hUAccount[s.UserCenterId.ToString()];
return s;
}).ToList();
//部分成功的数据写入数据库 //部分成功的数据写入数据库
await baseService.InsertRangeAsync(insertInfo); await baseService.InsertRangeAsync(insertInfo);
//处理数据 //处理数据
var errorExcelInfo = importRes.ErrorExcelExport.Select(s => s.Adapt<StudentInfoImportError>()); var errorExcelInfo = importRes.ErrorExcelExport.Select(s => s.Adapt<StudentInfoImportError>());
//如果有错误数据则返回excel //如果有错误数据则返回excel
if (errorExcelInfo.Count() != 0) if (errorExcelInfo.Count() != 0)
return File(errorExcelInfo.ExportExcel(), "application/ms-excel"); return File(errorExcelInfo.ExportExcel(), "application/ms-excel", $"导入错误学生{DateTime.Now.ToString("MMddHHmm")}.xlsx");
return Ok(); return Ok();
} }
@ -185,6 +245,54 @@ namespace Learn.Archives.API.Controllers
/// <summary>
/// 下载导入模板
/// </summary>
/// <returns></returns>
[HttpGet, ResultIgnore, AllowAnonymous]
public IActionResult DwImportTemplate()
{
var resultList = new List<StudentInfoImport>() { new StudentInfoImport()
{
RealName = "导入规范[导入时请删除本列]",
School = "必填:与系统匹配",
Grade = "必填:可选值\r\n[初一初二初三,高一高二高山]",
Class = "必填:与系统匹配\r\n格式:10班[数字+班]",
ClassType = "必填:可选值\r\n[云校班 海豚智学班 蓝鲸智库班 中职班 其他 雅思班 点阵笔班级 移动校园班级 智学班 ...]",
Status = "选填 可选值\r\n[就读,退出]",
AmountRelief ="选填: 为0则视为 '未申请减免'",
Phone="选填",
Remark="选填",
} };
return File(resultList.ExportExcel(), "application/ms-excel",
$"导入学生模板{DateTime.Now.ToString("MMddHHmm")}.xlsx");
}
/// <summary>
/// 下载导入老师模板
/// </summary>
/// <returns></returns>
[HttpGet, ResultIgnore, AllowAnonymous]
public IActionResult DwImportTeacherTemplate()
{
var resultList = new List<TeacherInfoImport>() {
new TeacherInfoImport()
{
Phone="必填",
RealName = "导入规范[导入时请删除本列]",
UserType = "必填 可选值\r\n[年级主任,班主任,教师]",
School = "必填:与系统匹配",
Grade = "必填:可选值\r\n[初一初二初三,高一高二高山]",
Class = "必填:与系统匹配\r\n格式:10班[数字+班]\r\n任教类型是年级主任时不填",
ClassType = "必填:可选值\r\n[云校班 海豚智学班 蓝鲸智库班 中职班 其他 雅思班 点阵笔班级 移动校园班级 智学班 ...]\r\n任教类型是年级主任时不填",
Subject = "选填学科",
ExamNo ="选填: 填写老师任职信息[不在授课架构中的职务]",
}};
return File(resultList.ExportExcel(), "application/ms-excel",
$"导入老师模板_{DateTime.Now.ToString("MMddHHmm")}.xlsx");
}
} }
} }

View File

@ -63,7 +63,7 @@ namespace Learn.Archives.Core.Common
var httpClient = _httpClientFactory.CreateClient(); var httpClient = _httpClientFactory.CreateClient();
var targetUri = new Uri(AppCommon.Config.UserCenterService.API + API_ImportJsonData); var targetUri = new Uri(AppCommon.Config.UserCenterService.API +"/"+ API_ImportJsonData);
var requestMessage = new HttpRequestMessage(new HttpMethod("POST"), targetUri); var requestMessage = new HttpRequestMessage(new HttpMethod("POST"), targetUri);
if (context.Request.Headers.TryGetValue("Authorization", out var authValues)) if (context.Request.Headers.TryGetValue("Authorization", out var authValues))
@ -71,7 +71,7 @@ namespace Learn.Archives.Core.Common
requestMessage.Content = new StringContent(data.ToJson(), Encoding.UTF8, "application/json"); requestMessage.Content = new StringContent(data.ToJson(), Encoding.UTF8, "application/json");
var responseMessage = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead); var responseMessage = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead);
var resStr = await requestMessage.Content?.ReadAsStringAsync(); var resStr = await responseMessage.Content?.ReadAsStringAsync();
var res = JsonSerializer.Deserialize<BaseReturn<UserImportRes>>(resStr); var res = JsonSerializer.Deserialize<BaseReturn<UserImportRes>>(resStr);
if (res == null || res.Code != 200) if (res == null || res.Code != 200)
Oh.Error(res.Message, res.Code); Oh.Error(res.Message, res.Code);

View File

@ -10,6 +10,67 @@ using UserCenter.Model;
namespace Learn.Archives.Core.Model.Dto namespace Learn.Archives.Core.Model.Dto
{ {
public class TeacherInfoImportError : TeacherInfoImport
{
/// <summary>
/// 导入失败原因
/// </summary>
[ExcelColumn(Name = "导入失败原因", Width = 50)]
public string ErrorMsg { get; set; }
}
public class TeacherInfoImport
{
/// <summary>
/// 姓名
/// </summary>
[ExcelColumn(Name = "姓名", Width = 20)]
public string RealName { get; set; }
/// <summary>
/// 联系电话
/// </summary>
[ExcelColumn(Name = "联系电话", Width = 18)]
public string Phone { get; set; }
/// <summary>
/// 任教类型
/// </summary>
[ExcelColumn(Name = "任教类型", Width = 20)]
public string UserType { get; set; }
/// <summary>
/// 学校
/// </summary>
[ExcelColumn(Name = "学校", Width = 20)]
public string School { get; set; }
/// <summary>
/// 年级
/// </summary>
[ExcelColumn(Name = "年级", Width = 10)]
public string Grade { get; set; }
/// <summary>
/// 班级
/// </summary>
[ExcelColumn(Name = "班级", Width = 15)]
public string Class { get; set; }
/// <summary>
/// 班级类型
/// </summary>
[ExcelColumn(Name = "班级类型", Width = 20)]
public string ClassType { get; set; }
/// <summary>
/// 科目
/// </summary>
[ExcelColumn(Name = "科目", Width = 20)]
public string Subject { get; set; }
/// <summary>
/// 职务
/// </summary>
[ExcelColumn(Name = "职务", Width = 20)]
public string ExamNo { get; set; }
}
public class UserImportInsertUser public class UserImportInsertUser
{ {
@ -17,6 +78,7 @@ namespace Learn.Archives.Core.Model.Dto
// 摘要: // 摘要:
// 账号 // 账号
public string Account { get; set; } public string Account { get; set; }
public long Id { get; set; }
} }
public class UserImportRes public class UserImportRes
{ {
@ -60,30 +122,24 @@ namespace Learn.Archives.Core.Model.Dto
/// <summary> /// <summary>
/// 年级 /// 年级
/// </summary> /// </summary>
[ExcelColumn(Name="年级")] [ExcelColumn(Name="年级", Width = 20)]
public string Grade { get; set; } public string Grade { get; set; }
/// <summary> /// <summary>
/// 班级 /// 班级
/// </summary> /// </summary>
[ExcelColumn(Name="班级")] [ExcelColumn(Name="班级", Width = 15)]
public string Class { get; set; } public string Class { get; set; }
/// <summary> /// <summary>
/// 班级 /// 班级
/// </summary> /// </summary>
[ExcelColumn(Name="班级类型")] [ExcelColumn(Name="班级类型", Width = 20)]
public string ClassType { get; set; } public string ClassType { get; set; }
/// <summary>
/// 学段
/// </summary>
[ExcelColumn(Name="学段")]
public string? Stages { get; set; }
/// <summary> /// <summary>
/// 减免金额 /// 减免金额
/// </summary> /// </summary>
[ExcelColumn(Name = "减免金额")] [ExcelColumn(Name = "减免金额")]
public decimal AmountRelief { get; set; } public string AmountRelief { get; set; }
/// <summary> /// <summary>
/// 学生状态[就读/退出] /// 学生状态[就读/退出]
@ -108,9 +164,12 @@ namespace Learn.Archives.Core.Model.Dto
/// </summary> /// </summary>
[ExcelColumn(Name = "备注",Width =50)] [ExcelColumn(Name = "备注",Width =50)]
public string? Remark { get; set; } public string? Remark { get; set; }
/// <summary> /// <summary>
/// id /// id
/// </summary> /// </summary>
///
[ExcelColumn(Ignore = true)]
public long Id { get; set; } = Yitter.IdGenerator.YitIdHelper.NextId(); public long Id { get; set; } = Yitter.IdGenerator.YitIdHelper.NextId();