74 lines
3.1 KiB
C#
74 lines
3.1 KiB
C#
using GozareshgirProgramManager.Application._Common.Interfaces;
|
|
using GozareshgirProgramManager.Application._Common.Models;
|
|
using GozareshgirProgramManager.Domain._Common;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace GozareshgirProgramManager.Application.Modules.Projects.Queries.ProjectBoardDetail;
|
|
|
|
public record ProjectBoardDetailQuery(Guid SectionId) : IBaseQuery<ProjectBoardDetailResponse>;
|
|
|
|
public record ProjectBoardDetailResponse(List<ProjectBoardDetailUserResponse> Users, string TotalTime);
|
|
|
|
public record ProjectBoardDetailUserResponse
|
|
{
|
|
public List<ProjectBoardDetailUserHistoryResponse> Histories { get; set; } = new();
|
|
public string UserFullName { get; set; }
|
|
public long UserId { get; set; }
|
|
}
|
|
|
|
public class ProjectBoardDetailUserHistoryResponse
|
|
{
|
|
public string Date { get; set; }
|
|
public string startTime { get; set; }
|
|
public string EndTime { get; set; }
|
|
public string TotalTime { get; set; }
|
|
}
|
|
|
|
public class ProjectBoardDetailQueryHandler : IBaseQueryHandler<ProjectBoardDetailQuery, ProjectBoardDetailResponse>
|
|
{
|
|
private readonly IProgramManagerDbContext _programManagerDbContext;
|
|
|
|
public ProjectBoardDetailQueryHandler(IProgramManagerDbContext programManagerDbContext)
|
|
{
|
|
_programManagerDbContext = programManagerDbContext;
|
|
}
|
|
|
|
public async Task<OperationResult<ProjectBoardDetailResponse>> Handle(ProjectBoardDetailQuery request,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
var section = await _programManagerDbContext.TaskSections
|
|
.Include(x => x.Activities)
|
|
.FirstOrDefaultAsync(x => x.Id == request.SectionId, cancellationToken: cancellationToken);
|
|
|
|
if (section == null)
|
|
return OperationResult<ProjectBoardDetailResponse>.NotFound("بخش مورد نظر یافت نشد");
|
|
|
|
var userIds = section.Activities.Select(x => x.UserId).Distinct().ToList();
|
|
|
|
var usersDict = await _programManagerDbContext.Users
|
|
.Where(x => userIds.Contains(x.Id))
|
|
.ToDictionaryAsync(x => x.Id, x => x.FullName, cancellationToken);
|
|
|
|
var totalTimeSpan = section.Activities
|
|
.Select(x => x.GetTimeSpent())
|
|
.Aggregate(TimeSpan.Zero, (sum, next) => sum.Add(next));
|
|
|
|
var users = section.Activities.GroupBy(x => x.UserId).Select(x =>
|
|
{
|
|
return new ProjectBoardDetailUserResponse()
|
|
{
|
|
UserId = x.Key,
|
|
UserFullName = usersDict[x.Key],
|
|
Histories = x.Select(h => new ProjectBoardDetailUserHistoryResponse()
|
|
{
|
|
Date = h.StartDate.ToFarsi(),
|
|
startTime = h.StartDate.ToString("HH:mm"),
|
|
EndTime = h.EndDate?.ToString("HH:mm") ?? "-",
|
|
TotalTime = h.GetTimeSpent().ToString(@"hh\:mm")
|
|
}).ToList()
|
|
};
|
|
}).ToList();
|
|
var response = new ProjectBoardDetailResponse(users, $"{(int)totalTimeSpan.TotalHours}:{totalTimeSpan.Minutes:D2}");
|
|
return OperationResult<ProjectBoardDetailResponse>.Success(response);
|
|
}
|
|
} |