From 4b07fe7409cdc81aaf18dc6ef0ae043653fdc6a2 Mon Sep 17 00:00:00 2001 From: Kittapath Date: Sat, 29 Apr 2023 14:51:42 +0700 Subject: [PATCH] =?UTF-8?q?=E0=B8=AA=E0=B8=AD=E0=B8=9A=E0=B8=84=E0=B8=B1?= =?UTF-8?q?=E0=B8=94=E0=B9=80=E0=B8=A5=E0=B8=B7=E0=B8=AD=E0=B8=81=E0=B9=82?= =?UTF-8?q?=E0=B8=AB=E0=B8=A5=E0=B8=94=E0=B8=AA=E0=B8=A3=E0=B8=B8=E0=B8=9B?= =?UTF-8?q?=E0=B8=82=E0=B9=89=E0=B8=AD=E0=B8=A1=E0=B8=B9=E0=B8=A5=E0=B8=81?= =?UTF-8?q?=E0=B8=B2=E0=B8=A3=E0=B8=AA=E0=B8=AD=E0=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controllers/PeriodExamController.cs | 31 ++- Request/RequestCandidateDashboard.cs | 10 + Services/PeriodExamService.cs | 343 ++++++++++++++++----------- 3 files changed, 250 insertions(+), 134 deletions(-) create mode 100644 Request/RequestCandidateDashboard.cs diff --git a/Controllers/PeriodExamController.cs b/Controllers/PeriodExamController.cs index 7802a5e..34d55bd 100644 --- a/Controllers/PeriodExamController.cs +++ b/Controllers/PeriodExamController.cs @@ -13,7 +13,8 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers [ApiVersion("1.0")] [ApiController] [Produces("application/json")] - [Authorize] + [AllowAnonymous] + // [Authorize] [SwaggerTag("จัดการข้อมูลรอบการสอบ เพื่อนำไปใช้งานในระบบ")] public class PeriodExamController : BaseController { @@ -698,6 +699,34 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers } } + /// + /// โหลดสรุปการสอบ + /// + /// รหัสรอบสมัคร + /// + /// เมื่อทำการอ่านโหลดสรุปการสอบสำเร็จ + /// ไม่ได้ Login เข้าระบบ + /// เมื่อเกิดข้อผิดพลาดในการทำงาน + [HttpPut("download/dashboard/{examId:length(36)}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetsDashboardExamAsync(string examId, RequestCandidateDashboard item) + { + try + { + var stream = await _periodExamService.GetsDashboardExamAsync(item, examId); + + string excelName = $"Candidate_{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx"; + return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName); + // return Success(); + } + catch (Exception ex) + { + return Error(ex); + } + } + /// /// ข้อมูลตำแหน่งสมัครสอบ /// รหัสรอบสมัคร diff --git a/Request/RequestCandidateDashboard.cs b/Request/RequestCandidateDashboard.cs new file mode 100644 index 0000000..653b2f4 --- /dev/null +++ b/Request/RequestCandidateDashboard.cs @@ -0,0 +1,10 @@ +using System.Net; + +namespace BMA.EHR.Recurit.Exam.Service.Request +{ + public class RequestCandidateDashboard + { + public DateTime DateStart { get; set; } + public DateTime DateEnd { get; set; } + } +} diff --git a/Services/PeriodExamService.cs b/Services/PeriodExamService.cs index b4ac8b8..a9ba62b 100644 --- a/Services/PeriodExamService.cs +++ b/Services/PeriodExamService.cs @@ -1130,56 +1130,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Services if (periodExam == null) throw new Exception(GlobalMessages.ExamNotFound); - // var _candidates = (from c in _context.Candidates - // where c.PeriodExam == periodExam - // select new - // { - // Id = c.Id, - // Status = c.Status, - // CitizenId = c.CitizenId, - // FullName = $"{c.PrefixName}{c.FirstName} {c.LastName}", - // Nationality = c.Nationality, - // DateOfBirth = c.DateOfBirth == null ? "" : c.DateOfBirth.Value.Date.ToThaiShortDate(), - // Age = c.DateOfBirth == null ? "" : c.DateOfBirth.Value.Date.CalculateGovAgeStr(0, 0), - // RelationshipName = c.RelationshipName, - // Telephone = c.Telephone, - // MobilePhone = c.MobilePhone, - // Email = c.Email, - // Knowledge = c.Knowledge, - // RegistAddress = c.RegistAddress, - // RegistProvinceName = c.RegistProvinceName, - // RegistDistrictName = c.RegistDistrictName, - // RegistSubDistrictName = c.RegistSubDistrictName, - // RegistZipCode = c.RegistZipCode, - // CurrentAddress = c.CurrentAddress, - // CurrentProvinceName = c.CurrentProvinceName, - // CurrentDistrictName = c.CurrentDistrictName, - // CurrentSubDistrictName = c.CurrentSubDistrictName, - // CurrentZipCode = c.CurrentZipCode, - // MarryFullName = $"{c.MarryPrefixName}{c.MarryFirstName} {c.MarryLastName}", - // FatherFullName = $"{c.FatherPrefixName}{c.FatherFirstName} {c.FatherLastName}", - // MotherFullName = $"{c.MotherPrefixName}{c.MotherFirstName} {c.MotherLastName}", - // OccupationType = c.OccupationType, - // OccupationPosition = c.OccupationPosition, - // OccupationCompany = c.OccupationCompany, - // OccupationDepartment = c.OccupationDepartment, - // OccupationEmail = c.OccupationEmail, - // OccupationTelephone = c.OccupationTelephone, - - - // Number = c.Number, - // ExamIdenNumber = c.ExamIdenNumber, - // SeatNumber = c.SeatNumber, - // PointTotalB = c.PointTotalB, - // PointB = c.PointB, - // ResultB = c.ResultB, - // PointTotalC = c.PointTotalC, - // PointC = c.PointC, - // ResultC = c.ResultC, - // Pass = c.Pass, - // } - // ).ToList(); - var candidates = await _context.Candidates .AsQueryable() .OrderBy(x => x.ExamIdenNumber) @@ -1229,6 +1179,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Services PointC = c.PointC, ResultC = c.ResultC, Pass = c.Pass, + CreatedAt = c.CreatedAt, }) .ToListAsync(); @@ -1291,52 +1242,11 @@ namespace BMA.EHR.Recurit.Exam.Service.Services summarySheet.Cells[1, 50].Value = "คะแนนภาค ค"; summarySheet.Cells[1, 51].Value = "ผลสอบภาค ค"; summarySheet.Cells[1, 52].Value = "ผลการสอบ"; + summarySheet.Cells[1, 53].Value = "วันที่สมัคร"; int row = 2; foreach (var item in candidates) { - summarySheet.Cells[row, 1].Value = GenerateStatusCandidate(item.Status); - summarySheet.Cells[row, 2].Value = item.CitizenId; - summarySheet.Cells[row, 3].Value = item.FullName; - summarySheet.Cells[row, 4].Value = item.Nationality; - summarySheet.Cells[row, 5].Value = item.DateOfBirth; - summarySheet.Cells[row, 6].Value = item.Age; - summarySheet.Cells[row, 7].Value = item.RelationshipName; - summarySheet.Cells[row, 8].Value = item.Telephone; - summarySheet.Cells[row, 9].Value = item.MobilePhone; - summarySheet.Cells[row, 10].Value = item.Email; - summarySheet.Cells[row, 11].Value = item.Knowledge; - summarySheet.Cells[row, 12].Value = item.RegistAddress; - summarySheet.Cells[row, 13].Value = item.RegistProvinceName; - summarySheet.Cells[row, 14].Value = item.RegistDistrictName; - summarySheet.Cells[row, 15].Value = item.RegistSubDistrictName; - summarySheet.Cells[row, 16].Value = item.RegistZipCode; - summarySheet.Cells[row, 17].Value = item.CurrentAddress; - summarySheet.Cells[row, 18].Value = item.CurrentProvinceName; - summarySheet.Cells[row, 19].Value = item.CurrentDistrictName; - summarySheet.Cells[row, 20].Value = item.CurrentSubDistrictName; - summarySheet.Cells[row, 21].Value = item.CurrentZipCode; - summarySheet.Cells[row, 22].Value = item.MarryFullName; - summarySheet.Cells[row, 23].Value = item.FatherFullName; - summarySheet.Cells[row, 24].Value = item.MotherFullName; - summarySheet.Cells[row, 25].Value = GenerateStatusOccupation(item.OccupationType); - summarySheet.Cells[row, 26].Value = item.OccupationPosition; - summarySheet.Cells[row, 27].Value = item.OccupationCompany; - summarySheet.Cells[row, 28].Value = item.OccupationDepartment; - summarySheet.Cells[row, 29].Value = item.OccupationEmail; - summarySheet.Cells[row, 30].Value = item.OccupationTelephone; - - summarySheet.Cells[row, 43].Value = item.Number; - summarySheet.Cells[row, 44].Value = item.ExamIdenNumber; - summarySheet.Cells[row, 45].Value = item.SeatNumber; - summarySheet.Cells[row, 46].Value = item.PointTotalB; - summarySheet.Cells[row, 47].Value = item.PointB; - summarySheet.Cells[row, 48].Value = item.ResultB; - summarySheet.Cells[row, 49].Value = item.PointTotalC; - summarySheet.Cells[row, 50].Value = item.PointC; - summarySheet.Cells[row, 51].Value = item.ResultC; - summarySheet.Cells[row, 52].Value = item.Pass; - row++; var educations = await _context.Educations .AsQueryable() .OrderBy(x => x.DurationStart) @@ -1391,6 +1301,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Services summarySheet.Cells[row, 50].Value = item.PointC; summarySheet.Cells[row, 51].Value = item.ResultC; summarySheet.Cells[row, 52].Value = item.Pass; + summarySheet.Cells[row, 53].Value = item.CreatedAt.Date.ToThaiShortDate(); row++; } var careers = await _context.Careers @@ -1447,6 +1358,53 @@ namespace BMA.EHR.Recurit.Exam.Service.Services summarySheet.Cells[row, 50].Value = item.PointC; summarySheet.Cells[row, 51].Value = item.ResultC; summarySheet.Cells[row, 52].Value = item.Pass; + summarySheet.Cells[row, 53].Value = item.CreatedAt.Date.ToThaiShortDate(); + row++; + } + if (educations.Count() == 0 && careers.Count() == 0) + { + summarySheet.Cells[row, 1].Value = GenerateStatusCandidate(item.Status); + summarySheet.Cells[row, 2].Value = item.CitizenId; + summarySheet.Cells[row, 3].Value = item.FullName; + summarySheet.Cells[row, 4].Value = item.Nationality; + summarySheet.Cells[row, 5].Value = item.DateOfBirth; + summarySheet.Cells[row, 6].Value = item.Age; + summarySheet.Cells[row, 7].Value = item.RelationshipName; + summarySheet.Cells[row, 8].Value = item.Telephone; + summarySheet.Cells[row, 9].Value = item.MobilePhone; + summarySheet.Cells[row, 10].Value = item.Email; + summarySheet.Cells[row, 11].Value = item.Knowledge; + summarySheet.Cells[row, 12].Value = item.RegistAddress; + summarySheet.Cells[row, 13].Value = item.RegistProvinceName; + summarySheet.Cells[row, 14].Value = item.RegistDistrictName; + summarySheet.Cells[row, 15].Value = item.RegistSubDistrictName; + summarySheet.Cells[row, 16].Value = item.RegistZipCode; + summarySheet.Cells[row, 17].Value = item.CurrentAddress; + summarySheet.Cells[row, 18].Value = item.CurrentProvinceName; + summarySheet.Cells[row, 19].Value = item.CurrentDistrictName; + summarySheet.Cells[row, 20].Value = item.CurrentSubDistrictName; + summarySheet.Cells[row, 21].Value = item.CurrentZipCode; + summarySheet.Cells[row, 22].Value = item.MarryFullName; + summarySheet.Cells[row, 23].Value = item.FatherFullName; + summarySheet.Cells[row, 24].Value = item.MotherFullName; + summarySheet.Cells[row, 25].Value = GenerateStatusOccupation(item.OccupationType); + summarySheet.Cells[row, 26].Value = item.OccupationPosition; + summarySheet.Cells[row, 27].Value = item.OccupationCompany; + summarySheet.Cells[row, 28].Value = item.OccupationDepartment; + summarySheet.Cells[row, 29].Value = item.OccupationEmail; + summarySheet.Cells[row, 30].Value = item.OccupationTelephone; + + summarySheet.Cells[row, 43].Value = item.Number; + summarySheet.Cells[row, 44].Value = item.ExamIdenNumber; + summarySheet.Cells[row, 45].Value = item.SeatNumber; + summarySheet.Cells[row, 46].Value = item.PointTotalB; + summarySheet.Cells[row, 47].Value = item.PointB; + summarySheet.Cells[row, 48].Value = item.ResultB; + summarySheet.Cells[row, 49].Value = item.PointTotalC; + summarySheet.Cells[row, 50].Value = item.PointC; + summarySheet.Cells[row, 51].Value = item.ResultC; + summarySheet.Cells[row, 52].Value = item.Pass; + summarySheet.Cells[row, 53].Value = item.CreatedAt.Date.ToThaiShortDate(); row++; } } @@ -1458,51 +1416,170 @@ namespace BMA.EHR.Recurit.Exam.Service.Services return stream; } - // public async Task GetsDashboardExamAsync(string examId) - // { - // var periodExam = await _context.PeriodExams.AsQueryable() - // .FirstOrDefaultAsync(x => x.Id == Guid.Parse(examId)); + public async Task GetsDashboardExamAsync(RequestCandidateDashboard item, string examId) + { + var periodExam = await _context.PeriodExams.AsQueryable() + .FirstOrDefaultAsync(x => x.Id == Guid.Parse(examId)); - // if (periodExam == null) - // throw new Exception(GlobalMessages.ExamNotFound); + if (periodExam == null) + throw new Exception(GlobalMessages.ExamNotFound); - // var stream = new MemoryStream(); - // using (var package = new ExcelPackage(stream)) - // { - // var summarySheet = package.Workbook.Worksheets.Add("Dashboard"); - // summarySheet.TabColor = System.Drawing.Color.Black; - // // summarySheet.DefaultRowHeight = 17; - // summarySheet.Row(1).Style.Font.Bold = true; - // summarySheet.Cells[1, 1].Value = "จำนวนผู้สมัครคัดเลือกทั้งหมด"; - // summarySheet.Cells[1, 2].Value = "จำนวนผู้มีสิทธิ์เข้ารับคัดเลือกทั้งหมด"; - // summarySheet.Cells[1, 3].Value = "จำนวนผู้เข้ารับการคัดเลือกทั้งหมด"; - // summarySheet.Cells[1, 4].Value = "ผ่านการสอบ"; - // summarySheet.Cells[1, 5].Value = "ไม่ผ่านการสอบ"; - // summarySheet.Cells[1, 6].Value = "คะแนนภาค ข"; - // summarySheet.Cells[1, 7].Value = "ผลสอบภาค ข"; - // summarySheet.Cells[1, 8].Value = "คะแนนเต็มภาค ค"; - // summarySheet.Cells[1, 9].Value = "คะแนนภาค ค"; - // summarySheet.Cells[1, 10].Value = "ผลสอบภาค ค"; - // summarySheet.Cells[1, 11].Value = "ผลการสอบ"; + var candidates = await _context.Candidates + .AsQueryable() + .OrderBy(x => x.ExamIdenNumber) + .Where(x => x.CreatedAt.Date <= item.DateEnd.Date) + .Where(x => x.CreatedAt.Date >= item.DateStart.Date) + .Where(x => x.PeriodExam == periodExam) + .Select(c => new + { + Id = c.Id, + Status = c.Status, + CitizenId = c.CitizenId, + FullName = $"{c.PrefixName}{c.FirstName} {c.LastName}", + Nationality = c.Nationality, + DateOfBirth = c.DateOfBirth == null ? "" : c.DateOfBirth.Value.Date.ToThaiShortDate(), + Age = c.DateOfBirth == null ? 0 : DateTime.Now.Date.Year - c.DateOfBirth.Value.Date.Year, + RelationshipName = c.RelationshipName, + Telephone = c.Telephone, + MobilePhone = c.MobilePhone, + Email = c.Email, + Knowledge = c.Knowledge, + RegistAddress = c.RegistAddress, + RegistProvinceName = c.RegistProvinceName, + RegistDistrictName = c.RegistDistrictName, + RegistSubDistrictName = c.RegistSubDistrictName, + RegistZipCode = c.RegistZipCode, + CurrentAddress = c.CurrentAddress, + CurrentProvinceName = c.CurrentProvinceName, + CurrentDistrictName = c.CurrentDistrictName, + CurrentSubDistrictName = c.CurrentSubDistrictName, + CurrentZipCode = c.CurrentZipCode, + MarryFullName = $"{c.MarryPrefixName}{c.MarryFirstName} {c.MarryLastName}", + FatherFullName = $"{c.FatherPrefixName}{c.FatherFirstName} {c.FatherLastName}", + MotherFullName = $"{c.MotherPrefixName}{c.MotherFirstName} {c.MotherLastName}", + OccupationType = c.OccupationType, + OccupationPosition = c.OccupationPosition, + OccupationCompany = c.OccupationCompany, + OccupationDepartment = c.OccupationDepartment, + OccupationEmail = c.OccupationEmail, + OccupationTelephone = c.OccupationTelephone, + Number = c.Number, + ExamIdenNumber = c.ExamIdenNumber, + SeatNumber = c.SeatNumber, + PointTotalB = c.PointTotalB, + PointB = c.PointB, + ResultB = c.ResultB, + PointTotalC = c.PointTotalC, + PointC = c.PointC, + ResultC = c.ResultC, + Pass = c.Pass, + CreatedAt = c.CreatedAt, + }) + .ToListAsync(); - // summarySheet.Cells[2, 1].Value = periodExam; - // summarySheet.Cells[2, 2].Value = periodExam; - // summarySheet.Cells[2, 3].Value = periodExam; - // summarySheet.Cells[2, 4].Value = periodExam; - // summarySheet.Cells[2, 5].Value = periodExam; - // summarySheet.Cells[2, 6].Value = periodExam; - // summarySheet.Cells[2, 7].Value = periodExam; - // summarySheet.Cells[2, 8].Value = periodExam; - // summarySheet.Cells[2, 9].Value = periodExam; - // summarySheet.Cells[2, 10].Value = periodExam; - // summarySheet.Cells[2, 11].Value = periodExam; - // summarySheet.Cells[summarySheet.Dimension.Address].AutoFitColumns(); - // package.Save(); - // } + var stream = new MemoryStream(); + using (var package = new ExcelPackage(stream)) + { + var summarySheet = package.Workbook.Worksheets.Add("Dashboard"); + summarySheet.TabColor = System.Drawing.Color.Black; + // summarySheet.DefaultRowHeight = 17; + summarySheet.Column(1).Style.Font.Bold = true; + summarySheet.Row(4).Style.Font.Bold = true; + summarySheet.Cells[1, 3].Style.Font.Bold = true; + int rowName = 2; + int rowCount = 2; + summarySheet.Cells[1, 1].Value = "ตั้งแต่"; + summarySheet.Cells[1, 2].Value = item.DateStart.Date.ToThaiShortDate(); + summarySheet.Cells[1, 3].Value = "ถึง"; + summarySheet.Cells[1, 4].Value = item.DateEnd.Date.ToThaiShortDate(); + summarySheet.Cells[2, 1].Value = "ชื่อรอบการสอบ/ชื่อประกาศ"; + summarySheet.Cells[2, 2].Value = periodExam.Name; + summarySheet.Cells[3, 1].Value = "ครั้งที่"; + summarySheet.Cells[3, 2].Value = $"{periodExam.Round}/{periodExam.Year + 543}"; + if (candidates.Count() > 0) + { + summarySheet.Cells[5, 1].Value = "จำนวน"; + // summarySheet.Cells[1, 6].Value = "คะแนนภาค ข"; + // summarySheet.Cells[1, 7].Value = "ผลสอบภาค ข"; + // summarySheet.Cells[1, 8].Value = "คะแนนเต็มภาค ค"; + // summarySheet.Cells[1, 9].Value = "คะแนนภาค ค"; + // summarySheet.Cells[1, 10].Value = "ผลสอบภาค ค"; + // summarySheet.Cells[1, 11].Value = "ผลการสอบ"; + var educations = await _context.Educations + .AsQueryable() + .Where(x => x.Candidate.PeriodExam == periodExam) + .Where(x => x.Candidate.CreatedAt.Date <= item.DateEnd.Date) + .Where(x => x.Candidate.CreatedAt.Date >= item.DateStart.Date) + .GroupBy(x => x.EducationLevelName) + .Select(x => new + { + Name = x.Key, + Count = x.Count(), + }) + .ToListAsync(); - // stream.Position = 0; - // return stream; - // } + foreach (var education in educations) + { + summarySheet.Cells[4, rowName].Value = education.Name; + summarySheet.Cells[5, rowCount].Value = education.Count; + rowName++; + rowCount++; + } + var careers = await _context.Careers + .AsQueryable() + .Where(x => x.Candidate.PeriodExam == periodExam) + .Where(x => x.Candidate.CreatedAt.Date <= item.DateEnd.Date) + .Where(x => x.Candidate.CreatedAt.Date >= item.DateStart.Date) + .GroupBy(x => x.Name) + .Select(x => new + { + Name = x.Key, + Count = x.Count(), + }) + .ToListAsync(); + foreach (var career in careers) + { + summarySheet.Cells[4, rowName].Value = career.Name; + summarySheet.Cells[5, rowCount].Value = career.Count; + rowName++; + rowCount++; + } + summarySheet.Cells[4, rowName].Value = "อายุ 1-20 ปี"; + summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 1 && x.Age <= 20).Count(); + rowName++; + rowCount++; + summarySheet.Cells[4, rowName].Value = "อายุ 21-45 ปี"; + summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 21 && x.Age <= 45).Count(); + rowName++; + rowCount++; + summarySheet.Cells[4, rowName].Value = "อายุ 46-60 ปี"; + summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 46 && x.Age <= 60).Count(); + rowName++; + rowCount++; + summarySheet.Cells[4, rowName].Value = "อายุ 61-70 ปี"; + summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 61 && x.Age <= 70).Count(); + rowName++; + rowCount++; + summarySheet.Cells[4, rowName].Value = "อายุ 71-80 ปี"; + summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 71 && x.Age <= 80).Count(); + rowName++; + rowCount++; + summarySheet.Cells[4, rowName].Value = "อายุ 80 ปีขึ้นไป"; + summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 81).Count(); + rowName++; + rowCount++; + } + else + { + summarySheet.Cells[5, 1].Value = "ไม่มีผู้สมัครสอบในช่วงเวลานี้"; + } + summarySheet.Cells[summarySheet.Dimension.Address].AutoFitColumns(); + package.Save(); + } + + stream.Position = 0; + return stream; + } #endregion } }