From 02657b3893542fffbfceeea5d0697fc01bd2577e Mon Sep 17 00:00:00 2001 From: Msystech Date: Thu, 20 Aug 2026 08:46:26 +0900 Subject: [PATCH] =?UTF-8?q?=EC=83=81=EB=B3=91=20=EC=A1=B0=ED=95=A9=2011?= =?UTF-8?q?=EC=A2=85=20=E2=80=94=20225=EC=A2=85=20=E2=86=92=20236=EC=A2=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 전부 기존 상병 조회(Okd 공용 쿼리, Scope All/Main/Sub) 재사용 — 왕복이 늘지 않고 결합·표기만 다르다(bzDataInterface.vb:8825-10481, Case Else 갈래. SHCTR 무하이픈·BSGH·JEGG 배제·SPHH 본문 분기 미이식): OCM_상병코드_상병명("코드-명(확진/의증)" 줄단위), OCM_진단구분_상병코드_상병명("[주진단명] : "/"[의증] : "(공백 5)/ "[부진단명] : "), OCM_진단구분_상병명("[주] /[부] "+명+확의), OCM_상병명_상병코드(확진 접미가 " - 확증" — 레거시 오타로 보이지만 그대로), OCM_주상병일자(무구분 이어붙임 — 복수 주상병이 한 줄로 붙는 원문 그대로. 등록일시 12자 미만이면 레거시 예외→빈 값 재현), OCM_상병코드_상병명_주상병("1. " 고정 번호 + PadRight 15), OCM_상병코드_상병명_부상병(번호가 0부터 시작하는 결함 보존), OCM_부상병명, OCM_주상병명_영어, OCM_주상병명_주상병코드. OCM_주상병특정기호는 사유 완결 — 심사 상병 공용 쿼리(Bkd)의 SELECT 목록에 특정기호(OkdVeeCod)가 없어 행이 있으면 컬럼 예외→빈, 없어도 빈. 항상 빈 값인 확정 결함이다. 이름 게이트가 OCM_주상병명_주상병코드를 카탈로그 미등재로 잡았다 — 레거시 원문(:10429) 실존을 확인하고 등재(전수 추출 이후 추가된 함수). - dotnet test 342/342 · --edit-smoke 실패 0 (이름 검사 236종) - --db-patient ①~㊱ 전건 통과 - --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변 Co-Authored-By: Claude Fable 5 --- src/SheetMe.Core/Catalog/LegacyTagCatalog.cs | 3 ++ .../Services/PatientTagResolver.cs | 44 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/SheetMe.Core/Catalog/LegacyTagCatalog.cs b/src/SheetMe.Core/Catalog/LegacyTagCatalog.cs index 25c84f3..9d1593c 100644 --- a/src/SheetMe.Core/Catalog/LegacyTagCatalog.cs +++ b/src/SheetMe.Core/Catalog/LegacyTagCatalog.cs @@ -427,6 +427,9 @@ public static class LegacyTagCatalog "OCM_주상병명_Refer", "OCM_주상병명_영어", "OCM_주상병명_영어_Refer", + // 카탈로그 전수 추출(2026-07-16) 이후 레거시에 추가된 함수 — + // bzDataInterface.vb:10429 실존을 확인하고 등재했다(이름 게이트가 잡았다) + "OCM_주상병명_주상병코드", "OCM_주상병일자", "OCM_주상병일자_Refer", "OCM_주상병코드", diff --git a/src/SheetMe.Designer/Services/PatientTagResolver.cs b/src/SheetMe.Designer/Services/PatientTagResolver.cs index 52403f2..9df558e 100644 --- a/src/SheetMe.Designer/Services/PatientTagResolver.cs +++ b/src/SheetMe.Designer/Services/PatientTagResolver.cs @@ -728,10 +728,23 @@ public sealed class PatientTagResolver : ITagValueResolver { "OCM_상병명_가로" or "OCM_상병명_세로" or "OCM_상병명_영어_가로" or "OCM_상병명_영어_세로" or "OCM_상병코드_가로" or "OCM_상병코드_세로" => DiagnosisStore.Scope.All, + "OCM_상병코드_상병명" or "OCM_진단구분_상병코드_상병명" or "OCM_진단구분_상병명" + or "OCM_상병명_상병코드" => DiagnosisStore.Scope.All, "OCM_부상병코드" or "OCM_부상병POA" => DiagnosisStore.Scope.Sub, + "OCM_상병코드_상병명_부상병" or "OCM_부상병명" => DiagnosisStore.Scope.Sub, "OCM_주상병명" or "OCM_주상병코드" or "OCM_주상병POA" => DiagnosisStore.Scope.Main, + "OCM_주상병일자" or "OCM_상병코드_상병명_주상병" or "OCM_주상병명_영어" + or "OCM_주상병명_주상병코드" => DiagnosisStore.Scope.Main, _ => (DiagnosisStore.Scope?)null, } is { } s ? s : (DiagnosisStore.Scope?)null; + // 심사 상병(B_OkdInf)에서 특정기호(OkdVeeCod)를 뽑는 태그인데, 그 공용 쿼리 + // (Bkd_상병쿼리, bzDataInterface.vb:14625-14811)의 SELECT 목록엔 OkdVeeCod 가 + // 없다 — 행이 있으면 컬럼 없음 예외→"" , 없어도 "" . 항상 빈 값인 확정 결함이다. + if (tag == "OCM_주상병특정기호") + { + return new TagValue(false, + "레거시 결함(특정기호 컬럼이 SELECT 에 없음)으로 항상 빈 값인 태그입니다"); + } if (scope is null) { return null; @@ -785,6 +798,33 @@ public sealed class PatientTagResolver : ITagValueResolver "OCM_부상병POA" => string.Join(Environment.NewLine, rows.Select(r => Cell(r, "OkdPoaTyp"))), "OCM_주상병명" => Cell(rows[0], "KcdKorNam"), "OCM_주상병코드" => Cell(rows[0], "KcdElcCod"), + // ── 조합 표기 9종(:8825-10481, 전부 Case Else 갈래) ── + // SHCTR(J 서식 무하이픈)·BSGH·JEGG(배제 표기)·SPHH 본문 분기는 미이식. + // 원문의 결함 표기를 그대로 보존한다 — 주상병 목록의 "1. " 고정 번호, + // 부상병의 0부터 시작하는 번호, 상병명_상병코드의 " - 확증"(확진의 오타로 보임), + // 주상병 계열의 무구분 이어붙이기(복수 주상병이 한 줄로 붙는다). + "OCM_상병코드_상병명" => string.Concat(rows.Select(r => + $"{Cell(r, "KcdElcCod")}-{Cell(r, "KcdKorNam")}{Suffix(r)}\r\n")), + "OCM_진단구분_상병코드_상병명" => string.Concat(rows.Select(r => + (Cell(r, "OkdDspSeq") == "1" ? "[주진단명] : " + : Cell(r, "OkdCfmSus") == "의" ? "[의증] : " : "[부진단명] : ") + + $"{Cell(r, "KcdElcCod")}-{Cell(r, "KcdKorNam")}\r\n")), + "OCM_진단구분_상병명" => string.Concat(rows.Select(r => + $"{(Cell(r, "OkdDspSeq") == "1" ? "[주] " : "[부] ")}{Cell(r, "KcdKorNam")}{Suffix(r)}\r\n")), + "OCM_상병명_상병코드" => string.Concat(rows.Select(r => + $"{Cell(r, "KcdKorNam")}{Cell(r, "OkdCfmSus") switch { "확" => " - 확증", "의" => " - 의증", _ => "" }}" + + $"-{Cell(r, "KcdElcCod")}\r\n")), + "OCM_주상병일자" => rows.Any(r => Cell(r, "OkdEntDtf").Length < 12) + ? string.Empty // 레거시는 12자 미만이면 예외→빈 값이었다 + : string.Concat(rows.Select(r => Stamp(Cell(r, "OkdEntDtf")))), + "OCM_상병코드_상병명_주상병" => string.Concat(rows.Select(r => + $"1. {Cell(r, "KcdElcCod")}".PadRight(15) + $" - {Cell(r, "KcdKorNam")}")), + "OCM_상병코드_상병명_부상병" => string.Concat(rows.Select((r, i) => + $"{i}. {Cell(r, "KcdElcCod")}".PadRight(15) + $" - {Cell(r, "KcdKorNam")}\r\n")), + "OCM_부상병명" => string.Concat(rows.Select(r => $"{Cell(r, "KcdKorNam")}\r\n")), + "OCM_주상병명_영어" => Cell(rows[0], "KcdEngNam"), + "OCM_주상병명_주상병코드" => string.Concat(rows.Select(r => + $"{Cell(r, "KcdKorNam")} - {Cell(r, "KcdElcCod")}")), _ => Cell(rows[0], "OkdPoaTyp"), }; return value.Trim().Length > 0 @@ -2468,6 +2508,10 @@ public sealed class PatientTagResolver : ITagValueResolver "OCM_상병명_가로", "OCM_상병명_세로", "OCM_상병명_영어_가로", "OCM_상병명_영어_세로", "OCM_상병코드_가로", "OCM_상병코드_세로", "OCM_부상병코드", "OCM_부상병POA", "OCM_주상병명", "OCM_주상병코드", "OCM_주상병POA", + "OCM_상병코드_상병명", "OCM_진단구분_상병코드_상병명", "OCM_진단구분_상병명", + "OCM_상병명_상병코드", "OCM_주상병일자", "OCM_상병코드_상병명_주상병", + "OCM_상병코드_상병명_부상병", "OCM_부상병명", "OCM_주상병명_영어", + "OCM_주상병특정기호", "OCM_주상병명_주상병코드", "OCM_OPNAME", "OCM_OPRCODNAM", "OCM_DX", "OCM_수술상병", "OCM_수술부위", "OCM_수술_OprPatETC", "OCM_수술집도의", "OCM_수술마취의사", "OCM_심사_주상병명", "OCM_심사_주상병코드", "OCM_심사_부상병명", "OCM_심사_부상병코드",