feat 就餐分析,餐次使用金额和人数
This commit is contained in:
@@ -43,11 +43,22 @@ public class BalanceSummaryController : ControllerBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 用餐分析(餐次)
|
/// 餐次用餐分析,统计金额
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[HttpGet("analysis/shift")]
|
[HttpGet("shift/analysis/amount")]
|
||||||
public async Task<BalanceRecordAnalysisShiftResponse> BalanceRecordAnalysisByShiftAsync([FromQuery] BalanceRecordAnalysisByShiftRequest request)
|
public async Task<BalanceRecordAnalysisShiftAmountResponse> BalanceRecordShiftAnalysisAmountAsync([FromQuery] BalanceRecordAnalysisByShiftRequest request)
|
||||||
{
|
{
|
||||||
return await _balanceSummaryService.BalanceRecordAnalysisByShiftAsync(request);
|
return await _balanceSummaryService.BalanceRecordShiftAnalysisAmountAsync(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 餐次用餐分析,统计金额和人数
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("shift/analysis/amountAndCount")]
|
||||||
|
public async Task<BalanceRecordAnalysisShiftAmountAndCountResponse> BalanceRecordShiftAnalysisAmountAndCountAsync([FromQuery] BalanceRecordAnalysisByShiftRequest request)
|
||||||
|
{
|
||||||
|
return await _balanceSummaryService.BalanceRecordShiftAnalysisAmountAndCountAsync(request);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using Dlhis.Entity.Canteen.Enums;
|
||||||
|
|
||||||
|
namespace Dlhis.Canteen.Order.Response;
|
||||||
|
|
||||||
|
public class BalanceRecordAnalysisShiftAmountAndCountResponse
|
||||||
|
{
|
||||||
|
public decimal Amount { get; set; }
|
||||||
|
public List<BalanceRecordAnalysisShiftAmountAndCountItemResponse> Items { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BalanceRecordAnalysisShiftAmountAndCountItemResponse
|
||||||
|
{
|
||||||
|
public ShiftEnumType? ShiftType { get; set; }
|
||||||
|
public decimal Amount { get; set; }
|
||||||
|
public int Count { get; set; }
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ using Newtonsoft.Json;
|
|||||||
|
|
||||||
namespace Dlhis.Canteen.Order.Response;
|
namespace Dlhis.Canteen.Order.Response;
|
||||||
|
|
||||||
public class BalanceRecordAnalysisShiftResponse
|
public class BalanceRecordAnalysisShiftAmountResponse
|
||||||
{
|
{
|
||||||
public decimal Amount { get; set; }
|
public decimal Amount { get; set; }
|
||||||
public Pagination<BalanceRecordAnalysisShiftPageResponse> Pagination { get; set; }
|
public Pagination<BalanceRecordAnalysisShiftPageResponse> Pagination { get; set; }
|
||||||
|
|||||||
@@ -11,5 +11,7 @@ public interface IBalanceSummaryService : IScopeDependency
|
|||||||
Task<Pagination<BalanceRecordAnalysisByCostResponse>> BalanceRecordAnalysisByCostIdAsync();
|
Task<Pagination<BalanceRecordAnalysisByCostResponse>> BalanceRecordAnalysisByCostIdAsync();
|
||||||
|
|
||||||
|
|
||||||
Task<BalanceRecordAnalysisShiftResponse> BalanceRecordAnalysisByShiftAsync(BalanceRecordAnalysisByShiftRequest request);
|
Task<BalanceRecordAnalysisShiftAmountResponse> BalanceRecordShiftAnalysisAmountAsync(BalanceRecordAnalysisByShiftRequest request);
|
||||||
|
|
||||||
|
Task<BalanceRecordAnalysisShiftAmountAndCountResponse> BalanceRecordShiftAnalysisAmountAndCountAsync(BalanceRecordAnalysisByShiftRequest request);
|
||||||
}
|
}
|
||||||
@@ -109,6 +109,10 @@ public class BalanceService : IBalanceService
|
|||||||
{
|
{
|
||||||
var cache = App.GetServiceProvider().GetService<RedisCache>();
|
var cache = App.GetServiceProvider().GetService<RedisCache>();
|
||||||
var balanceRecord = await _dbContext.Queryable<BalanceRecordEntity>().Where(x => x.No == no).SingleAsync();
|
var balanceRecord = await _dbContext.Queryable<BalanceRecordEntity>().Where(x => x.No == no).SingleAsync();
|
||||||
|
balanceRecord.ThrowIfNull("数据不存在");
|
||||||
|
|
||||||
|
(balanceRecord.Status != BalanceRecordStatusEnumType.Valid).ThrowIfTrue("无法退款");
|
||||||
|
|
||||||
await using var handler = await cache.LockAsync($"balance:refund:{no}", TimeSpan.FromSeconds(9));
|
await using var handler = await cache.LockAsync($"balance:refund:{no}", TimeSpan.FromSeconds(9));
|
||||||
if (handler.Acquired)
|
if (handler.Acquired)
|
||||||
{
|
{
|
||||||
@@ -125,7 +129,7 @@ public class BalanceService : IBalanceService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var userNo = balanceRecord?.UserNo;
|
var userNo = balanceRecord.UserNo;
|
||||||
//获取人员余额
|
//获取人员余额
|
||||||
return await _dbContext.Queryable<GainfoMealEntity>()
|
return await _dbContext.Queryable<GainfoMealEntity>()
|
||||||
.LeftJoin<GainfoEntity>((x, ga) => x.UserNo == ga.No)
|
.LeftJoin<GainfoEntity>((x, ga) => x.UserNo == ga.No)
|
||||||
@@ -146,8 +150,8 @@ public class BalanceService : IBalanceService
|
|||||||
public async Task<Pagination<BalanceRecordDeviceResponse>> GetPageByDeviceUniqueNoAsync(BalanceRecordPageByDeviceUniqueNoRequest request)
|
public async Task<Pagination<BalanceRecordDeviceResponse>> GetPageByDeviceUniqueNoAsync(BalanceRecordPageByDeviceUniqueNoRequest request)
|
||||||
{
|
{
|
||||||
var device = await _dbContext.Queryable<DeviceEntity>()
|
var device = await _dbContext.Queryable<DeviceEntity>()
|
||||||
.Where(x => x.UniqueNo == request.DeviceUniqueNo || x.Code == Guid.Parse(request.DeviceUniqueNo))
|
.Where(x => x.UniqueNo == request.DeviceUniqueNo)
|
||||||
.FirstAsync();
|
.SingleAsync();
|
||||||
|
|
||||||
if (device == null)
|
if (device == null)
|
||||||
{
|
{
|
||||||
@@ -182,7 +186,8 @@ public class BalanceService : IBalanceService
|
|||||||
.LeftJoin<ImageRecordEntity>((record, ga, department, bPlace, imageRecord) => imageRecord.No == record.No)
|
.LeftJoin<ImageRecordEntity>((record, ga, department, bPlace, imageRecord) => imageRecord.No == record.No)
|
||||||
.Where(record => record.DeviceUniqueNo == device.UniqueNo)
|
.Where(record => record.DeviceUniqueNo == device.UniqueNo)
|
||||||
.Where(record => record.CostDate >= request.Start && record.CostDate <= request.End)
|
.Where(record => record.CostDate >= request.Start && record.CostDate <= request.End)
|
||||||
.Where(record => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid)
|
.Where(record => record.Type == BalanceRecordTypeEnumType.Out
|
||||||
|
&& (record.Status == BalanceRecordStatusEnumType.Valid || (record.Status == BalanceRecordStatusEnumType.Obsolute && record.Remark == "退款")))
|
||||||
.WhereIF(request.UserCode.IsPresent(), record => record.UserCode == request.UserCode)
|
.WhereIF(request.UserCode.IsPresent(), record => record.UserCode == request.UserCode)
|
||||||
.OrderBy(record => record.CostDateTime, OrderByType.Desc)
|
.OrderBy(record => record.CostDateTime, OrderByType.Desc)
|
||||||
.Select((record, ga, department, bPlace, imageRecord) => new BalanceRecordDeviceResponse
|
.Select((record, ga, department, bPlace, imageRecord) => new BalanceRecordDeviceResponse
|
||||||
|
|||||||
@@ -90,14 +90,14 @@ public class BalanceSummaryService : IBalanceSummaryService
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task<BalanceRecordAnalysisShiftResponse> BalanceRecordAnalysisByShiftAsync(BalanceRecordAnalysisByShiftRequest request)
|
public async Task<BalanceRecordAnalysisShiftAmountResponse> BalanceRecordShiftAnalysisAmountAsync(BalanceRecordAnalysisByShiftRequest request)
|
||||||
{
|
{
|
||||||
var queryable = _dbContext.Queryable<BalanceRecordEntity>()
|
var queryable = _dbContext.Queryable<BalanceRecordEntity>()
|
||||||
.Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out)
|
.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.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));
|
.WhereIF(request.BusinessPlaceCodes?.Any() == true, x => request.BusinessPlaceCodes.Contains(x.BusinessPlaceCode.Value));
|
||||||
|
|
||||||
var amount = await queryable.SumAsync(x => x.Amount);
|
var amount = await queryable.SumAsync(x => SqlFunc.Abs(x.Amount));
|
||||||
|
|
||||||
var count = typeof(ShiftEnumType).GetFields(BindingFlags.Public | BindingFlags.Static).Length;
|
var count = typeof(ShiftEnumType).GetFields(BindingFlags.Public | BindingFlags.Static).Length;
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ public class BalanceSummaryService : IBalanceSummaryService
|
|||||||
.Select(x => new { x.CostDate, x.ShiftType, Amount = SqlFunc.AggregateSum(SqlFunc.Abs(x.Amount)) })
|
.Select(x => new { x.CostDate, x.ShiftType, Amount = SqlFunc.AggregateSum(SqlFunc.Abs(x.Amount)) })
|
||||||
.ToPageListAsync(request.PageIndex, count * request.PageSize);
|
.ToPageListAsync(request.PageIndex, count * request.PageSize);
|
||||||
|
|
||||||
return new BalanceRecordAnalysisShiftResponse
|
return new BalanceRecordAnalysisShiftAmountResponse
|
||||||
{
|
{
|
||||||
Amount = amount,
|
Amount = amount,
|
||||||
Pagination = new Pagination<BalanceRecordAnalysisShiftPageResponse>
|
Pagination = new Pagination<BalanceRecordAnalysisShiftPageResponse>
|
||||||
@@ -125,4 +125,29 @@ public class BalanceSummaryService : IBalanceSummaryService
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<BalanceRecordAnalysisShiftAmountAndCountResponse> BalanceRecordShiftAnalysisAmountAndCountAsync(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 => SqlFunc.Abs(x.Amount));
|
||||||
|
|
||||||
|
var result = await queryable.GroupBy(x => new { x.ShiftType })
|
||||||
|
.Select(x => new { x.ShiftType, Amount = SqlFunc.AggregateSum(SqlFunc.Abs(x.Amount)), Count = SqlFunc.AggregateDistinctCount(x.UserCode) })
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
return new BalanceRecordAnalysisShiftAmountAndCountResponse
|
||||||
|
{
|
||||||
|
Amount = amount,
|
||||||
|
Items = result.Select(x => new BalanceRecordAnalysisShiftAmountAndCountItemResponse
|
||||||
|
{
|
||||||
|
ShiftType = x.ShiftType,
|
||||||
|
Amount = x.Amount,
|
||||||
|
Count = x.Count
|
||||||
|
}).ToList()
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user