Merge branch 'develop' into task/173

# Conflicts:
#	BMA.EHR.Leave/Controllers/LeaveController.cs
This commit is contained in:
kittapath 2025-10-09 21:44:58 +07:00
commit 559765dd86
25 changed files with 987 additions and 114 deletions

View file

@ -14,16 +14,19 @@ using BMA.EHR.Leave.Service.DTOs.ChangeRound;
using BMA.EHR.Leave.Service.DTOs.CheckIn;
using BMA.EHR.Leave.Service.DTOs.DutyTime;
using BMA.EHR.Leave.Service.DTOs.LeaveRequest;
using iTextSharp.text;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.ObjectPool;
using Nest;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using Swashbuckle.AspNetCore.Annotations;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
@ -1257,7 +1260,7 @@ namespace BMA.EHR.Leave.Service.Controllers
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> LogRecordAsync([Required] DateTime startDate, [Required] DateTime endDate, int page = 1, int pageSize = 10, string keyword = "", string profileType = "ALL")
public async Task<ActionResult<ResponseObject>> LogRecordAsync([Required] DateTime startDate, [Required] DateTime endDate, int page = 1, int pageSize = 10, string keyword = "", string profileType = "ALL", string? sortBy = "", bool? descending = false)
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_CHECKIN");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
@ -1309,6 +1312,9 @@ namespace BMA.EHR.Leave.Service.Controllers
Id = d.Id,
//FullName = _userProfileRepository.GetUserFullName(d.KeycloakUserId, AccessToken),
FullName = $"{d.Prefix ?? ""}{d.FirstName ?? ""} {d.LastName ?? ""}",
Prefix = d.Prefix ?? "",
FirstName = d.FirstName ?? "",
LastName = d.LastName ?? "",
ProfileType = d.ProfileType ?? "",
CheckInDate = d.CheckIn.Date,
@ -1343,6 +1349,61 @@ namespace BMA.EHR.Leave.Service.Controllers
if (profileType.Trim().ToUpper() != "ALL")
data = data.Where(x => x.ProfileType == profileType.Trim().ToUpper()).ToList();
if (!string.IsNullOrWhiteSpace(sortBy))
{
switch (sortBy.ToUpper())
{
case "FULLNAME":
if (descending == true)
data = data.OrderByDescending(x => x.Prefix)
.ThenByDescending(x => x.FirstName)
.ThenByDescending(x => x.LastName)
.ToList();
else
data = data.OrderBy(x => x.Prefix)
.ThenBy(x => x.FirstName)
.ThenBy(x => x.LastName)
.ToList();
break;
case "CHECKINTIME":
if (descending == true)
data = data.OrderByDescending(x => x.CheckInTime).ToList();
else
data = data.OrderBy(x => x.CheckInTime).ToList();
break;
case "CHECKINLOCATION":
if (descending == true)
data = data.OrderByDescending(x => x.CheckInLocation)
.ThenByDescending(x => x.CheckInLat)
.ThenByDescending(x => x.CheckInLon)
.ToList();
else
data = data.OrderBy(x => x.CheckInLocation)
.ThenBy(x => x.CheckInLat)
.ThenBy(x => x.CheckInLon)
.ToList();
break;
case "CHECKOUTTIME":
if (descending == true)
data = data.OrderByDescending(x => x.CheckOutTime).ToList();
else
data = data.OrderBy(x => x.CheckOutTime).ToList();
break;
case "CHECKOUTLOCATION":
if (descending == true)
data = data.OrderByDescending(x => x.CheckOutLocation)
.ThenByDescending(x => x.CheckOutLat)
.ThenByDescending(x => x.CheckOutLon)
.ToList();
else
data = data.OrderBy(x => x.CheckOutLocation)
.ThenBy(x => x.CheckOutLat)
.ThenBy(x => x.CheckOutLon)
.ToList();
break;
default: break;
}
}
var pageData = data
.Skip((page - 1) * pageSize)
.Take(pageSize)
@ -1474,7 +1535,7 @@ namespace BMA.EHR.Leave.Service.Controllers
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[AllowAnonymous]
public async Task<ActionResult<ResponseObject>> GetTimeRecordAsync([Required] DateTime startDate, [Required] DateTime endDate, int page = 1, int pageSize = 10, string status = "NORMAL", string keyword = "", string profileType = "ALL")
public async Task<ActionResult<ResponseObject>> GetTimeRecordAsync([Required] DateTime startDate, [Required] DateTime endDate, int page = 1, int pageSize = 10, string status = "NORMAL", string keyword = "", string profileType = "ALL", string? sortBy = "", bool? descending = false)
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_CHECKIN");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
@ -1565,6 +1626,9 @@ namespace BMA.EHR.Leave.Service.Controllers
{
Id = d.Id,
FullName = $"{d.Prefix ?? ""}{d.FirstName ?? ""} {d.LastName ?? ""}",
Prefix = d.Prefix ?? "",
FirstName = d.FirstName ?? "",
LastName = d.LastName ?? "",
ProfileType = d.ProfileType ?? "",
CheckInDate = d.CheckIn.Date,
@ -1664,6 +1728,61 @@ namespace BMA.EHR.Leave.Service.Controllers
if (profileType.Trim().ToUpper() != "ALL")
data = data.Where(x => x.ProfileType == profileType.Trim().ToUpper()).ToList();
if (!string.IsNullOrWhiteSpace(sortBy))
{
switch (sortBy.ToUpper())
{
case "FULLNAME":
if (descending == true)
data = data.OrderByDescending(x => x.Prefix)
.ThenByDescending(x => x.FirstName)
.ThenByDescending(x => x.LastName)
.ToList();
else
data = data.OrderBy(x => x.Prefix)
.ThenBy(x => x.FirstName)
.ThenBy(x => x.LastName)
.ToList();
break;
case "CHECKINTIME":
if (descending == true)
data = data.OrderByDescending(x => x.CheckInTime).ToList();
else
data = data.OrderBy(x => x.CheckInTime).ToList();
break;
case "CHECKINLOCATION":
if (descending == true)
data = data.OrderByDescending(x => x.CheckInLocation)
.ThenByDescending(x => x.CheckInLat)
.ThenByDescending(x => x.CheckInLon)
.ToList();
else
data = data.OrderBy(x => x.CheckInLocation)
.ThenBy(x => x.CheckInLat)
.ThenBy(x => x.CheckInLon)
.ToList();
break;
case "CHECKOUTTIME":
if (descending == true)
data = data.OrderByDescending(x => x.CheckOutTime).ToList();
else
data = data.OrderBy(x => x.CheckOutTime).ToList();
break;
case "CHECKOUTLOCATION":
if (descending == true)
data = data.OrderByDescending(x => x.CheckOutLocation)
.ThenByDescending(x => x.CheckOutLat)
.ThenByDescending(x => x.CheckOutLon)
.ToList();
else
data = data.OrderBy(x => x.CheckOutLocation)
.ThenBy(x => x.CheckOutLat)
.ThenBy(x => x.CheckOutLon)
.ToList();
break;
default: break;
}
}
var pageData = data
.Skip((page - 1) * pageSize)
.Take(pageSize)
@ -1743,6 +1862,38 @@ namespace BMA.EHR.Leave.Service.Controllers
};
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 });
}
@ -1818,7 +1969,7 @@ namespace BMA.EHR.Leave.Service.Controllers
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> GetChangeRoundHistoryByProfileIdAsync(Guid id, int page = 1, int pageSize = 10, string keyword = "")
public async Task<ActionResult<ResponseObject>> GetChangeRoundHistoryByProfileIdAsync(Guid id, int page = 1, int pageSize = 10, string keyword = "", string? sortBy = "", bool? descending = false)
{
var getWorkflow = await _permission.GetPermissionAPIWorkflowAsync(id.ToString(), "SYS_WORK_ROUND_EDIT");
if (getWorkflow == false)
@ -1839,7 +1990,7 @@ namespace BMA.EHR.Leave.Service.Controllers
resultSet = data
.GroupBy(item => item.ProfileId)
.SelectMany(group => group
.OrderBy(item => item.EffectiveDate) // เรียงลำดับตาม property ที่คุณต้องการ
//.OrderBy(item => item.EffectiveDate) // เรียงลำดับตาม property ที่คุณต้องการ
.Select((item, index) => new ChangeRoundHistoryDto
{
Round = index + 1,
@ -1848,10 +1999,44 @@ namespace BMA.EHR.Leave.Service.Controllers
EffectiveDate = item.EffectiveDate.Value,
Remark = item.Remark
}))
.Skip((page - 1) * pageSize)
.Take(pageSize)
//.Skip((page - 1) * pageSize)
//.Take(pageSize)
.ToList();
if (!string.IsNullOrWhiteSpace(sortBy))
{
switch (sortBy.ToUpper())
{
case "ROUNT":
if (descending == true)
resultSet = resultSet.OrderByDescending(x => x.Round).ToList();
else
resultSet = resultSet.OrderBy(x => x.Round).ToList();
break;
case "STARTTIMEMORNIONG":
if (descending == true)
resultSet = resultSet.OrderByDescending(x => x.StartTimeMorning).ToList();
else
resultSet = resultSet.OrderBy(x => x.StartTimeMorning).ToList();
break;
case "EFFECTIVEDATE":
if (descending == true)
resultSet = resultSet.OrderByDescending(x => x.EffectiveDate).ToList();
else
resultSet = resultSet.OrderBy(x => x.EffectiveDate).ToList();
break;
case "REMARK":
if (descending == true)
resultSet = resultSet.OrderByDescending(x => x.Remark).ToList();
else
resultSet = resultSet.OrderBy(x => x.Remark).ToList();
break;
default: break;
}
}
resultSet = resultSet
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList();
}
return Success(new { data = resultSet, total = data.Count });
@ -2003,7 +2188,7 @@ namespace BMA.EHR.Leave.Service.Controllers
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> GetChangeEmpRoundHistoryByProfileIdAsync(Guid id, int page = 1, int pageSize = 10, string keyword = "")
public async Task<ActionResult<ResponseObject>> GetChangeEmpRoundHistoryByProfileIdAsync(Guid id, int page = 1, int pageSize = 10, string keyword = "", string? sortBy = "", bool? descending = false)
{
var getWorkflow = await _permission.GetPermissionAPIWorkflowAsync(id.ToString(), "SYS_WORK_ROUND_EDIT");
if (getWorkflow == false)
@ -2024,7 +2209,7 @@ namespace BMA.EHR.Leave.Service.Controllers
resultSet = data
.GroupBy(item => item.ProfileId)
.SelectMany(group => group
.OrderBy(item => item.EffectiveDate) // เรียงลำดับตาม property ที่คุณต้องการ
//.OrderBy(item => item.EffectiveDate) // เรียงลำดับตาม property ที่คุณต้องการ
.Select((item, index) => new ChangeRoundHistoryDto
{
Round = index + 1,
@ -2033,10 +2218,44 @@ namespace BMA.EHR.Leave.Service.Controllers
EffectiveDate = item.EffectiveDate.Value,
Remark = item.Remark
}))
.Skip((page - 1) * pageSize)
.Take(pageSize)
//.Skip((page - 1) * pageSize)
//.Take(pageSize)
.ToList();
if (!string.IsNullOrWhiteSpace(sortBy))
{
switch (sortBy.ToUpper())
{
case "ROUNT":
if (descending == true)
resultSet = resultSet.OrderByDescending(x => x.Round).ToList();
else
resultSet = resultSet.OrderBy(x => x.Round).ToList();
break;
case "STARTTIMEMORNIONG":
if (descending == true)
resultSet = resultSet.OrderByDescending(x => x.StartTimeMorning).ToList();
else
resultSet = resultSet.OrderBy(x => x.StartTimeMorning).ToList();
break;
case "EFFECTIVEDATE":
if (descending == true)
resultSet = resultSet.OrderByDescending(x => x.EffectiveDate).ToList();
else
resultSet = resultSet.OrderBy(x => x.EffectiveDate).ToList();
break;
case "REMARK":
if (descending == true)
resultSet = resultSet.OrderByDescending(x => x.Remark).ToList();
else
resultSet = resultSet.OrderBy(x => x.Remark).ToList();
break;
default: break;
}
}
resultSet = resultSet
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList();
}
return Success(new { data = resultSet, total = data.Count });
@ -2177,7 +2396,7 @@ namespace BMA.EHR.Leave.Service.Controllers
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> GetAdditionalCheckRequestAsync([Required] int year, [Required] int month, [Required] int page = 1, [Required] int pageSize = 10, string keyword = "")
public async Task<ActionResult<ResponseObject>> GetAdditionalCheckRequestAsync([Required] int year, [Required] int month, [Required] int page = 1, [Required] int pageSize = 10, string keyword = "", string? sortBy = "", bool? descending = false)
{
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_CHECKIN_SPECIAL");
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
@ -2246,6 +2465,9 @@ namespace BMA.EHR.Leave.Service.Controllers
{
Id = data.Id,
FullName = $"{data.Prefix}{data.FirstName} {data.LastName}",
Prefix = data.Prefix ?? "",
FirstName = data.FirstName ?? "",
LastName = data.LastName ?? "",
//FullName = $"{profile.Prefix}{profile.FirstName} {profile.LastName}",
CreatedAt = data.CreatedAt,
CheckDate = data.CheckDate,
@ -2302,9 +2524,62 @@ namespace BMA.EHR.Leave.Service.Controllers
{
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)
.OrderBy(x => x.StatusSort)
.ToList();
return Success(new { data = pageResult, total = result.Count });