From 4987f7c5ad4ab206977ba64f2a4c6f7749c1a33d Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Tue, 25 Apr 2023 22:36:58 +0700 Subject: [PATCH] Change REport --- BMA.EHR.Report.Service.csproj | 3 + Controllers/RecruitReportController.cs | 135 +++++++++++++++++++++---- Models/Recruits/Recruit.cs | 2 + Models/Recruits/RecruitImport.cs | 34 ++++++- Models/Recruits/RecruitScore.cs | 2 + Program.cs | 7 +- Report/Recruit/rptCertificate1.trdp | Bin 248087 -> 248087 bytes Report/Recruit/rptExamResult.trdp | Bin 0 -> 2093 bytes Services/RecruitService.cs | 65 ++++++++++++ 9 files changed, 224 insertions(+), 24 deletions(-) create mode 100644 Report/Recruit/rptExamResult.trdp create mode 100644 Services/RecruitService.cs diff --git a/BMA.EHR.Report.Service.csproj b/BMA.EHR.Report.Service.csproj index 7bf765e..d5863cc 100644 --- a/BMA.EHR.Report.Service.csproj +++ b/BMA.EHR.Report.Service.csproj @@ -67,6 +67,9 @@ PreserveNewest + + PreserveNewest + diff --git a/Controllers/RecruitReportController.cs b/Controllers/RecruitReportController.cs index 10617f6..c95d7bd 100644 --- a/Controllers/RecruitReportController.cs +++ b/Controllers/RecruitReportController.cs @@ -1,5 +1,6 @@ using BMA.EHR.Extensions; using BMA.EHR.Profile.Service.Controllers; +using BMA.EHR.Recruit.Service.Services; using BMA.EHR.Report.Service.Data; using BMA.EHR.Report.Service.Responses; using Microsoft.AspNetCore.Authorization; @@ -26,6 +27,7 @@ namespace BMA.EHR.Report.Service.Controllers private readonly IWebHostEnvironment _hostingEnvironment; private readonly IConfiguration _configuration; private readonly string space = "ㅤ"; + private readonly RecruitService _recruitService; #endregion @@ -33,34 +35,37 @@ namespace BMA.EHR.Report.Service.Controllers public RecruitReportController(ApplicationDbContext context, IWebHostEnvironment hostingEnvironment, - IConfiguration configuration) + IConfiguration configuration, + RecruitService recruitService) { this._context = context; this._hostingEnvironment = hostingEnvironment; this._configuration = configuration; + this._recruitService = recruitService; } - #endregion + #endregion - #region " Methods " + #region " Methods " - /// - /// แสดงหนังสือรับรอง - /// - /// รหัสรอบการสอบ - /// เลขประจำตัวผู้สมัครสอบ - /// - /// เมื่อแสดงรายงานสำเร็จ - /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง - /// ไม่ได้ Login เข้าระบบ - /// เมื่อเกิดข้อผิดพลาดในการทำงาน + /// + /// แสดงหนังสือรับรอง + /// + /// รหัสรอบการสอบ + /// เลขประจำตัวผู้สมัครสอบ + /// ชนิดของรายงาน + /// + /// เมื่อแสดงรายงานสำเร็จ + /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง + /// ไม่ได้ Login เข้าระบบ + /// เมื่อเกิดข้อผิดพลาดในการทำงาน - [HttpGet("certificate/{type:int}/{id:length(36)}/{examId}")] + [HttpGet("certificate/{type:int}/{id:length(36)}/{examId}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] - public async Task> GetPeriodByIdAsync(Guid id, string examId,int type) + public async Task> GetCertificateReportAsync(Guid id, string examId,int type) { try { @@ -77,10 +82,10 @@ namespace BMA.EHR.Report.Service.Controllers ExamID = p.ExamId, p.CitizenId, Order = p.RecruitImport.Order, - Year = p.RecruitImport.Year, + Year = p.RecruitImport.Year.ToThaiYear(), FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", ExamResult = sr == null ? "" : sr.ExamStatus, - EndDate = DateTime.Now.ToThaiFullDate3(), // must replace from database + EndDate = p.RecruitImport.RegisterEndDate == null ? "-" : p.RecruitImport.RegisterEndDate.Value.ToThaiFullDate3(), AuthName = "นายณัฐพงศ์ ดิษยบุตร", AuthPosition = "หัวหน้าสำนักงาน ก.ก." }) @@ -116,7 +121,99 @@ namespace BMA.EHR.Report.Service.Controllers } } + /// + /// แสดงเอกสารผลสอบ + /// + /// รหัสรอบการสอบ + /// เลขประจำตัวผู้สมัครสอบ + /// + /// เมื่อแสดงรายงานสำเร็จ + /// ค่าตัวแปรที่ส่งมาไม่ถูกต้อง + /// ไม่ได้ Login เข้าระบบ + /// เมื่อเกิดข้อผิดพลาดในการทำงาน + [HttpGet("score/{id:length(36)}/{examId}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetScoreReportAsync(Guid id, string examId) + { + try + { + var data = await _context.Recruits.AsQueryable() + .Include(x => x.RecruitImport) + .Include(x => x.Documents) + .ThenInclude(x => x.DocumentFile) + .Where(x => x.RecruitImport.Id == id) + .Where(x => x.ExamId == examId) + .Join(_context.RecruitScores.AsQueryable() + .Include(x => x.ScoreImport), + rc => new { rc.RecruitImport.Year, rc.ExamId }, + sc => new { sc.ScoreImport.Year, sc.ExamId }, + (p, sr) => new + { + ExamId= p.ExamId, + CitizenId = p.CitizenId, + p.Prefix, + FullName = $"{p.Prefix}{p.FirstName} {p.LastName}", + DateOfBirth = p.DateOfBirth.ToThaiShortDate(), + Gender = p.Gendor, + Degree = p.Educations.First().Degree, + Major = p.Educations.First().Major, + + ExamResult = sr == null ? "" : sr.ExamStatus, + + University = p.Educations.First().University, + PositionName = p.PositionName, + ExamName = $"{p.RecruitImport.Name} ครั้งที่ {p.RecruitImport.Order}/{p.RecruitImport.Year.ToThaiYear()}", + + + Number = sr == null ? "" : sr.Number, + ExamCount = _recruitService.GetExamCount(p.CitizenId), + ScoreExpire = p.RecruitImport.AnnouncementDate == null ? "" : p.RecruitImport.AnnouncementDate.Value.AddYears(2).ToThaiShortDate(), - #endregion - } + + FullA = sr == null ? 0 : sr.FullA, + SumA = sr == null ? 0 : sr.SumA, + FullB = sr == null ? 0 : sr.FullB, + SumB = sr == null ? 0 : sr.SumB, + FullC = sr == null ? 0 : sr.FullC, + SumC = sr == null ? 0 : sr.SumC, + + + + }) + .FirstOrDefaultAsync(); + + var rptFile = Path.Combine(_hostingEnvironment.ContentRootPath, "Report", "Recruit", $"rptExamResult.trdp"); + ReportPackager reportPackager = new ReportPackager(); + Telerik.Reporting.Report report = null; + using (var sourceStream = System.IO.File.OpenRead(rptFile)) + { + report = (Telerik.Reporting.Report)reportPackager.UnpackageDocument(sourceStream); + } + + report.DataSource = data; + System.Collections.Hashtable deviceInfo = new System.Collections.Hashtable(); + + InstanceReportSource instanceReportSource = new InstanceReportSource() + { + ReportDocument = report + }; + + + ReportProcessor reportProcessor = new ReportProcessor(_configuration); + RenderingResult result = reportProcessor.RenderReport("PDF", instanceReportSource, deviceInfo); + + var content = result.DocumentBytes; + return File(content, "application/pdf", $"ผลคะแนนสอบ_{data.CitizenId}_{data.FullName}.pdf"); + } + catch (Exception ex) + { + return Error(ex, "เกิดข้อผิดพลาดในการแสดงรายงาน"); + } + } + + #endregion + } } diff --git a/Models/Recruits/Recruit.cs b/Models/Recruits/Recruit.cs index c089284..880f96e 100644 --- a/Models/Recruits/Recruit.cs +++ b/Models/Recruits/Recruit.cs @@ -76,5 +76,7 @@ namespace BMA.EHR.Recruit.Service.Models.Recruits public DateTime ModifiedDate { get; set; } public DateTime ApplyDate { get; set; } + + public string? PositionName { get; set; } } } diff --git a/Models/Recruits/RecruitImport.cs b/Models/Recruits/RecruitImport.cs index 83cd1dc..9ea0f41 100644 --- a/Models/Recruits/RecruitImport.cs +++ b/Models/Recruits/RecruitImport.cs @@ -17,7 +17,39 @@ namespace BMA.EHR.Recruit.Service.Models.Recruits [Required, Comment("ครั้งที่"), Column(Order = 3)] public int Order { get; set; } = 1; - public Document ImportFile { get; set; } = new Document(); + [Column(Order = 4, TypeName = "text"), Comment("รายละเอียด")] + public string? Detail { get; set; } + + [Column(Order = 5), Comment("ค่าธรรมเนียม")] + public int Fee { get; set; } = 0; + + [Column(Order = 6), Comment("วันเริ่มประกาศ")] + public DateTime? AnnouncementStartDate { get; set; } + + [Column(Order = 7), Comment("วันสิ้นสุดประกาศ")] + public DateTime? AnnouncementEndDate { get; set; } + + [Column(Order = 8), Comment("วันเริ่มชำระเงิน")] + public DateTime? PaymentStartDate { get; set; } + + [Column(Order = 9), Comment("วันสิ้นสุดชำระเงิน")] + public DateTime? PaymentEndDate { get; set; } + + [Column(Order = 10), Comment("วันเริ่มสมัครสอบ")] + public DateTime? RegisterStartDate { get; set; } + + [Column(Order = 11), Comment("วันสิ้นสุดสมัครสอบ")] + public DateTime? RegisterEndDate { get; set; } + + [Column(Order = 12), Comment("วันที่สอบ")] + public DateTime? ExamDate { get; set; } + + [Column(Order = 13, TypeName = "text"), Comment("หมายเหตุ")] + public string? Note { get; set; } + + public DateTime? AnnouncementDate { get; set; } + + public Document ImportFile { get; set; } = new Document(); public List Recruits { get; set; } = new List(); diff --git a/Models/Recruits/RecruitScore.cs b/Models/Recruits/RecruitScore.cs index 43b1b10..67b0b5a 100644 --- a/Models/Recruits/RecruitScore.cs +++ b/Models/Recruits/RecruitScore.cs @@ -37,6 +37,8 @@ namespace BMA.EHR.Recruit.Service.Models.Recruits [MaxLength(200)] public string Major { get; set; } + public string? Number { get; set; } = string.Empty; + public ScoreImport ScoreImport { get; set; } } } diff --git a/Program.cs b/Program.cs index 7fd7df2..42c66c6 100644 --- a/Program.cs +++ b/Program.cs @@ -15,6 +15,7 @@ using MongoDB.Bson; using MongoDB.Bson.Serialization; using BMA.EHR.Report.Service; using Microsoft.AspNetCore.Mvc.ApiExplorer; +using BMA.EHR.Recruit.Service.Services; var builder = WebApplication.CreateBuilder(args); var issuer = builder.Configuration["Jwt:Issuer"]; @@ -69,8 +70,7 @@ BsonSerializer.RegisterSerializer(new DateTimeSerializer(BsonType.String)); // Register DbContext var recruitConnection = builder.Configuration.GetConnectionString("RecruitConnection"); builder.Services.AddDbContext(options => - options.UseMySql(recruitConnection, ServerVersion.AutoDetect(recruitConnection), o => o.MigrationsHistoryTable("__ReportMigrationsHistory")) -); + options.UseMySql(recruitConnection, ServerVersion.AutoDetect(recruitConnection), o => o.MigrationsHistoryTable("__ReportMigrationsHistory")), ServiceLifetime.Transient); // Add config CORS @@ -84,8 +84,7 @@ builder.Services.AddCors(options => options.AddDefaultPolicy(builder => })); // Register Service -//builder.Services.AddTransient(); -//builder.Services.AddTransient(); +builder.Services.AddTransient(); // Add services to the container. builder.Services.AddControllers(options => diff --git a/Report/Recruit/rptCertificate1.trdp b/Report/Recruit/rptCertificate1.trdp index bc4fcfd1109553106fd6350e40b86092d40f5c6b..17e4dd17fefb939b7eab0036066940abce774d1c 100644 GIT binary patch delta 96 zcmbO}iGTVee%=6YW)=|!1_lm>?VD#d@^0m2{CAfb$ZY4k$GDyE9uvzw5O2Ha9_9~R jAl7t_6VcNedAIU1{=3TzWVZ9&W8BVnkBQ|Th__vI5Az2u j5NkTeaprem#?Rx-?qG)V31(j~WAX`ROEBa731$xfrb#AN diff --git a/Report/Recruit/rptExamResult.trdp b/Report/Recruit/rptExamResult.trdp new file mode 100644 index 0000000000000000000000000000000000000000..4b1b30c4e78a28057f7d97f76538076e2c485069 GIT binary patch literal 2093 zcmai#X;c!37RPZ(Epy+M+;YRwTu2gAA!QV|By%aXv~fvOK@D-GGz}@!0?masCEPP{ z$&A#Rv`BNotsG35!h*~dZCs1ze0$A%@4S1@J@?#m@BhpH!~LN=#Ke^W0Du%=vZc&_ zNS?18F985Z*Z=^s03aYdA~G5sjg7{j52VD!>QdDKCgp!$|7U!oY`0}1 z$&BREK{sF2JGhNF_F`HaIH3n;UCvsu;cti;hOQYmmT^NxEN^ju^~r3`;=p`tBVEQ!f&kbBu^cqnY`_4EzD;M}dK0S<2{GK+D#S}r*) zrX_Ot>d*&S5aoI6iDd?irgN_9h)2i-8bNurtOV5IuFC;A5o)fsKUA3B2^o^i#w9+a zUhkqs{I(+VdP>P~yHZ&}b63)Emb4+eJMUqOhf9r^gSglT(4aM~?Upab?t7Q?3d{%= zvgS~9Fdpwb%g(}s1+@Alt&_8M9CF|zM}zK`&rk7!eBDdUw3)-@bnWm2(C$W%)VLAd zH*QaNQQ!;uv3J&cC%?*KxAe;QQ17UzYp}Nn;T?x*#bl*sAC$FlMiJ4*y()mfxxUli z=K`kP*x_CE-vnnAD)B_uwbED}Zb}d0yF9aTnV$}Xb??_-3dyOUKz&-L}2m+K!R3tg!VC!p8t zSTSknw~A)MX6UAmopIA6Ug55C1RS#L_D5f61JFg9UtHXce7)V@`ITq;BiHK{%q{~jVXoP$v`&SpcbL72S$Nc4Nv%(C6D(pwe7u_XJc z^*se>+z_tP0xec|e2g(q@cUDt^WtJ+m3 zbp;JF#`d}_u?HziQu}#$cO4GW* zN!UgqTK87qWX7;@n))&at9#g&_e0!gMYN}0E{7?+^_*;#XU2jPG|HpBNJa7bz1^r) zU7n-%lv2e&@RF)H+kTWDZ*qjEZRMA2@LOvpGD<^~x3Ubn3%MQT$Plr z&R9@hH*?MjmMq?Un{rh|&;&z$lrVGVrw`gZG%G-48>qbmbIZ=O35T8TRd_>r41Yq6 zmJGs)-ET5Umha1p3Z%t(DG#R)J>1Ym_!5Z38hA~gLBlM_*nE*g&nA_5!rb`_x~!YbeK9@D{_4# zpF%tb?O>+P7?3|EGBjn-s!qbq{wbytvKJ5;Msagj0*ugcj(-*#K$`XzF+F`PQePzY zkNxWSowN^kk9NUUS`jF~-t1o9hv;~7BgX39Hln@u$>N4cM+XcmYGv|p=>6|zL*yR!gamdj@6Vd#p*@&^2i@j z&Ask~tl8Wmg~PxO#0Zj`0g(Jju?-K*KB8?LNGo@{Fj(8oDFZW!S&@aHJ z{?^?k!nk_rQ!l3F1Qv$Cy?R18b(cPfDrRRC(^hlKjWZ1wJ9Mmo#b5=G+*@5HTT8Nh zUSVwR2<1>eaf`UUntF2wN^Lu(w8O0+XABw}fyRdTrp8B{KlT6MWq8y>_L8N1r#m=Z z9ed_l^c&I6EVZavKt2nCwd9Wnrx-Mbl0I!cTin|JH3Ha^T{Uwlfd0!b@-uPmP!6c{ ziFpAkCKd1Et{;T=VS$-SzcoAL8{O0+54meq4aXCX=MGOi{UWvImju_cFXUZ%C(9Ce zHk3)KmKcss#uj8pK{$4m&wFfbV{G57Cn|`ayCPKEltg)mh?)cb7n}b{;GaqTPwmhC d{JXY&hxY%)EtJQuodp0Ox|8^wPLce3`WNJ)wUGb- literal 0 HcmV?d00001 diff --git a/Services/RecruitService.cs b/Services/RecruitService.cs new file mode 100644 index 0000000..af9d858 --- /dev/null +++ b/Services/RecruitService.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using BMA.EHR.Recruit.Service.Models.Recruits; +using BMA.EHR.Report.Service.Data; + +namespace BMA.EHR.Recruit.Service.Services +{ + public class RecruitService + { + private readonly ApplicationDbContext _context; + + public RecruitService(ApplicationDbContext context) + { + _context = context; + } + + public int GetExamCount(string citizenId) + { + try + { + var count = _context.Recruits.AsQueryable() + .Where(x => x.CitizenId == citizenId) + .Count(); + + return count; + } + catch + { + throw; + } + } + + public async Task GetExamAttributeAsync(Guid period, Guid exam) + { + try + { + var payment = await _context.RecruitPayments.AsQueryable() + .Include(x => x.Recruit) + .ThenInclude(x => x.RecruitImport) + .Where(x => x.Recruit.Id == exam) + .Where(x => x.Recruit.RecruitImport.Id == period) + .FirstOrDefaultAsync(); + + return payment != null ? "มีคุณสมบัติ" : "ไม่มีคุณสมบัติ"; + } + catch + { + throw; + } + } + + public bool CheckValidCertificate(DateTime certDate, int nextYear = 5) + { + var valid = true; + if (DateTime.Now.Date > certDate.Date.AddYears(nextYear)) + valid = false; + + return valid; + } + + } +} \ No newline at end of file