From 8ae822d05baace38fa1cc232211d66c9f098b90a Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Fri, 29 May 2026 15:46:29 +0700 Subject: [PATCH 1/9] leave report #2524 --- .../Controllers/LeaveReportController.cs | 50 ++++++++++++++++--- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/BMA.EHR.Leave/Controllers/LeaveReportController.cs b/BMA.EHR.Leave/Controllers/LeaveReportController.cs index abdf5f2b..cfc84ef0 100644 --- a/BMA.EHR.Leave/Controllers/LeaveReportController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveReportController.cs @@ -2444,6 +2444,15 @@ namespace BMA.EHR.Leave.Service.Controllers var workTotal = 0; var seminarTotal = 0; + var wfaTotal = 0; //ปฏิบัติงานนอกสถานที่ + var outOfficeTotal = 0; //ขออนุญาติิิออกนอกสถานที่ + var oneStopSrvrTotal = 0; //จุดบริการด่วนมหานคร + var otherTotal = 0; //อื่นๆ + + + + + var defaultRound = await _dutyTimeRepository.GetDefaultAsync(); if (defaultRound == null) { @@ -2627,10 +2636,18 @@ namespace BMA.EHR.Leave.Service.Controllers workTotal += 1; if (!timeStamps.IsLocationCheckIn) { - if (timeStamps.CheckInLocationName == "ปฏิบัติงานที่บ้าน") + if (timeStamps.CheckInLocationName!.Contains("ปฏิบัติงานที่บ้าน")) wfhTotal += 1; else if (timeStamps.CheckInLocationName == "ไปประชุม / อบรม / สัมมนา") seminarTotal += 1; + else if (timeStamps.CheckInLocationName.Contains("ปฏิบัติงานนอกสถานที่")) + wfaTotal += 1; + else if (timeStamps.CheckInLocationName.Contains("ขออนุญาตออกนอกสถานที่")) + outOfficeTotal += 1; + else if (timeStamps.CheckInLocationName.Contains("ปฏิบัติงานในจุดบริการด่วนมหานคร")) + oneStopSrvrTotal += 1; + else if (timeStamps.CheckInLocationName.Contains("อื่นๆ")) + otherTotal += 1; } } @@ -2781,19 +2798,36 @@ namespace BMA.EHR.Leave.Service.Controllers worksheet.Cells[lastRow + 2, 8].Value = "อบรม ประชุม สัมมนาฯ"; worksheet.Cells[lastRow + 2, 9].Value = seminarTotal; worksheet.Cells[lastRow + 2, 10].Value = "คน"; + worksheet.Cells[lastRow + 3, 8].Value = "ปฎิบัติงานนอกสถานที่"; + worksheet.Cells[lastRow + 3, 9].Value = wfaTotal; + worksheet.Cells[lastRow + 3, 10].Value = "คน"; + worksheet.Cells[lastRow + 4, 8].Value = "ขออนุญาตออกนอกสถานที่"; + worksheet.Cells[lastRow + 4, 9].Value = outOfficeTotal; + worksheet.Cells[lastRow + 4, 10].Value = "คน"; + worksheet.Cells[lastRow + 5, 8].Value = "ปฎิบัติงานในจุดบริการด่วนมหานคร"; + worksheet.Cells[lastRow + 5, 9].Value = oneStopSrvrTotal; + worksheet.Cells[lastRow + 5, 10].Value = "คน"; + worksheet.Cells[lastRow + 6, 8].Value = "อื่นๆ"; + worksheet.Cells[lastRow + 6, 9].Value = otherTotal; + worksheet.Cells[lastRow + 6, 10].Value = "คน"; + + + + + worksheet.Cells[lastRow + 3, 2].Value = "ลาป่วย/ลากิจ"; worksheet.Cells[lastRow + 3, 5].Value = sickTotal; worksheet.Cells[lastRow + 3, 6].Value = "คน"; worksheet.Cells[lastRow + 4, 2].Value = "มาสาย"; worksheet.Cells[lastRow + 4, 5].Value = lateTotal; worksheet.Cells[lastRow + 4, 6].Value = "คน"; - worksheet.Cells[lastRow + 6, 2].Value = "เรียน"; - worksheet.Cells[lastRow + 7, 2].Value = "เพื่อโปรดทราบ"; - worksheet.Cells[lastRow + 7, 9].Value = "ทราบ"; - worksheet.Cells[lastRow + 7, 9].Style.Font.Bold = true; - worksheet.Cells[lastRow + 7, 9].Style.Font.Size = 22; - worksheet.Cells[lastRow + 8, 2].Value = "................................"; - worksheet.Cells[lastRow + 8, 9].Value = "................................"; + worksheet.Cells[lastRow + 8, 2].Value = "เรียน"; + worksheet.Cells[lastRow + 9, 2].Value = "เพื่อโปรดทราบ"; + worksheet.Cells[lastRow + 9, 9].Value = "ทราบ"; + worksheet.Cells[lastRow + 9, 9].Style.Font.Bold = true; + worksheet.Cells[lastRow + 9, 9].Style.Font.Size = 22; + worksheet.Cells[lastRow + 10, 2].Value = "................................"; + worksheet.Cells[lastRow + 10, 9].Value = "................................"; worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns(); var fileBytes = package.GetAsByteArray(); return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "TimeStampRecords.xlsx"); From efc96dfb6d1620d91e84d4a4f94a899f9540f502 Mon Sep 17 00:00:00 2001 From: Adisak Date: Thu, 4 Jun 2026 09:37:29 +0700 Subject: [PATCH 2/9] =?UTF-8?q?=E0=B9=81=E0=B8=81=E0=B9=89=20format=20?= =?UTF-8?q?=E0=B8=9F=E0=B8=B4=E0=B8=A7=20posMasterNo=20(6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/PlacementAppointmentEmployeeController.cs | 2 +- .../Controllers/RetirementOtherController.cs | 2 +- .../Controllers/RetirementResignController.cs | 2 +- .../Controllers/RetirementResignEmployeeController.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BMA.EHR.Placement.Service/Controllers/PlacementAppointmentEmployeeController.cs b/BMA.EHR.Placement.Service/Controllers/PlacementAppointmentEmployeeController.cs index 971cd526..12325ecb 100644 --- a/BMA.EHR.Placement.Service/Controllers/PlacementAppointmentEmployeeController.cs +++ b/BMA.EHR.Placement.Service/Controllers/PlacementAppointmentEmployeeController.cs @@ -542,7 +542,7 @@ namespace BMA.EHR.Placement.Service.Controllers placementAppointment.positionOld = org.result.position; placementAppointment.PositionLevelOld = org.result.posLevelName; placementAppointment.PositionTypeOld = org.result.posTypeName; - placementAppointment.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo; + placementAppointment.PositionNumberOld = org.result.posNo; placementAppointment.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") + (org.result.child3 == null ? "" : org.result.child3 + "\n") + (org.result.child2 == null ? "" : org.result.child2 + "\n") + diff --git a/BMA.EHR.Retirement.Service/Controllers/RetirementOtherController.cs b/BMA.EHR.Retirement.Service/Controllers/RetirementOtherController.cs index 3f36af1d..697af6eb 100644 --- a/BMA.EHR.Retirement.Service/Controllers/RetirementOtherController.cs +++ b/BMA.EHR.Retirement.Service/Controllers/RetirementOtherController.cs @@ -448,7 +448,7 @@ namespace BMA.EHR.Retirement.Service.Controllers retirementOther.positionAreaOld = org.result.positionArea; retirementOther.PositionLevelOld = org.result.posLevelName; retirementOther.PositionTypeOld = org.result.posTypeName; - retirementOther.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo; + retirementOther.PositionNumberOld = org.result.posNo; retirementOther.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") + (org.result.child3 == null ? "" : org.result.child3 + "\n") + (org.result.child2 == null ? "" : org.result.child2 + "\n") + diff --git a/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs b/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs index b3c42f88..a97c5db8 100644 --- a/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs +++ b/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs @@ -1290,7 +1290,7 @@ namespace BMA.EHR.Retirement.Service.Controllers retirementResign.positionAreaOld = org.result.positionArea; retirementResign.PositionLevelOld = org.result.posLevelName; retirementResign.PositionTypeOld = org.result.posTypeName; - retirementResign.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo; + retirementResign.PositionNumberOld = org.result.posNo; retirementResign.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") + (org.result.child3 == null ? "" : org.result.child3 + "\n") + (org.result.child2 == null ? "" : org.result.child2 + "\n") + diff --git a/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs b/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs index 7db20848..88c29364 100644 --- a/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs +++ b/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs @@ -1227,7 +1227,7 @@ namespace BMA.EHR.Retirement.Service.Controllers retirementResignEmployee.PositionOld = org.result.position; retirementResignEmployee.PositionLevelOld = org.result.posLevelName; retirementResignEmployee.PositionTypeOld = org.result.posTypeName; - retirementResignEmployee.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo; + retirementResignEmployee.PositionNumberOld = org.result.posNo; retirementResignEmployee.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") + (org.result.child3 == null ? "" : org.result.child3 + "\n") + (org.result.child2 == null ? "" : org.result.child2 + "\n") + From afa5c853938bad5a056e8d290d81393115924f10 Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Thu, 4 Jun 2026 10:01:11 +0700 Subject: [PATCH 3/9] fix #2545 --- .../LeaveRequests/LeaveRequestRepository.cs | 17 +++++++++++++++++ .../Controllers/LeaveReportController.cs | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs index dee940fe..3070ee88 100644 --- a/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs +++ b/BMA.EHR.Application/Repositories/Leaves/LeaveRequests/LeaveRequestRepository.cs @@ -1952,6 +1952,23 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests return 0; } + public async Task GetSumApproveLeaveTotalByTypeAndRangeForUserBefore(Guid keycloakUserId, Guid leaveTypeId, DateTime startDate, DateTime endDate) + { + var data = await _dbContext.Set().AsQueryable().AsNoTracking() + .Include(x => x.Type) + .Where(x => x.KeycloakUserId == keycloakUserId) + .Where(x => x.Type.Id == leaveTypeId) + .Where(x => ((x.DateSendLeave ?? x.CreatedAt) >= startDate && (x.DateSendLeave ?? x.CreatedAt) < endDate)) + //.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date) + .Where(x => x.LeaveStatus == "APPROVE" || x.LeaveStatus == "DELETING") + .ToListAsync(); + + if (data.Count > 0) + return data.Sum(x => x.LeaveTotal); + else + return 0; + } + public async Task GetSumApproveLeaveTotalByTypeAndRangeForUserByProfile(Guid profileId, Guid leaveTypeId, DateTime startDate, DateTime endDate) { var data = await _dbContext.Set().AsQueryable().AsNoTracking() diff --git a/BMA.EHR.Leave/Controllers/LeaveReportController.cs b/BMA.EHR.Leave/Controllers/LeaveReportController.cs index cfc84ef0..29676230 100644 --- a/BMA.EHR.Leave/Controllers/LeaveReportController.cs +++ b/BMA.EHR.Leave/Controllers/LeaveReportController.cs @@ -164,7 +164,7 @@ namespace BMA.EHR.Leave.Service.Controllers if (toDay >= new DateTime(toDay.Year, 10, 1) && toDay <= new DateTime(toDay.Year, 12, 31)) thisYear = thisYear + 1; var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUser2Async(thisYear, data.Type.Id, data.KeycloakUserId); - var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser2(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear); + var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUserBefore(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear); if (leaveData != null) { sumLeave += leaveData.BeginningLeaveDays; @@ -346,7 +346,7 @@ namespace BMA.EHR.Leave.Service.Controllers //var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear); - var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser2(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear); + var sumLeave = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUserBefore(data.KeycloakUserId, data.Type.Id, startFiscalYear, endFiscalYear); if (leaveData != null) { sumLeave += leaveData.BeginningLeaveDays; From d3a174faa065c7b1de5b2b1f519c415c04939923 Mon Sep 17 00:00:00 2001 From: harid Date: Thu, 4 Jun 2026 10:10:31 +0700 Subject: [PATCH 4/9] log placementReceive --- .../Controllers/PlacementReceiveController.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BMA.EHR.Placement.Service/Controllers/PlacementReceiveController.cs b/BMA.EHR.Placement.Service/Controllers/PlacementReceiveController.cs index 0447ff4c..7ad56249 100644 --- a/BMA.EHR.Placement.Service/Controllers/PlacementReceiveController.cs +++ b/BMA.EHR.Placement.Service/Controllers/PlacementReceiveController.cs @@ -514,9 +514,8 @@ namespace BMA.EHR.Placement.Service.Controllers { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); - - client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]); - + Console.Write($"[PlacementReceiveController] Check-Citizen API-Key : {_configuration["API_KEY"]}"); + client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); var _res = await client.PostAsJsonAsync(apiUrlCheckCitizen, new { @@ -541,6 +540,7 @@ namespace BMA.EHR.Placement.Service.Controllers using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); + Console.Write("[PlacementReceiveController] Check-Position"); client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); var _req = new HttpRequestMessage(HttpMethod.Get, apiUrl); var _res = await client.SendAsync(_req); @@ -831,7 +831,7 @@ namespace BMA.EHR.Placement.Service.Controllers client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.Replace("Bearer ", "")); - client.DefaultRequestHeaders.Add("api_key", _configuration["API_KEY"]); + client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); var _res = await client.PostAsJsonAsync(apiUrlCheckCitizen, new From 1f7951dc4c8e079626953b4305bad78868bd44d3 Mon Sep 17 00:00:00 2001 From: Adisak Date: Thu, 4 Jun 2026 10:15:33 +0700 Subject: [PATCH 5/9] =?UTF-8?q?update=20=E0=B8=A5=E0=B8=B2=E0=B8=AD?= =?UTF-8?q?=E0=B8=AD=E0=B8=81=20admin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/RetirementResignController.cs | 2 +- .../Controllers/RetirementResignEmployeeController.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs b/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs index f07cd36d..0ed6cc8a 100644 --- a/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs +++ b/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs @@ -1439,7 +1439,7 @@ namespace BMA.EHR.Retirement.Service.Controllers retirementResign.positionAreaOld = org.result.positionArea; retirementResign.PositionLevelOld = org.result.posLevelName; retirementResign.PositionTypeOld = org.result.posTypeName; - retirementResign.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo; + retirementResign.PositionNumberOld = org.result.posNo; retirementResign.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") + (org.result.child3 == null ? "" : org.result.child3 + "\n") + (org.result.child2 == null ? "" : org.result.child2 + "\n") + diff --git a/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs b/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs index bd61425c..20fa5402 100644 --- a/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs +++ b/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs @@ -1381,7 +1381,7 @@ namespace BMA.EHR.Retirement.Service.Controllers retirementResignEmployee.PositionOld = org.result.position; retirementResignEmployee.PositionLevelOld = org.result.posLevelName; retirementResignEmployee.PositionTypeOld = org.result.posTypeName; - retirementResignEmployee.PositionNumberOld = org.result.nodeShortName + " " + org.result.posMasterNo; + retirementResignEmployee.PositionNumberOld = org.result.posNo; retirementResignEmployee.OrganizationOld = (org.result.child4 == null ? "" : org.result.child4 + "\n") + (org.result.child3 == null ? "" : org.result.child3 + "\n") + (org.result.child2 == null ? "" : org.result.child2 + "\n") + From d6a7f1a5cab0ceabe39c76fbc73b72052889818f Mon Sep 17 00:00:00 2001 From: harid Date: Thu, 4 Jun 2026 11:34:06 +0700 Subject: [PATCH 6/9] =?UTF-8?q?fix=20=E0=B9=81=E0=B8=81=E0=B9=89=E0=B9=84?= =?UTF-8?q?=E0=B8=82=E0=B8=A7=E0=B8=B1=E0=B8=99=E0=B8=97=E0=B8=B5=E0=B9=88?= =?UTF-8?q?=E0=B8=A2=E0=B8=B7=E0=B9=88=E0=B8=99=E0=B8=82=E0=B8=AD=E0=B8=A5?= =?UTF-8?q?=E0=B8=B2=E0=B8=AD=E0=B8=AD=E0=B8=81=E0=B9=81=E0=B8=A5=E0=B9=89?= =?UTF-8?q?=E0=B8=A7=E0=B8=82=E0=B9=89=E0=B8=AD=E0=B8=A1=E0=B8=B9=E0=B8=A5?= =?UTF-8?q?=E0=B9=84=E0=B8=A1=E0=B9=88=E0=B9=80=E0=B8=9B=E0=B8=A5=E0=B8=B5?= =?UTF-8?q?=E0=B9=88=E0=B8=A2=E0=B8=99=20#2547?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/RetirementResignController.cs | 9 ++++++++- .../Controllers/RetirementResignEmployeeController.cs | 9 ++++++++- .../Requests/RetirementResignEmployeeRequest.cs | 2 +- .../Requests/RetirementResignRequest.cs | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs b/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs index 0ed6cc8a..32331859 100644 --- a/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs +++ b/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs @@ -1513,7 +1513,14 @@ namespace BMA.EHR.Retirement.Service.Controllers return Error(GlobalMessages.RetirementResignNotFound, 404); updated.Location = req.Location; - updated.ActiveDate = req.ActiveDate; + if (req.SendDate != null) + { + updated.SendDate = req.SendDate; + } + if (req.ActiveDate != null) + { + updated.ActiveDate = req.ActiveDate; + } // updated.Reason = req.Reason; updated.Remark = req.Remark; updated.ReasonResign = req.Reason; diff --git a/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs b/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs index 20fa5402..62014b1b 100644 --- a/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs +++ b/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs @@ -1450,7 +1450,14 @@ namespace BMA.EHR.Retirement.Service.Controllers return Error(GlobalMessages.RetirementResignEmployeeNotFound, 404); updated.Location = req.Location; - updated.ActiveDate = req.ActiveDate; + if (req.SendDate != null) + { + updated.SendDate = req.SendDate; + } + if (req.ActiveDate != null) + { + updated.ActiveDate = req.ActiveDate; + } // updated.Reason = req.Reason; updated.Remark = req.Remark; updated.ReasonResign = req.Reason; diff --git a/BMA.EHR.Retirement.Service/Requests/RetirementResignEmployeeRequest.cs b/BMA.EHR.Retirement.Service/Requests/RetirementResignEmployeeRequest.cs index dd883d0d..e1b1a3cf 100644 --- a/BMA.EHR.Retirement.Service/Requests/RetirementResignEmployeeRequest.cs +++ b/BMA.EHR.Retirement.Service/Requests/RetirementResignEmployeeRequest.cs @@ -6,7 +6,7 @@ namespace BMA.EHR.Retirement.Service.Requests public class RetirementResignEmployeeRequest { public string? Location { get; set; } - // public DateTime? SendDate { get; set; } + public DateTime? SendDate { get; set; } public DateTime? ActiveDate { get; set; } public string? Reason { get; set; } public string? Remark { get; set; } diff --git a/BMA.EHR.Retirement.Service/Requests/RetirementResignRequest.cs b/BMA.EHR.Retirement.Service/Requests/RetirementResignRequest.cs index acef05aa..e862e6dd 100644 --- a/BMA.EHR.Retirement.Service/Requests/RetirementResignRequest.cs +++ b/BMA.EHR.Retirement.Service/Requests/RetirementResignRequest.cs @@ -6,7 +6,7 @@ namespace BMA.EHR.Retirement.Service.Requests public class RetirementResignRequest { public string? Location { get; set; } - // public DateTime? SendDate { get; set; } + public DateTime? SendDate { get; set; } public DateTime? ActiveDate { get; set; } public string? Reason { get; set; } public string? Remark { get; set; } From fe5c2cd7c1b9c54971214cf99e47e48a3e5b7749 Mon Sep 17 00:00:00 2001 From: harid Date: Thu, 4 Jun 2026 11:52:26 +0700 Subject: [PATCH 7/9] fix #2547 --- .../Controllers/RetirementResignController.cs | 4 ---- .../Controllers/RetirementResignEmployeeController.cs | 4 ---- 2 files changed, 8 deletions(-) diff --git a/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs b/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs index 32331859..2dd451ab 100644 --- a/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs +++ b/BMA.EHR.Retirement.Service/Controllers/RetirementResignController.cs @@ -1517,10 +1517,6 @@ namespace BMA.EHR.Retirement.Service.Controllers { updated.SendDate = req.SendDate; } - if (req.ActiveDate != null) - { - updated.ActiveDate = req.ActiveDate; - } // updated.Reason = req.Reason; updated.Remark = req.Remark; updated.ReasonResign = req.Reason; diff --git a/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs b/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs index 62014b1b..064220d4 100644 --- a/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs +++ b/BMA.EHR.Retirement.Service/Controllers/RetirementResignEmployeeController.cs @@ -1454,10 +1454,6 @@ namespace BMA.EHR.Retirement.Service.Controllers { updated.SendDate = req.SendDate; } - if (req.ActiveDate != null) - { - updated.ActiveDate = req.ActiveDate; - } // updated.Reason = req.Reason; updated.Remark = req.Remark; updated.ReasonResign = req.Reason; From a956f0b0ddbbe4900d86f349652546afada67101 Mon Sep 17 00:00:00 2001 From: Adisak Date: Thu, 4 Jun 2026 16:53:14 +0700 Subject: [PATCH 8/9] update --- .../Controllers/PlacementOfficerController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/BMA.EHR.Placement.Service/Controllers/PlacementOfficerController.cs b/BMA.EHR.Placement.Service/Controllers/PlacementOfficerController.cs index 867935e9..baaafee2 100644 --- a/BMA.EHR.Placement.Service/Controllers/PlacementOfficerController.cs +++ b/BMA.EHR.Placement.Service/Controllers/PlacementOfficerController.cs @@ -148,6 +148,7 @@ namespace BMA.EHR.Placement.Service.Controllers p.child4OldId, p.child4ShortNameOld, p.PositionOld, + p.PositionNumberOld, p.PositionExecutiveOld, p.positionExecutiveFieldOld, p.positionAreaOld, From 4c44bdf237d9d1a815fcca08658b01210bf70e3b Mon Sep 17 00:00:00 2001 From: harid Date: Thu, 4 Jun 2026 19:05:09 +0700 Subject: [PATCH 9/9] =?UTF-8?q?fix=20=E0=B8=AD=E0=B8=B1=E0=B8=9E=E0=B9=80?= =?UTF-8?q?=E0=B8=94=E0=B8=97=E0=B8=AA=E0=B8=96=E0=B8=B2=E0=B8=99=E0=B8=B0?= =?UTF-8?q?=E0=B8=9A=E0=B8=B8=E0=B8=84=E0=B8=84=E0=B8=A5=E0=B8=A0=E0=B8=B2?= =?UTF-8?q?=E0=B8=A2=E0=B8=99=E0=B8=AD=E0=B8=81=20#2518?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/PlacementRepository.cs | 112 ++++++++++++++---- 1 file changed, 88 insertions(+), 24 deletions(-) diff --git a/BMA.EHR.Application/Repositories/PlacementRepository.cs b/BMA.EHR.Application/Repositories/PlacementRepository.cs index 82b71b79..2b40d702 100644 --- a/BMA.EHR.Application/Repositories/PlacementRepository.cs +++ b/BMA.EHR.Application/Repositories/PlacementRepository.cs @@ -8,6 +8,17 @@ using Newtonsoft.Json; namespace BMA.EHR.Application.Repositories { + /// + /// Response model จาก Org API (check-isLeave) + /// + public class OrgProfileResult + { + public string citizenId { get; set; } = ""; + public string? profileId { get; set; } + public bool isLeave { get; set; } + public bool isActive { get; set; } + } + public class PlacementRepository : GenericRepository { #region " Fields " @@ -83,39 +94,43 @@ namespace BMA.EHR.Application.Repositories /// /// Job อัพเดทสถานะผู้สอบผ่านที่ลาออกไปแล้วแต่ยังไม่ส่งไปออกคำสั่ง + /// และอัพเดทบุคคลภายนอกที่เข้ามาอยู่ในระบบแล้ว /// ทำงานทุกวันเวลา 05:00 น. /// public async Task UpdateStatusPlacementProfiles() { Console.WriteLine("[Job:UpdateStatusPlacementProfiles] === STARTED ==="); - var officerProfileIds = await _dbContext.Set() - .Where(p => !string.IsNullOrEmpty(p.profileId) - && p.IsOfficer == true + // 1. Query ทั้ง 2 กรณี: ทุกคนที่ยังไม่ DONE + var allCitizenIds = await _dbContext.Set() + .Where(p => !string.IsNullOrEmpty(p.CitizenId) && p.PlacementStatus != "DONE" - // && p.Id == Guid.Parse("08deb7de-3030-4d1b-8519-8148584949fc") + // && p.CitizenId == "2536721883131" ) - .Select(p => p.profileId) + .Select(p => new { p.CitizenId, p.IsOfficer }) .ToListAsync(); - if (!officerProfileIds.Any()) + if (!allCitizenIds.Any()) { Console.WriteLine("[Job:UpdateStatusPlacementProfiles] No profiles to process"); return; } - Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] พบข้าราชการที่สอบผ่านทั้งหมด {officerProfileIds.Count} คน ที่ยังไม่ส่งไปออกคำสั่ง"); + var officerCount = allCitizenIds.Count(x => x.IsOfficer == true); + var notOfficerCount = allCitizenIds.Count(x => x.IsOfficer == false); + Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] พบข้าราชการ {officerCount} คน, บุคคลภายนอก {notOfficerCount} คน"); + // 2. ส่ง citizenIds ทั้งหมดไป Org API ครั้งเดียว + var citizenIds = allCitizenIds.Select(x => x.CitizenId).Distinct().ToList(); var apiUrl = $"{_configuration["API"]}/org/dotnet/check-isLeave"; - List leaveProfileIds = new(); + + List orgResults = new(); using (var client = new HttpClient()) { client.DefaultRequestHeaders.Add("api-key", _configuration["API_KEY"]); - var payload = new - { - profileIds = officerProfileIds.Distinct().ToList() - }; + + var payload = new { citizenIds }; var jsonPayload = JsonConvert.SerializeObject(payload); var content = new StringContent(jsonPayload, System.Text.Encoding.UTF8, "application/json"); @@ -123,15 +138,16 @@ namespace BMA.EHR.Application.Repositories { var response = await client.PostAsync(apiUrl, content); var result = await response.Content.ReadAsStringAsync(); + var responseObj = JsonConvert.DeserializeAnonymousType(result, new { status = 0, message = "", - result = new List() + result = new List() }); - leaveProfileIds = responseObj.result ?? new(); - Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] พบ {leaveProfileIds.Count} รายการที่ลาออก"); + orgResults = responseObj?.result ?? new(); + Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] Org API ตอบกลับ {orgResults.Count} รายการ"); } catch (Exception ex) { @@ -140,18 +156,35 @@ namespace BMA.EHR.Application.Repositories } } - if (leaveProfileIds.Any()) + if (!orgResults.Any()) { - var batchSize = 500; - var totalUpdated = 0; - var totalBatches = (int)Math.Ceiling((double)leaveProfileIds.Count / batchSize); + Console.WriteLine("[Job:UpdateStatusPlacementProfiles] ไม่มีรายการต้องอัปเดต"); + Console.WriteLine("[Job:UpdateStatusPlacementProfiles] === COMPLETED ==="); + return; + } + // 3. แยกข้อมูลตามเงื่อนไข + var leaveCitizenIds = orgResults.Where(x => x.isLeave).Select(x => x.citizenId).ToList(); + var inSystemProfiles = orgResults.Where(x => x.isActive && !x.isLeave && !string.IsNullOrEmpty(x.profileId)).ToList(); + + Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] ลาออก {leaveCitizenIds.Count} รายการ, อยู่ที่ทะเบียนประวัติ {inSystemProfiles.Count} รายการ"); + + // 4. Split Batch Update (500 รายการ/batch) + var batchSize = 500; + var totalUpdated = 0; + + // 4.1 Update คนลาออก → IsOfficer = false + if (leaveCitizenIds.Any()) + { + var totalBatches = (int)Math.Ceiling((double)leaveCitizenIds.Count / batchSize); for (int i = 0; i < totalBatches; i++) { - var batch = leaveProfileIds.Skip(i * batchSize).Take(batchSize).ToList(); + var batch = leaveCitizenIds.Skip(i * batchSize).Take(batchSize).ToList(); var profilesToUpdate = await _dbContext.Set() - .Where(p => !string.IsNullOrEmpty(p.profileId) && batch.Contains(p.profileId)) + .Where(p => !string.IsNullOrEmpty(p.CitizenId) + && batch.Contains(p.CitizenId) + && p.IsOfficer == true) .ToListAsync(); foreach (var profile in profilesToUpdate) @@ -160,12 +193,43 @@ namespace BMA.EHR.Application.Repositories } await _dbContext.SaveChangesAsync(); - totalUpdated += profilesToUpdate.Count; - Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] Batch {i + 1}/{totalBatches} → อัปเดต {profilesToUpdate.Count} รายการ"); + Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] [ลาออก] Batch {i + 1}/{totalBatches} → อัปเดต {profilesToUpdate.Count} รายการ"); } - Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] อัปเดตรวมทั้งหมด {totalUpdated} รายการ → IsOfficer = false"); } + + // 4.2 Update คนที่อยู่ในทะเบียนประวัติ → profileId + IsOfficer = true + if (inSystemProfiles.Any()) + { + var totalBatches = (int)Math.Ceiling((double)inSystemProfiles.Count / batchSize); + for (int i = 0; i < totalBatches; i++) + { + var batch = inSystemProfiles.Skip(i * batchSize).Take(batchSize).ToList(); + var batchCitizenIds = batch.Select(x => x.citizenId).ToList(); + + var profilesToUpdate = await _dbContext.Set() + .Where(p => !string.IsNullOrEmpty(p.CitizenId) + && batchCitizenIds.Contains(p.CitizenId) + && p.IsOfficer == false) + .ToListAsync(); + + foreach (var profile in profilesToUpdate) + { + var orgProfile = batch.FirstOrDefault(x => x.citizenId == profile.CitizenId); + if (orgProfile != null) + { + profile.profileId = orgProfile.profileId; + profile.IsOfficer = true; + } + } + + await _dbContext.SaveChangesAsync(); + totalUpdated += profilesToUpdate.Count; + Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] [เข้าระบบ] Batch {i + 1}/{totalBatches} → อัปเดต {profilesToUpdate.Count} รายการ"); + } + } + + Console.WriteLine($"[Job:UpdateStatusPlacementProfiles] อัปเดตรวมทั้งหมด {totalUpdated} รายการ"); Console.WriteLine("[Job:UpdateStatusPlacementProfiles] === COMPLETED ==="); }