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_입원일자_낮병동",