From 41e7f29a0dc41f5ea82e1315997030e6a715739a Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Mon, 4 May 2026 02:31:26 +0330 Subject: [PATCH] feat: add PackageId to CalculateWeeklyCommissionPoolCommand and related logic for package-specific calculations --- .../CalculateWeeklyCommissionPoolCommand.cs | 5 +++ ...ulateWeeklyCommissionPoolCommandHandler.cs | 37 +++++++++++++++---- .../BackgroundJobs/WeeklyCommissionJob.cs | 12 +++--- .../sp_CalculateWeeklyBalances.sql | 16 ++++++-- .../OrmCommissionCalculationStrategy.cs | 37 +++++++++++++++---- 5 files changed, 82 insertions(+), 25 deletions(-) diff --git a/src/CMSMicroservice.Application/CommissionCQ/Commands/CalculateWeeklyCommissionPool/CalculateWeeklyCommissionPoolCommand.cs b/src/CMSMicroservice.Application/CommissionCQ/Commands/CalculateWeeklyCommissionPool/CalculateWeeklyCommissionPoolCommand.cs index 136067c..de708c1 100644 --- a/src/CMSMicroservice.Application/CommissionCQ/Commands/CalculateWeeklyCommissionPool/CalculateWeeklyCommissionPoolCommand.cs +++ b/src/CMSMicroservice.Application/CommissionCQ/Commands/CalculateWeeklyCommissionPool/CalculateWeeklyCommissionPoolCommand.cs @@ -10,6 +10,11 @@ public record CalculateWeeklyCommissionPoolCommand : IRequest /// public long WeekDefinitionId { get; init; } + /// + /// شناسه پکیج — اگر مقدار داشته باشد فقط همین پکیج محاسبه می‌شود. + /// + public long? PackageId { get; init; } + /// /// آیا محاسبه مجدد انجام شود؟ /// diff --git a/src/CMSMicroservice.Application/CommissionCQ/Commands/CalculateWeeklyCommissionPool/CalculateWeeklyCommissionPoolCommandHandler.cs b/src/CMSMicroservice.Application/CommissionCQ/Commands/CalculateWeeklyCommissionPool/CalculateWeeklyCommissionPoolCommandHandler.cs index 38e814f..39f6974 100644 --- a/src/CMSMicroservice.Application/CommissionCQ/Commands/CalculateWeeklyCommissionPool/CalculateWeeklyCommissionPoolCommandHandler.cs +++ b/src/CMSMicroservice.Application/CommissionCQ/Commands/CalculateWeeklyCommissionPool/CalculateWeeklyCommissionPoolCommandHandler.cs @@ -23,8 +23,17 @@ public class CalculateWeeklyCommissionPoolCommandHandler : IRequestHandler x.WeekDefinitionId == request.WeekDefinitionId, cancellationToken); + var existingPoolQuery = _context.WeeklyCommissionPools + .Where(x => x.WeekDefinitionId == request.WeekDefinitionId); + + if (request.PackageId.HasValue) + { + existingPoolQuery = existingPoolQuery.Where(x => x.PackageId == request.PackageId.Value); + } + + var existingPool = await existingPoolQuery + .OrderBy(x => x.Id) + .FirstOrDefaultAsync(cancellationToken); if (existingPool == null) { @@ -40,9 +49,15 @@ public class CalculateWeeklyCommissionPoolCommandHandler : IRequestHandler x.WeekDefinitionId == request.WeekDefinitionId) - .ToListAsync(cancellationToken); + var weeklyBalancesQuery = _context.NetworkWeeklyBalances + .Where(x => x.WeekDefinitionId == request.WeekDefinitionId); + + if (request.PackageId.HasValue) + { + weeklyBalancesQuery = weeklyBalancesQuery.Where(x => x.PackageId == request.PackageId.Value); + } + + var weeklyBalances = await weeklyBalancesQuery.ToListAsync(cancellationToken); if (!weeklyBalances.Any()) { @@ -76,9 +91,15 @@ public class CalculateWeeklyCommissionPoolCommandHandler : IRequestHandler p.WeekDefinitionId == request.WeekDefinitionId) - .ToListAsync(cancellationToken); + var oldPayoutsQuery = _context.UserCommissionPayouts + .Where(p => p.WeekDefinitionId == request.WeekDefinitionId); + + if (request.PackageId.HasValue) + { + oldPayoutsQuery = oldPayoutsQuery.Where(p => p.PackageId == request.PackageId.Value); + } + + var oldPayouts = await oldPayoutsQuery.ToListAsync(cancellationToken); if (oldPayouts.Any()) { diff --git a/src/CMSMicroservice.Infrastructure/BackgroundJobs/WeeklyCommissionJob.cs b/src/CMSMicroservice.Infrastructure/BackgroundJobs/WeeklyCommissionJob.cs index 5c12945..c298909 100644 --- a/src/CMSMicroservice.Infrastructure/BackgroundJobs/WeeklyCommissionJob.cs +++ b/src/CMSMicroservice.Infrastructure/BackgroundJobs/WeeklyCommissionJob.cs @@ -159,14 +159,16 @@ public class WeeklyCommissionJob long weekDefinitionId, CancellationToken cancellationToken) { - // Check idempotency: Skip if already calculated - var existingPool = await _context.WeeklyCommissionPools - .FirstOrDefaultAsync(x => x.WeekDefinitionId == weekDefinitionId, cancellationToken); + // Skip only when all pools for the week are already calculated. + var hasAnyPool = await _context.WeeklyCommissionPools + .AnyAsync(x => x.WeekDefinitionId == weekDefinitionId, cancellationToken); + var hasPendingPool = await _context.WeeklyCommissionPools + .AnyAsync(x => x.WeekDefinitionId == weekDefinitionId && !x.IsCalculated, cancellationToken); - if (existingPool != null && existingPool.IsCalculated) + if (hasAnyPool && !hasPendingPool) { _logger.LogWarning( - "⚠️ [{ExecutionId}] WeekDefinitionId={WeekDefinitionId} already calculated. Skipping.", + "⚠️ [{ExecutionId}] WeekDefinitionId={WeekDefinitionId} already fully calculated. Skipping.", executionId, weekDefinitionId); return; } diff --git a/src/CMSMicroservice.Infrastructure/Persistence/StoredProcedures/sp_CalculateWeeklyBalances.sql b/src/CMSMicroservice.Infrastructure/Persistence/StoredProcedures/sp_CalculateWeeklyBalances.sql index cc1428f..5f5b93a 100644 --- a/src/CMSMicroservice.Infrastructure/Persistence/StoredProcedures/sp_CalculateWeeklyBalances.sql +++ b/src/CMSMicroservice.Infrastructure/Persistence/StoredProcedures/sp_CalculateWeeklyBalances.sql @@ -69,17 +69,25 @@ BEGIN -- ============================================= -- 2. بررسی محاسبه قبلی -- ============================================= - IF EXISTS (SELECT 1 FROM CMS.NetworkWeeklyBalances WHERE WeekDefinitionId = @WeekDefinitionId) + IF EXISTS ( + SELECT 1 + FROM CMS.NetworkWeeklyBalances + WHERE WeekDefinitionId = @WeekDefinitionId + AND PackageId = @PackageId + ) BEGIN IF @ForceRecalculate = 0 BEGIN - SET @ErrorMessage = N'تعادل‌های هفته ' + CAST(@WeekDefinitionId AS NVARCHAR(20)) + N' قبلاً محاسبه شده است. برای محاسبه مجدد از ForceRecalculate استفاده کنید'; + SET @ErrorMessage = N'تعادل‌های هفته ' + CAST(@WeekDefinitionId AS NVARCHAR(20)) + + N' (پکیج ' + CAST(@PackageId AS NVARCHAR(20)) + N') قبلاً محاسبه شده است. برای محاسبه مجدد از ForceRecalculate استفاده کنید'; RAISERROR(@ErrorMessage, 16, 1); RETURN; END - -- حذف محاسبات قبلی - DELETE FROM CMS.NetworkWeeklyBalances WHERE WeekDefinitionId = @WeekDefinitionId; + -- حذف محاسبات قبلی فقط برای همین پکیج + DELETE FROM CMS.NetworkWeeklyBalances + WHERE WeekDefinitionId = @WeekDefinitionId + AND PackageId = @PackageId; END -- ============================================= diff --git a/src/CMSMicroservice.Infrastructure/Services/Commission/OrmCommissionCalculationStrategy.cs b/src/CMSMicroservice.Infrastructure/Services/Commission/OrmCommissionCalculationStrategy.cs index 293f5ca..c2ffc4e 100644 --- a/src/CMSMicroservice.Infrastructure/Services/Commission/OrmCommissionCalculationStrategy.cs +++ b/src/CMSMicroservice.Infrastructure/Services/Commission/OrmCommissionCalculationStrategy.cs @@ -222,8 +222,17 @@ public class OrmCommissionCalculationStrategy : ICommissionCalculationStrategy } // بررسی وجود استخر - var existingPool = await _context.WeeklyCommissionPools - .FirstOrDefaultAsync(x => x.WeekDefinitionId == weekDefinitionId, cancellationToken); + var existingPoolQuery = _context.WeeklyCommissionPools + .Where(x => x.WeekDefinitionId == weekDefinitionId); + + if (packageId.HasValue) + { + existingPoolQuery = existingPoolQuery.Where(x => x.PackageId == packageId.Value); + } + + var existingPool = await existingPoolQuery + .OrderBy(x => x.Id) + .FirstOrDefaultAsync(cancellationToken); if (existingPool == null) { @@ -239,9 +248,15 @@ public class OrmCommissionCalculationStrategy : ICommissionCalculationStrategy } // بررسی وجود تعادل‌های هفتگی - var weeklyBalances = await _context.NetworkWeeklyBalances - .Where(x => x.WeekDefinitionId == weekDefinitionId) - .ToListAsync(cancellationToken); + var weeklyBalancesQuery = _context.NetworkWeeklyBalances + .Where(x => x.WeekDefinitionId == weekDefinitionId); + + if (packageId.HasValue) + { + weeklyBalancesQuery = weeklyBalancesQuery.Where(x => x.PackageId == packageId.Value); + } + + var weeklyBalances = await weeklyBalancesQuery.ToListAsync(cancellationToken); if (!weeklyBalances.Any()) { @@ -269,9 +284,15 @@ public class OrmCommissionCalculationStrategy : ICommissionCalculationStrategy // حذف پرداخت‌های قبلی در صورت ForceRecalculate if (forceRecalculate) { - var oldPayouts = await _context.UserCommissionPayouts - .Where(p => p.WeekDefinitionId == weekDefinitionId) - .ToListAsync(cancellationToken); + var oldPayoutsQuery = _context.UserCommissionPayouts + .Where(p => p.WeekDefinitionId == weekDefinitionId); + + if (packageId.HasValue) + { + oldPayoutsQuery = oldPayoutsQuery.Where(p => p.PackageId == packageId.Value); + } + + var oldPayouts = await oldPayoutsQuery.ToListAsync(cancellationToken); if (oldPayouts.Any()) {