This commit is contained in:
Bright 2025-09-23 19:35:49 +07:00
parent 125dd59348
commit 5c0f183ba2
2 changed files with 266 additions and 91 deletions

View file

@ -1858,8 +1858,151 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
} }
} }
//[HttpPost("exam/{id:length(36)}")]
//public ActionResult<ResponseObject> 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<dynamic>();
// 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)}")] [HttpPost("exam/{id:length(36)}")]
public ActionResult<ResponseObject> GetExamResultById([FromBody] DisableExamRequest req, Guid id) public async Task<ActionResult<ResponseObject>> GetNewExamResultById([FromBody] DisableExamRequest req, Guid id)
{ {
try try
{ {
@ -1870,122 +2013,154 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
if (periodExam == null) if (periodExam == null)
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var p_Id = new MySqlParameter("@id", id);
var data = new List<dynamic>(); var data = new List<dynamic>();
var p_Id = new MySqlParameter("@id", id);
// ---------------------------
// 1. ดึงรายละเอียดสอบ (exam_info)
// ---------------------------
using (var cmd = _context.Database.GetDbConnection().CreateCommand()) using (var cmd = _context.Database.GetDbConnection().CreateCommand())
{ {
cmd.CommandTimeout = 0; cmd.CommandTimeout = 0;
var sb = new StringBuilder(); 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(); 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); 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 "); sb.Append(@"
cmd.Parameters.Add(new MySqlParameter("@a", req.ExamAttribute)); AND (
} examID LIKE @kw
OR profileID LIKE @kw
if (req.ExamResult != null && req.ExamResult != "") OR prefix LIKE @kw
{ OR fullName LIKE @kw
sb.Append(" AND result = @r "); OR hddPosition LIKE @kw
cmd.Parameters.Add(new MySqlParameter("@r", req.ExamResult)); OR position_name LIKE @kw
)
");
cmd.Parameters.Add(new MySqlParameter("@kw", $"%{keywordParam}%"));
} }
// Paging และ sorting
sb.Append(" ORDER BY examID "); sb.Append(" ORDER BY examID ");
sb.Append(" LIMIT @PageSize OFFSET @Offset "); sb.Append(" LIMIT @PageSize OFFSET @Offset ");
cmd.Parameters.Add(new MySqlParameter("@PageSize", req.PageSize)); 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(); cmd.CommandText = sb.ToString();
_context.Database.OpenConnection(); _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(), data.Add(new
profileID = dr["profileID"].ToString(), {
prefix = dr["prefix"].ToString(), examID = reader["examID"].ToString(),
fullName = dr["fullName"].ToString(), profileID = reader["profileID"].ToString(),
dateOfBirth = dr["dateofbirth"] == null || Convert.ToDateTime(dr["dateofbirth"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["dateofbirth"]).ToThaiShortDate(), prefix = reader["prefix"].ToString(),
gender = dr["gender"].ToString(), fullName = reader["fullName"].ToString(),
degree = dr["degree"].ToString(), dateOfBirth = reader["dateofbirth"] == DBNull.Value ? "" : Convert.ToDateTime(reader["dateofbirth"]).ToThaiShortDate(),
major = dr["major"].ToString(), gender = reader["gender"].ToString(),
majorgroup = dr["majorgroup"].ToString(), degree = reader["degree"].ToString(),
certificateNo = dr["certificateno"].ToString(), major = reader["major"].ToString(),
certificateIssueDate = dr["certificateIssueDate"] == null || Convert.ToDateTime(dr["certificateIssueDate"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["certificateIssueDate"]).ToThaiShortDate(), majorgroup = reader["majorgroup"].ToString(),
ExamScore = dr["score"] == null ? 0 : dr["score"].ToString().ToInteger(), certificateNo = reader["certificateno"].ToString(),
ExamResult = dr["result"].ToString(), certificateIssueDate = reader["certificateIssueDate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["certificateIssueDate"]).ToThaiShortDate(),
ExamAttribute = dr["examAttribute"].ToString(), ExamScore = reader["score"] == DBNull.Value ? 0 : Convert.ToDecimal(reader["score"]),
Remark = dr["remark"].ToString(), ExamResult = reader["result"].ToString(),
IsSpecial = dr["isspecial"].ToString(), ExamAttribute = reader["examAttribute"].ToString(),
applyDate = dr["applydate"] == null || Convert.ToDateTime(dr["applydate"]) == DateTime.MinValue ? "" : Convert.ToDateTime(dr["applydate"]).ToThaiShortDate(), Remark = reader["remark"].ToString(),
university = dr["university"].ToString(), IsSpecial = reader["isspecial"].ToString(),
position_name = dr["position_name"].ToString(), applyDate = reader["applydate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["applydate"]).ToThaiShortDate(),
hddPosition = dr["hddPosition"].ToString(), university = reader["university"].ToString(),
typeTest = dr["typeTest"].ToString(), position_name = reader["position_name"].ToString(),
position_level = dr["position_level"].ToString(), hddPosition = reader["hddPosition"].ToString(),
position_type = dr["position_type"].ToString(), typeTest = reader["typeTest"].ToString(),
exam_name = dr["exam_name"].ToString(), position_level = reader["position_level"].ToString(),
exam_order = dr["exam_order"].ToString(), position_type = reader["position_type"].ToString(),
score_year = Convert.ToInt32(dr["score_year"]).ToThaiYear().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; 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(); header = await _context.DisableScores
cmd.CommandTimeout = 0; .Include(x => x.ScoreImport)
cmd.Parameters.Clear(); .Where(x => x.ScoreImport.PeriodExamId == id)
sb.Clear(); .GroupBy(x => 1)
sb.Append(" SELECT * "); .Select(g => new
sb.Append(" FROM sum_exam_info "); {
sb.Append(" WHERE disable_import_id = @id "); count = _count,
cmd.Parameters.Add(p_Id); pass = g.Count(x => x.ExamStatus == "ผ่าน"),
notpass = g.Count(x => x.ExamStatus == "ไม่ผ่าน"),
cmd.CommandText = sb.ToString(); missed_exam = g.Count(x => x.ExamStatus == "ขส."),
other = g.Count(x =>
_context.Database.OpenConnection(); string.IsNullOrEmpty(x.ExamStatus) ||
MySqlDataAdapter da = new MySqlDataAdapter(cmd as MySqlCommand); !new[] { "ผ่าน", "ไม่ผ่าน", "ขส." }.Contains(x.ExamStatus)
DataTable dt = new DataTable(); )
da.Fill(dt); })
if (dt.Rows.Count == 0) .FirstOrDefaultAsync()
{ ?? new // ใช้ null-coalescing กันกรณีไม่มีข้อมูล (แทน else เดิม)
header = new {
{ count = _count,
count = 0, pass = 0,
pass = 0, notpass = 0,
notpass = 0, missed_exam = 0,
missed_exam = 0, other = 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()
};
}
} }
else
{
header = new
{
count = _count,
pass = 0,
notpass = 0,
missed_exam = 0,
other = 0
};
}
return Success(new return Success(new
{ {

View file

@ -12,7 +12,7 @@
/// ข้อมูลผลการสอบ 'ผ่าน' 'ไม่ผ่าน' /// ข้อมูลผลการสอบ 'ผ่าน' 'ไม่ผ่าน'
/// </summary> /// </summary>
public string ExamResult { get; set; } public string ExamResult { get; set; }
public string? keyword { get; set; }
public int Page { get; set; } = 1; public int Page { get; set; } = 1;
public int PageSize { get; set; } = 10; public int PageSize { get; set; } = 10;
} }