Bahmni Connect 기능
목적과 이점
Bahmni의 오프라인 기능(Bahmni Connect)은 지역사회 보건 종사자(CHW)가 인터넷을 사용할 수 없거나 연결이 간헐적인 원격 지역에서 Bahmni를 이용해 환자를 등록하고, 의료 기록을 조회하며, 간단한 치료 데이터를 입력할 수 있게 합니다. Bahmni Connect는 현장 사용자를 위한 단일 사용자용 오프라인 지원 애플리케이션으로, 서버 버전에 비해 기능이 제한됩니다.
Bahmni Connect가 제공하는 주요 기능은 크게 다음 두 가지이며, 각 기능에는 제한이 있습니다.
- 등록 - 이미 등록된 환자를 조회하고 새 환자를 등록합니다.
- 임상 - 관찰 정보를 기록하고 진단, 검사실 오더 등 지원되는 정보를 조회합니다.
수집한 정보는 Bahmni Server와 동기화할 수 있으며, 로그인한 사용자의 담당 구역과 관련된 정보도 기기로 내려받을 수 있습니다.
여기에서 사용 안내 동영상을 볼 수 있습니다. 다만 내용이 다소 오래되었습니다.
다음은 Bahmni Connect의 여러 기능에 대한 설명입니다.
지원 기능
1) 로그인 위치
지역사회 보건 종사자(CHW)가 휴대용 기기에서 애플리케이션에 처음 로그인하면 서버에서 인증을 거쳐 접근 권한을 얻습니다. 오프라인 상태에서도 인증할 수 있도록 자격 증명이 기기에 저장됩니다. CHW가 오프라인 상태에서 로그아웃한 경우, 이전 온라인 로그인에 사용한 저장된 자격 증명으로 다시 로그인할 수 있어야 합니다. 기기에는 마지막으로 성공한 로그인 정보만 저장됩니다.
CHW는 업무를 수행할 특정 위치에 연결됩니다. 다른 지역으로 전근하는 경우가 드물고, 전근하더라도 CHW가 쓰던 기기는 같은 위치에 남습니다. 따라서 이후 로그인할 때마다 CHW에게 위치를 선택하게 할 필요가 없습니다.
CHW가 선택한 로그인 위치에는 catchment ID가 속성으로 저장됩니다. 첫 로그인 후 위치와 ID를 로컬에 저장하고, 이후 오프라인 로그인에서는 기본 위치를 미리 채웁니다. 해당 ID는 동기화 시 서버 데이터 필터 조건으로 사용합니다.
앱 최초 설치 시 OpenMRS에서 가져온 모든 위치를 표시합니다. 로그인 위치를 선택해 처음 로그인하면 이를 기본값으로 지정하고 위치 속성의 catchment ID와 함께 로컬에 저장합니다.
위치별 동기화 구성을 제공하려면 다음 Java 파일을 정의해야 합니다.
이 파일은 Bahmni Connect Sync(https://github.com/Bahmni/bahmni-offline-sync)에 작성하고 OpenMRS 모듈에 OMOD로 배포해야 합니다. 다음 필터 기준도 이 파일에 정의합니다.
2) 주소 계층 구조 설정
Bahmni Connect는 주소 설정을 사용해 데이터를 온라인 Bahmni 서버와 동기화합니다. 주소 계층 구조는 구현마다 다르거나 변경될 수 있습니다. 예를 들어 국가 단위 배포에서는 여러 하위 수준이 하나의 상위 수준에 연결되고, 또 다른 하위 수준 집합이 다른 상위 수준에 연결되는 하향식 구조를 따를 수 있습니다. Bahmni Connect는 이 체계를 기준으로 서버와 동기화합니다. 여러 하위 센터가 있고 평면형 계층 구조를 따르는 구현도 있을 수 있습니다.
이러한 상황을 고려해 Bahmni Connect가 서버와 동기화할 필터 기준을 설정하면 여러 주소 구성에서 사용할 수 있습니다.
3) Bahmni Online/Bahmni Connect 앱 설정
국가 등록소 같은 일부 앱은 오프라인 기기가 온라인에 연결되었을 때만 표시해야 합니다. 마찬가지로 오류 로그 같은 일부 기능은 기기가 오프라인일 때 표시할 필요가 없습니다. bahmni_config/openmrs/apps/home/에 있는 extension.json을 다음과 같이 변경해야 합니다.
예시 1) "exclusiveOnlineModule":
예시 2) "exclusiveOfflineModule":
4) 여러 담당 구역 지원 설정
하나의 주소 계층 항목에 로그인 위치가 여러 개 있을 수 있으며, 각 로그인 위치가 일부 하위 주소 항목만 담당할 수도 있습니다. OpenMRS Admin UI에서는 한 로그인 위치 아래에 여러 담당 구역을 설정할 수 없으므로, 이 경우 위치 속성 "catchmentFilters"를 사용할 수 있습니다. ‘구역’의 사용자 생성 ID(address_hierarchy_entry.user_generated_id)를 쉼표로 구분해 이 속성 값으로 설정합니다.
위치 기반 필터 평가기는 여기에 설정한 필터를 기준으로 데이터를 가져옵니다. 설정값이 없으면 로그인 위치의 주소 아래에 있는 모든 구역의 데이터를 가져옵니다.
절차:


5) Bahmni에서 지원하는 표시 컨트롤
현재 지원하는 표시 컨트롤:
- 진단(조회 전용)
- 관찰
- 검사실 오더(조회 전용)
- 방문 표시(조회 전용)
- 치료/약제 정보(조회 전용)
Bahmni Connect 클라이언트가 서버와 동기화된 뒤 컨트롤이 업데이트됩니다.
환자 등록
Bahmni Connect가 지원하는 주요 등록 기능:
- 이름, ID, 주소 또는 사용자 정의 속성을 기준으로 설정 가능한 환자 검색
- 환자 상세 정보(식별 정보, 이름, 나이, 성별, 사용자 정의 속성) 입력
- 기존 환자 상세 정보 수정
아직 지원되지 않는 기능
- 환자와 다른 환자/의사 간 관계 기록
- 사망 정보
- 등록 페이지에서 방문 시작
- 등록 두 번째 페이지
- 기존 환자 이미지 표시
- 환자 등록 중 이미지 촬영
- 등록 카드 인쇄
- 환자 이름, 성, 마지막 이름 자동 완성 옵션
- 오프라인에서는 로그인 위치를 바꿀 수 없으므로 홈 헤더의 로그인 위치 드롭다운을 표시하지 않음
- 오프라인 클라이언트에서 오더 및 투약 기록
오프라인 등록 모듈의 기능상 유일한 차이는 ID 생성 방식입니다. 오프라인에서 생성한 환자는 Bahmni 서버로 다시 동기화될 때까지 식별자가 생성되지 않습니다. 그전에는 등록 페이지에 식별자 행이 표시되지 않으며, 환자 검색 페이지의 검색 결과 목록에서는 식별자 열에 ‘Not Assigned’가 표시됩니다.
** 진단 표시 컨트롤은 진단이 기록된 Bahmni Online과 오프라인 클라이언트가 동기화될 때 해당 환자의 진단을 표시합니다.

기술적 구현
오프라인 기기로 동기화된 모든 환자는 오프라인 데이터베이스에 문서로 저장됩니다. 여기서 문서는 환자 상세 페이지를 표시하는 데 필요한 모든 정보를 담은 환자 JSON입니다. 검색 속도를 높이기 위해 관련 정보를 JSON에서 추출해 오프라인 데이터베이스 테이블의 열로 저장합니다.
모든 오프라인 데이터베이스 조작에는 두 가지 구현이 필요합니다.
- Android SQLite 데이터베이스를 조작할 수 있는 네이티브 Java 코드
- SQLite는 MySQL과 문법이 매우 비슷하므로, 서버에서 검색에 사용하는 SQL을 최소한의 변경으로 사용할 수 있었습니다.
- Lovefield는 JavaScript API로 조작할 수 있고 빌더 문법으로 SQL 문을 구성합니다(link). 서버에서 사용하는 SQL은 이 빌더 형식으로 이식되었습니다.
- 서버 검색 SQL은 검색 결과를 고성능 무한 스크롤로 제공하기 위해 페이징 결과와 함께 SQL group_concat 함수를 사용합니다. Lovefield는 group_concat을 지원하지 않습니다. 이 제약을 피하면서 무한 스크롤 성능을 유지하기 위해 검색 쿼리를 두 개의 별도 쿼리로 나눴습니다. group_concat은 등록 페이지 검색에 필요한 모든 속성 데이터와 정확한 결과 수를 함께 가져오는 데 사용되므로 이러한 처리가 필요했습니다.
방문 및 진료
온라인의 기존 처리 방식
방문(VISIT):
방문은 환자가 병원에 들어온 것을 나타내며, 환자가 병원에 있는 동안 열린 상태로 유지됩니다. 방문 기간은 설정할 수 있으며 24시간이나 48시간 등으로 지정할 수 있습니다.
방문 정보를 수집하고 저장하면 다음과 같은 이점도 있습니다.
- 유형별 방문 횟수를 집계하는 보고서에 사용할 수 있습니다.
- Clinical이나 Radiology 같은 다른 앱의 대기열을 설정하는 데 사용할 수 있습니다. 예를 들어 IPD 유형의 열린 방문이 있는 환자는 IPD 탭(IPD 환자 대기열)에, OPD 유형의 열린 방문이 있는 환자는 OPD 환자 대기열에 표시됩니다.
환자는 한 번 병원을 방문하는 동안 여러 진료과에서 다양한 진료를 받을 수 있습니다. 이러한 과정은 방문 아래에 기록되는 진료(encounter)로 추적합니다.
환자의 방문은 등록 페이지에서 시작합니다. 새 환자를 등록할 때나 이미 등록된 환자를 검색했을 때 모두 시작할 수 있습니다. 두 경우 모두 방문 시작은 환자의 병원 내 절차가 시작되었음을 나타냅니다.
진료(ENCOUNTER):
환자가 병원을 방문하면 여러 진료과에서 서로 다른 의사에게 치료받을 수 있습니다. 각각의 사건을 ‘진료(Encounter)’라고 합니다. 진료는 검사실, 약국 같은 위치나 입원, 퇴원 같은 행위를 나타낼 수 있습니다.
진료 유형은 현재 OpenMRS에서 정의하고 관리합니다.
환자를 등록하면 등록 진료가 생성됩니다. 환자의 임상 데이터를 기록하고 저장하면 임상 진료가 생성됩니다. 이러한 진료는 애플리케이션이 설치된 병원의 필요에 따라 정의할 수 있습니다.
한 방문에는 해당 방문 중 환자에게 수행한 작업이나 환자가 들른 병원 내 위치에 따라 여러 진료가 연결될 수 있습니다.
오프라인 처리 방식
기능적으로 온라인 모드와 비슷하지만 다음 차이가 있습니다.
환자 등록 시 방문을 열지 않습니다. 등록 정보는 기기에 저장되며 동기화해도 방문이나 등록 진료 사건을 만들지 않습니다.
오프라인에서 임상 데이터(관찰)를 저장하면 임시 방문과 진료 사건을 만들어 기기에 저장합니다. 세 가지 상황이 있습니다.
- 오프라인 기기에서 새 환자 생성
- 기존 환자에게 임상 데이터 추가
- 오프라인에서 데이터를 추가했지만 동기화 전에 병원에서 열린 방문이 생긴 환자
Clinical에서 방문을 표시할 때 최근 n개의 방문을 요청하는 경우가 있습니다. 오프라인에서는 최근 n개 방문과 함께 더미 방문 정보가 있으면 이를 추가로 표시합니다.
각 시나리오는 아래에서 자세히 설명합니다.
1 - 오프라인 기기에서 새 환자를 생성한 경우

2 - 기존 환자에게 임상 데이터를 추가한 경우

3 - 오프라인에서 환자에게 임상 데이터를 추가했지만 동기화 전에 병원에서 열린 방문도 생긴 경우

오프라인 방문 매처 설정:
방문 매처를 Offline Visit matcher로 설정하기 위한 전역 속성을 OpenMRS에 추가합니다.

Bahmni Connect의 Clinical 검색 전체 탭에 최근 환자 설정

All 탭을 열면 검색창 아래에 최근 14일 안에 생성되었거나 진료 사건이 있는 환자를 표시합니다.
최근 환자 기간은 clinical/app.json의 config 영역에서 구성합니다.
Bahmni Connect에서 Clinical 검색 탭 숨기기
clinical/extension.json의 검색 탭 구성에 "offline:false"를 추가하면 Bahmni Connect에서 해당 탭을 숨깁니다.
Bahmni Wiki · CC BY-SA 4.0