diff --git a/src/SheetMe.Data/Stores/PatientExtraStore.cs b/src/SheetMe.Data/Stores/PatientExtraStore.cs index f532b9f..32a4fd4 100644 --- a/src/SheetMe.Data/Stores/PatientExtraStore.cs +++ b/src/SheetMe.Data/Stores/PatientExtraStore.cs @@ -670,6 +670,18 @@ public sealed class PatientExtraStore + " 'txtMedHis' AS 병력기타내용))", ("m", comNum)); + /// + /// 영상 촬영 이력(OCM_영상촬영이력, :13968) — 영상의학(XRAY) 접수 완료 오더의 + /// 일자·이름(30자 절단, 원문 SUBSTR). 원문 정렬은 8자 절단 별칭이라 같은 날 안 순서가 + /// 임의였다 — 원본 일시로 정렬해 고정한다(상위 순서는 동일). + /// + public IReadOnlyList> RadiologyHistory(decimal comNum) + => Rows( + "SELECT SUBSTR(OdrDtm, 1, 8) AS OdrDay, SUBSTR(OdrNam, 1, 30) AS OdrNam FROM O_OdrInf" + + " WHERE OdrComNum = :m AND OdrAcpDep = 'XRAY' AND OdrStkStt = 'OE'" + + " ORDER BY OdrDtm DESC", + ("m", comNum)); + /// 스칼라 1칸 — 0행이거나 NULL 이면 빈 문자열. 잔여 공백은 걷는다(문맥 행과 같은 규칙) private string Scalar(string sql, params (string Name, object Value)[] binds) { diff --git a/src/SheetMe.Designer/Services/PatientTagResolver.cs b/src/SheetMe.Designer/Services/PatientTagResolver.cs index d45caf8..0086bf6 100644 --- a/src/SheetMe.Designer/Services/PatientTagResolver.cs +++ b/src/SheetMe.Designer/Services/PatientTagResolver.cs @@ -1506,6 +1506,7 @@ public sealed class PatientTagResolver : ITagValueResolver "OCM_외래실진료일", "OCM_외래실진료일_과목별", "OCM_외래실진료일수", "ETC_승인의사", "OCM_수술소독간호사", "OCM_적용진료과", "OCM_적용진료의사", "OCM_전과", "OCM_간호정보조사지_과거력", + "OCM_영상촬영이력", }; /// @@ -2008,6 +2009,34 @@ public sealed class PatientTagResolver : ITagValueResolver ? new TagValue(true, text.ToString()) : new TagValue(false, "조립할 전과 줄이 없습니다(과명 또는 구간이 비어 있음)"); } + case "OCM_영상촬영이력": + { + var comNum = PatientContext.Value(context.ComInf, "ComNum"); + if (!decimal.TryParse(comNum, out var m)) + { + return new TagValue(false, "이 내원의 내원번호를 읽지 못했습니다"); + } + var shots = store.RadiologyHistory(m); + if (shots.Count == 0) + { + return new TagValue(false, "영상의학(XRAY) 접수 완료 오더가 없습니다"); + } + // 원문 결합(:13990-14012): 한 줄에 2건 — 줄 안은 " / "(공백5), + // 줄 사이는 CRLF. 각 건은 "YYYY-MM-DD" + 공백 7 + 오더명(30자). + var text = new System.Text.StringBuilder(); + for (var i = 0; i < shots.Count; i++) + { + if (i > 0) + { + text.Append(i % 2 == 1 ? " / " : "\r\n"); + } + var day = PatientContext.Value(shots[i], "OdrDay"); + text.Append(day.Length >= 8 ? Hyphenate(day[..8]) : day) + .Append(" ") + .Append(PatientContext.Value(shots[i], "OdrNam")); + } + return new TagValue(true, text.ToString()); + } case "OCM_간호정보조사지_과거력": { var comNum = PatientContext.Value(context.ComInf, "ComNum"); @@ -2249,6 +2278,7 @@ public sealed class PatientTagResolver : ITagValueResolver "OCM_외래실진료일", "OCM_외래실진료일_과목별", "OCM_외래실진료일수", "ETC_승인의사", "OCM_수술소독간호사", "OCM_적용진료과", "OCM_적용진료의사", "OCM_전과", "OCM_간호정보조사지_과거력", + "OCM_영상촬영이력", "OCM_입원시간", "OCM_입원일시", "OCM_입원일시_영문", "OCM_입실시간", "OCM_의사퇴원예고일시", "OCM_퇴원예정일시", "OCM_퇴원시간", "OCM_퇴원일시", "OCM_퇴원예고일시", "OCM_재원일수", "OCM_퇴원예고재원일수", "OCM_입원일자_낮병동",