สอบคัดเลือกโหลดสรุปข้อมูลการสอบ

This commit is contained in:
Kittapath 2023-04-29 14:51:42 +07:00
parent 1d4043a50e
commit 4b07fe7409
3 changed files with 250 additions and 134 deletions

View file

@ -13,7 +13,8 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
[ApiVersion("1.0")] [ApiVersion("1.0")]
[ApiController] [ApiController]
[Produces("application/json")] [Produces("application/json")]
[Authorize] [AllowAnonymous]
// [Authorize]
[SwaggerTag("จัดการข้อมูลรอบการสอบ เพื่อนำไปใช้งานในระบบ")] [SwaggerTag("จัดการข้อมูลรอบการสอบ เพื่อนำไปใช้งานในระบบ")]
public class PeriodExamController : BaseController public class PeriodExamController : BaseController
{ {
@ -698,6 +699,34 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
} }
} }
/// <summary>
/// โหลดสรุปการสอบ
/// </summary>
/// <param name="examId">รหัสรอบสมัคร</param>
/// <returns></returns>
/// <response code="200">เมื่อทำการอ่านโหลดสรุปการสอบสำเร็จ</response>
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
[HttpPut("download/dashboard/{examId:length(36)}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<ResponseObject>> GetsDashboardExamAsync(string examId, RequestCandidateDashboard item)
{
try
{
var stream = await _periodExamService.GetsDashboardExamAsync(item, examId);
string excelName = $"Candidate_{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.xlsx";
return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName);
// return Success();
}
catch (Exception ex)
{
return Error(ex);
}
}
/// <summary> /// <summary>
/// ข้อมูลตำแหน่งสมัครสอบ /// ข้อมูลตำแหน่งสมัครสอบ
/// <param name="examId">รหัสรอบสมัคร</param> /// <param name="examId">รหัสรอบสมัคร</param>

View file

@ -0,0 +1,10 @@
using System.Net;
namespace BMA.EHR.Recurit.Exam.Service.Request
{
public class RequestCandidateDashboard
{
public DateTime DateStart { get; set; }
public DateTime DateEnd { get; set; }
}
}

View file

@ -1130,56 +1130,6 @@ namespace BMA.EHR.Recurit.Exam.Service.Services
if (periodExam == null) if (periodExam == null)
throw new Exception(GlobalMessages.ExamNotFound); throw new Exception(GlobalMessages.ExamNotFound);
// var _candidates = (from c in _context.Candidates
// where c.PeriodExam == periodExam
// select new
// {
// Id = c.Id,
// Status = c.Status,
// CitizenId = c.CitizenId,
// FullName = $"{c.PrefixName}{c.FirstName} {c.LastName}",
// Nationality = c.Nationality,
// DateOfBirth = c.DateOfBirth == null ? "" : c.DateOfBirth.Value.Date.ToThaiShortDate(),
// Age = c.DateOfBirth == null ? "" : c.DateOfBirth.Value.Date.CalculateGovAgeStr(0, 0),
// RelationshipName = c.RelationshipName,
// Telephone = c.Telephone,
// MobilePhone = c.MobilePhone,
// Email = c.Email,
// Knowledge = c.Knowledge,
// RegistAddress = c.RegistAddress,
// RegistProvinceName = c.RegistProvinceName,
// RegistDistrictName = c.RegistDistrictName,
// RegistSubDistrictName = c.RegistSubDistrictName,
// RegistZipCode = c.RegistZipCode,
// CurrentAddress = c.CurrentAddress,
// CurrentProvinceName = c.CurrentProvinceName,
// CurrentDistrictName = c.CurrentDistrictName,
// CurrentSubDistrictName = c.CurrentSubDistrictName,
// CurrentZipCode = c.CurrentZipCode,
// MarryFullName = $"{c.MarryPrefixName}{c.MarryFirstName} {c.MarryLastName}",
// FatherFullName = $"{c.FatherPrefixName}{c.FatherFirstName} {c.FatherLastName}",
// MotherFullName = $"{c.MotherPrefixName}{c.MotherFirstName} {c.MotherLastName}",
// OccupationType = c.OccupationType,
// OccupationPosition = c.OccupationPosition,
// OccupationCompany = c.OccupationCompany,
// OccupationDepartment = c.OccupationDepartment,
// OccupationEmail = c.OccupationEmail,
// OccupationTelephone = c.OccupationTelephone,
// Number = c.Number,
// ExamIdenNumber = c.ExamIdenNumber,
// SeatNumber = c.SeatNumber,
// PointTotalB = c.PointTotalB,
// PointB = c.PointB,
// ResultB = c.ResultB,
// PointTotalC = c.PointTotalC,
// PointC = c.PointC,
// ResultC = c.ResultC,
// Pass = c.Pass,
// }
// ).ToList();
var candidates = await _context.Candidates var candidates = await _context.Candidates
.AsQueryable() .AsQueryable()
.OrderBy(x => x.ExamIdenNumber) .OrderBy(x => x.ExamIdenNumber)
@ -1229,6 +1179,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Services
PointC = c.PointC, PointC = c.PointC,
ResultC = c.ResultC, ResultC = c.ResultC,
Pass = c.Pass, Pass = c.Pass,
CreatedAt = c.CreatedAt,
}) })
.ToListAsync(); .ToListAsync();
@ -1291,52 +1242,11 @@ namespace BMA.EHR.Recurit.Exam.Service.Services
summarySheet.Cells[1, 50].Value = "คะแนนภาค ค"; summarySheet.Cells[1, 50].Value = "คะแนนภาค ค";
summarySheet.Cells[1, 51].Value = "ผลสอบภาค ค"; summarySheet.Cells[1, 51].Value = "ผลสอบภาค ค";
summarySheet.Cells[1, 52].Value = "ผลการสอบ"; summarySheet.Cells[1, 52].Value = "ผลการสอบ";
summarySheet.Cells[1, 53].Value = "วันที่สมัคร";
int row = 2; int row = 2;
foreach (var item in candidates) foreach (var item in candidates)
{ {
summarySheet.Cells[row, 1].Value = GenerateStatusCandidate(item.Status);
summarySheet.Cells[row, 2].Value = item.CitizenId;
summarySheet.Cells[row, 3].Value = item.FullName;
summarySheet.Cells[row, 4].Value = item.Nationality;
summarySheet.Cells[row, 5].Value = item.DateOfBirth;
summarySheet.Cells[row, 6].Value = item.Age;
summarySheet.Cells[row, 7].Value = item.RelationshipName;
summarySheet.Cells[row, 8].Value = item.Telephone;
summarySheet.Cells[row, 9].Value = item.MobilePhone;
summarySheet.Cells[row, 10].Value = item.Email;
summarySheet.Cells[row, 11].Value = item.Knowledge;
summarySheet.Cells[row, 12].Value = item.RegistAddress;
summarySheet.Cells[row, 13].Value = item.RegistProvinceName;
summarySheet.Cells[row, 14].Value = item.RegistDistrictName;
summarySheet.Cells[row, 15].Value = item.RegistSubDistrictName;
summarySheet.Cells[row, 16].Value = item.RegistZipCode;
summarySheet.Cells[row, 17].Value = item.CurrentAddress;
summarySheet.Cells[row, 18].Value = item.CurrentProvinceName;
summarySheet.Cells[row, 19].Value = item.CurrentDistrictName;
summarySheet.Cells[row, 20].Value = item.CurrentSubDistrictName;
summarySheet.Cells[row, 21].Value = item.CurrentZipCode;
summarySheet.Cells[row, 22].Value = item.MarryFullName;
summarySheet.Cells[row, 23].Value = item.FatherFullName;
summarySheet.Cells[row, 24].Value = item.MotherFullName;
summarySheet.Cells[row, 25].Value = GenerateStatusOccupation(item.OccupationType);
summarySheet.Cells[row, 26].Value = item.OccupationPosition;
summarySheet.Cells[row, 27].Value = item.OccupationCompany;
summarySheet.Cells[row, 28].Value = item.OccupationDepartment;
summarySheet.Cells[row, 29].Value = item.OccupationEmail;
summarySheet.Cells[row, 30].Value = item.OccupationTelephone;
summarySheet.Cells[row, 43].Value = item.Number;
summarySheet.Cells[row, 44].Value = item.ExamIdenNumber;
summarySheet.Cells[row, 45].Value = item.SeatNumber;
summarySheet.Cells[row, 46].Value = item.PointTotalB;
summarySheet.Cells[row, 47].Value = item.PointB;
summarySheet.Cells[row, 48].Value = item.ResultB;
summarySheet.Cells[row, 49].Value = item.PointTotalC;
summarySheet.Cells[row, 50].Value = item.PointC;
summarySheet.Cells[row, 51].Value = item.ResultC;
summarySheet.Cells[row, 52].Value = item.Pass;
row++;
var educations = await _context.Educations var educations = await _context.Educations
.AsQueryable() .AsQueryable()
.OrderBy(x => x.DurationStart) .OrderBy(x => x.DurationStart)
@ -1391,6 +1301,7 @@ namespace BMA.EHR.Recurit.Exam.Service.Services
summarySheet.Cells[row, 50].Value = item.PointC; summarySheet.Cells[row, 50].Value = item.PointC;
summarySheet.Cells[row, 51].Value = item.ResultC; summarySheet.Cells[row, 51].Value = item.ResultC;
summarySheet.Cells[row, 52].Value = item.Pass; summarySheet.Cells[row, 52].Value = item.Pass;
summarySheet.Cells[row, 53].Value = item.CreatedAt.Date.ToThaiShortDate();
row++; row++;
} }
var careers = await _context.Careers var careers = await _context.Careers
@ -1447,6 +1358,53 @@ namespace BMA.EHR.Recurit.Exam.Service.Services
summarySheet.Cells[row, 50].Value = item.PointC; summarySheet.Cells[row, 50].Value = item.PointC;
summarySheet.Cells[row, 51].Value = item.ResultC; summarySheet.Cells[row, 51].Value = item.ResultC;
summarySheet.Cells[row, 52].Value = item.Pass; summarySheet.Cells[row, 52].Value = item.Pass;
summarySheet.Cells[row, 53].Value = item.CreatedAt.Date.ToThaiShortDate();
row++;
}
if (educations.Count() == 0 && careers.Count() == 0)
{
summarySheet.Cells[row, 1].Value = GenerateStatusCandidate(item.Status);
summarySheet.Cells[row, 2].Value = item.CitizenId;
summarySheet.Cells[row, 3].Value = item.FullName;
summarySheet.Cells[row, 4].Value = item.Nationality;
summarySheet.Cells[row, 5].Value = item.DateOfBirth;
summarySheet.Cells[row, 6].Value = item.Age;
summarySheet.Cells[row, 7].Value = item.RelationshipName;
summarySheet.Cells[row, 8].Value = item.Telephone;
summarySheet.Cells[row, 9].Value = item.MobilePhone;
summarySheet.Cells[row, 10].Value = item.Email;
summarySheet.Cells[row, 11].Value = item.Knowledge;
summarySheet.Cells[row, 12].Value = item.RegistAddress;
summarySheet.Cells[row, 13].Value = item.RegistProvinceName;
summarySheet.Cells[row, 14].Value = item.RegistDistrictName;
summarySheet.Cells[row, 15].Value = item.RegistSubDistrictName;
summarySheet.Cells[row, 16].Value = item.RegistZipCode;
summarySheet.Cells[row, 17].Value = item.CurrentAddress;
summarySheet.Cells[row, 18].Value = item.CurrentProvinceName;
summarySheet.Cells[row, 19].Value = item.CurrentDistrictName;
summarySheet.Cells[row, 20].Value = item.CurrentSubDistrictName;
summarySheet.Cells[row, 21].Value = item.CurrentZipCode;
summarySheet.Cells[row, 22].Value = item.MarryFullName;
summarySheet.Cells[row, 23].Value = item.FatherFullName;
summarySheet.Cells[row, 24].Value = item.MotherFullName;
summarySheet.Cells[row, 25].Value = GenerateStatusOccupation(item.OccupationType);
summarySheet.Cells[row, 26].Value = item.OccupationPosition;
summarySheet.Cells[row, 27].Value = item.OccupationCompany;
summarySheet.Cells[row, 28].Value = item.OccupationDepartment;
summarySheet.Cells[row, 29].Value = item.OccupationEmail;
summarySheet.Cells[row, 30].Value = item.OccupationTelephone;
summarySheet.Cells[row, 43].Value = item.Number;
summarySheet.Cells[row, 44].Value = item.ExamIdenNumber;
summarySheet.Cells[row, 45].Value = item.SeatNumber;
summarySheet.Cells[row, 46].Value = item.PointTotalB;
summarySheet.Cells[row, 47].Value = item.PointB;
summarySheet.Cells[row, 48].Value = item.ResultB;
summarySheet.Cells[row, 49].Value = item.PointTotalC;
summarySheet.Cells[row, 50].Value = item.PointC;
summarySheet.Cells[row, 51].Value = item.ResultC;
summarySheet.Cells[row, 52].Value = item.Pass;
summarySheet.Cells[row, 53].Value = item.CreatedAt.Date.ToThaiShortDate();
row++; row++;
} }
} }
@ -1458,51 +1416,170 @@ namespace BMA.EHR.Recurit.Exam.Service.Services
return stream; return stream;
} }
// public async Task<MemoryStream> GetsDashboardExamAsync(string examId) public async Task<MemoryStream> GetsDashboardExamAsync(RequestCandidateDashboard item, string examId)
// { {
// var periodExam = await _context.PeriodExams.AsQueryable() var periodExam = await _context.PeriodExams.AsQueryable()
// .FirstOrDefaultAsync(x => x.Id == Guid.Parse(examId)); .FirstOrDefaultAsync(x => x.Id == Guid.Parse(examId));
// if (periodExam == null) if (periodExam == null)
// throw new Exception(GlobalMessages.ExamNotFound); throw new Exception(GlobalMessages.ExamNotFound);
// var stream = new MemoryStream(); var candidates = await _context.Candidates
// using (var package = new ExcelPackage(stream)) .AsQueryable()
// { .OrderBy(x => x.ExamIdenNumber)
// var summarySheet = package.Workbook.Worksheets.Add("Dashboard"); .Where(x => x.CreatedAt.Date <= item.DateEnd.Date)
// summarySheet.TabColor = System.Drawing.Color.Black; .Where(x => x.CreatedAt.Date >= item.DateStart.Date)
// // summarySheet.DefaultRowHeight = 17; .Where(x => x.PeriodExam == periodExam)
// summarySheet.Row(1).Style.Font.Bold = true; .Select(c => new
// summarySheet.Cells[1, 1].Value = "จำนวนผู้สมัครคัดเลือกทั้งหมด"; {
// summarySheet.Cells[1, 2].Value = "จำนวนผู้มีสิทธิ์เข้ารับคัดเลือกทั้งหมด"; Id = c.Id,
// summarySheet.Cells[1, 3].Value = "จำนวนผู้เข้ารับการคัดเลือกทั้งหมด"; Status = c.Status,
// summarySheet.Cells[1, 4].Value = "ผ่านการสอบ"; CitizenId = c.CitizenId,
// summarySheet.Cells[1, 5].Value = "ไม่ผ่านการสอบ"; FullName = $"{c.PrefixName}{c.FirstName} {c.LastName}",
// summarySheet.Cells[1, 6].Value = "คะแนนภาค ข"; Nationality = c.Nationality,
// summarySheet.Cells[1, 7].Value = "ผลสอบภาค ข"; DateOfBirth = c.DateOfBirth == null ? "" : c.DateOfBirth.Value.Date.ToThaiShortDate(),
// summarySheet.Cells[1, 8].Value = "คะแนนเต็มภาค ค"; Age = c.DateOfBirth == null ? 0 : DateTime.Now.Date.Year - c.DateOfBirth.Value.Date.Year,
// summarySheet.Cells[1, 9].Value = "คะแนนภาค ค"; RelationshipName = c.RelationshipName,
// summarySheet.Cells[1, 10].Value = "ผลสอบภาค ค"; Telephone = c.Telephone,
// summarySheet.Cells[1, 11].Value = "ผลการสอบ"; MobilePhone = c.MobilePhone,
Email = c.Email,
Knowledge = c.Knowledge,
RegistAddress = c.RegistAddress,
RegistProvinceName = c.RegistProvinceName,
RegistDistrictName = c.RegistDistrictName,
RegistSubDistrictName = c.RegistSubDistrictName,
RegistZipCode = c.RegistZipCode,
CurrentAddress = c.CurrentAddress,
CurrentProvinceName = c.CurrentProvinceName,
CurrentDistrictName = c.CurrentDistrictName,
CurrentSubDistrictName = c.CurrentSubDistrictName,
CurrentZipCode = c.CurrentZipCode,
MarryFullName = $"{c.MarryPrefixName}{c.MarryFirstName} {c.MarryLastName}",
FatherFullName = $"{c.FatherPrefixName}{c.FatherFirstName} {c.FatherLastName}",
MotherFullName = $"{c.MotherPrefixName}{c.MotherFirstName} {c.MotherLastName}",
OccupationType = c.OccupationType,
OccupationPosition = c.OccupationPosition,
OccupationCompany = c.OccupationCompany,
OccupationDepartment = c.OccupationDepartment,
OccupationEmail = c.OccupationEmail,
OccupationTelephone = c.OccupationTelephone,
Number = c.Number,
ExamIdenNumber = c.ExamIdenNumber,
SeatNumber = c.SeatNumber,
PointTotalB = c.PointTotalB,
PointB = c.PointB,
ResultB = c.ResultB,
PointTotalC = c.PointTotalC,
PointC = c.PointC,
ResultC = c.ResultC,
Pass = c.Pass,
CreatedAt = c.CreatedAt,
})
.ToListAsync();
// summarySheet.Cells[2, 1].Value = periodExam; var stream = new MemoryStream();
// summarySheet.Cells[2, 2].Value = periodExam; using (var package = new ExcelPackage(stream))
// summarySheet.Cells[2, 3].Value = periodExam; {
// summarySheet.Cells[2, 4].Value = periodExam; var summarySheet = package.Workbook.Worksheets.Add("Dashboard");
// summarySheet.Cells[2, 5].Value = periodExam; summarySheet.TabColor = System.Drawing.Color.Black;
// summarySheet.Cells[2, 6].Value = periodExam; // summarySheet.DefaultRowHeight = 17;
// summarySheet.Cells[2, 7].Value = periodExam; summarySheet.Column(1).Style.Font.Bold = true;
// summarySheet.Cells[2, 8].Value = periodExam; summarySheet.Row(4).Style.Font.Bold = true;
// summarySheet.Cells[2, 9].Value = periodExam; summarySheet.Cells[1, 3].Style.Font.Bold = true;
// summarySheet.Cells[2, 10].Value = periodExam; int rowName = 2;
// summarySheet.Cells[2, 11].Value = periodExam; int rowCount = 2;
// summarySheet.Cells[summarySheet.Dimension.Address].AutoFitColumns(); summarySheet.Cells[1, 1].Value = "ตั้งแต่";
// package.Save(); summarySheet.Cells[1, 2].Value = item.DateStart.Date.ToThaiShortDate();
// } summarySheet.Cells[1, 3].Value = "ถึง";
summarySheet.Cells[1, 4].Value = item.DateEnd.Date.ToThaiShortDate();
summarySheet.Cells[2, 1].Value = "ชื่อรอบการสอบ/ชื่อประกาศ";
summarySheet.Cells[2, 2].Value = periodExam.Name;
summarySheet.Cells[3, 1].Value = "ครั้งที่";
summarySheet.Cells[3, 2].Value = $"{periodExam.Round}/{periodExam.Year + 543}";
if (candidates.Count() > 0)
{
summarySheet.Cells[5, 1].Value = "จำนวน";
// summarySheet.Cells[1, 6].Value = "คะแนนภาค ข";
// summarySheet.Cells[1, 7].Value = "ผลสอบภาค ข";
// summarySheet.Cells[1, 8].Value = "คะแนนเต็มภาค ค";
// summarySheet.Cells[1, 9].Value = "คะแนนภาค ค";
// summarySheet.Cells[1, 10].Value = "ผลสอบภาค ค";
// summarySheet.Cells[1, 11].Value = "ผลการสอบ";
var educations = await _context.Educations
.AsQueryable()
.Where(x => x.Candidate.PeriodExam == periodExam)
.Where(x => x.Candidate.CreatedAt.Date <= item.DateEnd.Date)
.Where(x => x.Candidate.CreatedAt.Date >= item.DateStart.Date)
.GroupBy(x => x.EducationLevelName)
.Select(x => new
{
Name = x.Key,
Count = x.Count(),
})
.ToListAsync();
// stream.Position = 0; foreach (var education in educations)
// return stream; {
// } summarySheet.Cells[4, rowName].Value = education.Name;
summarySheet.Cells[5, rowCount].Value = education.Count;
rowName++;
rowCount++;
}
var careers = await _context.Careers
.AsQueryable()
.Where(x => x.Candidate.PeriodExam == periodExam)
.Where(x => x.Candidate.CreatedAt.Date <= item.DateEnd.Date)
.Where(x => x.Candidate.CreatedAt.Date >= item.DateStart.Date)
.GroupBy(x => x.Name)
.Select(x => new
{
Name = x.Key,
Count = x.Count(),
})
.ToListAsync();
foreach (var career in careers)
{
summarySheet.Cells[4, rowName].Value = career.Name;
summarySheet.Cells[5, rowCount].Value = career.Count;
rowName++;
rowCount++;
}
summarySheet.Cells[4, rowName].Value = "อายุ 1-20 ปี";
summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 1 && x.Age <= 20).Count();
rowName++;
rowCount++;
summarySheet.Cells[4, rowName].Value = "อายุ 21-45 ปี";
summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 21 && x.Age <= 45).Count();
rowName++;
rowCount++;
summarySheet.Cells[4, rowName].Value = "อายุ 46-60 ปี";
summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 46 && x.Age <= 60).Count();
rowName++;
rowCount++;
summarySheet.Cells[4, rowName].Value = "อายุ 61-70 ปี";
summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 61 && x.Age <= 70).Count();
rowName++;
rowCount++;
summarySheet.Cells[4, rowName].Value = "อายุ 71-80 ปี";
summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 71 && x.Age <= 80).Count();
rowName++;
rowCount++;
summarySheet.Cells[4, rowName].Value = "อายุ 80 ปีขึ้นไป";
summarySheet.Cells[5, rowCount].Value = candidates.Where(x => x.Age >= 81).Count();
rowName++;
rowCount++;
}
else
{
summarySheet.Cells[5, 1].Value = "ไม่มีผู้สมัครสอบในช่วงเวลานี้";
}
summarySheet.Cells[summarySheet.Dimension.Address].AutoFitColumns();
package.Save();
}
stream.Position = 0;
return stream;
}
#endregion #endregion
} }
} }