104 lines
3.2 KiB
C#
104 lines
3.2 KiB
C#
using Microsoft.EntityFrameworkCore;
|
||
using PetWash.Api.Data;
|
||
using PetWash.Api.Models;
|
||
|
||
namespace PetWash.Api.Services;
|
||
|
||
public class OrderService
|
||
{
|
||
private readonly PetWashDbContext _context;
|
||
private readonly MqttService _mqttService;
|
||
private readonly ILogger<OrderService> _logger;
|
||
|
||
public OrderService(PetWashDbContext context, MqttService mqttService, ILogger<OrderService> logger)
|
||
{
|
||
_context = context;
|
||
_mqttService = mqttService;
|
||
_logger = logger;
|
||
}
|
||
|
||
public async Task<Order> CreateOrderAsync(int packageId)
|
||
{
|
||
var package = await _context.Packages.FindAsync(packageId);
|
||
if (package == null)
|
||
throw new ArgumentException("套餐不存在");
|
||
|
||
var order = new Order
|
||
{
|
||
PackageId = packageId,
|
||
Package = package,
|
||
CreatedAt = DateTime.Now,
|
||
Status = OrderStatus.WaitingPayment,
|
||
IsPaid = false
|
||
};
|
||
|
||
_context.Orders.Add(order);
|
||
await _context.SaveChangesAsync();
|
||
|
||
_logger.LogInformation($"订单创建成功: OrderId={order.Id}, PackageId={packageId}");
|
||
return order;
|
||
}
|
||
|
||
public async Task<Order?> ConfirmPaymentAsync(int orderId)
|
||
{
|
||
var order = await _context.Orders.Include(o => o.Package).FirstOrDefaultAsync(o => o.Id == orderId);
|
||
if (order == null) return null;
|
||
|
||
if (order.IsPaid)
|
||
{
|
||
_logger.LogInformation("Order payment already confirmed: OrderId={OrderId}", orderId);
|
||
return order;
|
||
}
|
||
|
||
order.IsPaid = true;
|
||
order.PaidAt = DateTime.Now;
|
||
order.Status = OrderStatus.Paid;
|
||
await _context.SaveChangesAsync();
|
||
|
||
// 支付成功后,通过MQTT发送开门指令
|
||
await _mqttService.PublishAsync("device/command", new
|
||
{
|
||
command = "open_door",
|
||
orderId = order.Id,
|
||
timestamp = DateTime.Now
|
||
});
|
||
|
||
_logger.LogInformation($"订单支付成功,已发送开门指令: OrderId={orderId}");
|
||
return order;
|
||
}
|
||
|
||
public async Task<Order?> UpdateOrderStatusAsync(int orderId, OrderStatus status)
|
||
{
|
||
var order = await _context.Orders.Include(o => o.Package).FirstOrDefaultAsync(o => o.Id == orderId);
|
||
if (order == null) return null;
|
||
|
||
order.Status = status;
|
||
|
||
if (status == OrderStatus.DoorClosed)
|
||
{
|
||
order.StartedAt = DateTime.Now;
|
||
// 门关闭后,发送开始清洗指令
|
||
await _mqttService.PublishAsync("device/command", new
|
||
{
|
||
command = "start_wash",
|
||
orderId = order.Id,
|
||
durationMinutes = order.Package?.DurationMinutes ?? 15,
|
||
timestamp = DateTime.Now
|
||
});
|
||
}
|
||
else if (status == OrderStatus.Completed)
|
||
{
|
||
order.CompletedAt = DateTime.Now;
|
||
}
|
||
|
||
await _context.SaveChangesAsync();
|
||
_logger.LogInformation($"订单状态更新: OrderId={orderId}, Status={status}");
|
||
return order;
|
||
}
|
||
|
||
public async Task<Order?> GetOrderAsync(int orderId)
|
||
{
|
||
return await _context.Orders.Include(o => o.Package).FirstOrDefaultAsync(o => o.Id == orderId);
|
||
}
|
||
}
|