Files
BackOffice/src/BackOffice/Pages/DiscountShop/Components/OrderDetailsDialog.razor.cs
T
masoodafar-web cbc61ad0f5
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 6m36s
feat(order-details): add mobile display logic and remove unused status methods
- Introduced a new property to display the user's mobile number or fallback to the address phone number in OrderDetailsDialog.
- Removed obsolete methods for determining order status color and text, streamlining the component's code.
2026-08-07 17:10:30 +03:30

215 lines
6.7 KiB
C#

using BackOffice.Common.Utilities;
using BackOffice.Services.DiscountOrder;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using MudBlazor;
namespace BackOffice.Pages.DiscountShop.Components;
public partial class OrderDetailsDialog
{
[CascadingParameter] IMudDialogInstance MudDialog { get; set; } = null!;
[Inject] public IDiscountOrderService OrderService { get; set; } = default!;
[Inject] private IJSRuntime JsRuntime { get; set; } = default!;
[Parameter] public DiscountOrderDetailsDto Order { get; set; } = null!;
private OrderStatus _newStatus;
private string? _trackingCode;
private string? _adminNotes;
private bool _isSaving;
private List<TimelineStep> _timelineSteps = new();
private string? DisplayMobile =>
!string.IsNullOrWhiteSpace(Order.UserMobile) ? Order.UserMobile : Order.Address?.Phone;
protected override void OnInitialized()
{
_newStatus = Order.Status;
_trackingCode = Order.TrackingCode;
_adminNotes = Order.AdminNotes;
BuildTimeline();
}
private void BuildTimeline()
{
var status = Order.Status;
var steps = new List<TimelineStep>
{
new()
{
Title = "ثبت سفارش",
State = status == OrderStatus.Pending ? StepState.Active : StepState.Completed,
Icon = "1"
},
new()
{
Title = "پرداخت",
State = status switch
{
OrderStatus.Pending => StepState.Inactive,
OrderStatus.Paid => StepState.Active,
OrderStatus.Cancelled => StepState.Inactive,
_ => Order.PaymentCompleted ? StepState.Completed : StepState.Inactive
},
Icon = "2"
},
new()
{
Title = "آماده‌سازی",
State = status switch
{
OrderStatus.Processing => StepState.Active,
OrderStatus.Shipped or OrderStatus.Delivered => StepState.Completed,
_ => StepState.Inactive
},
Icon = "3"
},
new()
{
Title = "ارسال",
State = status switch
{
OrderStatus.Shipped => StepState.Active,
OrderStatus.Delivered => StepState.Completed,
_ => StepState.Inactive
},
Icon = "4"
},
new()
{
Title = "تحویل / مرجوعی",
State = status switch
{
OrderStatus.Delivered => StepState.Completed,
OrderStatus.Returned => StepState.Completed,
OrderStatus.Cancelled => StepState.Completed,
_ => StepState.Inactive
},
Icon = "5"
}
};
_timelineSteps = steps;
}
private Color GetStepColor(StepState state)
{
return state switch
{
StepState.Completed => Color.Success,
StepState.Active => Color.Info,
_ => Color.Default
};
}
private async Task SaveAsync()
{
_isSaving = true;
StateHasChanged();
try
{
await OrderService.UpdateStatusAsync(Order.Id, new UpdateOrderStatusDto
{
Status = _newStatus,
TrackingCode = _trackingCode,
AdminNotes = _adminNotes
});
Snackbar.Add("تغییرات سفارش با موفقیت ذخیره شد.", Severity.Success);
MudDialog.Close(DialogResult.Ok(true));
}
catch (Exception ex)
{
Snackbar.Add($"خطا در ذخیره تغییرات: {ex.Message}", Severity.Error);
}
finally
{
_isSaving = false;
StateHasChanged();
}
}
private void Close() => MudDialog.Close();
private Color GetPaymentStatusColor(int status) => status switch
{
0 => Color.Warning,
1 => Color.Success,
2 => Color.Error,
3 => Color.Info,
_ => Color.Default
};
private string GetPaymentStatusText(int status) => status switch
{
0 => "در انتظار پرداخت",
1 => "پرداخت شده",
2 => "ناموفق",
3 => "بازپرداخت شده",
_ => "نامشخص"
};
private string GetPaymentStatusIcon(int status) => status switch
{
1 => Icons.Material.Filled.CheckCircle,
2 => Icons.Material.Filled.Cancel,
3 => Icons.Material.Filled.Replay,
_ => Icons.Material.Filled.Schedule
};
private async Task PrintInvoiceAsync()
{
var lines = Order.Items.Select(i => new OrderInvoicePrint.InvoiceLine
{
Title = i.ProductTitle,
Quantity = i.Count,
UnitPrice = i.UnitPrice,
Discount = i.DiscountAmount,
LineTotal = i.FinalPrice > 0 ? i.FinalPrice : i.UnitPrice * i.Count
}).ToList();
var mobile = !string.IsNullOrWhiteSpace(Order.UserMobile)
? Order.UserMobile
: Order.Address?.Phone;
var html = OrderInvoicePrint.BuildHtml(new OrderInvoicePrint.InvoiceModel
{
ShopTitle = "فروشگاه اعتباری — کارا بازار سلامت",
OrderId = string.IsNullOrWhiteSpace(Order.OrderNumber) ? Order.Id.ToString() : Order.OrderNumber,
CustomerName = Order.UserFullName,
CustomerMobile = mobile,
Address = Order.Address?.Address,
PostalCode = Order.Address?.PostalCode,
PaymentStatus = GetPaymentStatusText(Order.PaymentStatusValue),
TransactionId = Order.TransactionId,
TrackingCode = Order.TrackingCode,
Created = Order.Created,
Subtotal = lines.Sum(l => l.UnitPrice * l.Quantity),
DiscountTotal = lines.Sum(l => l.Discount),
CreditUsed = Order.DiscountBalanceUsed,
GatewayAmount = Order.GatewayAmount,
VatAmount = Order.VatAmount,
TotalAmount = Order.TotalPrice,
Lines = lines
});
await JsRuntime.InvokeVoidAsync("jsHtmlToPdf", html, $"فاکتور سفارش {Order.Id}");
}
private enum StepState
{
Inactive = 0,
Active = 1,
Completed = 2
}
private class TimelineStep
{
public string Title { get; set; } = string.Empty;
public StepState State { get; set; }
public string Icon { get; set; } = string.Empty;
}
}