fix 订单取消接口,分页权限控制
This commit is contained in:
@@ -61,6 +61,34 @@ public class OrdersController : ControllerBase
|
||||
return await _orderService.GetOrdersAggregationAsync(page);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取消订单
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPut("user-cancel")]
|
||||
[Transactional]
|
||||
[IgnoreTenant]
|
||||
public async Task CancelOrderAsync(OrderCancelRequest request)
|
||||
{
|
||||
await _bookingOrderService.UserCancelOrderAsync(request);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 取消订单
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPut("manager-cancel")]
|
||||
[Transactional]
|
||||
[IgnoreTenant]
|
||||
public async Task ManagerCancelOrderAsync(OrderCancelRequest request)
|
||||
{
|
||||
await _bookingOrderService.ManagerCancelOrderAsync(request);
|
||||
}
|
||||
|
||||
//************************************************************** 订餐功能 **********************************************************************************
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -36,6 +36,11 @@ public class BookingMealRequest : IValidatableObject
|
||||
[Range(0, 100)]
|
||||
public int Number { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 单位
|
||||
/// </summary>
|
||||
public string Unit { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 消费来源
|
||||
/// </summary>
|
||||
|
||||
18
Src/Dlhis.Canteen/Order/Request/OrderCancelRequest.cs
Normal file
18
Src/Dlhis.Canteen/Order/Request/OrderCancelRequest.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Dlhis.Canteen.Order.Request;
|
||||
|
||||
public class OrderCancelRequest
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
[Required(ErrorMessage = "订单号")]
|
||||
public string No { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 取消原因
|
||||
/// </summary>
|
||||
[Required]
|
||||
public string Reason { get; set; }
|
||||
}
|
||||
@@ -53,4 +53,6 @@ public class OrderAggregationResponse
|
||||
/// 订单时间
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
public string Remark { get; set; }
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// 用户
|
||||
/// </summary>
|
||||
public string UserNo { get; set; }
|
||||
public string UserName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 餐次
|
||||
/// </summary>
|
||||
public ShiftEnumType? ShiftType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 餐次
|
||||
/// </summary>
|
||||
public string ShiftTypeDesc => ShiftType.GetDescription();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 订单时间
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
|
||||
public CanteenOrderStatusEnumType Status { get; set; }
|
||||
|
||||
public string StatusDesc => Status.GetDescription();
|
||||
}
|
||||
|
||||
@@ -17,5 +17,7 @@ public interface IBookingOrderService : IScopeDependency
|
||||
|
||||
Task<Pagination<OrderBookingResponse>> GetBookingPageAsync(OrderBookingPageRequest request);
|
||||
|
||||
Task CancelOrderAsync();
|
||||
Task UserCancelOrderAsync(OrderCancelRequest request);
|
||||
|
||||
Task ManagerCancelOrderAsync(OrderCancelRequest request);
|
||||
}
|
||||
|
||||
@@ -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<BookingOrderService> logger)
|
||||
: base(canteenSettingService, dbContext, currentUser, devicePermissionApi, logger)
|
||||
{
|
||||
_disheMenuApi = disheMenuApi;
|
||||
_businessPlacePermissionsApi = businessPlacePermissionsApi;
|
||||
}
|
||||
|
||||
public async Task<BookingResponse> 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<Pagination<OrderBookingResponse>> GetBookingPageAsync(OrderBookingPageRequest request)
|
||||
{
|
||||
var myCodes = (await _businessPlacePermissionsApi.GetMyAsync()).Data.Select(x => (Guid?)x.Code).ToList();
|
||||
|
||||
var page = await DbContext.Queryable<CanteenOrderEntity>()
|
||||
.LeftJoin<GainfoEntity>((x, ga) => x.UserNo == ga.No)
|
||||
.Select(x => new OrderBookingResponse
|
||||
.LeftJoin<GainfoEntity>((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<TimeOnly?>(CanteenSettingItemEnumType.BookingDeadline) ?? new TimeOnly(20, 30, 00);
|
||||
var dealLine = DateTime.Today.Add(bookingDeadline.ToTimeSpan());
|
||||
(now >= dealLine).ThrowIfTrue("不在订单取消允许范围内,不可操作");
|
||||
|
||||
var order = await DbContext.Queryable<CanteenOrderEntity>().Where(x => x.No == request.No).FirstAsync();
|
||||
order.ThrowIfNull("订单不存在");
|
||||
|
||||
await DbContext.Updateable<CanteenOrderEntity>()
|
||||
.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<BalanceRecordEntity>().Where(x => x.No == request.No).SingleAsync();
|
||||
await DbContext.Updateable<BalanceRecordEntity>()
|
||||
.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<GainfoMealEntity>().Where(x => x.UserNo == order.UserNo).FirstAsync();
|
||||
|
||||
var effect = await DbContext.Updateable<GainfoMealEntity>()
|
||||
.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<CanteenOrderEntity>().Where(x => x.No == request.No).FirstAsync();
|
||||
order.ThrowIfNull("订单不存在");
|
||||
|
||||
await DbContext.Updateable<CanteenOrderEntity>()
|
||||
.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<BalanceRecordEntity>().Where(x => x.No == request.No).SingleAsync();
|
||||
await DbContext.Updateable<BalanceRecordEntity>()
|
||||
.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<GainfoMealEntity>().Where(x => x.UserNo == order.UserNo).FirstAsync();
|
||||
|
||||
var effect = await DbContext.Updateable<GainfoMealEntity>()
|
||||
.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);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -215,6 +318,7 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService
|
||||
|
||||
var exists = await DbContext.Queryable<CanteenOrderEntity>()
|
||||
.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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -16,6 +16,12 @@ public class CanteenOrderDetailEntity : SugarBaseEntity, ITenantId
|
||||
[SugarColumn(ColumnDescription = "订单号")]
|
||||
public string OrderNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 菜单日期
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDescription = "订餐日期")]
|
||||
public DateTime BookingDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 菜品编码
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user