4ef4bfbeef
- payment-gateway.md: سکشن ۸-۱۳ (ZarinPal callback, تخفیف ۱۰۰٪, VAT, ExpirePendingOrders, DeliveryStatus mapping, Production deploy) - CICD-PIPELINE-GUIDE.md: باگ cross-deploy, قالب workflow Production, جدول مقایسه دو محیط - INFRASTRUCTURE-GUIDE.md: سرور Production (45.149.79.127), DB KBS, Proto v0.0.179 - DISCOUNT-STORE-STATUS.md: وضعیت Production Deploy, فلوی پرداخت جدید - SERVER-MIRRORS-CONFIG.md: registries.yaml سرور Production - INDEX.md: تاریخ, توضیحات بروز, لینکهای سریع جدید
10 KiB
10 KiB
فروشگاه تخفیفی — وضعیت پیادهسازی و تسکها
تاریخ: ۱۴۰۴/۱۱/۲۲ (2026-02-11) آخرین بروزرسانی: ۱۴۰۴/۱۱/۲۸ (2026-02-17) وضعیت کلی: بکند کامل ✅ | بکآفیس کامل ✅ | فرانتآفیس کامل ✅ | Production Deploy ✅
۱. خلاصه بیزینس
فروشگاه تخفیفی یک فروشگاه مجزا از فروشگاه معمولی است که:
- محصولات خاص خود را دارد (
DiscountProduct— نهProduct) - پرداخت ترکیبی (Hybrid) دارد:
- بخشی از موجودی کیف پول تخفیفی (
DiscountBalance) کسر میشود - مابقی از درگاه پرداخت (IPG) پرداخت میشود
- بخشی از موجودی کیف پول تخفیفی (
- هر محصول یک
MaxDiscountPercentدارد (مثلاً ۳۰٪) — حداکثر درصدی که از کیف تخفیفی قابل پرداخت است - مالیات فقط روی مبلغ درگاه محاسبه میشود
۲. وضعیت لایهها
✅ Domain Entities — کامل (۷ entity)
| Entity | مسیر | توضیح |
|---|---|---|
DiscountProduct |
CMS/.../Entities/DiscountStore/ |
محصول (Title, Price, MaxDiscountPercent, RemainingCount, ...) |
DiscountProductCategory |
↑ | دستهبندی درختی |
DiscountProductCategoryMapping |
↑ | M:N محصول ↔ دستهبندی |
DiscountProductImage |
↑ | گالری تصاویر |
DiscountShoppingCart |
↑ | سبد خرید (UserId, ProductId, Count) |
DiscountOrder |
↑ | سفارش (TotalAmount, DiscountBalanceUsed, GatewayAmountPaid, VAT) |
DiscountOrderDetail |
↑ | جزئیات سفارش (UnitPrice, DiscountPercent, DiscountAmount, FinalPrice) |
✅ EF Configurations — کامل (۷ فایل + ۶ migration)
✅ Application (CQRS) — کامل (~۵۰ فایل)
- DiscountProductCQ: Create, Update, Delete, GetById, GetProducts + Image CRUD
- DiscountCategoryCQ: Create, Update, Delete, GetCategories
- DiscountOrderCQ: PlaceOrder, CompleteOrderPayment, UpdateOrderStatus, GetById, GetUserOrders, GetAll, SalesReport
- DiscountShoppingCartCQ: AddToCart, RemoveFromCart, UpdateCount, GetUserCart, ClearCart
- WalletCQ: ChargeDiscountWallet, VerifyDiscountWalletCharge
✅ Proto Definitions — کامل (۴ فایل)
| Proto | Namespace | RPCs |
|---|---|---|
discountproduct.proto |
CMSMicroservice.Protobuf.Protos.DiscountProduct |
DiscountProductContract (10 RPCs) |
discountcategory.proto |
CMSMicroservice.Protobuf.Protos.DiscountCategory |
DiscountCategoryContract (4 RPCs) |
discountshoppingcart.proto |
CMSMicroservice.Protobuf.Protos.DiscountShoppingCart |
DiscountShoppingCartContract (5 RPCs) |
discountorder.proto |
CMSMicroservice.Protobuf.Protos.DiscountOrder |
DiscountOrderContract (7 RPCs) |
✅ gRPC Services (CMS WebApi) — کامل (۴ سرویس + mapping)
✅ BackOffice (Admin Panel) — کامل
- ۴ صفحه: محصولات، دستهبندیها، سفارشات، گزارش فروش
- ۵ کامپوننت: فرم محصول، فرم دستهبندی، گالری، جزئیات سفارش، تغییر وضعیت
- ۶ سرویس: DiscountProduct, DiscountCategory, DiscountOrder (+ interfaces)
- NavMenu: بخش "فروشگاه تخفیفی" با ۳ لینک (محصولات، دستهبندیها، سفارشات و گزارش)
- یکسانسازی UI (بهمن ۱۴۰۴): تمام صفحات فروشگاه تخفیفی بازنویسی شدند تا از
BasePageComponentاستفاده کنند و ظاهری یکسان با فروشگاه عادی داشته باشند → جزئیات
✅ FrontOffice (مشتری) — پیادهسازی شده!
فایلهای اضافه/ویرایش شده:
| فایل | نوع | توضیح |
|---|---|---|
Utilities/RouteConstants.cs |
ویرایش | اضافه شدن بخش DiscountStore (6 مسیر) |
ConfigureServices.cs |
ویرایش | ثبت 3 سرویس + 4 gRPC client |
Utilities/DiscountProductService.cs |
جدید | سرویس محصولات تخفیفی (GetProducts, GetById, GetCategories) |
Utilities/DiscountCartService.cs |
جدید | سرویس سبد خرید تخفیفی (Add, Remove, Update, Clear) |
Utilities/DiscountOrderService.cs |
جدید | سرویس سفارش تخفیفی (PlaceOrder, CompletePayment, GetOrders) |
Pages/DiscountStore/Products.razor(.cs) |
جدید | لیست محصولات (جستجو + فیلتر دستهبندی + صفحهبندی) |
Pages/DiscountStore/ProductDetail.razor(.cs) |
جدید | جزئیات محصول + گالری + افزودن به سبد |
Pages/DiscountStore/Cart.razor(.cs) |
جدید | سبد خرید (Desktop: Table / Mobile: Cards) |
Pages/DiscountStore/Checkout.razor(.cs) |
جدید | پرداخت ترکیبی (آدرس + اسلایدر تخفیف + درگاه) |
Pages/DiscountStore/Orders.razor(.cs) |
جدید | لیست سفارشات (پرداخت/ارسال) |
Pages/DiscountStore/OrderDetail.razor(.cs) |
جدید | جزئیات سفارش + خلاصه مالی |
Pages/Profile/Index.razor.cs |
ویرایش | تایل "فروشگاه تخفیفی" در داشبورد |
Shared/MainLayout.razor |
ویرایش | لینک ناوبری دسکتاپ + drawer موبایل |
wwwroot/css/site.css |
ویرایش | ریجن CSS اختصاصی Discount Store |
۳. تسکهای FrontOffice (ترتیب اجرا)
تسک ۱: Routes — اضافه کردن مسیرها
فایل: RouteConstants.cs
اضافه: public static class DiscountStore {
Products = "/discount-store"
ProductDetail = "/discount-store/product/"
Cart = "/discount-store/cart"
Checkout = "/discount-store/checkout"
Orders = "/discount-store/orders"
OrderDetail = "/discount-store/order/"
}
تسک ۲: gRPC Clients — ثبت DI
فایل: ConfigureServices.cs
اضافه:
using CMSMicroservice.Protobuf.Protos.DiscountProduct;
using CMSMicroservice.Protobuf.Protos.DiscountCategory;
using CMSMicroservice.Protobuf.Protos.DiscountShoppingCart;
using CMSMicroservice.Protobuf.Protos.DiscountOrder;
services.AddScoped(CreateAuthenticatedClient<DiscountProductContract.DiscountProductContractClient>);
services.AddScoped(CreateAuthenticatedClient<DiscountCategoryContract.DiscountCategoryContractClient>);
services.AddScoped(CreateAuthenticatedClient<DiscountShoppingCartContract.DiscountShoppingCartContractClient>);
services.AddScoped(CreateAuthenticatedClient<DiscountOrderContract.DiscountOrderContractClient>);
تسک ۳: Services — سرویسهای FrontOffice
فایلهای جدید در Utilities/:
DiscountProductService.cs — GetProducts (فیلتر + صفحهبندی), GetById, GetCategories
DiscountCartService.cs — Add, Remove, Update, GetCart, Clear + event OnChange
DiscountOrderService.cs — PlaceOrder, CompletePayment, GetUserOrders, GetOrderById
تسک ۴: صفحات Blazor
فایلهای جدید در Pages/DiscountStore/:
Products.razor + .cs — لیست محصولات (فیلتر دستهبندی + جستجو + صفحهبندی)
ProductDetail.razor + .cs — جزئیات محصول + گالری + افزودن به سبد
Cart.razor + .cs — سبد خرید (نمایش تخفیف هر آیتم)
Checkout.razor + .cs — پرداخت (انتخاب آدرس + تعیین مبلغ از تخفیفی + درگاه)
Orders.razor + .cs — لیست سفارشات
OrderDetail.razor + .cs — جزئیات سفارش + وضعیت ارسال
تسک ۵: Dashboard Tile
فایل: Profile/Index.razor.cs
اضافه: تایل "فروشگاه تخفیفی" بعد از تایل "فروشگاه" موجود
تسک ۶: Navigation
فایل: MainLayout.razor
اضافه: لینک "فروشگاه تخفیفی" در drawer موبایل + bottom nav (اختیاری)
تسک ۷: CSS
فایل: site.css
اضافه: استایلهای اختصاصی (checkout progress, discount badge, ...)
۴. فلوی پرداخت (مهم!)
کاربر سبد خرید دارد
↓
صفحه Checkout:
├─ انتخاب آدرس تحویل
├─ نمایش خلاصه سبد:
│ هر محصول: قیمت × تعداد
│ تخفیف هر محصول: price × count × maxDiscountPercent / 100
│ جمع کل / جمع تخفیف / مبلغ درگاه
├─ مالیات ۹٪ روی مبلغ درگاه
├─ مبلغ قابل پرداخت = مبلغ درگاه + مالیات
├─ ⚠️ تخفیف اجباری: همیشه حداکثر (MaxDiscountPercent) اعمال میشود
└─ [پرداخت]
↓
PlaceOrder RPC:
├─ بررسی موجودی + محاسبه (MaxDiscountPercent اجباری)
├─ ساخت سفارش (PaymentStatus=Pending)
├─ رزرو موجودی انبار
├─ اگر gateway_amount > 0 → ZarinPal payment_url
└─ اگر gateway_amount = 0 → سفارش مستقیم تکمیل
↓
ریدایرکت به ZarinPal
↓
Callback → CompleteOrderPayment RPC:
├─ success → کسر DiscountBalance + تأیید + PaymentTransaction + DeliveryStatus=Pending
└─ failure → آزادسازی رزرو انبار + PaymentStatus=Reject + DeliveryStatus=Cancelled
↓
ExpirePendingOrdersService (Background):
├─ هر ۵ دقیقه چک میکند
├─ سفارشات Pending بالای ۳۰ دقیقه → Reject + Cancelled
└─ آزادسازی رزرو انبار
۵. تخمین زمان
| تسک | تخمین |
|---|---|
| Routes + DI + Services | ۱ ساعت |
| Products + ProductDetail | ۲ ساعت |
| Cart | ۱ ساعت |
| Checkout (پیچیدهترین بخش) | ۲ ساعت |
| Orders + OrderDetail | ۱ ساعت |
| Dashboard tile + Nav | ۰.۵ ساعت |
| CSS + Polish | ۰.۵ ساعت |
| مجموع | ~۸ ساعت |