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 {