feat: Implement withdrawal reports query and service integration
This commit is contained in:
+33
-30
@@ -1,5 +1,7 @@
|
||||
using CMSMicroservice.Application.Common.Interfaces;
|
||||
using CMSMicroservice.Domain.Enums;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using ValidationException = FluentValidation.ValidationException;
|
||||
|
||||
namespace CMSMicroservice.Application.UserOrderCQ.Commands.UpdateOrderStatus;
|
||||
|
||||
@@ -18,36 +20,37 @@ public class UpdateOrderStatusCommandHandler : IRequestHandler<UpdateOrderStatus
|
||||
|
||||
public async Task<UpdateOrderStatusResponseDto> Handle(UpdateOrderStatusCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
// TODO: پیادهسازی تغییر وضعیت سفارش
|
||||
// 1. پیدا کردن سفارش:
|
||||
// - await _context.UserOrders.FirstOrDefaultAsync(o => o.Id == request.OrderId)
|
||||
// - بررسی null و پرتاب NotFoundException
|
||||
//
|
||||
// 2. بررسیهای انتقال وضعیت (State Transition Validation):
|
||||
// - نمیتوان از Delivered به Cancelled رفت
|
||||
// - نمیتوان از Cancelled به سایر وضعیتها رفت
|
||||
// - الگوی معمول: Pending → Processing → Shipped → Delivered
|
||||
// - Cancelled میتواند از Pending, Processing, Shipped باشد
|
||||
//
|
||||
// 3. تغییر وضعیت:
|
||||
// - order.DeliveryStatus = request.NewStatus
|
||||
// - اگر Description داریم: order.DeliveryDescription = request.Description
|
||||
// - تنظیم تاریخهای مربوطه:
|
||||
// * اگر NewStatus == Delivered → order.DeliveredAt = DateTime.UtcNow
|
||||
// * اگر NewStatus == Shipped → order.ShippedAt = DateTime.UtcNow
|
||||
// * اگر NewStatus == Processing → order.ProcessedAt = DateTime.UtcNow
|
||||
//
|
||||
// 4. ذخیره و Log:
|
||||
// - await _context.SaveChangesAsync(cancellationToken)
|
||||
// - _logger.LogInformation("Order {OrderId} status changed to {NewStatus}", request.OrderId, request.NewStatus)
|
||||
//
|
||||
// 5. برگشت Response:
|
||||
// - Success = true
|
||||
// - Message = "وضعیت سفارش با موفقیت تغییر کرد"
|
||||
// - CurrentStatus = order.DeliveryStatus
|
||||
//
|
||||
// نکته: برای validation دقیقتر، میتوان یک State Machine برای انتقالهای مجاز تعریف کرد
|
||||
var order = await _context.UserOrders
|
||||
.FirstOrDefaultAsync(o => o.Id == request.OrderId, cancellationToken);
|
||||
|
||||
throw new NotImplementedException("UpdateOrderStatus needs implementation");
|
||||
if (order == null)
|
||||
{
|
||||
throw new NotFoundException(nameof(order), request.OrderId);
|
||||
}
|
||||
|
||||
var oldStatus = order.DeliveryStatus;
|
||||
|
||||
// قوانین ساده انتقال وضعیت: از Cancelled نمیتوان خارج شد
|
||||
if (oldStatus == DeliveryStatus.Cancelled)
|
||||
{
|
||||
throw new ValidationException("امکان تغییر وضعیت سفارش لغو شده وجود ندارد");
|
||||
}
|
||||
|
||||
order.DeliveryStatus = request.NewStatus;
|
||||
|
||||
await _context.SaveChangesAsync(cancellationToken);
|
||||
|
||||
_logger.LogInformation(
|
||||
"Order {OrderId} status changed from {OldStatus} to {NewStatus}",
|
||||
request.OrderId,
|
||||
oldStatus,
|
||||
request.NewStatus);
|
||||
|
||||
return new UpdateOrderStatusResponseDto
|
||||
{
|
||||
Success = true,
|
||||
Message = "وضعیت سفارش با موفقیت تغییر کرد",
|
||||
CurrentStatus = order.DeliveryStatus
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user