84 lines
3.7 KiB
C#
84 lines
3.7 KiB
C#
using System.Globalization;
|
|
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 TotalTimeMinute,string RemainingTimeMinute );
|
|
|
|
public record ProjectBoardDetailUserResponse
|
|
{
|
|
public List<ProjectBoardDetailUserHistoryResponse> Histories { get; init; }
|
|
public string UserFullName { get; init; }
|
|
public string SpentTimeMinute { get; init; }
|
|
public long UserId { get; init; }
|
|
}
|
|
|
|
public record ProjectBoardDetailUserHistoryResponse
|
|
{
|
|
public string Date { get; init; }
|
|
public string startTime { get; init; }
|
|
public string EndTime { get; init; }
|
|
public string TotalTimeMinute { get; init; }
|
|
}
|
|
|
|
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)
|
|
.Include(x=>x.AdditionalTimes)
|
|
.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 totalActivityTimeSpan = section.Activities
|
|
.Select(x => x.GetTimeSpent())
|
|
.Aggregate(TimeSpan.Zero, (sum, next) => sum.Add(next));
|
|
|
|
var finalTime = section.FinalEstimatedHours;
|
|
|
|
var remainingTimeSpan = finalTime >= totalActivityTimeSpan
|
|
? TimeSpan.FromTicks(finalTime.Ticks - totalActivityTimeSpan.Ticks)
|
|
: TimeSpan.Zero;
|
|
var users = section.Activities.GroupBy(x => x.UserId).Select(x =>
|
|
{
|
|
return new ProjectBoardDetailUserResponse()
|
|
{
|
|
UserId = x.Key,
|
|
UserFullName = usersDict[x.Key],
|
|
SpentTimeMinute = ((int)TimeSpan.FromTicks(x.Sum(h=>h.GetTimeSpent().Ticks)).TotalMinutes).ToString(CultureInfo.InvariantCulture),
|
|
Histories = x.Select(h => new ProjectBoardDetailUserHistoryResponse()
|
|
{
|
|
Date = h.StartDate.ToFarsi(),
|
|
startTime = h.StartDate.ToString("HH:mm"),
|
|
EndTime = h.EndDate?.ToString("HH:mm") ?? "-",
|
|
TotalTimeMinute = h.GetTimeSpent().TotalMinutes.ToString("F0",CultureInfo.InvariantCulture)
|
|
}).ToList()
|
|
};
|
|
}).ToList();
|
|
var response = new ProjectBoardDetailResponse(users, $"{(int)finalTime.TotalMinutes}",
|
|
$"{(int)remainingTimeSpan.TotalMinutes:D2}");
|
|
return OperationResult<ProjectBoardDetailResponse>.Success(response);
|
|
}
|
|
} |