Merge branch 'develop' into working

This commit is contained in:
Suphonchai Phoonsawat 2023-09-15 09:53:05 +07:00
commit a62e71268c
29 changed files with 914 additions and 410 deletions

View file

@ -5738,9 +5738,9 @@ namespace BMA.EHR.Application.Repositories
ProfileId = h.Profile.Id,
ProfileType = h.Profile.ProfileType,
FullName = $"{h.Profile.Prefix?.Name}{h.Profile.FirstName} {h.Profile.LastName}",
Position = h.Profile.ProfileType == " officer" ? h.Profile.Position?.Name : h.Profile.PositionEmployeePosition?.Name,
PosNo = h.Profile.ProfileType == " officer" ? h.Profile.PosNo?.Name : h.Profile.PosNoEmployee,
Rank = h.Profile.ProfileType == " officer" ? $"{h.Profile.PositionType?.Name}/{h.Profile.PositionLevel?.Name}" : $"-",
Position = h.Profile.ProfileType == "officer" ? h.Profile.Position?.Name : h.Profile.PositionEmployeePosition?.Name,
PosNo = h.Profile.ProfileType == "officer" ? h.Profile.PosNo?.Name : h.Profile.PosNoEmployee,
Rank = h.Profile.ProfileType == "officer" ? $"{h.Profile.PositionType?.Name}/{h.Profile.PositionLevel?.Name}" : $"-",
Salary = h.Salary.ToString(),
LastInsignia = h.Profile.Insignias.Count == 0 ? "" : h.Profile.Insignias.OrderByDescending(x => x.Year).FirstOrDefault().Insignia.Name,
RequestInsignia = h.RequestInsignia.Name,

View file

@ -0,0 +1,366 @@
using Amazon.S3;
using Amazon.S3.Model;
using BMA.EHR.Domain.Models.Documents;
using BMA.EHR.Domain.Shared;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System.Net.Http.Headers;
using BMA.EHR.Application.Common.Interfaces;
using Amazon;
using BMA.EHR.Domain.Models.Organizations;
using MimeTypes;
using Profile = BMA.EHR.Domain.Models.HR.Profile;
namespace BMA.EHR.Application.Repositories
{
public class MinIOService
{
#region " Fields "
private readonly IApplicationDBContext _dbContext;
private readonly IConfiguration _configuration;
private readonly AmazonS3Client _s3Client;
private readonly IWebHostEnvironment _hostingEnvironment;
private string _bucketName = string.Empty;
#endregion
#region " Constructors "
public MinIOService(IApplicationDBContext dbContext,
IConfiguration configuration,
IWebHostEnvironment hostingEnvironment)
{
_dbContext = dbContext;
_configuration = configuration;
_hostingEnvironment = hostingEnvironment;
var config = new AmazonS3Config
{
ServiceURL = _configuration["MinIO:Endpoint"],
ForcePathStyle = true
};
_s3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);
this._bucketName = _configuration["MinIO:BucketName"] ?? "bma-recruit";
}
#endregion
#region " Methods "
public async Task<Document> UploadFileAsync(IFormFile file, string newFileName = "")
{
var fileName = "";
var fileExt = Path.GetExtension(file.FileName);
if (newFileName != "")
fileName = $"{newFileName}";
else
fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
var tmpDir = Path.Combine("tmp");
if (!Directory.Exists(tmpDir))
Directory.CreateDirectory(tmpDir);
var tmpFile = Path.Combine(tmpDir, $"tmp_{DateTime.Now.ToString("ddMMyyyyHHmmss")}{fileExt}");
try
{
using (var ms = new MemoryStream())
{
var id = Guid.NewGuid();
file.CopyTo(ms);
var fileBytes = ms.ToArray();
System.IO.MemoryStream filestream = new System.IO.MemoryStream(fileBytes);
var request = new PutObjectRequest
{
BucketName = _bucketName,
Key = id.ToString("D"),
InputStream = filestream,
ContentType = file.ContentType,
CannedACL = S3CannedACL.PublicRead
};
await _s3Client.PutObjectAsync(request);
// create document object
var doc = new Document()
{
FileName = fileName,
FileType = file.ContentType,
FileSize = Convert.ToInt32(file.Length),
ObjectRefId = id,
CreatedDate = DateTime.Now
};
await _dbContext.Set<Document>().AddAsync(doc);
await _dbContext.SaveChangesAsync();
return doc;
}
}
catch
{
throw;
}
finally
{
File.Delete(tmpFile);
}
}
public async Task<FileDownloadResponse> DownloadFileAsync(Guid fileId)
{
try
{
var doc = await _dbContext.Set<Document>().AsQueryable()
.FirstOrDefaultAsync(x => x.Id == fileId);
if (doc == null)
throw new Exception(GlobalMessages.FileNotFoundOnServer);
using (var memoryStream = new MemoryStream())
{
GetObjectRequest request = new GetObjectRequest
{
BucketName = _bucketName,
Key = doc.ObjectRefId.ToString("D")
};
using (GetObjectResponse response = await _s3Client.GetObjectAsync(request))
{
using (Stream responseStream = response.ResponseStream)
{
responseStream.CopyTo(memoryStream);
}
}
var fileContent = memoryStream.ToArray();
return new FileDownloadResponse
{
FileName = doc.FileName,
FileType = doc.FileType,
FileContent = fileContent
};
};
}
catch
{
throw;
}
}
public async Task DeleteFileAsync(Guid fileId)
{
try
{
var doc = await _dbContext.Set<Document>().AsQueryable()
.FirstOrDefaultAsync(x => x.Id == fileId);
if (doc == null)
throw new Exception(GlobalMessages.FileNotFoundOnServer);
else
{
DeleteObjectRequest request = new DeleteObjectRequest
{
BucketName = _bucketName,
Key = doc?.ObjectRefId.ToString("D")
};
// delete from minio
await _s3Client.DeleteObjectAsync(request);
_dbContext.Set<Document>().Remove(doc);
await _dbContext.SaveChangesAsync();
}
}
catch
{
throw;
}
}
public async Task<string> ImagesPath(Guid? fileId)
{
if (fileId == null)
return "";
var doc = await _dbContext.Set<Document>().AsQueryable()
.FirstOrDefaultAsync(x => x.Id == fileId);
if (doc == null)
throw new Exception(GlobalMessages.FileNotFoundOnServer);
var config = new AmazonS3Config
{
ServiceURL = _configuration["MinIO:Endpoint"],
ForcePathStyle = true
};
DateTime expires = DateTime.UtcNow.AddHours(6);
var _protocol = _configuration["Protocol"];
GetPreSignedUrlRequest request = new GetPreSignedUrlRequest
{
BucketName = _bucketName,
Key = doc?.ObjectRefId.ToString("D"),
Expires = expires,
Protocol = _protocol == "HTTPS" ? Protocol.HTTPS : Protocol.HTTP
};
string path = _s3Client.GetPreSignedURL(request);
return path;
}
public async Task<string> ImagesPathByName(string fileName)
{
var config = new AmazonS3Config
{
ServiceURL = _configuration["MinIO:Endpoint"],
ForcePathStyle = true
};
DateTime expires = DateTime.UtcNow.AddHours(6);
var _protocol = _configuration["Protocol"];
GetPreSignedUrlRequest request = new GetPreSignedUrlRequest
{
BucketName = _bucketName,
Key = fileName,
Expires = expires,
Protocol = _protocol == "HTTPS" ? Protocol.HTTPS : Protocol.HTTP
};
string path = _s3Client.GetPreSignedURL(request);
return path;
}
#endregion
public List<Guid> GetAllIdByRoot(Guid? id)
{
try
{
var ret = new List<Guid>();
if (id == null)
return ret;
var oc = _dbContext.Set<OrganizationEntity>().FirstOrDefault(x => x.Id == id);
if (oc != null)
ret.Add(oc.Id);
var child = _dbContext.Set<OrganizationEntity>().AsQueryable().Where(x => x.Parent != null && x.Parent.Id == id).ToList();
if (child.Any())
{
foreach (var item in child)
{
ret.AddRange(GetAllIdByRoot(item.Id));
}
}
return ret;
}
catch
{
throw;
}
}
public async Task<string?> CheckBmaOfficer(string CitizenId)
{
var data = await _dbContext.Set<Profile>().FirstOrDefaultAsync(x => x.CitizenId == CitizenId);
if (data == null)
return null;
if (data.ProfileType.Trim().ToUpper() == "OFFICER")
return "OFFICER";
if (data.EmployeeClass.Trim().ToUpper() == "PERM")
return "EMPLOYEE_PERM";
if (data.EmployeeClass.Trim().ToUpper() == "TEMP")
return "EMPLOYEE_TEMP";
return "EMPLOYEE";
}
public async Task UploadFileAsyncTemp(string fileName, string subFolder)
{
try
{
var fileContents = File.ReadAllBytes(fileName);
System.IO.MemoryStream filestream = new System.IO.MemoryStream(fileContents);
//var fileNameWithoutExt = Path.GetFileNameWithoutExtension(fileName);
var fileExt = Path.GetExtension(fileName);
var fileType = MimeTypeMap.GetMimeType(fileExt);
var file_name = Path.GetFileName(fileName);
Console.WriteLine($"{_bucketName}{subFolder}");
Console.WriteLine(fileName);
Console.WriteLine(file_name);
Console.WriteLine(filestream);
Console.WriteLine(fileType);
var request = new PutObjectRequest
{
BucketName = $"{_bucketName}",
// BucketName = $"{_bucketName}{subFolder}",
Key = file_name,
InputStream = filestream,
ContentType = fileType,
CannedACL = S3CannedACL.PublicRead
};
await _s3Client.PutObjectAsync(request);
}
catch
{
throw;
}
}
public async Task GenerateJsonFile(string json, string path, string fileName)
{
var tmpDir = Path.Combine("tmp");
if (!Directory.Exists(tmpDir))
Directory.CreateDirectory(tmpDir);
var tmpFile = Path.Combine(tmpDir, $"{fileName}.json");
try
{
SaveToJsonFile(tmpFile, json);
await UploadFileAsyncTemp(tmpFile, path);
}
catch
{
throw;
}
finally
{
if (tmpFile != "")
{
if (System.IO.File.Exists(tmpFile))
System.IO.File.Delete(tmpFile);
}
}
}
private void SaveToJsonFile(string fileName, string data)
{
TextWriter writer = null;
try
{
writer = new StreamWriter(fileName);
writer.Write(data);
}
catch
{
throw;
}
finally
{
if (writer != null)
writer.Close();
}
}
}
}

View file

@ -162,7 +162,7 @@ namespace BMA.EHR.Application.Repositories.Reports
{
No = string.IsNullOrEmpty(evaluate_assign.data.evaluate.no.ToString()) ? string.Empty : evaluate_assign.data.evaluate.no.ToString().ToThaiNumber(),
EvaluateDateStart = string.IsNullOrEmpty(evaluate_assign.data.evaluate.date_start.ToString()) ? "วันที่ เดือน พ.ศ." : evaluate_assign.data.evaluate.date_start.ToThaiFullDate().ToString().ToThaiNumber(),
EvaluateDateFinish = string.IsNullOrEmpty(evaluate_assign.data.evaluate.date_start.ToString()) ? "วันที่ เดือน พ.ศ." : evaluate_assign.data.evaluate.date_start.ToThaiFullDate().ToString().ToThaiNumber(),
EvaluateDateFinish = string.IsNullOrEmpty(evaluate_assign.data.evaluate.date_finish.ToString()) ? "วันที่ เดือน พ.ศ." : evaluate_assign.data.evaluate.date_finish.ToThaiFullDate().ToString().ToThaiNumber(),
Name = string.IsNullOrEmpty(evaluate_assign.data.experimentee.name) ? string.Empty : evaluate_assign.data.experimentee.name,
Position = string.IsNullOrEmpty(evaluate_assign.data.experimentee.Position) ? string.Empty : evaluate_assign.data.experimentee.Position,
Department = string.IsNullOrEmpty(evaluate_assign.data.experimentee.Department) ? string.Empty : evaluate_assign.data.experimentee.Department,
@ -206,7 +206,7 @@ namespace BMA.EHR.Application.Repositories.Reports
{
No = string.IsNullOrEmpty(evaluate_assign.data.evaluate.no.ToString()) ? string.Empty : evaluate_assign.data.evaluate.no.ToString().ToThaiNumber(),
EvaluateDateStart = string.IsNullOrEmpty(evaluate_assign.data.evaluate.date_start.ToString()) ? "วันที่ เดือน พ.ศ." : evaluate_assign.data.evaluate.date_start.ToThaiFullDate().ToString().ToThaiNumber(),
EvaluateDateFinish = string.IsNullOrEmpty(evaluate_assign.data.evaluate.date_start.ToString()) ? "วันที่ เดือน พ.ศ." : evaluate_assign.data.evaluate.date_start.ToThaiFullDate().ToString().ToThaiNumber(),
EvaluateDateFinish = string.IsNullOrEmpty(evaluate_assign.data.evaluate.date_finish.ToString()) ? "วันที่ เดือน พ.ศ." : evaluate_assign.data.evaluate.date_finish.ToThaiFullDate().ToString().ToThaiNumber(),
Name = string.IsNullOrEmpty(evaluate_assign.data.experimentee.name) ? string.Empty : evaluate_assign.data.experimentee.name,
Position = string.IsNullOrEmpty(evaluate_assign.data.experimentee.Position) ? string.Empty : evaluate_assign.data.experimentee.Position,
Department = string.IsNullOrEmpty(evaluate_assign.data.experimentee.Department) ? string.Empty : evaluate_assign.data.experimentee.Department,

View file

@ -1,12 +1,15 @@
using System.Reflection.Metadata;
using BMA.EHR.Application.Common.Interfaces;
using BMA.EHR.Application.Responses;
using BMA.EHR.Domain.Extensions;
using BMA.EHR.Domain.Models.HR;
using BMA.EHR.Domain.Models.Organizations;
using BMA.EHR.Domain.Models.Retirement;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Newtonsoft.Json;
namespace BMA.EHR.Application.Repositories.Reports
{
@ -16,16 +19,19 @@ namespace BMA.EHR.Application.Repositories.Reports
private readonly IApplicationDBContext _dbContext;
private readonly IWebHostEnvironment _hostingEnvironment;
private readonly MinIOService _documentService;
#endregion
#region " Constructor and Destructor "
public RetireReportRepository(IApplicationDBContext dbContext,
MinIOService documentService,
IWebHostEnvironment hostEnvironment)
{
_dbContext = dbContext;
_hostingEnvironment = hostEnvironment;
_documentService = documentService;
}
#endregion
@ -67,64 +73,73 @@ namespace BMA.EHR.Application.Repositories.Reports
if (retireHistorys == null)
return null;
var profile_retireHistory = await _dbContext.Set<RetirementProfile>()
.Where(x => x.RetirementPeriod == retire)
.OrderBy(x => x.Order)
.Select(x => new
{
order = x.Order,
id = x.Id,
reason = x.Reason,
remove = x.Remove,
profileId = x.Profile.Id,
citizenId = x.Profile.CitizenId,
prefix = x.Profile.Prefix == null ? null : x.Profile.Prefix.Name,
fullName = $"{x.Profile.FirstName} {x.Profile.LastName}",
organizationOrganization = x.Profile.OrganizationOrganization,
oc = x.Profile.Oc,
position = x.Profile.Position == null ? null : x.Profile.Position.Name,
positionType = x.Profile.PositionType == null ? null : x.Profile.PositionType.Name,
positionExecutive = x.Profile.PositionExecutive,
posNo = x.Profile.PosNo == null ? null : x.Profile.PosNo.Name,
positionEmployeePosition = x.Profile.PositionEmployeePosition,
positionEmployeeLevel = x.Profile.PositionEmployeeLevel,
positionEmployeeGroup = x.Profile.PositionEmployeeGroup,
posNoEmployee = x.Profile.PosNoEmployee,
})
.ToListAsync();
return new { retireHistorys.Id, retireHistorys.CreatedAt, Year = retireHistorys.Year.ToThaiYear().ToString().ToThaiNumber(), retireHistorys.Round, retireHistorys.Type, retireHistorys.TypeReport, Total = retireHistorys.Total.ToString().ToThaiNumber(), profile = profile_retireHistory };
//var profile_retireHistory = await _dbContext.Set<RetirementProfile>()
// .Where(x => x.RetirementPeriod == retire)
// .OrderBy(x => x.Order)
// .Select(x => new
// {
// order = x.Order,
// id = x.Id,
// reason = x.Reason,
// remove = x.Remove,
// profileId = x.Profile.Id,
// citizenId = x.Profile.CitizenId,
// prefix = x.Profile.Prefix == null ? string.Empty : x.Profile.Prefix.Name,
// fullName = $"{x.Profile.FirstName} {x.Profile.LastName}",
// organizationOrganization = x.Profile.OrganizationOrganization,
// oc = x.Profile.Oc,
// position = x.Profile.Position == null ? string.Empty : x.Profile.Position.Name,
// positionType = x.Profile.PositionType == null ? string.Empty : x.Profile.PositionType.Name,
// positionExecutive = x.Profile.PositionExecutive,
// posNo = x.Profile.PosNo == null ? string.Empty : x.Profile.PosNo.Name,
// positionEmployeePosition = x.Profile.PositionEmployeePosition,
// positionEmployeeLevel = x.Profile.PositionEmployeeLevel,
// positionEmployeeGroup = x.Profile.PositionEmployeeGroup,
// posNoEmployee = x.Profile.PosNoEmployee,
// })
// .ToListAsync();
//return new { retireHistorys.Detail, retireHistorys.Id, retireHistorys.CreatedAt, Year = retireHistorys.Year.ToThaiYear().ToString().ToThaiNumber(), retireHistorys.Round, retireHistorys.Type, retireHistorys.TypeReport, Total = retireHistorys.Total.ToString().ToThaiNumber(), profile = profile_retireHistory };
using (var client = new HttpClient())
{
var url = await _documentService.ImagesPathByName($"{retireHistorys.ProfileFile}.json");
var responseTask = client.GetAsync(url);
var results = responseTask.Result;
var json = results.Content.ReadAsStringAsync().Result;
List<ProfileJsonRequest> profiles = JsonConvert.DeserializeObject<List<ProfileJsonRequest>>(json);
profiles = profiles.OrderBy(x => x.order).ToList();
return new { retireHistorys.Detail, retireHistorys.Id, retireHistorys.CreatedAt, Year = retireHistorys.Year.ToThaiYear().ToString().ToThaiNumber(), retireHistorys.Round, retireHistorys.Type, retireHistorys.TypeReport, Total = retireHistorys.Total.ToString().ToThaiNumber(), profile = profiles};
}
}
else
{
var profile_retire = await _dbContext.Set<RetirementProfile>()
.Where(x => x.RetirementPeriod == retire)
.OrderBy(x => x.Order)
.Select(x => new
{
order = x.Order,
id = x.Id,
reason = x.Reason,
remove = x.Remove,
profileId = x.Profile.Id,
citizenId = x.Profile.CitizenId,
prefix = x.Profile.Prefix == null ? null : x.Profile.Prefix.Name,
fullName = $"{x.Profile.FirstName} {x.Profile.LastName}",
organizationOrganization = x.Profile.OrganizationOrganization,
oc = x.Profile.Oc,
position = x.Profile.Position == null ? null : x.Profile.Position.Name,
positionType = x.Profile.PositionType == null ? null : x.Profile.PositionType.Name,
positionExecutive = x.Profile.PositionExecutive,
posNo = x.Profile.PosNo == null ? null : x.Profile.PosNo.Name,
positionEmployeePosition = x.Profile.PositionEmployeePosition,
positionEmployeeLevel = x.Profile.PositionEmployeeLevel,
positionEmployeeGroup = x.Profile.PositionEmployeeGroup,
.Where(x => x.RetirementPeriod == retire)
.OrderBy(x => x.Order)
.Select(x => new
{
order = x.Order,
id = x.Id,
reason = x.Reason,
remove = x.Remove,
profileId = x.Profile.Id,
citizenId = x.Profile.CitizenId,
prefix = x.Profile.Prefix == null ? string.Empty : x.Profile.Prefix.Name,
fullName = $"{x.Profile.FirstName} {x.Profile.LastName}",
organizationOrganization = x.Profile.OrganizationOrganization,
oc = x.Profile.Oc,
position = x.Profile.Position == null ? string.Empty : x.Profile.Position.Name,
positionType = x.Profile.PositionType == null ? string.Empty : x.Profile.PositionType.Name,
positionExecutive = x.Profile.PositionExecutive,
posNo = x.Profile.PosNo == null ? string.Empty : x.Profile.PosNo.Name,
positionEmployeePosition = x.Profile.PositionEmployeePosition,
positionEmployeeLevel = x.Profile.PositionEmployeeLevel,
positionEmployeeGroup = x.Profile.PositionEmployeeGroup,
posNoEmployee = x.Profile.PosNoEmployee,
})
.ToListAsync();
return new { retire.Id, retire.CreatedAt, Year = retire.Year.ToThaiYear().ToString().ToThaiNumber(), retire.Round, retire.Type, retire.TypeReport, Total = profile_retire.Count.ToString().ToThaiNumber(), profile = profile_retire };
return new { retire.Detail, retire.Id, retire.CreatedAt, Year = retire.Year.ToThaiYear().ToString().ToThaiNumber(), retire.Round, retire.Type, retire.TypeReport, Total = profile_retire.Count.ToString().ToThaiNumber(), profile = profile_retire };
}
}
#endregion
@ -164,12 +179,17 @@ namespace BMA.EHR.Application.Repositories.Reports
if (data == null)
return null;
string Prefix = string.IsNullOrEmpty(data.Prefix.ToString()) ? string.Empty : data.Prefix.ToString();
string FirstName = string.IsNullOrEmpty(data.FirstName.ToString()) ? string.Empty : data.FirstName.ToString();
string LastName = string.IsNullOrEmpty(data.LastName.ToString()) ? string.Empty : data.LastName.ToString();
string FullName = $"{Prefix} {FirstName} {LastName}";
string Date = string.IsNullOrEmpty(data.Date.ToString()) ? "วันที่ - เดือน - พ.ศ. -" : DateTime.Parse(data.Date.ToString()).ToThaiFullDate().ToString().ToThaiNumber();
string CurrentDate = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd")).ToThaiFullDate().ToString().ToThaiNumber();
return new
{
data.Prefix,
data.FirstName,
data.LastName,
FullName,
Date,
CurrentDate,
data.Position,
data.PositionExecutive,
data.PositionType,
@ -183,7 +203,6 @@ namespace BMA.EHR.Application.Repositories.Reports
data.PositionLevelId,
data.OrganizationId,
data.Number,
Date,
data.Location,
data.Reason,
};