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 = "TestStudent5", Order = 100)]
[Route("api/[Controller]")]
public class TestStudent5Service : ITestStudent5Service, IDynamicApiController, ITransient
{
private readonly IRepository _testStudent5Rep;
private readonly IRepository _sysDictTypeRep;
private readonly IRepository _sysDictDataRep;
private readonly ISysExcelTemplateService _sysExcelTemplateService;
private readonly static object _lock = new();
public TestStudent5Service(
IRepository testStudent5Rep
,IRepository sysDictTypeRep
,IRepository sysDictDataRep
,ISysExcelTemplateService sysExcelTemplateService
)
{
_testStudent5Rep = testStudent5Rep;
_sysDictTypeRep = sysDictTypeRep;
_sysDictDataRep = sysDictDataRep;
_sysExcelTemplateService = sysExcelTemplateService;
}
///
/// 分页查询测试学生表
///
///
///
[Description("TestStudent5/page")]
[HttpGet("page")]
public async Task> Page([FromQuery] TestStudent5Search input)
{
var testStudent5s = await _testStudent5Rep.DetachedEntities
.Where(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name)
.Where(input.Age != null, u => u.Age == input.Age)
.Where(input.CreatedTime!=null, u => u.CreatedTime>= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1]))
.Where(input.UpdatedTime!=null, u => u.UpdatedTime>= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1]))
.Where(!string.IsNullOrEmpty(input.CreatedUserName), u => u.CreatedUserName == input.CreatedUserName)
.Where(!string.IsNullOrEmpty(input.UpdatedUserName), u => u.UpdatedUserName == input.UpdatedUserName)
.OrderBy(PageInputOrder.OrderBuilder(input))
.ProjectToType()
.ToADPagedListAsync(input.PageNo, input.PageSize);
return testStudent5s;
}
///
/// 不分页查询测试学生表列表
///
/// 测试学生表查询参数
/// (测试学生表)实例列表
[Description("TestStudent5/listNonPage")]
[HttpGet("listNonPage")]
public async Task> ListNonPageAsync([FromQuery] TestStudent5SearchNonPage input)
{
var pName = input.Name?.Trim() ?? "";
var pAge = input.Age;
var pCreatedTime = input.CreatedTime;
var pUpdatedTime = input.UpdatedTime;
var pCreatedUserName = input.CreatedUserName?.Trim() ?? "";
var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? "";
var testStudent5s = await _testStudent5Rep.DetachedEntities
.Where(!string.IsNullOrEmpty(pName), u => u.Name == pName)
.Where(pAge != null, u => u.Age == pAge)
.Where(input.CreatedTime!=null, u => u.CreatedTime>= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1]))
.Where(input.UpdatedTime!=null, u => u.UpdatedTime>= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1]))
.Where(!string.IsNullOrEmpty(pCreatedUserName), u => u.CreatedUserName == pCreatedUserName)
.Where(!string.IsNullOrEmpty(pUpdatedUserName), u => u.UpdatedUserName == pUpdatedUserName)
.OrderBy(PageInputOrder.OrderNonPageBuilder(input))
.ProjectToType()
.ToListAsync();
return testStudent5s;
}
///
/// 增加测试学生表
///
///
///
[Description("TestStudent5/add")]
[HttpPost("add")]
public async Task Add(AddTestStudent5Input input)
{
var testStudent5 = input.Adapt();
//验证
await CheckExisit(testStudent5);
await _testStudent5Rep.InsertAsync(testStudent5);
}
///
/// 删除测试学生表
///
///
///
[Description("TestStudent5/delete")]
[HttpPost("delete")]
public async Task Delete(DeleteTestStudent5Input input)
{
var testStudent5 = await _testStudent5Rep.FirstOrDefaultAsync(u => u.Id == input.Id);
await _testStudent5Rep.DeleteAsync(testStudent5);
}
///
/// 更新测试学生表
///
///
///
[Description("TestStudent5/edit")]
[HttpPost("edit")]
public async Task Update(UpdateTestStudent5Input input)
{
var isExist = await _testStudent5Rep.AnyAsync(u => u.Id == input.Id, false);
if (!isExist) throw Oops.Oh(ErrorCode.D1002);
var testStudent5 = input.Adapt();
//验证
await CheckExisit(testStudent5,true);
await _testStudent5Rep.UpdateAsync(testStudent5,ignoreNullValues:true);
}
///
/// 获取测试学生表
///
///
///
[Description("TestStudent5/detail")]
[HttpGet("detail")]
public async Task Get([FromQuery] QueryeTestStudent5Input input)
{
return (await _testStudent5Rep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt();
}
///
/// 获取测试学生表列表
///
///
///
[Description("TestStudent5/list")]
[HttpGet("list")]
public async Task> List([FromQuery] TestStudent5Input input)
{
return await _testStudent5Rep.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)
{
_testStudent5Rep.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 TestStudent5()
{
CreatedTime = DateTime.Now,
CreatedUserId = CurrentUserInfo.UserId,
CreatedUserName = CurrentUserInfo.Name,
UpdatedTime = DateTime.Now,
UpdatedUserId = CurrentUserInfo.UserId,
UpdatedUserName = CurrentUserInfo.Name
};
#region 定义变量
var _Name = "";//姓名
var _Age = "";//年龄
#endregion
#region 取值
_Name = row["姓名"]?.ToString() ;
_Age = row["年龄"]?.ToString() ;
#endregion
#region 验证
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;
}
}
#endregion
//验重
await CheckExisit(details, addItem,index);
details.Add(addItem);
}
return details;
}
///
/// 根据版本下载测试学生表的Excel导入模板
///
/// 模板版本
/// 下载的模板文件
[Description("TestStudent5/downloadExcelTemplate")]
[HttpGet("downloadExcelTemplate")]
public IActionResult DownloadExcelTemplate([FromQuery] string version)
{
string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\TestStudent5{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("TestStudent5/toExcel")]
[HttpGet("toExcel")]
public async Task ToExcelAsync([FromQuery] TestStudent5SearchNonPage input)
{
var testStudent5List = await ListNonPageAsync(input);
MemoryStream ms = new();
DataConvertUtil.ToExcelData(testStudent5List, _sysDictTypeRep, _sysDictDataRep, out List headers,
out List> data, out string sheetName);
var excelTemplate = await _sysExcelTemplateService.GetByAppNameAndClassNameAndVersionAsync("TestStudent5", "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( TestStudent5 input,bool isEdit=false,int index=0)
{
bool isExist = false;
if (!isEdit)//新增
{
//数据是否重复
isExist = await _testStudent5Rep.AnyAsync(u =>
u.Name.Equals(input.Name)
&&u.Age.Equals(input.Age)
&&u.CreatedTime.Equals(input.CreatedTime)
&&u.UpdatedTime.Equals(input.UpdatedTime)
&&u.CreatedUserName.Equals(input.CreatedUserName)
&&u.UpdatedUserName.Equals(input.UpdatedUserName)
,false);
}
else//编辑
{
//数据是否重复
isExist = await _testStudent5Rep.AnyAsync(u =>
u.Id == input.Id
&&u.Age.Equals(input.Age)
&&u.CreatedTime.Equals(input.CreatedTime)
&&u.UpdatedTime.Equals(input.UpdatedTime)
&&u.CreatedUserName.Equals(input.CreatedUserName)
&&u.UpdatedUserName.Equals(input.UpdatedUserName)
,false);
}
if (index > 0)
{
if (isExist) throw Oops.Oh($"第{index}行数据已存在");
}
else
{
if (isExist) throw Oops.Oh(ErrorCode.E0001);
}
}
///
/// 根据联合主键验证数据是否已存在-导入的数据集
///
///
///
/// 导入模板excel行号
private async Task CheckExisit(List inputs,TestStudent5 input, int index)
{
//导入的集合是否已存在相同数据
var isExist = inputs.Any(u =>
u.Name.Equals(input.Name)
&&u.Age.Equals(input.Age)
&&u.CreatedTime.Equals(input.CreatedTime)
&&u.UpdatedTime.Equals(input.UpdatedTime)
&&u.CreatedUserName.Equals(input.CreatedUserName)
&&u.UpdatedUserName.Equals(input.UpdatedUserName)
);
if(isExist) throw Oops.Oh($"第{index}行数据已存在");
//数据库是否已存在相同数
await CheckExisit(input,false,index);
}
}
}