iPackage/iPackage.Core.Web/Services/ReportService.cs

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;
}
}
}