feat: implement unified command for Daya loan status check and processing - Refactored DayaLoanCheckWorker to use CheckAndProcessDayaLoansCommand, enhancing functionality and logging
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 1m50s

This commit is contained in:
masoodafar-web
2025-12-27 02:30:40 +03:30
parent cd2549775a
commit 1dbb3ee502
12 changed files with 404 additions and 576 deletions
@@ -1,9 +1,7 @@
using Hangfire;
using MediatR;
using Microsoft.Extensions.Logging;
using CMSMicroservice.Application.DayaLoanCQ.Commands.CheckDayaLoanStatus;
using CMSMicroservice.Application.DayaLoanCQ.Commands.ProcessDayaLoanApproval;
using CMSMicroservice.Domain.Enums;
using CMSMicroservice.Application.DayaLoanCQ.Commands.CheckAndProcessDayaLoans;
using Microsoft.EntityFrameworkCore;
using CMSMicroservice.Infrastructure.Persistence;
using System.Linq;
@@ -11,7 +9,7 @@ using System.Linq;
namespace CMSMicroservice.WebApi.Workers;
/// <summary>
/// Worker برای استعلام خودکار وضعیت وام دایا (هر 15 دقیقه)
/// Worker برای استعلام خودکار وضعیت وام دایا و پردازش خودکار (هر 20 دقیقه)
/// </summary>
public class DayaLoanCheckWorker
{
@@ -39,18 +37,15 @@ public class DayaLoanCheckWorker
try
{
// پیدا کردن کاربرانی که:
// 1. اعتبار دایا را دریافت نکرده‌اند
// 2. کد ملی دارند
// 3. قبلاً شماره قرارداد نگرفته‌اند
var pendingUsers = await _context.Users
.Where(u =>
u.HasReceivedDayaCredit == false &&
u.NationalCode != null &&
u.NationalCode != ""
)
.Select(u => new { u.Id, u.NationalCode })
u.NationalCode != "")
.Select(u => u.NationalCode!)
.ToListAsync();
if (!pendingUsers.Any())
@@ -61,47 +56,19 @@ public class DayaLoanCheckWorker
_logger.LogInformation("Found {Count} users with pending Daya loan status", pendingUsers.Count);
// استعلام از دایا
var checkCommand = new CheckDayaLoanStatusCommand
// استعلام و پردازش یکجا با Command یکپارچه
var command = new CheckAndProcessDayaLoansCommand
{
NationalCodes = pendingUsers.Select(u => u.NationalCode).ToList()
NationalCodes = pendingUsers
};
var checkResult = await _mediator.Send(checkCommand);
var result = await _mediator.Send(command);
// پردازش نتایج
foreach (var result in checkResult.Results)
{
// فقط وضعیت PendingReceive را پردازش می‌کنیم (یعنی وام درخواست شده)
if (result.Status == DayaLoanStatus.PendingReceive && !string.IsNullOrEmpty(result.ContractNumber))
{
var user = pendingUsers.FirstOrDefault(u => u.NationalCode == result.NationalCode);
if (user != null)
{
try
{
// پردازش تایید وام و شارژ کیف پول
var processCommand = new ProcessDayaLoanApprovalCommand
{
UserId = user.Id,
ContractNumber = result.ContractNumber,
};
var processResult = await _mediator.Send(processCommand);
_logger.LogInformation("Daya loan processed for user {UserId}. Contract: {ContractNumber}",
user.Id, result.ContractNumber);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing Daya loan for user {UserId}", user.Id);
}
}
}
}
_logger.LogInformation("DayaLoanCheckWorker completed. Checked: {Total}, Processed: {Success}",
checkResult.TotalChecked, checkResult.SuccessCount);
_logger.LogInformation(
"DayaLoanCheckWorker completed. Checked: {Total}, WithContract: {WithContract}, Processed: {Processed}",
result.TotalChecked,
result.WithContractCount,
result.ProcessedCount);
}
catch (Exception ex)
{
@@ -111,15 +78,14 @@ public class DayaLoanCheckWorker
}
/// <summary>
/// متد برای Schedule کردن Worker (هر 15 دقیقه)
/// متد برای Schedule کردن Worker (هر 20 دقیقه)
/// </summary>
public static void Schedule(IRecurringJobManager recurringJobManager)
{
// هر 15 دقیقه: */15 * * * *
recurringJobManager.AddOrUpdate<DayaLoanCheckWorker>(
"daya-loan-check",
worker => worker.ExecuteAsync(),
"*/20 * * * *", // هر 15 دقیقه
"*/20 * * * *",
TimeZoneInfo.Local
);
}