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)
{
//没有配置联合主键,不需要验重
}
}
}