Implement Persian Date Conversion and Enhance User Network Information Service

- Added PersianDateTimeService for converting Gregorian dates to Persian format in the BackOffice frontend.
- Updated multiple frontend pages (Dashboard, UserPayouts, WorkerControl, UserNetworkInfo) to utilize the new Persian date service.
- Enhanced GetUserNetworkPositionDto with 28+ new fields for comprehensive user network data.
- Updated GetUserNetworkPositionQueryHandler to include new methods for calculating network statistics.
- Modified Protobuf messages to accommodate the new fields, increasing from 14 to 42.
- Refined week number calculation algorithm to ensure consistency across C# and SQL implementations.
- Created new CSV and Excel files for binary plan calculations.
- Ensured all changes are tested and validated for accuracy and performance.
This commit is contained in:
masoodafar-web
2025-12-20 06:15:59 +03:30
parent 13a3489765
commit 002e99f6bf
32 changed files with 10263 additions and 106 deletions
+59 -20
View File
@@ -2,7 +2,35 @@
> **FrontOffice**: رابط کاربری Blazor Server برای مشتریان نهایی سیستم FourSat
>
> **آخرین بروزرسانی**: ۱۴ آذر ۱۴۰۴
> **آخرین بروزرسانی**: ۲۸ آذر ۱۴۰۴ (18 دسامبر 2025)
---
## 🆕 تغییرات اخیر (۲۸ آذر ۱۴۰۴)
### ✅ نمودار درختی شبکه با d3-org-chart
- **کتابخانه**: d3-org-chart v3 + d3.js v7 + d3-flextree
- **OrganizationChart.razor**: بازنویسی کامل با JS Interop
- **امکانات**:
- نمایش درختی باینری شبکه
- دکمه‌های: باز کردن همه، بستن همه، مرکز، نمایش کامل، بروزرسانی
- انتخاب عمق درخت (2-10 سطح)
- کلیک روی نود برای دیدن زیرمجموعه‌ها
- دکمه‌های بازگشت و "درخت من"
- طراحی ریسپانسیو با MudBlazor
### ✅ API جدید: GetSubordinateTree
- **Proto**: `GetSubordinateTreeRequest` با `target_user_id`
- **BFF Handler**: `GetSubordinateTreeQueryHandler`
- **Frontend Service**: `GetSubordinateTreeAsync(targetUserId, maxDepth)`
- **امنیت**: Authentication با JWT (بدون بار اضافی چک زیرمجموعه)
### ✅ فایل‌های جدید/آپدیت شده:
- `wwwroot/js/org-chart.js` - JS Interop برای d3-org-chart
- `wwwroot/css/org-chart.css` - استایل‌های سفارشی نمودار
- `Pages/Profile/Components/OrganizationChart.razor` - کامپوننت نمودار
- `Pages/Profile/Components/OrganizationChart.razor.cs` - لاجیک کامپوننت
- `Utilities/NetworkMembershipService.cs` - متد جدید GetSubordinateTreeAsync
---
@@ -10,13 +38,13 @@
| بخش | وضعیت | درصد تکمیل | فایل‌ها |
|-----|-------|------------|---------|
| **UI Pages** | ✅ Build موفق | 75% | 24 صفحه |
| **BFF Handlers** | ⚠️ نیاز به اصلاح | 60% | 12 Handler |
| **Protobuf Packages** | ❌ ناقص | 40% | 3 Package |
| **Services** | ⚠️ Mock Data | 50% | 8 Service |
| **gRPC Connection** | ❌ غیرفعال | 0% | - |
| **UI Pages** | ✅ Build موفق | 85% | 24 صفحه |
| **BFF Handlers** | اصلاح شده | 80% | 14 Handler |
| **Protobuf Packages** | ✅ کامل | 90% | 5 Package |
| **Services** | ✅ اتصال واقعی | 80% | 8 Service |
| **gRPC Connection** | فعال | 90% | - |
**🎉 آخرین موفقیت**: Build موفق با 0 error و 113 warning (۱۴ آذر)
**🎉 آخرین موفقیت**: نمودار درختی d3-org-chart با کلیک روی نودها (۲۸ آذر)
---
@@ -109,12 +137,20 @@ FrontOffice/
- محاسبه خودکار هزینه (56M × ماه)
- ولیدیشن فرم و رویداد OnActivationSuccess
### 🌳 Network (2 صفحه)
- ⚠️ **Tree.razor** (در Profile): نمایش درخت دودویی
- از OrganizationChart component استفاده می‌کند
- **TODO**: باید به NetworkMembershipService.GetMyNetworkTree متصل شود
### 🌳 Network (2 صفحه) - **بروزرسانی شده** ✨
- **Tree.razor** (در Profile): نمایش درخت دودویی
- **d3-org-chart v3**: کتابخانه حرفه‌ای نمودار سازمانی
- **JS Interop**: ارتباط Blazor با JavaScript
- **امکانات**:
- نمایش درختی با zoom و pan
- کلیک روی نود → نمایش زیرمجموعه‌ها
- دکمه‌های عملیاتی (باز کردن، بستن، مرکز، نمایش کامل)
- انتخاب عمق (2-10 سطح)
- دکمه‌های بازگشت و "درخت من"
- طراحی ریسپانسیو
- **متصل به**: `NetworkMembershipService.GetMyNetworkTreeAsync` و `GetSubordinateTreeAsync`
-**NetworkStatisticsPage.razor**: آمار شبکه **جدید**
-**NetworkStatisticsPage.razor**: آمار شبکه
- 4 کارت آماری (کل، چپ، راست، عمق)
- Progress bar برای تعادل پاها
- MudChart.Donut برای توزیع
@@ -157,10 +193,11 @@ FrontOffice/
- `ActivateMembershipAsync(...)`: فعال‌سازی عضویت
- **⚠️ فعلا Mock**: بازمی‌گرداند `{ IsActive = false }`
7. **NetworkMembershipService**: مدیریت شبکه
7. **NetworkMembershipService**: مدیریت شبکه**بروزرسانی شده**
- `GetMyNetworkTreeAsync(maxDepth)`: درخت شبکه تا عمق 10
- `GetSubordinateTreeAsync(targetUserId, maxDepth)`: درخت زیرمجموعه **جدید**
- `GetMyNetworkStatisticsAsync()`: آمار کلی شبکه
- **⚠️ فعلا Mock**: 5 نود نمونه، 15 چپ + 12 راست = 27 عضو
- **✅ متصل به BFF**: gRPC واقعی
8. **CommissionService**: مدیریت کمیسیون
- `GetMyCommissionPayoutsAsync(...)`: لیست پرداخت‌ها با فیلتر و صفحه‌بندی
@@ -189,15 +226,17 @@ FrontOffice/
-**ActivateMyClubMembership** (Command)
- ⚠️ **مشکل**: Response Mock است، باید از `GetClubMembership` گرفته شود
#### 2. NetworkMembershipCQ (2 Handler)
#### 2. NetworkMembershipCQ (3 Handler) ✅ **کامل شده**
-**GetMyNetworkTree** (Query)
- ⚠️ **مشکل بزرگ**: CMS حالا Flat List بر می‌گرداند نه Tree Structure
- 🔧 **نیاز**: باید در BFF یک Tree Builder اضافه شود
- Tree Builder پیاده‌سازی شده
- تبدیل Flat List از CMS به Tree Structure
-**GetMyNetworkStatistics** (Query)
- ⚠️ **مشکل**: CMS دیگر `UserId` نمی‌گیرد (برای کل شبکه است)
- ⚠️ **مشکل**: فیلد `LastMember` وجود ندارد
- 🔧 **راه حل**: استفاده از `GetUserNetwork` + `GetNetworkTree`
- آمار کامل شبکه
- **GetSubordinateTree** (Query) **جدید**
- دریافت درخت یک زیرمجموعه
- امنیت: فقط با JWT معتبر
#### 3. CommissionCQ (2 Handler)
-**GetMyCommissionPayouts** (Query)