diff --git a/.gitignore b/.gitignore
index a479b56..3b4a194 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/DisableController.cs b/Controllers/DisableController.cs
index 446c397..ebae0bb 100644
--- a/Controllers/DisableController.cs
+++ b/Controllers/DisableController.cs
@@ -86,6 +86,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
private string? UserId => _httpContextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
private string? FullName => _httpContextAccessor?.HttpContext?.User?.FindFirst("name")?.Value;
+ private string? RootDnaId => _httpContextAccessor?.HttpContext?.User?.FindFirst("orgRootDnaId")?.Value;
private string? token => _httpContextAccessor.HttpContext.Request.Headers["Authorization"];
#endregion
@@ -282,10 +283,10 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
#endregion
- #region " จัดการรอบการสมัครสอบคัดเลือกผู้พิการ "
+ #region " จัดการรอบการสมัครสอบคัดเลือกอื่นๆ "
///
- /// แสดงข้อมูลรอบการสอบคัดเลือกผู้พิการ
+ /// แสดงข้อมูลรอบการสอบคัดเลือกอื่นๆ
///
///
/// เมื่อทำการอ่านข้อมูลจาก Relational Database สำเร็จ
@@ -340,9 +341,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
}
///
- /// แสดงข้อมูลรอบการสอบคัดเลือกผู้พิการเป็นรายการ
+ /// แสดงข้อมูลรอบการสอบคัดเลือกอื่นๆเป็นรายการ
///
- /// รหัสรอบการสอบคัดเลือกผู้พิการ
+ /// รหัสรอบการสอบคัดเลือกอื่นๆ
///
/// เมื่อทำการอ่านข้อมูลจาก Relational Database สำเร็จ
/// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง
@@ -381,6 +382,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
AnnouncementEndDate = x.AnnouncementEndDate,
AnnouncementStartDate = x.AnnouncementStartDate,
AnnouncementDate = x.AnnouncementDate,
+ ScoreExpireDate = x.ScoreExpireDate,
CheckDisability = x.CheckDisability,
CheckDocument = x.CheckDocument,
Detail = x.Detail,
@@ -450,7 +452,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
///
- /// เพิ่มข้อมูลรอบการจัดสอบคัดเลือกผู้พิการ
+ /// เพิ่มข้อมูลรอบการจัดสอบคัดเลือกอื่นๆ
///
/// Request parameters
///
@@ -486,7 +488,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
PaymentEndDate = req.PaymentEndDate,
Note = req.Note,
AnnouncementDate = req.AnnouncementDate,
+ ScoreExpireDate = req.ScoreExpireDate,
CheckDisability = true,
+ OrganizationId = req.rootDnaId,
CreatedAt = DateTime.Now,
CreatedUserId = UserId ?? "",
CreatedFullName = FullName ?? "System Administrator",
@@ -499,7 +503,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
using (var client = new HttpClient())
{
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 _req = new HttpRequestMessage(HttpMethod.Get, apiUrl);
var _res = await client.SendAsync(_req);
var _result = await _res.Content.ReadAsStringAsync();
@@ -523,9 +527,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
}
///
- /// แก้ไขข้อมูลรอบการจัดสอบคัดเลือกผู้พิการ
+ /// แก้ไขข้อมูลรอบการจัดสอบคัดเลือกอื่นๆ
///
- /// รหัสรอบการสอบคัดเลือกผู้พิการ
+ /// รหัสรอบการสอบคัดเลือกอื่นๆ
/// Request parameters
///
/// เมื่อทำการเพิ่มข้อมูลสำเร็จ
@@ -568,6 +572,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
data.ExamDate = req.ExamDate;
data.Note = req.Note;
data.AnnouncementDate = req.AnnouncementDate;
+ // ScoreExpireDate อัปเดตเฉพาะเมื่อ FE ส่งค่ามาเท่านั้น (ไม่บังคับส่ง)
+ if (req.ScoreExpireDate.HasValue)
+ data.ScoreExpireDate = req.ScoreExpireDate;
data.LastUpdatedAt = DateTime.Now;
data.LastUpdateUserId = UserId ?? "";
data.LastUpdateFullName = FullName ?? "System Administrator";
@@ -585,9 +592,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
///
- /// ลบข้อมูลรอบการจัดสอบคัดเลือกผู้พิการ
+ /// ลบข้อมูลรอบการจัดสอบคัดเลือกอื่นๆ
///
- /// รหัสรอบการสอบคัดเลือกผู้พิการ
+ /// รหัสรอบการสอบคัดเลือกอื่นๆ
///
/// เมื่อทำการลบข้อมูลสำเร็จ
/// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง
@@ -646,7 +653,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
#region " Candidate Files "
///
- /// แสดงข้อมูลสำหรับหน้าจอ รายการนำเข้าข้อมูลผู้สมัครสอบคัดเลือกผู้พิการ
+ /// แสดงข้อมูลสำหรับหน้าจอ รายการนำเข้าข้อมูลผู้สมัครสอบคัดเลือกอื่นๆ
///
///
/// เมื่อแสดงรายการข้อมูลสำเร็จ
@@ -668,8 +675,16 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
{
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
}
+ string role = jsonData["result"]?.ToString() ?? string.Empty;
+ string rootDnaId = string.Empty;
+ if (role != "OWNER")
+ {
+ rootDnaId = RootDnaId?.ToString() ?? "";
+ }
+
var data = await _context.PeriodExams.AsQueryable()
.Where(x => x.CheckDisability == true)
+ .Where(x => string.IsNullOrEmpty(rootDnaId) || x.OrganizationId == Guid.Parse(rootDnaId))
.Include(x => x.ImportFile)
.Include(x => x.Disables)
.Include(x => x.ScoreImport)
@@ -694,7 +709,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
ImportYear = x.ScoreImport.Year,
ImportDate = x.CreatedAt.Date.ToThaiShortDate(),
ScoreCount = x.ScoreImport.Scores.Count(),
- ResultCount = x.ScoreImport.Scores.Count(x => !string.IsNullOrEmpty(x.Number))
+ ResultCount = x.ScoreImport.Scores.Count(x => x.ExamStatus == "ผ่าน" && !string.IsNullOrEmpty(x.Number))
},
x.CreatedUserId,
})
@@ -712,7 +727,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
///
- /// นำเข้ารายชื่อผู้สมัครสอบคัดเลือกผู้พิการ
+ /// นำเข้ารายชื่อผู้สมัครสอบคัดเลือกอื่นๆ
///
///
/// เมื่อทำนำเข้าข้อมูลสำเร็จ
@@ -764,7 +779,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
{
new DisableImportHistory
{
- Description = "นำเข้าข้อมูลผู้สมัครสอบคัดเลือกผู้พิการ",
+ Description = "นำเข้าข้อมูลผู้สมัครสอบคัดเลือกอื่นๆ",
CreatedAt = DateTime.Now,
CreatedUserId = UserId ?? "",
CreatedFullName = FullName ?? "System Administrator",
@@ -954,9 +969,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
}
///
- /// ลบข้อมูลนำข้อมูลผู้สมัครสอบคัดเลือกผู้พิการ
+ /// ลบข้อมูลนำข้อมูลผู้สมัครสอบคัดเลือกอื่นๆ
///
- /// รหัสรอบการสอบคัดเลือกผู้พิการ
+ /// รหัสรอบการสอบคัดเลือกอื่นๆ
///
/// เมื่อทำนำเข้าข้อมูลสำเร็จ
/// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง
@@ -1019,9 +1034,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
}
///
- /// แสดงประวัติการนำเข้าข้อมูลการสอบคัดเลือกผู้พิการ
+ /// แสดงประวัติการนำเข้าข้อมูลการสอบคัดเลือกอื่นๆ
///
- /// รหัสรอบการสอบคัดเลือกผู้พิการ
+ /// รหัสรอบการสอบคัดเลือกอื่นๆ
///
/// เมื่อทำนำเข้าข้อมูลสำเร็จ
/// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง
@@ -1059,9 +1074,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
///
- /// นำเข้ารายชื่อผู้สมัครสอบคัดเลือกผู้พิการ (ข้อมูลผู้สมัครสอบ)
+ /// นำเข้ารายชื่อผู้สมัครสอบคัดเลือกอื่นๆ (ข้อมูลผู้สมัครสอบ)
///
- /// รหัสรอบการสอบคัดเลือกผู้พิการ
+ /// รหัสรอบการสอบคัดเลือกอื่นๆ
///
/// เมื่อทำนำเข้าข้อมูลสำเร็จ
/// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง
@@ -1130,7 +1145,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
// สร้างรอบการบรรจุ โดยเอาเข้ามูลมาใส่จาก Request
imported.ImportHostories.Add(new DisableImportHistory
{
- Description = "นำเข้าข้อมูลผู้สมัครสอบคัดเลือกผู้พิการ",
+ Description = "นำเข้าข้อมูลผู้สมัครสอบคัดเลือกอื่นๆ",
CreatedAt = DateTime.Now,
CreatedUserId = UserId ?? "",
CreatedFullName = FullName ?? "System Administrator",
@@ -1365,7 +1380,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
District = workSheet?.Cells[row, 54]?.GetValue() ?? "",
Amphur = workSheet?.Cells[row, 55]?.GetValue() ?? "",
Province = workSheet?.Cells[row, 56]?.GetValue() ?? "",
- ZipCode = workSheet?.Cells[row, 57]?.GetValue() ?? "",
+ ZipCode = (workSheet?.Cells[row, 57]?.GetValue() ?? "").Trim(),
Telephone = workSheet?.Cells[row, 58]?.GetValue() ?? "",
Mobile = "",
Address1 = $"{(workSheet?.Cells[row, 61]?.GetValue() ?? "")} {(workSheet?.Cells[row, 62]?.GetValue() ?? "")}",
@@ -1375,7 +1390,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
District1 = workSheet?.Cells[row, 66]?.GetValue() ?? "",
Amphur1 = workSheet?.Cells[row, 67]?.GetValue() ?? "",
Province1 = workSheet?.Cells[row, 68]?.GetValue() ?? "",
- ZipCode1 = workSheet?.Cells[row, 69]?.GetValue() ?? "",
+ ZipCode1 = (workSheet?.Cells[row, 69]?.GetValue() ?? "").Trim(),
CreatedAt = DateTime.Now,
CreatedUserId = UserId ?? "",
CreatedFullName = FullName ?? "System Administrator",
@@ -1399,7 +1414,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
TermBranch = workSheet?.Cells[row, 113]?.GetValue() ?? "",
TellerId = workSheet?.Cells[row, 114]?.GetValue() ?? "",
CreditDebit = workSheet?.Cells[row, 115]?.GetValue() ?? "",
- PaymentType = workSheet?.Cells[row, 116]?.GetValue(),
+ PaymentType = workSheet?.Cells[row, 116]?.GetValue() ?? "",
ChequeNo = workSheet?.Cells[row, 117]?.GetValue() ?? "",
Amount = (decimal)workSheet?.Cells[row, 118]?.GetValue(),
ChqueBankCode = workSheet?.Cells[row, 119]?.GetValue() ?? "",
@@ -1459,9 +1474,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
#region " Score File "
///
- /// นำเข้าผลคะแนนสอบคัดเลือกผู้พิการ (บัญชีรวมคะแนน)
+ /// นำเข้าผลคะแนนสอบคัดเลือกอื่นๆ (บัญชีรวมคะแนน)
///
- /// รหัสรอบการสอบคัดเลือกผู้พิการ
+ /// รหัสรอบการสอบคัดเลือกอื่นๆ
///
/// เมื่อทำนำเข้าข้อมูลสำเร็จ
/// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง
@@ -1574,7 +1589,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
var r = new DisableScore();
- #region นำเข้าผลคะแนนสอบคัดเลือกผู้พิการ old
+ #region นำเข้าผลคะแนนสอบคัดเลือกอื่นๆ old
////r.ExamId = workSheet?.Cells[row, 2]?.GetValue();
@@ -1604,11 +1619,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
r.ExamId = workSheet?.Cells[row, 2]?.GetValue();
- //var recruit = await _context.Disables.AsQueryable()
- // .Include(x => x.PeriodExam)
- // .Where(x => x.PeriodExam == rec_import && x.ExamId == r.ExamId)
- // .FirstOrDefaultAsync();
-
// ใช้ dictionary lookup แทน query DB ทีละรอบ
if (!string.IsNullOrEmpty(r.ExamId) && recruitsDict.TryGetValue(r.ExamId, out var recruit))
{
@@ -1633,26 +1643,19 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
r.FullScore = 300;
r.TotalScore = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 13]?.GetValue()) ? 0.00 : Math.Round(workSheet.Cells[row, 13].GetValue(), 2);
- if (workSheet?.Cells[row, 7]?.GetValue() == "ขาดสอบ")
- {
- r.ExamStatus = "ขส.";
- }
- else if (workSheet?.Cells[row, 14]?.GetValue() == "ได้")
- {
- r.ExamStatus = "ผ่าน";
- }
- else if (workSheet?.Cells[row, 14]?.GetValue() == "ตก")
- {
- r.ExamStatus = "ไม่ผ่าน";
- }
- else
- {
- r.ExamStatus = "-";
- }
+ var examStatusCol7 = workSheet?.Cells[row, 7]?.GetValue()?.Trim();
+ var examStatusCol14 = workSheet?.Cells[row, 14]?.GetValue()?.Trim();
+ r.ExamStatus =
+ examStatusCol7 == "ขาดสอบ" ? "ขส." :
+ examStatusCol14 == "ได้" ? "ผ่าน" :
+ examStatusCol14 == "ตก" ? "ไม่ผ่าน" : "-";
r.RemarkScore = string.IsNullOrWhiteSpace(workSheet?.Cells[row, 15]?.GetValue()) ? string.Empty : workSheet?.Cells[row, 15]?.GetValue();
- r.ExamAttribute = (workSheet?.Cells[row, 16]?.GetValue()?.Trim() == "ผ่าน") ? "มีคุณสมบัติ" : "ไม่มีคุณสมบัติ";
+ var examAttr = workSheet?.Cells[row, 16]?.GetValue()?.Trim();
+ r.ExamAttribute =
+ examAttr == "ผ่าน" ? "มีคุณสมบัติ" :
+ examAttr == "ไม่ผ่าน" ? "ไม่มีคุณสมบัติ" : "";
r.Major = workSheet.Name;
@@ -1696,9 +1699,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
#region " Result File "
///
- /// นำเข้าผลการสอบคัดเลือกผู้พิการ (ผลการสอบ)
+ /// นำเข้าผลการสอบคัดเลือกอื่นๆ (ผลการสอบ)
///
- /// รหัสรอบการสอบคัดเลือกผู้พิการ
+ /// รหัสรอบการสอบคัดเลือกอื่นๆ
///
/// เมื่อทำนำเข้าข้อมูลสำเร็จ
/// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง
@@ -1770,7 +1773,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
.Select(g => g.First())
.ToDictionary(s => s.ExamId, s => s);
- // ถ้าไม่มีผลคะแนนสอบคัดเลือกผู้พิการให้จบการทำงาน
+ // ถ้าไม่มีผลคะแนนสอบคัดเลือกอื่นๆให้จบการทำงาน
if (score.Count == 0) return Success();
var file = Request.Form.Files[0];
@@ -2063,6 +2066,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
case "notpass":
queryWithScores = queryWithScores.Where(x => x.score != null && x.score.ExamStatus == "ไม่ผ่าน");
break;
+ case "other":
+ queryWithScores = queryWithScores.Where(x => x.score != null && !new[] { "ขส.", "ผ่าน", "ไม่ผ่าน" }.Contains(x.score.ExamStatus));
+ break;
}
}
@@ -2098,11 +2104,11 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
// ? _disableService.CheckValidCertificate(x.disable.Certificates.First().IssueDate, 5)
// ? "มีคุณสมบัติ" : "ไม่มีคุณสมบัติ"
// : "ไม่มีคุณสมบัติ",
- examAttribute = x.score == null
- ? "ไม่มีคุณสมบัติ"
- : string.IsNullOrEmpty(x.score.ExamAttribute)
- ? "ไม่มีคุณสมบัติ"
- : x.score.ExamAttribute,
+
+ examAttribute = x.score != null && !string.IsNullOrEmpty(x.score.ExamAttribute) &&
+ (x.score.ExamAttribute == "มีคุณสมบัติ" || x.score.ExamAttribute == "ไม่มีคุณสมบัติ")
+ ? x.score.ExamAttribute : "",
+
remark = x.disable.Remark,
isSpecial = x.disable.Isspecial == "Y" ? x.disable.Isspecial : "",
applyDate = x.disable.ApplyDate.HasValue && x.disable.ApplyDate.Value != DateTime.MinValue
@@ -2190,90 +2196,181 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
{
try
{
- var data = await _context.Disables.AsQueryable()
+ #region old
+ //var data = await _context.Disables.AsQueryable()
+ // .Include(x => x.PeriodExam)
+ // .Include(x => x.Documents)
+ // .ThenInclude(x => x.DocumentFile)
+ // .Where(x => x.PeriodExam.Id == id)
+ // .Where(x => x.PeriodExam.CheckDisability == true)
+ // .Where(x => x.ExamId == examId)
+ // .Join(_context.DisableScores.AsQueryable()
+ // .Include(x => x.ScoreImport),
+ // rc => new { PeriodExamId = rc.PeriodExam.Id, rc.ExamId },
+ // sc => new { PeriodExamId = sc.ScoreImport.PeriodExamId, 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 = 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.PeriodExam!.Name,
+ // ExamOrder = p.PeriodExam.Round,
+ // ExamYear = p.PeriodExam.Year == null ? 0 : p.PeriodExam.Year.Value.ToThaiYear(),
+ // Score = sr == null ? 0.0 : sr.TotalScore,
+ // Number = sr == null ? "" : sr.Number,
+ // ExamCount = _disableService.GetExamCount(p.CitizenId),
+ // ScoreExpire = p.PeriodExam.AnnouncementDate == null
+ // ? ""
+ // : p.PeriodExam.AnnouncementDate != DateTime.MinValue
+ // ? p.PeriodExam.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
+
+ // 1. Query Disable (ข้อมูลผู้สอบ)
+ var disable = await _context.Disables.AsQueryable()
.Include(x => x.PeriodExam)
.Include(x => x.Documents)
.ThenInclude(x => x.DocumentFile)
+ .Include(x => x.Educations)
+ .Include(x => x.Certificates)
+ .Where(x => x.PeriodExam != null)
.Where(x => x.PeriodExam.Id == id)
.Where(x => x.PeriodExam.CheckDisability == true)
.Where(x => x.ExamId == examId)
- .Join(_context.DisableScores.AsQueryable()
- .Include(x => x.ScoreImport),
- rc => new { /*rc.PeriodExam.Year,*/ rc.ExamId },
- sc => new { /*sc.ScoreImport.Year,*/ 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 ?
- // _disableService.CheckValidCertificate(p.Certificates.First().IssueDate, 5)
- // ? "มีคุณสมบัติ"
- // : "ไม่มีคุณสมบัติ"
- // : "ไม่มีคุณสมบัติ",
- ExamAttribute = sr == null
- ? "ไม่มีคุณสมบัติ"
- : string.IsNullOrEmpty(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.PeriodExam!.Name,
- ExamOrder = p.PeriodExam.Round,
- ExamYear = p.PeriodExam.Year == null ? 0 : p.PeriodExam.Year.Value.ToThaiYear(),
- Score = sr == null ? 0.0 : sr.TotalScore,
- Number = sr == null ? "" : sr.Number,
- ExamCount = _disableService.GetExamCount(p.CitizenId),
- ScoreExpire = p.PeriodExam.AnnouncementDate == null
- ? ""
- : p.PeriodExam.AnnouncementDate != DateTime.MinValue
- ? p.PeriodExam.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 (disable == null)
+ return Success();
+
+ // 2. Query DisableScore (ข้อมูลคะแนน) — แยกต่างหาก ไม่มีก็ผ่าน
+ var score = await _context.DisableScores.AsQueryable()
+ .Include(x => x.ScoreImport)
+ .Where(x => x.ScoreImport != null)
+ .Where(x => x.ScoreImport.PeriodExamId == id)
+ .Where(x => x.ExamId == examId)
+ .FirstOrDefaultAsync();
+
+ // 3. รวมผลลัพธ์ก่อน return
+ var data = new
+ {
+ ExamID = disable.ExamId,
+ ProfileID = disable.CitizenId,
+ disable.Prefix,
+ FullName = $"{disable.FirstName} {disable.LastName}",
+ DateOfBirth = disable.DateOfBirth.HasValue && disable.DateOfBirth.Value != DateTime.MinValue
+ ? disable.DateOfBirth.Value.ToThaiShortDate()
+ : "",
+ Gender = disable.Gendor,
+ Degree = disable.Educations.First().Degree,
+ Major = disable.Educations.First().Major,
+ CertificateNo = disable.Certificates.Count > 0
+ ? disable.Certificates.First().CertificateNo ?? ""
+ : "",
+ CertificateIssueDate = disable.Certificates.Count > 0
+ ? disable.Certificates.First().IssueDate != DateTime.MinValue
+ ? disable.Certificates.First().IssueDate.ToThaiShortDate()
+ : ""
+ : "",
+ ExamResult = score == null ? "" : score.ExamStatus,
+
+ ExamAttribute = score != null && !string.IsNullOrEmpty(score.ExamAttribute) &&
+ (score.ExamAttribute == "มีคุณสมบัติ" || score.ExamAttribute == "ไม่มีคุณสมบัติ")
+ ? score.ExamAttribute : "",
+
+ IsSpecial = disable.Isspecial,
+ Remark = disable.Remark,
+ University = disable.Educations.First().University,
+ PositionName = disable.PositionName,
+ PositionType = disable.PositionType,
+ PositionLevel = disable.PositionLevel,
+ ExamName = disable.PeriodExam!.Name,
+ ExamOrder = disable.PeriodExam.Round,
+ ExamYear = disable.PeriodExam.Year == null ? 0 : disable.PeriodExam.Year.Value.ToThaiYear(),
+ Score = score == null ? 0.0 : score.TotalScore,
+ Number = score == null ? "" : score.Number,
+ ExamCount = _disableService.GetExamCount(disable.CitizenId),
+ // เดิมคำนวณวันหมดอายุจาก AnnouncementDate + 2 ปี (เก็บไว้สำหรับอ้างอิงข้อมูลเก่า)
+ //ScoreExpire = disable.PeriodExam.AnnouncementDate == null
+ // ? ""
+ // : disable.PeriodExam.AnnouncementDate != DateTime.MinValue
+ // ? disable.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate()
+ // : "",
+ ScoreExpire = disable.PeriodExam.ScoreExpireDate == null
+ ? ""
+ : disable.PeriodExam.ScoreExpireDate.Value.ToThaiShortDate(),
+ typeTest = disable.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 = disable.Documents.Select(a => new
+ {
+ FileName = a.DocumentFile.FileName,
+ DocumentId = a.DocumentFile.Id
+ })
+ };
+
return Success(data);
}
catch (Exception ex)
@@ -2463,7 +2560,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
}
///
- /// โอนคนสรรหาไปบรรจุ
+ /// โอนคนสรรหาไปบรรจุ (คัดเลือกอื่นๆ)
///
/// รหัสรอบสมัคร
///
@@ -2494,7 +2591,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
///
/// ผลคะแนนผู้สมัครสอบ
///
- /// รหัสรอบการสอบคัดเลือกผู้พิการ
+ /// รหัสรอบการสอบคัดเลือกอื่นๆ
/// เลขประจำตัวสอบ
///
/// เมื่อทำการอ่านข้อมูลจำนวนผู้สอบผ่านแข่งขันเพื่อบรรจุเข้ารับราชการเป็นข้าราชการ กทม. สามัญสำเร็จ
@@ -2508,49 +2605,110 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
{
try
{
- var data = await _context.Disables.AsQueryable()
- .Include(x => x.PeriodExam)
- .Where(x => x.PeriodExam!.Id == id)
- .Where(x => x.ExamId == examId)
- .Join(_context.DisableScores.AsQueryable()
- .Include(x => x.ScoreImport),
- rc => new { rc.PeriodExam!.Id, rc.ExamId },
- sc => new { Id = sc.ScoreImport!.PeriodExamId, 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.PeriodExam!.Name} ครั้งที่ {p.PeriodExam.Round}/{(p.PeriodExam.Year > 2500 ? p.PeriodExam.Year : (p.PeriodExam.Year + 543))}".ToThaiNumber(),
+ #region old
+ //var data = await _context.Disables.AsQueryable()
+ // .Include(x => x.PeriodExam)
+ // .Where(x => x.PeriodExam!.Id == id)
+ // .Where(x => x.ExamId == examId)
+ // .Join(_context.DisableScores.AsQueryable()
+ // .Include(x => x.ScoreImport),
+ // rc => new { rc.PeriodExam!.Id, rc.ExamId },
+ // sc => new { Id = sc.ScoreImport!.PeriodExamId, 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.PeriodExam!.Name} ครั้งที่ {p.PeriodExam.Round}/{(p.PeriodExam.Year > 2500 ? p.PeriodExam.Year : (p.PeriodExam.Year + 543))}".ToThaiNumber(),
+ //
+ // ExamCount = _disableService.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.PeriodExam.AnnouncementDate == null
+ // ? ""
+ // : p.PeriodExam.AnnouncementDate != DateTime.MinValue
+ // ? p.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate().ToString().ToThaiNumber()
+ // : "",
+ // })
+ // .FirstOrDefaultAsync();
+ #endregion
- ExamCount = _disableService.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.PeriodExam.AnnouncementDate == null
- ? ""
- : p.PeriodExam.AnnouncementDate != DateTime.MinValue
- ? p.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate().ToString().ToThaiNumber()
- : "",
- })
+ // 1. Query Disable (ข้อมูลผู้สอบ)
+ var disable = await _context.Disables.AsQueryable()
+ .Include(x => x.PeriodExam)
+ .Include(x => x.Educations)
+ .Where(x => x.PeriodExam != null)
+ .Where(x => x.PeriodExam.Id == id)
+ .Where(x => x.ExamId == examId)
.FirstOrDefaultAsync();
+ if (disable == null)
+ return Success();
+
+ // 2. Query DisableScore (ข้อมูลคะแนน) — แยกต่างหาก ไม่มีก็ผ่าน
+ var score = await _context.DisableScores.AsQueryable()
+ .Include(x => x.ScoreImport)
+ .Where(x => x.ScoreImport != null)
+ .Where(x => x.ScoreImport.PeriodExamId == id)
+ .Where(x => x.ExamId == examId)
+ .FirstOrDefaultAsync();
+
+ // 3. รวมผลลัพธ์
+ var data = new
+ {
+ ExamID = disable.ExamId != null ? disable.ExamId.ToThaiNumber() : "",
+ CitizenId = disable.CitizenId != null ? disable.CitizenId.ToThaiNumber() : "",
+ FullName = $"{disable.Prefix}{disable.FirstName} {disable.LastName}",
+ DateOfBirth = disable.DateOfBirth.HasValue && disable.DateOfBirth.Value != DateTime.MinValue
+ ? disable.DateOfBirth.Value.ToThaiShortDate().ToThaiNumber()
+ : "",
+ Gender = disable.Gendor,
+ Degree = disable.Educations.First().Degree,
+ Major = disable.Educations.First().Major,
+ University = disable.Educations.First().University,
+ PositionName = disable.PositionName,
+ ExamName = $"{disable.PeriodExam!.Name} ครั้งที่ {disable.PeriodExam.Round}/{(disable.PeriodExam.Year > 2500 ? disable.PeriodExam.Year : (disable.PeriodExam.Year + 543))}".ToThaiNumber(),
+
+ ExamCount = _disableService.GetExamCount(disable.CitizenId!).ToString().ToThaiNumber(),
+ type = disable.typeTest == "bangkok" ? "กทม." : disable.typeTest == "ocsc" ? "ก.พ." : "",
+ FA = score != null ? score.FullA.ToString().ToThaiNumber() : "",
+ SA = score != null ? score.SumA.ToString().ToThaiNumber() : "",
+ FC = score != null ? score.FullC.ToString().ToThaiNumber() : "",
+ SC = score != null ? score.SumC.ToString().ToThaiNumber() : "",
+ FD = score != null ? score.FullD.ToString().ToThaiNumber() : "",
+ SD = score != null ? score.SumD.ToString().ToThaiNumber() : "",
+ F = score != null ? score.FullScore.ToString().ToThaiNumber() : "",
+ T = score != null ? score.TotalScore.ToString().ToThaiNumber() : "",
+ Result = score != null ? score.ExamStatus : "",
+ Number = score != null && score.Number != null ? score.Number.ToString().ToThaiNumber() : "",
+ // เดิมคำนวณวันหมดอายุจาก AnnouncementDate + 2 ปี (เก็บไว้สำหรับอ้างอิงข้อมูลเก่า)
+ //Expire = disable.PeriodExam.AnnouncementDate == null
+ // ? ""
+ // : disable.PeriodExam.AnnouncementDate != DateTime.MinValue
+ // ? disable.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate().ToString().ToThaiNumber()
+ // : "",
+ Expire = disable.PeriodExam.ScoreExpireDate == null
+ ? ""
+ : disable.PeriodExam.ScoreExpireDate.Value.ToThaiShortDate().ToString().ToThaiNumber(),
+ };
+
var result = new
{
template = "recruit-exam",
diff --git a/Controllers/DisableReportController.cs b/Controllers/DisableReportController.cs
index eb824dc..c0f9f22 100644
--- a/Controllers/DisableReportController.cs
+++ b/Controllers/DisableReportController.cs
@@ -191,7 +191,9 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
Number = sr == null ? "" : sr.Number,
// ExamCount = 10,
// ExamCount = GetExamCountTes(p.CitizenId),
- ScoreExpire = p.PeriodExam.AnnouncementDate == null ? "" : p.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate(),
+ // เดิมคำนวณวันหมดอายุจาก AnnouncementDate + 2 ปี (เก็บไว้สำหรับอ้างอิงข้อมูลเก่า)
+ //ScoreExpire = p.PeriodExam.AnnouncementDate == null ? "" : p.PeriodExam.AnnouncementDate.Value.AddYears(2).ToThaiShortDate(),
+ ScoreExpire = p.PeriodExam.ScoreExpireDate == null ? "" : p.PeriodExam.ScoreExpireDate.Value.ToThaiShortDate(),
FullA = sr == null ? 0 : sr.FullA,
SumA = sr == null ? 0 : sr.SumA,
FullB = sr == null ? 0 : sr.FullB,
diff --git a/Controllers/PeriodExamController.cs b/Controllers/PeriodExamController.cs
index b52b0f6..db6edb9 100644
--- a/Controllers/PeriodExamController.cs
+++ b/Controllers/PeriodExamController.cs
@@ -749,6 +749,56 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
}
}
+ ///
+ /// ดาวน์โหลดรายชื่อผู้มีสิทธิ์สอบ
+ ///
+ /// รหัสรอบสมัคร
+ ///
+ /// เมื่อทำการอ่านโหลดผู้สมัครสอบสำเร็จ
+ /// ไม่ได้ Login เข้าระบบ
+ /// เมื่อเกิดข้อผิดพลาดในการทำงาน
+ [HttpGet("download/candidate-exam/{examId:length(36)}")]
+ [ProducesResponseType(StatusCodes.Status200OK)]
+ [ProducesResponseType(StatusCodes.Status401Unauthorized)]
+ [ProducesResponseType(StatusCodes.Status500InternalServerError)]
+ public async Task> DownloadCandidateExamAsync(string examId)
+ {
+ try
+ {
+ var data = await _periodExamService.DownloadCandidateExamAsync(examId);
+ return Success(data);
+ }
+ catch (Exception ex)
+ {
+ return Error(ex);
+ }
+ }
+
+ ///
+ /// ดาวน์โหลดรายชื่อผู้สอบคัดเลือกได้
+ ///
+ /// รหัสรอบสมัคร
+ ///
+ /// เมื่อทำการอ่านโหลดผู้สมัครสอบสำเร็จ
+ /// ไม่ได้ Login เข้าระบบ
+ /// เมื่อเกิดข้อผิดพลาดในการทำงาน
+ [HttpGet("download/pass-exam/{examId:length(36)}")]
+ [ProducesResponseType(StatusCodes.Status200OK)]
+ [ProducesResponseType(StatusCodes.Status401Unauthorized)]
+ [ProducesResponseType(StatusCodes.Status500InternalServerError)]
+ public async Task> DownloadPassExamAsync(string examId)
+ {
+ try
+ {
+ var data = await _periodExamService.DownloadPassExamAsync(examId);
+ return Success(data);
+ }
+ catch (Exception ex)
+ {
+ return Error(ex, "เกิดข้อผิดพลาดในการแสดงรายงาน");
+ }
+ }
+
///
/// โหลดผู้สมัครสอบ
///
@@ -952,7 +1002,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
}
///
- /// โอนคนสรรหาไปบรรจุ
+ /// โอนคนสรรหาไปบรรจุ (สอบคัดเลือก)
///
/// รหัสรอบสมัคร
///
diff --git a/Core/RequestLoggingMiddleware.cs b/Core/RequestLoggingMiddleware.cs
index 402c77e..a39a4d9 100644
--- a/Core/RequestLoggingMiddleware.cs
+++ b/Core/RequestLoggingMiddleware.cs
@@ -1,9 +1,8 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Nest;
-using Newtonsoft.Json;
using System.Diagnostics;
-using System.Net.Http.Headers;
+using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text.Encodings.Web;
using System.Text.Json;
@@ -19,7 +18,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Core
private string Uri = "";
private string IndexFormat = "";
private string SystemName = "";
- private string APIKey = "";
public RequestLoggingMiddleware(RequestDelegate next, IConfiguration configuration)
{
@@ -32,65 +30,48 @@ namespace BMA.EHR.Recurit.Exam.Service.Core
SystemName = "recruiting";
}
- protected async Task GetExternalAPIAsync(string apiPath, string accessToken, string apiKey)
+ ///
+ /// แกะ JWT token เพื่อดึง claims ต่างๆ
+ ///
+ private JwtSecurityToken? ParseToken(string token)
{
try
{
- using (var client = new HttpClient())
- {
- // Set timeout to 30 seconds instead of default 100 seconds
- client.Timeout = TimeSpan.FromSeconds(30);
- client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Replace("Bearer ", ""));
- client.DefaultRequestHeaders.Add("api_key", apiKey);
-
- using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
- var _res = await client.GetAsync(apiPath, cts.Token);
- if (_res.IsSuccessStatusCode)
- {
- var _result = await _res.Content.ReadAsStringAsync();
- return _result;
- }
- return string.Empty;
- }
+ var tokenHandler = new JwtSecurityTokenHandler();
+ var jwtToken = tokenHandler.ReadJwtToken(token.Replace("Bearer ", ""));
+ return jwtToken;
}
- catch (TaskCanceledException)
+ catch
{
- // Log timeout but don't throw - return empty result instead
- Console.WriteLine($"API call timed out: {apiPath}");
- return string.Empty;
- }
- catch (Exception ex)
- {
- // Log other exceptions but don't throw - return empty result instead
- Console.WriteLine($"API call failed: {apiPath}, Error: {ex.Message}");
- return string.Empty;
+ return null;
}
}
- public async Task GetProfileByKeycloakIdAsync(Guid keycloakId, string? accessToken)
+ ///
+ /// ดึงค่า claim จาก token โดยลองชื่อหลายแบบ
+ ///
+ private string? GetClaimValue(JwtSecurityToken? token, params string[] claimNames)
{
- try
- {
- //var apiPath = $"{_configuration["API"]}/org/dotnet/keycloak/{keycloakId}";
- var apiPath = $"{_configuration["API"]}/org/dotnet/user-logs/{keycloakId}";
- var apiKey = _configuration["API_KEY"] ?? "";
+ if (token == null) return null;
- var apiResult = await GetExternalAPIAsync(apiPath, accessToken ?? "", apiKey);
- if (!string.IsNullOrEmpty(apiResult))
- {
- var raw = JsonConvert.DeserializeObject(apiResult);
- if (raw != null)
- return raw.Result;
- }
-
- return null;
- }
- catch (Exception ex)
+ foreach (var name in claimNames)
{
- // Log exception but don't throw - return null instead
- Console.WriteLine($"GetProfileByKeycloakIdAsync failed for {keycloakId}: {ex.Message}");
- return null;
+ var claim = token.Claims.FirstOrDefault(c => c.Type == name);
+ if (claim != null)
+ return claim.Value;
}
+ return null;
+ }
+
+ ///
+ /// ดึงค่า Guid claim จาก token
+ ///
+ private Guid? GetGuidClaim(JwtSecurityToken? token, params string[] claimNames)
+ {
+ var value = GetClaimValue(token, claimNames);
+ if (Guid.TryParse(value, out var guid))
+ return guid;
+ return null;
}
public async Task Invoke(HttpContext context)
@@ -155,19 +136,22 @@ namespace BMA.EHR.Recurit.Exam.Service.Core
// เปลี่ยน stream ของ Response เพื่อให้สามารถอ่านได้
context.Response.Body = memoryStream;
-
-
var keycloakId = context.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? Guid.Empty.ToString("D");
- var token = context.Request.Headers["Authorization"];
+ var tokenHeader = context.Request.Headers["Authorization"].ToString();
- var pf = await GetProfileByKeycloakIdAsync(Guid.Parse(keycloakId), token);
- var _userFullname = string.Empty;
- var _userName = string.Empty;
- if (keycloakId != "00000000-0000-0000-0000-000000000000" && pf == null)
- {
- _userFullname = context.User?.FindFirst("name")?.Value;
- _userName = context.User?.FindFirst("preferred_username")?.Value;
- }
+ // แกะ JWT token เพื่อดึง claims ต่างๆ
+ var jwtToken = ParseToken(tokenHeader);
+
+ // ดึงข้อมูลจาก claims โดยลองชื่อหลายแบบ (camelCase, snake_case, ฯลฯ)
+ var prefix = GetClaimValue(jwtToken, "prefix", "Prefix", "PREFIX");
+ var firstName = GetClaimValue(jwtToken, "given_name", "firstname", "firstName", "FirstName", "FIRSTNAME");
+ var lastName = GetClaimValue(jwtToken, "family_name", "lastname", "lastName", "LastName", "LASTNAME");
+ var preferredUsername = GetClaimValue(jwtToken, "preferred_username", "preferred_username", "PreferredUsername");
+ var orgRootDnaId = GetGuidClaim(jwtToken, "orgRootDnaId", "org_root_dna_id", "OrgRootDnaId", "rootDnaId");
+ var orgChild1DnaId = GetGuidClaim(jwtToken, "orgChild1DnaId", "org_child1_dna", "OrgChild1Dna", "child1DnaId");
+ var orgChild2DnaId = GetGuidClaim(jwtToken, "orgChild2DnaId", "org_child2_dna", "OrgChild2Dna", "child2DnaId");
+ var orgChild3DnaId = GetGuidClaim(jwtToken, "orgChild3DnaId", "org_child3_dna", "OrgChild3Dna", "child3DnaId");
+ var orgChild4DnaId = GetGuidClaim(jwtToken, "orgChild4DnaId", "org_child4_dna", "OrgChild4Dna", "child4DnaId");
await _next(context); // ดำเนินการต่อไปยัง Middleware อื่น ๆ
@@ -254,8 +238,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Core
{
logType = logType,
ip = context.Connection.RemoteIpAddress?.ToString(),
- //rootId = pf == null ? null : pf.RootId,
- rootId = pf == null ? null : pf.RootDnaId,
+ rootId = orgRootDnaId?.ToString("D"),
systemName = SystemName,
startTimeStamp = startTime.ToString("o"),
endTimeStamp = endTime.ToString("o"),
@@ -269,8 +252,8 @@ namespace BMA.EHR.Recurit.Exam.Service.Core
output = responseBodyJson,
userId = keycloakId,
- userName = pf != null ? $"{pf?.Prefix ?? ""}{pf?.FirstName ?? ""} {pf?.LastName ?? ""}" : _userFullname ?? "",
- user = pf != null ? pf?.CitizenId ?? "" : _userName ?? ""
+ userName = $"{prefix ?? ""}{firstName ?? ""} {lastName ?? ""}".Trim(),
+ user = preferredUsername ?? ""
};
@@ -295,47 +278,4 @@ namespace BMA.EHR.Recurit.Exam.Service.Core
return body;
}
}
-
- public class GetProfileByKeycloakIdLocal
- {
- public Guid Id { get; set; }
-
- public string? Prefix { get; set; }
- public string? FirstName { get; set; }
- public string? LastName { get; set; }
- public string? CitizenId { get; set; }
-
- public string? Root { get; set; }
- public string? Child1 { get; set; }
- public string? Child2 { get; set; }
- public string? Child3 { get; set; }
- public string? Child4 { get; set; }
- public Guid? RootId { get; set; }
- public Guid? Child1Id { get; set; }
- public Guid? Child2Id { get; set; }
- public Guid? Child3Id { get; set; }
- public Guid? Child4Id { get; set; }
- public Guid? RootDnaId { get; set; }
- public Guid? Child1DnaId { get; set; }
- public Guid? Child2DnaId { get; set; }
- public Guid? Child3DnaId { get; set; }
- public Guid? Child4DnaId { get; set; }
- public double? Amount { get; set; }
- public double? PositionSalaryAmount { get; set; }
- public string? Commander { get; set; }
-
- public Guid? CommanderId { get; set; }
-
- public Guid? CommanderKeycloak { get; set; }
-
- }
-
- public class GetProfileByKeycloakIdResultLocal
- {
- public string Message { get; set; } = string.Empty;
-
- public int Status { get; set; } = -1;
-
- public GetProfileByKeycloakIdLocal? Result { get; set; }
- }
}
diff --git a/Data/Migrations/ApplicationDbContextModelSnapshot.cs b/Data/Migrations/ApplicationDbContextModelSnapshot.cs
index 193458a..22344fb 100644
--- a/Data/Migrations/ApplicationDbContextModelSnapshot.cs
+++ b/Data/Migrations/ApplicationDbContextModelSnapshot.cs
@@ -1296,13 +1296,13 @@ namespace BMA.EHR.Recurit.Exam.Service.Data.Migrations
b.Property("ZipCode")
.IsRequired()
- .HasMaxLength(5)
- .HasColumnType("varchar(5)");
+ .HasMaxLength(10)
+ .HasColumnType("varchar(10)");
b.Property("ZipCode1")
.IsRequired()
- .HasMaxLength(5)
- .HasColumnType("varchar(5)");
+ .HasMaxLength(10)
+ .HasColumnType("varchar(10)");
b.HasKey("Id");
@@ -2392,6 +2392,11 @@ namespace BMA.EHR.Recurit.Exam.Service.Data.Migrations
.HasColumnOrder(9)
.HasComment("รอบการสอบ");
+ b.Property("ScoreExpireDate")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(6)
+ .HasComment("วันหมดอายุบัญชี");
+
b.Property("SetSeat")
.HasColumnType("tinyint(1)")
.HasComment("เช็คอัพคะแนน");
diff --git a/Migrations/20260324084215_update_DisableAddress.Designer.cs b/Migrations/20260324084215_update_DisableAddress.Designer.cs
new file mode 100644
index 0000000..c97a27e
--- /dev/null
+++ b/Migrations/20260324084215_update_DisableAddress.Designer.cs
@@ -0,0 +1,3153 @@
+//
+using System;
+using BMA.EHR.Recurit.Exam.Service.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace BMA.EHR.Recurit.Exam.Service.Migrations
+{
+ [DbContext(typeof(ApplicationDbContext))]
+ [Migration("20260324084215_update_DisableAddress")]
+ partial class update_DisableAddress
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "7.0.5")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("BMA.EHR.Recurit.Exam.Service.Models.BankExam", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("AccountName")
+ .HasColumnType("longtext")
+ .HasComment("ชื่อบัญชี");
+
+ b.Property("AccountNumber")
+ .HasColumnType("longtext")
+ .HasComment("เลขบัญชี");
+
+ b.Property("BankName")
+ .HasColumnType("longtext")
+ .HasComment("ธนาคาร");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.Property("PeriodExamId")
+ .HasColumnType("char(36)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PeriodExamId");
+
+ b.ToTable("BankExams");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Recurit.Exam.Service.Models.CMSAgency", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("CMSCandidateId")
+ .HasColumnType("char(36)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.Property("Link")
+ .HasColumnType("longtext")
+ .HasComment("ลิงค์");
+
+ b.Property("Name")
+ .HasColumnType("longtext")
+ .HasComment("ชื่อลิงค์");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CMSCandidateId");
+
+ b.ToTable("CMSAgencys");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Recurit.Exam.Service.Models.CMSCandidate", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("About")
+ .HasColumnType("longtext")
+ .HasComment("ข้อมูลเกี่ยวกับเรา");
+
+ b.Property("Address")
+ .HasColumnType("longtext")
+ .HasComment("ที่อยู่ปัจจุบัน");
+
+ b.Property("BannerImgId")
+ .HasColumnType("char(36)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("Description")
+ .HasColumnType("longtext")
+ .HasComment("ข้อมูลเว็บโดยย่อ");
+
+ b.Property("DistrictId")
+ .HasColumnType("char(36)")
+ .HasComment("Id อำเภอ");
+
+ b.Property("DistrictName")
+ .HasColumnType("longtext")
+ .HasComment("อำเภอ");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.Property("LogoImgId")
+ .HasColumnType("char(36)");
+
+ b.Property("NameEn")
+ .HasColumnType("longtext")
+ .HasComment("ชื่อเว็บภาษาอังกฤษ");
+
+ b.Property("NameTh")
+ .HasColumnType("longtext")
+ .HasComment("ชื่อเว็บภาษาไทย");
+
+ b.Property("ProvinceId")
+ .HasColumnType("char(36)")
+ .HasComment("Id จังหวัด");
+
+ b.Property("ProvinceName")
+ .HasColumnType("longtext")
+ .HasComment("จังหวัด");
+
+ b.Property("ShortName")
+ .HasColumnType("longtext")
+ .HasComment("ชื่อย่อ");
+
+ b.Property("SubDistrictId")
+ .HasColumnType("char(36)")
+ .HasComment("Id ตำบล");
+
+ b.Property("SubDistrictName")
+ .HasColumnType("longtext")
+ .HasComment("ตำบล");
+
+ b.Property("Telephone")
+ .HasMaxLength(20)
+ .HasColumnType("varchar(20)")
+ .HasComment("โทรศัพท์");
+
+ b.Property("ZipCode")
+ .HasMaxLength(10)
+ .HasColumnType("varchar(10)")
+ .HasComment("รหัสไปรษณีย์");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BannerImgId");
+
+ b.HasIndex("LogoImgId");
+
+ b.ToTable("CMSCandidates");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Recurit.Exam.Service.Models.CMSGovernment", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("CMSCandidateId")
+ .HasColumnType("char(36)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.Property("Link")
+ .HasColumnType("longtext")
+ .HasComment("ลิงค์");
+
+ b.Property("Name")
+ .HasColumnType("longtext")
+ .HasComment("ชื่อลิงค์");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CMSCandidateId");
+
+ b.ToTable("CMSGovernments");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Recurit.Exam.Service.Models.Candidate", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("CitizenDate")
+ .HasColumnType("datetime(6)")
+ .HasComment("วันที่ออกบัตร");
+
+ b.Property("CitizenDistrictId")
+ .HasColumnType("char(36)")
+ .HasComment("Id เขตที่ออกบัตรประชาชน");
+
+ b.Property("CitizenDistrictName")
+ .HasColumnType("longtext")
+ .HasComment("เขตที่ออกบัตรประชาชน");
+
+ b.Property("CitizenId")
+ .HasMaxLength(20)
+ .HasColumnType("varchar(20)")
+ .HasComment("เลขประจำตัวประชาชน");
+
+ b.Property("CitizenProvinceId")
+ .HasColumnType("char(36)")
+ .HasComment("Id จังหวัดที่ออกบัตรประชาชน");
+
+ b.Property("CitizenProvinceName")
+ .HasColumnType("longtext")
+ .HasComment("จังหวัดที่ออกบัตรประชาชน");
+
+ b.Property("ContactFirstname")
+ .HasColumnType("longtext")
+ .HasComment("ชื่อ บุคคลที่สามารถติดต่อได้");
+
+ b.Property("ContactLastname")
+ .HasColumnType("longtext")
+ .HasComment("สกุล บุคคลที่สามารถติดต่อได้");
+
+ b.Property("ContactPrefixId")
+ .HasColumnType("char(36)")
+ .HasComment("Id คำนำหน้า บุคคลที่สามารถติดต่อได้");
+
+ b.Property("ContactPrefixName")
+ .HasColumnType("longtext")
+ .HasComment("คำนำหน้า บุคคลที่สามารถติดต่อได้");
+
+ b.Property("ContactRelations")
+ .HasColumnType("longtext")
+ .HasComment("เกี่ยวข้องเป็น บุคคลที่สามารถติดต่อได้");
+
+ b.Property("ContactTel")
+ .HasColumnType("longtext")
+ .HasComment("โทรศัพท์ บุคคลที่สามารถติดต่อได้");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("CurrentAddress")
+ .HasColumnType("longtext")
+ .HasComment("ที่อยู่ปัจจุบัน");
+
+ b.Property("CurrentDistrictId")
+ .HasColumnType("char(36)")
+ .HasComment("Id อำเภอที่อยู่ปัจจุบัน");
+
+ b.Property("CurrentDistrictName")
+ .HasColumnType("longtext")
+ .HasComment("อำเภอที่อยู่ปัจจุบัน");
+
+ b.Property("CurrentProvinceId")
+ .HasColumnType("char(36)")
+ .HasComment("Id จังหวัดที่อยู่ปัจจุบัน");
+
+ b.Property("CurrentProvinceName")
+ .HasColumnType("longtext")
+ .HasComment("จังหวัดที่อยู่ปัจจุบัน");
+
+ b.Property("CurrentSubDistrictId")
+ .HasColumnType("char(36)")
+ .HasComment("Id ตำบลที่อยู่ปัจจุบัน");
+
+ b.Property("CurrentSubDistrictName")
+ .HasColumnType("longtext")
+ .HasComment("ตำบลที่อยู่ปัจจุบัน");
+
+ b.Property("CurrentZipCode")
+ .HasMaxLength(10)
+ .HasColumnType("varchar(10)")
+ .HasComment("รหัสไปรษณีย์ที่อยู่ปัจจุบัน");
+
+ b.Property("DateOfBirth")
+ .HasMaxLength(40)
+ .HasColumnType("datetime(6)")
+ .HasComment("วันเกิด");
+
+ b.Property("Email")
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasComment("อีเมล");
+
+ b.Property("ExamIdenNumber")
+ .HasColumnType("longtext")
+ .HasComment("เลขประจำตัวสอบ");
+
+ b.Property("ExamReason")
+ .HasColumnType("longtext")
+ .HasComment("หมายเหตุ");
+
+ b.Property("FatherFirstName")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("ชื่อจริงบิดา");
+
+ b.Property("FatherLastName")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("นามสกุลบิดา");
+
+ b.Property("FatherNationality")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("สัญชาติบิดา");
+
+ b.Property("FatherOccupation")
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasComment("อาชีพบิดา");
+
+ b.Property("FatherPrefixId")
+ .HasColumnType("char(36)")
+ .HasComment("Id คำนำหน้าชื่อบิดา");
+
+ b.Property("FatherPrefixName")
+ .HasColumnType("longtext")
+ .HasComment("คำนำหน้าชื่อบิดา");
+
+ b.Property("FirstName")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnOrder(1)
+ .HasComment("ชื่อจริง");
+
+ b.Property("IsShowExamInfo")
+ .HasColumnType("tinyint(1)")
+ .HasComment("สถานะ เปิดให้ดาวน์โหลดใบสมัคร แสดงสถานที่สอบ และเลขประจำตัวสอบ");
+
+ b.Property("Knowledge")
+ .HasColumnType("longtext")
+ .HasComment("ความสามารถพิเศษ");
+
+ b.Property("LastName")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnOrder(2)
+ .HasComment("นามสกุล");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.Property("Marry")
+ .HasColumnType("tinyint(1)")
+ .HasComment("คู่สมรส");
+
+ b.Property("MarryFirstName")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("ชื่อจริงคู่สมรส");
+
+ b.Property("MarryLastName")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("นามสกุลคู่สมรส");
+
+ b.Property("MarryNationality")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("สัญชาติคู่สมรส");
+
+ b.Property("MarryOccupation")
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasComment("อาชีพคู่สมรส");
+
+ b.Property("MarryPrefixId")
+ .HasColumnType("char(36)")
+ .HasComment("Id คำนำหน้าชื่อคู่สมรส");
+
+ b.Property("MarryPrefixName")
+ .HasColumnType("longtext")
+ .HasComment("คำนำหน้าชื่อคู่สมรส");
+
+ b.Property("MobilePhone")
+ .HasMaxLength(20)
+ .HasColumnType("varchar(20)")
+ .HasComment("โทรศัพท์มือถือ");
+
+ b.Property("MotherFirstName")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("ชื่อจริงมารดา");
+
+ b.Property("MotherLastName")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("นามสกุลมารดา");
+
+ b.Property("MotherNationality")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("สัญชาติมารดา");
+
+ b.Property("MotherOccupation")
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasComment("อาชีพมารดา");
+
+ b.Property("MotherPrefixId")
+ .HasColumnType("char(36)")
+ .HasComment("Id คำนำหน้าชื่อมารดา");
+
+ b.Property("MotherPrefixName")
+ .HasColumnType("longtext")
+ .HasComment("คำนำหน้าชื่อมารดา");
+
+ b.Property("Nationality")
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(3)
+ .HasComment("สัญชาติ");
+
+ b.Property("Number")
+ .HasColumnType("longtext")
+ .HasComment("ลำดับที่สอบได้");
+
+ b.Property("OccupationGroup")
+ .HasColumnType("longtext")
+ .HasComment("ตำแหน่งปัจจุบัน กลุ่ม/ฝ่าย");
+
+ b.Property("OccupationOrg")
+ .HasColumnType("longtext")
+ .HasComment("ตำแหน่งปัจจุบัน ชื่อตำแหน่ง");
+
+ b.Property("OccupationPile")
+ .HasColumnType("longtext")
+ .HasComment("ตำแหน่งปัจจุบัน กอง");
+
+ b.Property("OccupationPosition")
+ .HasColumnType("longtext")
+ .HasComment("ตำแหน่งปัจจุบัน สังกัด");
+
+ b.Property("OccupationPositionType")
+ .HasColumnType("longtext")
+ .HasComment("ตำแหน่งปัจจุบัน ประเภทราชการ");
+
+ b.Property("OccupationSalary")
+ .HasColumnType("double")
+ .HasComment("ตำแหน่งปัจจุบัน เงินเดือน");
+
+ b.Property("OccupationTelephone")
+ .HasMaxLength(20)
+ .HasColumnType("varchar(20)")
+ .HasComment("ตำแหน่งปัจจุบัน เบอร์โทรที่ทำงาน");
+
+ b.Property("Pass")
+ .HasColumnType("longtext")
+ .HasComment("ผลสมัครสอบ");
+
+ b.Property("PaymentDate")
+ .HasColumnType("datetime(6)")
+ .HasComment("วันที่ชำระเงิน");
+
+ b.Property("PaymentImgId")
+ .HasColumnType("char(36)");
+
+ b.Property("PeriodExamId")
+ .HasColumnType("char(36)");
+
+ b.Property("PointA")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนภาค ก");
+
+ b.Property("PointB")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนภาค ข");
+
+ b.Property("PointC")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนภาค ค");
+
+ b.Property("PointPath1A")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนภาค ก ความสามารถในการคิดวิเคราะห์");
+
+ b.Property("PointPath1C")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนภาค คทดสอบสมรรถนะหลัก");
+
+ b.Property("PointPath2A")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนภาค ก ภาษาอังกฤษ");
+
+ b.Property("PointPath2C")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนภาค ค สัมภาษณ์");
+
+ b.Property("PointPath3A")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนภาค ก ความรู้และลักษณะการเป็นข้าราชการที่ดี");
+
+ b.Property("PointPerA")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนภาค ก เปอร์เซนต์");
+
+ b.Property("PointPerB")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนภาค ข เปอร์เซนต์");
+
+ b.Property("PointPerC")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนภาค ค เปอร์เซนต์");
+
+ b.Property("PointTotalA")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนเต็มภาค ก");
+
+ b.Property("PointTotalB")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนเต็มภาค ข");
+
+ b.Property("PointTotalC")
+ .HasColumnType("longtext")
+ .HasComment("คะแนนเต็มภาค ค");
+
+ b.Property("PositionExamId")
+ .HasColumnType("char(36)");
+
+ b.Property("PrefixId")
+ .HasColumnType("char(36)")
+ .HasComment("Id คำนำหน้าชื่อ");
+
+ b.Property("PrefixName")
+ .HasColumnType("longtext")
+ .HasComment("คำนำหน้าชื่อ");
+
+ b.Property("ProfileImgId")
+ .HasColumnType("char(36)");
+
+ b.Property("RegistAddress")
+ .HasColumnType("longtext")
+ .HasComment("ที่อยู่ตามทะเบียนบ้าน");
+
+ b.Property("RegistDistrictId")
+ .HasColumnType("char(36)")
+ .HasComment("Id อำเภอที่อยู่ตามทะเบียนบ้าน");
+
+ b.Property("RegistDistrictName")
+ .HasColumnType("longtext")
+ .HasComment("อำเภอที่อยู่ตามทะเบียนบ้าน");
+
+ b.Property("RegistProvinceId")
+ .HasColumnType("char(36)")
+ .HasComment("Id จังหวัดที่อยู่ตามทะเบียนบ้าน");
+
+ b.Property("RegistProvinceName")
+ .HasColumnType("longtext")
+ .HasComment("จังหวัดที่อยู่ตามทะเบียนบ้าน");
+
+ b.Property("RegistSame")
+ .HasColumnType("tinyint(1)")
+ .HasComment("ที่อยู่ปัจจุบันเหมือนที่อยู่ตามทะเบียนบ้าน");
+
+ b.Property("RegistSubDistrictId")
+ .HasColumnType("char(36)")
+ .HasComment("Id ตำบลที่อยู่ตามทะเบียนบ้าน");
+
+ b.Property("RegistSubDistrictName")
+ .HasColumnType("longtext")
+ .HasComment("ตำบลที่อยู่ตามทะเบียนบ้าน");
+
+ b.Property("RegistZipCode")
+ .HasMaxLength(10)
+ .HasColumnType("varchar(10)")
+ .HasComment("รหัสไปรษณีย์ที่อยู่ตามทะเบียนบ้าน");
+
+ b.Property("RegisterDate")
+ .HasMaxLength(40)
+ .HasColumnType("datetime(6)")
+ .HasComment("วันที่สมัคร");
+
+ b.Property("RejectDetail")
+ .HasColumnType("longtext")
+ .HasComment("เหตุผลการไม่อนุมัติ");
+
+ b.Property("RelationshipId")
+ .HasColumnType("char(36)")
+ .HasComment("Id สถานภาพ");
+
+ b.Property("RelationshipName")
+ .HasColumnType("longtext")
+ .HasComment("สถานภาพ");
+
+ b.Property("ReligionId")
+ .HasColumnType("char(36)")
+ .HasComment("Id ศาสนา");
+
+ b.Property("ReligionName")
+ .HasColumnType("longtext")
+ .HasComment("ศาสนา");
+
+ b.Property("ResultA")
+ .HasColumnType("longtext")
+ .HasComment("ผลสอบภาค ก");
+
+ b.Property("ResultB")
+ .HasColumnType("longtext")
+ .HasComment("ผลสอบภาค ข");
+
+ b.Property("ResultC")
+ .HasColumnType("longtext")
+ .HasComment("ผลสอบภาค ค");
+
+ b.Property("Review")
+ .HasColumnType("longtext")
+ .HasComment("ข้อแนะนำ");
+
+ b.Property("ReviewPoint")
+ .HasColumnType("int")
+ .HasComment("คะแนนความพึงพอใจ");
+
+ b.Property("SeatNumber")
+ .HasColumnType("longtext")
+ .HasComment("เลขที่นั่งสอบ");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasMaxLength(20)
+ .HasColumnType("varchar(20)")
+ .HasComment("สถานะผู้สมัคร");
+
+ b.Property("Telephone")
+ .HasMaxLength(20)
+ .HasColumnType("varchar(20)")
+ .HasComment("โทรศัพท์");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasComment("User Id ผู้สมัคร");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PaymentImgId");
+
+ b.HasIndex("PeriodExamId");
+
+ b.HasIndex("PositionExamId");
+
+ b.HasIndex("ProfileImgId");
+
+ b.ToTable("Candidates");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Recurit.Exam.Service.Models.CandidateDocument", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("CandidateId")
+ .HasColumnType("char(36)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("DocumentId")
+ .HasColumnType("char(36)");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CandidateId");
+
+ b.HasIndex("DocumentId");
+
+ b.ToTable("CandidateDocuments");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Recurit.Exam.Service.Models.Career", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("CandidateId")
+ .HasColumnType("char(36)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("DurationEnd")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(2)
+ .HasComment("ระยะเวลาสิ้นสุด");
+
+ b.Property("DurationStart")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(1)
+ .HasComment("ระยะเวลาเริ่ม");
+
+ b.Property("Group")
+ .HasColumnType("longtext")
+ .HasColumnOrder(4)
+ .HasComment("กลุ่ม/ฝ่าย");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.Property("Org")
+ .HasColumnType("longtext")
+ .HasColumnOrder(6)
+ .HasComment("สังกัด");
+
+ b.Property("Pile")
+ .HasColumnType("longtext")
+ .HasColumnOrder(5)
+ .HasComment("กอง");
+
+ b.Property("Position")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnOrder(3)
+ .HasComment("ชื่อตำแหน่ง");
+
+ b.Property("RangeDate")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnOrder(7)
+ .HasComment("ระยะเวลา");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasColumnOrder(8)
+ .HasComment("ประเภท");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CandidateId");
+
+ b.ToTable("Careers");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Recurit.Exam.Service.Models.Disables.Disable", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("ApplyDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("CitizenCardExpireDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("CitizenCardIssuer")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)");
+
+ b.Property("CitizenId")
+ .IsRequired()
+ .HasMaxLength(13)
+ .HasColumnType("varchar(13)")
+ .HasComment("เลขประจำตัวประชาชน");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("DateOfBirth")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ExamId")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)");
+
+ b.Property("FirstName")
+ .IsRequired()
+ .HasMaxLength(150)
+ .HasColumnType("varchar(150)");
+
+ b.Property("Gendor")
+ .IsRequired()
+ .HasMaxLength(20)
+ .HasColumnType("varchar(20)");
+
+ b.Property("HddPosition")
+ .HasColumnType("longtext")
+ .HasComment("บัญชีสอบ");
+
+ b.Property("Isspecial")
+ .IsRequired()
+ .HasMaxLength(1)
+ .HasColumnType("varchar(1)");
+
+ b.Property("LastName")
+ .IsRequired()
+ .HasMaxLength(150)
+ .HasColumnType("varchar(150)");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.Property("Marry")
+ .IsRequired()
+ .HasMaxLength(20)
+ .HasColumnType("varchar(20)");
+
+ b.Property("ModifiedDate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("National")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)");
+
+ b.Property