Files
petwash/PetWash.Api/Services/OrderService.cs

104 lines
3.2 KiB
C#
Raw Normal View History

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