diff --git a/Controllers/DisableController.cs b/Controllers/DisableController.cs index c8271fe..ea0477b 100644 --- a/Controllers/DisableController.cs +++ b/Controllers/DisableController.cs @@ -2013,103 +2013,87 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers if (periodExam == null) return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - var data = new List(); - var p_Id = new MySqlParameter("@id", id); - int total = 0; + var query = _context.Disables + .Include(x => x.PeriodExam) + .Include(x => x.Educations) + .Include(x => x.Certificates) + .OrderBy(x => x.ExamId) + .Where(x => x.PeriodExam != null && x.PeriodExam.Id == id); - // --------------------------- - // 1️. ดึงรายละเอียดสอบ (exam_info) - // --------------------------- - using (var cmd = _context.Database.GetDbConnection().CreateCommand()) + var keywordParam = req.keyword?.Trim(); + if (!string.IsNullOrWhiteSpace(keywordParam)) { - cmd.CommandTimeout = 0; - - var sb = new StringBuilder(); - sb.Append(@" - SELECT - examID, profileID, prefix, fullName, dateofbirth, gender, degree, major, majorgroup, - certificateno, certificateIssueDate, score, result, examAttribute, remark, isspecial, - applydate, university, position_name, hddPosition, typeTest, position_level, position_type, - exam_name, exam_order, score_year, - COUNT(*) OVER() AS total_count - FROM exam_info - WHERE disable_import_id = @id - "); - - cmd.Parameters.Clear(); - cmd.Parameters.Add(p_Id); - - var keywordParam = req.keyword?.Trim(); - if (!string.IsNullOrWhiteSpace(keywordParam)) - { - sb.Append(@" - AND ( - examID LIKE @kw - OR profileID LIKE @kw - OR prefix LIKE @kw - OR fullName LIKE @kw - OR hddPosition LIKE @kw - OR position_name LIKE @kw - ) - "); - cmd.Parameters.Add(new MySqlParameter("@kw", $"%{keywordParam}%")); - } - - // --------------------------- - // Paging + Sorting - // --------------------------- - sb.Append(" ORDER BY examID "); - sb.Append(" LIMIT @PageSize OFFSET @Offset "); - cmd.Parameters.Add(new MySqlParameter("@PageSize", req.PageSize)); - cmd.Parameters.Add(new MySqlParameter("@Offset", (req.Page - 1) * req.PageSize)); - - cmd.CommandText = sb.ToString(); - - _context.Database.OpenConnection(); - - // --------------------------- - // ดึงข้อมูล + total - // --------------------------- - using (var reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - if (total == 0) - total = Convert.ToInt32(reader["total_count"]); - - data.Add(new - { - examID = reader["examID"].ToString(), - profileID = reader["profileID"].ToString(), - prefix = reader["prefix"].ToString(), - fullName = reader["fullName"].ToString(), - dateOfBirth = reader["dateofbirth"] == DBNull.Value ? "" : Convert.ToDateTime(reader["dateofbirth"]).ToThaiShortDate(), - gender = reader["gender"].ToString(), - degree = reader["degree"].ToString(), - major = reader["major"].ToString(), - majorgroup = reader["majorgroup"].ToString(), - certificateNo = reader["certificateno"].ToString(), - certificateIssueDate = reader["certificateIssueDate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["certificateIssueDate"]).ToThaiShortDate(), - ExamScore = reader["score"] == DBNull.Value ? 0 : Convert.ToDecimal(reader["score"]), - ExamResult = reader["result"].ToString(), - ExamAttribute = reader["examAttribute"].ToString(), - Remark = reader["remark"].ToString(), - IsSpecial = reader["isspecial"].ToString(), - applyDate = reader["applydate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["applydate"]).ToThaiShortDate(), - university = reader["university"].ToString(), - position_name = reader["position_name"].ToString(), - hddPosition = reader["hddPosition"].ToString(), - typeTest = reader["typeTest"].ToString(), - position_level = reader["position_level"].ToString(), - position_type = reader["position_type"].ToString(), - exam_name = reader["exam_name"].ToString(), - exam_order = reader["exam_order"].ToString(), - score_year = Convert.ToInt32(reader["score_year"]).ToThaiYear().ToString() - }); - } - } + query = query.Where(x => + x.ExamId.Contains(keywordParam) || + x.CitizenId.Contains(keywordParam) || + x.Prefix.Contains(keywordParam) || + x.FirstName.Contains(keywordParam) || + x.LastName.Contains(keywordParam) || + x.HddPosition.Contains(keywordParam) || + x.PositionName.Contains(keywordParam) + ); } + int total = await query.CountAsync(); + + query = query + .Skip((req.Page - 1) * req.PageSize) + .Take(req.PageSize); + + var data = await query + .GroupJoin( + _context.DisableScores.Include(x => x.ScoreImport), + rc => new { rc.PeriodExam!.Id, rc.ExamId }, + sc => new { Id = sc.ScoreImport!.PeriodExamId, sc.ExamId }, + (disable, scores) => new { disable, scores } + ) + .SelectMany( + x => x.scores.DefaultIfEmpty(), + (x, sr) => new + { + examID = x.disable.ExamId, + profileID = x.disable.CitizenId, + prefix = x.disable.Prefix, + fullName = $"{x.disable.FirstName} {x.disable.LastName}", + dateOfBirth = x.disable.DateOfBirth != null && x.disable.DateOfBirth != DateTime.MinValue + ? x.disable.DateOfBirth.ToThaiShortDate() + : "", + gender = x.disable.Gendor, + degree = x.disable.Educations.Any() ? x.disable.Educations.First().Degree : "", + major = x.disable.Educations.Any() ? x.disable.Educations.First().Major : "", + certificateNo = x.disable.Certificates.Any() + ? x.disable.Certificates.First().CertificateNo ?? "" + : "", + certificateIssueDate = x.disable.Certificates.Any() && x.disable.Certificates.First().IssueDate != null && x.disable.Certificates.First().IssueDate != DateTime.MinValue + ? x.disable.Certificates.First().IssueDate.ToThaiShortDate() + : "", + examScore = sr == null ? 0.0 : sr.TotalScore, + examResult = sr == null ? "" : sr.ExamStatus, + examAttribute = x.disable.Certificates.Any() && x.disable.Certificates.First().IssueDate != null + ? _disableService.CheckValidCertificate(x.disable.Certificates.First().IssueDate, 5) + ? "มีคุณสมบัติ" : "ไม่มีคุณสมบัติ" + : "ไม่มีคุณสมบัติ", + remark = x.disable.Remark, + isSpecial = x.disable.Isspecial == "Y" ? x.disable.Isspecial : "", + applyDate = x.disable.ApplyDate != null && x.disable.ApplyDate != DateTime.MinValue + ? x.disable.ApplyDate.ToThaiShortDate() + : "", + university = x.disable.Educations.Any() ? x.disable.Educations.First().University : "", + position_name = x.disable.PositionName, + hddPosition = x.disable.HddPosition ?? "", + typeTest = x.disable.typeTest ?? "", + position_level = x.disable.PositionLevel ?? "", + position_type = x.disable.PositionType ?? "", + exam_name = x.disable.PeriodExam!.Name, + exam_order = x.disable.PeriodExam != null && x.disable.PeriodExam.Round != null + ? x.disable.PeriodExam.Round.ToString() + : "", + score_year = x.disable.PeriodExam != null && x.disable.PeriodExam.Year != null + ? (x.disable.PeriodExam.Year > 2500 ? x.disable.PeriodExam.Year : x.disable.PeriodExam.Year + 543).ToString() + : "", + }) + .ToListAsync(); + // --------------------------- // 3️. ดึงสรุปคะแนน // ---------------------------