From 0ef6f0421405fd295c7332092b7be1cb43e6f7a5 Mon Sep 17 00:00:00 2001 From: Denovo Date: Thu, 30 Nov 2023 22:33:52 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20ems=20to=20er=20request=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20API=20-=20[?= =?UTF-8?q?=EC=9D=B4=EC=86=A1=EC=A4=91,=20=EC=9D=B4=EC=86=A1=EC=99=84?= =?UTF-8?q?=EB=A3=8C=EC=B2=98=EB=A6=AC]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- prisma/schema.prisma | 3 +- .../er/er.requestPatient.controller.ts | 10 +++- .../request/req.emsToEr.controller.ts | 40 +++++++++++++++ src/modules/er/patient.module.ts | 3 +- src/providers/er/er.requestPatient.service.ts | 39 ++++++++++----- .../interface/req/req.emsToEr.interface.ts | 6 +++ src/providers/req/req.emsToEr.service.ts | 49 +++++++++++++++++++ src/types/req.request.dto.ts | 4 ++ 8 files changed, 139 insertions(+), 15 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index fd42f8d..12e26a2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -934,8 +934,9 @@ enum RequestStatus { ACCEPTED /// 수락됨 REJECTED /// 거절됨 CANCELED /// 취소됨 + TRANSFER ///이송중 + TRANSFER_COMPLETED /// 이송완료 COMPLETED /// 완료됨 - @@schema("request") } diff --git a/src/controllers/er/er.requestPatient.controller.ts b/src/controllers/er/er.requestPatient.controller.ts index e8e3f75..440b83d 100644 --- a/src/controllers/er/er.requestPatient.controller.ts +++ b/src/controllers/er/er.requestPatient.controller.ts @@ -6,11 +6,15 @@ import { Controller, HttpStatus, UseGuards } from '@nestjs/common'; import { ErJwtAccessAuthGuard } from '@src/auth/guard/er.jwt.access.guard'; import { ErAuth } from '@src/auth/interface'; import { ErRequestPatientService } from '@src/providers/er/er.requestPatient.service'; +import { ReqEmsToErProducer } from '@src/providers/req/req.emsToEr.producer'; import { ErRequestPatientRequest, ErRequestPatientResponse, TryCatch } from '@src/types'; @Controller('/er/request-patients') export class ErRequestPatientController { - constructor(private readonly erRequestPatientService: ErRequestPatientService) {} + constructor( + private readonly erRequestPatientService: ErRequestPatientService, + private readonly reqEmsToErProducer: ReqEmsToErProducer, + ) {} /** * 요청 받은 환자 상세정보 조회 API @@ -101,7 +105,9 @@ export class ErRequestPatientController { nurse_id, }); if (isError(result)) return throwError(result); + const { ems_to_er_request, ...patient } = result; + await this.reqEmsToErProducer.sendEmsToErUpdate({ patient, updated_list: ems_to_er_request }); - return createResponse(result); + return createResponse('SUCCESS'); } } diff --git a/src/controllers/request/req.emsToEr.controller.ts b/src/controllers/request/req.emsToEr.controller.ts index 488448d..c0a9d02 100644 --- a/src/controllers/request/req.emsToEr.controller.ts +++ b/src/controllers/request/req.emsToEr.controller.ts @@ -252,6 +252,46 @@ export class ReqEmsToErController { return createResponse(undefined); } + @TypedRoute.Put('/:patient_id') + @UseGuards(EmsJwtAccessAuthGuard) + async cancelEmsToErRequest() {} + + /** + * ems to er 요청 상태 변경 API - EMS + * + * + * 본 API는 EMS 시스템에서만 호출 가능합니다. + * EMS에서 요청 상태를 변경하는 API 입니다. + * + * 변경 가능 상태 + * - ACCEPTED -> TRANSFER // 수락 후 환자 이송 + * - TRANSFER -> TRANSFER_COMPLETED // 환자 이송 완료 + * + * ## body + * - request_status: "TRANSFER" | "TRANSFER_COMPLETED"; + * + */ + @TypedRoute.Patch('/:patient_id') + @TypedException(403, 'AUTH_ERROR.FORBIDDEN') + @TypedException(404.1, 'REQUEST_NOT_FOUND') + @UseGuards(EmsJwtAccessAuthGuard) + async updateEmsToErRequest( + @TypedParam('patient_id') patient_id: string, + @TypedBody() body: ReqEmsToErRequest.UpdateEmsToErRequestDto, + @CurrentUser() user: EmsAuth.AccessTokenSignPayload, + ): Promise> { + const { request_status } = body; + const result = await this.reqEmsToErService.updateEmsToErRequest({ patient_id, request_status, user }); + + if (isError(result)) { + return throwError(result); + } + + const { ems_to_er_request, ...patient } = result; + await this.reqEmsToErProducer.sendEmsToErUpdate({ patient, updated_list: ems_to_er_request }); + return createResponse('SUCCESS'); + } + //1분마다 실행 @Cron('0 * * * * *') async batchNewEmsToErRequest() { diff --git a/src/modules/er/patient.module.ts b/src/modules/er/patient.module.ts index 6d7a6f9..93f4dc2 100644 --- a/src/modules/er/patient.module.ts +++ b/src/modules/er/patient.module.ts @@ -3,9 +3,10 @@ import { ErPatientController } from '@src/controllers/er/er.patient.controller'; import { ErRequestPatientController } from '@src/controllers/er/er.requestPatient.controller'; import { ErPatientService } from '@src/providers/er/er.patient.service'; import { ErRequestPatientService } from '@src/providers/er/er.requestPatient.service'; +import { ReqEmsToErProducer } from '@src/providers/req/req.emsToEr.producer'; @Module({ controllers: [ErPatientController, ErRequestPatientController], - providers: [ErPatientService, ErRequestPatientService], + providers: [ErPatientService, ErRequestPatientService, ReqEmsToErProducer], }) export class ErPatientModule {} diff --git a/src/providers/er/er.requestPatient.service.ts b/src/providers/er/er.requestPatient.service.ts index 4bba1d8..af9ac23 100644 --- a/src/providers/er/er.requestPatient.service.ts +++ b/src/providers/er/er.requestPatient.service.ts @@ -68,7 +68,7 @@ export class ErRequestPatientService { ems_to_er_request: { some: { emergency_center_id, - request_status: 'ACCEPTED', + request_status: 'TRANSFER_COMPLETED', }, }, }, @@ -156,26 +156,43 @@ export class ErRequestPatientService { patient_status: 'COMPLETED', }, }); - const updateRequest = this.prismaService.req_EmsToErRequest.update({ + const updateRequestPatient = this.prismaService.req_Patient.update({ where: { - patient_id_emergency_center_id: { - patient_id, - emergency_center_id, - }, + patient_id, }, data: { - request_status: 'COMPLETED', + ems_to_er_request: { + update: { + where: { + patient_id_emergency_center_id: { + patient_id, + emergency_center_id, + }, + }, + data: { + request_status: 'COMPLETED', + }, + }, + }, + }, + include: { + ems_to_er_request: { + where: { + emergency_center_id, + patient_id, + }, + }, }, }); - await this.prismaService.$transaction([ + const [reqUpdatedResult] = await this.prismaService.$transaction([ + updateRequestPatient, createErPatient, createBadLog, - updateEmergencyRoomBed, updateEmsPatient, - updateRequest, + updateEmergencyRoomBed, ]); - return 'SUCCESS'; + return reqUpdatedResult; } async getEmsPatientDetail(patient_id: string) { diff --git a/src/providers/interface/req/req.emsToEr.interface.ts b/src/providers/interface/req/req.emsToEr.interface.ts index 8d00937..d8649e9 100644 --- a/src/providers/interface/req/req.emsToEr.interface.ts +++ b/src/providers/interface/req/req.emsToEr.interface.ts @@ -42,6 +42,12 @@ export namespace ReqEmsToEr { complete_req_list: req_EmsToErRequest[]; response: req_EmsToErRequest; }; + + export type UpdateEmsToErRequestArg = { + user: EmsAuth.AccessTokenSignPayload; + patient_id: string; + request_status: 'TRANSFER' | 'TRANSFER_COMPLETED'; + }; } export namespace ReqEmsToErMessage { diff --git a/src/providers/req/req.emsToEr.service.ts b/src/providers/req/req.emsToEr.service.ts index 7e65923..35e0674 100644 --- a/src/providers/req/req.emsToEr.service.ts +++ b/src/providers/req/req.emsToEr.service.ts @@ -513,4 +513,53 @@ export class ReqEmsToErService { return result; } + + async updateEmsToErRequest({ user, patient_id, request_status }: ReqEmsToEr.UpdateEmsToErRequestArg) { + const { employee_id } = user; + + const reqeustStatusWhere: RequestStatus = request_status === 'TRANSFER' ? 'ACCEPTED' : 'TRANSFER'; + const reqEmsToErRequest = await this.prismaService.req_EmsToErRequest.findFirst({ + where: { + patient_id, + patient: { + ems_employee_id: employee_id, + }, + request_status: reqeustStatusWhere, + }, + }); + + if (!reqEmsToErRequest) { + return typia.random(); + } + + const patient = await this.prismaService.req_Patient.update({ + where: { + patient_id, + }, + data: { + ems_to_er_request: { + update: { + where: { + patient_id_emergency_center_id: { + patient_id, + emergency_center_id: reqEmsToErRequest.emergency_center_id, + }, + }, + data: { + request_status, + }, + }, + }, + }, + include: { + ems_to_er_request: { + where: { + emergency_center_id: reqEmsToErRequest.emergency_center_id, + }, + }, + }, + }); + + return patient; + } } diff --git a/src/types/req.request.dto.ts b/src/types/req.request.dto.ts index fa7ac54..e576206 100644 --- a/src/types/req.request.dto.ts +++ b/src/types/req.request.dto.ts @@ -22,4 +22,8 @@ export namespace ReqEmsToErRequest { export interface CreateEmsToErRequestDto { departments: string[]; } + + export interface UpdateEmsToErRequestDto { + request_status: 'TRANSFER' | 'TRANSFER_COMPLETED'; + } }