refactor LeaveController to improve sorting and pagination logic #2192

This commit is contained in:
Suphonchai Phoonsawat 2026-01-13 17:01:20 +07:00
parent 90ea986831
commit 6907607a06
2 changed files with 158 additions and 101 deletions

68
.vscode/launch.json vendored
View file

@ -1,35 +1,35 @@
{
"version": "0.2.0",
"configurations": [
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md.
"name": ".NET Core Launch (web)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/BMA.EHR.Leave.Service/bin/Debug/net7.0/BMA.EHR.Leave.Service.dll",
"args": [],
"cwd": "${workspaceFolder}/BMA.EHR.Leave.Service",
"stopAtEntry": false,
// Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
},
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"sourceFileMap": {
"/Views": "${workspaceFolder}/Views"
}
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}
"version": "0.2.0",
"configurations": [
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md.
"name": ".NET Core Launch (web)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/BMA.EHR.Leave/bin/Debug/net7.0/BMA.EHR.Leave.dll",
"args": [],
"cwd": "${workspaceFolder}/BMA.EHR.Leave",
"stopAtEntry": false,
// Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
},
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"sourceFileMap": {
"/Views": "${workspaceFolder}/Views"
}
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}

View file

@ -2591,6 +2591,8 @@ namespace BMA.EHR.Leave.Service.Controllers
//var rawData = await _additionalCheckRequestRepository.GetAdditionalCheckRequests(year, month);
var rawData = await _additionalCheckRequestRepository.GetAdditionalCheckRequestsByAdminRole(year, month, role, nodeId, profileAdmin?.Node);
var total = rawData.Count;
var getDefaultRound = await _dutyTimeRepository.GetDefaultAsync();
if (getDefaultRound == null)
{
@ -2599,7 +2601,65 @@ namespace BMA.EHR.Leave.Service.Controllers
var result = new List<GetAdditionalCheckRequestDto>();
foreach (var data in rawData)
if (!string.IsNullOrWhiteSpace(sortBy))
{
switch (sortBy.ToUpper())
{
case "FULLNAME":
if (descending == true)
rawData = rawData.OrderByDescending(x => x.Prefix)
.ThenByDescending(x => x.FirstName)
.ThenByDescending(x => x.LastName)
.ToList();
else
rawData = rawData.OrderBy(x => x.Prefix)
.ThenBy(x => x.FirstName)
.ThenBy(x => x.LastName)
.ToList();
break;
case "CREATEDAT":
if (descending == true)
rawData = rawData.OrderByDescending(x => x.CreatedAt).ToList();
else
rawData = rawData.OrderBy(x => x.CreatedAt).ToList();
break;
case "CHECKDATE":
if (descending == true)
rawData = rawData.OrderByDescending(x => x.CheckDate).ToList();
else
rawData = rawData.OrderBy(x => x.CheckDate).ToList();
break;
// case "STARTTIMEMORNING":
// if (descending == true)
// rawData = rawData.OrderByDescending(x => x.StartTimeMorning).ToList();
// else
// result = result.OrderBy(x => x.StartTimeMorning).ToList();
// break;
// case "STARTTIMEAFTERNOON":
// if (descending == true)
// result = result.OrderByDescending(x => x.StartTimeAfternoon).ToList();
// else
// result = result.OrderBy(x => x.StartTimeAfternoon).ToList();
// break;
case "DESCRIPTION":
if (descending == true)
rawData = rawData.OrderByDescending(x => x.Description).ToList();
else
rawData = rawData.OrderBy(x => x.Description).ToList();
break;
default:
rawData = rawData.OrderBy(x =>
x.Status.Trim().ToLower() == "pending" ? 1 :
x.Status.Trim().ToLower() == "approve" ? 2 : 3).ToList();
break;
}
}
var rawDataPaged = rawData.Skip((page - 1) * pageSize).Take(pageSize)
.ToList();
foreach (var data in rawDataPaged)
{
var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken);
if (profile == null)
@ -2678,69 +2738,69 @@ namespace BMA.EHR.Leave.Service.Controllers
result.Add(resObj);
}
if (keyword != "")
{
result = result.Where(x => x.FullName.Contains(keyword)).ToList();
}
if (string.IsNullOrWhiteSpace(sortBy))
{
sortBy = "default";
}
if (!string.IsNullOrWhiteSpace(sortBy))
{
switch (sortBy.ToUpper())
{
case "FULLNAME":
if (descending == true)
result = result.OrderByDescending(x => x.Prefix)
.ThenByDescending(x => x.FirstName)
.ThenByDescending(x => x.LastName)
.ToList();
else
result = result.OrderBy(x => x.Prefix)
.ThenBy(x => x.FirstName)
.ThenBy(x => x.LastName)
.ToList();
break;
case "CREATEDAT":
if (descending == true)
result = result.OrderByDescending(x => x.CreatedAt).ToList();
else
result = result.OrderBy(x => x.CreatedAt).ToList();
break;
case "CHECKDATE":
if (descending == true)
result = result.OrderByDescending(x => x.CheckDate).ToList();
else
result = result.OrderBy(x => x.CheckDate).ToList();
break;
case "STARTTIMEMORNING":
if (descending == true)
result = result.OrderByDescending(x => x.StartTimeMorning).ToList();
else
result = result.OrderBy(x => x.StartTimeMorning).ToList();
break;
case "STARTTIMEAFTERNOON":
if (descending == true)
result = result.OrderByDescending(x => x.StartTimeAfternoon).ToList();
else
result = result.OrderBy(x => x.StartTimeAfternoon).ToList();
break;
case "DESCRIPTION":
if (descending == true)
result = result.OrderByDescending(x => x.Description).ToList();
else
result = result.OrderBy(x => x.Description).ToList();
break;
default:
result = result.OrderBy(x => x.StatusSort).ToList();
break;
}
}
var pageResult = result.Skip((page - 1) * pageSize).Take(pageSize)
.ToList();
// if (keyword != "")
// {
// result = result.Where(x => x.FullName.Contains(keyword)).ToList();
// }
// if (string.IsNullOrWhiteSpace(sortBy))
// {
// sortBy = "default";
// }
// if (!string.IsNullOrWhiteSpace(sortBy))
// {
// switch (sortBy.ToUpper())
// {
// case "FULLNAME":
// if (descending == true)
// result = result.OrderByDescending(x => x.Prefix)
// .ThenByDescending(x => x.FirstName)
// .ThenByDescending(x => x.LastName)
// .ToList();
// else
// result = result.OrderBy(x => x.Prefix)
// .ThenBy(x => x.FirstName)
// .ThenBy(x => x.LastName)
// .ToList();
// break;
// case "CREATEDAT":
// if (descending == true)
// result = result.OrderByDescending(x => x.CreatedAt).ToList();
// else
// result = result.OrderBy(x => x.CreatedAt).ToList();
// break;
// case "CHECKDATE":
// if (descending == true)
// result = result.OrderByDescending(x => x.CheckDate).ToList();
// else
// result = result.OrderBy(x => x.CheckDate).ToList();
// break;
// case "STARTTIMEMORNING":
// if (descending == true)
// result = result.OrderByDescending(x => x.StartTimeMorning).ToList();
// else
// result = result.OrderBy(x => x.StartTimeMorning).ToList();
// break;
// case "STARTTIMEAFTERNOON":
// if (descending == true)
// result = result.OrderByDescending(x => x.StartTimeAfternoon).ToList();
// else
// result = result.OrderBy(x => x.StartTimeAfternoon).ToList();
// break;
// case "DESCRIPTION":
// if (descending == true)
// result = result.OrderByDescending(x => x.Description).ToList();
// else
// result = result.OrderBy(x => x.Description).ToList();
// break;
// default:
// result = result.OrderBy(x => x.StatusSort).ToList();
// break;
// }
// }
// var pageResult = result.Skip((page - 1) * pageSize).Take(pageSize)
// .ToList();
return Success(new { data = pageResult, total = result.Count });
return Success(new { data = result, total = total });
}
/// <summary>
@ -3170,10 +3230,7 @@ namespace BMA.EHR.Leave.Service.Controllers
result.Add(resObj);
}
if (keyword != "")
{
result = result.Where(x => x.EditReason!.Contains(keyword) || x.CheckInLocation!.Contains(keyword) || x.CheckOutLocation!.Contains(keyword)).ToList();
}
var pageResult = result.Skip((page - 1) * pageSize).Take(pageSize)
.ToList();