using Oracle.ManagedDataAccess.Client; namespace SheetMe.Data.Stores; /// /// 바이탈(측정치) 조회 — 레거시 OCM_키/몸무게/체온/혈압/맥박/호흡/SPO2(±_LAST) 계열 /// (bzDataInterface.vb:11508-13046)의 공통 조회. /// /// 전부 같은 틀이다: /// E_EmdInf_VITAL ⨝ E_EmrInf(EmrKey=EmdEmrKey, 삭제 제외) 를 내원으로 거르고 /// 해당 컬럼이 비어 있지 않은 행을 측정일시 순으로 한 건 집는다 — /// 무인자는 첫 측정(ASC), _LAST 는 마지막 측정(DESC). /// /// SELECT 식·널 필터·정렬까지 태그마다 본문에서 확인한 대로 호출부(해석기)가 지정한다. /// 식과 컬럼명은 전부 코드 상수에서만 온다 — 사용자 입력이 닿는 경로가 아니다. /// public sealed class VitalStore { #region Member Fields private readonly string connectionString; #endregion #region Constructors public VitalStore(string connectionString) => this.connectionString = connectionString; #endregion #region Methods /// 측정치 한 건 — 없으면 빈 문자열 /// SELECT 식(별칭 포함) — 예: "EmdWeight" / "EmdBps || '/' || EmdBpd AS BP" /// 결과에서 집을 컬럼(별칭) /// 비어 있으면 안 되는 컬럼들(레거시 필터 그대로) /// 정렬 절 — 예: "EmdDte ASC, EmdTime ASC" public string One(decimal comNum, string selectExpr, string pick, string[] notNullColumns, string orderBy) => Fetch("E_EmdInf_VITAL", "EmrComNum = :k", comNum, selectExpr, pick, notNullColumns, orderBy); /// /// BST 는 표가 다르다(E_EmdInf_BST, bzDataInterface.vb:12042-12080·12710-12747) — /// 같은 조인 틀에 표만 바뀐다. /// public string OneBst(decimal comNum, string orderBy) => Fetch("E_EmdInf_BST", "EmrComNum = :k", comNum, "EmdBst", "EmdBst", new[] { "EmdBst" }, orderBy); /// /// BMI·표준체중·조정체중은 내원이 아니라 차트 전체에서 최신 측정을 집는다 /// (bzDataInterface.vb:12159-12333 — EmrChtNum 조건, 주석 처리된 EmrComNum 이 그 흔적). /// public string OneByChart(string chtNum, string selectExpr, string pick, string[] notNullColumns, string orderBy) => Fetch("E_EmdInf_VITAL", "EmrChtNum = RPAD(:k, 10)", chtNum, selectExpr, pick, notNullColumns, orderBy); private string Fetch(string table, string where, object key, string selectExpr, string pick, string[] notNullColumns, string orderBy) { var filters = string.Concat(notNullColumns.Select(c => $" AND ({c} IS NOT NULL AND {c} <> ' ') ")); var sql = "SELECT * FROM (" + $" SELECT {selectExpr}" + $" FROM {table}" + " INNER JOIN E_EmrInf ON EmrKey = EmdEmrKey" + " AND (EmrSttFlg IS NULL OR EmrSttFlg <> 'D')" + $" WHERE {where}" + filters + $" ORDER BY {orderBy}" + " ) WHERE ROWNUM = 1"; using var connection = new OracleConnection(connectionString); connection.Open(); using var command = connection.CreateCommand(); command.BindByName = true; command.CommandText = sql; command.Parameters.Add(new OracleParameter("k", key)); using var reader = command.ExecuteReader(); if (!reader.Read()) { return string.Empty; } var at = reader.GetOrdinal(pick); return reader.IsDBNull(at) ? string.Empty : reader.GetValue(at).ToString()!.Trim(); } #endregion }