2026-02-25 15:41:00 +08:00
|
|
|
|
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,
|
2026-03-16 15:38:08 +08:00
|
|
|
|
Package = package,
|
2026-02-25 15:41:00 +08:00
|
|
|
|
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;
|
|
|
|
|
|
|
2026-03-16 15:38:08 +08:00
|
|
|
|
if (order.IsPaid)
|
|
|
|
|
|
{
|
|
|
|
|
|
_logger.LogInformation("Order payment already confirmed: OrderId={OrderId}", orderId);
|
|
|
|
|
|
return order;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-25 15:41:00 +08:00
|
|
|
|
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)
|
|
|
|
|
|
{
|
2026-03-16 15:38:08 +08:00
|
|
|
|
var order = await _context.Orders.Include(o => o.Package).FirstOrDefaultAsync(o => o.Id == orderId);
|
2026-02-25 15:41:00 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|