diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index 1ba5572..042e1e3 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -13,7 +13,7 @@ import { M_Charts } from './m-charts/entity/m-charts.entity'; import { MComplaintsModule } from './m-complaints/m-complaints.module'; import { M_Complaints } from './m-complaints/entity/m-complaints.entity'; import { MPrescriptionsModule } from './m-prescriptions/m-prescriptions.module'; -import { M_Prescriptions } from './m-prescriptions/entity/m-prescriotions.entity'; +import { M_Prescriptions } from './m-prescriptions/entity/m-prescriptions.entity'; import { HistoriesModule } from './patients/histories/histories.module'; import { Histories } from './patients/histories/entity/histories.entity'; import { Users } from './users/entity/users.entity'; @@ -30,7 +30,7 @@ import { KmComplaintsModule } from './km-complaints/km-complaints.module'; import { KmPrescriptionsModule } from './km-prescriptions/km-prescriptions.module'; import { KmMedicinesModule } from './km-medicines/km-medicines.module'; import { KM_Complaints } from './km-complaints/entity/km-complaints.entity'; -import { KM_Prescriptions } from './km-prescriptions/entity/km-prescriotions.entity'; +import { KM_Prescriptions } from './km-prescriptions/entity/km-prescriptions.entity'; import { KM_Medicines } from './km-medicines/entity/km-medicines.entity'; import { ENV_DB_DATABASE_KEY, diff --git a/backend/src/km-charts/entity/km-charts.entity.ts b/backend/src/km-charts/entity/km-charts.entity.ts index 5d9ac33..d87d96c 100644 --- a/backend/src/km-charts/entity/km-charts.entity.ts +++ b/backend/src/km-charts/entity/km-charts.entity.ts @@ -1,6 +1,6 @@ import { BaseModel } from 'src/common/entity/base.entity'; import { KM_Complaints } from 'src/km-complaints/entity/km-complaints.entity'; -import { KM_Prescriptions } from 'src/km-prescriptions/entity/km-prescriotions.entity'; +import { KM_Prescriptions } from 'src/km-prescriptions/entity/km-prescriptions.entity'; import { Patients } from 'src/patients/entity/patients.entity'; import { Column, Entity, ManyToOne, OneToMany } from 'typeorm'; diff --git a/backend/src/km-charts/km-charts.controller.ts b/backend/src/km-charts/km-charts.controller.ts index a9e992f..39f990d 100644 --- a/backend/src/km-charts/km-charts.controller.ts +++ b/backend/src/km-charts/km-charts.controller.ts @@ -1,12 +1,28 @@ -import { Body, Controller, Get, HttpStatus, Param, Post } from '@nestjs/common'; +import { + Body, + Controller, + Get, + HttpStatus, + NotFoundException, + Param, + ParseIntPipe, + Post, +} from '@nestjs/common'; import { KmChartsService } from './km-charts.service'; import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { CreatePrediagnosisDto } from './dto/create-prediagnosis.dto'; +import { KmPrescriptionsService } from 'src/km-prescriptions/km-prescriptions.service'; +import { CreateKMPrescriptionDto } from 'src/km-prescriptions/dto/create-km-prescription.dto'; +import { KmMedicinesService } from 'src/km-medicines/km-medicines.service'; @ApiTags('한의과') @Controller('km/charts') export class KmChartsController { - constructor(private readonly chartsService: KmChartsService) {} + constructor( + private readonly chartsService: KmChartsService, + private readonly prescriptionsService: KmPrescriptionsService, + private readonly medicinesService: KmMedicinesService, + ) {} @Post('/:chartId/prediagnosis') @ApiOperation({ @@ -89,4 +105,38 @@ export class KmChartsController { getPastChart(@Param('chartId') chartId: number) { return this.chartsService.getPastChart(chartId); } + + @Post(':chartId/prescriptions') + @ApiOperation({ + summary: '처방 생성', + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + '존재하지 않는 약품입니다. medicineId에 해당하는 약품이 없는 경우', + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + }) + async postPrescription( + @Param('chartId', ParseIntPipe) chartId: number, + @Body() createPrescriptionDto: CreateKMPrescriptionDto, + ) { + const chartExists = await this.chartsService.checkChartExistsById(chartId); + if (!chartExists) { + throw new NotFoundException(); + } + + const medicineExists = await this.medicinesService.checkMedicineExistsById( + createPrescriptionDto.medicineId, + ); + if (!medicineExists) { + throw new NotFoundException('존재하지 않는 약품입니다.'); + } + + return await this.prescriptionsService.createPrescription( + chartId, + createPrescriptionDto, + ); + } } diff --git a/backend/src/km-charts/km-charts.module.ts b/backend/src/km-charts/km-charts.module.ts index 59cdeff..f06834e 100644 --- a/backend/src/km-charts/km-charts.module.ts +++ b/backend/src/km-charts/km-charts.module.ts @@ -7,12 +7,30 @@ import { Histories } from 'src/patients/histories/entity/histories.entity'; import { KM_Complaints } from 'src/km-complaints/entity/km-complaints.entity'; import { Orders } from 'src/orders/entity/orders.entity'; import { MComplaintsService } from 'src/m-complaints/m-complaints.service'; +import { KmPrescriptionsService } from 'src/km-prescriptions/km-prescriptions.service'; +import { KmMedicinesService } from 'src/km-medicines/km-medicines.service'; +import { KM_Prescriptions } from 'src/km-prescriptions/entity/km-prescriptions.entity'; +import { KM_Medicines } from 'src/km-medicines/entity/km-medicines.entity'; +import { CommonService } from 'src/common/common.service'; @Module({ imports: [ - TypeOrmModule.forFeature([KM_Charts, Histories, KM_Complaints, Orders]), + TypeOrmModule.forFeature([ + KM_Charts, + Histories, + KM_Complaints, + Orders, + KM_Prescriptions, + KM_Medicines, + ]), ], controllers: [KmChartsController], - providers: [KmChartsService, MComplaintsService], + providers: [ + KmChartsService, + MComplaintsService, + KmPrescriptionsService, + KmMedicinesService, + CommonService, + ], }) export class KmChartsModule {} diff --git a/backend/src/km-charts/km-charts.service.ts b/backend/src/km-charts/km-charts.service.ts index 7e6e33f..7ef343d 100644 --- a/backend/src/km-charts/km-charts.service.ts +++ b/backend/src/km-charts/km-charts.service.ts @@ -142,4 +142,10 @@ export class KmChartsService { where: { id: chartId }, }); } + + async checkChartExistsById(id: number) { + return this.chartsRepository.exists({ + where: { id }, + }); + } } diff --git a/backend/src/km-medicines/entity/km-medicines.entity.ts b/backend/src/km-medicines/entity/km-medicines.entity.ts index ae3f6ea..3eb1cfc 100644 --- a/backend/src/km-medicines/entity/km-medicines.entity.ts +++ b/backend/src/km-medicines/entity/km-medicines.entity.ts @@ -1,5 +1,5 @@ import { BaseModel } from 'src/common/entity/base.entity'; -import { KM_Prescriptions } from 'src/km-prescriptions/entity/km-prescriotions.entity'; +import { KM_Prescriptions } from 'src/km-prescriptions/entity/km-prescriptions.entity'; import { Column, DeleteDateColumn, Entity, OneToMany } from 'typeorm'; @Entity() diff --git a/backend/src/km-medicines/km-medicines.service.ts b/backend/src/km-medicines/km-medicines.service.ts index 03b5761..fc113cd 100644 --- a/backend/src/km-medicines/km-medicines.service.ts +++ b/backend/src/km-medicines/km-medicines.service.ts @@ -173,4 +173,10 @@ export class KmMedicinesService { throw new BadRequestException(error); } } + + async checkMedicineExistsById(id: number) { + return this.medicinesRepository.exists({ + where: { id }, + }); + } } diff --git a/backend/src/km-prescriptions/dto/create-km-prescription.dto.ts b/backend/src/km-prescriptions/dto/create-km-prescription.dto.ts new file mode 100644 index 0000000..60d726a --- /dev/null +++ b/backend/src/km-prescriptions/dto/create-km-prescription.dto.ts @@ -0,0 +1,55 @@ +import { PickType } from '@nestjs/mapped-types'; +import { KM_Prescriptions } from '../entity/km-prescriptions.entity'; +import { IsInt, IsNumber, IsOptional, IsString } from 'class-validator'; +import { ApiProperty } from '@nestjs/swagger'; + +export class CreateKMPrescriptionDto extends PickType(KM_Prescriptions, [ + 'doses', + 'dosesCountByDay', + 'dosesDay', + 'dosesTime', + 'memo', +]) { + @ApiProperty({ + description: '1회 투약량', + example: 1, + }) + @IsNumber() + doses: number; + + @ApiProperty({ + description: '1일 복용횟수', + example: 'tid', + }) + @IsString() + dosesCountByDay: string; + + @ApiProperty({ + description: '복용 일수', + example: 5, + }) + @IsInt() + dosesDay: number; + + @ApiProperty({ + description: '복용 시간', + example: '식전', + }) + @IsString() + dosesTime: string; + + @ApiProperty({ + description: '메모', + example: '', + }) + @IsString() + @IsOptional() + memo: string; + + @ApiProperty({ + description: '약품 ID', + example: 1, + }) + @IsNumber() + medicineId: number; +} diff --git a/backend/src/km-prescriptions/entity/km-prescriotions.entity.ts b/backend/src/km-prescriptions/entity/km-prescriptions.entity.ts similarity index 93% rename from backend/src/km-prescriptions/entity/km-prescriotions.entity.ts rename to backend/src/km-prescriptions/entity/km-prescriptions.entity.ts index 9ca6f60..747ae04 100644 --- a/backend/src/km-prescriptions/entity/km-prescriotions.entity.ts +++ b/backend/src/km-prescriptions/entity/km-prescriptions.entity.ts @@ -33,9 +33,11 @@ export class KM_Prescriptions extends BaseModel { @IsInt() dosesDay: number; - @Column() - @IsInt() - dosesTime: number; + @Column('char', { + length: 10, + }) + @IsString() + dosesTime: string; @Column('float') @IsNumber() diff --git a/backend/src/km-prescriptions/km-prescriptions.module.ts b/backend/src/km-prescriptions/km-prescriptions.module.ts index aaf8c15..ba0da1a 100644 --- a/backend/src/km-prescriptions/km-prescriptions.module.ts +++ b/backend/src/km-prescriptions/km-prescriptions.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; import { KmPrescriptionsService } from './km-prescriptions.service'; import { KmPrescriptionsController } from './km-prescriptions.controller'; -import { KM_Prescriptions } from './entity/km-prescriotions.entity'; +import { KM_Prescriptions } from './entity/km-prescriptions.entity'; import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ diff --git a/backend/src/km-prescriptions/km-prescriptions.service.ts b/backend/src/km-prescriptions/km-prescriptions.service.ts index 634247e..88a1989 100644 --- a/backend/src/km-prescriptions/km-prescriptions.service.ts +++ b/backend/src/km-prescriptions/km-prescriptions.service.ts @@ -1,4 +1,31 @@ import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { KM_Prescriptions } from './entity/km-prescriptions.entity'; +import { Repository } from 'typeorm'; +import { CreateKMPrescriptionDto } from './dto/create-km-prescription.dto'; +import { convertDosesCountByDay } from 'src/common/util/convert.util'; @Injectable() -export class KmPrescriptionsService {} +export class KmPrescriptionsService { + constructor( + @InjectRepository(KM_Prescriptions) + private readonly prescriptionsRepository: Repository, + ) {} + + async createPrescription( + chartId: number, + prescriptionDto: CreateKMPrescriptionDto, + ) { + const { medicineId, ...restPrescriptionDto } = prescriptionDto; + + return await this.prescriptionsRepository.save({ + ...restPrescriptionDto, + dosesTotal: + restPrescriptionDto.doses * + convertDosesCountByDay(restPrescriptionDto.dosesCountByDay) * + restPrescriptionDto.dosesDay, + chart: { id: chartId }, + medicine: { id: medicineId }, + }); + } +} diff --git a/backend/src/m-charts/entity/m-charts.entity.ts b/backend/src/m-charts/entity/m-charts.entity.ts index bb84cc2..94f943c 100644 --- a/backend/src/m-charts/entity/m-charts.entity.ts +++ b/backend/src/m-charts/entity/m-charts.entity.ts @@ -1,6 +1,6 @@ import { BaseModel } from 'src/common/entity/base.entity'; import { M_Complaints } from 'src/m-complaints/entity/m-complaints.entity'; -import { M_Prescriptions } from 'src/m-prescriptions/entity/m-prescriotions.entity'; +import { M_Prescriptions } from 'src/m-prescriptions/entity/m-prescriptions.entity'; import { Patients } from 'src/patients/entity/patients.entity'; import { Column, Entity, ManyToOne, OneToMany } from 'typeorm'; diff --git a/backend/src/m-charts/m-charts.controller.ts b/backend/src/m-charts/m-charts.controller.ts index 3586d13..2518cdb 100644 --- a/backend/src/m-charts/m-charts.controller.ts +++ b/backend/src/m-charts/m-charts.controller.ts @@ -8,6 +8,7 @@ import { ParseIntPipe, Patch, BadRequestException, + NotFoundException, } from '@nestjs/common'; import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { MChartsService } from './m-charts.service'; @@ -24,7 +25,7 @@ export class MChartsController { constructor( private readonly chartsService: MChartsService, private readonly prescriptionsService: MPrescriptionsService, - private readonly medicineService: MMedicinesService, + private readonly medicinesService: MMedicinesService, ) {} @Post('/:chartId/prediagnosis') @@ -150,7 +151,7 @@ export class MChartsController { const prescriptions = await Promise.all([ ...createMDiagnosisDto.prescriptions.map((prescription) => { - return this.prescriptionsService.createMPrescription( + return this.prescriptionsService.createPrescription( chartId, prescription, ); @@ -223,7 +224,7 @@ export class MChartsController { const prescriptions = await this.prescriptionsService.getPrescriptions(chartId); prescriptions.map(async (prescription) => { - await this.medicineService.updateMedicineTotalAmount( + await this.medicinesService.updateMedicineTotalAmount( prescription.medicine.id, prescription, ); @@ -251,13 +252,25 @@ export class MChartsController { @ApiResponse({ status: HttpStatus.NOT_FOUND, }) - async postMPrescription( + async postPrescription( @Param('chartId', ParseIntPipe) chartId: number, - @Body() createMPrescriptionDto: CreateMPrescriptionDto, + @Body() createPrescriptionDto: CreateMPrescriptionDto, ) { - return await this.prescriptionsService.createMPrescription( + const chartExists = await this.chartsService.checkChartExistsById(chartId); + if (!chartExists) { + throw new NotFoundException(); + } + + const medicineExists = await this.medicinesService.checkMedicineExistsById( + createPrescriptionDto.medicineId, + ); + if (!medicineExists) { + throw new NotFoundException('존재하지 않는 약품입니다.'); + } + + return await this.prescriptionsService.createPrescription( chartId, - createMPrescriptionDto, + createPrescriptionDto, ); } } diff --git a/backend/src/m-charts/m-charts.service.ts b/backend/src/m-charts/m-charts.service.ts index 2683cde..935e999 100644 --- a/backend/src/m-charts/m-charts.service.ts +++ b/backend/src/m-charts/m-charts.service.ts @@ -256,4 +256,10 @@ export class MChartsService { relations: { prescriptions: { medicine: true } }, }); } + + async checkChartExistsById(id: number) { + return this.chartsRepository.exists({ + where: { id }, + }); + } } diff --git a/backend/src/m-medicines/entity/m-medicines.entity.ts b/backend/src/m-medicines/entity/m-medicines.entity.ts index 709a8e9..07067c8 100644 --- a/backend/src/m-medicines/entity/m-medicines.entity.ts +++ b/backend/src/m-medicines/entity/m-medicines.entity.ts @@ -1,6 +1,6 @@ import { BaseModel } from 'src/common/entity/base.entity'; import { M_Medicine_Categories } from 'src/m-medicine-categories/entity/m_medicine_categories.entity'; -import { M_Prescriptions } from 'src/m-prescriptions/entity/m-prescriotions.entity'; +import { M_Prescriptions } from 'src/m-prescriptions/entity/m-prescriptions.entity'; import { Column, DeleteDateColumn, diff --git a/backend/src/m-medicines/m-medicines.service.ts b/backend/src/m-medicines/m-medicines.service.ts index 6179dbf..8e6ba6f 100644 --- a/backend/src/m-medicines/m-medicines.service.ts +++ b/backend/src/m-medicines/m-medicines.service.ts @@ -18,7 +18,7 @@ import { UpdateMMedicineDto } from './dto/update-m-medicine.dto'; import { PaginateMMedicineDto } from './dto/paginate-m-medicine.dto'; import { CommonService } from 'src/common/common.service'; import { convertDosesCountByDay } from 'src/common/util/convert.util'; -import { M_Prescriptions } from 'src/m-prescriptions/entity/m-prescriotions.entity'; +import { M_Prescriptions } from 'src/m-prescriptions/entity/m-prescriptions.entity'; @Injectable() export class MMedicinesService { @@ -211,6 +211,12 @@ export class MMedicinesService { } } + async checkMedicineExistsById(id: number) { + return this.medicinesRepository.exists({ + where: { id }, + }); + } + async checkDeletedMedicineByCategoryId(categoryId: number) { const [, deletedMedicineCount] = await this.medicinesRepository.findAndCount({ diff --git a/backend/src/m-prescriptions/dto/create-m-prescription.dto.ts b/backend/src/m-prescriptions/dto/create-m-prescription.dto.ts index 3ec2c4a..493c21b 100644 --- a/backend/src/m-prescriptions/dto/create-m-prescription.dto.ts +++ b/backend/src/m-prescriptions/dto/create-m-prescription.dto.ts @@ -1,5 +1,5 @@ import { PickType } from '@nestjs/mapped-types'; -import { M_Prescriptions } from '../entity/m-prescriotions.entity'; +import { M_Prescriptions } from '../entity/m-prescriptions.entity'; import { IsInt, IsNumber, IsOptional, IsString } from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; @@ -7,7 +7,6 @@ export class CreateMPrescriptionDto extends PickType(M_Prescriptions, [ 'doses', 'dosesCountByDay', 'dosesDay', - 'dosesTotal', 'bundle', 'memo', ]) { diff --git a/backend/src/m-prescriptions/entity/m-prescriotions.entity.ts b/backend/src/m-prescriptions/entity/m-prescriptions.entity.ts similarity index 100% rename from backend/src/m-prescriptions/entity/m-prescriotions.entity.ts rename to backend/src/m-prescriptions/entity/m-prescriptions.entity.ts diff --git a/backend/src/m-prescriptions/m-prescriptions.module.ts b/backend/src/m-prescriptions/m-prescriptions.module.ts index ef5bc58..6f20f59 100644 --- a/backend/src/m-prescriptions/m-prescriptions.module.ts +++ b/backend/src/m-prescriptions/m-prescriptions.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; import { MPrescriptionsService } from './m-prescriptions.service'; import { MPrescriptionsController } from './m-prescriptions.controller'; -import { M_Prescriptions } from './entity/m-prescriotions.entity'; +import { M_Prescriptions } from './entity/m-prescriptions.entity'; import { TypeOrmModule } from '@nestjs/typeorm'; import { M_Charts } from 'src/m-charts/entity/m-charts.entity'; import { M_Medicines } from 'src/m-medicines/entity/m-medicines.entity'; diff --git a/backend/src/m-prescriptions/m-prescriptions.service.ts b/backend/src/m-prescriptions/m-prescriptions.service.ts index 9736945..7f92efd 100644 --- a/backend/src/m-prescriptions/m-prescriptions.service.ts +++ b/backend/src/m-prescriptions/m-prescriptions.service.ts @@ -4,7 +4,7 @@ import { NotFoundException, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { M_Prescriptions } from './entity/m-prescriotions.entity'; +import { M_Prescriptions } from './entity/m-prescriptions.entity'; import { Repository } from 'typeorm'; import { CreateMPrescriptionDto } from './dto/create-m-prescription.dto'; import { M_Charts } from 'src/m-charts/entity/m-charts.entity'; @@ -40,7 +40,7 @@ export class MPrescriptionsService { }); } - async createMPrescription( + async createPrescription( chartId: number, prescriptionDto: CreateMPrescriptionDto, ) {