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

@ -1839,18 +1839,41 @@ namespace BMA.EHR.Leave.Service.Controllers
}
var profile = await _userProfileRepository.SearchProfile(req.CitizenId, req.FirstName, req.LastName, AccessToken ?? "", req.Page, req.PageSize, role, nodeId, profileAdmin?.Node);
// Get default round once
var getDefaultRound = await _dutyTimeRepository.GetDefaultAsync();
var resultSet = new List<SearchProfileResultDto>();
foreach (var p in profile.data)
// Create dictionaries to cache results and avoid duplicate queries
var effectiveDateCache = new Dictionary<Guid, UserDutyTime?>();
var dutyTimeCache = new Dictionary<Guid, DutyTime?>();
foreach (var p in profile.Data)
{
var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id);
// Use cache for effective date
if (!effectiveDateCache.ContainsKey(p.Id))
{
effectiveDateCache[p.Id] = await _userDutyTimeRepository.GetLastEffectRound(p.Id);
}
var effectiveDate = effectiveDateCache[p.Id];
var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty;
var userRound = await _dutyTimeRepository.GetByIdAsync(roundId);
// Use cache for duty time
DutyTime? userRound = null;
if (roundId != Guid.Empty)
{
if (!dutyTimeCache.ContainsKey(roundId))
{
dutyTimeCache[roundId] = await _dutyTimeRepository.GetByIdAsync(roundId);
}
userRound = dutyTimeCache[roundId];
}
var duty = userRound ?? getDefaultRound;
if (duty == null) continue; // Skip if no duty time found
var res = new SearchProfileResultDto
{
ProfileId = p.Id,
@ -1858,44 +1881,12 @@ namespace BMA.EHR.Leave.Service.Controllers
FullName = $"{p.Prefix ?? ""}{p.FirstName ?? ""} {p.LastName ?? ""}",
StartTimeMorning = duty.StartTimeMorning,
LeaveTimeAfterNoon = duty.EndTimeAfternoon,
EffectiveDate = effectiveDate == null ? null : effectiveDate.EffectiveDate.Value.Date
EffectiveDate = effectiveDate?.EffectiveDate?.Date
};
resultSet.Add(res);
}
if (!string.IsNullOrWhiteSpace(req.sortBy))
{
switch (req.sortBy.ToUpper())
{
case "CITIZENID":
if (req.descending == true)
resultSet = resultSet.OrderByDescending(x => x.CitizenId).ToList();
else
resultSet = resultSet.OrderBy(x => x.CitizenId).ToList();
break;
case "FULLNAME":
if (req.descending == true)
resultSet = resultSet.OrderByDescending(x => x.FullName).ToList();
else
resultSet = resultSet.OrderBy(x => x.FullName).ToList();
break;
case "STARTTIMEMORNING":
if (req.descending == true)
resultSet = resultSet.OrderByDescending(x => x.StartTimeMorning).ToList();
else
resultSet = resultSet.OrderBy(x => x.StartTimeMorning).ToList();
break;
case "EFFECTIVEDATE":
if (req.descending == true)
resultSet = resultSet.OrderByDescending(x => x.EffectiveDate).ToList();
else
resultSet = resultSet.OrderBy(x => x.EffectiveDate).ToList();
break;
default: break;
}
}
var pageResult = resultSet.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList();
return Success(new { data = resultSet, total = profile.total });
return Success(new { data = resultSet, total = profile.Total });
}
/// <summary>
@ -2091,18 +2082,41 @@ namespace BMA.EHR.Leave.Service.Controllers
}
var profile = await _userProfileRepository.SearchProfileEmployee(req.CitizenId, req.FirstName, req.LastName, AccessToken ?? "", req.Page, req.PageSize, role, nodeId, profileAdmin?.Node);
// Get default round once
var getDefaultRound = await _dutyTimeRepository.GetDefaultAsync();
var resultSet = new List<SearchProfileResultDto>();
foreach (var p in profile.data)
// Create dictionaries to cache results and avoid duplicate queries
var effectiveDateCache = new Dictionary<Guid, UserDutyTime?>();
var dutyTimeCache = new Dictionary<Guid, DutyTime?>();
foreach (var p in profile.Data)
{
var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id);
// Use cache for effective date
if (!effectiveDateCache.ContainsKey(p.Id))
{
effectiveDateCache[p.Id] = await _userDutyTimeRepository.GetLastEffectRound(p.Id);
}
var effectiveDate = effectiveDateCache[p.Id];
var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty;
var userRound = await _dutyTimeRepository.GetByIdAsync(roundId);
// Use cache for duty time
DutyTime? userRound = null;
if (roundId != Guid.Empty)
{
if (!dutyTimeCache.ContainsKey(roundId))
{
dutyTimeCache[roundId] = await _dutyTimeRepository.GetByIdAsync(roundId);
}
userRound = dutyTimeCache[roundId];
}
var duty = userRound ?? getDefaultRound;
if (duty == null) continue; // Skip if no duty time found
var res = new SearchProfileResultDto
{
ProfileId = p.Id,
@ -2110,12 +2124,12 @@ namespace BMA.EHR.Leave.Service.Controllers
FullName = $"{p.Prefix ?? ""}{p.FirstName ?? ""} {p.LastName ?? ""}",
StartTimeMorning = duty.StartTimeMorning,
LeaveTimeAfterNoon = duty.EndTimeAfternoon,
EffectiveDate = effectiveDate == null ? null : effectiveDate.EffectiveDate.Value.Date
EffectiveDate = effectiveDate?.EffectiveDate?.Date
};
resultSet.Add(res);
}
return Success(new { data = resultSet, total = profile.total });
return Success(new { data = resultSet, total = profile.Total });
}
/// <summary>