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