From c9f9c22e6db5f8562d48c2f342baa602bd164e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=82=A5=E7=BE=8A?= <1048382248@qq.com> Date: Sun, 24 Aug 2025 17:17:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=20=E8=80=81=E5=B8=88?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ExamClassInfoController.cs | 5 +- .../Controllers/SchoolBusinessController.cs | 23 +++- .../Controllers/StudentController.cs | 122 +++++++++++++++++- .../Common/UserCenterService.cs | 4 +- .../Model/Dto/UserCenterServiceDto.cs | 79 ++++++++++-- 5 files changed, 208 insertions(+), 25 deletions(-) diff --git a/Learn.Archives.API/Controllers/ExamClassInfoController.cs b/Learn.Archives.API/Controllers/ExamClassInfoController.cs index 40e86f3..e8a7863 100644 --- a/Learn.Archives.API/Controllers/ExamClassInfoController.cs +++ b/Learn.Archives.API/Controllers/ExamClassInfoController.cs @@ -224,7 +224,7 @@ namespace Learn.Archives.API.Controllers } } 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; @@ -270,7 +270,8 @@ namespace Learn.Archives.API.Controllers 英语 = 80.5m, 赋分后总分=721.5m } }; - return File(resultList.ExportExcel(), "application/ms-excel"); + return File(resultList.ExportExcel(), "application/ms-excel", + $"导入成绩模板{DateTime.Now.ToString("MMddHHmm")}.xlsx"); } /// diff --git a/Learn.Archives.API/Controllers/SchoolBusinessController.cs b/Learn.Archives.API/Controllers/SchoolBusinessController.cs index 192bdb8..2b2132e 100644 --- a/Learn.Archives.API/Controllers/SchoolBusinessController.cs +++ b/Learn.Archives.API/Controllers/SchoolBusinessController.cs @@ -114,7 +114,6 @@ namespace Learn.Archives.API.Controllers /// /// 导入考试信息 /// - /// /// [HttpPost, ResultIgnore] [HttpLogEnable] @@ -136,7 +135,6 @@ namespace Learn.Archives.API.Controllers if (dataList == null || dataList.Count() == 0) Oh.ModelError("导入失败:无有效数据"); - //todo //处理数据 var errorExcelInfo = new List(); var insertInfo = new List(); @@ -253,7 +251,8 @@ namespace Learn.Archives.API.Controllers }; 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); @@ -261,7 +260,7 @@ namespace Learn.Archives.API.Controllers } /// - /// 下载导入成绩模板 + /// 下载导入模板 /// /// [HttpGet, ResultIgnore, AllowAnonymous] @@ -271,7 +270,23 @@ namespace Learn.Archives.API.Controllers return File(resultList.ExportExcel(), "application/ms-excel", "导入赴校信息模板.xlsx"); } + /// + /// 下载导出模板 + /// + /// + [HttpGet, ResultIgnore, AllowAnonymous] + public async Task ExportTemplate() + { + var qData = await baseService.AsQueryable() + .Where(s => true) + .ToArrayAsync(); + + //todo完善数据转换 + var resultList = new List() { new SchoolBusinessImport() { } }; + return File(resultList.ExportExcel(), "application/ms-excel", "导入赴校信息模板.xlsx"); + } + } } diff --git a/Learn.Archives.API/Controllers/StudentController.cs b/Learn.Archives.API/Controllers/StudentController.cs index 1250065..e05ae58 100644 --- a/Learn.Archives.API/Controllers/StudentController.cs +++ b/Learn.Archives.API/Controllers/StudentController.cs @@ -14,6 +14,7 @@ using System.Security.Claims; using System.Text.RegularExpressions; using UserCenter.Model; using UserCenter.Model.Common; +using UserCenter.Model.Enum; namespace Learn.Archives.API.Controllers { @@ -108,11 +109,66 @@ namespace Learn.Archives.API.Controllers + /// + /// 导入老师信息 + /// + /// + [HttpPost, ResultIgnore] + [HttpLogEnable] + public async Task 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 dataList; + using var stream = new MemoryStream(); + { + await fl.CopyToAsync(stream); + dataList = stream.Query() + .Where(s => !string.IsNullOrEmpty(s.School)); + } + if (dataList == null || dataList.Count() == 0) + Oh.ModelError("导入失败:无有效数据"); + var insertInfo = new List(); + var userCenterImp = new List(); + 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()); + //如果有错误数据则返回excel + if (errorExcelInfo.Count() != 0) + return File(errorExcelInfo.ExportExcel(), "application/ms-excel", $"导入错误的老师{DateTime.Now.ToString("MMddHHmm")}.xlsx"); + + return Ok(); + } + /// - /// 导入考试信息 + /// 导入学生信息 /// /// [HttpPost, ResultIgnore] @@ -134,14 +190,13 @@ namespace Learn.Archives.API.Controllers } if (dataList == null || dataList.Count() == 0) Oh.ModelError("导入失败:无有效数据"); - var insertInfo = new List(); var userCenterImp = new List(); foreach (var s in dataList) { insertInfo.Add(new Student() { - AmountRelief = s.AmountRelief, + AmountRelief = decimal.TryParse(s.AmountRelief,out decimal v)?v:0, ExitTime = s.ExitTime, Remark = s.Remark, JoinTime = s.JoinTime, @@ -159,23 +214,28 @@ namespace Learn.Archives.API.Controllers ExamNo = s.Id.ToString(), Phone = s.Phone, RealName = s.RealName, - Stages = s.Stages + Stages = s.Grade.Contains("初")? StudentStagesEnum.初中.ToString() : StudentStagesEnum.高中.ToString() }); } //调用 用户中心 导入接口 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); //处理数据 var errorExcelInfo = importRes.ErrorExcelExport.Select(s => s.Adapt()); //如果有错误数据则返回excel 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(); } @@ -185,6 +245,54 @@ namespace Learn.Archives.API.Controllers + /// + /// 下载导入模板 + /// + /// + [HttpGet, ResultIgnore, AllowAnonymous] + public IActionResult DwImportTemplate() + { + var resultList = new List() { 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"); + } + + + + /// + /// 下载导入老师模板 + /// + /// + [HttpGet, ResultIgnore, AllowAnonymous] + public IActionResult DwImportTeacherTemplate() + { + var resultList = new List() { + 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"); + } } } diff --git a/Learn.Archives.Core/Common/UserCenterService.cs b/Learn.Archives.Core/Common/UserCenterService.cs index 1f61c21..b4f32b1 100644 --- a/Learn.Archives.Core/Common/UserCenterService.cs +++ b/Learn.Archives.Core/Common/UserCenterService.cs @@ -63,7 +63,7 @@ namespace Learn.Archives.Core.Common 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); 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"); var responseMessage = await httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead); - var resStr = await requestMessage.Content?.ReadAsStringAsync(); + var resStr = await responseMessage.Content?.ReadAsStringAsync(); var res = JsonSerializer.Deserialize>(resStr); if (res == null || res.Code != 200) Oh.Error(res.Message, res.Code); diff --git a/Learn.Archives.Core/Model/Dto/UserCenterServiceDto.cs b/Learn.Archives.Core/Model/Dto/UserCenterServiceDto.cs index 7477d4a..0cce1e1 100644 --- a/Learn.Archives.Core/Model/Dto/UserCenterServiceDto.cs +++ b/Learn.Archives.Core/Model/Dto/UserCenterServiceDto.cs @@ -10,6 +10,67 @@ using UserCenter.Model; namespace Learn.Archives.Core.Model.Dto { + public class TeacherInfoImportError : TeacherInfoImport + { + /// + /// 导入失败原因 + /// + [ExcelColumn(Name = "导入失败原因", Width = 50)] + public string ErrorMsg { get; set; } + } + public class TeacherInfoImport + { + /// + /// 姓名 + /// + [ExcelColumn(Name = "姓名", Width = 20)] + public string RealName { get; set; } + /// + /// 联系电话 + /// + [ExcelColumn(Name = "联系电话", Width = 18)] + public string Phone { get; set; } + + /// + /// 任教类型 + /// + [ExcelColumn(Name = "任教类型", Width = 20)] + public string UserType { get; set; } + /// + /// 学校 + /// + [ExcelColumn(Name = "学校", Width = 20)] + public string School { get; set; } + /// + /// 年级 + /// + [ExcelColumn(Name = "年级", Width = 10)] + public string Grade { get; set; } + /// + /// 班级 + /// + [ExcelColumn(Name = "班级", Width = 15)] + public string Class { get; set; } + /// + /// 班级类型 + /// + [ExcelColumn(Name = "班级类型", Width = 20)] + public string ClassType { get; set; } + + /// + /// 科目 + /// + [ExcelColumn(Name = "科目", Width = 20)] + public string Subject { get; set; } + + + /// + /// 职务 + /// + [ExcelColumn(Name = "职务", Width = 20)] + public string ExamNo { get; set; } + + } public class UserImportInsertUser { @@ -17,6 +78,7 @@ namespace Learn.Archives.Core.Model.Dto // 摘要: // 账号 public string Account { get; set; } + public long Id { get; set; } } public class UserImportRes { @@ -60,30 +122,24 @@ namespace Learn.Archives.Core.Model.Dto /// /// 年级 /// - [ExcelColumn(Name="年级")] + [ExcelColumn(Name="年级", Width = 20)] public string Grade { get; set; } /// /// 班级 /// - [ExcelColumn(Name="班级")] + [ExcelColumn(Name="班级", Width = 15)] public string Class { get; set; } /// /// 班级 /// - [ExcelColumn(Name="班级类型")] + [ExcelColumn(Name="班级类型", Width = 20)] public string ClassType { get; set; } - /// - /// 学段 - /// - [ExcelColumn(Name="学段")] - public string? Stages { get; set; } - /// /// 减免金额 /// [ExcelColumn(Name = "减免金额")] - public decimal AmountRelief { get; set; } + public string AmountRelief { get; set; } /// /// 学生状态[就读/退出] @@ -108,9 +164,12 @@ namespace Learn.Archives.Core.Model.Dto /// [ExcelColumn(Name = "备注",Width =50)] public string? Remark { get; set; } + /// /// id /// + /// + [ExcelColumn(Ignore = true)] public long Id { get; set; } = Yitter.IdGenerator.YitIdHelper.NextId();