HBNS230_환자수 관리
(Hereby) 팀 관리(team-manager) > 간호 스케줄러 > 환자수 관리
| 앱 | 간호 스케줄러 (team-manager 내장, 포트 TBU) |
| 대상 사용자 | 조건1 [간호 관리자] · 조건2 [수간호사] |
| 프로토타입 | TBU |
| 관련 정책 | [[POL_간호스케줄 Lifecycle]] · [[POL_간호인력·준수율]] |
| Status | draft |
| Owner | 카나 |
개요
- 병동별 **일 환자수(census)**를 입력·관리하는 화면. 두 접점으로 나뉜다.
- 헤더 인라인 입력: "오늘 환자 / 간호부 [0] / 합계 0명" — [[HBNS100]] Shell 헤더 연계, 병동별 spinbutton + 합계.
- 📋 "월별 환자수 관리" 모달: 상단 병동 탭 + 대상 월 선택, 전월 참고 통계("전월 (n월) 참고 — 평균 n명 / 최소 n명 / 최대 n명 / 입력 n일"), 일별 달력 입력 그리드(날짜 셀마다 환자수 입력), 상태 범례(입력완료 / 미입력 / 수정됨 / 오늘), "미입력일 병상수로 채우기" 버튼, 하단 "닫기" / "저장".
- 헤더 인라인과 월별 모달 모두 동일 ward_daily_records에 upsert한다.
- 입력된 환자수는 준수율(인력 비율 충족도)·간호등급 계산의 입력 원천이다. 비율 충족도 = RatioRule 대비 값으로 산출되며, 환자수 누락 시 준수율 계산이 왜곡된다.
- ERD ward_daily_records(wardId / date / patientCount / updatedById)에 병동×일자 단위로 저장. [[HBHR240]](HR 병동 일별 환자수 시트)와 원천을 공유하고, [[HBMD]](Medical 병동별 인력 현황, "스케줄러와 병동 관리로 계산")의 계산 인자로 소비된다.
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-10 | 카나 | PM | 라이브 기능 검토 반영 |
| 2026-07-13 | 카나 | PM | 버튼 행동 명세 보강 |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 |
| 2026-07-21 | 카나 | PM | 셀 스타일 확정판 적용 (콸 승인) |
| 2026-07-21 | 카나 | PM | TC 크로스체크 확정분 반영 (🟡 — nurseScheduler.dailyRecord.upsert/get 확정 등) |
| 2026-08-18 | 카나 | 라이브 재검증 정정 | 모달 헤더 제목 라이브 = "환자수 관리"(병동 탭 병기). 버튼 aria-label "월별 환자수 관리"는 유지. 전월 참고·상태 범례·"미입력일 병상수로 채우기"·닫기/저장 전부 라이브 일치 확인 |
Data I/O
Server → Client
| 변수 | DB 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
${jwt_session} | 인증 세션 (간호 관리자/수간호사) | 없으면 /nurse-scheduler/signin 리다이렉트 | [[HBNS100]] |
${ward_tabs} | wards[] | 병동 0건 → 탭 없음 처리 = TBU | "간호부 (IMPORT-간호부-...)" / "1 (WARD_...)" |
${today_census} | ward_daily_records.patientCount (당일) | 당일 미입력 → "[0]" 기본 표기 | "오늘 환자 / 간호부 [0] / 합계 0명" |
${monthly_census} | ward_daily_records[] (병동×일자 그리드) (추정) | 미입력일 → 달력 셀 "미입력" 상태(-E) | 월별 모달 그리드 |
${prev_month_stat} | ward_daily_records 전월 집계 | 전월 데이터 없음 → 통계 값 없음 처리 = TBU | "전월 (n월) 참고 — 평균/최소/최대/입력 n일" |
${compliance} | 준수율 (환자수 × RatioRule 대비 충족도) | 환자수 누락 시 계산 왜곡 | "준수율 25%에서 100%" |
Client → Server
| 액션 | 전달 값 | tRPC/SDK | 권한 토큰 |
|---|---|---|---|
| 당일 환자수 입력 | wardId, date, patientCount | nurseScheduler.dailyRecord.upsert() (TC 확정: 04:4.6) | TBU |
| 당일 환자수 조회 | wardId, date | nurseScheduler.dailyRecord.get(wardId, date) (TC 확정: 04:4.6) | TBU |
| 월별 환자수 관리 저장 | wardId, date[], patientCount[] | nurseScheduler.dailyRecord.upsert() (일자별) (TC 확정: 04:4.6) | TBU |
| 미입력일 병상수로 채우기 | wardId, 미입력 date[], 병상수(bedCount) | 클라이언트 채움 후 저장 시 nurseScheduler.dailyRecord.upsert() (TC 확정: 04:4.6) | TBU |
외부 통합 (cross-app)
| 외부 시스템 | 데이터 | 동기/비동기 | 비고 |
|---|---|---|---|
| HR ([[HBHR240]] 병동 일별 환자수 시트) | 환자수 원천 공유 | 비동기(추정) | 원천 연계 |
| Medical ([[HBMD]] 병동별 인력 현황) | 환자수를 계산 인자로 소비 ("스케줄러와 병동 관리로 계산") | 비동기(추정) | 인력 현황 소비 |
| 병동 병상수 ([[HBNS240]]) | "미입력일 병상수로 채우기" 원천 | 동기 | 병상수 원천 |
화면 플로우 (상태 머신 필수)
환자수는 준수율·간호등급 계산의 입력 원천 — 헤더 인라인과 월별 관리 모달 모두 동일 ward_daily_records에 upsert.
환자수 관리 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 화면 진입 조건 | - | • 조건1 [간호 관리자]/조건2 [수간호사] 인증 시 노출- CASE01 [세션 없음]: /nurse-scheduler/signin 리다이렉트 | 인증 세션 | [[HBNS100]] |
| 01 | 데이터 원천 | - | ward_daily_records(wardId / date / patientCount / updatedById) 병동×일자 단위 저장 | 준수율 계산 입력 | |
| 10 | 헤더 인라인 입력 | Input | • 병동 탭마다 당일 환자수를 spinbutton으로 입력하는 헤더 연계 필드 • 입력 → "오늘 환자 / 간호부 [0] / 합계 0명" 갱신, ward_daily_records upsert - CASE01 [미입력]: "[0]" 기본 표기 | [[HBNS100]]_Shell·헤더 | 준수율 당일 원천·TBU: 반영 실패 동작 |
| ㄴ11 | 합계 표시 | Output | • 병동 입력 합산 "합계 0명" 표기(입력 0도 "합계 0명") | ||
| 20 | 월별 환자수 관리 모달 진입 | Button | • 📋 클릭 → "월별 환자수 관리" 모달 오픈 (상세 아래 별도 표) | 아래 모달 표 | 아이콘 = "월별 환자수 관리"(⚙="병동 관리 및 설정"과 구분) |
| 30 | 준수율 반영 | Output | • 입력 환자수 → 비율 충족도(RatioRule 대비) 재계산 → 준수율/간호등급 지표 반영 - CASE01 [환자수 누락일]: 계산 왜곡 | [[HBNS200]] 지표 바 / [[POL_간호인력·준수율]] | TBU: 0 vs 미입력 규칙·비율 규칙 위치 |
| 40 | HR 시트 연계 | - | 병동 일별 환자수가 HR 시트와 원천 공유 | [[HBHR240]]_병동 일별 환자수 시트 | |
| 50 | 인력 현황 소비 | - | 환자수는 Medical 병동별 인력 현황("스케줄러와 병동 관리로 계산")의 계산 인자로 소비 | [[HBMD]] 병동별 인력 현황 |
월별 환자수 관리 모달 사양표
📋 클릭 시 노출. 월 단위 병동×일자 환자수 관리. 하단 "닫기" / "저장".
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 노출 조건 | - | 📋 "월별 환자수 관리"(버튼 aria-label) 클릭 시 모달 오픈. ⚠ 2026-08-18 라이브: 모달 헤더 제목은 "환자수 관리"(+ 병동 탭 병기) — "월별" 접두 없음 | 환자수 관리 표 20 | 2026-08-18: 모달 제목 "환자수 관리" 정정 |
| 10 | 병동 탭 | Tab | • 대상 병동을 선택하는 상단 탭 • 탭 전환 → 선택 병동으로 그리드 컨텍스트 전환 | wards[] | TBU: 병동 0건 탭 처리·기본값 |
| 20 | 대상 월 | Select | • 입력 대상 월을 고르는 선택 컨트롤 • select → 해당 월 그리드 로드 | TBU: 기본값(당월 추정) | |
| 30 | 전월 참고 통계 | Output | • "전월 (n월) 참고 — 평균 n명 / 최소 n명 / 최대 n명 / 입력 n일" 표기 | ward_daily_records 전월 | 참고값·TBU: 전월 데이터 없음 표기 |
| 40 | 일별 달력 입력 그리드 | Input | • 날짜 셀마다 해당 일 환자수를 입력하는 달력 그리드 • 날짜 셀 클릭 → 인라인 입력 - CASE01 [미입력 셀]: "미입력" 상태(범례 참조, 아래 40-E) | ward_daily_records.patientCount | 병동×일자·TBU: 셀 검증 실패(음수·비수치) 동작 |
| ㄴ40-E | 미입력일(Empty) | -E | • 미입력 날짜는 달력 셀 "미입력" 상태로 표시(범례 "미입력") | Empty·TBU: 저장 제외/0 처리 규칙 | |
| 50 | 상태 범례 | Output | • "입력완료" / "미입력" / "수정됨" / "오늘" 셀 상태 색 범례 | 원문 카피 | |
| 60 | 미입력일 병상수로 채우기 | Button | • 미입력 날짜에 병동 병상수를 일괄 채우는 버튼 • 클릭 → 즉시 실행(컨펌 없음), 미입력 날짜 일괄 채움 | 병동 병상수([[HBNS240]]) | 원문 카피·TBU: 미입력일 0건·병상수 미설정 동작 |
| 70 | 닫기 | Button | • 클릭 → 모달 닫기 | TBU: 미저장 변경 폐기 여부 | |
| 71 | 저장 | Button | • 병동×일자 환자수를 upsert하는 저장 버튼 • 클릭 → upsert 후 반영 | ward_daily_records | nurseScheduler.dailyRecord.upsert (TC 확정: 04:4.6)·TBU: 변경 없음/저장 실패 동작 |
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 | 권한 | 비고 |
|---|---|---|---|---|
CASE01 [당일 환자수 입력] | 헤더 "오늘 환자" 필드 | ward_daily_records upsert → 준수율 재계산 | 조건1/조건2 | |
CASE02 [월별 환자수 관리] | 📋 "월별 환자수 관리" → "저장" | 모달에서 병동×일자 환자수 입력 → upsert | 조건1/조건2 | 일별 달력 그리드 |
CASE03 [미입력일 채우기] | "미입력일 병상수로 채우기" | 미입력 날짜에 병동 병상수 일괄 입력 | 조건1/조건2 | 병상수([[HBNS240]]) |
Open Question
- "전월 참고 통계"(평균/최소/최대) 산출 기간 정의(직전 월 vs 동월 전년) = TBU
- 비율 규칙(1:5 / 1:7 / 1:10) 대비 준수율 계산식 및 RatioRule 위치 = TBU
- 환자수 누락일 처리(0 vs 미입력) 및 간호등급 산출 규칙 = TBU
- 달력 그리드 셀 입력 검증(음수·비수치·병상수 초과) = TBU
- "저장" 실패 시 동작(에러 노출/롤백) = TBU
- "닫기" 시 미저장 변경 폐기 여부·경고 = TBU