feat 餐次就餐分析

This commit is contained in:
2024-08-13 10:32:27 +08:00
parent eed8fd5752
commit 9e9368954e
7 changed files with 113 additions and 2 deletions

View File

@@ -41,4 +41,13 @@ public class BalanceSummaryController : ControllerBase
{
return await _balanceSummaryService.BalanceRecordAnalysisByCostIdAsync();
}
/// <summary>
/// 用餐分析(餐次)
/// </summary>
[HttpGet("analysis/shift")]
public async Task<BalanceRecordAnalysisShiftResponse> BalanceRecordAnalysisByShiftAsync([FromQuery] BalanceRecordAnalysisByShiftRequest request)
{
return await _balanceSummaryService.BalanceRecordAnalysisByShiftAsync(request);
}
}

View File

@@ -0,0 +1,9 @@
using Dlhis.Entity.Canteen.Enums;
namespace Dlhis.Canteen.Order.Dto;
public class ShiftSummaryDto<T>
{
public ShiftEnumType? Shift { get; set; }
public T Value { get; set; }
}

View File

@@ -0,0 +1,29 @@
using System.ComponentModel.DataAnnotations;
using Kurisu.AspNetCore.CustomClass;
using Kurisu.AspNetCore.DataAccess.Dto;
namespace Dlhis.Canteen.Order.Request;
public class BalanceRecordAnalysisByShiftRequest : PageDto, IValidatableObject
{
/// <summary>
/// 营业点
/// </summary>
public List<Guid> BusinessPlaceCodes { get; set; }
/// <summary>
///
/// </summary>
public DateTimePeriod SearchDateTimePeriod { get; set; }
/// <inheritdoc />
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (SearchDateTimePeriod is { End: not null })
{
SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.AddDays(1).AddSeconds(-1);
}
yield break;
}
}

View File

@@ -0,0 +1,20 @@
using Dlhis.Canteen.Order.Dto;
using Kurisu.AspNetCore.DataAccess.Dto;
using Kurisu.AspNetCore.Utils.Converters;
using Newtonsoft.Json;
namespace Dlhis.Canteen.Order.Response;
public class BalanceRecordAnalysisShiftResponse
{
public decimal Amount { get; set; }
public Pagination<BalanceRecordAnalysisShiftPageResponse> Pagination { get; set; }
}
public class BalanceRecordAnalysisShiftPageResponse
{
[JsonConverter(typeof(ToDateJsonConverter))]
public DateTime Date { get; set; }
public List<ShiftSummaryDto<decimal>> Shifts { get; set; }
}

View File

@@ -9,4 +9,7 @@ public interface IBalanceSummaryService : IScopeDependency
Task<BalanceRecordAnalysisSummaryResponse> BalanceRecordAnalysisAsync(BalanceRecordAnalysisRequest request);
Task<Pagination<BalanceRecordAnalysisByCostResponse>> BalanceRecordAnalysisByCostIdAsync();
}
Task<BalanceRecordAnalysisShiftResponse> BalanceRecordAnalysisByShiftAsync(BalanceRecordAnalysisByShiftRequest request);
}

View File

@@ -1,4 +1,6 @@
using Dlhis.Canteen.Order.Request;
using System.Reflection;
using Dlhis.Canteen.Order.Dto;
using Dlhis.Canteen.Order.Request;
using Dlhis.Canteen.Order.Response;
using Dlhis.Entity.Canteen.Entities;
using Dlhis.Entity.Canteen.Enums;
@@ -6,6 +8,7 @@ using Kurisu.AspNetCore.CustomClass;
using Kurisu.AspNetCore.DataAccess.Dto;
using Kurisu.AspNetCore.DataAccess.Extensions;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
using SqlSugar;
namespace Dlhis.Canteen.Order.Services.Implements;
@@ -85,4 +88,41 @@ public class BalanceSummaryService : IBalanceSummaryService
return null;
}
public async Task<BalanceRecordAnalysisShiftResponse> BalanceRecordAnalysisByShiftAsync(BalanceRecordAnalysisByShiftRequest request)
{
var queryable = _dbContext.Queryable<BalanceRecordEntity>()
.Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out)
.WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.CostDate >= request.SearchDateTimePeriod.Start && x.CostDate <= request.SearchDateTimePeriod.End)
.WhereIF(request.BusinessPlaceCodes?.Any() == true, x => request.BusinessPlaceCodes.Contains(x.BusinessPlaceCode.Value));
var amount = await queryable.SumAsync(x => x.Amount);
var count = typeof(ShiftEnumType).GetFields(BindingFlags.Public | BindingFlags.Static).Length;
var result = await queryable.GroupBy(x => new { x.CostDate, x.ShiftType })
.Select(x => new { x.CostDate, x.ShiftType, Amount = SqlFunc.AggregateSum(SqlFunc.Abs(x.Amount)) })
.ToPageListAsync(request.PageIndex, count * request.PageSize);
return new BalanceRecordAnalysisShiftResponse
{
Amount = amount,
Pagination = new Pagination<BalanceRecordAnalysisShiftPageResponse>
{
PageIndex = request.PageIndex,
PageSize = request.PageSize,
Total = result.Count,
Data = result.GroupBy(x => x.CostDate).Select(x => new BalanceRecordAnalysisShiftPageResponse
{
Date = x.Key,
Shifts = x.Select(item => new ShiftSummaryDto<decimal>
{
Shift = item.ShiftType,
Value = item.Amount
}).ToList()
}).ToList()
}
};
}
}