From b08fc32b7645521a89e3ffe428afae33da80ca46 Mon Sep 17 00:00:00 2001 From: windpacer Date: Fri, 19 Jun 2026 07:06:26 +0900 Subject: [PATCH] =?UTF-8?q?fix(report):=20=EC=9A=B4=EC=A0=84=EB=AA=A8?= =?UTF-8?q?=EB=93=9C=20=ED=8E=8C=ED=94=84=20=EA=B0=80=EB=8F=99=20=ED=8C=90?= =?UTF-8?q?=EC=A0=95=20=E2=80=94=20'{N=20|=20label=20|=20}'=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=20=EB=A7=A4=EC=B9=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DetectMode가 펌프 livevalue를 IN ('1','5','L-RUN','R-RUN')로 정확일치 비교했으나, realtime_table은 디지털 상태점을 '{5 | R-RUN | }' 포맷으로 저장(FormatValue) → 절대 매칭 안 됨 → pumpRunning 항상 false → 펌프 설정된 컬럼은 가동 중에도 무조건 '미가동(idle)'으로 오판정(카드 state·알람 진실원 오류). LIKE '%RUN%'로 RUN 라벨 부분일치(TRIP/FAULT/STOP은 RUN 미포함→정지). 구 bare 값도 허용. 라이브 검증: C-6111 펌프 가동수 0→2 → 정상(normal) 판정 복구. Co-Authored-By: Claude Opus 4.8 --- src/Infrastructure/Hc900/Hc900LiveKpiService.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Infrastructure/Hc900/Hc900LiveKpiService.cs b/src/Infrastructure/Hc900/Hc900LiveKpiService.cs index b0255e4..03dcea6 100644 --- a/src/Infrastructure/Hc900/Hc900LiveKpiService.cs +++ b/src/Infrastructure/Hc900/Hc900LiveKpiService.cs @@ -163,7 +163,10 @@ CREATE TABLE IF NOT EXISTS hc900.kpi_alert ( if (pumpKnown) { await using var pq = conn.CreateCommand(); - pq.CommandText = "SELECT count(*) FROM hc900.realtime_table WHERE tagname = ANY(@p) AND livevalue IN ('1','5','L-RUN','R-RUN')"; + // 디지털 상태점은 realtime_table에 '{N | label | }' 포맷으로 저장됨(FormatValue). + // RUN 라벨(L-RUN/R-RUN)을 부분일치로 판정. TRIP/FAULT/STOP은 RUN 미포함 → 정지로 봄. + // (구버전 bare 값도 함께 허용.) + pq.CommandText = "SELECT count(*) FROM hc900.realtime_table WHERE tagname = ANY(@p) AND (livevalue LIKE '%RUN%' OR livevalue IN ('1','5','L-RUN','R-RUN'))"; var pp = pq.CreateParameter(); pp.ParameterName = "@p"; pp.Value = pumps.ToArray(); pq.Parameters.Add(pp); pumpRunning = Convert.ToInt64(await pq.ExecuteScalarAsync(ct)) > 0; }