From a528d9201289a843c90014039b28bfb2731dd38a Mon Sep 17 00:00:00 2001 From: liguoyang Date: Tue, 9 Apr 2024 15:58:12 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E9=A4=90=E9=A5=AE=E6=B6=88=E8=B4=B9?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=92=8C=E8=AE=BE=E5=A4=87=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Order/Controllers/BalancesController.cs | 4 +- .../Response/BalanceRecordDeviceResponse.cs | 107 +++++++++++++ .../Order/Response/BalanceRecordResponse.cs | 5 - .../Order/Services/IBalanceService.cs | 2 +- .../Services/Implements/BalanceService.cs | 151 ++++++++---------- .../Order/Services/Implements/OrderService.cs | 92 +++++------ 6 files changed, 220 insertions(+), 141 deletions(-) create mode 100644 Src/Dlhis.Canteen/Order/Response/BalanceRecordDeviceResponse.cs diff --git a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs index 8e13109e..feca8352 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs @@ -56,7 +56,7 @@ public class BalancesController : ControllerBase /// [HttpGet("device/page")] [IgnoreTenant] - public async Task> GetPageByDeviceUniqueNoGetAsync([FromQuery] BalanceRecordPageByDeviceUniqueNoRequest request) + public async Task> GetPageByDeviceUniqueNoGetAsync([FromQuery] BalanceRecordPageByDeviceUniqueNoRequest request) { return await _balanceService.GetPageByDeviceUniqueNoAsync(request); } @@ -68,7 +68,7 @@ public class BalancesController : ControllerBase /// [HttpPost("device/page")] [IgnoreTenant] - public async Task> GetPageByDeviceUniqueNoPostAsync(BalanceRecordPageByDeviceUniqueNoRequest request) + public async Task> GetPageByDeviceUniqueNoPostAsync(BalanceRecordPageByDeviceUniqueNoRequest request) { return await _balanceService.GetPageByDeviceUniqueNoAsync(request); } diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordDeviceResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordDeviceResponse.cs new file mode 100644 index 00000000..d7035b3b --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordDeviceResponse.cs @@ -0,0 +1,107 @@ +using Dlhis.Entity.Canteen.Enums; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Canteen.Order.Response; + +public class BalanceRecordDeviceResponse +{ + public long Id { get; set; } + + /// + /// 流水号 + /// + public string No { get; set; } + + /// + /// 档案号/QRCode + /// + public string UserNo { get; set; } + + /// + /// 姓名 + /// + public string Name { get; set; } + + /// + /// 学工号 + /// + public string UserCode { get; set; } + + /// + /// 部门号 + /// + public string DepartmentNo { get; set; } + + /// + /// 部门 + /// + public string DepartmentName { get; set; } + + /// + /// 所属成本日期 + /// + public DateTime CostDate { get; set; } + + /// + /// 来源 + /// + public BalanceRecordSourceEnumType Source { get; set; } + public string SourceDesc => Source.GetDescription(); + + /// + /// 收入/支出 + /// + public BalanceRecordTypeEnumType Type { get; set; } + public string TypeDesc => Type.GetDescription(); + + /// + /// 金额 + /// + public decimal Amount { get; set; } + + /// + /// 营业点 + /// + public string BusinessPlaceName { get; set; } + + /// + /// 餐次 + /// + public ShiftEnumType? ShiftType { get; set; } + + /// + /// 数据状态 + /// + public BalanceRecordStatusEnumType Status { get; set; } + + /// + /// 数据状态描述 + /// + public string StatusDesc => Status.GetDescription(); + + /// + /// 记录产生时间 + /// + public DateTime CostDateTime { get; set; } + + /// + /// 汇总金额 + /// + public decimal Sum { get; set; } + + /// + /// 厂区id + /// + public string TenantId { get; set; } + + /// + /// 厂区名称 + /// + public string TenantName { get; set; } +} + + +public class BalanceRecordDeviceItemResponse +{ + +} diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs index e1229b24..06604e64 100644 --- a/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordResponse.cs @@ -117,11 +117,6 @@ public class BalanceRecordResponse /// public DateTime CostDateTime { get; set; } - /// - /// 汇总金额 - /// - public decimal Sum { get; set; } - /// /// 厂区id /// diff --git a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs index ea6a26cc..1556f3ea 100644 --- a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs @@ -9,7 +9,7 @@ public interface IBalanceService : IScopeDependency { Task> GetPageAsync(BalanceRecordPageRequest request); - Task> GetPageByDeviceUniqueNoAsync(BalanceRecordPageByDeviceUniqueNoRequest request); + Task> GetPageByDeviceUniqueNoAsync(BalanceRecordPageByDeviceUniqueNoRequest request); Task GetPageByUserAsync(BalanceRecordUserPageRequest request); diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs index 6134e9bd..7f14ac0a 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs @@ -51,13 +51,13 @@ public class BalanceService : IBalanceService .WhereIF(request.Type.HasValue, record => record.Type == request.Type) .WhereIF(request.Search.IsPresent(), (record, ga) => ga.Name.Contains(request.Search) - || ga.Code.Contains(request.Search) + || ga.Code == request.Search ) .OrderBy(record => record.CreateTime, OrderByType.Desc) .Select((record, ga, department, bplace, bshift) => new BalanceRecordResponse { Id = record.Id, - Amount = record.Amount, + Amount = SqlFunc.Abs(record.Amount), BusinessPlaceCode = record.BusinessPlaceCode, BusinessShiftCode = record.BusinessShiftCode, CostDate = record.CostDate, @@ -83,11 +83,6 @@ public class BalanceService : IBalanceService }) .ToPageListAsync(request); - page.Data.ForEach(item => - { - item.Amount = Math.Abs(item.Amount); - }); - try { var tenantResult = await _tenantApi.GetTenantsInternalAsync(); @@ -105,6 +100,70 @@ public class BalanceService : IBalanceService return page; } + + + public async Task> GetPageByDeviceUniqueNoAsync(BalanceRecordPageByDeviceUniqueNoRequest request) + { + var now = request.SearchDate ?? DateTime.Now; + var start = request.SearchDate.HasValue ? request.SearchDate.Value.Date : DateTime.Today; + var end = start.AddDays(1).AddSeconds(-1); + + var device = await _dbContext.Queryable() + .Where(x => x.UniqueNo == request.DeviceUniqueNo || x.Code == Guid.Parse(request.DeviceUniqueNo)) + .FirstAsync(); + + if (device == null) + { + return new Pagination() + { + Data = new List() + }; + } + + var page = await _dbContext.Queryable() + .LeftJoin((record, ga) => record.UserNo == ga.No) + .LeftJoin((record, ga, department) => ga.DepartmentNo == department.No) + .LeftJoin((record, ga, department, bplace) => record.BusinessPlaceCode == bplace.Code) + .Where(record => record.CostDate >= start && record.CostDate <= end) + .Where(record => record.DeviceUniqueNo == device.UniqueNo || record.DeviceUniqueNo == device.Code.ToString()) + .Where(record => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid) + .OrderBy(record => record.CreateTime, OrderByType.Desc) + .Select((record, ga, department, bplace) => new BalanceRecordDeviceResponse + { + Id = record.Id, + Amount = SqlFunc.Abs(record.Amount), + CostDate = record.CostDate, + DepartmentNo = record.DepartmentNo, + UserNo = record.UserNo, + UserCode = record.UserCode, + Type = record.Type, + Status = record.Status, + Source = record.Source, + No = record.No, + Name = record.Name, + DepartmentName = department.Name, + BusinessPlaceName = bplace.Name, + ShiftType = record.ShiftType, + CostDateTime = record.CostDateTime, + TenantId = record.TenantId, + }) + .ToPageListAsync(request); + + //消费总金额 + var sum = await _dbContext.Queryable() + .Where(record => record.CostDate >= start) + .Where(record => record.CostDate <= end) + .Where(record => record.DeviceUniqueNo == device.UniqueNo || record.DeviceUniqueNo == device.Code.ToString()) + .Where(record => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid) + .SumAsync(record => SqlFunc.Abs(SqlFunc.IsNull(record.Amount, 0))); + + page.Data.ForEach(x => x.Sum = sum); + + return page; + } + + + /// /// 根据成本中心 /// @@ -438,84 +497,6 @@ public class BalanceService : IBalanceService return pagination; } - - - public async Task> GetPageByDeviceUniqueNoAsync(BalanceRecordPageByDeviceUniqueNoRequest request) - { - var now = DateTime.Now; - var start = DateTime.Today; - var end = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59); - - if (request.SearchDate.HasValue) - { - now = request.SearchDate.Value; - start = new DateTime(now.Year, now.Month, now.Day); - end = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59); - } - - var device = await _dbContext.Queryable() - .Where(x => x.UniqueNo == request.DeviceUniqueNo || x.Code == Guid.Parse(request.DeviceUniqueNo)) - .FirstAsync(); - - if (device == null) - { - return new Pagination() - { - Data = new List() - }; - } - - var page = await _dbContext.Queryable() - .LeftJoin((record, ga) => record.UserNo == ga.No) - .LeftJoin((record, ga, department) => ga.DepartmentNo == department.No) - .LeftJoin((record, ga, department, bplace) => record.BusinessPlaceCode == bplace.Code) - .LeftJoin((record, ga, department, bplace, bshift) => record.BusinessShiftCode == bshift.Code) - .LeftJoin((record, ga, department, bplace, bshift, type) => record.BusinessShiftCode.ToString() == type.Code) - .WhereIF(request.SearchDate.HasValue, record => record.CostDate >= start) - .WhereIF(request.SearchDate.HasValue, record => record.CostDate <= end) - .Where(record => record.TenantId == device.TenantId && (record.DeviceUniqueNo == device.Code.ToString() || record.DeviceUniqueNo == device.UniqueNo)) - .Where(record => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid) - .OrderBy(record => record.CreateTime, OrderByType.Desc) - .Select((record, ga, department, bplace, bshift, type) => new BalanceRecordResponse - { - Id = record.Id, - Amount = record.Amount, - BusinessPlaceCode = record.BusinessPlaceCode, - BusinessShiftCode = record.BusinessShiftCode, - CostDate = record.CostDate, - CostId = record.CostId, - DepartmentNo = record.DepartmentNo, - DeviceInfo = record.DeviceUniqueNo, - IP = record.IP, - UserNo = record.UserNo, - UserCode = record.UserCode, - Type = record.Type, - SubsidiesFromMonth = record.SubsidiesFromMonth, - Status = record.Status, - Source = record.Source, - No = record.No, - IsCostCrossTenant = record.IsCostCrossTenant, - OriginTenantId = record.OriginTenantId, - Name = record.Name, - DepartmentName = department.Name, - BusinessPlaceName = bplace.Name, - BusinessShiftName = type.Display, - CostDateTime = record.CostDateTime - }).ToPageListAsync(request); - - //消费总金额 - var sum = await _dbContext.Queryable() - .WhereIF(request.SearchDate.HasValue, record => record.CostDate >= start) - .WhereIF(request.SearchDate.HasValue, record => record.CostDate <= end) - .Where(record => record.TenantId == device.TenantId || record.DeviceUniqueNo == device.Code.ToString() || record.DeviceUniqueNo == device.UniqueNo) - .Where(record => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid) - .SumAsync(record => SqlFunc.Abs(SqlFunc.IsNull(record.Amount, 0))); - - page.Data.ForEach(x => x.Sum = sum); - - return page; - } - public async Task GetPageByUserAsync(BalanceRecordUserPageRequest request) { var jinkoCode = _currentUser.GetUserClaim("jinko-code") ?? string.Empty; diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs index 9fe7e185..b8240330 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs @@ -516,66 +516,62 @@ public class OrderService : BaseOrderService, IOrderService } var beginOfDay = DateTime.Today; - var endOfDay = beginOfDay.AddHours(23).AddMinutes(59).AddSeconds(59); + var endOfDay = beginOfDay.AddDays(1).AddSeconds(-1); - var balanceRecords = await DbContext.Queryable() + //今天所有消费记录 + var todayAllBalanceRecords = await DbContext.Queryable() .Where(x => x.UserNo == order.UserNo) .Where(x => x.Type == BalanceRecordTypeEnumType.Out) - .Where(x => x.CreateTime >= beginOfDay && x.CreateTime <= endOfDay) //今天消费记录 + .Where(x => x.Status == BalanceRecordStatusEnumType.Valid) + .Where(x => x.CreateTime >= beginOfDay && x.CreateTime <= endOfDay) .ToListAsync(); - var dayMarketCostMax = await GetSettingAsync(CanteenSettingItemEnumType.DayMarketCostMax); - if (dayMarketCostMax != default) - { - if (order.BusinessPlaceCode.HasValue && await DbContext.Queryable() - .Where(x => x.Catalog == CanteenBusinessPlaceCatalogEnumType.Supermarket) - .Where(x => x.Code == order.BusinessPlaceCode.Value) - .AnyAsync()) - { - var businessPlaceCodes = await DbContext.Queryable() - .Where(x => x.Catalog == CanteenBusinessPlaceCatalogEnumType.Supermarket) - .Select(x => x.Code).ToListAsync(); - - var cost = balanceRecords.Where(x => x.BusinessPlaceCode.HasValue) - .Where(x => businessPlaceCodes.Contains(x.BusinessPlaceCode.Value)) - .Sum(x => x.Amount); - - if (cost + Math.Abs(order.Amount) > dayMarketCostMax) - { - throw new UserFriendlyException($"超出当天超市消费限制({dayMarketCostMax}),无法消费"); - } - } - } - - var allowRepeatInOneShift = await GetSettingAsync(CanteenSettingItemEnumType.AllowRepeatInOneShift, true); - if (!allowRepeatInOneShift) - { - //todo 餐次问题 - var costCount = balanceRecords.Where(x => x.BusinessShiftCode == order.BusinessShiftCode).Count(); - if (costCount > 1) - { - throw new UserFriendlyException($"当前餐次不允许多次消费"); - } - } - - var onceCostMax = await GetSettingAsync(CanteenSettingItemEnumType.OnceCostMax); - if (onceCostMax != default) - { - if (Math.Abs(order.Amount) > onceCostMax) - { - throw new UserFriendlyException($"一次消费金额不能超出{onceCostMax}"); - } - } + //超市营业点 + var supermarketCodes = await DbContext.Queryable() + .Where(x => x.Catalog == CanteenBusinessPlaceCatalogEnumType.Supermarket) + .Select(x => x.Code) + .ToListAsync(); + //一天消费金额 var dayCostMax = await GetSettingAsync(CanteenSettingItemEnumType.DayCostMax); if (dayCostMax != default) { - var cost = balanceRecords.Where(x => x.Type == BalanceRecordTypeEnumType.Out).Sum(x => Math.Abs(x.Amount)); - if (cost + Math.Abs(order.Amount) > dayCostMax) + //must has business place code, use .Value is safe + var cost = todayAllBalanceRecords + .Where(x => !supermarketCodes.Contains(x.BusinessPlaceCode.Value)) //filter supermarket + .Sum(x => Math.Abs(x.Amount)); + (cost + Math.Abs(order.Amount) > dayCostMax).ThrowIfTrue($"超出当天消费限制{dayCostMax}元,无法消费"); + } + + //一次消费金额 + var onceCostMax = await GetSettingAsync(CanteenSettingItemEnumType.OnceCostMax); + if (onceCostMax != default) + { + (Math.Abs(order.Amount) > onceCostMax).ThrowIfTrue($"一次消费金额不能超出{onceCostMax}"); + } + + //超时消费限额 + var dayMarketCostMax = await GetSettingAsync(CanteenSettingItemEnumType.DayMarketCostMax); + if (dayMarketCostMax != default) + { + //current businessplace is supermarket + if (order.BusinessPlaceCode.HasValue && supermarketCodes.Contains(order.BusinessPlaceCode.Value)) { - throw new UserFriendlyException($"超出当天消费限制({dayCostMax}),无法消费"); + var cost = todayAllBalanceRecords.Where(x => x.BusinessPlaceCode.HasValue) + .Where(x => supermarketCodes.Contains(x.BusinessPlaceCode.Value)) + .Sum(x => Math.Abs(x.Amount)); + + (cost + Math.Abs(order.Amount) > dayMarketCostMax).ThrowIfTrue($"超出当天超市消费限制{dayMarketCostMax},无法消费"); } } + + //重复餐次消费 + var allowRepeatInOneShift = await GetSettingAsync(CanteenSettingItemEnumType.AllowRepeatInOneShift, true); + if (!allowRepeatInOneShift) + { + var costCount = todayAllBalanceRecords.Where(x => x.ShiftType == order.ShiftType).Count(); + (costCount > 1).ThrowIfTrue($"{order?.ShiftType?.GetDescription()}不允许多次消费"); + } }