fix 订单取消接口,分页权限控制
This commit is contained in:
@@ -61,6 +61,34 @@ public class OrdersController : ControllerBase
|
|||||||
return await _orderService.GetOrdersAggregationAsync(page);
|
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>
|
/// <summary>
|
||||||
|
|||||||
@@ -36,6 +36,11 @@ public class BookingMealRequest : IValidatableObject
|
|||||||
[Range(0, 100)]
|
[Range(0, 100)]
|
||||||
public int Number { get; set; }
|
public int Number { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 单位
|
||||||
|
/// </summary>
|
||||||
|
public string Unit { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 消费来源
|
/// 消费来源
|
||||||
/// </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>
|
/// </summary>
|
||||||
public DateTime CreateTime { get; set; }
|
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
|
public class OrderBookingResponse
|
||||||
{
|
{
|
||||||
@@ -28,12 +31,28 @@ public class OrderBookingResponse
|
|||||||
public string UserCode { get; set; }
|
public string UserCode { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// 用户
|
||||||
/// </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>
|
||||||
/// 订单时间
|
/// 订单时间
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public DateTime CreateTime { get; set; }
|
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<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 Kurisu.SqlSugar.Extensions;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
using Mapster;
|
using Mapster;
|
||||||
|
using MySqlX.XDevAPI.Relational;
|
||||||
|
|
||||||
namespace Dlhis.Canteen.Order.Services.Implements;
|
namespace Dlhis.Canteen.Order.Services.Implements;
|
||||||
|
|
||||||
public class BookingOrderService : BaseOrderService, IBookingOrderService
|
public class BookingOrderService : BaseOrderService, IBookingOrderService
|
||||||
{
|
{
|
||||||
private readonly IDisheMenuApi _disheMenuApi;
|
private readonly IDisheMenuApi _disheMenuApi;
|
||||||
|
private readonly IBusinessPlacePermissionsApi _businessPlacePermissionsApi;
|
||||||
|
|
||||||
public BookingOrderService(ICanteenSettingService canteenSettingService, IDbContext dbContext,
|
public BookingOrderService(ICanteenSettingService canteenSettingService, IDbContext dbContext,
|
||||||
IDisheMenuApi disheMenuApi,
|
IDisheMenuApi disheMenuApi,
|
||||||
|
IBusinessPlacePermissionsApi businessPlacePermissionsApi,
|
||||||
ICurrentUser currentUser, IDevicePermissionApi devicePermissionApi, ILogger<BookingOrderService> logger)
|
ICurrentUser currentUser, IDevicePermissionApi devicePermissionApi, ILogger<BookingOrderService> logger)
|
||||||
: base(canteenSettingService, dbContext, currentUser, devicePermissionApi, logger)
|
: base(canteenSettingService, dbContext, currentUser, devicePermissionApi, logger)
|
||||||
{
|
{
|
||||||
_disheMenuApi = disheMenuApi;
|
_disheMenuApi = disheMenuApi;
|
||||||
|
_businessPlacePermissionsApi = businessPlacePermissionsApi;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<BookingResponse> BookingAsync(BookingMealRequest request)
|
public async Task<BookingResponse> BookingAsync(BookingMealRequest request)
|
||||||
@@ -147,9 +151,10 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService
|
|||||||
await DbContext.InsertAsync(new CanteenOrderDetailEntity
|
await DbContext.InsertAsync(new CanteenOrderDetailEntity
|
||||||
{
|
{
|
||||||
OrderNo = order.No,
|
OrderNo = order.No,
|
||||||
|
BookingDate = request.BookingDate,
|
||||||
DishesCode = request.DishesCode,
|
DishesCode = request.DishesCode,
|
||||||
Price = menuDetail.Price,
|
Price = menuDetail.Price,
|
||||||
//Unit
|
Unit = request.Unit,
|
||||||
Number = 1,
|
Number = 1,
|
||||||
TenantId = order.TenantId,
|
TenantId = order.TenantId,
|
||||||
});
|
});
|
||||||
@@ -169,29 +174,127 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService
|
|||||||
|
|
||||||
public async Task<Pagination<OrderBookingResponse>> GetBookingPageAsync(OrderBookingPageRequest request)
|
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>()
|
var page = await DbContext.Queryable<CanteenOrderEntity>()
|
||||||
.LeftJoin<GainfoEntity>((x, ga) => x.UserNo == ga.No)
|
.LeftJoin<GainfoEntity>((x, ga) => x.UserNo == ga.No)
|
||||||
.Select(x => new OrderBookingResponse
|
.Where(x => myCodes.Contains(x.BusinessPlaceCode))
|
||||||
|
.Select((x, ga) => new OrderBookingResponse
|
||||||
{
|
{
|
||||||
No = x.No,
|
No = x.No,
|
||||||
DeliveryAddress = x.DeliveryAddress,
|
DeliveryAddress = x.DeliveryAddress,
|
||||||
Remark = x.Remark,
|
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);
|
.ToPageListAsync(request);
|
||||||
|
|
||||||
return page;
|
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>
|
/// <summary>
|
||||||
@@ -215,6 +318,7 @@ public class BookingOrderService : BaseOrderService, IBookingOrderService
|
|||||||
|
|
||||||
var exists = await DbContext.Queryable<CanteenOrderEntity>()
|
var exists = await DbContext.Queryable<CanteenOrderEntity>()
|
||||||
.Where(x => x.ApplicationType == CanteenApplicaitonTypeEnumType.Booking)
|
.Where(x => x.ApplicationType == CanteenApplicaitonTypeEnumType.Booking)
|
||||||
|
.Where(x => x.OrderStatus == CanteenOrderStatusEnumType.Success)
|
||||||
.Where(x => x.ShiftType == shiftType)
|
.Where(x => x.ShiftType == shiftType)
|
||||||
.Where(x => x.UserNo == gainfo.No)
|
.Where(x => x.UserNo == gainfo.No)
|
||||||
.Where(x => x.CreateTime >= start && x.CreateTime <= end)
|
.Where(x => x.CreateTime >= start && x.CreateTime <= end)
|
||||||
|
|||||||
@@ -301,7 +301,8 @@ public class OrderService : BaseOrderService, IOrderService
|
|||||||
{
|
{
|
||||||
No = x.No,
|
No = x.No,
|
||||||
BusinessPlaceName = bplace.Name,
|
BusinessPlaceName = bplace.Name,
|
||||||
CreateTime = x.CreateTime
|
CreateTime = x.CreateTime,
|
||||||
|
Remark = x.Remark,
|
||||||
})
|
})
|
||||||
.ToPageListAsync(page);
|
.ToPageListAsync(page);
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,12 @@ public class CanteenOrderDetailEntity : SugarBaseEntity, ITenantId
|
|||||||
[SugarColumn(ColumnDescription = "订单号")]
|
[SugarColumn(ColumnDescription = "订单号")]
|
||||||
public string OrderNo { get; set; }
|
public string OrderNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 菜单日期
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(ColumnDescription = "订餐日期")]
|
||||||
|
public DateTime BookingDate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 菜品编码
|
/// 菜品编码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user