상병 조합 11종 — 225종 → 236종

전부 기존 상병 조회(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 <noreply@anthropic.com>
This commit is contained in:
Msystech
2026-08-20 08:46:26 +09:00
co-authored by Claude Fable 5
parent 8256b79800
commit 02657b3893
2 changed files with 47 additions and 0 deletions
@@ -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_심사_부상병코드",