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; }
+
///
/// 菜品编码
///