14 KiB
BackOffice Build Fix Status
آخرین بروزرسانی: December 6, 2025
وضعیت فعلی
Build Status: ✅ SUCCESS - 0 Error
BackOffice.BFF Solution:
- Build: ✅ موفق - 0 Error
- Proto Projects فعال:
- ✅ BackOffice.BFF.Tag.Protobuf
- ✅ BackOffice.BFF.ProductTag.Protobuf
- ✅ BackOffice.BFF.DiscountProduct.Protobuf
- ✅ BackOffice.BFF.DiscountCategory.Protobuf
- ✅ BackOffice.BFF.DiscountOrder.Protobuf
- ✅ BackOffice.BFF.DiscountShoppingCart.Protobuf
- ✅ BackOffice.BFF.PublicMessage.Protobuf
- ✅ BackOffice.BFF.ManualPayment.Protobuf
BackOffice UI:
- Build: ✅ موفق - 0 Error
- Framework: Blazor WebAssembly .NET 9.0
- UI Library: MudBlazor 8.14.0
CMS Microservice:
- Build: ✅ موفق - 0 Error
پیشرفت کلی: از 60+ خطا به 0 خطا رسیدیم ✨
ماژولهای فعال شده (Enabled Modules)
✅ کاملاً فعال و تست شده:
-
DiscountShop Module (فروشگاه تخفیفی)
- ✅ DiscountProductsMainPage - مدیریت محصولات تخفیفی
- ✅ DiscountCategoriesMainPage - مدیریت دستهبندیها (با MudDataGrid)
- ✅ DiscountOrdersMainPage - مدیریت سفارشات
- ✅ SalesReports - گزارش فروش
- ✅ ProductImageGallery - گالری تصاویر (با MudBlazor 8 fixes)
- Services: IDiscountProductService, IDiscountCategoryService, IDiscountOrderService
-
PublicMessages Module (پیامهای عمومی)
- ✅ PublicMessagesMainPage - مدیریت پیامها
- ✅ MessageFormDialog - فرم ایجاد/ویرایش
- ✅ MessageViewDialog - نمایش جزئیات
- ✅ MessageTemplatesDialog - قالبهای آماده
- Services: IPublicMessageService
- Proto: BackOffice.BFF.PublicMessage.Protobuf
-
ManualPayment Module (پرداختهای دستی)
- ✅ ManualPayments - صفحه اصلی مدیریت
- ✅ ManualPaymentDialog - فرم ایجاد و تایید/رد
- Services: Direct gRPC to ManualPaymentContract
- Proto: BackOffice.BFF.ManualPayment.Protobuf
-
Tag Module (برچسبها)
- ✅ TagManagementPage - مدیریت تگها
- ✅ TagEditDialog - ویرایش تگ
- Services: ITagService, IProductTagService
- Proto: BackOffice.BFF.Tag.Protobuf, BackOffice.BFF.ProductTag.Protobuf
-
Dashboard Widgets
- ✅ DiscountShopWidget - آمار فروشگاه تخفیفی (7 روز اخیر)
-
Payment Pages
- ✅ Transactions - صفحه تراکنشها
-
DragDrop Pages
- ✅ CategoryProductsDragDropPage - مدیریت محصولات دسته
- ✅ ProductCategoriesDragDropPage - مدیریت دستههای محصول
-
BulkEdit Module
- ✅ BulkEdit - ویرایش گروهی محصولات (قیمت، موجودی، وضعیت)
- Proto: BackOffice.BFF.Products.Protobuf (BulkUpdateProductPrices, BulkUpdateProductStock, ToggleProductStatus)
- Note: استفاده از
BackOffice.BFF.Protobuf.Common.PaginationStateبا using alias
ماژولهای Exclude شده (نیاز به کار اضافی)
❌ نیاز به متدهای Proto جدید:
-
GalleryDialog (
Pages/Products/Components/GalleryDialog.razor)- مشکل: استفاده از
AddProductImageAsyncوRemoveProductImageAsync - راهحل: افزودن این RPCها به
products.proto - وضعیت: نیاز به تغییرات در BackOffice.BFF
- مشکل: استفاده از
-
CreateDialog & UpdateDialog (
Pages/Products/Components/)- مشکل: استفاده از
ImageFileModelبرای آپلود تصویر - راهحل: افزودن
ImageFileModelmessage و متدهای مربوطه - وضعیت: نیاز به تغییرات در BackOffice.BFF
- مشکل: استفاده از
تغییرات مهم MudBlazor 8
Breaking Changes برطرف شده:
-
MudDialogInstance → IMudDialogInstance
// قبلی: [CascadingParameter] MudDialogInstance MudDialog { get; set; } // جدید: [CascadingParameter] IMudDialogInstance MudDialog { get; set; } -
MudSwitch نیاز به T parameter
<!-- قبلی: --> <MudSwitch @bind-Checked="Model.IsActive" /> <!-- جدید: --> <MudSwitch T="bool" @bind-Value="Model.IsActive" /> -
MudChip نیاز به T parameter
<!-- قبلی: --> <MudChip>Text</MudChip> <!-- جدید: --> <MudChip T="string">Text</MudChip> -
MudTreeView تغییر API
- راهحل: جایگزینی با
MudDataGridدر DiscountCategoriesMainPage
- راهحل: جایگزینی با
-
MudFileUpload تغییر signature
// FilesChanged حالا IBrowserFile میگیرد نه IReadOnlyList <MudFileUpload T="IReadOnlyList<IBrowserFile>" FilesChanged="OnFilesSelected" /> -
DragEventArgs.PreventDefault() حذف شد
<!-- استفاده از directive attribute: --> @ondragover:preventDefault
تغییرات Proto
1. Google.Protobuf.WellKnownTypes Simplification
در همه جا از wrapper به مقدار مستقیم تغییر یافت:
// قبلی (اشتباه):
request.UserId = new Google.Protobuf.WellKnownTypes.Int64Value { Value = userId };
request.Status = new Google.Protobuf.WellKnownTypes.Int32Value { Value = status };
request.ReferenceNumber = new Google.Protobuf.WellKnownTypes.StringValue { Value = refNum };
// جدید (صحیح):
request.UserId = userId;
request.Status = status;
request.ReferenceNumber = refNum;
2. Timestamp to DateTime Conversion
// Proto Timestamp به DateTime تبدیل میشود:
var dateTime = timestamp.ToDateTime(); // به جای ToLocalTime()
تغییرات معماری
BasePageComponent Pattern
صفحات با فیلتر از BasePageComponent استفاده میکنند ولی ReloadAsync() ندارد.
راهحل: استفاده مستقیم از MudDataGrid.ReloadServerData():
private MudDataGrid<ModelType>? _dataGrid;
private async Task OnFilterSubmit()
{
if (_dataGrid != null)
await _dataGrid.ReloadServerData();
}
ProductGalleryImageGetCategoriesRequest/ResponseUpdateProductCategoriesRequestGetProductsForCategoryRequest/ResponseUpdateCategoryProductsRequest
3. تغییرات csproj
Products از NuGet به ProjectReference تغییر کرد:
<!-- قبلی: -->
<PackageReference Include="Foursat.BackOffice.BFF.Products.Protobuf" Version="0.0.8" />
<!-- جدید: -->
<ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Products.Protobuf/BackOffice.BFF.Products.Protobuf.csproj" />
4. فیکسهای MudBlazor
MudSwitch T parameter:
Pages/Settings/UserSettings.razorPages/Club/ClubMembers.razorPages/Configuration/Configuration.razor
<!-- قبلی: -->
<MudSwitch @bind-Value="..." />
<!-- جدید: -->
<MudSwitch T="bool" @bind-Value="..." />
5. فیکس Snackbar Duplicate
در فایلهای زیر [Inject] ISnackbar Snackbar حذف شد (چون در _Imports.razor inject شده):
ApplyDiscountDialog.razor.csCancelOrderDialog.razor.csChangeOrderStatusDialog.razor.cs
6. فیکس ConfigureService.cs
Using های زیر comment شدند:
// using BackOffice.Services.DiscountProduct;
// using BackOffice.Services.DiscountCategory;
// using BackOffice.Services.DiscountOrder;
// using BackOffice.Services.Tag;
// using BackOffice.Services.ProductTag;
// using BackOffice.Services.PublicMessage;
کارهای باقیمانده (TODO)
فوری - نیاز به Proto Methods:
1. Product Image Management
فایلهای Excluded:
Pages/Products/Components/GalleryDialog.razorPages/Products/Components/CreateDialog.razorPages/Products/Components/UpdateDialog.razor
Proto Methods مورد نیاز در products.proto:
service ProductsContract {
// برای GalleryDialog:
rpc AddProductImage(AddProductImageRequest) returns (AddProductImageResponse);
rpc RemoveProductImage(RemoveProductImageRequest) returns (google.protobuf.Empty);
// برای Create/Update Dialogs:
rpc CreateProductWithImage(CreateProductWithImageRequest) returns (CreateProductResponse);
rpc UpdateProductWithImage(UpdateProductWithImageRequest) returns (google.protobuf.Empty);
}
message ImageFileModel {
bytes file = 1;
string mime = 2;
string file_name = 3;
}
message AddProductImageRequest {
int64 product_id = 1;
string title = 2;
ImageFileModel image_file = 3;
}
message AddProductImageResponse {
int64 product_gallery_id = 1;
}
message RemoveProductImageRequest {
int64 product_gallery_id = 1;
}
message CreateProductWithImageRequest {
// ... سایر فیلدهای محصول
ImageFileModel image_file = 1;
ImageFileModel thumbnail_file = 2;
}
message UpdateProductWithImageRequest {
int64 id = 1;
// ... سایر فیلدها
ImageFileModel image_file = 2;
ImageFileModel thumbnail_file = 3;
}
وضعیت: 🔴 نیاز به پیادهسازی در Backend
2. BulkEdit Refactoring
فایل Excluded: Pages/Products/BulkEdit.razor
مشکل: استفاده مستقیم از CMSMicroservice.Protobuf.Protos
راهحل:
- حذف dependency به
CMSMicroservice.Protobuf - افزودن bulk update methods به
products.proto:
service ProductsContract {
rpc BulkUpdateProducts(BulkUpdateProductsRequest) returns (BulkUpdateProductsResponse);
}
message BulkUpdateProductsRequest {
repeated int64 product_ids = 1;
google.protobuf.Int64Value new_price = 2;
google.protobuf.Int32Value new_discount = 3;
google.protobuf.Int32Value new_club_discount_percent = 4;
StockUpdateOperation stock_operation = 5;
google.protobuf.BoolValue status_enable = 6;
}
enum StockUpdateOperation {
STOCK_NO_CHANGE = 0;
STOCK_SET = 1;
STOCK_ADD = 2;
STOCK_SUBTRACT = 3;
}
message BulkUpdateProductsResponse {
int32 updated_count = 1;
repeated int64 failed_product_ids = 2;
}
وضعیت: 🔴 نیاز به پیادهسازی در Backend
اختیاری - بهبودها:
3. Transactions API Implementation
فایل: Pages/Payment/Transactions.razor
وضعیت فعلی: ✅ Enabled ولی متد LoadData فقط TODO دارد
نیاز: پیادهسازی Transaction API در Backend
آمار نهایی
ماژولهای فعال: 7 ✅
- DiscountShop (Products, Categories, Orders, Reports)
- PublicMessages
- ManualPayments
- Tag Management
- Dashboard DiscountShopWidget
- Transactions Page
- DragDrop Pages (Category ↔ Products)
ماژولهای Excluded: 3 ❌
- GalleryDialog (نیاز به Image Upload API)
- CreateDialog/UpdateDialog (نیاز به Image Upload API)
- BulkEdit (نیاز به Refactoring + Bulk API)
Build Errors: 0 🎉
Proto Projects: 14 فعال
صفحات فعال: ~30+
کامپوننتهای فعال: ~50+
Handler های موقتاً Exclude شده در BackOffice.BFF.Application
فایلهای Exclude شده:
<Compile Remove="DiscountOrderCQ/**/*.cs" />
<Compile Remove="DiscountShoppingCartCQ/**/*.cs" />
<Compile Remove="ManualPaymentCQ/**/*.cs" />
<Compile Remove="ConfigurationCQ/**/*.cs" />
<Compile Remove="CommissionCQ/Commands/ProcessWithdrawal/**/*.cs" />
دلیل Exclude:
این Handler ها فیلدهای متفاوتی با proto های CMS دارند و نیاز به بازنویسی دارند.
مثال عدم تطابق DiscountOrder:
Handler انتظار دارد:
- Request:
UserId,AddressId,DiscountBalanceAmount,GatewayAmount - Response:
OrderId,TrackingCode,RequiresGatewayPayment,GatewayPayableAmount
Proto CMS دارد:
- Request:
user_id,user_address_id,discount_balance_to_use,notes - Response:
success,message,order_id,gateway_amount,payment_url
Proto Update های مورد نیاز
UserOrder.Protobuf
متدهای زیر باید اضافه شوند:
CancelOrderAsync(CancelOrderRequest)ApplyDiscountToOrderAsync(ApplyDiscountToOrderRequest)UpdateOrderStatusAsync(UpdateOrderStatusRequest)
فیلدهای زیر باید اضافه شوند:
VatAmountVatPercentageVatBaseAmountVatTotalAmountPaymentStatus.None
Products.Protobuf
متدهای زیر باید اضافه شوند:
AddProductImageAsyncRemoveProductImageAsync
فیلدهای زیر باید اضافه شوند:
ImageFile(bytes)ThumbnailFile(bytes)ImageFileModelmessage
دستورات برای ادامه کار
1. اجرای build برای دیدن خطاهای فعلی:
cd /home/masoud/Apps/project/FourSat/BackOffice/src/BackOffice
dotnet build 2>&1 | grep -E "error CS|Error"
2. فایلهای مهم برای بررسی:
BackOffice.csproj- لیست exclude ها و referencesConfigureService.cs- DI registrations_Imports.razor- global using و inject ها
3. Proto فایلهای مهم:
BackOffice.BFF/src/Protobufs/BackOffice.BFF.Products.Protobuf/Protos/products.protoBackOffice.BFF/src/Protobufs/BackOffice.BFF.UserOrder.Protobuf/Protos/userorder.proto
چکلیست برای chat جدید
- خطاهای build رو چک کن
PaginationStatenamespace رو فیکس کنWithdrawalReportsbinding رو فیکس کنOpenGalleryDialogرو comment کن درProductsMainPageDiscountShopWidgetرو ازSystemOverviewحذف کن- تست build موفق
نکات مهم
- هیچ فایلی حذف نشده - فقط از build exclude شدند
- Proto های local از ProjectReference استفاده میکنند نه NuGet
- MudBlazor 8.14.0 نیاز به
Tparameter برای generic components دارد - Snackbar در
_Imports.razorinject شده، نباید در component ها duplicate بشه