From 3d3ba3139189a44a4dc28407bc2f0793adcb14f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=82=A5=E7=BE=8A?= <1048382248@qq.com> Date: Wed, 19 Nov 2025 18:29:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E6=A1=A3=E6=A1=88?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E8=B4=A6=E5=8F=B7=E5=BD=95=E5=85=A5=E6=97=B6?= =?UTF-8?q?=20=E9=9C=80=E8=A6=81=E5=88=A4=E6=96=AD=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E9=87=8D=E5=A4=8D=20=E6=96=B0=E5=A2=9E=20?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=AD=A6=E7=94=9F=E6=97=B6=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=B7=BB=E5=8A=A0=E9=80=89=E7=A7=91=E6=96=B9=E5=90=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/AdminController.cs | 4 +- .../Controllers/StudentController.cs | 53 +++++++++++++++++-- Learn.Archives.Core/Common/AppCommon.cs | 30 +++++++++++ .../Model/Dto/UserCenterServiceDto.cs | 11 ++++ 4 files changed, 93 insertions(+), 5 deletions(-) diff --git a/Learn.Archives.API/Controllers/AdminController.cs b/Learn.Archives.API/Controllers/AdminController.cs index f2a3db7..30528cf 100644 --- a/Learn.Archives.API/Controllers/AdminController.cs +++ b/Learn.Archives.API/Controllers/AdminController.cs @@ -150,7 +150,7 @@ namespace Learn.Archives.API.Controllers //处理数据 var accountArr = await baseService.AsQueryable() - .Select(s => s.Account).Distinct() + .Select(s => s.Account ).Distinct() .ToArrayAsync(); var accountH = accountArr.ToHashSet(); var roleDic = await roleDB.AsQueryable() @@ -180,6 +180,8 @@ namespace Learn.Archives.API.Controllers admin.RoleId = (long)roleDic[imp.Role]; admin.Password = imp.Password.Trim().GetMD5(); insertInfo.Add(admin); + //excel内预计新增的账号也计入重复 + accountH.Add(admin.Account); } if (errorExcelInfo.Count != 0) diff --git a/Learn.Archives.API/Controllers/StudentController.cs b/Learn.Archives.API/Controllers/StudentController.cs index 0823dd8..2467523 100644 --- a/Learn.Archives.API/Controllers/StudentController.cs +++ b/Learn.Archives.API/Controllers/StudentController.cs @@ -190,7 +190,7 @@ namespace Learn.Archives.API.Controllers var gStr = GradeHelper.GetGrade(ginfo.GradeLevel, ginfo.GradeYear); if (gStr.ToEnum() == null) //无效的传入年级 { - s.ErrorMsg = "无效的年级 例如[初一/初2028] [年级范围应当是当前有效的就读年级]"; + s.ErrorMsg = "无效的年级 例如[初一/初2028] [年 级范围应当是当前有效的就读年级]"; impError.Add(s); continue; } @@ -301,7 +301,7 @@ namespace Learn.Archives.API.Controllers ReliefType =s.ReliefType, StudentType =s.StudentType.ToEnum(), }); - userCenterImp.Add(new UserExcelExportData() + var addExcelUser = new UserExcelExportData() { UserType = "学生", Account = s.Id.ToString(), @@ -311,8 +311,11 @@ namespace Learn.Archives.API.Controllers ExamNo = s.Id.ToString(), Phone = s.Phone, RealName = s.RealName, - Stages = s.Grade.Contains("初")? StudentStagesEnum.初中.ToString() : StudentStagesEnum.高中.ToString() - }); + Stages = s.Grade.Contains("初") ? StudentStagesEnum.初中.ToString() : StudentStagesEnum.高中.ToString() + }; + userCenterImp.Add(addExcelUser); + if (!string.IsNullOrWhiteSpace(s.高考选科)) + addExcelUser.GKSubject = s.高考选科; } //如果有错误数据则返回excel @@ -341,6 +344,47 @@ namespace Learn.Archives.API.Controllers } + /// + /// 导入excel 更新学生信息 + /// + /// + [HttpPost, ResultIgnore] + [HttpLogEnable] + public async Task ImportUpdateStudent(IFormFile? file) + { + var dataList = await _httpContextAccessor + .ParsingExcelAsync(); + if (dataList == null || dataList.Count() == 0) + Oh.ModelError("导入失败:无有效数据"); + var insertInfo = new List(); + var impError = new List(); + var userCenterImp = new List(); + + + //如果有错误数据则返回excel + if (impError.Count() != 0) + return File(impError.ExportExcel(), "application/ms-excel", $"导入错误学生{DateTime.Now.ToString("MMddHHmm")}.xlsx"); + //调用 用户中心 导入接口 + var importRes = await _userCenterService.CallAPI_ImportJsonData(_httpContextAccessor.HttpContext, userCenterImp); + + var hUAccount = importRes.InsertUsers.ToDictionary(s => s.Account, s => s.Id); + //基于结果判断添加成功` + 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", $"导入错误学生{DateTime.Now.ToString("MMddHHmm")}.xlsx"); + + return Ok(); + } @@ -365,6 +409,7 @@ namespace Learn.Archives.API.Controllers StudentType = "选填: 可选值:\r\n复读生\r\n艺术生\r\n春招生\r\n领导承诺批准全免\r\n资源班\r\n国际班\r\n合同制收费学校\r\n渠道商家属\r\n新开班但领导承诺第一学期不收费", Phone="选填", Remark="选填", + 高考选科 = "填写学科\r\n 例如 物理 \r\n多学科情况下 物理,化学,生物" } }; return File(resultList.ExportExcel(), "application/ms-excel", $"导入学生模板{DateTime.Now.ToString("MMddHHmm")}.xlsx"); diff --git a/Learn.Archives.Core/Common/AppCommon.cs b/Learn.Archives.Core/Common/AppCommon.cs index 20e821a..5650b26 100644 --- a/Learn.Archives.Core/Common/AppCommon.cs +++ b/Learn.Archives.Core/Common/AppCommon.cs @@ -19,6 +19,8 @@ using System.Threading.Tasks; using UserCenter.Model.Interface; using MiniExcelLibs; using MiniExcelLibs.OpenXml; +using Microsoft.AspNetCore.Http; +using Learn.Archives.Core.Model.Dto; namespace Learn.Archives.Core.Common { @@ -146,7 +148,35 @@ namespace Learn.Archives.Core.Common }; return JsonSerializer.Serialize(o, jsonOptions); } + /// + /// 解析Excel为对象数组 + /// + /// + /// + /// + public static async Task ParsingExcelAsync(this IHttpContextAccessor context) where T: class, new() + { + if (context == null) Oh.ModelError("传入无效的请求上下文数据"); + var fl =context?.HttpContext?.Request.Form.Files[0]; + if (fl == null) Oh.ModelError("传入无效的Excel数据"); + if (!Path.GetExtension(fl.FileName).Equals(".xlsx", StringComparison.OrdinalIgnoreCase)) + Oh.ModelError("请选择导入文件为.xlsx的后缀名!"); + try + { + //分析excel + IEnumerable dataList; + using var stream = new MemoryStream(); + { + await fl.CopyToAsync(stream); + return stream.Query().ToArray(); + } + } + catch (Exception ex) + { + return Oh.Error("分析失败"+ex.Message); + } + } /// /// 获取应用有效程序集 diff --git a/Learn.Archives.Core/Model/Dto/UserCenterServiceDto.cs b/Learn.Archives.Core/Model/Dto/UserCenterServiceDto.cs index a9c3b7a..70fa2fe 100644 --- a/Learn.Archives.Core/Model/Dto/UserCenterServiceDto.cs +++ b/Learn.Archives.Core/Model/Dto/UserCenterServiceDto.cs @@ -214,6 +214,12 @@ namespace Learn.Archives.Core.Model.Dto [ExcelColumn(Name = "备注",Width =50)] public string? Remark { get; set; } + /// + /// 高考选科 + /// + /// + [ExcelColumn(Name = "高考选科", Width = 20)] + public string? 高考选科 { get; set; } /// /// id /// @@ -311,6 +317,11 @@ namespace Learn.Archives.Core.Model.Dto /// [ExcelColumn(Name="学段")] public string? Stages { get; set; } + /// + /// 选修方向 + /// + [ExcelColumnName("选修方向")] + public string? GKSubject { get; set; } }