EMR 프로젝트 - 3

ERD

image.png

EMR 프로젝트의 기본 흐름인 환자 등록 -> 예약 또는 당일 접수 -> 진료 대기 -> 진료 완료를 구현했다.

데이터 처리

동시 요청으로 중복 접수가 발생하지 않도록 트랜잭션과 잠금 처리를 적용했다. 예약과 진료기록 수정에는 버전 검사를 사용해 다른 사용자의 변경 내용을 덮어쓰지 않도록 했다.

  @Lock(LockModeType.PESSIMISTIC_WRITE)
  @Query("select p from Patient p where p.id = :id")
  Optional<Patient> findLockedById(@Param("id") Long id);
@Transactional
  public EncounterView register(Registration input) {
      Patient patient = lockedPatient(input.patientId());

      if (encounters.existsByPatientIdAndStatusIn(
              patient.getId(),
              List.of(Encounter.Status.WAITING, Encounter.Status.IN_PROGRESS))) {
          throw new IllegalStateException("이미 대기 또는 진료 중인 접수가 있습니다.");
      }

구현

환자 관리

image.png
image.png

환자 목록과 상세정보를 좌우로 나누고, 목록에서 환자를 선택하면 정보를 조회하거나 수정할 수 있도록 구성했다.
기본 인적사항에 더해 알레르기, 과거력, 기저질환, 특이사항을 저장하도록 했다.
편의성을 위해 환자 선택 시 예약 등록, 당일 접수 기능을 같이 사용할 수 있도록 구성했다.


예약관리

image.png

예약 관리에서는 날짜별 예약 조회와 날짜, 시간, 담당 의사, 사유 변경, 예약 취소를 지원한다.
예약은 30분 단위이며, 같은 시간에 동일 환자나 담당 의사의 예약이 중복되지 않도록 검사한다.
이미 접수했거나 취소한 예약은 수정할 수 없도록 처리했다.

예약은 방문 예정 정보이고, 접수는 환자가 실제로 방문한 기록이므로 appointments와 encounters 테이블을 분리했다.
등록 후 별도로 접수해야 진료 대기 목록에 들어간다.

진료 관리

image.png

진료 관리에서는 접수 시각이 빠른 순서로 환자를 보여주고, 접수 시각과 대기 시간을 표시한다. 기본 목록에는 대기, 진료 중인 환자만 표시하며, 완료된 기록은 별도 필터로 조회한다.


추가할 내용

진단명 등록, 약 처방, 의사가 환자에게 검사 요청과 결과, 처치 및 수납까지 추가하고 마무리할 예정이다.

댓글 0

댓글을 불러오는 중입니다.