From 6f36f71f6024df8d1252ec61d22b2a0dfb0ff9a8 Mon Sep 17 00:00:00 2001 From: Bright Date: Mon, 22 Sep 2025 18:30:52 +0700 Subject: [PATCH 1/6] =?UTF-8?q?test=20response=20=E0=B8=99=E0=B8=B2?= =?UTF-8?q?=E0=B8=99=20#1813?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controllers/RecruitController.cs | 469 +++++++++++++++++++++++++------ 1 file changed, 387 insertions(+), 82 deletions(-) diff --git a/Controllers/RecruitController.cs b/Controllers/RecruitController.cs index a2eab2c..f95caf7 100644 --- a/Controllers/RecruitController.cs +++ b/Controllers/RecruitController.cs @@ -1663,138 +1663,443 @@ namespace BMA.EHR.Recruit.Service.Controllers } } + //[HttpPost("exam/{id:length(36)}")] + //public async Task> GetExamResultById([FromBody] RecruitExamRequest req, Guid id) + //{ + // try + // { + // var p_Id = new MySqlParameter("@id", id); + // var data = new List(); + // using (var cmd = _context.Database.GetDbConnection().CreateCommand()) + // { + // cmd.CommandTimeout = 0; + // var sb = new StringBuilder(); + // cmd.Parameters.Clear(); + // sb.Clear(); + // sb.Append(" SELECT * "); + // sb.Append(" FROM exam_info "); + // sb.Append(" WHERE recruit_import_id = @id "); + // cmd.Parameters.Add(p_Id); + + // if (req.ExamAttribute != null && req.ExamAttribute != "") + // { + // sb.Append(" AND examAttribute = @a "); + // cmd.Parameters.Add(new MySqlParameter("@a", req.ExamAttribute)); + // } + + // if (req.ExamResult != null && req.ExamResult != "") + // { + // sb.Append(" AND result = @r "); + // cmd.Parameters.Add(new MySqlParameter("@r", req.ExamResult)); + // } + + // 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(); + // var da = new MySqlDataAdapter(cmd as MySqlCommand); + // var dt = new DataTable(); + // da.Fill(dt); + + // foreach (DataRow dr in dt.Rows) + // { + // data.Add(new + // { + // examID = dr["examID"].ToString(), + // profileID = dr["profileID"].ToString(), + // prefix = dr["prefix"].ToString(), + // fullName = dr["fullName"].ToString(), + // dateOfBirth = dr["dateofbirth"] == null || Convert.ToDateTime(dr["dateofbirth"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["dateofbirth"]).ToThaiShortDate(), + // gender = dr["gender"].ToString(), + // degree = dr["degree"].ToString(), + // major = dr["major"].ToString(), + // majorgroup = dr["majorgroup"].ToString(), + // certificateNo = dr["certificateno"].ToString(), + // certificateIssueDate = dr["certificateIssueDate"] == null || Convert.ToDateTime(dr["certificateIssueDate"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["certificateIssueDate"]).ToThaiShortDate(), + // ExamScore = string.IsNullOrWhiteSpace(dr["score"]?.ToString()) ? 0 : decimal.Parse(dr["score"]?.ToString()), + // ExamResult = dr["result"].ToString(), + // ExamAttribute = dr["examAttribute"].ToString(), + // Remark = dr["remark"].ToString(), + // IsSpecial = dr["isspecial"].ToString(), + // applyDate = dr["applydate"] == null || Convert.ToDateTime(dr["applydate"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["applydate"]).ToThaiShortDate(), + // university = dr["university"].ToString(), + // position_name = dr["position_name"].ToString(), + // hddPosition = dr["hddPosition"].ToString(), + // typeTest = dr["typeTest"].ToString(), + // position_level = dr["position_level"].ToString(), + // position_type = dr["position_type"].ToString(), + // exam_name = dr["exam_name"].ToString(), + // exam_order = dr["exam_order"].ToString(), + // score_year = Convert.ToInt32(dr["score_year"]).ToThaiYear().ToString(), + // }); + // } + + // } + + // //if (data != null && data.Count > 0) + // // data = data.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList(); + + // dynamic header = null; + // using (var cmd = _context.Database.GetDbConnection().CreateCommand()) + // { + // var sb = new StringBuilder(); + // cmd.CommandTimeout = 0; + // cmd.Parameters.Clear(); + // sb.Clear(); + // sb.Append(" SELECT * "); + // sb.Append(" FROM sum_exam_info "); + // sb.Append(" WHERE recruit_import_id = @id "); + // cmd.Parameters.Add(p_Id); + + // cmd.CommandText = sb.ToString(); + + + // _context.Database.OpenConnection(); + // MySqlDataAdapter da = new MySqlDataAdapter(cmd as MySqlCommand); + // DataTable dt = new DataTable(); + // da.Fill(dt); + // if (dt.Rows.Count == 0) + // { + // header = new + // { + // count = 0, + // pass = 0, + // notpass = 0, + // missed_exam = 0, + // other = 0 + // }; + // } + // else + // { + // var dr = dt.Rows[0]; + // header = new + // { + // count = dr["count"].ToString().ToInteger(), + // pass = dr["pass"].ToString().ToInteger(), + // notpass = dr["notpass"].ToString().ToInteger(), + // missed_exam = dr["missed_exam"].ToString().ToInteger(), + // other = dr["other"].ToString().ToInteger() + // }; + // } + // } + // var period = await _context.RecruitImports.AsQueryable() + // .Select(x => new + // { + // x.Id, + // Year = x.Year.ToThaiYear(), + // x.Order, + // x.Name, + // }) + // .FirstOrDefaultAsync(x => x.Id == id); + + // return Success(new + // { + // data = data, + // header = header, + // period = period, + // }); + // } + // catch (Exception ex) + // { + // return Error(ex); + // } + //} //[HttpPost("exam/{id:length(36)}")] + //public async Task> GetExamResultById([FromBody] RecruitExamRequest req, Guid id) + //{ + // try + // { + // var p_Id = new MySqlParameter("@id", id); + // var data = new List(); + // using (var cmd = _context.Database.GetDbConnection().CreateCommand()) + // { + // cmd.CommandTimeout = 0; + // var sb = new StringBuilder(); + // cmd.Parameters.Clear(); + // sb.Clear(); + // sb.Append(" SELECT * "); + // sb.Append(" FROM exam_info "); + // sb.Append(" WHERE recruit_import_id = @id "); + // cmd.Parameters.Add(p_Id); + + // if (req.ExamAttribute != null && req.ExamAttribute != "") + // { + // sb.Append(" AND examAttribute = @a "); + // cmd.Parameters.Add(new MySqlParameter("@a", req.ExamAttribute)); + // } + + // if (req.ExamResult != null && req.ExamResult != "") + // { + // sb.Append(" AND result = @r "); + // cmd.Parameters.Add(new MySqlParameter("@r", req.ExamResult)); + // } + + // 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(); + // var da = new MySqlDataAdapter(cmd as MySqlCommand); + // var dt = new DataTable(); + // da.Fill(dt); + + // foreach (DataRow dr in dt.Rows) + // { + // data.Add(new + // { + // examID = dr["examID"].ToString(), + // profileID = dr["profileID"].ToString(), + // prefix = dr["prefix"].ToString(), + // fullName = dr["fullName"].ToString(), + // dateOfBirth = dr["dateofbirth"] == null || Convert.ToDateTime(dr["dateofbirth"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["dateofbirth"]).ToThaiShortDate(), + // gender = dr["gender"].ToString(), + // degree = dr["degree"].ToString(), + // major = dr["major"].ToString(), + // majorgroup = dr["majorgroup"].ToString(), + // certificateNo = dr["certificateno"].ToString(), + // certificateIssueDate = dr["certificateIssueDate"] == null || Convert.ToDateTime(dr["certificateIssueDate"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["certificateIssueDate"]).ToThaiShortDate(), + // ExamScore = string.IsNullOrWhiteSpace(dr["score"]?.ToString()) ? 0 : decimal.Parse(dr["score"]?.ToString()), + // ExamResult = dr["result"].ToString(), + // ExamAttribute = dr["examAttribute"].ToString(), + // Remark = dr["remark"].ToString(), + // IsSpecial = dr["isspecial"].ToString(), + // applyDate = dr["applydate"] == null || Convert.ToDateTime(dr["applydate"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["applydate"]).ToThaiShortDate(), + // university = dr["university"].ToString(), + // position_name = dr["position_name"].ToString(), + // hddPosition = dr["hddPosition"].ToString(), + // typeTest = dr["typeTest"].ToString(), + // position_level = dr["position_level"].ToString(), + // position_type = dr["position_type"].ToString(), + // exam_name = dr["exam_name"].ToString(), + // exam_order = dr["exam_order"].ToString(), + // score_year = Convert.ToInt32(dr["score_year"]).ToThaiYear().ToString(), + // }); + // } + + // } + + // //if (data != null && data.Count > 0) + // // data = data.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList(); + + // dynamic header = null; + // using (var cmd = _context.Database.GetDbConnection().CreateCommand()) + // { + // var sb = new StringBuilder(); + // cmd.CommandTimeout = 0; + // cmd.Parameters.Clear(); + // sb.Clear(); + // sb.Append(" SELECT * "); + // sb.Append(" FROM sum_exam_info "); + // sb.Append(" WHERE recruit_import_id = @id "); + // cmd.Parameters.Add(p_Id); + + // cmd.CommandText = sb.ToString(); + + + // _context.Database.OpenConnection(); + // MySqlDataAdapter da = new MySqlDataAdapter(cmd as MySqlCommand); + // DataTable dt = new DataTable(); + // da.Fill(dt); + // if (dt.Rows.Count == 0) + // { + // header = new + // { + // count = 0, + // pass = 0, + // notpass = 0, + // missed_exam = 0, + // other = 0 + // }; + // } + // else + // { + // var dr = dt.Rows[0]; + // header = new + // { + // count = dr["count"].ToString().ToInteger(), + // pass = dr["pass"].ToString().ToInteger(), + // notpass = dr["notpass"].ToString().ToInteger(), + // missed_exam = dr["missed_exam"].ToString().ToInteger(), + // other = dr["other"].ToString().ToInteger() + // }; + // } + // } + // var period = await _context.RecruitImports.AsQueryable() + // .Select(x => new + // { + // x.Id, + // Year = x.Year.ToThaiYear(), + // x.Order, + // x.Name, + // }) + // .FirstOrDefaultAsync(x => x.Id == id); + + // return Success(new + // { + // data = data, + // header = header, + // period = period, + // }); + // } + // catch (Exception ex) + // { + // return Error(ex); + // } + //} + [HttpPost("exam/{id:length(36)}")] public async Task> GetExamResultById([FromBody] RecruitExamRequest req, Guid id) { try { - var p_Id = new MySqlParameter("@id", id); var data = new List(); + var p_Id = new MySqlParameter("@id", id); + + // --------------------------- + // 1️⃣ ดึงรายละเอียดสอบ (exam_info) + // --------------------------- using (var cmd = _context.Database.GetDbConnection().CreateCommand()) { cmd.CommandTimeout = 0; var sb = new StringBuilder(); + + // ปรับ SELECT * → SELECT เฉพาะ field ที่ C# ใช้ + 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 + FROM exam_info + WHERE recruit_import_id = @id + "); + cmd.Parameters.Clear(); - sb.Clear(); - sb.Append(" SELECT * "); - sb.Append(" FROM exam_info "); - sb.Append(" WHERE recruit_import_id = @id "); cmd.Parameters.Add(p_Id); - if (req.ExamAttribute != null && req.ExamAttribute != "") + // เพิ่ม dynamic filter + if (!string.IsNullOrWhiteSpace(req.ExamAttribute)) { sb.Append(" AND examAttribute = @a "); cmd.Parameters.Add(new MySqlParameter("@a", req.ExamAttribute)); } - if (req.ExamResult != null && req.ExamResult != "") + if (!string.IsNullOrWhiteSpace(req.ExamResult)) { sb.Append(" AND result = @r "); cmd.Parameters.Add(new MySqlParameter("@r", req.ExamResult)); } + // 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.Parameters.Add(new MySqlParameter("@Offset", (req.Page - 1) * req.PageSize)); cmd.CommandText = sb.ToString(); _context.Database.OpenConnection(); - var da = new MySqlDataAdapter(cmd as MySqlCommand); - var dt = new DataTable(); - da.Fill(dt); - foreach (DataRow dr in dt.Rows) + // --------------------------- + // 2️⃣ ใช้ DbDataReader แทน DataTable → ประหยัด memory และเร็วขึ้น + // --------------------------- + using (var reader = cmd.ExecuteReader()) { - data.Add(new + while (reader.Read()) { - examID = dr["examID"].ToString(), - profileID = dr["profileID"].ToString(), - prefix = dr["prefix"].ToString(), - fullName = dr["fullName"].ToString(), - dateOfBirth = dr["dateofbirth"] == null || Convert.ToDateTime(dr["dateofbirth"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["dateofbirth"]).ToThaiShortDate(), - gender = dr["gender"].ToString(), - degree = dr["degree"].ToString(), - major = dr["major"].ToString(), - majorgroup = dr["majorgroup"].ToString(), - certificateNo = dr["certificateno"].ToString(), - certificateIssueDate = dr["certificateIssueDate"] == null || Convert.ToDateTime(dr["certificateIssueDate"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["certificateIssueDate"]).ToThaiShortDate(), - ExamScore = string.IsNullOrWhiteSpace(dr["score"]?.ToString()) ? 0 : decimal.Parse(dr["score"]?.ToString()), - ExamResult = dr["result"].ToString(), - ExamAttribute = dr["examAttribute"].ToString(), - Remark = dr["remark"].ToString(), - IsSpecial = dr["isspecial"].ToString(), - applyDate = dr["applydate"] == null || Convert.ToDateTime(dr["applydate"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["applydate"]).ToThaiShortDate(), - university = dr["university"].ToString(), - position_name = dr["position_name"].ToString(), - hddPosition = dr["hddPosition"].ToString(), - typeTest = dr["typeTest"].ToString(), - position_level = dr["position_level"].ToString(), - position_type = dr["position_type"].ToString(), - exam_name = dr["exam_name"].ToString(), - exam_order = dr["exam_order"].ToString(), - score_year = Convert.ToInt32(dr["score_year"]).ToThaiYear().ToString(), - }); + 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() + }); + } } - } - //if (data != null && data.Count > 0) - // data = data.Skip((req.Page - 1) * req.PageSize).Take(req.PageSize).ToList(); - + // --------------------------- + // 3️⃣ ดึงสรุปคะแนน (sum_exam_info) + // --------------------------- dynamic header = null; using (var cmd = _context.Database.GetDbConnection().CreateCommand()) { - var sb = new StringBuilder(); cmd.CommandTimeout = 0; + var sb = new StringBuilder(); cmd.Parameters.Clear(); - sb.Clear(); - sb.Append(" SELECT * "); - sb.Append(" FROM sum_exam_info "); - sb.Append(" WHERE recruit_import_id = @id "); + sb.Append(" SELECT count, pass, notpass, missed_exam, other FROM sum_exam_info WHERE recruit_import_id = @id "); cmd.Parameters.Add(p_Id); - cmd.CommandText = sb.ToString(); - - _context.Database.OpenConnection(); - MySqlDataAdapter da = new MySqlDataAdapter(cmd as MySqlCommand); - DataTable dt = new DataTable(); - da.Fill(dt); - if (dt.Rows.Count == 0) + + using (var reader = cmd.ExecuteReader()) { - header = new + if (!reader.HasRows) { - count = 0, - pass = 0, - notpass = 0, - missed_exam = 0, - other = 0 - }; - } - else - { - var dr = dt.Rows[0]; - header = new + header = new + { + count = 0, + pass = 0, + notpass = 0, + missed_exam = 0, + other = 0 + }; + } + else { - count = dr["count"].ToString().ToInteger(), - pass = dr["pass"].ToString().ToInteger(), - notpass = dr["notpass"].ToString().ToInteger(), - missed_exam = dr["missed_exam"].ToString().ToInteger(), - other = dr["other"].ToString().ToInteger() - }; + reader.Read(); + header = new + { + count = reader["count"].ToString().ToInteger(), + pass = reader["pass"].ToString().ToInteger(), + notpass = reader["notpass"].ToString().ToInteger(), + missed_exam = reader["missed_exam"].ToString().ToInteger(), + other = reader["other"].ToString().ToInteger() + }; + } } } + + // --------------------------- + // 4️⃣ ดึง period + // --------------------------- var period = await _context.RecruitImports.AsQueryable() - .Select(x => new - { - x.Id, - Year = x.Year.ToThaiYear(), - x.Order, - x.Name, - }) - .FirstOrDefaultAsync(x => x.Id == id); + .Select(x => new + { + x.Id, + Year = x.Year.ToThaiYear(), + x.Order, + x.Name, + }) + .FirstOrDefaultAsync(x => x.Id == id); return Success(new { From 9ce6c503c314d1764119d326221975c157c76e35 Mon Sep 17 00:00:00 2001 From: Bright Date: Tue, 23 Sep 2025 11:53:54 +0700 Subject: [PATCH 2/6] =?UTF-8?q?=E0=B8=9B=E0=B8=A3=E0=B8=B1=E0=B8=9A=20resp?= =?UTF-8?q?onse=20=E0=B8=99=E0=B8=B2=E0=B8=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controllers/RecruitController.cs | 73 +++++++++++++++++++------------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/Controllers/RecruitController.cs b/Controllers/RecruitController.cs index f95caf7..aa146ac 100644 --- a/Controllers/RecruitController.cs +++ b/Controllers/RecruitController.cs @@ -2050,43 +2050,58 @@ namespace BMA.EHR.Recruit.Service.Controllers // 3️⃣ ดึงสรุปคะแนน (sum_exam_info) // --------------------------- dynamic header = null; - using (var cmd = _context.Database.GetDbConnection().CreateCommand()) + if (data.Count == 0) { - cmd.CommandTimeout = 0; - var sb = new StringBuilder(); - cmd.Parameters.Clear(); - sb.Append(" SELECT count, pass, notpass, missed_exam, other FROM sum_exam_info WHERE recruit_import_id = @id "); - cmd.Parameters.Add(p_Id); - cmd.CommandText = sb.ToString(); - _context.Database.OpenConnection(); - - using (var reader = cmd.ExecuteReader()) + header = new { - if (!reader.HasRows) + count = 0, + pass = 0, + notpass = 0, + missed_exam = 0, + other = 0 + }; + } + else + { + using (var cmd = _context.Database.GetDbConnection().CreateCommand()) + { + cmd.CommandTimeout = 0; + var sb = new StringBuilder(); + cmd.Parameters.Clear(); + sb.Append(" SELECT count, pass, notpass, missed_exam, other FROM sum_exam_info WHERE recruit_import_id = @id "); + cmd.Parameters.Add(p_Id); + cmd.CommandText = sb.ToString(); + _context.Database.OpenConnection(); + + using (var reader = cmd.ExecuteReader()) { - header = new + if (!reader.HasRows) { - count = 0, - pass = 0, - notpass = 0, - missed_exam = 0, - other = 0 - }; - } - else - { - reader.Read(); - header = new + header = new + { + count = 0, + pass = 0, + notpass = 0, + missed_exam = 0, + other = 0 + }; + } + else { - count = reader["count"].ToString().ToInteger(), - pass = reader["pass"].ToString().ToInteger(), - notpass = reader["notpass"].ToString().ToInteger(), - missed_exam = reader["missed_exam"].ToString().ToInteger(), - other = reader["other"].ToString().ToInteger() - }; + reader.Read(); + header = new + { + count = reader["count"].ToString().ToInteger(), + pass = reader["pass"].ToString().ToInteger(), + notpass = reader["notpass"].ToString().ToInteger(), + missed_exam = reader["missed_exam"].ToString().ToInteger(), + other = reader["other"].ToString().ToInteger() + }; + } } } } + // --------------------------- // 4️⃣ ดึง period From c8cc885546484fadfe547243db053d707509d436 Mon Sep 17 00:00:00 2001 From: Bright Date: Tue, 23 Sep 2025 18:12:01 +0700 Subject: [PATCH 3/6] no message --- Controllers/RecruitController.cs | 81 +++++++++++-------------- Requests/Recruits/RecruitExamRequest.cs | 2 + 2 files changed, 37 insertions(+), 46 deletions(-) diff --git a/Controllers/RecruitController.cs b/Controllers/RecruitController.cs index aa146ac..3e093e6 100644 --- a/Controllers/RecruitController.cs +++ b/Controllers/RecruitController.cs @@ -30,6 +30,7 @@ using static System.Runtime.InteropServices.JavaScript.JSType; using System.Globalization; using OfficeOpenXml.Style; using System.Drawing; +using System.Linq; namespace BMA.EHR.Recruit.Service.Controllers { @@ -1962,7 +1963,7 @@ namespace BMA.EHR.Recruit.Service.Controllers var p_Id = new MySqlParameter("@id", id); // --------------------------- - // 1️⃣ ดึงรายละเอียดสอบ (exam_info) + // 1️. ดึงรายละเอียดสอบ (exam_info) // --------------------------- using (var cmd = _context.Database.GetDbConnection().CreateCommand()) { @@ -2007,7 +2008,7 @@ namespace BMA.EHR.Recruit.Service.Controllers _context.Database.OpenConnection(); // --------------------------- - // 2️⃣ ใช้ DbDataReader แทน DataTable → ประหยัด memory และเร็วขึ้น + // 2️. ใช้ DbDataReader แทน DataTable → ประหยัด memory และเร็วขึ้น // --------------------------- using (var reader = cmd.ExecuteReader()) { @@ -2047,12 +2048,40 @@ namespace BMA.EHR.Recruit.Service.Controllers } // --------------------------- - // 3️⃣ ดึงสรุปคะแนน (sum_exam_info) + // 3️. ดึงสรุปคะแนน // --------------------------- dynamic header = null; - if (data.Count == 0) + if (data.Count > 0) { - header = new + int _count = await _context.Recruits.Where(x => x.Id == id).CountAsync(); + header = await _context.RecruitScores + .Include(x => x.ScoreImport) + .Where(x => x.ScoreImport.RecruitImportId == id) + .GroupBy(x => 1) + .Select(g => new + { + count = _count, + pass = g.Count(x => x.ExamStatus == "ผ่าน"), + notpass = g.Count(x => x.ExamStatus == "ไม่ผ่าน"), + missed_exam = g.Count(x => x.ExamStatus == "ขส."), + other = g.Count(x => + string.IsNullOrEmpty(x.ExamStatus) || + !new[] { "ผ่าน", "ไม่ผ่าน", "ขส." }.Contains(x.ExamStatus) + ) + }) + .FirstOrDefaultAsync() + ?? new // ใช้ null-coalescing กันกรณีไม่มีข้อมูล (แทน else เดิม) + { + count = 0, + pass = 0, + notpass = 0, + missed_exam = 0, + other = 0 + }; + } + else + { + header = new { count = 0, pass = 0, @@ -2061,50 +2090,10 @@ namespace BMA.EHR.Recruit.Service.Controllers other = 0 }; } - else - { - using (var cmd = _context.Database.GetDbConnection().CreateCommand()) - { - cmd.CommandTimeout = 0; - var sb = new StringBuilder(); - cmd.Parameters.Clear(); - sb.Append(" SELECT count, pass, notpass, missed_exam, other FROM sum_exam_info WHERE recruit_import_id = @id "); - cmd.Parameters.Add(p_Id); - cmd.CommandText = sb.ToString(); - _context.Database.OpenConnection(); - - using (var reader = cmd.ExecuteReader()) - { - if (!reader.HasRows) - { - header = new - { - count = 0, - pass = 0, - notpass = 0, - missed_exam = 0, - other = 0 - }; - } - else - { - reader.Read(); - header = new - { - count = reader["count"].ToString().ToInteger(), - pass = reader["pass"].ToString().ToInteger(), - notpass = reader["notpass"].ToString().ToInteger(), - missed_exam = reader["missed_exam"].ToString().ToInteger(), - other = reader["other"].ToString().ToInteger() - }; - } - } - } - } // --------------------------- - // 4️⃣ ดึง period + // 4️. ดึง period // --------------------------- var period = await _context.RecruitImports.AsQueryable() .Select(x => new diff --git a/Requests/Recruits/RecruitExamRequest.cs b/Requests/Recruits/RecruitExamRequest.cs index 91f4d92..4afe837 100644 --- a/Requests/Recruits/RecruitExamRequest.cs +++ b/Requests/Recruits/RecruitExamRequest.cs @@ -13,6 +13,8 @@ /// public string ExamResult { get; set; } + public string? keyword { get; set; } + public int Page { get; set; } = 1; public int PageSize { get; set; } = 10; } From bf49a8cf741014b7d1a6cb0df3e2a44aa6223c46 Mon Sep 17 00:00:00 2001 From: Bright Date: Tue, 23 Sep 2025 18:58:19 +0700 Subject: [PATCH 4/6] keyword --- Controllers/RecruitController.cs | 40 ++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/Controllers/RecruitController.cs b/Controllers/RecruitController.cs index 3e093e6..5a24ca9 100644 --- a/Controllers/RecruitController.cs +++ b/Controllers/RecruitController.cs @@ -1984,17 +1984,33 @@ namespace BMA.EHR.Recruit.Service.Controllers cmd.Parameters.Clear(); cmd.Parameters.Add(p_Id); - // เพิ่ม dynamic filter - if (!string.IsNullOrWhiteSpace(req.ExamAttribute)) - { - sb.Append(" AND examAttribute = @a "); - cmd.Parameters.Add(new MySqlParameter("@a", req.ExamAttribute)); - } + //// เพิ่ม dynamic filter + //if (!string.IsNullOrWhiteSpace(req.ExamAttribute)) + //{ + // sb.Append(" AND examAttribute = @a "); + // cmd.Parameters.Add(new MySqlParameter("@a", req.ExamAttribute)); + //} - if (!string.IsNullOrWhiteSpace(req.ExamResult)) + //if (!string.IsNullOrWhiteSpace(req.ExamResult)) + //{ + // sb.Append(" AND result = @r "); + // cmd.Parameters.Add(new MySqlParameter("@r", req.ExamResult)); + //} + + var keywordParam = req.keyword?.Trim(); // Keyword จาก FE + if (!string.IsNullOrWhiteSpace(keywordParam)) { - sb.Append(" AND result = @r "); - cmd.Parameters.Add(new MySqlParameter("@r", req.ExamResult)); + 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 @@ -2051,9 +2067,9 @@ namespace BMA.EHR.Recruit.Service.Controllers // 3️. ดึงสรุปคะแนน // --------------------------- dynamic header = null; + int _count = await _context.Recruits.Where(x => x.RecruitImport.Id == id).CountAsync(); if (data.Count > 0) { - int _count = await _context.Recruits.Where(x => x.Id == id).CountAsync(); header = await _context.RecruitScores .Include(x => x.ScoreImport) .Where(x => x.ScoreImport.RecruitImportId == id) @@ -2072,7 +2088,7 @@ namespace BMA.EHR.Recruit.Service.Controllers .FirstOrDefaultAsync() ?? new // ใช้ null-coalescing กันกรณีไม่มีข้อมูล (แทน else เดิม) { - count = 0, + count = _count, pass = 0, notpass = 0, missed_exam = 0, @@ -2083,7 +2099,7 @@ namespace BMA.EHR.Recruit.Service.Controllers { header = new { - count = 0, + count = _count, pass = 0, notpass = 0, missed_exam = 0, From 608e2ea49bdf788febf997bd87664c4c623df769 Mon Sep 17 00:00:00 2001 From: Bright Date: Wed, 24 Sep 2025 10:19:29 +0700 Subject: [PATCH 5/6] add total --- Controllers/RecruitController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Controllers/RecruitController.cs b/Controllers/RecruitController.cs index 5a24ca9..86d43cf 100644 --- a/Controllers/RecruitController.cs +++ b/Controllers/RecruitController.cs @@ -2124,6 +2124,7 @@ namespace BMA.EHR.Recruit.Service.Controllers return Success(new { data = data, + total = data.Count, header = header, period = period, }); From 48447d065cb93a5851eaced5874c547a2da37710 Mon Sep 17 00:00:00 2001 From: Bright Date: Wed, 24 Sep 2025 11:25:47 +0700 Subject: [PATCH 6/6] =?UTF-8?q?=E0=B9=81=E0=B8=81=E0=B9=89=20total?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controllers/RecruitController.cs | 33 +++++++++++++------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/Controllers/RecruitController.cs b/Controllers/RecruitController.cs index 86d43cf..31b22e2 100644 --- a/Controllers/RecruitController.cs +++ b/Controllers/RecruitController.cs @@ -1961,6 +1961,7 @@ namespace BMA.EHR.Recruit.Service.Controllers { var data = new List(); var p_Id = new MySqlParameter("@id", id); + int total = 0; // --------------------------- // 1️. ดึงรายละเอียดสอบ (exam_info) @@ -1968,15 +1969,15 @@ namespace BMA.EHR.Recruit.Service.Controllers using (var cmd = _context.Database.GetDbConnection().CreateCommand()) { cmd.CommandTimeout = 0; - var sb = new StringBuilder(); - // ปรับ SELECT * → SELECT เฉพาะ field ที่ C# ใช้ + 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 + exam_name, exam_order, score_year, + COUNT(*) OVER() AS total_count FROM exam_info WHERE recruit_import_id = @id "); @@ -1984,20 +1985,7 @@ namespace BMA.EHR.Recruit.Service.Controllers cmd.Parameters.Clear(); cmd.Parameters.Add(p_Id); - //// เพิ่ม dynamic filter - //if (!string.IsNullOrWhiteSpace(req.ExamAttribute)) - //{ - // sb.Append(" AND examAttribute = @a "); - // cmd.Parameters.Add(new MySqlParameter("@a", req.ExamAttribute)); - //} - - //if (!string.IsNullOrWhiteSpace(req.ExamResult)) - //{ - // sb.Append(" AND result = @r "); - // cmd.Parameters.Add(new MySqlParameter("@r", req.ExamResult)); - //} - - var keywordParam = req.keyword?.Trim(); // Keyword จาก FE + var keywordParam = req.keyword?.Trim(); if (!string.IsNullOrWhiteSpace(keywordParam)) { sb.Append(@" @@ -2013,7 +2001,9 @@ namespace BMA.EHR.Recruit.Service.Controllers cmd.Parameters.Add(new MySqlParameter("@kw", $"%{keywordParam}%")); } - // Paging และ sorting + // --------------------------- + // Paging + Sorting + // --------------------------- sb.Append(" ORDER BY examID "); sb.Append(" LIMIT @PageSize OFFSET @Offset "); cmd.Parameters.Add(new MySqlParameter("@PageSize", req.PageSize)); @@ -2024,12 +2014,15 @@ namespace BMA.EHR.Recruit.Service.Controllers _context.Database.OpenConnection(); // --------------------------- - // 2️. ใช้ DbDataReader แทน DataTable → ประหยัด memory และเร็วขึ้น + // ดึงข้อมูล + 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(), @@ -2124,7 +2117,7 @@ namespace BMA.EHR.Recruit.Service.Controllers return Success(new { data = data, - total = data.Count, + total = total, header = header, period = period, });