117 lines
5.0 KiB
C#
117 lines
5.0 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel.DataAnnotations;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using AutoMapper.QueryableExtensions;
|
|
using iPackage.Core.Web.Repositories;
|
|
using iPackage.Core.Web.Services.Contracts;
|
|
using iPackage.Extensions;
|
|
using iPackage.Models.Dto;
|
|
using iPackage.Models.Entity;
|
|
using iPackage.Models.Util;
|
|
using MD.PersianDateTime.Standard;
|
|
|
|
namespace iPackage.Core.Web.Services
|
|
{
|
|
|
|
public class ReportService : IReportService
|
|
{
|
|
private readonly IRepositoryWrapper _repositoryWrapper;
|
|
|
|
public ReportService(IRepositoryWrapper repositoryWrapper)
|
|
{
|
|
_repositoryWrapper = repositoryWrapper;
|
|
}
|
|
|
|
|
|
public async Task<ReportResult> CrudDataBaseReportTask<T>(ReportRequest request) where T : ApiEntity
|
|
{
|
|
var table = _repositoryWrapper.SetRepository<T>().TableNoTracking;
|
|
switch (request.ReportType)
|
|
{
|
|
case ReportType.ByDate:
|
|
table = table.Where(t => t.CreationTime.Date >= request.FromDateTime.Date && t.CreationTime.Date <= request.ToDateTime.Date);
|
|
break;
|
|
case ReportType.ByValue:
|
|
throw new Exception("درخواست گزارش صحیح نیست تنها مقدور به درخواست تاریخی هستید");
|
|
default:
|
|
throw new Exception("درخواست گزارش صحیح نیست تنها مقدور به درخواست تاریخی هستید");
|
|
}
|
|
var result = await CreateReportFromDates<T>(table);
|
|
return result;
|
|
}
|
|
public async Task<ReportResult> CrudDataBaseDtoReportTask<T, TDto>(ReportRequest request)
|
|
where T : ApiEntity, new()
|
|
where TDto : BaseDto<TDto, T>, new()
|
|
{
|
|
var table = _repositoryWrapper.SetRepository<T>().TableNoTracking;
|
|
switch (request.ReportType)
|
|
{
|
|
case ReportType.ByDate:
|
|
table = table.Where(t => t.CreationTime.Date >= request.FromDateTime.Date && t.CreationTime.Date <= request.ToDateTime.Date);
|
|
break;
|
|
case ReportType.ByValue:
|
|
throw new Exception("درخواست گزارش صحیح نیست تنها مقدور به درخواست تاریخی هستید");
|
|
default:
|
|
throw new Exception("درخواست گزارش صحیح نیست تنها مقدور به درخواست تاریخی هستید");
|
|
}
|
|
var result = await CreateReportFromDates<TDto>(table.ProjectTo<TDto>());
|
|
return result;
|
|
}
|
|
private async Task<ReportResult> CreateReportFromDates<T>(IQueryable<T> table)
|
|
{
|
|
ReportResult result = new ReportResult();
|
|
|
|
var baseObj = Activator.CreateInstance<T>();
|
|
var baseProperteis = baseObj.GetType().GetProperties();
|
|
var headerRow = new ReportRow();
|
|
|
|
|
|
foreach (var peroperty in baseProperteis)
|
|
{
|
|
if (peroperty.GetCustomAttributes(typeof(DisplayAttribute)).FirstOrDefault() == null)
|
|
continue;
|
|
var atts = peroperty.CustomAttributes;
|
|
if (peroperty.GetType() != typeof(IList) && peroperty.GetType() != typeof(ICollection))
|
|
headerRow.Cells.Add(peroperty.GetPropertyDisplayName());
|
|
}
|
|
result.Rows.Add(headerRow);
|
|
|
|
if (table is IQueryable queryTable)
|
|
{
|
|
foreach (var query in queryTable)
|
|
{
|
|
var row = new ReportRow();
|
|
var peroperties = query.GetType().GetProperties();
|
|
foreach (var peroperty in peroperties)
|
|
{
|
|
if (peroperty.GetCustomAttributes(typeof(DisplayAttribute)).FirstOrDefault() == null)
|
|
continue;
|
|
if (peroperty.GetValue(query) is bool)
|
|
row.Cells.Add((bool)peroperty.GetValue(query) ? "بلی" : "خیر");
|
|
else if (peroperty.GetValue(query) is DateTime)
|
|
{
|
|
var datetime = new PersianDateTime((DateTime)peroperty.GetValue(query));
|
|
row.Cells.Add(datetime.ToString());
|
|
}
|
|
else if (peroperty.GetValue(query) is Enum)
|
|
{
|
|
var enumDisplay = EnumExtensions.ToDisplay((Enum)peroperty.GetValue(query));
|
|
row.Cells.Add(enumDisplay);
|
|
}
|
|
else if (peroperty.GetType() != typeof(IList) && peroperty.GetType() != typeof(ICollection))
|
|
row.Cells.Add(peroperty.GetValue(query)?.ToString());
|
|
}
|
|
result.Rows.Add(row);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|