feat: implement commission calculation strategy with ORM and SP options
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 1m43s

This commit is contained in:
masoodafar-web
2025-12-20 03:15:28 +03:30
parent 9864302bab
commit 25476ba120
18 changed files with 1687 additions and 21 deletions
@@ -0,0 +1,48 @@
namespace CMSMicroservice.Application.Common.Interfaces;
/// <summary>
/// استراتژی محاسبه کمیسیون هفتگی
/// دو پیاده‌سازی دارد: ORM و Stored Procedure
/// </summary>
public interface ICommissionCalculationStrategy
{
/// <summary>
/// محاسبه تعادل‌های هفتگی (مرحله 1)
/// </summary>
/// <param name="weekDefinitionId">شناسه هفته</param>
/// <param name="forceRecalculate">محاسبه مجدد حتی اگر قبلاً محاسبه شده</param>
/// <param name="cancellationToken">توکن لغو</param>
/// <returns>تعداد رکوردهای محاسبه شده</returns>
Task<int> CalculateWeeklyBalancesAsync(
long weekDefinitionId,
bool forceRecalculate,
CancellationToken cancellationToken = default);
/// <summary>
/// محاسبه استخر کمیسیون و پرداخت‌ها (مرحله 2)
/// </summary>
/// <param name="weekDefinitionId">شناسه هفته</param>
/// <param name="forceRecalculate">محاسبه مجدد حتی اگر قبلاً محاسبه شده</param>
/// <param name="cancellationToken">توکن لغو</param>
/// <returns>شناسه Pool ایجاد شده</returns>
Task<long> CalculateWeeklyCommissionPoolAsync(
long weekDefinitionId,
bool forceRecalculate,
CancellationToken cancellationToken = default);
}
/// <summary>
/// نوع استراتژی محاسبه کمیسیون
/// </summary>
public enum CommissionCalculationStrategyType
{
/// <summary>
/// استفاده از Entity Framework (ORM) - پیش‌فرض
/// </summary>
Orm = 0,
/// <summary>
/// استفاده از Stored Procedure - بهینه‌تر برای داده‌های زیاد
/// </summary>
StoredProcedure = 1
}
@@ -0,0 +1,20 @@
namespace CMSMicroservice.Application.Common.Interfaces;
/// <summary>
/// Factory برای ایجاد Strategy مناسب براساس Config
/// </summary>
public interface ICommissionCalculationStrategyFactory
{
/// <summary>
/// ایجاد Strategy براساس تنظیمات سیستم
/// </summary>
/// <returns>استراتژی مناسب (ORM یا SP)</returns>
Task<ICommissionCalculationStrategy> CreateStrategyAsync(CancellationToken cancellationToken = default);
/// <summary>
/// ایجاد Strategy مشخص
/// </summary>
/// <param name="strategyType">نوع استراتژی</param>
/// <returns>استراتژی درخواستی</returns>
ICommissionCalculationStrategy CreateStrategy(CommissionCalculationStrategyType strategyType);
}