using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Admin.NET.Core; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; using Microsoft.AspNetCore.Http; using System.Text; using System.Web; using System.ComponentModel; using System.Data; namespace Admin.NET.Application { /// /// 学生视图服务 /// [ApiDescriptionSettings("TestDemo", Name = "VStudent", Order = 100)] [Route("api/[Controller]")] public class VStudentService : IVStudentService, IDynamicApiController, ITransient { private readonly IRepository _vStudentRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly ISysExcelTemplateService _sysExcelTemplateService; private readonly static object _lock = new(); public VStudentService( IRepository vStudentRep ,IRepository sysDictTypeRep ,IRepository sysDictDataRep ,ISysExcelTemplateService sysExcelTemplateService ) { _vStudentRep = vStudentRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysExcelTemplateService = sysExcelTemplateService; } /// /// 分页查询学生视图 /// /// /// [Description("VStudent/page")] [HttpGet("page")] public async Task> Page([FromQuery] VStudentSearch input) { var vStudents = await _vStudentRep.DetachedEntities .Where(input.Id != null, u => u.Id == input.Id) .Where(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name) .Where(input.Age != null, u => u.Age == input.Age) .Where(input.StartName != null, u => u.StartName == input.StartName) .Where(input.Gender != null, u => u.Gender == input.Gender) .Where(input.BrithDate != null, u => u.BrithDate == input.BrithDate) .Where(input.TeacherId != null, u => u.TeacherId == input.TeacherId) .Where(!string.IsNullOrEmpty(input.teacherName), u => u.teacherName == input.teacherName) .OrderBy(PageInputOrder.OrderBuilder(input)) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return vStudents; } /// /// 不分页查询学生视图列表 /// /// 学生视图查询参数 /// (学生视图)实例列表 [Description("VStudent/listNonPage")] [HttpGet("listNonPage")] public async Task> ListNonPageAsync([FromQuery] VStudentSearchNonPage input) { var pId = input.Id; var pName = input.Name?.Trim() ?? ""; var pAge = input.Age; var pStartName = input.StartName; var pGender = input.Gender; var pBrithDate = input.BrithDate; var pTeacherId = input.TeacherId; var pteacherName = input.teacherName?.Trim() ?? ""; var vStudents = await _vStudentRep.DetachedEntities .Where(pId != null, u => u.Id == pId) .Where(!string.IsNullOrEmpty(pName), u => u.Name == pName) .Where(pAge != null, u => u.Age == pAge) .Where(pStartName != null, u => u.StartName == pStartName) .Where(pGender != null, u => u.Gender == pGender) .Where(pBrithDate != null, u => u.BrithDate == pBrithDate) .Where(pTeacherId != null, u => u.TeacherId == pTeacherId) .Where(!string.IsNullOrEmpty(pteacherName), u => u.teacherName == pteacherName) .OrderBy(PageInputOrder.OrderNonPageBuilder(input)) .ProjectToType() .ToListAsync(); return vStudents; } /// /// 增加学生视图 /// /// /// [Description("VStudent/add")] [HttpPost("add")] public async Task Add(AddVStudentInput input) { var vStudent = input.Adapt(); //验证 await CheckExisit(vStudent); vStudent.CreatedUserId = vStudent.UpdatedUserId = SysHelper.GetUserId(); vStudent.CreatedUserName = vStudent.UpdatedUserName = SysHelper.GetUserName(); vStudent.CreatedTime = vStudent.UpdatedTime = SysHelper.GetNowTime(); await _vStudentRep.InsertAsync(vStudent); } /// /// 删除学生视图 /// /// /// [Description("VStudent/delete")] [HttpPost("delete")] public async Task Delete(DeleteVStudentInput input) { } /// /// 更新学生视图 /// /// /// [Description("VStudent/edit")] [HttpPost("edit")] public async Task Update(UpdateVStudentInput input) { var isExist = await _vStudentRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D1002); var vStudent = input.Adapt(); //验证 await CheckExisit(vStudent,true); vStudent.UpdatedUserId = SysHelper.GetUserId(); vStudent.UpdatedUserName = SysHelper.GetUserName(); vStudent.UpdatedTime = SysHelper.GetNowTime(); await _vStudentRep.UpdateAsync(vStudent,ignoreNullValues:true); } /// /// 获取学生视图 /// /// /// [Description("VStudent/detail")] [HttpGet("detail")] public async Task Get([FromQuery] QueryeVStudentInput input) { return null; return null; return null; return null; return null; return null; return null; return null; } /// /// 获取学生视图列表 /// /// /// [Description("VStudent/list")] [HttpGet("list")] public async Task> List([FromQuery] VStudentInput input) { return await _vStudentRep.DetachedEntities.ProjectToType().ToListAsync(); } /// /// Excel模板导入学生视图功能 /// /// Excel模板文件 /// Excel导入方式 /// 导入的记录数 [HttpPost("fromExcel")] public async Task FromExcelAsync(IFormFile file, [FromQuery] ImportExcelType importExcelType) { int _HeadStartLine = 2;//第1行是说明,第2行是列名 int _DataStartLine = 3;//第3行开始是数据 DataTable importDataTable = ExcelUtil.ImportExcelToDataTable(file, _HeadStartLine, _DataStartLine); var addList =await CommonImport(importDataTable, _DataStartLine); lock (_lock) { _vStudentRep.InsertAsync(addList); } await Task.CompletedTask; return addList.Count; } /// /// DataTable转换实体对象列表 /// /// /// 模版列名开始行 /// private async Task> CommonImport(DataTable dataTable, int dataStartLine) { var details = new List(); int index = dataStartLine;//模版列名开始行 foreach (System.Data.DataRow row in dataTable.Rows) { index++; //导入模版定制化代码(替换模版使用) var addItem = new VStudent() { CreatedTime = SysHelper.GetNowTime(), CreatedUserId = SysHelper.GetUserId(), CreatedUserName = SysHelper.GetUserName(), UpdatedTime = SysHelper.GetNowTime(), UpdatedUserId = SysHelper.GetUserId(), UpdatedUserName = SysHelper.GetUserName() }; #region 定义变量 var _Id = "";//Id主键 var _Name = "";//学生姓名 var _Age = "";//学生年龄 var _StartName = "";//是否在校 var _Gender = "";//性别 var _BrithDate = "";//出生日期 var _TeacherId = "";//关联老师 var _teacherName = "";//老师名称 #endregion #region 取值 _Id = row["Id主键"]?.ToString() ; _Name = row["学生姓名"]?.ToString() ; _Age = row["学生年龄"]?.ToString() ; _StartName = row["是否在校"]?.ToString() ; _Gender = row["性别"]?.ToString() ; _BrithDate = row["出生日期"]?.ToString() ; _TeacherId = row["关联老师"]?.ToString() ; _teacherName = row["老师名称"]?.ToString() ; #endregion #region 验证 if(!string.IsNullOrEmpty(_Id)) { if (!long.TryParse(_Id, out long outId)&&!string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}行[Id主键]{_Id}值不正确!"); } if (outId <= 0&&!string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}行[Id主键]{_Id}值不能小于等于0!"); } else { addItem.Id = outId; } } if(!string.IsNullOrEmpty(_Name)) { addItem.Name = (string)_Name; } if(!string.IsNullOrEmpty(_Age)) { if (!int.TryParse(_Age, out int outAge)&&!string.IsNullOrEmpty(_Age)) { throw Oops.Oh($"第{index}行[学生年龄]{_Age}值不正确!"); } if (outAge <= 0&&!string.IsNullOrEmpty(_Age)) { throw Oops.Oh($"第{index}行[学生年龄]{_Age}值不能小于等于0!"); } else { addItem.Age = outAge; } } if(!string.IsNullOrEmpty(_StartName)) { if(!_StartName.Equals("是") && !_StartName.Equals("否")) { throw Oops.Oh($"第{index}行[是否在校]{_StartName}值不正确!"); } else { bool outStartName = _StartName.Equals("是") ? true : false; addItem.StartName = outStartName; } } if(!string.IsNullOrEmpty(_Gender)) { System.Int32 enumGender = default(System.Int32); if(!Enum.TryParse(_Gender, out enumGender)&&!string.IsNullOrEmpty(_Gender)) { throw Oops.Oh($"第{index}行[性别]{_Gender}值不正确!"); } else { addItem.Gender = enumGender; } } if(!string.IsNullOrEmpty(_BrithDate)) { addItem.BrithDate = Convert.ToDateTime(Convert.ToDateTime(_BrithDate).ToShortDateString()); } if(!string.IsNullOrEmpty(_TeacherId)) { if (!long.TryParse(_TeacherId, out long outTeacherId)&&!string.IsNullOrEmpty(_TeacherId)) { throw Oops.Oh($"第{index}行[关联老师]{_TeacherId}值不正确!"); } if (outTeacherId <= 0&&!string.IsNullOrEmpty(_TeacherId)) { throw Oops.Oh($"第{index}行[关联老师]{_TeacherId}值不能小于等于0!"); } else { addItem.TeacherId = outTeacherId; } } if(!string.IsNullOrEmpty(_teacherName)) { addItem.teacherName = (string)_teacherName; } #endregion //验重 await CheckExisit(details, addItem,index); details.Add(addItem); } return details; } /// /// 根据版本下载学生视图的Excel导入模板 /// /// 模板版本 /// 下载的模板文件 [Description("VStudent/downloadExcelTemplate")] [HttpGet("downloadExcelTemplate")] public IActionResult DownloadExcelTemplate([FromQuery] string version) { string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\VStudent{TemplateConst.EXCEL_TEMPLATEFILE_导入模版名称后缀}.xlsx"; var fileName = HttpUtility.UrlEncode($"导入模板(学生视图).xlsx", Encoding.GetEncoding("UTF-8")); return new FileStreamResult(new FileStream(_path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName }; } /// /// 根据学生视图查询参数导出Excel /// /// 学生视图查询参数 /// 导出的Excel文件 [Description("VStudent/toExcel")] [HttpGet("toExcel")] public async Task ToExcelAsync([FromQuery] VStudentSearchNonPage input) { var vStudentList = await ListNonPageAsync(input); MemoryStream ms = new(); DataConvertUtil.ToExcelData(vStudentList, _sysDictTypeRep, _sysDictDataRep, out List headers, out List> data, out string sheetName); var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("VStudent", "v1"); if (excelTemplate != null) { ExcelUtil.ToExcel(excelTemplate.TemplateFileName, headers, data, sheetName, excelTemplate.HeadStartLine, excelTemplate.DataStartLine, ms); } else { ExcelUtil.ToExcel(headers, data, sheetName, ms); } ms.Position = 0; var fileName = HttpUtility.UrlEncode($"{sheetName}[{DateTimeOffset.Now:yyyy-MM-dd}].xlsx", Encoding.GetEncoding("UTF-8")); return new FileStreamResult(ms, "application/octet-stream") { FileDownloadName = fileName }; } /// /// 根据联合主键验证数据是否已存在-数据库 /// /// /// /// 导入模板excel行号 /// private async Task CheckExisit( VStudent input,bool isEdit=false,int index=0) { //没有配置联合主键,不需要验重 } /// /// 根据联合主键验证数据是否已存在-导入的数据集 /// /// /// /// 导入模板excel行号 private async Task CheckExisit(List inputs,VStudent input, int index) { //没有配置联合主键,不需要验重 } } }