feat: refactor week number handling to use WeekDefinitionId across multiple entities and queries

This commit is contained in:
masoodafar-web
2025-12-19 10:41:22 +03:30
parent 3cb95dc349
commit 8b784101be
83 changed files with 17592 additions and 566 deletions
@@ -0,0 +1,45 @@
using CMSMicroservice.Application.Common.Models;
namespace CMSMicroservice.Application.CommissionCQ.Queries.GetWeekDefinitions;
/// <summary>
/// Query برای دریافت لیست هفته‌ها از کش (برای dropdown)
/// </summary>
public record GetWeekDefinitionsQuery : IRequest<GetWeekDefinitionsResponseDto>
{
//موقعیت صفحه بندی
public PaginationState? PaginationState { get; init; }
//مرتب سازی بر اساس
public string? SortBy { get; init; }
//فیلتر
public GetWeekDefinitionsFilter? Filter { get; init; }
}
/// <summary>
/// فیلترهای جستجوی هفته‌ها
/// </summary>
public class GetWeekDefinitionsFilter
{
//جستجوی متنی روی DisplayName (مثل "هفته یک")
public string? SearchText { get; set; }
//شماره ترتیب هفته
public int? WeekOrder { get; set; }
//شماره هفته میلادی (2025-W46)
public string? GregorianWeekNumber { get; set; }
//شماره هفته شمسی (1404-W35)
public string? PersianWeekNumber { get; set; }
//سال میلادی
public int? GregorianYear { get; set; }
//سال شمسی
public int? PersianYear { get; set; }
//فقط هفته‌های فعال
public bool? IsActive { get; set; }
}
@@ -0,0 +1,130 @@
using CMSMicroservice.Application.Common.Interfaces;
namespace CMSMicroservice.Application.CommissionCQ.Queries.GetWeekDefinitions;
/// <summary>
/// Handler برای دریافت لیست هفته‌ها از کش
/// </summary>
public class GetWeekDefinitionsQueryHandler : IRequestHandler<GetWeekDefinitionsQuery, GetWeekDefinitionsResponseDto>
{
private readonly IWeekDefinitionRepository _weekDefinitionRepository;
public GetWeekDefinitionsQueryHandler(IWeekDefinitionRepository weekDefinitionRepository)
{
_weekDefinitionRepository = weekDefinitionRepository;
}
public Task<GetWeekDefinitionsResponseDto> Handle(
GetWeekDefinitionsQuery request,
CancellationToken cancellationToken)
{
// گرفتن همه هفته‌ها از کش
var allWeeks = _weekDefinitionRepository.GetAllWeeks();
// اعمال فیلترها
var filteredWeeks = allWeeks.AsEnumerable();
if (request.Filter != null)
{
var filter = request.Filter;
// جستجوی متنی روی DisplayName
if (!string.IsNullOrWhiteSpace(filter.SearchText))
{
filteredWeeks = filteredWeeks.Where(w =>
w.DisplayName.Contains(filter.SearchText, StringComparison.OrdinalIgnoreCase));
}
// فیلتر بر اساس WeekOrder
if (filter.WeekOrder.HasValue)
{
filteredWeeks = filteredWeeks.Where(w => w.WeekOrder == filter.WeekOrder.Value);
}
// فیلتر بر اساس GregorianWeekNumber
if (!string.IsNullOrWhiteSpace(filter.GregorianWeekNumber))
{
filteredWeeks = filteredWeeks.Where(w =>
w.GregorianWeekNumber == filter.GregorianWeekNumber);
}
// فیلتر بر اساس PersianWeekNumber
if (!string.IsNullOrWhiteSpace(filter.PersianWeekNumber))
{
filteredWeeks = filteredWeeks.Where(w =>
w.PersianWeekNumber == filter.PersianWeekNumber);
}
// فیلتر بر اساس سال میلادی
if (filter.GregorianYear.HasValue)
{
filteredWeeks = filteredWeeks.Where(w => w.GregorianYear == filter.GregorianYear.Value);
}
// فیلتر بر اساس سال شمسی
if (filter.PersianYear.HasValue)
{
filteredWeeks = filteredWeeks.Where(w => w.PersianYear == filter.PersianYear.Value);
}
// فیلتر بر اساس فعال بودن
if (filter.IsActive.HasValue)
{
filteredWeeks = filteredWeeks.Where(w => w.IsActive == filter.IsActive.Value);
}
}
// مرتب‌سازی
filteredWeeks = request.SortBy?.ToLower() switch
{
"weekorder_desc" => filteredWeeks.OrderByDescending(w => w.WeekOrder),
"displayname" => filteredWeeks.OrderBy(w => w.DisplayName),
"displayname_desc" => filteredWeeks.OrderByDescending(w => w.DisplayName),
"startdate" => filteredWeeks.OrderBy(w => w.StartDate),
"startdate_desc" => filteredWeeks.OrderByDescending(w => w.StartDate),
_ => filteredWeeks.OrderBy(w => w.WeekOrder) // پیش‌فرض: weekorder
};
// تعداد کل قبل از صفحه‌بندی
var weeksList = filteredWeeks.ToList();
var totalCount = weeksList.Count;
// صفحه‌بندی
if (request.PaginationState != null)
{
var pageNumber = request.PaginationState.PageNumber > 0 ? request.PaginationState.PageNumber : 1;
var pageSize = request.PaginationState.PageSize > 0 ? request.PaginationState.PageSize : 20;
weeksList = weeksList
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.ToList();
}
// گرفتن هفته جاری برای مشخص کردن IsCurrentWeek
var currentWeek = _weekDefinitionRepository.GetCurrentWeek();
// تبدیل به DTO
var weekDtos = weeksList.Select(w => new WeekDefinitionItemDto
{
WeekOrder = w.WeekOrder,
DisplayName = w.DisplayName,
GregorianWeekNumber = w.GregorianWeekNumber,
PersianWeekNumber = w.PersianWeekNumber,
StartDate = w.StartDate,
EndDate = w.EndDate,
GregorianYear = w.GregorianYear,
PersianYear = w.PersianYear,
IsActive = w.IsActive,
IsCurrentWeek = currentWeek != null && w.WeekOrder == currentWeek.WeekOrder
}).ToList();
var response = new GetWeekDefinitionsResponseDto
{
Data = weekDtos,
TotalCount = totalCount
};
return Task.FromResult(response);
}
}
@@ -0,0 +1,49 @@
namespace CMSMicroservice.Application.CommissionCQ.Queries.GetWeekDefinitions;
/// <summary>
/// DTO برای پاسخ لیست هفته‌ها
/// </summary>
public class GetWeekDefinitionsResponseDto
{
//لیست هفته‌ها
public List<WeekDefinitionItemDto> Data { get; set; } = new();
//تعداد کل
public int TotalCount { get; set; }
}
/// <summary>
/// آیتم هفته برای dropdown
/// </summary>
public class WeekDefinitionItemDto
{
//شماره ترتیب هفته (1, 2, 3, ...)
public int WeekOrder { get; set; }
//نام نمایشی هفته (هفته یکم، هفته دوم، ...)
public string DisplayName { get; set; } = string.Empty;
//شماره هفته میلادی (2025-W46)
public string GregorianWeekNumber { get; set; } = string.Empty;
//شماره هفته شمسی (1404-W35)
public string PersianWeekNumber { get; set; } = string.Empty;
//تاریخ شروع هفته
public DateTime StartDate { get; set; }
//تاریخ پایان هفته
public DateTime EndDate { get; set; }
//سال میلادی
public int GregorianYear { get; set; }
//سال شمسی
public int PersianYear { get; set; }
//فعال بودن
public bool IsActive { get; set; }
//آیا هفته جاری است؟
public bool IsCurrentWeek { get; set; }
}