From 5c0f183ba28cf98dae65ff3060bc5449b6cbfca7 Mon Sep 17 00:00:00 2001 From: Bright Date: Tue, 23 Sep 2025 19:35:49 +0700 Subject: [PATCH 1/2] #1459 --- Controllers/DisableController.cs | 355 ++++++++++++++++++------- Request/Disables/DisableExamRequest.cs | 2 +- 2 files changed, 266 insertions(+), 91 deletions(-) diff --git a/Controllers/DisableController.cs b/Controllers/DisableController.cs index 53e9d38..6a8fe2f 100644 --- a/Controllers/DisableController.cs +++ b/Controllers/DisableController.cs @@ -1858,8 +1858,151 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers } } + //[HttpPost("exam/{id:length(36)}")] + //public ActionResult GetExamResultById([FromBody] DisableExamRequest req, Guid id) + //{ + // try + // { + // var periodExam = _context.PeriodExams.AsQueryable() + // .Where(x => x.CheckDisability == true) + // .FirstOrDefault(x => x.Id == id); + + // if (periodExam == null) + // return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); + + // 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 disable_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 = dr["score"] == null ? 0 : dr["score"].ToString().ToInteger(), + // 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 disable_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() + // }; + // } + // } + + // return Success(new + // { + // data = data, + // header = header, + // round = periodExam.Round, + // year = periodExam.Year + // }); + // } + // catch (Exception ex) + // { + // return Error(ex); + // } + //} + [HttpPost("exam/{id:length(36)}")] - public ActionResult GetExamResultById([FromBody] DisableExamRequest req, Guid id) + public async Task> GetNewExamResultById([FromBody] DisableExamRequest req, Guid id) { try { @@ -1870,122 +2013,154 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers if (periodExam == null) return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); - 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 disable_import_id = @id + "); + cmd.Parameters.Clear(); - sb.Clear(); - sb.Append(" SELECT * "); - sb.Append(" FROM exam_info "); - sb.Append(" WHERE disable_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 (!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 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(@" + 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.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 = dr["score"] == null ? 0 : dr["score"].ToString().ToInteger(), - 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️. ดึงสรุปคะแนน + // --------------------------- dynamic header = null; - using (var cmd = _context.Database.GetDbConnection().CreateCommand()) + int _count = await _context.Disables.Where(x=> x.PeriodExam.Id == id).CountAsync(); + if (data.Count > 0) { - var sb = new StringBuilder(); - cmd.CommandTimeout = 0; - cmd.Parameters.Clear(); - sb.Clear(); - sb.Append(" SELECT * "); - sb.Append(" FROM sum_exam_info "); - sb.Append(" WHERE disable_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() - }; - } + header = await _context.DisableScores + .Include(x => x.ScoreImport) + .Where(x => x.ScoreImport.PeriodExamId == 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 = _count, + pass = 0, + notpass = 0, + missed_exam = 0, + other = 0 + }; } + else + { + header = new + { + count = _count, + pass = 0, + notpass = 0, + missed_exam = 0, + other = 0 + }; + } + return Success(new { diff --git a/Request/Disables/DisableExamRequest.cs b/Request/Disables/DisableExamRequest.cs index 9ed586e..0897981 100644 --- a/Request/Disables/DisableExamRequest.cs +++ b/Request/Disables/DisableExamRequest.cs @@ -12,7 +12,7 @@ /// ข้อมูลผลการสอบ 'ผ่าน' 'ไม่ผ่าน' /// public string ExamResult { get; set; } - + public string? keyword { get; set; } public int Page { get; set; } = 1; public int PageSize { get; set; } = 10; } From 0d2ca8889f664b80c48adc1af0533db8928b991f Mon Sep 17 00:00:00 2001 From: Bright Date: Wed, 24 Sep 2025 11:35:58 +0700 Subject: [PATCH 2/2] =?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/DisableController.cs | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/Controllers/DisableController.cs b/Controllers/DisableController.cs index 6a8fe2f..c8271fe 100644 --- a/Controllers/DisableController.cs +++ b/Controllers/DisableController.cs @@ -2015,6 +2015,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers var data = new List(); var p_Id = new MySqlParameter("@id", id); + int total = 0; // --------------------------- // 1️. ดึงรายละเอียดสอบ (exam_info) @@ -2022,15 +2023,15 @@ namespace BMA.EHR.Recurit.Exam.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 disable_import_id = @id "); @@ -2038,20 +2039,7 @@ namespace BMA.EHR.Recurit.Exam.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(@" @@ -2067,7 +2055,9 @@ namespace BMA.EHR.Recurit.Exam.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)); @@ -2078,12 +2068,15 @@ namespace BMA.EHR.Recurit.Exam.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(), @@ -2165,6 +2158,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers return Success(new { data = data, + total = total, header = header, round = periodExam.Round, year = periodExam.Year