refactor code

This commit is contained in:
kittapath 2025-10-09 23:21:36 +07:00
parent 8ba9d349db
commit ed1bb838ce
5 changed files with 109 additions and 67 deletions

View file

@ -2481,44 +2481,58 @@ namespace BMA.EHR.Leave.Service.Controllers
public async Task<ActionResult<ResponseObject>> GetUserLeaveSummaryAsync()
{
var userId = UserId == null ? Guid.Empty : Guid.Parse(UserId);
var leaveTypes = await _leaveTypeRepository.GetAllAsync();
var thisYear = DateTime.Now.Year;
var toDay = DateTime.Now.Date;
if (toDay >= new DateTime(toDay.Year, 10, 1) && toDay <= new DateTime(toDay.Year, 12, 31))
thisYear = thisYear + 1;
// Execute repository calls sequentially to avoid DbContext threading issues
var leaveTypes = await _leaveTypeRepository.GetAllAsync();
var sendList = await _leaveRequestRepository.GetSumSendLeaveAsync(thisYear);
var rejectList = await _leaveRequestRepository.GetSumRejectLeaveAsync(thisYear);
var deleteList = await _leaveRequestRepository.GetSumDeleteLeaveAsync(thisYear);
var result = new List<dynamic>();
var pf = await _userProfileRepository.GetProfileByKeycloakIdAsync(userId, AccessToken);
if (pf == null)
{
throw new Exception(GlobalMessages.DataNotFound);
}
// Create dictionaries for fast lookup instead of FirstOrDefault searches
var sendDict = sendList.Where(x => x.KeycloakUserId == userId)
.ToDictionary(x => x.LeaveTypeId, x => x.SumLeaveDay);
var rejectDict = rejectList.Where(x => x.KeycloakUserId == userId)
.ToDictionary(x => x.LeaveTypeId, x => x.SumLeaveDay);
var deleteDict = deleteList.Where(x => x.KeycloakUserId == userId)
.ToDictionary(x => x.LeaveTypeId, x => x.SumLeaveDay);
// Pre-load all leave beginning data sequentially to avoid DbContext threading issues
var leaveBeginningDict = new Dictionary<Guid, LeaveBeginning?>();
foreach (var leaveType in leaveTypes)
{
var sendData = sendList.FirstOrDefault(x => x.KeycloakUserId == userId && x.LeaveTypeId == leaveType.Id);
var send = sendData == null ? 0 : sendData.SumLeaveDay;
var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUser(thisYear, leaveType.Id, pf);
var approve = leaveData == null ? 0 : leaveData.LeaveDaysUsed;
leaveBeginningDict[leaveType.Id] = leaveData;
}
var rejectData = rejectList.FirstOrDefault(x => x.KeycloakUserId == userId && x.LeaveTypeId == leaveType.Id);
var reject = rejectData == null ? 0 : rejectData.SumLeaveDay;
var result = new List<dynamic>();
var deleteData = deleteList.FirstOrDefault(x => x.KeycloakUserId == userId && x.LeaveTypeId == leaveType.Id);
var delete = deleteData == null ? 0 : deleteData.SumLeaveDay;
foreach (var leaveType in leaveTypes)
{
// Use dictionary lookups for better performance
var send = sendDict.GetValueOrDefault(leaveType.Id, 0);
var reject = rejectDict.GetValueOrDefault(leaveType.Id, 0);
var delete = deleteDict.GetValueOrDefault(leaveType.Id, 0);
leaveBeginningDict.TryGetValue(leaveType.Id, out var leaveData);
var approve = leaveData?.LeaveDaysUsed ?? 0;
// fix issue : SIT ระบบบันทึกการลา>> สิทธิ์การลา(โอนสิทธิ์การลา) #974
var extendLeave = 0.0;
var leaveLimit = (double)leaveType.Limit;
if (leaveType.Code == "LV-005")
{
leaveLimit = leaveData == null ? 0.0 : leaveData.LeaveDays;
leaveLimit = leaveData?.LeaveDays ?? 0.0;
extendLeave = leaveLimit - 10;
}