HL7 Appointment 내용 정리

진료/접수 관련 기능 구현을 위해 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)

Leave a Comment