feat(labdb): dataType 600·601 배정 반영 · subject 를 최상위로

labdb 관리자가 코드를 배정했다(2026-09-09). 임시로 쓰던 사용자 정의 구간에서 옮긴다.

    901 → 600  병원 임상 측정
    902 → 601  부착 위치 정렬

서버 조사에서 나온 지적 셋을 함께 처리했다.

**① 적재량 오기 정정.** 문서·주석·테스트에 "279건(2026-09-05)"이라고 적혀 있었는데
틀렸다. 279 는 일반 앱의 **미업로드 세션 수**였고 병원 적재량과 무관하다 — 그걸
옮겨 적으면서 섞였다. 실제는 **72세션 · 1,440레코드**(2026-09-04)이고 서버 조회로
확인했다. 기존 적재분은 서버에서 이미 600 으로 마이그레이션됐다.

**② subject 가 서버에서 비어 있었다.** 서버는 최상위 `data.subject` 만 읽어
`sessions.subject` 컬럼에 넣는데 앱은 `params` 안에만 넣고 있었다. 그 컬럼이 export
파일명 prefix 와 목록 표시에 쓰이므로, 72세션 전부 환자 구분이 안 되는 상태였다.
두 페이로드 모두 최상위에 추가한다(params 안에도 그대로 둔다 — 분석 쪽이 이미 쓴다).
환자명이 비면 필드 자체를 넣지 않는다: 빈 문자열이 들어가면 목록에서 빈칸과
구분이 안 된다.

**③ 601 은 레코드 시각이 업로드 시각으로 채워진다.** 원본 정렬 파일에 시각 열이 없어
`datetime` 을 못 넣는데 서버의 `records.timestamp` 는 NOT NULL 이다. 동작에는 문제가
없지만 전 레코드가 거의 같은 시각이 되므로, **조회·시각화는 rowIndex 로 정렬해야 한다**
— KDoc 과 스펙 문서에 명시했다.

PC 변환기(align2labdb.py · hospital2labdb.py)도 같이 고쳤다. 기존 902 정렬 1세션은
같은 testId 로 재업로드해 601 로 갱신했다(600 72 · 601 1 로 확인).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-09 10:41:04 +09:00
parent e17391ca9f
commit 2770d0296a
8 changed files with 136 additions and 33 deletions
+30 -16
View File
@@ -1,11 +1,15 @@
# labdb dataType 등록 요청 — VesiScan 병원 임상
# labdb dataType — VesiScan 병원 임상 (600 · 601)
> 등록 대상 2건. 현재 사용자 정의 구간(900~999)의 `901`·`902` 로 올리고 있으며,
> 관리자 배정 코드(100~899)를 받으면 앱에서 상수 한 줄만 바꿔 전환합니다.
> **2026-09-09 배정 완료.** 임시로 쓰던 `901`·`902`(사용자 정의 구간)에서 옮겼습니다.
>
> 앱 측 정의 위치
> · `901` → `services/labdb/HospitalLabdbPayload.kt` (`DATA_TYPE`)
> · `902` → `services/labdb/AlignLabdbPayload.kt` (`DATA_TYPE`)
> | 코드 | 의미 | 앱 측 정의 |
> |---|---|---|
> | `600` | 병원 임상 측정 | `services/labdb/HospitalLabdbPayload.kt` (`DATA_TYPE`) |
> | `601` | 부착 위치 정렬 | `services/labdb/AlignLabdbPayload.kt` (`DATA_TYPE`) |
>
> 서버에 `dataType` 레지스트리 테이블은 없습니다(`schema.sql:47` 의 `data_type` 은
> 자유 문자열). "등록"은 실제로 ① 코드 배정 ② `session.html` 의 `VIZ_HANDLERS` 분기
> ③ 목록 컬럼 ④ 이 문서 네 가지입니다.
---
@@ -16,10 +20,13 @@
- `testId` 는 `^[A-Za-z0-9_-]{1,40}$`. 파일명이 길면 **앞 31자 + `_` + 파일명 SHA-1 앞 8자**로 축약(충돌 방지).
- 채널 데이터는 12-bit ADC 원시값(0~4095), 채널당 최대 100 샘플. 연결이 끊긴 회차는 **짧은 배열**로 올 수 있습니다(0 패딩하지 않음).
- `peak` / `peakIdx` 는 그 채널 배열의 **최초 최대값**과 그 인덱스.
- **`subject` 는 최상위에 넣습니다.** 서버가 `params.subject` 는 읽지 않아
`sessions.subject` 컬럼이 비어 버립니다(2026-09-09 확인 — 기존 72세션이 그 상태).
그 컬럼이 export 파일명 prefix 와 목록 표시에 쓰입니다. `params` 안에도 그대로 둡니다.
---
## 1) dataType `901` — VesiScan 병원 임상 측정
## 1) dataType `600` — VesiScan 병원 임상 측정
### 데이터 의미
@@ -37,7 +44,7 @@
| 필드 | 타입 | 설명 |
|---|---|---|
| `testId` | string | 조합 CSV 파일명 기반 (축약 규칙 위 참조) |
| `dataType` | string | `"901"` |
| `dataType` | string | `"600"` |
| `sessionName` | string | 조합 CSV 파일명(확장자 제외) |
| `savedAt` | ISO8601 | 그 조합의 마지막 반복 시각 |
| `recordCount` | int | = `records.length` |
@@ -93,14 +100,14 @@
---
## 2) dataType `902` — VesiScan 부착 위치 정렬
## 2) dataType `601` — VesiScan 부착 위치 정렬
### 데이터 의미
임상 측정 **전** 단계인 부착 위치 정렬입니다. 치골 위 0cm 부터 1cm 씩 올리며 위치마다
20 cycle 을 재고, 지표를 비교해 부착 위치 하나를 고릅니다.
`901` 과 구조가 다릅니다 — 저쪽은 **한 조건에서 20 반복**, 이쪽은 **여러 위치 × 20 cycle**
`600` 과 구조가 다릅니다 — 저쪽은 **한 조건에서 20 반복**, 이쪽은 **여러 위치 × 20 cycle**
입니다. 그래서 별도 코드가 필요합니다.
업로드 시점: **자동 아님.** 간호사가 파형을 보고 이상하다고 판단했을 때만 버튼으로
@@ -111,7 +118,7 @@
| 필드 | 타입 | 설명 |
|---|---|---|
| `testId` | string | `<환자폴더>_align` 기반 |
| `dataType` | string | `"902"` |
| `dataType` | string | `"601"` |
| `sessionName` | string | `<환자폴더>_align` |
| `memo` | string | **간호사가 적은 증상.** 없으면 필드 자체가 없음 |
| `savedAt` | ISO8601 | 업로드 시각 |
@@ -197,7 +204,10 @@
| `commandType` | string | `"MTB"` 고정 |
| `channels` | array | 6개 |
> `901` 과 달리 `datetime` · `sensor` 가 없습니다. 원본 정렬 파일에 시각 열이 없습니다.
> `600` 과 달리 `datetime` · `sensor` 가 없습니다. 원본 정렬 파일에 시각 열이 없습니다.
>
> ⚠️ 서버의 `records.timestamp` 는 NOT NULL 이라 **업로드 시각으로 채워집니다.** 전
> 레코드가 거의 같은 시각이 되므로 조회·시각화는 반드시 `rowIndex` 로 정렬해야 합니다.
### 시각화 요구사항
@@ -209,10 +219,14 @@
---
## 요청 사항 정리
## 이력
| 항목 | 내용 |
|---|---|
| 코드 배정 | `901`·`902` 를 그대로 등록하거나, 100~899 구간에서 2개 배정 |
| 기존 데이터 | `901` 로 이미 **279건**(2026-09-05 수동 업로드) 적재됨. 코드 변경 시 마이그레이션 필요 |
| 앱 반영 | 배정 코드를 받으면 상수 2개만 수정 후 재배포 |
| 코드 배정 | 2026-09-09 · `600` 임상 / `601` 정렬 |
| 기존 적재분 | `901` 로 올렸던 **72세션 · 1,440레코드**(2026-09-04)는 서버에서 `600` 으로 마이그레이션 완료 |
| `902` 정렬 1세션 | 같은 `testId` 로 `601` 재업로드하여 갱신 |
| 앱 반영 | 상수 2개 변경 + 최상위 `subject` 추가 |
> 이전 판에 "279건(2026-09-05)"이라고 적혀 있었습니다. **오기입니다** — 279 는 일반 앱의
> 미업로드 세션 수였고 병원 적재량과 무관합니다. 실제는 72세션 · 1,440레코드입니다.