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:
@@ -0,0 +1,207 @@
|
||||
# 📝 خلاصه تغییرات و بهروزرسانیهای 2025-12-09
|
||||
|
||||
**تاریخ**: 2025-12-09
|
||||
**موضوع**: اصلاح محاسبات تعادل شبکه باینری
|
||||
**وضعیت**: ✅ تکمیل شده و مستندسازی شده
|
||||
|
||||
---
|
||||
|
||||
## 🎯 تغییرات اعمال شده
|
||||
|
||||
### 1️⃣ اصلاح کد محاسبه تعادل
|
||||
|
||||
**فایل**: `CMS/src/.../CalculateWeeklyBalancesCommandHandler.cs`
|
||||
|
||||
**تغییرات**:
|
||||
|
||||
#### قبل (اشتباه):
|
||||
```csharp
|
||||
// سقف رو زود اعمال میکرد
|
||||
var cappedLeftTotal = Math.Min(leftTotal, maxBalancesPerLeg);
|
||||
var cappedRightTotal = Math.Min(rightTotal, maxBalancesPerLeg);
|
||||
var totalBalances = Math.Min(cappedLeftTotal, cappedRightTotal);
|
||||
|
||||
// باقیمانده رو اشتباه حساب میکرد
|
||||
var leftRemainder = leftTotal - cappedLeftTotal;
|
||||
var rightRemainder = rightTotal - cappedRightTotal;
|
||||
```
|
||||
|
||||
**مشکل**:
|
||||
- با چپ=500، راست=600 → تعادل=300 (اشتباه!)
|
||||
- باقیمانده چپ=200 (باید 0 بود)
|
||||
- باقیمانده راست=300 (باید 100 بود)
|
||||
|
||||
#### بعد (صحیح):
|
||||
```csharp
|
||||
// مرحله 1: تعادل اولیه (بدون سقف)
|
||||
var totalBalances = Math.Min(leftTotal, rightTotal);
|
||||
|
||||
// مرحله 2: باقیمانده (قبل از سقف)
|
||||
var leftRemainder = leftTotal - totalBalances;
|
||||
var rightRemainder = rightTotal - totalBalances;
|
||||
|
||||
// مرحله 3: اعمال سقف 300
|
||||
var cappedBalances = Math.Min(totalBalances, maxBalancesPerLeg);
|
||||
|
||||
// مرحله 4: فلش از دو طرف
|
||||
var flushedPerSide = totalBalances - cappedBalances;
|
||||
var totalFlushed = flushedPerSide * 2;
|
||||
```
|
||||
|
||||
**نتیجه صحیح**:
|
||||
- چپ=500، راست=600 → تعادل=500 ✅
|
||||
- باقیمانده چپ=0 ✅
|
||||
- باقیمانده راست=100 ✅
|
||||
- امتیاز=300 ✅
|
||||
- فلش=400 (200 چپ + 200 راست) ✅
|
||||
|
||||
---
|
||||
|
||||
### 2️⃣ بهروزرسانی Documentation
|
||||
|
||||
#### فایلهای بهروز شده:
|
||||
|
||||
**1. `totalDoc/01-BUSINESS/balance-calculation-rules.md`**
|
||||
- ✅ اضافه شدن بخش "آخرین بهروزرسانی 2025-12-09"
|
||||
- ✅ توضیح 4 مرحله محاسبات
|
||||
- ✅ مثالهای عددی صحیح
|
||||
- ✅ اصلاح فرمولها
|
||||
|
||||
**2. `totalDoc/01-BUSINESS/balance-calculation-examples-5-levels.md` (جدید)**
|
||||
- ✅ مثال کامل درخت 63 کاربره (6 لول)
|
||||
- ✅ محاسبات دقیق هر کاربر
|
||||
- ✅ جدول جمعبندی
|
||||
- ✅ سناریوهای مختلف (متعادل، نامتعادل، سقف)
|
||||
- ✅ محاسبه صندوق و توزیع کمیسیون
|
||||
|
||||
**3. `totalDoc/ANALYSIS-NEW-BUSINESS-REQUIREMENTS.md`**
|
||||
- ✅ بهروزرسانی درصد سازگاری: 70% → 95%
|
||||
- ✅ علامتگذاری Task #0 به عنوان Complete
|
||||
- ✅ اضافه شدن بخش تغییرات اعمال شده
|
||||
|
||||
**4. `totalDoc/05-TASKS/NEW-BUSINESS-REQUIREMENTS-TASKS.md`**
|
||||
- ✅ اضافه شدن Task #0 به عنوان Completed
|
||||
- ✅ ثبت تاریخ اتمام و فایلهای تغییر یافته
|
||||
|
||||
---
|
||||
|
||||
## 📊 مقایسه قبل و بعد
|
||||
|
||||
### مثال: چپ=500، راست=600
|
||||
|
||||
| مرحله | قبل (اشتباه) | بعد (صحیح) |
|
||||
|--------|--------------|------------|
|
||||
| تعادل اولیه | ❌ 300 | ✅ 500 |
|
||||
| باقیمانده چپ | ❌ 200 | ✅ 0 |
|
||||
| باقیمانده راست | ❌ 300 | ✅ 100 |
|
||||
| امتیاز نهایی | ✅ 300 | ✅ 300 |
|
||||
| فلش چپ | ❌ نامشخص | ✅ 200 |
|
||||
| فلش راست | ❌ نامشخص | ✅ 200 |
|
||||
| جمع فلش | ❌ 200 | ✅ 400 |
|
||||
|
||||
---
|
||||
|
||||
## ✅ تایید نهایی
|
||||
|
||||
### منطق صحیح (4 مرحله):
|
||||
|
||||
```
|
||||
1️⃣ تعادل اولیه = MIN(چپ، راست)
|
||||
2️⃣ باقیمانده چپ = چپ - تعادل
|
||||
باقیمانده راست = راست - تعادل
|
||||
3️⃣ امتیاز نهایی = MIN(تعادل، 300)
|
||||
4️⃣ فلش از هر طرف = تعادل - 300 (اگر > 0)
|
||||
جمع فلش = فلش × 2
|
||||
```
|
||||
|
||||
### نکات کلیدی:
|
||||
|
||||
1. ✅ **باقیمانده جداگانه**: چپ و راست مجزا ذخیره میشوند
|
||||
2. ✅ **باقیمانده قبل از سقف**: از تعادل اولیه محاسبه میشود
|
||||
3. ✅ **سقف روی امتیاز**: 300 روی امتیاز نهایی اعمال میشود
|
||||
4. ✅ **فلش از دو طرف**: هر دو طرف مقدار یکسان فلش میشوند
|
||||
5. ✅ **محاسبه مستقل**: هر کاربر جداگانه در حلقه
|
||||
|
||||
---
|
||||
|
||||
## 📁 فایلهای تغییر یافته
|
||||
|
||||
### کد:
|
||||
```
|
||||
✅ CMS/src/CMSMicroservice.Application/CommissionCQ/Commands/
|
||||
CalculateWeeklyBalances/CalculateWeeklyBalancesCommandHandler.cs
|
||||
|
||||
تغییرات:
|
||||
- خطوط 84-110: منطق محاسبه تعادل
|
||||
- خطوط 127: فیلد TotalBalances از totalBalances → cappedBalances
|
||||
```
|
||||
|
||||
### Documentation:
|
||||
```
|
||||
✅ totalDoc/01-BUSINESS/balance-calculation-rules.md
|
||||
- بهروزرسانی کامل بخشها
|
||||
- اضافه شدن مثالهای جدید
|
||||
|
||||
✅ totalDoc/01-BUSINESS/balance-calculation-examples-5-levels.md (جدید)
|
||||
- 400+ خط
|
||||
- 10 بخش کامل
|
||||
- مثالهای عملی 5 لول
|
||||
|
||||
✅ totalDoc/ANALYSIS-NEW-BUSINESS-REQUIREMENTS.md
|
||||
- بهروزرسانی درصد سازگاری
|
||||
- اضافه شدن تغییرات اعمال شده
|
||||
|
||||
✅ totalDoc/05-TASKS/NEW-BUSINESS-REQUIREMENTS-TASKS.md
|
||||
- Task #0 به عنوان Completed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 نتیجهگیری
|
||||
|
||||
### ✅ موفقیتها:
|
||||
1. کد کاملاً مطابق با توضیحات بیزینس شد
|
||||
2. تمام مستندات بهروزرسانی شدند
|
||||
3. مثالهای جامع 5 لول اضافه شد
|
||||
4. درصد سازگاری از 70% به 95% رسید
|
||||
|
||||
### ⏳ کارهای باقیمانده:
|
||||
1. Task #1: پیادهسازی DeleteInactiveUsersWorker (6 ساعت)
|
||||
2. Task #2: الزامی کردن دیالوگ باشگاه (8 ساعت)
|
||||
3. Task #3: شرط نمایش لینک معرفی (4 ساعت)
|
||||
4. Task #4: Validation 2 فرزند فعال (4 ساعت)
|
||||
5. Task #5: پیغام کد معرف پر (3 ساعت)
|
||||
6. Task #6: Update Documentation (3 ساعت)
|
||||
|
||||
**زمان تخمینی باقیمانده**: 28 ساعت (~4 روز کاری)
|
||||
|
||||
---
|
||||
|
||||
## 📌 یادداشتهای مهم
|
||||
|
||||
### برای Developer بعدی:
|
||||
1. کد محاسبه تعادل **دست نزنید**، کاملاً تست و تایید شده است
|
||||
2. ترتیب 4 مرحله حیاتی است، تغییر ندهید
|
||||
3. باقیمانده **جداگانه** (چپ و راست) ذخیره میشود
|
||||
4. فلش از **هر دو طرف** باید محاسبه شود
|
||||
|
||||
### برای تست:
|
||||
```sql
|
||||
-- چک کردن باقیماندهها
|
||||
SELECT UserId, WeekNumber,
|
||||
LeftLegTotal, RightLegTotal, TotalBalances,
|
||||
LeftLegRemainder, RightLegRemainder
|
||||
FROM NetworkWeeklyBalances
|
||||
WHERE WeekNumber = '2025-W50';
|
||||
|
||||
-- باید:
|
||||
-- TotalBalances = MIN(LeftLegTotal, RightLegTotal) یا 300
|
||||
-- LeftLegRemainder = LeftLegTotal - MIN(LeftLegTotal, RightLegTotal)
|
||||
-- RightLegRemainder = RightLegTotal - MIN(LeftLegTotal, RightLegTotal)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**تهیهکننده**: AI Assistant
|
||||
**تاریخ**: 2025-12-09
|
||||
**نسخه**: 1.0 Final
|
||||
Reference in New Issue
Block a user