진료/접수 관련 기능 구현을 위해 HL7 Appointment 모델을 손봤습니다.
HL7 Appointment 이슈
도입 이유 | 병원 시스템에서 환자의 접수/예약은 입력 값의 차이일 뿐 endpoint나 모델은 동일함. 이를 반영하여 요구사항 및 API 수정 필요 |
문제 상황 | – 현재 접수, 예약이 나누어져 있고 API도 나눠져 있음 → 동일한 기능임 – 진료 예약, 완료 정도의 간단한 기능만 가능한 모델, API로 구성되어 있음 |
해결 방안 | 예약 및 접수는 FHIR Appointment 리소스 → 해당 리소스를 참조하고 다시 모델링 API 설계 변경 – 환자 데이터 접수 → 환자 데이터 등록으로 변경 (정말 환자의 정보를 등록만 하는 endpoint) – 환자의 상태를 변경하기 위한 endpoint는 추가 모델 설계 변경 – Appointment 세부 기능 추가를 위해 appointment 모델 구조 변경 – datetime → start, end로 변경 – requested_period_start, requested_period_end 추가 – 의사가 환자가 언제 쯤 다시 방문하길 원하는지 입력할 수 있는 필드 – status 추가 – status의 카테고리 – proposed : 의사가 환자의 후속 예약이 필요하다고 생각하는 경우 값 → 접수에서 해당 값을 보고 예약 날짜 시간 잡음 – booked : 예약이 확정 – arrived : 환자가 도착하여 진료를 기다림 – fulfilled : 병원에서의 계획이 완료 됨 – cancelled : 예약이 취소됨 – noshow : 노쇼 – entered-in-error : 잘못된 입력 (해당 사례는 진찰 기록에 포함되서는 안됨) – waitlist : 접수 시간이 적합하지 않아 특정 시간의 대가자로 등록 – 표준에서 checked-in?과 같은 value는 임상시험에서 사용되는 값 같음 → 현재 요구사항에서는 제외 – cancellationReason 추가 – 표준 데이터타입은 CodeableConcept이나 Text로 변경 – serviceCategory – specialty – appointmentType – routine : 일반 예약 – walkin : 예정에 없던 방문 – checkup : 정기 검진 – followup : 이전 약속에 대한 후속 방문 – emergency : 응급 -reason – 증상이 있어야만 방문하는 게 아님, 예방접종, 수술 등으로 방문 – 원래는 코드(SNOMED CT)가 표준 → TEXT로 변경 – cancellationDate – description 추가 – 예약에 대한 추가 정보 – patient_instruction 추가 – 의사가 알려주는 환자에 대한 지시사항 로직에서 고려해야 되는 rule – start, end는 모두 required – cancel의 경우 데이터 삭제가 아니라 start, end 필드 값 제거하고 취소 사유에 원 예약 시간 start, end와 취소 사유를 입력 – start는 end보다 동일하거나 작아야 함 https://www.hl7.org/fhir/appointment.html |
optional한 기능은 제거하고 예약.접수에서 핵심 기능을 구현할 수 있도록 모델 변경
class Appointment(models.Model):
# 예약 상태 (예: proposed, pending, booked 등)
status = models.CharField(max_length=20, choices=[
('proposed', 'Proposed'),
('pending', 'Pending'),
('arrived', 'Arrived'),
('fulfilled', 'Fulfilled'),
('cancelled', 'Cancelled'),
('noshow', 'No Show'),
('entered_in_error', 'Entered in Error'),
('waitlist', 'Waitlist'),
])
appointmentType = models.CharField(max_length=20, choices=[
('routine', 'Routine'),
('walkin', 'Walkin'),
('checkup', 'Checkup'),
('followup', 'Followup'),
('emergency', 'Emergency'),
])
# 예약 시작 시간
start = models.DateTimeField()
# 예약 종료 시간
end = models.DateTimeField()
# 요청된 예약 기간
requested_period_start = models.DateTimeField(null=True, blank=True)
requested_period_end = models.DateTimeField(null=True, blank=True)
# 예약에 대한 추가 정보
description = models.TextField(null=True, blank=True)
# 예약 사유
reason = models.TextField(null=True, blank=True)
# 예약 생성 날짜
created = models.DateTimeField(auto_now_add=True)
# 예약 취소 날짜
cancellation_date = models.DateTimeField(null=True, blank=True)
# 예약 취소 이유
cancellation_reason = models.TextField(null=True, blank=True)
# 환자 지시사항
patient_instruction = models.TextField(null=True, blank=True)