diff --git a/Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs b/Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs index 4326f250..154eafb0 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs @@ -43,11 +43,22 @@ public class BalanceSummaryController : ControllerBase } /// - /// 用餐分析(餐次) + /// 餐次用餐分析,统计金额 /// - [HttpGet("analysis/shift")] - public async Task BalanceRecordAnalysisByShiftAsync([FromQuery] BalanceRecordAnalysisByShiftRequest request) + [HttpGet("shift/analysis/amount")] + public async Task BalanceRecordShiftAnalysisAmountAsync([FromQuery] BalanceRecordAnalysisByShiftRequest request) { - return await _balanceSummaryService.BalanceRecordAnalysisByShiftAsync(request); + return await _balanceSummaryService.BalanceRecordShiftAnalysisAmountAsync(request); + } + + /// + /// 餐次用餐分析,统计金额和人数 + /// + /// + /// + [HttpGet("shift/analysis/amountAndCount")] + public async Task BalanceRecordShiftAnalysisAmountAndCountAsync([FromQuery] BalanceRecordAnalysisByShiftRequest request) + { + return await _balanceSummaryService.BalanceRecordShiftAnalysisAmountAndCountAsync(request); } } \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisShiftAmountAndCountResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisShiftAmountAndCountResponse.cs new file mode 100644 index 00000000..e20d86d3 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisShiftAmountAndCountResponse.cs @@ -0,0 +1,16 @@ +using Dlhis.Entity.Canteen.Enums; + +namespace Dlhis.Canteen.Order.Response; + +public class BalanceRecordAnalysisShiftAmountAndCountResponse +{ + public decimal Amount { get; set; } + public List Items { get; set; } +} + +public class BalanceRecordAnalysisShiftAmountAndCountItemResponse +{ + public ShiftEnumType? ShiftType { get; set; } + public decimal Amount { get; set; } + public int Count { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisShiftResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisShiftResponse.cs index 5598845f..75b66dbe 100644 --- a/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisShiftResponse.cs +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisShiftResponse.cs @@ -5,7 +5,7 @@ using Newtonsoft.Json; namespace Dlhis.Canteen.Order.Response; -public class BalanceRecordAnalysisShiftResponse +public class BalanceRecordAnalysisShiftAmountResponse { public decimal Amount { get; set; } public Pagination Pagination { get; set; } diff --git a/Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs b/Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs index 79707980..b6a192d9 100644 --- a/Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs @@ -11,5 +11,7 @@ public interface IBalanceSummaryService : IScopeDependency Task> BalanceRecordAnalysisByCostIdAsync(); - Task BalanceRecordAnalysisByShiftAsync(BalanceRecordAnalysisByShiftRequest request); + Task BalanceRecordShiftAnalysisAmountAsync(BalanceRecordAnalysisByShiftRequest request); + + Task BalanceRecordShiftAnalysisAmountAndCountAsync(BalanceRecordAnalysisByShiftRequest request); } \ No newline at end of file diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs index bb3483a3..cd1cc6a6 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs @@ -109,6 +109,10 @@ public class BalanceService : IBalanceService { var cache = App.GetServiceProvider().GetService(); var balanceRecord = await _dbContext.Queryable().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)); if (handler.Acquired) { @@ -125,7 +129,7 @@ public class BalanceService : IBalanceService } } - var userNo = balanceRecord?.UserNo; + var userNo = balanceRecord.UserNo; //获取人员余额 return await _dbContext.Queryable() .LeftJoin((x, ga) => x.UserNo == ga.No) @@ -146,8 +150,8 @@ public class BalanceService : IBalanceService public async Task> GetPageByDeviceUniqueNoAsync(BalanceRecordPageByDeviceUniqueNoRequest request) { var device = await _dbContext.Queryable() - .Where(x => x.UniqueNo == request.DeviceUniqueNo || x.Code == Guid.Parse(request.DeviceUniqueNo)) - .FirstAsync(); + .Where(x => x.UniqueNo == request.DeviceUniqueNo) + .SingleAsync(); if (device == null) { @@ -182,7 +186,8 @@ public class BalanceService : IBalanceService .LeftJoin((record, ga, department, bPlace, imageRecord) => imageRecord.No == record.No) .Where(record => record.DeviceUniqueNo == device.UniqueNo) .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) .OrderBy(record => record.CostDateTime, OrderByType.Desc) .Select((record, ga, department, bPlace, imageRecord) => new BalanceRecordDeviceResponse diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs index cb79225a..5a76b686 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs @@ -90,14 +90,14 @@ public class BalanceSummaryService : IBalanceSummaryService } - public async Task BalanceRecordAnalysisByShiftAsync(BalanceRecordAnalysisByShiftRequest request) + public async Task BalanceRecordShiftAnalysisAmountAsync(BalanceRecordAnalysisByShiftRequest request) { var queryable = _dbContext.Queryable() .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 amount = await queryable.SumAsync(x => SqlFunc.Abs(x.Amount)); 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)) }) .ToPageListAsync(request.PageIndex, count * request.PageSize); - return new BalanceRecordAnalysisShiftResponse + return new BalanceRecordAnalysisShiftAmountResponse { Amount = amount, Pagination = new Pagination @@ -125,4 +125,29 @@ public class BalanceSummaryService : IBalanceSummaryService } }; } + + public async Task BalanceRecordShiftAnalysisAmountAndCountAsync(BalanceRecordAnalysisByShiftRequest request) + { + var queryable = _dbContext.Queryable() + .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() + }; + } } \ No newline at end of file