diff --git a/Src/Dlhis.Basic/Dishes/Controller/DishesMenusController.cs b/Src/Dlhis.Basic/Dishes/Controller/DishesMenusController.cs index 2ebeea48..b7f768ff 100644 --- a/Src/Dlhis.Basic/Dishes/Controller/DishesMenusController.cs +++ b/Src/Dlhis.Basic/Dishes/Controller/DishesMenusController.cs @@ -60,7 +60,10 @@ public class DishesMenusController : ControllerBase /// /// [HttpGet("dishes-selections")] - public async Task> GetDishesUnderCurrentMenuAsync(Guid businessPlaceCode, DateTime date, ShiftEnumType? shiftType, [FromQuery] List categoryCodes) + public async Task> GetDishesUnderCurrentMenuAsync(Guid businessPlaceCode, + DateTime date, + ShiftEnumType? shiftType, + [FromQuery] List categoryCodes) { return await _dishesMenuService.GetDishesUnderCurrentMenuAsync(businessPlaceCode, date, shiftType, categoryCodes); } diff --git a/Src/Dlhis.Basic/Dishes/Response/DishesDetailResponse.cs b/Src/Dlhis.Basic/Dishes/Response/DishesDetailResponse.cs index ce412352..4d97b8d2 100644 --- a/Src/Dlhis.Basic/Dishes/Response/DishesDetailResponse.cs +++ b/Src/Dlhis.Basic/Dishes/Response/DishesDetailResponse.cs @@ -34,6 +34,11 @@ public class DishesDetailResponse /// public decimal Price { get; set; } + /// + /// 剩余数量 + /// + public int Number { get; set; } + /// /// 单位 /// diff --git a/Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs b/Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs index 1ab10afd..4625543a 100644 --- a/Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs +++ b/Src/Dlhis.Basic/Dishes/Services/Implements/DishesMenuService.cs @@ -83,10 +83,20 @@ public class DishesMenuService : IDishesMenuService .Where((x, dishes) => dishes.Enable) .WhereIF(shiftType.HasValue, x => x.ShiftType == shiftType) .WhereIF(categoryCodes.IsPresent(), (x, dishes) => categoryCodes.Contains(dishes.CategoryCode)) - .Select((x, dishes) => dishes) + .Select((x, dishes) => new DishesDetailResponse + { + BusinessPlaceCode = x.BusinessPlaceCode, + CategoryCode = dishes.CategoryCode, + CustomCode = x.CustomCode, + Description = dishes.Description, + ImageUrl = dishes.ImageUrl, + Price = dishes.Price, + Name = dishes.Name, + Number = x.Number, + }) .ToListAsync(); - return data.Adapt>(); + return data; } public async Task SaveDishesMenuAsync(DishesMenuSaveRequest request) diff --git a/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs b/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs index 67e49e62..dafd75ae 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs @@ -68,9 +68,9 @@ public class OrdersController : ControllerBase /// [HttpPost("booking")] [Transactional] - public async Task Booking(BookingMealRequest request) + public async Task Booking(BookingMealRequest request) { - await _bookingOrderService.BookingAsync(request); + return await _bookingOrderService.BookingAsync(request); } /// diff --git a/Src/Dlhis.Canteen/Order/Request/BookingMealRequest.cs b/Src/Dlhis.Canteen/Order/Request/BookingMealRequest.cs index 525e27d2..e9f434e2 100644 --- a/Src/Dlhis.Canteen/Order/Request/BookingMealRequest.cs +++ b/Src/Dlhis.Canteen/Order/Request/BookingMealRequest.cs @@ -30,6 +30,12 @@ public class BookingMealRequest : IValidatableObject [Required(ErrorMessage = "选菜不能为空")] public string DishesCode { get; set; } + /// + /// 购买数量 + /// + [Range(0, 100)] + public int Number { get; set; } + /// /// 消费来源 /// diff --git a/Src/Dlhis.Canteen/Order/Response/BookingResponse.cs b/Src/Dlhis.Canteen/Order/Response/BookingResponse.cs new file mode 100644 index 00000000..beb1dfd5 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Response/BookingResponse.cs @@ -0,0 +1,32 @@ +using Dlhis.Entity.Canteen.Enums; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Canteen.Order.Response; + +public class BookingResponse +{ + /// + /// 订单号 + /// + public string No { get; set; } + + /// + /// 订单时间 + /// + public DateTime CreateTime { get; set; } + + /// + /// 消费金额 + /// + public decimal Amount { get; set; } + + /// + /// 支付方式 + /// + public BalanceRecordSourceEnumType Source { get; set; } + + /// + /// 支付方式 + /// + public string SourceDesc => Source.GetDescription(); +} diff --git a/Src/Dlhis.Canteen/Order/Services/IBookingOrderService.cs b/Src/Dlhis.Canteen/Order/Services/IBookingOrderService.cs index bbe5116c..efca34b5 100644 --- a/Src/Dlhis.Canteen/Order/Services/IBookingOrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IBookingOrderService.cs @@ -12,7 +12,7 @@ public interface IBookingOrderService /// /// /// - Task BookingAsync(BookingMealRequest request); + Task BookingAsync(BookingMealRequest request); Task> GetBookingPageAsync(OrderBookingPageRequest request); diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs index 1561ecf0..2c346e53 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs @@ -28,7 +28,7 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService _disheMenuApi = disheMenuApi; } - public async Task BookingAsync(BookingMealRequest request) + public async Task BookingAsync(BookingMealRequest request) { var gainfo = await CheckExistsMyBookingsAsync(request.BookingDate, request.ShiftType); @@ -56,7 +56,7 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService Source = request.Source, UserNo = gainfo.No, UserCode = gainfo.Code, - Amount = -Math.Abs(menuDetail.Price), + Amount = -Math.Abs(menuDetail.Price * request.Number), BusinessPlaceCode = request.BusinessPlaceCode, BusinessShiftCode = null, ShiftType = request.ShiftType, @@ -88,50 +88,56 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService await _disheMenuApi.GetBookingDishesDetailAsync(request.BookingDate, request.BusinessPlaceCode, (int)request.ShiftType, request.DishesCode); var menuDetail = menuDetailResult.Data; menuDetail.ThrowIfNull("预定失败,菜品已经下架"); - menuDetail.Number -= 1; + menuDetail.Number -= request.Number; (menuDetail.Number < 0).ThrowIfTrue($"{menuDetail.DishesName}已售罄"); - var mealInfo = await _dbContext.Queryable().Where(x => x.UserNo == order.UserNo).FirstAsync(); - if (mealInfo == null) + //餐补 + if (request.Source == BalanceRecordSourceEnumType.LocalTenantSubsidies) { - await _dbContext.InsertAsync(new GainfoMealEntity + + var mealInfo = await _dbContext.Queryable().Where(x => x.UserNo == order.UserNo).FirstAsync(); + if (mealInfo == null) { - Balance = 0, - BalanceOfRecharge = 0, - BalanceOfSubsidies = 0, - UserCode = gainfo.Code, - UserNo = gainfo.No, - Version = 0, - }); + await _dbContext.InsertAsync(new GainfoMealEntity + { + Balance = 0, + BalanceOfRecharge = 0, + BalanceOfSubsidies = 0, + UserCode = gainfo.Code, + UserNo = gainfo.No, + Version = 0, + }); - (mealInfo == null).ThrowIfTrue("余额不足,无法消费"); + (mealInfo == null).ThrowIfTrue("余额不足,无法消费"); + } + //金额+- + mealInfo.Balance += order.Amount; + (mealInfo.Balance < 0).ThrowIfTrue("余额不足,无法消费"); + + var effectMeal = await _dbContext.Updateable() + .SetColumns(x => x.Balance == mealInfo.Balance) + .SetColumns(x => x.Version == x.Version + 1) + .Where(x => x.UserNo == order.UserNo && x.Version == mealInfo.Version)//必须与查询时的version一致 + .ExecuteCommandAsync(); + + if (effectMeal <= 0) throw new VersionExceptions("更新版本冲突"); } - //金额+- - mealInfo.Balance += order.Amount; - (mealInfo.Balance < 0).ThrowIfTrue("余额不足,无法消费"); - var effect = await _dbContext.Updateable() - .SetColumns(x => x.Balance == mealInfo.Balance) - .SetColumns(x => x.Version == x.Version + 1) - .Where(x => x.UserNo == order.UserNo && x.Version == mealInfo.Version)//必须与查询时的version一致 - .ExecuteCommandAsync(); - if (effect <= 0) throw new VersionExceptions("更新版本冲突"); + var effectMenu = await _dbContext.Updateable() + .SetColumns(x => x.Number == menuDetail.Number) + .SetColumns(x => x.Version == x.Version + 1) + .SetColumns(x => x.ModifiedTime == now) + .Where(x => x.Date == menuDetail.Date + && x.ShiftType == request.ShiftType + && x.BusinessPlaceCode == request.BusinessPlaceCode + && x.DishesCode == request.DishesCode + && x.Version == menuDetail.Version + ) + .ExecuteCommandAsync(); - effect = await _dbContext.Updateable() - .SetColumns(x => x.Number == menuDetail.Number) - .SetColumns(x => x.Version == x.Version + 1) - .SetColumns(x => x.ModifiedTime == now) - .Where(x => x.Date == menuDetail.Date - && x.ShiftType == request.ShiftType - && x.BusinessPlaceCode == request.BusinessPlaceCode - && x.DishesCode == request.DishesCode - && x.Version == menuDetail.Version - ) - .ExecuteCommandAsync(); - - if (effect <= 0) throw new VersionExceptions("更新版本冲突"); + if (effectMenu <= 0) throw new VersionExceptions("更新版本冲突"); //写入记录 var balanceRecord = order.Adapt(); @@ -147,6 +153,15 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService }); }, 10); + + + return new BookingResponse + { + No = order.No, + CreateTime = order.CreateTime, + Source = order.Source, + Amount = Math.Abs(order.Amount) + }; }