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_심사_부상병코드",