From c302d9b84885d284e5bf613bff14bbae575597c7 Mon Sep 17 00:00:00 2001 From: harid Date: Wed, 12 Nov 2025 23:23:04 +0700 Subject: [PATCH] #1927, #1938 --- Controllers/ExamReportController.cs | 188 ++++++++++++++++++++++++- Controllers/RecruitReportController.cs | 163 ++++++++++++++------- 2 files changed, 301 insertions(+), 50 deletions(-) diff --git a/Controllers/ExamReportController.cs b/Controllers/ExamReportController.cs index a4c64d9..a0e722c 100644 --- a/Controllers/ExamReportController.cs +++ b/Controllers/ExamReportController.cs @@ -13,6 +13,15 @@ using System.Text; using static System.Runtime.InteropServices.JavaScript.JSType; using System.Net.Http.Headers; using Newtonsoft.Json; +using iText.Kernel.Font; +using iText.Kernel.Pdf; +using iText.Layout.Element; +using iText.Layout.Properties; +using iText.Layout; +using iText.IO.Font; +using System.IO; +using System.Threading.Tasks; +using System; namespace BMA.EHR.Report.Service.Controllers { @@ -374,7 +383,7 @@ namespace BMA.EHR.Report.Service.Controllers return Error(ex); } } - + [HttpGet("candidate-exam/{id:length(36)}")] [AllowAnonymous] public async Task> GetCandidateExamListReportAsync(Guid id) @@ -656,6 +665,183 @@ namespace BMA.EHR.Report.Service.Controllers } } + [HttpGet("candidate-new/{id:length(36)}")] + [AllowAnonymous] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetCandidateListNewReportAsync(Guid id) + { + try + { + var data = await _context.Disables.AsQueryable() + .Include(x => x.PeriodExam) + .Where(x => x.PeriodExam.Id == id) + .OrderBy(x => x.ExamId) + .Select(p => new + { + ExamId = !string.IsNullOrEmpty(p.ExamId) ? p.ExamId.ToThaiNumber() : "", + FullName = $"{p.Prefix ?? ""}{p.FirstName ?? ""} {p.LastName ?? ""}", + //PositionName = p.PositionName, + ExamName = + ($"{p.PeriodExam.Name} ครั้งที่ {p.PeriodExam.Round}/{p.PeriodExam.Year.Value.ToThaiYear()}").ToThaiNumber(), + }).ToListAsync(); + + if (data.Count == 0) + return Error("ไม่พบข้อมูลในระบบ"); + + // เตรียม MemoryStream + using (var stream = new MemoryStream()) + { + // สร้าง PDF document + using (var writer = new PdfWriter(stream)) + using (var pdf = new PdfDocument(writer)) + using (var document = new Document(pdf, iText.Kernel.Geom.PageSize.A4)) + { + // font TH-Sarabun + var fontPath = System.IO.Path.Combine(Environment.CurrentDirectory, "Fonts", "THSarabun.ttf"); + var font = PdfFontFactory.CreateFont(fontPath, "Identity-H"); + document.SetFont(font).SetFontSize(16); + + // margin top, right, bottom, left + document.SetMargins(30, 15, 20, 15); + + // title + var title = new Paragraph($"รายชื่อผู้มีสิทธิ์สอบ\n{data.First().ExamName ?? ""}") + .SetBold() + .SetTextAlignment(TextAlignment.CENTER); + + document.Add(title); + + // create Table + var table = new iText.Layout.Element.Table(iText.Layout.Properties.UnitValue.CreatePercentArray(2)).UseAllAvailableWidth(); + + // header + string[] headers = { "เลขประจำตัวสอบ", "ชื่อ - นามสกุล" }; + foreach (var h in headers) + { + table.AddHeaderCell(new Cell().Add(new Paragraph(h)).SetTextAlignment(TextAlignment.CENTER).SetBold()); + } + // details + foreach (var x in data) + { + table.AddCell(new Cell().Add(new Paragraph(x.ExamId)).SetTextAlignment(TextAlignment.CENTER)); + table.AddCell(new Cell().Add(new Paragraph(x.FullName)).SetTextAlignment(TextAlignment.LEFT)); + } + + document.Add(table); + } + + return File(stream.ToArray(), "application/pdf", $"รายชื่อผู้มีสิทธิ์สอบ_{data.First().ExamName}"); + } + } + catch (Exception ex) + { + return Error(ex); + } + } + + [HttpGet("pass-new/{id:length(36)}")] + [AllowAnonymous] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetPassExamListNewReportAsync(Guid id) + { + try + { + var data = await _context.Disables.AsQueryable() + .Include(x => x.PeriodExam) + .ThenInclude(x => x.ScoreImport) + .Include(x => x.Documents) + .ThenInclude(x => x.DocumentFile) + .Join(_context.DisableScores.AsQueryable() + .Include(x => x.ScoreImport) + .Where(x => x.ScoreImport.PeriodExamId == id) + .Where(x => x.ExamStatus == "ผ่าน"), + rc => new { id = rc.PeriodExam.Id, examId = rc.ExamId }, + sc => new { id = sc.ScoreImport.PeriodExamId, examId = sc.ExamId }, + (p, sr) => new + { + Id = p.PeriodExam.Id, + FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", + ExamResult = sr == null ? "" : sr.ExamStatus, + ExamName = $"{p.PeriodExam.Name} ครั้งที่ {p.PeriodExam.Round.ToString().ToThaiNumber()}/{p.PeriodExam.Year.Value.ToThaiYear().ToString().ToThaiNumber()}", + Number = sr == null || sr.Number == null ? 0 : Convert.ToInt32(sr.Number), + SumScore = sr == null + ? "๐" + : (((double)(sr.SumA > 0 ? sr.SumA : 0) + (sr.SumB > 0 ? sr.SumB : 0) + (sr.SumC > 0 ? sr.SumC : 0)).ToString("0.00")).ToThaiNumber(), + }) + .OrderBy(x => x.Number) + .Where(x => x.Id == id) + .Where(x => x.ExamResult == "ผ่าน") + .ToListAsync(); + + if (data.Count == 0) + return Error("ไม่พบข้อมูลในระบบ"); + + var result = data.Select(x => new + { + Number = x.Number > 0 ? x.Number.ToString().ToThaiNumber() : "", + x.FullName, + x.SumScore + }).ToList(); + + // เตรียม MemoryStream + using (var stream = new MemoryStream()) + { + // สร้าง PDF document + using (var writer = new PdfWriter(stream)) + using (var pdf = new PdfDocument(writer)) + using (var document = new Document(pdf, iText.Kernel.Geom.PageSize.A4)) + { + // font TH-Sarabun + var fontPath = System.IO.Path.Combine(Environment.CurrentDirectory, "Fonts", "THSarabun.ttf"); + var font = PdfFontFactory.CreateFont(fontPath, "Identity-H"); + document.SetFont(font).SetFontSize(16); + + // margin top, right, bottom, left + document.SetMargins(30, 15, 20, 15); + + // title + var title = new Paragraph($"รายชื่อผู้สอบแข่งขันได้\n{data.First().ExamName ?? ""}") + .SetBold() + .SetTextAlignment(TextAlignment.CENTER); + + document.Add(title); + + // create Table + var table = new iText.Layout.Element.Table(iText.Layout.Properties.UnitValue.CreatePercentArray(4)).UseAllAvailableWidth(); + + // header + string[] headers = { "ลำดับที่", "สนามสอบ", "ชื่อ - นามสกุล", "คะแนนสอบ" }; + foreach (var h in headers) + { + table.AddHeaderCell(new Cell().Add(new Paragraph(h)).SetTextAlignment(TextAlignment.CENTER).SetBold()); + } + // details + foreach (var x in result) + { + table.AddCell(new Cell().Add(new Paragraph(x.Number)).SetTextAlignment(TextAlignment.CENTER)); + table.AddCell(new Cell()); + table.AddCell(new Cell().Add(new Paragraph(x.FullName)).SetTextAlignment(TextAlignment.LEFT)); + table.AddCell(new Cell().Add(new Paragraph(x.SumScore)).SetTextAlignment(TextAlignment.CENTER)); + } + + document.Add(table); + } + + return File(stream.ToArray(), "application/pdf", $"รายชื่อผู้สอบแข่งขันได้_{data.First().ExamName}"); + } + } + catch (Exception ex) + { + return Error(ex, "เกิดข้อผิดพลาดในการแสดงรายงาน"); + } + } + #endregion } } diff --git a/Controllers/RecruitReportController.cs b/Controllers/RecruitReportController.cs index f611142..ecc246c 100644 --- a/Controllers/RecruitReportController.cs +++ b/Controllers/RecruitReportController.cs @@ -4,6 +4,16 @@ using BMA.EHR.Profile.Service.Controllers; using BMA.EHR.Recruit.Service.Services; using BMA.EHR.Report.Service.Data; using BMA.EHR.Report.Service.Responses; +using Microsoft.AspNetCore.Mvc; +using iText.Kernel.Font; +using iText.Kernel.Pdf; +using iText.Layout.Element; +using iText.Layout.Properties; +using iText.Layout; +using iText.IO.Font; +using System.IO; +using System.Threading.Tasks; +using System; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -409,8 +419,6 @@ namespace BMA.EHR.Report.Service.Controllers .ThenInclude(x => x.ScoreImport) .Include(x => x.Documents) .ThenInclude(x => x.DocumentFile) - - .Join(_context.RecruitScores.AsQueryable() .Include(x => x.ScoreImport) .Where(x => x.ScoreImport.RecruitImportId == id) @@ -421,33 +429,13 @@ namespace BMA.EHR.Report.Service.Controllers { Id = p.RecruitImport.Id, ExamId = p.ExamId != null ? p.ExamId.ToThaiNumber() : string.Empty, - //CitizenId = p.CitizenId, - //p.Prefix, FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", - //DateOfBirth = p.DateOfBirth == null ? "" : p.DateOfBirth.ToThaiShortDate(), - //Gender = p.Gendor, - //Degree = p.Educations.FirstOrDefault() == null ? "" : p.Educations.FirstOrDefault().Degree, - //Major = p.Educations.FirstOrDefault() == null ? "" : p.Educations.FirstOrDefault().Major, - ExamResult = sr == null ? "" : sr.ExamStatus, - - //University = p.Educations.FirstOrDefault() == null ? "" : p.Educations.FirstOrDefault().University, - //PositionName = p.PositionName, ExamName = p.RecruitImport.Order == null ? "" : $"{p.RecruitImport.Name} ครั้งที่ {p.RecruitImport.Order.ToString().ToThaiNumber()}/{p.RecruitImport.Year.ToThaiYear().ToString().ToThaiNumber()}", - Number = sr == null || sr.Number == null ? 0 : Convert.ToInt32(sr.Number), - //ExamCount = _recruitService.GetExamCount(p.CitizenId), - //ScoreExpire = p.RecruitImport.AnnouncementDate == null ? "" : p.RecruitImport.AnnouncementDate.Value.AddYears(2).ToThaiShortDate(), - - - //FullA = sr.FullA == null ? 0.0 : sr.FullA, - //SumA = sr.SumA == null ? 0.0 : sr.SumA, - //FullB = sr.FullB == null ? 0.0 : sr.FullB, - //SumB = sr.SumB == null ? 0.0 : sr.SumB, - //FullC = sr.FullC == null ? 0.0 : sr.FullC, - //SumC = sr.SumC == null ? 0.0 : sr.SumC, + SumScore = sr == null ? "๐" : (((sr.SumA > 0 ? sr.SumA : 0) + (sr.SumB > 0 ? sr.SumB : 0) + (sr.SumC > 0 ? sr.SumC : 0)).ToString()).ToThaiNumber(), @@ -457,7 +445,7 @@ namespace BMA.EHR.Report.Service.Controllers .Where(x => x.ExamResult == "ผ่าน") .ToListAsync(); - if (data.Count == 0) + if (data.Count == 0) return Error("ไม่พบข้อมูลในระบบ"); var data_ = data.Select(x => new @@ -469,31 +457,6 @@ namespace BMA.EHR.Report.Service.Controllers x.SumScore }).ToList(); - //var rptFile = Path.Combine(_hostingEnvironment.ContentRootPath, "Report", "Recruit", $"rptPassExamList.trdp"); - //ReportPackager reportPackager = new ReportPackager(); - //Telerik.Reporting.Report report = null; - //using (var sourceStream = System.IO.File.OpenRead(rptFile)) - //{ - // report = (Telerik.Reporting.Report)reportPackager.UnpackageDocument(sourceStream); - //} - - ////report.DataSource = data; - //report.ReportParameters["ExamName"].Value = data_[0].ExamName.ToThaiNumber(); - //var tbl = (Telerik.Reporting.Table)report.Items["detailSection1"].Items["table1"]; - //tbl.DataSource = data_; - //System.Collections.Hashtable deviceInfo = new System.Collections.Hashtable(); - - //InstanceReportSource instanceReportSource = new InstanceReportSource() - //{ - // ReportDocument = report - //}; - - - //ReportProcessor reportProcessor = new ReportProcessor(_configuration); - //RenderingResult result = reportProcessor.RenderReport("PDF", instanceReportSource, deviceInfo); - - //var content = result.DocumentBytes; - //return File(content, "application/pdf", $"รายชื่อผู้สอบแข่งขันได้_{data.First().ExamName}.pdf"); var examName = data[0].ExamName; var _data = new { @@ -513,6 +476,108 @@ namespace BMA.EHR.Report.Service.Controllers } } + [HttpGet("pass-new/{id:length(36)}")] + [AllowAnonymous] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetPassExamListNewReportAsync(Guid id) + { + try + { + var data = await _context.Recruits.AsQueryable() + .Include(x => x.RecruitImport) + .ThenInclude(x => x.ScoreImport) + .Include(x => x.Documents) + .ThenInclude(x => x.DocumentFile) + .Join(_context.RecruitScores.AsQueryable() + .Include(x => x.ScoreImport) + .Where(x => x.ScoreImport.RecruitImportId == id) + .Where(x => x.ExamStatus == "ผ่าน"), + rc => new { id = rc.RecruitImport.Id, examId = rc.ExamId }, + sc => new { id = sc.ScoreImport.RecruitImportId, examId = sc.ExamId }, + (p, sr) => new + { + Id = p.RecruitImport.Id, + FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", + ExamResult = sr == null ? "" : sr.ExamStatus, + ExamName = p.RecruitImport.Order == null + ? "" + : $"{p.RecruitImport.Name} ครั้งที่ {p.RecruitImport.Order.ToString().ToThaiNumber()}/{p.RecruitImport.Year.ToThaiYear().ToString().ToThaiNumber()}", + Number = sr == null || sr.Number == null ? 0 : Convert.ToInt32(sr.Number), + SumScore = sr == null + ? "๐" + : (((decimal)(sr.SumA > 0 ? sr.SumA : 0) + (sr.SumB > 0 ? sr.SumB : 0) + (sr.SumC > 0 ? sr.SumC : 0)).ToString("0.00")).ToThaiNumber(), + }) + .OrderBy(x => x.Number) + .Where(x => x.Id == id) + .Where(x => x.ExamResult == "ผ่าน") + .ToListAsync(); + + if (data.Count == 0) + return Error("ไม่พบข้อมูลในระบบ"); + + var result = data.Select(x => new + { + Number = x.Number > 0 ? x.Number.ToString().ToThaiNumber() : "", + x.FullName, + x.SumScore + }).ToList(); + + // เตรียม MemoryStream + using (var stream = new MemoryStream()) + { + // สร้าง PDF document + using (var writer = new PdfWriter(stream)) + using (var pdf = new PdfDocument(writer)) + using (var document = new Document(pdf, iText.Kernel.Geom.PageSize.A4)) + { + // font TH-Sarabun + var fontPath = System.IO.Path.Combine(Environment.CurrentDirectory, "Fonts", "THSarabun.ttf"); + var font = PdfFontFactory.CreateFont(fontPath, "Identity-H"); + document.SetFont(font).SetFontSize(16); + + // margin top, right, bottom, left + document.SetMargins(30, 15, 20, 15); + + // title + var title = new Paragraph($"รายชื่อผู้สอบแข่งขันได้\n{data.First().ExamName ?? ""}") + .SetBold() + .SetTextAlignment(TextAlignment.CENTER); + + document.Add(title); + + // create Table + var table = new iText.Layout.Element.Table(iText.Layout.Properties.UnitValue.CreatePercentArray(4)).UseAllAvailableWidth(); + + // header + string[] headers = { "ลำดับที่", "สนามสอบ", "ชื่อ - นามสกุล", "คะแนนสอบ" }; + foreach (var h in headers) + { + table.AddHeaderCell(new Cell().Add(new Paragraph(h)).SetTextAlignment(TextAlignment.CENTER).SetBold()); + } + // details + foreach (var x in result) + { + table.AddCell(new Cell().Add(new Paragraph(x.Number)).SetTextAlignment(TextAlignment.CENTER)); + table.AddCell(new Cell()); + table.AddCell(new Cell().Add(new Paragraph(x.FullName)).SetTextAlignment(TextAlignment.LEFT)); + table.AddCell(new Cell().Add(new Paragraph(x.SumScore)).SetTextAlignment(TextAlignment.CENTER)); + } + + document.Add(table); + } + + return File(stream.ToArray(), "application/pdf", $"รายชื่อผู้สอบแข่งขันได้_{data.First().ExamName}"); + } + } + catch (Exception ex) + { + return Error(ex, "เกิดข้อผิดพลาดในการแสดงรายงาน"); + } + } + #endregion } }