170 lines
4.1 KiB
TypeScript
170 lines
4.1 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
Delete,
|
|
Get,
|
|
Param,
|
|
ParseIntPipe,
|
|
Patch,
|
|
Post,
|
|
Query,
|
|
UseGuards,
|
|
} from '@nestjs/common';
|
|
import {
|
|
ApiBearerAuth,
|
|
ApiOperation,
|
|
ApiParam,
|
|
ApiQuery,
|
|
ApiTags,
|
|
} from '@nestjs/swagger';
|
|
import type { ActorContext } from '../../common/actor-context.js';
|
|
import { CurrentActor } from '../../auth/current-actor.decorator.js';
|
|
import { AccessTokenGuard } from '../../auth/access-token.guard.js';
|
|
import { RolesGuard } from '../../auth/roles.guard.js';
|
|
import { Roles } from '../../auth/roles.decorator.js';
|
|
import { Role } from '../../generated/prisma/enums.js';
|
|
import { BPatientsService } from './b-patients.service.js';
|
|
import { CreatePatientDto } from '../dto/create-patient.dto.js';
|
|
import { UpdatePatientDto } from '../dto/update-patient.dto.js';
|
|
|
|
/**
|
|
* B 端患者控制器:院内可见性隔离查询。
|
|
*/
|
|
@ApiTags('患者管理(B端)')
|
|
@ApiBearerAuth('bearer')
|
|
@Controller('b/patients')
|
|
@UseGuards(AccessTokenGuard, RolesGuard)
|
|
export class BPatientsController {
|
|
constructor(private readonly patientsService: BPatientsService) {}
|
|
|
|
/**
|
|
* 查询当前角色可选择的归属人员列表(医生/主任/组长)。
|
|
*/
|
|
@Get('doctors')
|
|
@Roles(
|
|
Role.SYSTEM_ADMIN,
|
|
Role.HOSPITAL_ADMIN,
|
|
Role.DIRECTOR,
|
|
Role.LEADER,
|
|
Role.DOCTOR,
|
|
)
|
|
@ApiOperation({ summary: '查询当前角色可见归属人员列表' })
|
|
@ApiQuery({
|
|
name: 'hospitalId',
|
|
required: false,
|
|
description: '系统管理员可显式指定医院',
|
|
})
|
|
findVisibleDoctors(
|
|
@CurrentActor() actor: ActorContext,
|
|
@Query('hospitalId') hospitalId?: string,
|
|
) {
|
|
const requestedHospitalId =
|
|
hospitalId == null || hospitalId === '' ? undefined : Number(hospitalId);
|
|
return this.patientsService.findVisibleDoctors(actor, requestedHospitalId);
|
|
}
|
|
|
|
/**
|
|
* 按角色返回可见患者列表。
|
|
*/
|
|
@Get()
|
|
@Roles(
|
|
Role.SYSTEM_ADMIN,
|
|
Role.HOSPITAL_ADMIN,
|
|
Role.DIRECTOR,
|
|
Role.LEADER,
|
|
Role.DOCTOR,
|
|
)
|
|
@ApiOperation({ summary: '按角色查询可见患者列表' })
|
|
@ApiQuery({
|
|
name: 'hospitalId',
|
|
required: false,
|
|
description: '系统管理员可显式指定医院',
|
|
})
|
|
findVisiblePatients(
|
|
@CurrentActor() actor: ActorContext,
|
|
@Query('hospitalId') hospitalId?: string,
|
|
) {
|
|
const requestedHospitalId =
|
|
hospitalId == null || hospitalId === '' ? undefined : Number(hospitalId);
|
|
|
|
return this.patientsService.findVisiblePatients(actor, requestedHospitalId);
|
|
}
|
|
|
|
/**
|
|
* 创建患者。
|
|
*/
|
|
@Post()
|
|
@Roles(
|
|
Role.SYSTEM_ADMIN,
|
|
Role.HOSPITAL_ADMIN,
|
|
Role.DIRECTOR,
|
|
Role.LEADER,
|
|
Role.DOCTOR,
|
|
)
|
|
@ApiOperation({ summary: '创建患者' })
|
|
createPatient(@CurrentActor() actor: ActorContext, @Body() dto: CreatePatientDto) {
|
|
return this.patientsService.createPatient(actor, dto);
|
|
}
|
|
|
|
/**
|
|
* 查询患者详情。
|
|
*/
|
|
@Get(':id')
|
|
@Roles(
|
|
Role.SYSTEM_ADMIN,
|
|
Role.HOSPITAL_ADMIN,
|
|
Role.DIRECTOR,
|
|
Role.LEADER,
|
|
Role.DOCTOR,
|
|
)
|
|
@ApiOperation({ summary: '查询患者详情' })
|
|
@ApiParam({ name: 'id', description: '患者 ID' })
|
|
findPatientById(
|
|
@CurrentActor() actor: ActorContext,
|
|
@Param('id', ParseIntPipe) id: number,
|
|
) {
|
|
return this.patientsService.findPatientById(actor, id);
|
|
}
|
|
|
|
/**
|
|
* 更新患者信息。
|
|
*/
|
|
@Patch(':id')
|
|
@Roles(
|
|
Role.SYSTEM_ADMIN,
|
|
Role.HOSPITAL_ADMIN,
|
|
Role.DIRECTOR,
|
|
Role.LEADER,
|
|
Role.DOCTOR,
|
|
)
|
|
@ApiOperation({ summary: '更新患者信息' })
|
|
@ApiParam({ name: 'id', description: '患者 ID' })
|
|
updatePatient(
|
|
@CurrentActor() actor: ActorContext,
|
|
@Param('id', ParseIntPipe) id: number,
|
|
@Body() dto: UpdatePatientDto,
|
|
) {
|
|
return this.patientsService.updatePatient(actor, id, dto);
|
|
}
|
|
|
|
/**
|
|
* 删除患者。
|
|
*/
|
|
@Delete(':id')
|
|
@Roles(
|
|
Role.SYSTEM_ADMIN,
|
|
Role.HOSPITAL_ADMIN,
|
|
Role.DIRECTOR,
|
|
Role.LEADER,
|
|
Role.DOCTOR,
|
|
)
|
|
@ApiOperation({ summary: '删除患者' })
|
|
@ApiParam({ name: 'id', description: '患者 ID' })
|
|
removePatient(
|
|
@CurrentActor() actor: ActorContext,
|
|
@Param('id', ParseIntPipe) id: number,
|
|
) {
|
|
return this.patientsService.removePatient(actor, id);
|
|
}
|
|
}
|