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

66
.vscode/launch.json vendored
View file

@ -1,35 +1,35 @@
{ {
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
// Use IntelliSense to find out which attributes exist for C# debugging // Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes // Use hover for the description of the existing attributes
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md. // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md.
"name": ".NET Core Launch (web)", "name": ".NET Core Launch (web)",
"type": "coreclr", "type": "coreclr",
"request": "launch", "request": "launch",
"preLaunchTask": "build", "preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path. // 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", "program": "${workspaceFolder}/BMA.EHR.Leave/bin/Debug/net7.0/BMA.EHR.Leave.dll",
"args": [], "args": [],
"cwd": "${workspaceFolder}/BMA.EHR.Leave.Service", "cwd": "${workspaceFolder}/BMA.EHR.Leave",
"stopAtEntry": false, "stopAtEntry": false,
// Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
"serverReadyAction": { "serverReadyAction": {
"action": "openExternally", "action": "openExternally",
"pattern": "\\bNow listening on:\\s+(https?://\\S+)" "pattern": "\\bNow listening on:\\s+(https?://\\S+)"
}, },
"env": { "env": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
}, },
"sourceFileMap": { "sourceFileMap": {
"/Views": "${workspaceFolder}/Views" "/Views": "${workspaceFolder}/Views"
} }
}, },
{ {
"name": ".NET Core Attach", "name": ".NET Core Attach",
"type": "coreclr", "type": "coreclr",
"request": "attach" "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.GetAdditionalCheckRequests(year, month);
var rawData = await _additionalCheckRequestRepository.GetAdditionalCheckRequestsByAdminRole(year, month, role, nodeId, profileAdmin?.Node); var rawData = await _additionalCheckRequestRepository.GetAdditionalCheckRequestsByAdminRole(year, month, role, nodeId, profileAdmin?.Node);
var total = rawData.Count;
var getDefaultRound = await _dutyTimeRepository.GetDefaultAsync(); var getDefaultRound = await _dutyTimeRepository.GetDefaultAsync();
if (getDefaultRound == null) if (getDefaultRound == null)
{ {
@ -2599,7 +2601,65 @@ namespace BMA.EHR.Leave.Service.Controllers
var result = new List<GetAdditionalCheckRequestDto>(); 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); var profile = await _userProfileRepository.GetProfileByKeycloakIdAsync(data.KeycloakUserId, AccessToken);
if (profile == null) if (profile == null)
@ -2678,69 +2738,69 @@ namespace BMA.EHR.Leave.Service.Controllers
result.Add(resObj); result.Add(resObj);
} }
if (keyword != "") // if (keyword != "")
{ // {
result = result.Where(x => x.FullName.Contains(keyword)).ToList(); // result = result.Where(x => x.FullName.Contains(keyword)).ToList();
} // }
if (string.IsNullOrWhiteSpace(sortBy)) // if (string.IsNullOrWhiteSpace(sortBy))
{ // {
sortBy = "default"; // sortBy = "default";
} // }
if (!string.IsNullOrWhiteSpace(sortBy)) // if (!string.IsNullOrWhiteSpace(sortBy))
{ // {
switch (sortBy.ToUpper()) // switch (sortBy.ToUpper())
{ // {
case "FULLNAME": // case "FULLNAME":
if (descending == true) // if (descending == true)
result = result.OrderByDescending(x => x.Prefix) // result = result.OrderByDescending(x => x.Prefix)
.ThenByDescending(x => x.FirstName) // .ThenByDescending(x => x.FirstName)
.ThenByDescending(x => x.LastName) // .ThenByDescending(x => x.LastName)
.ToList(); // .ToList();
else // else
result = result.OrderBy(x => x.Prefix) // result = result.OrderBy(x => x.Prefix)
.ThenBy(x => x.FirstName) // .ThenBy(x => x.FirstName)
.ThenBy(x => x.LastName) // .ThenBy(x => x.LastName)
.ToList(); // .ToList();
break; // break;
case "CREATEDAT": // case "CREATEDAT":
if (descending == true) // if (descending == true)
result = result.OrderByDescending(x => x.CreatedAt).ToList(); // result = result.OrderByDescending(x => x.CreatedAt).ToList();
else // else
result = result.OrderBy(x => x.CreatedAt).ToList(); // result = result.OrderBy(x => x.CreatedAt).ToList();
break; // break;
case "CHECKDATE": // case "CHECKDATE":
if (descending == true) // if (descending == true)
result = result.OrderByDescending(x => x.CheckDate).ToList(); // result = result.OrderByDescending(x => x.CheckDate).ToList();
else // else
result = result.OrderBy(x => x.CheckDate).ToList(); // result = result.OrderBy(x => x.CheckDate).ToList();
break; // break;
case "STARTTIMEMORNING": // case "STARTTIMEMORNING":
if (descending == true) // if (descending == true)
result = result.OrderByDescending(x => x.StartTimeMorning).ToList(); // result = result.OrderByDescending(x => x.StartTimeMorning).ToList();
else // else
result = result.OrderBy(x => x.StartTimeMorning).ToList(); // result = result.OrderBy(x => x.StartTimeMorning).ToList();
break; // break;
case "STARTTIMEAFTERNOON": // case "STARTTIMEAFTERNOON":
if (descending == true) // if (descending == true)
result = result.OrderByDescending(x => x.StartTimeAfternoon).ToList(); // result = result.OrderByDescending(x => x.StartTimeAfternoon).ToList();
else // else
result = result.OrderBy(x => x.StartTimeAfternoon).ToList(); // result = result.OrderBy(x => x.StartTimeAfternoon).ToList();
break; // break;
case "DESCRIPTION": // case "DESCRIPTION":
if (descending == true) // if (descending == true)
result = result.OrderByDescending(x => x.Description).ToList(); // result = result.OrderByDescending(x => x.Description).ToList();
else // else
result = result.OrderBy(x => x.Description).ToList(); // result = result.OrderBy(x => x.Description).ToList();
break; // break;
default: // default:
result = result.OrderBy(x => x.StatusSort).ToList(); // result = result.OrderBy(x => x.StatusSort).ToList();
break; // break;
} // }
} // }
var pageResult = result.Skip((page - 1) * pageSize).Take(pageSize) // var pageResult = result.Skip((page - 1) * pageSize).Take(pageSize)
.ToList(); // .ToList();
return Success(new { data = pageResult, total = result.Count }); return Success(new { data = result, total = total });
} }
/// <summary> /// <summary>
@ -3170,10 +3230,7 @@ namespace BMA.EHR.Leave.Service.Controllers
result.Add(resObj); 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) var pageResult = result.Skip((page - 1) * pageSize).Take(pageSize)
.ToList(); .ToList();