fix 订单取消接口,分页权限控制

This commit is contained in:
2024-03-21 18:14:33 +08:00
parent 1218aec811
commit e256d18d36
9 changed files with 196 additions and 11 deletions

View File

@@ -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>

View File

@@ -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>

View 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; }
}

View File

@@ -53,4 +53,6 @@ public class OrderAggregationResponse
/// 订单时间
/// </summary>
public DateTime CreateTime { get; set; }
public string Remark { get; set; }
}

View File

@@ -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();
}

View File

@@ -17,5 +17,7 @@ public interface IBookingOrderService : IScopeDependency
Task<Pagination<OrderBookingResponse>> GetBookingPageAsync(OrderBookingPageRequest request);
Task CancelOrderAsync();
Task UserCancelOrderAsync(OrderCancelRequest request);
Task ManagerCancelOrderAsync(OrderCancelRequest request);
}

View File

@@ -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)

View File

@@ -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);

View File

@@ -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>