From e256d18d36d9e8bc290e780a83482970fe39d011 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Thu, 21 Mar 2024 18:14:33 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E8=AE=A2=E5=8D=95=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3,=E5=88=86=E9=A1=B5=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Order/Controllers/OrdersController.cs | 28 +++++ .../Order/Request/BookingMealRequest.cs | 5 + .../Order/Request/OrderCancelRequest.cs | 18 +++ .../Response/OrderAggregationResponse.cs | 2 + .../Order/Response/OrderBookingResponse.cs | 25 +++- .../Order/Services/IBookingOrderService.cs | 4 +- .../Implements/BookingOrderService.cs | 116 +++++++++++++++++- .../Order/Services/Implements/OrderService.cs | 3 +- .../Entities/CanteenOrderDetailEntity.cs | 6 + 9 files changed, 196 insertions(+), 11 deletions(-) create mode 100644 Src/Dlhis.Canteen/Order/Request/OrderCancelRequest.cs diff --git a/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs b/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs index 17062f8a..35ef5f69 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/OrdersController.cs @@ -61,6 +61,34 @@ public class OrdersController : ControllerBase return await _orderService.GetOrdersAggregationAsync(page); } + /// + /// 取消订单 + /// + /// + /// + [HttpPut("user-cancel")] + [Transactional] + [IgnoreTenant] + public async Task CancelOrderAsync(OrderCancelRequest request) + { + await _bookingOrderService.UserCancelOrderAsync(request); + } + + + + /// + /// 取消订单 + /// + /// + /// + [HttpPut("manager-cancel")] + [Transactional] + [IgnoreTenant] + public async Task ManagerCancelOrderAsync(OrderCancelRequest request) + { + await _bookingOrderService.ManagerCancelOrderAsync(request); + } + //************************************************************** 订餐功能 ********************************************************************************** /// diff --git a/Src/Dlhis.Canteen/Order/Request/BookingMealRequest.cs b/Src/Dlhis.Canteen/Order/Request/BookingMealRequest.cs index e9f434e2..388dc9f0 100644 --- a/Src/Dlhis.Canteen/Order/Request/BookingMealRequest.cs +++ b/Src/Dlhis.Canteen/Order/Request/BookingMealRequest.cs @@ -36,6 +36,11 @@ public class BookingMealRequest : IValidatableObject [Range(0, 100)] public int Number { get; set; } + /// + /// 单位 + /// + public string Unit { get; set; } + /// /// 消费来源 /// diff --git a/Src/Dlhis.Canteen/Order/Request/OrderCancelRequest.cs b/Src/Dlhis.Canteen/Order/Request/OrderCancelRequest.cs new file mode 100644 index 00000000..35c8c079 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Request/OrderCancelRequest.cs @@ -0,0 +1,18 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Canteen.Order.Request; + +public class OrderCancelRequest +{ + /// + /// + /// + [Required(ErrorMessage = "订单号")] + public string No { get; set; } + + /// + /// 取消原因 + /// + [Required] + public string Reason { get; set; } +} diff --git a/Src/Dlhis.Canteen/Order/Response/OrderAggregationResponse.cs b/Src/Dlhis.Canteen/Order/Response/OrderAggregationResponse.cs index 1fb6cc24..05adb68d 100644 --- a/Src/Dlhis.Canteen/Order/Response/OrderAggregationResponse.cs +++ b/Src/Dlhis.Canteen/Order/Response/OrderAggregationResponse.cs @@ -53,4 +53,6 @@ public class OrderAggregationResponse /// 订单时间 /// public DateTime CreateTime { get; set; } + + public string Remark { get; set; } } diff --git a/Src/Dlhis.Canteen/Order/Response/OrderBookingResponse.cs b/Src/Dlhis.Canteen/Order/Response/OrderBookingResponse.cs index b167b69f..06385b0d 100644 --- a/Src/Dlhis.Canteen/Order/Response/OrderBookingResponse.cs +++ b/Src/Dlhis.Canteen/Order/Response/OrderBookingResponse.cs @@ -1,4 +1,7 @@ -namespace Dlhis.Canteen.Order.Response; +using Dlhis.Entity.Canteen.Enums; +using Kurisu.AspNetCore.Utils.Extensions; + +namespace Dlhis.Canteen.Order.Response; public class OrderBookingResponse { @@ -28,12 +31,28 @@ public class OrderBookingResponse public string UserCode { get; set; } /// - /// + /// 用户 /// - public string UserNo { get; set; } + public string UserName { get; set; } + + /// + /// 餐次 + /// + public ShiftEnumType? ShiftType { get; set; } + + /// + /// 餐次 + /// + public string ShiftTypeDesc => ShiftType.GetDescription(); + /// /// 订单时间 /// public DateTime CreateTime { get; set; } + + + public CanteenOrderStatusEnumType Status { get; set; } + + public string StatusDesc => Status.GetDescription(); } diff --git a/Src/Dlhis.Canteen/Order/Services/IBookingOrderService.cs b/Src/Dlhis.Canteen/Order/Services/IBookingOrderService.cs index 53264f80..3266c9ee 100644 --- a/Src/Dlhis.Canteen/Order/Services/IBookingOrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IBookingOrderService.cs @@ -17,5 +17,7 @@ public interface IBookingOrderService : IScopeDependency Task> GetBookingPageAsync(OrderBookingPageRequest request); - Task CancelOrderAsync(); + Task UserCancelOrderAsync(OrderCancelRequest request); + + Task ManagerCancelOrderAsync(OrderCancelRequest request); } diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs index 0ba8f59f..92e36ffd 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BookingOrderService.cs @@ -14,19 +14,23 @@ using Dlhis.Basic.Api; using Kurisu.SqlSugar.Extensions; using SqlSugar; using Mapster; +using MySqlX.XDevAPI.Relational; namespace Dlhis.Canteen.Order.Services.Implements; public class BookingOrderService : BaseOrderService, IBookingOrderService { private readonly IDisheMenuApi _disheMenuApi; + private readonly IBusinessPlacePermissionsApi _businessPlacePermissionsApi; public BookingOrderService(ICanteenSettingService canteenSettingService, IDbContext dbContext, IDisheMenuApi disheMenuApi, + IBusinessPlacePermissionsApi businessPlacePermissionsApi, ICurrentUser currentUser, IDevicePermissionApi devicePermissionApi, ILogger logger) : base(canteenSettingService, dbContext, currentUser, devicePermissionApi, logger) { _disheMenuApi = disheMenuApi; + _businessPlacePermissionsApi = businessPlacePermissionsApi; } public async Task BookingAsync(BookingMealRequest request) @@ -147,9 +151,10 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService await DbContext.InsertAsync(new CanteenOrderDetailEntity { OrderNo = order.No, + BookingDate = request.BookingDate, DishesCode = request.DishesCode, Price = menuDetail.Price, - //Unit + Unit = request.Unit, Number = 1, TenantId = order.TenantId, }); @@ -169,29 +174,127 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService public async Task> GetBookingPageAsync(OrderBookingPageRequest request) { + var myCodes = (await _businessPlacePermissionsApi.GetMyAsync()).Data.Select(x => (Guid?)x.Code).ToList(); + var page = await DbContext.Queryable() - .LeftJoin((x, ga) => x.UserNo == ga.No) - .Select(x => new OrderBookingResponse + .LeftJoin((x, ga) => x.UserNo == ga.No) + .Where(x => myCodes.Contains(x.BusinessPlaceCode)) + .Select((x, ga) => new OrderBookingResponse { No = x.No, DeliveryAddress = x.DeliveryAddress, Remark = x.Remark, - Amount = x.Amount + Amount = x.Amount, + CreateTime = x.CreateTime, + ShiftType = x.ShiftType, + Status = x.OrderStatus, + UserCode = x.UserCode, + UserName = ga.Name }) .ToPageListAsync(request); return page; } - public async Task CancelOrderAsync() + public async Task UserCancelOrderAsync(OrderCancelRequest request) { - throw new NotImplementedException(); + //预定时间 + var now = DateTime.Now; + var userId = CurrentUser.GetIntSubjectId(); + + var bookingDeadline = await GetSettingAsync(CanteenSettingItemEnumType.BookingDeadline) ?? new TimeOnly(20, 30, 00); + var dealLine = DateTime.Today.Add(bookingDeadline.ToTimeSpan()); + (now >= dealLine).ThrowIfTrue("不在订单取消允许范围内,不可操作"); + + var order = await DbContext.Queryable().Where(x => x.No == request.No).FirstAsync(); + order.ThrowIfNull("订单不存在"); + + await DbContext.Updateable() + .SetColumns(x => x.OrderStatus == CanteenOrderStatusEnumType.Cancel) + .SetColumns(x => x.Remark == request.Reason) + .SetColumns(x => x.ModifiedTime == now) + .SetColumns(x => x.ModifiedBy == userId) + .Where(x => x.No == request.No) + .ExecuteCommandAsync(); + + var balance = await DbContext.Queryable().Where(x => x.No == request.No).SingleAsync(); + await DbContext.Updateable() + .SetColumns(x => x.Status == BalanceRecordStatusEnumType.Obsolute) + .SetColumns(x => x.Remark == request.Reason) + .SetColumns(x => x.ModifiedTime == now) + .SetColumns(x => x.ModifiedBy == userId) + .Where(x => x.No == request.No) + .ExecuteCommandAsync(); + + var amount = Math.Abs(order.Amount); + + //尝试5次 + await ContinueUpdateAsync(async () => + { + var mealInfo = await DbContext.Queryable().Where(x => x.UserNo == order.UserNo).FirstAsync(); + + var effect = await DbContext.Updateable() + .SetColumns(x => x.Balance == x.Balance + amount) + .SetColumns(x => x.ModifiedTime == now) + .SetColumns(x => x.ModifiedBy == userId) + .Where(x => x.Id == mealInfo.Id && x.Version == mealInfo.Version) + .ExecuteCommandAsync(); + + if (effect <= 0) + { + throw new VersionExceptions("取消订单失败!"); + } + + }, 5); } + public async Task ManagerCancelOrderAsync(OrderCancelRequest request) + { + var now = DateTime.Now; + var userId = CurrentUser.GetIntSubjectId(); + var order = await DbContext.Queryable().Where(x => x.No == request.No).FirstAsync(); + order.ThrowIfNull("订单不存在"); + await DbContext.Updateable() + .SetColumns(x => x.OrderStatus == CanteenOrderStatusEnumType.Cancel) + .SetColumns(x => x.Remark == request.Reason) + .SetColumns(x => x.ModifiedTime == now) + .SetColumns(x => x.ModifiedBy == userId) + .Where(x => x.No == request.No) + .ExecuteCommandAsync(); + var balance = await DbContext.Queryable().Where(x => x.No == request.No).SingleAsync(); + await DbContext.Updateable() + .SetColumns(x => x.Status == BalanceRecordStatusEnumType.Obsolute) + .SetColumns(x => x.Remark == request.Reason) + .SetColumns(x => x.ModifiedTime == now) + .SetColumns(x => x.ModifiedBy == userId) + .Where(x => x.No == request.No) + .ExecuteCommandAsync(); + + var amount = Math.Abs(order.Amount); + + //尝试5次 + await ContinueUpdateAsync(async () => + { + var mealInfo = await DbContext.Queryable().Where(x => x.UserNo == order.UserNo).FirstAsync(); + + var effect = await DbContext.Updateable() + .SetColumns(x => x.Balance == x.Balance + amount) + .SetColumns(x => x.ModifiedTime == now) + .SetColumns(x => x.ModifiedBy == userId) + .Where(x => x.Id == mealInfo.Id && x.Version == mealInfo.Version) + .ExecuteCommandAsync(); + + if (effect <= 0) + { + throw new VersionExceptions("取消订单失败!"); + } + + }, 5); + } /// @@ -215,6 +318,7 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService var exists = await DbContext.Queryable() .Where(x => x.ApplicationType == CanteenApplicaitonTypeEnumType.Booking) + .Where(x => x.OrderStatus == CanteenOrderStatusEnumType.Success) .Where(x => x.ShiftType == shiftType) .Where(x => x.UserNo == gainfo.No) .Where(x => x.CreateTime >= start && x.CreateTime <= end) diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs index b3f38f6f..36db7386 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs @@ -301,7 +301,8 @@ public class OrderService : BaseOrderService, IOrderService { No = x.No, BusinessPlaceName = bplace.Name, - CreateTime = x.CreateTime + CreateTime = x.CreateTime, + Remark = x.Remark, }) .ToPageListAsync(page); diff --git a/Src/Dlhis.Entity/Canteen/Entities/CanteenOrderDetailEntity.cs b/Src/Dlhis.Entity/Canteen/Entities/CanteenOrderDetailEntity.cs index 80d30b52..1627a0f7 100644 --- a/Src/Dlhis.Entity/Canteen/Entities/CanteenOrderDetailEntity.cs +++ b/Src/Dlhis.Entity/Canteen/Entities/CanteenOrderDetailEntity.cs @@ -16,6 +16,12 @@ public class CanteenOrderDetailEntity : SugarBaseEntity, ITenantId [SugarColumn(ColumnDescription = "订单号")] public string OrderNo { get; set; } + /// + /// 菜单日期 + /// + [SugarColumn(ColumnDescription = "订餐日期")] + public DateTime BookingDate { get; set; } + /// /// 菜品编码 ///