From 3b96e5b4cb1d24e441e724ebfece5dd708b249c3 Mon Sep 17 00:00:00 2001 From: jjangddu Date: Mon, 1 Jun 2026 12:34:18 +0900 Subject: [PATCH] =?UTF-8?q?Clinical:=20dataType=20"001"=20(=EB=82=B4?= =?UTF-8?q?=EB=B6=80=20=EC=9E=84=EC=83=81)=20+=20measurement.json/meta.jso?= =?UTF-8?q?n=EC=97=90=20data=5Ftype=20=ED=95=84=EB=93=9C=20=EB=85=B8?= =?UTF-8?q?=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit labdb 자료 구분 코드를 "000"(외부 일반 VesiScan) → "001"(내부 임상 R&D)로 변경. ClinicalSessionStore에 const DATA_TYPE을 두고, meta.json과 measurement.json의 meta 블록에 "data_type": "001"을 함께 기록 — 폴더만 보고도 내부 임상 데이터임을 즉시 식별 가능. LabdbUploader는 measurement.json의 meta.data_type을 우선 사용하고 없으면 "001" fallback. 향후 dataType이 늘어나도 단일 진실 출처(meta)에서 파생되도록 분리. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../medilightv2android/services/ClinicalSessionStore.kt | 5 +++++ .../medilightv2android/services/labdb/LabdbUploader.kt | 8 +++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/example/medilightv2android/services/ClinicalSessionStore.kt b/app/src/main/java/com/example/medilightv2android/services/ClinicalSessionStore.kt index 20cd4d3..4f3dbcf 100644 --- a/app/src/main/java/com/example/medilightv2android/services/ClinicalSessionStore.kt +++ b/app/src/main/java/com/example/medilightv2android/services/ClinicalSessionStore.kt @@ -32,6 +32,9 @@ data class MeasurementCycle( */ object ClinicalSessionStore { + /** labdb 자료 구분 코드 — "001" = 내부 임상 R&D (외부 일반 VesiScan "000"과 구분). */ + const val DATA_TYPE: String = "001" + /** ClinicalHome 화면에 진입한 상태인지. BLE 연결을 위한 DeviceScan 우회/Back 라우팅에 사용. */ @Volatile var inClinicalFlow: Boolean = false @@ -96,6 +99,7 @@ object ClinicalSessionStore { val dir = currentLogDir() ?: return dir.mkdirs() val meta = JSONObject().apply { + put("data_type", DATA_TYPE) put("device_name", s.deviceName) put("posture", s.posture.name) put("step", s.step.name) @@ -174,6 +178,7 @@ object ClinicalSessionStore { // meta: writeMeta()와 동일 내용 포함 (단독 파일로 자족 가능) val meta = JSONObject().apply { + put("data_type", DATA_TYPE) put("subject_id", s.subjectId) put("device_name", s.deviceName) put("posture", s.posture.name) diff --git a/app/src/main/java/com/example/medilightv2android/services/labdb/LabdbUploader.kt b/app/src/main/java/com/example/medilightv2android/services/labdb/LabdbUploader.kt index 8964a98..3b73220 100644 --- a/app/src/main/java/com/example/medilightv2android/services/labdb/LabdbUploader.kt +++ b/app/src/main/java/com/example/medilightv2android/services/labdb/LabdbUploader.kt @@ -22,7 +22,8 @@ import java.util.Locale * - 성공: folder/labdb_upload.json (응답 본문) * - 실패: folder/labdb_upload_error.json (에러 본문) — 폴더는 그대로 유지되어 수동 재시도 가능 * - * dataType = "000" (VesiScan 6채널). vesiscan_test 프로토콜과 동일. + * dataType = "001" (내부 임상 R&D — 외부 일반 VesiScan "000"과 구분). + * measurement.json의 meta.data_type을 우선 사용, 없으면 DEFAULT_DATA_TYPE fallback. * * testId: * - 폴더명 그대로 사용 (사용자 결정). 단 ^[A-Za-z0-9_-]{1,40}$ 제한 때문에 @@ -30,7 +31,7 @@ import java.util.Locale */ object LabdbUploader { private const val TAG = "LabdbUploader" - private const val DATA_TYPE = "000" + private const val DEFAULT_DATA_TYPE = "001" private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) private val isoFmt: SimpleDateFormat @@ -74,6 +75,7 @@ object LabdbUploader { val meta = measurement.optJSONObject("meta") ?: JSONObject() val cycles = measurement.optJSONArray("cycles") ?: JSONArray() val testId = sanitizeTestId(folderName) + val dataType = meta.optString("data_type").ifBlank { DEFAULT_DATA_TYPE } val records = JSONArray() for (i in 0 until cycles.length()) { @@ -99,7 +101,7 @@ object LabdbUploader { return JSONObject().apply { put("testId", testId) - put("dataType", DATA_TYPE) + put("dataType", dataType) put("sessionName", meta.optString("label").ifBlank { folderName }) put("memo", meta.optString("notes")) meta.optLong("ended_at", 0L).takeIf { it > 0 }?.let {