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
}