From 78cd9a81567bce6eb7ecf1d1cc1e49e68c8c197b Mon Sep 17 00:00:00 2001 From: Suphonchai Phoonsawat Date: Sat, 2 Sep 2023 19:38:24 +0700 Subject: [PATCH] =?UTF-8?q?C-PM-21=20=E0=B8=84=E0=B8=B3=E0=B8=AA=E0=B8=B1?= =?UTF-8?q?=E0=B9=88=E0=B8=87=E0=B9=81=E0=B8=95=E0=B9=88=E0=B8=87=E0=B8=95?= =?UTF-8?q?=E0=B8=B1=E0=B9=89=E0=B8=87=E0=B8=A5=E0=B8=B9=E0=B8=81=E0=B8=88?= =?UTF-8?q?=E0=B9=89=E0=B8=B2=E0=B8=87=E0=B8=8A=E0=B8=B1=E0=B9=88=E0=B8=A7?= =?UTF-8?q?=E0=B8=84=E0=B8=A3=E0=B8=B2=E0=B8=A7=E0=B9=80=E0=B8=9B=E0=B9=87?= =?UTF-8?q?=E0=B8=99=E0=B8=A5=E0=B8=B9=E0=B8=81=E0=B8=88=E0=B9=89=E0=B8=B2?= =?UTF-8?q?=E0=B8=87=E0=B8=9B=E0=B8=A3=E0=B8=B0=E0=B8=88=E0=B8=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commands/CommandRepository.cs | 61 +++++++++++ .../Controllers/OrderController.cs | 100 ++++++++++++++++++ BMA.EHR.Command.Service/SeedCommand.xlsx | Bin 11731 -> 11813 bytes .../Models/Commands/Core/Command.cs | 2 +- 4 files changed, 162 insertions(+), 1 deletion(-) diff --git a/BMA.EHR.Application/Repositories/Commands/CommandRepository.cs b/BMA.EHR.Application/Repositories/Commands/CommandRepository.cs index e9e184cc..5af3a4ce 100644 --- a/BMA.EHR.Application/Repositories/Commands/CommandRepository.cs +++ b/BMA.EHR.Application/Repositories/Commands/CommandRepository.cs @@ -6,6 +6,7 @@ using BMA.EHR.Domain.Models.Commands.Core; using BMA.EHR.Domain.Models.HR; using BMA.EHR.Domain.Models.MetaData; using BMA.EHR.Domain.Models.Notifications; +using BMA.EHR.Domain.Models.OrganizationEmployee; using BMA.EHR.Domain.Models.Organizations; using BMA.EHR.Domain.Models.Placement; using BMA.EHR.Domain.Models.Retirement; @@ -136,6 +137,9 @@ namespace BMA.EHR.Application.Repositories.Commands case "C-PM-20": result = await GetReceiver20Async(command); break; + case "C-PM-21": + result = await GetReceiver21Async(command); + break; default: throw new Exception(GlobalMessages.MethodForCommandTypeNotImplement); } @@ -1377,6 +1381,63 @@ namespace BMA.EHR.Application.Repositories.Commands } } + /// + /// C-PM-21 - คำสั่งแต่งตั้งลูกจ้างชั่วคราวเป็นลูกจ้างประจำ + /// + /// object ของรายการคำสั่ง + /// + private async Task> GetReceiver21Async(Command command) + { + try + { + var result = new List(); + // TODO : ต้องมา list คนตามประเภทอีกครั้งนึง + + // 1. หารายชื่อที่ถูกเลือกไปแล้ว ในประเภทเดียวกัน + var otherCommandReceivers = await _dbContext.Set() + .Include(x => x.Command) + .ThenInclude(x => x.CommandType) + .Where(x => x.Command.CommandType.CommandCode.Trim().ToUpper() == "C-PM-21") + .Where(x => x.Command.Id != command.Id) + .Select(x => x.CitizenId) + .ToListAsync(); + + // 2. Query + var appointPeople = await _dbContext.Set() + .Include(x => x.Profile) + .ThenInclude(x => x.Prefix) + //.Where(x => x.OrganizationPosition!.Organization!.Id == command.OwnerGovId) + .Where(x => !otherCommandReceivers.Contains(x.Profile!.CitizenId!)) + .Where(x => x.Status.Trim().ToUpper() == "REPORT") + .OrderBy(x => x.Profile!.CitizenId) + .ToListAsync(); + + // 3. Create new Record + var seq = 1; + foreach (var item in appointPeople) + { + var receiver = new CommandReceiver + { + Sequence = seq, + CitizenId = item.Profile!.CitizenId!, + Prefix = item.Profile!.Prefix!.Name, + FirstName = item.Profile!.FirstName!, + LastName = item.Profile!.LastName!, + RefPlacementProfileId = item.Id + }; + seq++; + + result.Add(receiver); + } + + return result; + } + catch + { + throw; + } + } + #endregion #region " Execute and Deploy " diff --git a/BMA.EHR.Command.Service/Controllers/OrderController.cs b/BMA.EHR.Command.Service/Controllers/OrderController.cs index 42b86e83..6de87780 100644 --- a/BMA.EHR.Command.Service/Controllers/OrderController.cs +++ b/BMA.EHR.Command.Service/Controllers/OrderController.cs @@ -2436,6 +2436,106 @@ namespace BMA.EHR.Command.Service.Controllers #endregion + #region " C-PM-21 " + + /// + /// PM7-22 : สร้างข้อมูลรายละเอียดการออกคำสั่ง C-PM-21 + /// + /// + /// เมื่อทำการอ่านข้อมูลจาก Relational Database สำเร็จ + /// ไม่ได้ Login เข้าระบบ + /// เมื่อเกิดข้อผิดพลาดในการทำงาน + [HttpPost("c-pm-21/detail")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> PostType21Async([FromBody] CreateCommandGroup7Request req) + { + try + { + var commandType = await _commandTypeRepository.GetByIdAsync(req.orderTypeValue); + + var inserted = new Domain.Models.Commands.Core.Command + { + CommandNo = req.orderNo, + CommandYear = req.orderYear.ToString(), + CommandSubject = req.orderTitle, + CommandTypeId = req.orderTypeValue, + IssuerOrganizationId = req.orderBy, + IssuerOrganizationName = req.orderByOrganizationName, + AuthorizedUserFullName = req.signatoryBy, + AuthorizedPosition = req.signatoryPosition, + + CommandAffectDate = req.orderDate, + OwnerGovId = OcId, + + PlacementCommandIssuer = req.placementCommandIssuer, + PlacementCommandNo = req.placementCommandNo, + PlacementCommandDate = req.placementCommandDate, + + }; + + var result = await _repository.AddAsync(inserted); + + return Success(result); + } + catch + { + throw; + } + } + + /// + /// PM7-23 : แก้ไขข้อมูลรายละเอียดการออกคำสั่ง C-PM-21 + /// + /// Record Id ของคำสั่ง + /// + /// เมื่อทำการอ่านข้อมูลจาก Relational Database สำเร็จ + /// ไม่ได้ Login เข้าระบบ + /// เมื่อเกิดข้อผิดพลาดในการทำงาน + [HttpPut("c-pm-21/detail/{orderId}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> PutType21Async(Guid orderId, [FromBody] CreateCommandGroup7Request req) + { + try + { + var order = await _repository.GetByIdAsync(orderId); + if (order == null) + throw new Exception(GlobalMessages.CommandNotFound); + + + var commandType = await _commandTypeRepository.GetByIdAsync(req.orderTypeValue); + var status = await _commandStatusRepository.GetByIdAsync(order.CommandStatusId); + + order.CommandNo = req.orderNo; + order.CommandYear = req.orderYear.ToString(); + order.CommandSubject = req.orderTitle; + order.CommandType = commandType!; + order.IssuerOrganizationId = req.orderBy; + order.IssuerOrganizationName = req.orderByOrganizationName; + order.AuthorizedUserFullName = req.signatoryBy; + order.AuthorizedPosition = req.signatoryPosition; + order.CommandStatus = status!; + order.CommandAffectDate = req.orderDate; + + order.PlacementCommandIssuer = req.placementCommandIssuer; + order.PlacementCommandNo = req.placementCommandNo; + order.PlacementCommandDate = req.placementCommandDate; + + var result = await _repository.UpdateAsync(order); + + return Success(result); + } + catch + { + throw; + } + } + + #endregion + #endregion /// diff --git a/BMA.EHR.Command.Service/SeedCommand.xlsx b/BMA.EHR.Command.Service/SeedCommand.xlsx index c06d66844aa883bde2dc433c8c403832e7c3dcc6..ac512431fd0d17b00c139d9da53d95748a869614 100644 GIT binary patch delta 4004 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 K21zRb0000!{FD#? delta 3955 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 z000000000000000bCY{5CmUMdY2;D?004Ue000pH000000000000000q?5fZJ^?M0 N{4FB}_bLDY0001oa(Ms% diff --git a/BMA.EHR.Domain/Models/Commands/Core/Command.cs b/BMA.EHR.Domain/Models/Commands/Core/Command.cs index 343d1cca..c2758883 100644 --- a/BMA.EHR.Domain/Models/Commands/Core/Command.cs +++ b/BMA.EHR.Domain/Models/Commands/Core/Command.cs @@ -103,7 +103,7 @@ namespace BMA.EHR.Domain.Models.Commands.Core #endregion - #region " C-PM-10,C-PM-11,C-PM-12 " + #region " C-PM-10,C-PM-11,C-PM-12,C-PM-21 " [Comment("หน่วยงานที่ออกคำสั่งบรรจุ")] public string? PlacementCommandIssuer { get; set; }