fix : Optimize Leave API

This commit is contained in:
Suphonchai Phoonsawat 2024-07-08 20:27:46 +07:00
parent 12733ea779
commit b3fb153bbf
2 changed files with 109 additions and 9 deletions

View file

@ -514,6 +514,93 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
await _appDbContext.SaveChangesAsync(); await _appDbContext.SaveChangesAsync();
} }
public async Task<List<GetSumApproveLeaveByTypeDto>> GetSumSendLeaveAsync(int year)
{
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.LeaveStartDate.Year == year)
.ToListAsync();
var res = (from d in data
group d by new { d.KeycloakUserId, LeaveTypeId = d.Type.Id, LeaveTypeCode = d.Type.Code } into grp
select new GetSumApproveLeaveByTypeDto
{
KeycloakUserId = grp.Key.KeycloakUserId,
LeaveTypeId = grp.Key.LeaveTypeId,
LeaveTypeCode = grp.Key.LeaveTypeCode,
SumLeaveDay = grp.Sum(x => x.LeaveTotal)
})
.ToList();
return res;
}
public async Task<List<GetSumApproveLeaveByTypeDto>> GetSumApproveLeaveAsync(int year)
{
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.LeaveStartDate.Year == year)
.Where(x => x.LeaveStatus == "APPROVE")
.ToListAsync();
var res = (from d in data
group d by new { d.KeycloakUserId, LeaveTypeId = d.Type.Id, LeaveTypeCode = d.Type.Code } into grp
select new GetSumApproveLeaveByTypeDto
{
KeycloakUserId = grp.Key.KeycloakUserId,
LeaveTypeId = grp.Key.LeaveTypeId,
LeaveTypeCode = grp.Key.LeaveTypeCode,
SumLeaveDay = grp.Sum(x => x.LeaveTotal)
})
.ToList();
return res;
}
public async Task<List<GetSumApproveLeaveByTypeDto>> GetSumRejectLeaveAsync(int year)
{
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.LeaveStartDate.Year == year)
.Where(x => x.LeaveStatus == "REJECT")
.ToListAsync();
var res = (from d in data
group d by new { d.KeycloakUserId, LeaveTypeId = d.Type.Id, LeaveTypeCode = d.Type.Code } into grp
select new GetSumApproveLeaveByTypeDto
{
KeycloakUserId = grp.Key.KeycloakUserId,
LeaveTypeId = grp.Key.LeaveTypeId,
LeaveTypeCode = grp.Key.LeaveTypeCode,
SumLeaveDay = grp.Sum(x => x.LeaveTotal)
})
.ToList();
return res;
}
public async Task<List<GetSumApproveLeaveByTypeDto>> GetSumDeleteLeaveAsync(int year)
{
var data = await _dbContext.Set<LeaveRequest>().AsQueryable().AsNoTracking()
.Include(x => x.Type)
.Where(x => x.LeaveStartDate.Year == year)
.Where(x => x.LeaveStatus == "DELETE")
.ToListAsync();
var res = (from d in data
group d by new { d.KeycloakUserId, LeaveTypeId = d.Type.Id, LeaveTypeCode = d.Type.Code } into grp
select new GetSumApproveLeaveByTypeDto
{
KeycloakUserId = grp.Key.KeycloakUserId,
LeaveTypeId = grp.Key.LeaveTypeId,
LeaveTypeCode = grp.Key.LeaveTypeCode,
SumLeaveDay = grp.Sum(x => x.LeaveTotal)
})
.ToList();
return res;
}
public async Task<double> GetSumSendLeaveByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId, int year) public async Task<double> GetSumSendLeaveByTypeForUserAsync(Guid keycloakUserId, Guid leaveTypeId, int year)
{ {
var data = await _dbContext.Set<LeaveRequest>().AsQueryable() var data = await _dbContext.Set<LeaveRequest>().AsQueryable()

View file

@ -15,6 +15,7 @@ using BMA.EHR.Application.Repositories.Commands;
using BMA.EHR.Application.Repositories.Leaves.TimeAttendants; using BMA.EHR.Application.Repositories.Leaves.TimeAttendants;
using BMA.EHR.Domain.Models.Leave.Commons; using BMA.EHR.Domain.Models.Leave.Commons;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using BMA.EHR.Application.Responses.Profiles;
namespace BMA.EHR.Leave.Service.Controllers namespace BMA.EHR.Leave.Service.Controllers
{ {
@ -817,12 +818,19 @@ namespace BMA.EHR.Leave.Service.Controllers
{ {
//var thisYear = DateTime.Now.Year; //var thisYear = DateTime.Now.Year;
var data = await _leaveRequestRepository.GetLeaveRequestByYearAsync(req.Year); var data = await _leaveRequestRepository.GetLeaveRequestByYearAsync(req.Year);
var personList = new List<GetProfileByKeycloakIdDto>();
var result = new List<GetLeaveRequestCalendarResultDto>(); var result = new List<GetLeaveRequestCalendarResultDto>();
foreach (var item in data) foreach (var item in data)
{ {
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(item.KeycloakUserId, AccessToken); var profile = personList.FirstOrDefault(x => x.Keycloak == item.KeycloakUserId);
if(profile == null)
{
profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(item.KeycloakUserId, AccessToken);
personList.Add(profile);
}
//var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(item.KeycloakUserId, AccessToken);
var resData = new GetLeaveRequestCalendarResultDto var resData = new GetLeaveRequestCalendarResultDto
{ {
@ -1571,20 +1579,25 @@ namespace BMA.EHR.Leave.Service.Controllers
var leaveTypes = await _leaveTypeRepository.GetAllAsync(); var leaveTypes = await _leaveTypeRepository.GetAllAsync();
var thisYear = DateTime.Now.Year; var thisYear = DateTime.Now.Year;
var sendList = await _leaveRequestRepository.GetSumSendLeaveAsync(thisYear);
var approveList = await _leaveRequestRepository.GetSumApproveLeaveAsync(thisYear);
var rejectList = await _leaveRequestRepository.GetSumRejectLeaveAsync(thisYear);
var deleteList = await _leaveRequestRepository.GetSumDeleteLeaveAsync(thisYear);
var result = new List<dynamic>(); var result = new List<dynamic>();
foreach (var leaveType in leaveTypes) foreach (var leaveType in leaveTypes)
{ {
var send = await _leaveRequestRepository.GetSumSendLeaveByTypeForUserAsync(userId, leaveType.Id, var sendData = sendList.FirstOrDefault(x => x.KeycloakUserId == userId && x.LeaveTypeId == leaveType.Id);
thisYear); var send = sendData == null ? 0 : sendData.SumLeaveDay;
var approve = var approveData = approveList.FirstOrDefault(x => x.KeycloakUserId == userId && x.LeaveTypeId == leaveType.Id);
await _leaveRequestRepository.GetSumApproveLeaveByTypeForUserAsync(userId, leaveType.Id, thisYear); var approve = approveData == null ? 0 : approveData.SumLeaveDay;
var reject = var rejectData = rejectList.FirstOrDefault(x => x.KeycloakUserId == userId && x.LeaveTypeId == leaveType.Id);
await _leaveRequestRepository.GetSumRejectLeaveByTypeForUserAsync(userId, leaveType.Id, thisYear); var reject = rejectData == null ? 0 : rejectData.SumLeaveDay;
var delete = var deleteData = deleteList.FirstOrDefault(x => x.KeycloakUserId == userId && x.LeaveTypeId == leaveType.Id);
await _leaveRequestRepository.GetSumDeleteLeaveByTypeForUserAsync(userId, leaveType.Id, thisYear); var delete = deleteData == null ? 0 : deleteData.SumLeaveDay;
var data = new var data = new
{ {