Files
petwash/PetWash.Api/Services/OrderService.cs
2026-03-16 15:38:08 +08:00

104 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}