진료과 파생 4종(bzDataInterface.vb:5556-6007): 그룹코드("한글명(그룹
코드)" 결합 — 행이 있으면 조각이 비어도 결합), 영어(DepEngNam),
대외명칭(DepOfcNam), 약어명칭(DepBrfNam). 전부 프리페치된 진료과
행(M_DepMst SELECT *)의 다른 컬럼이라 왕복이 늘지 않는다. 레거시의
시점 판정(퇴원→퇴원시점·재원→현재·외래→접수)은 문맥 적용일시와 같은
규칙이다 — 자격이 퇴원보다 먼저 끝난 희귀 케이스만 갈린다(주석).
입원과 2종(:6009-6110)은 접수 시점, 퇴원과 2종(:6162-6318)은
퇴원(ILV)/현재 시점의 진료과 — 문맥과 다른 시점이라
DepartmentCodeAt(GetCodInfDT 대응, 시작일시 최신 1행 고정)과
DischargeDepartment(P_ComInf 에 날짜 조건만으로 M_DepMst 를 조인하는
원문 모양 그대로)를 신설했다. 퇴원과 본체의 If/Else 동일 쿼리(낮병동
주석과 달리 복붙 결함 — 퇴원일시 비면 0행→빈)도 그대로 보존,
한글명칭만 접수일시 폴백이 실제로 있다.
OCM_진료과: 개원일(HspStrDte)이 요양기관 행에 생겨 레거시 분기
(2022-07-01 이후 개원 + 대외명칭 있음 → 대외명칭)를 그대로 복원 —
전에는 개원일이 없어 DepKorNam 으로 고정했었다.
- dotnet test 338/338 · --edit-smoke 실패 0 (이름 검사 152종)
- --db-patient ①~㉝ 전건 통과
- --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
84 lines
3.9 KiB
C#
84 lines
3.9 KiB
C#
using SheetMe.Core.Catalog;
|
|
using SheetMe.Data.Stores;
|
|
|
|
namespace SheetMe.Designer.Services;
|
|
|
|
/// <summary>
|
|
/// 지금 고른 환자 — 앱 전체가 하나를 공유한다.
|
|
///
|
|
/// <b>왜 전역인가.</b> 환자는 미리보기 창에서 고르는데, 그 값이 필요한 곳은 거기만이 아니다 —
|
|
/// 쿼리 편집기의 '검증 실행'도 같은 환자로 돌려야 의미가 있다.
|
|
/// 창마다 따로 들고 있으면 <b>같은 서식을 두 화면에서 서로 다른 환자로</b> 보게 되고,
|
|
/// 그건 화면으로 구분할 수 없다.
|
|
///
|
|
/// <b>하나만 둔다.</b> 여러 개를 허용하면 어느 것이 지금 것인지 알 수 없고,
|
|
/// 환자 정보가 걸린 문제에서 그건 개인정보 사고가 된다.
|
|
///
|
|
/// 앱이 닫힐 때까지 메모리에 남는다. 디스크에 쓰지 않는다 —
|
|
/// 환자 문맥은 로그에도 안 남기기로 한 값이다(<see cref="PatientPreviewPolicy.AuditLine"/>).
|
|
/// </summary>
|
|
public static class PatientSession
|
|
{
|
|
#region Member Fields
|
|
/// <summary>환자가 바뀌었다 — 열려 있는 화면들이 다시 그려야 한다</summary>
|
|
public static event EventHandler? Changed;
|
|
#endregion
|
|
|
|
#region Properties
|
|
/// <summary>지금 고른 환자의 문맥 — 안 골랐으면 null</summary>
|
|
public static PatientContext? Current { get; private set; }
|
|
|
|
/// <summary>사람에게 보여 줄 한 줄 — 창 머리에 그대로 쓴다</summary>
|
|
public static string Label { get; private set; } = string.Empty;
|
|
|
|
/// <summary>고른 환자가 있는가</summary>
|
|
public static bool HasPatient => Current is not null;
|
|
#endregion
|
|
|
|
#region Methods
|
|
/// <summary>환자를 붙이거나(문맥 전달) 뗀다(null 전달)</summary>
|
|
public static void Set(PatientContext? context, string label)
|
|
{
|
|
Current = context;
|
|
Label = context is null ? string.Empty : label;
|
|
Changed?.Invoke(null, EventArgs.Empty);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 치환 변수원 — 환자가 없으면 null 이고, 호출부는 그때 자리표시로 구문만 검사해야 한다.
|
|
/// </summary>
|
|
public static IQueryVariableSource? Variables()
|
|
=> Current is { } context
|
|
? new PatientQueryVariableSource(context, UserSession.Current.UidCod)
|
|
: null;
|
|
|
|
/// <summary>
|
|
/// 이 문서용 태그·배선 해석기 한 벌 — 지금 세션 환자 기준.
|
|
///
|
|
/// 미리보기를 거치지 않는 인쇄(Ctrl+P)가 쓴다. 미리보기 창은 자기 해석기를 창 수명만큼
|
|
/// 들고 있지만, 여기는 <b>한 번 뽑는 종이</b>라 그때그때 만든다.
|
|
/// 주민번호·주소·담당의를 이 자리에서 한 번씩 읽는다 — 태그마다 읽으면 왕복이 늘어난다.
|
|
/// </summary>
|
|
public static (SheetMe.Core.Catalog.ITagValueResolver Tags, MDataTableRunner Fields)
|
|
ResolversFor(SheetMe.Core.Models.FormDocument document)
|
|
{
|
|
var session = new SessionTagResolver();
|
|
SheetMe.Core.Catalog.ITagValueResolver tags = Current is { } picked
|
|
? new PatientTagResolver(picked, session,
|
|
PatientIdentity.ResidentNumberOf(picked), PatientIdentity.AddressOf(picked),
|
|
PatientIdentity.DoctorOf(picked), PatientIdentity.StaffDoctorOf(picked),
|
|
PatientIdentity.DepartmentOf(picked),
|
|
PatientIdentity.HospitalRowOf(picked),
|
|
PatientIdentity.DiagnosisSourceFor(picked),
|
|
PatientIdentity.SurgerySourceFor(picked),
|
|
PatientIdentity.ReviewDiagnosisSourceFor(picked),
|
|
PatientIdentity.VitalSourceFor(picked),
|
|
PatientIdentity.ScheduledSurgerySourceFor(picked),
|
|
PatientIdentity.PathologyDoctorSource(), PatientIdentity.LabDoctorSource(),
|
|
PatientIdentity.ExtraStoreSource(), PatientIdentity.ContextStoreSource())
|
|
: session;
|
|
return (tags, new MDataTableRunner(document, Variables()));
|
|
}
|
|
#endregion
|
|
}
|