From 6f9cde18117fc5d45434afceb924ecf8fdf8a30a Mon Sep 17 00:00:00 2001 From: harid Date: Mon, 8 Jun 2026 16:37:42 +0700 Subject: [PATCH] =?UTF-8?q?fix=20=E0=B8=A3=E0=B8=B0=E0=B8=9A=E0=B8=9A?= =?UTF-8?q?=E0=B9=81=E0=B8=88=E0=B9=89=E0=B8=87=20"=E0=B9=84=E0=B8=A1?= =?UTF-8?q?=E0=B9=88=E0=B8=9E=E0=B8=9A=E0=B8=82=E0=B9=89=E0=B8=AD=E0=B8=A1?= =?UTF-8?q?=E0=B8=B9=E0=B8=A5"=20#2553?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + Controllers/RecruitController.cs | 371 +++++++++++++++++++++---------- 2 files changed, 260 insertions(+), 113 deletions(-) diff --git a/.gitignore b/.gitignore index 154e127..890ce3e 100644 --- a/.gitignore +++ b/.gitignore @@ -475,3 +475,5 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk + +.claude \ No newline at end of file diff --git a/Controllers/RecruitController.cs b/Controllers/RecruitController.cs index 7d246ff..d33b725 100644 --- a/Controllers/RecruitController.cs +++ b/Controllers/RecruitController.cs @@ -1659,89 +1659,179 @@ namespace BMA.EHR.Recruit.Controllers { try { - var data = await _context.Recruits.AsQueryable() + #region old + // var data = await _context.Recruits.AsQueryable() + // .Include(x => x.RecruitImport) + // .Include(x => x.Documents) + // .ThenInclude(x => x.DocumentFile) + // .Where(x => x.RecruitImport!.Id == id) + // .Where(x => x.ExamId == examId) + // .Join(_context.RecruitScores.AsQueryable() + // .Include(x => x.ScoreImport), + // rc => new { rc.RecruitImport!.Id, rc.ExamId }, + // sc => new { Id = sc.ScoreImport!.RecruitImportId, sc.ExamId }, + // (p, sr) => new + // { + // ExamID = p.ExamId, + // ProfileID = p.CitizenId, + // p.Prefix, + // FullName = $"{p.FirstName} {p.LastName}", + // DateOfBirth = p.DateOfBirth.HasValue && p.DateOfBirth.Value != DateTime.MinValue + // ? p.DateOfBirth.Value.ToThaiShortDate() + // : "", + // Gender = p.Gendor, + // Degree = p.Educations.First().Degree, + // Major = p.Educations.First().Major, + // CertificateNo = p.Certificates.Count > 0 + // ? p.Certificates.First().CertificateNo ?? "" + // : "", + // CertificateIssueDate = p.Certificates.Count > 0 + // ? p.Certificates.First().IssueDate != DateTime.MinValue + // ? p.Certificates.First().IssueDate.ToThaiShortDate() + // : "" + // : "", + // ExamResult = sr == null ? "" : sr.ExamStatus, + // // ExamAttribute = p.Certificates.Count > 0 ? + // // _recruitService.CheckValidCertificate(p.Certificates.First().IssueDate, 5) + // // ? "มีคุณสมบัติ" + // // : "ไม่มีคุณสมบัติ" + // // : "ไม่มีคุณสมบัติ", + // + // ExamAttribute = sr != null && !string.IsNullOrEmpty(sr.ExamAttribute) && + // (sr.ExamAttribute == "มีคุณสมบัติ" || sr.ExamAttribute == "ไม่มีคุณสมบัติ") + // ? sr.ExamAttribute : "", + // + // IsSpecial = p.Isspecial, + // Remark = p.Remark, + // University = p.Educations.First().University, + // PositionName = p.PositionName, + // PositionType = p.PositionType, + // PositionLevel = p.PositionLevel, + // ExamName = p.RecruitImport!.Name, + // ExamOrder = p.RecruitImport.Order, + // ExamYear = p.RecruitImport.Year.ToThaiYear(), + // Score = sr == null ? 0.0 : sr.TotalScore, + // Number = sr == null ? "" : sr.Number, + // ExamCount = _recruitService.GetExamCount(p.CitizenId), + // ScoreExpire = p.RecruitImport.AnnouncementDate == null + // ? "" + // : p.RecruitImport.AnnouncementDate != DateTime.MinValue + // ? p.RecruitImport.AnnouncementDate.Value.AddYears(2).ToThaiShortDate() + // : "", + // typeTest = p.typeTest, + // ScoreResult = sr == null ? null : new + // { + // ScoreAFull = sr.FullA, + // ScoreA = sr.SumA, + // ScoreBFull = sr.FullB, + // ScoreB = sr.SumB, + // ScoreAB = sr.SumAB, + // ScoreCFull = sr.FullC, + // ScoreC = sr.SumC, + // ScoreDFull = sr.FullD, + // ScoreD = sr.SumD, + // ScoreCD = sr.SumCD, + // ScoreSumFull = sr.FullScore, + // ScoreSum = sr.TotalScore, + // ExamResult = sr.ExamStatus + // }, + // Attachments = p.Documents.Select(a => new + // { + // FileName = a.DocumentFile.FileName, + // DocumentId = a.DocumentFile.Id + // }) + // }) + // .FirstOrDefaultAsync(); + #endregion + + // Step 1: Query ข้อมูลผู้สอบ + var recruit = await _context.Recruits.AsQueryable() .Include(x => x.RecruitImport) .Include(x => x.Documents) .ThenInclude(x => x.DocumentFile) + .Include(x => x.Educations) + .Include(x => x.Certificates) .Where(x => x.RecruitImport!.Id == id) .Where(x => x.ExamId == examId) - .Join(_context.RecruitScores.AsQueryable() - .Include(x => x.ScoreImport), - rc => new { rc.RecruitImport!.Id, rc.ExamId }, - sc => new { Id = sc.ScoreImport!.RecruitImportId, sc.ExamId }, - (p, sr) => new - { - ExamID = p.ExamId, - ProfileID = p.CitizenId, - p.Prefix, - FullName = $"{p.FirstName} {p.LastName}", - DateOfBirth = p.DateOfBirth.HasValue && p.DateOfBirth.Value != DateTime.MinValue - ? p.DateOfBirth.Value.ToThaiShortDate() - : "", - Gender = p.Gendor, - Degree = p.Educations.First().Degree, - Major = p.Educations.First().Major, - CertificateNo = p.Certificates.Count > 0 - ? p.Certificates.First().CertificateNo ?? "" - : "", - CertificateIssueDate = p.Certificates.Count > 0 - ? p.Certificates.First().IssueDate != DateTime.MinValue - ? p.Certificates.First().IssueDate.ToThaiShortDate() - : "" - : "", - ExamResult = sr == null ? "" : sr.ExamStatus, - // ExamAttribute = p.Certificates.Count > 0 ? - // _recruitService.CheckValidCertificate(p.Certificates.First().IssueDate, 5) - // ? "มีคุณสมบัติ" - // : "ไม่มีคุณสมบัติ" - // : "ไม่มีคุณสมบัติ", - - ExamAttribute = sr != null && !string.IsNullOrEmpty(sr.ExamAttribute) && - (sr.ExamAttribute == "มีคุณสมบัติ" || sr.ExamAttribute == "ไม่มีคุณสมบัติ") - ? sr.ExamAttribute : "", - - IsSpecial = p.Isspecial, - Remark = p.Remark, - University = p.Educations.First().University, - PositionName = p.PositionName, - PositionType = p.PositionType, - PositionLevel = p.PositionLevel, - ExamName = p.RecruitImport!.Name, - ExamOrder = p.RecruitImport.Order, - ExamYear = p.RecruitImport.Year.ToThaiYear(), - Score = sr == null ? 0.0 : sr.TotalScore, - Number = sr == null ? "" : sr.Number, - ExamCount = _recruitService.GetExamCount(p.CitizenId), - ScoreExpire = p.RecruitImport.AnnouncementDate == null - ? "" - : p.RecruitImport.AnnouncementDate != DateTime.MinValue - ? p.RecruitImport.AnnouncementDate.Value.AddYears(2).ToThaiShortDate() - : "", - typeTest = p.typeTest, - ScoreResult = sr == null ? null : new - { - ScoreAFull = sr.FullA, - ScoreA = sr.SumA, - ScoreBFull = sr.FullB, - ScoreB = sr.SumB, - ScoreAB = sr.SumAB, - ScoreCFull = sr.FullC, - ScoreC = sr.SumC, - ScoreDFull = sr.FullD, - ScoreD = sr.SumD, - ScoreCD = sr.SumCD, - ScoreSumFull = sr.FullScore, - ScoreSum = sr.TotalScore, - ExamResult = sr.ExamStatus - }, - Attachments = p.Documents.Select(a => new - { - FileName = a.DocumentFile.FileName, - DocumentId = a.DocumentFile.Id - }) - }) .FirstOrDefaultAsync(); + if (recruit == null) + return Success(); + + // Step 2: Query ข้อมูลคะแนน — แยกต่างหาก ไม่มีก็ผ่าน + var score = await _context.RecruitScores.AsQueryable() + .Include(x => x.ScoreImport) + .Where(x => x.ScoreImport != null) + .Where(x => x.ScoreImport.RecruitImportId == id) + .Where(x => x.ExamId == examId) + .FirstOrDefaultAsync(); + + // Step 3: รวมผลลัพธ์ — score เป็น null ก็ได้ข้อมูลผู้สอบ + var data = new + { + ExamID = recruit.ExamId, + ProfileID = recruit.CitizenId, + recruit.Prefix, + FullName = $"{recruit.FirstName} {recruit.LastName}", + DateOfBirth = recruit.DateOfBirth.HasValue && recruit.DateOfBirth.Value != DateTime.MinValue + ? recruit.DateOfBirth.Value.ToThaiShortDate() + : "", + Gender = recruit.Gendor, + Degree = recruit.Educations.Count > 0 ? recruit.Educations.First().Degree : "", + Major = recruit.Educations.Count > 0 ? recruit.Educations.First().Major : "", + CertificateNo = recruit.Certificates.Count > 0 + ? recruit.Certificates.First().CertificateNo ?? "" + : "", + CertificateIssueDate = recruit.Certificates.Count > 0 + ? recruit.Certificates.First().IssueDate != DateTime.MinValue + ? recruit.Certificates.First().IssueDate.ToThaiShortDate() + : "" + : "", + ExamResult = score == null ? "" : score.ExamStatus, + ExamAttribute = score != null && !string.IsNullOrEmpty(score.ExamAttribute) && + (score.ExamAttribute == "มีคุณสมบัติ" || score.ExamAttribute == "ไม่มีคุณสมบัติ") + ? score.ExamAttribute : "", + IsSpecial = recruit.Isspecial, + Remark = recruit.Remark, + University = recruit.Educations.Count > 0 ? recruit.Educations.First().University : "", + PositionName = recruit.PositionName, + PositionType = recruit.PositionType, + PositionLevel = recruit.PositionLevel, + ExamName = recruit.RecruitImport!.Name, + ExamOrder = recruit.RecruitImport.Order, + ExamYear = recruit.RecruitImport.Year.ToThaiYear(), + Score = score == null ? 0.0 : score.TotalScore, + Number = score == null ? "" : score.Number, + ExamCount = _recruitService.GetExamCount(recruit.CitizenId), + ScoreExpire = recruit.RecruitImport.AnnouncementDate == null + ? "" + : recruit.RecruitImport.AnnouncementDate != DateTime.MinValue + ? recruit.RecruitImport.AnnouncementDate.Value.AddYears(2).ToThaiShortDate() + : "", + typeTest = recruit.typeTest, + ScoreResult = score == null ? null : new + { + ScoreAFull = score.FullA, + ScoreA = score.SumA, + ScoreBFull = score.FullB, + ScoreB = score.SumB, + ScoreAB = score.SumAB, + ScoreCFull = score.FullC, + ScoreC = score.SumC, + ScoreDFull = score.FullD, + ScoreD = score.SumD, + ScoreCD = score.SumCD, + ScoreSumFull = score.FullScore, + ScoreSum = score.TotalScore, + ExamResult = score.ExamStatus + }, + Attachments = recruit.Documents.Select(a => new + { + FileName = a.DocumentFile.FileName, + DocumentId = a.DocumentFile.Id + }) + }; + return Success(data); } catch (Exception ex) @@ -2454,48 +2544,103 @@ namespace BMA.EHR.Recruit.Controllers { try { - var data = await _context.Recruits.AsQueryable() + #region old + // var data = await _context.Recruits.AsQueryable() + // .Include(x => x.RecruitImport) + // .Where(x => x.RecruitImport!.Id == id) + // .Where(x => x.ExamId == examId) + // .Join(_context.RecruitScores.AsQueryable() + // .Include(x => x.ScoreImport), + // rc => new { rc.RecruitImport!.Id, rc.ExamId }, + // sc => new { Id = sc.ScoreImport!.RecruitImportId, sc.ExamId }, + // (p, sr) => new + // { + // ExamID = p.ExamId != null ? p.ExamId.ToThaiNumber() : "", + // CitizenId = p.CitizenId != null ? p.CitizenId.ToThaiNumber() : "", + // FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", + // DateOfBirth = p.DateOfBirth.HasValue && p.DateOfBirth.Value != DateTime.MinValue + // ? p.DateOfBirth.Value.ToThaiShortDate().ToThaiNumber() + // : "", + // Gender = p.Gendor, + // Degree = p.Educations.First().Degree, + // Major = p.Educations.First().Major, + // University = p.Educations.First().University, + // PositionName = p.PositionName, + // ExamName = $"{p.RecruitImport!.Name} ครั้งที่ {p.RecruitImport.Order}/{p.RecruitImport.Year.ToThaiYear()}".ToThaiNumber(), + // ExamCount = _recruitService.GetExamCount(p.CitizenId).ToString().ToThaiNumber(), + // type = p.typeTest == "bangkok" ? "กทม." : p.typeTest == "ocsc" ? "ก.พ." : "", + // FA = sr.FullA != null ? sr.FullA.ToString().ToThaiNumber() : "", + // SA = sr.SumA != null ? sr.SumA.ToString().ToThaiNumber() : "", + // FC = sr.FullC != null ? sr.FullC.ToString().ToThaiNumber() : "", + // SC = sr.SumC != null ? sr.SumC.ToString().ToThaiNumber() : "", + // FD = sr.FullD != null ? sr.FullD.ToString().ToThaiNumber() : "", + // SD = sr.SumD != null ? sr.SumD.ToString().ToThaiNumber() : "", + // F = sr.FullScore != null ? sr.FullScore.ToString().ToThaiNumber() : "", + // T = sr.TotalScore != null ? sr.TotalScore.ToString().ToThaiNumber() : "", + // Result = sr.ExamStatus, + // Number = sr.Number != null ? sr.Number.ToString().ToThaiNumber() : "", + // Expire = p.RecruitImport.AnnouncementDate == null + // ? "" + // : p.RecruitImport.AnnouncementDate != DateTime.MinValue + // ? p.RecruitImport.AnnouncementDate.Value.AddYears(2).ToThaiShortDate().ToString().ToThaiNumber() + // : "", + // }) + // .FirstOrDefaultAsync(); + #endregion + + // Step 1: Query ข้อมูลผู้สอบ + var recruit = await _context.Recruits.AsQueryable() .Include(x => x.RecruitImport) + .Include(x => x.Educations) .Where(x => x.RecruitImport!.Id == id) .Where(x => x.ExamId == examId) - .Join(_context.RecruitScores.AsQueryable() - .Include(x => x.ScoreImport), - rc => new { rc.RecruitImport!.Id, rc.ExamId }, - sc => new { Id = sc.ScoreImport!.RecruitImportId, sc.ExamId }, - (p, sr) => new - { - ExamID = p.ExamId != null ? p.ExamId.ToThaiNumber() : "", - CitizenId = p.CitizenId != null ? p.CitizenId.ToThaiNumber() : "", - FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", - DateOfBirth = p.DateOfBirth.HasValue && p.DateOfBirth.Value != DateTime.MinValue - ? p.DateOfBirth.Value.ToThaiShortDate().ToThaiNumber() - : "", - Gender = p.Gendor, - Degree = p.Educations.First().Degree, - Major = p.Educations.First().Major, - University = p.Educations.First().University, - PositionName = p.PositionName, - ExamName = $"{p.RecruitImport!.Name} ครั้งที่ {p.RecruitImport.Order}/{p.RecruitImport.Year.ToThaiYear()}".ToThaiNumber(), - ExamCount = _recruitService.GetExamCount(p.CitizenId).ToString().ToThaiNumber(), - type = p.typeTest == "bangkok" ? "กทม." : p.typeTest == "ocsc" ? "ก.พ." : "", - FA = sr.FullA != null ? sr.FullA.ToString().ToThaiNumber() : "", - SA = sr.SumA != null ? sr.SumA.ToString().ToThaiNumber() : "", - FC = sr.FullC != null ? sr.FullC.ToString().ToThaiNumber() : "", - SC = sr.SumC != null ? sr.SumC.ToString().ToThaiNumber() : "", - FD = sr.FullD != null ? sr.FullD.ToString().ToThaiNumber() : "", - SD = sr.SumD != null ? sr.SumD.ToString().ToThaiNumber() : "", - F = sr.FullScore != null ? sr.FullScore.ToString().ToThaiNumber() : "", - T = sr.TotalScore != null ? sr.TotalScore.ToString().ToThaiNumber() : "", - Result = sr.ExamStatus, - Number = sr.Number != null ? sr.Number.ToString().ToThaiNumber() : "", - Expire = p.RecruitImport.AnnouncementDate == null - ? "" - : p.RecruitImport.AnnouncementDate != DateTime.MinValue - ? p.RecruitImport.AnnouncementDate.Value.AddYears(2).ToThaiShortDate().ToString().ToThaiNumber() - : "", - }) .FirstOrDefaultAsync(); + if (recruit == null) + return Success(); + + // Step 2: Query ข้อมูลคะแนน — แยกต่างหาก ไม่มีก็ผ่าน + var score = await _context.RecruitScores.AsQueryable() + .Include(x => x.ScoreImport) + .Where(x => x.ScoreImport != null) + .Where(x => x.ScoreImport.RecruitImportId == id) + .Where(x => x.ExamId == examId) + .FirstOrDefaultAsync(); + + // Step 3: รวมผลลัพธ์ — score เป็น null ก็ได้ข้อมูลผู้สอบ + var data = new + { + ExamID = recruit.ExamId != null ? recruit.ExamId.ToThaiNumber() : "", + CitizenId = recruit.CitizenId != null ? recruit.CitizenId.ToThaiNumber() : "", + FullName = $"{recruit.Prefix}{recruit.FirstName} {recruit.LastName}", + DateOfBirth = recruit.DateOfBirth.HasValue && recruit.DateOfBirth.Value != DateTime.MinValue + ? recruit.DateOfBirth.Value.ToThaiShortDate().ToThaiNumber() + : "", + Gender = recruit.Gendor, + Degree = recruit.Educations.Count > 0 ? recruit.Educations.First().Degree : "", + Major = recruit.Educations.Count > 0 ? recruit.Educations.First().Major : "", + University = recruit.Educations.Count > 0 ? recruit.Educations.First().University : "", + PositionName = recruit.PositionName, + ExamName = $"{recruit.RecruitImport!.Name} ครั้งที่ {recruit.RecruitImport.Order}/{recruit.RecruitImport.Year.ToThaiYear()}".ToThaiNumber(), + ExamCount = _recruitService.GetExamCount(recruit.CitizenId).ToString().ToThaiNumber(), + type = recruit.typeTest == "bangkok" ? "กทม." : recruit.typeTest == "ocsc" ? "ก.พ." : "", + FA = score != null && score.FullA != null ? score.FullA.ToString().ToThaiNumber() : "", + SA = score != null && score.SumA != null ? score.SumA.ToString().ToThaiNumber() : "", + FC = score != null && score.FullC != null ? score.FullC.ToString().ToThaiNumber() : "", + SC = score != null && score.SumC != null ? score.SumC.ToString().ToThaiNumber() : "", + FD = score != null && score.FullD != null ? score.FullD.ToString().ToThaiNumber() : "", + SD = score != null && score.SumD != null ? score.SumD.ToString().ToThaiNumber() : "", + F = score != null && score.FullScore != null ? score.FullScore.ToString().ToThaiNumber() : "", + T = score != null && score.TotalScore != null ? score.TotalScore.ToString().ToThaiNumber() : "", + Result = score == null ? "" : score.ExamStatus, + Number = score != null && score.Number != null ? score.Number.ToString().ToThaiNumber() : "", + Expire = recruit.RecruitImport.AnnouncementDate == null + ? "" + : recruit.RecruitImport.AnnouncementDate != DateTime.MinValue + ? recruit.RecruitImport.AnnouncementDate.Value.AddYears(2).ToThaiShortDate().ToString().ToThaiNumber() + : "", + }; + var result = new { template = "recruit-exam",